Path: blob/main/extensions/markdown-language-features/src/commands/insertResource.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 { Utils } from 'vscode-uri';7import { Command } from '../commandManager';8import { createUriListSnippet, linkEditKind } from '../languageFeatures/copyFiles/shared';9import { mediaFileExtensions } from '../util/mimes';10import { coalesce } from '../util/arrays';11import { getParentDocumentUri } from '../util/document';12import { Schemes } from '../util/schemes';131415export class InsertLinkFromWorkspace implements Command {16public readonly id = 'markdown.editor.insertLinkFromWorkspace';1718public async execute(resources?: vscode.Uri[]) {19const activeEditor = vscode.window.activeTextEditor;20if (!activeEditor) {21return;22}2324resources ??= await vscode.window.showOpenDialog({25canSelectFiles: true,26canSelectFolders: false,27canSelectMany: true,28openLabel: vscode.l10n.t("Insert link"),29title: vscode.l10n.t("Insert link"),30defaultUri: getDefaultUri(activeEditor.document),31});32if (!resources) {33return;34}3536return insertLink(activeEditor, resources, false);37}38}3940export class InsertImageFromWorkspace implements Command {41public readonly id = 'markdown.editor.insertImageFromWorkspace';4243public async execute(resources?: vscode.Uri[]) {44const activeEditor = vscode.window.activeTextEditor;45if (!activeEditor) {46return;47}4849resources ??= await vscode.window.showOpenDialog({50canSelectFiles: true,51canSelectFolders: false,52canSelectMany: true,53filters: {54[vscode.l10n.t("Media")]: Array.from(mediaFileExtensions.keys())55},56openLabel: vscode.l10n.t("Insert image"),57title: vscode.l10n.t("Insert image"),58defaultUri: getDefaultUri(activeEditor.document),59});60if (!resources) {61return;62}6364return insertLink(activeEditor, resources, true);65}66}6768function getDefaultUri(document: vscode.TextDocument) {69const docUri = getParentDocumentUri(document.uri);70if (docUri.scheme === Schemes.untitled) {71return vscode.workspace.workspaceFolders?.[0]?.uri;72}73return Utils.dirname(docUri);74}7576async function insertLink(activeEditor: vscode.TextEditor, selectedFiles: readonly vscode.Uri[], insertAsMedia: boolean): Promise<void> {77const edit = createInsertLinkEdit(activeEditor, selectedFiles, insertAsMedia);78if (edit) {79await vscode.workspace.applyEdit(edit);80}81}8283function createInsertLinkEdit(activeEditor: vscode.TextEditor, selectedFiles: readonly vscode.Uri[], insertAsMedia: boolean) {84const snippetEdits = coalesce(activeEditor.selections.map((selection, i): vscode.SnippetTextEdit | undefined => {85const selectionText = activeEditor.document.getText(selection);86const snippet = createUriListSnippet(activeEditor.document.uri, selectedFiles.map(uri => ({ uri })), {87linkKindHint: insertAsMedia ? 'media' : linkEditKind,88placeholderText: selectionText,89placeholderStartIndex: (i + 1) * selectedFiles.length,90separator: insertAsMedia ? '\n' : ' ',91});9293return snippet ? new vscode.SnippetTextEdit(selection, snippet.snippet) : undefined;94}));95if (!snippetEdits.length) {96return;97}9899const edit = new vscode.WorkspaceEdit();100edit.set(activeEditor.document.uri, snippetEdits);101return edit;102}103104105