UNPKG

monaco-editor-core

Version:

A browser based code editor

224 lines (223 loc) • 9.71 kB
/*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __param = (this && this.__param) || function (paramIndex, decorator) { return function (target, key) { decorator(target, key, paramIndex); } }; import { coalesce } from '../../../../base/common/arrays.js'; import { UriList } from '../../../../base/common/dataTransfer.js'; import { HierarchicalKind } from '../../../../base/common/hierarchicalKind.js'; import { Disposable } from '../../../../base/common/lifecycle.js'; import { Mimes } from '../../../../base/common/mime.js'; import { Schemas } from '../../../../base/common/network.js'; import { relativePath } from '../../../../base/common/resources.js'; import { URI } from '../../../../base/common/uri.js'; import { DocumentPasteTriggerKind } from '../../../common/languages.js'; import { ILanguageFeaturesService } from '../../../common/services/languageFeatures.js'; import { localize } from '../../../../nls.js'; import { IWorkspaceContextService } from '../../../../platform/workspace/common/workspace.js'; class SimplePasteAndDropProvider { async provideDocumentPasteEdits(_model, _ranges, dataTransfer, context, token) { const edit = await this.getEdit(dataTransfer, token); if (!edit) { return undefined; } return { edits: [{ insertText: edit.insertText, title: edit.title, kind: edit.kind, handledMimeType: edit.handledMimeType, yieldTo: edit.yieldTo }], dispose() { }, }; } async provideDocumentDropEdits(_model, _position, dataTransfer, token) { const edit = await this.getEdit(dataTransfer, token); if (!edit) { return; } return { edits: [{ insertText: edit.insertText, title: edit.title, kind: edit.kind, handledMimeType: edit.handledMimeType, yieldTo: edit.yieldTo }], dispose() { }, }; } } export class DefaultTextPasteOrDropEditProvider extends SimplePasteAndDropProvider { constructor() { super(...arguments); this.kind = DefaultTextPasteOrDropEditProvider.kind; this.dropMimeTypes = [Mimes.text]; this.pasteMimeTypes = [Mimes.text]; } static { this.id = 'text'; } static { this.kind = new HierarchicalKind('text.plain'); } async getEdit(dataTransfer, _token) { const textEntry = dataTransfer.get(Mimes.text); if (!textEntry) { return; } // Suppress if there's also a uriList entry. // Typically the uri-list contains the same text as the text entry so showing both is confusing. if (dataTransfer.has(Mimes.uriList)) { return; } const insertText = await textEntry.asString(); return { handledMimeType: Mimes.text, title: localize('text.label', "Insert Plain Text"), insertText, kind: this.kind, }; } } class PathProvider extends SimplePasteAndDropProvider { constructor() { super(...arguments); this.kind = new HierarchicalKind('uri.absolute'); this.dropMimeTypes = [Mimes.uriList]; this.pasteMimeTypes = [Mimes.uriList]; } async getEdit(dataTransfer, token) { const entries = await extractUriList(dataTransfer); if (!entries.length || token.isCancellationRequested) { return; } let uriCount = 0; const insertText = entries .map(({ uri, originalText }) => { if (uri.scheme === Schemas.file) { return uri.fsPath; } else { uriCount++; return originalText; } }) .join(' '); let label; if (uriCount > 0) { // Dropping at least one generic uri (such as https) so use most generic label label = entries.length > 1 ? localize('defaultDropProvider.uriList.uris', "Insert Uris") : localize('defaultDropProvider.uriList.uri', "Insert Uri"); } else { // All the paths are file paths label = entries.length > 1 ? localize('defaultDropProvider.uriList.paths', "Insert Paths") : localize('defaultDropProvider.uriList.path', "Insert Path"); } return { handledMimeType: Mimes.uriList, insertText, title: label, kind: this.kind, }; } } let RelativePathProvider = class RelativePathProvider extends SimplePasteAndDropProvider { constructor(_workspaceContextService) { super(); this._workspaceContextService = _workspaceContextService; this.kind = new HierarchicalKind('uri.relative'); this.dropMimeTypes = [Mimes.uriList]; this.pasteMimeTypes = [Mimes.uriList]; } async getEdit(dataTransfer, token) { const entries = await extractUriList(dataTransfer); if (!entries.length || token.isCancellationRequested) { return; } const relativeUris = coalesce(entries.map(({ uri }) => { const root = this._workspaceContextService.getWorkspaceFolder(uri); return root ? relativePath(root.uri, uri) : undefined; })); if (!relativeUris.length) { return; } return { handledMimeType: Mimes.uriList, insertText: relativeUris.join(' '), title: entries.length > 1 ? localize('defaultDropProvider.uriList.relativePaths', "Insert Relative Paths") : localize('defaultDropProvider.uriList.relativePath', "Insert Relative Path"), kind: this.kind, }; } }; RelativePathProvider = __decorate([ __param(0, IWorkspaceContextService) ], RelativePathProvider); class PasteHtmlProvider { constructor() { this.kind = new HierarchicalKind('html'); this.pasteMimeTypes = ['text/html']; this._yieldTo = [{ mimeType: Mimes.text }]; } async provideDocumentPasteEdits(_model, _ranges, dataTransfer, context, token) { if (context.triggerKind !== DocumentPasteTriggerKind.PasteAs && !context.only?.contains(this.kind)) { return; } const entry = dataTransfer.get('text/html'); const htmlText = await entry?.asString(); if (!htmlText || token.isCancellationRequested) { return; } return { dispose() { }, edits: [{ insertText: htmlText, yieldTo: this._yieldTo, title: localize('pasteHtmlLabel', 'Insert HTML'), kind: this.kind, }], }; } } async function extractUriList(dataTransfer) { const urlListEntry = dataTransfer.get(Mimes.uriList); if (!urlListEntry) { return []; } const strUriList = await urlListEntry.asString(); const entries = []; for (const entry of UriList.parse(strUriList)) { try { entries.push({ uri: URI.parse(entry), originalText: entry }); } catch { // noop } } return entries; } let DefaultDropProvidersFeature = class DefaultDropProvidersFeature extends Disposable { constructor(languageFeaturesService, workspaceContextService) { super(); this._register(languageFeaturesService.documentDropEditProvider.register('*', new DefaultTextPasteOrDropEditProvider())); this._register(languageFeaturesService.documentDropEditProvider.register('*', new PathProvider())); this._register(languageFeaturesService.documentDropEditProvider.register('*', new RelativePathProvider(workspaceContextService))); } }; DefaultDropProvidersFeature = __decorate([ __param(0, ILanguageFeaturesService), __param(1, IWorkspaceContextService) ], DefaultDropProvidersFeature); export { DefaultDropProvidersFeature }; let DefaultPasteProvidersFeature = class DefaultPasteProvidersFeature extends Disposable { constructor(languageFeaturesService, workspaceContextService) { super(); this._register(languageFeaturesService.documentPasteEditProvider.register('*', new DefaultTextPasteOrDropEditProvider())); this._register(languageFeaturesService.documentPasteEditProvider.register('*', new PathProvider())); this._register(languageFeaturesService.documentPasteEditProvider.register('*', new RelativePathProvider(workspaceContextService))); this._register(languageFeaturesService.documentPasteEditProvider.register('*', new PasteHtmlProvider())); } }; DefaultPasteProvidersFeature = __decorate([ __param(0, ILanguageFeaturesService), __param(1, IWorkspaceContextService) ], DefaultPasteProvidersFeature); export { DefaultPasteProvidersFeature };