/*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; import { externalUriSchemes, createEditAddingLinksForUriList, getPasteUrlAsFormattedLinkSetting, PasteUrlAsFormattedLink } from './shared'; class PasteLinkEditProvider implements vscode.DocumentPasteEditProvider { readonly id = 'insertMarkdownLink'; async provideDocumentPasteEdits( document: vscode.TextDocument, ranges: readonly vscode.Range[], dataTransfer: vscode.DataTransfer, token: vscode.CancellationToken, ): Promise { const pasteUrlSetting = await getPasteUrlAsFormattedLinkSetting(document); if (pasteUrlSetting === PasteUrlAsFormattedLink.Never) { return; } const item = dataTransfer.get('text/plain'); const urlList = await item?.asString(); if (urlList === undefined) { return; } if (!validateLink(urlList).isValid) { return; } const uriEdit = new vscode.DocumentPasteEdit('', this.id, ''); if (!urlList) { return undefined; } const pasteEdit = await createEditAddingLinksForUriList(document, ranges, validateLink(urlList).cleanedUrlList, true, pasteUrlSetting === PasteUrlAsFormattedLink.Smart, token); if (!pasteEdit) { return; } uriEdit.label = pasteUrlSetting === PasteUrlAsFormattedLink.Smart ? vscode.l10n.t('Smartly Insert Link') : pasteEdit.label; uriEdit.additionalEdit = pasteEdit.additionalEdits; return uriEdit; } } export function validateLink(urlList: string): { isValid: boolean; cleanedUrlList: string } { let isValid = false; let uri = undefined; const trimmedUrlList = urlList?.trim(); //remove leading and trailing whitespace and new lines try { uri = vscode.Uri.parse(trimmedUrlList); } catch (error) { return { isValid: false, cleanedUrlList: urlList }; } const splitUrlList = trimmedUrlList.split(' ').filter(item => item !== ''); //split on spaces and remove empty strings if (uri) { isValid = splitUrlList.length === 1 && !splitUrlList[0].includes('\n') && externalUriSchemes.includes(vscode.Uri.parse(splitUrlList[0]).scheme); } return { isValid, cleanedUrlList: splitUrlList[0] }; } export function registerLinkPasteSupport(selector: vscode.DocumentSelector,) { return vscode.languages.registerDocumentPasteEditProvider(selector, new PasteLinkEditProvider(), { pasteMimeTypes: [ 'text/plain', ] }); }