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