mirror of
https://github.com/microsoft/vscode.git
synced 2026-04-22 01:29:04 +01:00
72 lines
2.6 KiB
TypeScript
72 lines
2.6 KiB
TypeScript
/*---------------------------------------------------------------------------------------------
|
|
* 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<vscode.DocumentPasteEdit | undefined> {
|
|
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',
|
|
]
|
|
});
|
|
}
|