Path: blob/main/extensions/markdown-language-features/src/languageFeatures/copyFiles/pasteUrlProvider.ts
3294 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import * as vscode from 'vscode';6import { IMdParser } from '../../markdownEngine';7import { Mime } from '../../util/mimes';8import { UriList } from '../../util/uriList';9import { createInsertUriListEdit, linkEditKind } from './shared';10import { InsertMarkdownLink, findValidUriInText, shouldInsertMarkdownLinkByDefault } from './smartDropOrPaste';1112/**13* Adds support for pasting text uris to create markdown links.14*15* This only applies to `text/plain`. Other mimes like `text/uri-list` are handled by ResourcePasteOrDropProvider.16*/17class PasteUrlEditProvider implements vscode.DocumentPasteEditProvider {1819public static readonly kind = linkEditKind;2021public static readonly pasteMimeTypes = [Mime.textPlain];2223constructor(24private readonly _parser: IMdParser,25) { }2627async provideDocumentPasteEdits(28document: vscode.TextDocument,29ranges: readonly vscode.Range[],30dataTransfer: vscode.DataTransfer,31context: vscode.DocumentPasteEditContext,32token: vscode.CancellationToken,33): Promise<vscode.DocumentPasteEdit[] | undefined> {34const pasteUrlSetting = vscode.workspace.getConfiguration('markdown', document)35.get<InsertMarkdownLink>('editor.pasteUrlAsFormattedLink.enabled', InsertMarkdownLink.SmartWithSelection);36if (pasteUrlSetting === InsertMarkdownLink.Never) {37return;38}3940const item = dataTransfer.get(Mime.textPlain);41const text = await item?.asString();42if (token.isCancellationRequested || !text) {43return;44}4546// TODO: If the user has explicitly requested to paste as a markdown link,47// try to paste even if we don't have a valid uri48const uriText = findValidUriInText(text);49if (!uriText) {50return;51}5253const edit = createInsertUriListEdit(document, ranges, UriList.from(uriText), {54linkKindHint: context.only,55preserveAbsoluteUris: true56});57if (!edit) {58return;59}6061const pasteEdit = new vscode.DocumentPasteEdit('', edit.label, PasteUrlEditProvider.kind);62const workspaceEdit = new vscode.WorkspaceEdit();63workspaceEdit.set(document.uri, edit.edits);64pasteEdit.additionalEdit = workspaceEdit;6566if (!(await shouldInsertMarkdownLinkByDefault(this._parser, document, pasteUrlSetting, ranges, token))) {67pasteEdit.yieldTo = [68vscode.DocumentDropOrPasteEditKind.Text,69vscode.DocumentDropOrPasteEditKind.Empty.append('uri')70];71}7273return [pasteEdit];74}75}7677export function registerPasteUrlSupport(selector: vscode.DocumentSelector, parser: IMdParser) {78return vscode.languages.registerDocumentPasteEditProvider(selector, new PasteUrlEditProvider(parser), {79providedPasteEditKinds: [PasteUrlEditProvider.kind],80pasteMimeTypes: PasteUrlEditProvider.pasteMimeTypes,81});82}838485