Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/extensions/markdown-language-features/src/commands/insertResource.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 { Utils } from 'vscode-uri';
8
import { Command } from '../commandManager';
9
import { createUriListSnippet, linkEditKind } from '../languageFeatures/copyFiles/shared';
10
import { mediaFileExtensions } from '../util/mimes';
11
import { coalesce } from '../util/arrays';
12
import { getParentDocumentUri } from '../util/document';
13
import { Schemes } from '../util/schemes';
14
15
16
export class InsertLinkFromWorkspace implements Command {
17
public readonly id = 'markdown.editor.insertLinkFromWorkspace';
18
19
public async execute(resources?: vscode.Uri[]) {
20
const activeEditor = vscode.window.activeTextEditor;
21
if (!activeEditor) {
22
return;
23
}
24
25
resources ??= await vscode.window.showOpenDialog({
26
canSelectFiles: true,
27
canSelectFolders: false,
28
canSelectMany: true,
29
openLabel: vscode.l10n.t("Insert link"),
30
title: vscode.l10n.t("Insert link"),
31
defaultUri: getDefaultUri(activeEditor.document),
32
});
33
if (!resources) {
34
return;
35
}
36
37
return insertLink(activeEditor, resources, false);
38
}
39
}
40
41
export class InsertImageFromWorkspace implements Command {
42
public readonly id = 'markdown.editor.insertImageFromWorkspace';
43
44
public async execute(resources?: vscode.Uri[]) {
45
const activeEditor = vscode.window.activeTextEditor;
46
if (!activeEditor) {
47
return;
48
}
49
50
resources ??= await vscode.window.showOpenDialog({
51
canSelectFiles: true,
52
canSelectFolders: false,
53
canSelectMany: true,
54
filters: {
55
[vscode.l10n.t("Media")]: Array.from(mediaFileExtensions.keys())
56
},
57
openLabel: vscode.l10n.t("Insert image"),
58
title: vscode.l10n.t("Insert image"),
59
defaultUri: getDefaultUri(activeEditor.document),
60
});
61
if (!resources) {
62
return;
63
}
64
65
return insertLink(activeEditor, resources, true);
66
}
67
}
68
69
function getDefaultUri(document: vscode.TextDocument) {
70
const docUri = getParentDocumentUri(document.uri);
71
if (docUri.scheme === Schemes.untitled) {
72
return vscode.workspace.workspaceFolders?.[0]?.uri;
73
}
74
return Utils.dirname(docUri);
75
}
76
77
async function insertLink(activeEditor: vscode.TextEditor, selectedFiles: readonly vscode.Uri[], insertAsMedia: boolean): Promise<void> {
78
const edit = createInsertLinkEdit(activeEditor, selectedFiles, insertAsMedia);
79
if (edit) {
80
await vscode.workspace.applyEdit(edit);
81
}
82
}
83
84
function createInsertLinkEdit(activeEditor: vscode.TextEditor, selectedFiles: readonly vscode.Uri[], insertAsMedia: boolean) {
85
const snippetEdits = coalesce(activeEditor.selections.map((selection, i): vscode.SnippetTextEdit | undefined => {
86
const selectionText = activeEditor.document.getText(selection);
87
const snippet = createUriListSnippet(activeEditor.document.uri, selectedFiles.map(uri => ({ uri })), {
88
linkKindHint: insertAsMedia ? 'media' : linkEditKind,
89
placeholderText: selectionText,
90
placeholderStartIndex: (i + 1) * selectedFiles.length,
91
separator: insertAsMedia ? '\n' : ' ',
92
});
93
94
return snippet ? new vscode.SnippetTextEdit(selection, snippet.snippet) : undefined;
95
}));
96
if (!snippetEdits.length) {
97
return;
98
}
99
100
const edit = new vscode.WorkspaceEdit();
101
edit.set(activeEditor.document.uri, snippetEdits);
102
return edit;
103
}
104
105