From 388d3683ea12e82668e6bb7d851c17bebdfd9486 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 8 Aug 2023 16:27:21 -0700 Subject: [PATCH] Small cleanups in markdown drop/paste (#189985) - Observer cancellation more places - Create constants for mime types - Making code more consistent to show duplication --- .../src/extension.shared.ts | 6 +-- ...pIntoEditor.ts => dropResourceProvider.ts} | 38 +++++++++---------- ...{copyPaste.ts => pasteResourceProvider.ts} | 35 ++++++++++------- ...{copyPasteLinks.ts => pasteUrlProvider.ts} | 18 ++++----- .../src/languageFeatures/copyFiles/shared.ts | 18 ++------- .../src/util/mimes.ts | 22 +++++++++++ 6 files changed, 77 insertions(+), 60 deletions(-) rename extensions/markdown-language-features/src/languageFeatures/copyFiles/{dropIntoEditor.ts => dropResourceProvider.ts} (75%) rename extensions/markdown-language-features/src/languageFeatures/copyFiles/{copyPaste.ts => pasteResourceProvider.ts} (69%) rename extensions/markdown-language-features/src/languageFeatures/copyFiles/{copyPasteLinks.ts => pasteUrlProvider.ts} (84%) create mode 100644 extensions/markdown-language-features/src/util/mimes.ts diff --git a/extensions/markdown-language-features/src/extension.shared.ts b/extensions/markdown-language-features/src/extension.shared.ts index 79242573136..0d6c160bffe 100644 --- a/extensions/markdown-language-features/src/extension.shared.ts +++ b/extensions/markdown-language-features/src/extension.shared.ts @@ -7,10 +7,10 @@ import * as vscode from 'vscode'; import { MdLanguageClient } from './client/client'; import { CommandManager } from './commandManager'; import { registerMarkdownCommands } from './commands/index'; -import { registerPasteSupport } from './languageFeatures/copyFiles/copyPaste'; -import { registerLinkPasteSupport } from './languageFeatures/copyFiles/copyPasteLinks'; +import { registerPasteSupport } from './languageFeatures/copyFiles/pasteResourceProvider'; +import { registerLinkPasteSupport } from './languageFeatures/copyFiles/pasteUrlProvider'; import { registerDiagnosticSupport } from './languageFeatures/diagnostics'; -import { registerDropIntoEditorSupport } from './languageFeatures/copyFiles/dropIntoEditor'; +import { registerDropIntoEditorSupport } from './languageFeatures/copyFiles/dropResourceProvider'; import { registerFindFileReferenceSupport } from './languageFeatures/fileReferences'; import { registerUpdateLinksOnRename } from './languageFeatures/linkUpdater'; import { ILogger } from './logging'; diff --git a/extensions/markdown-language-features/src/languageFeatures/copyFiles/dropIntoEditor.ts b/extensions/markdown-language-features/src/languageFeatures/copyFiles/dropResourceProvider.ts similarity index 75% rename from extensions/markdown-language-features/src/languageFeatures/copyFiles/dropIntoEditor.ts rename to extensions/markdown-language-features/src/languageFeatures/copyFiles/dropResourceProvider.ts index ad7f6d7cb0b..1c5a19461cf 100644 --- a/extensions/markdown-language-features/src/languageFeatures/copyFiles/dropIntoEditor.ts +++ b/extensions/markdown-language-features/src/languageFeatures/copyFiles/dropResourceProvider.ts @@ -4,14 +4,19 @@ *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; -import { createEditForMediaFiles as createEditForMediaFiles, mediaMimes, tryGetUriListSnippet } from './shared'; +import { Mime, mediaMimes } from '../../util/mimes'; import { Schemes } from '../../util/schemes'; +import { createEditForMediaFiles, tryGetUriListSnippet } from './shared'; - -class MarkdownImageDropProvider implements vscode.DocumentDropEditProvider { +class ResourceDropProvider implements vscode.DocumentDropEditProvider { public static readonly id = 'insertLink'; + public static readonly dropMimeTypes = [ + Mime.textUriList, + ...mediaMimes, + ]; + private readonly _yieldTo = [ { mimeType: 'text/plain' }, { extensionId: 'vscode.ipynb', providerId: 'insertAttachment' }, @@ -36,10 +41,11 @@ class MarkdownImageDropProvider implements vscode.DocumentDropEditProvider { } private async _getUriListEdit(document: vscode.TextDocument, dataTransfer: vscode.DataTransfer, token: vscode.CancellationToken): Promise { - const urlList = await dataTransfer.get('text/uri-list')?.asString(); - if (!urlList) { + const urlList = await dataTransfer.get(Mime.textUriList)?.asString(); + if (!urlList || token.isCancellationRequested) { return undefined; } + const snippet = await tryGetUriListSnippet(document, urlList, token); if (!snippet) { return undefined; @@ -61,25 +67,19 @@ class MarkdownImageDropProvider implements vscode.DocumentDropEditProvider { return; } - const filesEdit = await createEditForMediaFiles(document, dataTransfer, token); - if (!filesEdit) { + const edit = await createEditForMediaFiles(document, dataTransfer, token); + if (!edit) { return; } - const edit = new vscode.DocumentDropEdit(filesEdit.snippet); - edit.label = filesEdit.label; - edit.additionalEdit = filesEdit.additionalEdits; - edit.yieldTo = this._yieldTo; - return edit; + const dropEdit = new vscode.DocumentDropEdit(edit.snippet); + dropEdit.label = edit.label; + dropEdit.additionalEdit = edit.additionalEdits; + dropEdit.yieldTo = this._yieldTo; + return dropEdit; } } export function registerDropIntoEditorSupport(selector: vscode.DocumentSelector) { - return vscode.languages.registerDocumentDropEditProvider(selector, new MarkdownImageDropProvider(), { - id: MarkdownImageDropProvider.id, - dropMimeTypes: [ - 'text/uri-list', - ...mediaMimes, - ] - }); + return vscode.languages.registerDocumentDropEditProvider(selector, new ResourceDropProvider(), ResourceDropProvider); } diff --git a/extensions/markdown-language-features/src/languageFeatures/copyFiles/copyPaste.ts b/extensions/markdown-language-features/src/languageFeatures/copyFiles/pasteResourceProvider.ts similarity index 69% rename from extensions/markdown-language-features/src/languageFeatures/copyFiles/copyPaste.ts rename to extensions/markdown-language-features/src/languageFeatures/copyFiles/pasteResourceProvider.ts index 934162b4daf..cd051210d2d 100644 --- a/extensions/markdown-language-features/src/languageFeatures/copyFiles/copyPaste.ts +++ b/extensions/markdown-language-features/src/languageFeatures/copyFiles/pasteResourceProvider.ts @@ -4,13 +4,19 @@ *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; +import { Mime, mediaMimes } from '../../util/mimes'; import { Schemes } from '../../util/schemes'; -import { createEditForMediaFiles, createEditAddingLinksForUriList, mediaMimes, getPasteUrlAsFormattedLinkSetting, PasteUrlAsFormattedLink } from './shared'; +import { PasteUrlAsFormattedLink, createEditAddingLinksForUriList, createEditForMediaFiles, getPasteUrlAsFormattedLinkSetting } from './shared'; -class PasteEditProvider implements vscode.DocumentPasteEditProvider { +class PasteResourceEditProvider implements vscode.DocumentPasteEditProvider { public static readonly id = 'insertLink'; + public static readonly pasteMimeTypes = [ + Mime.textUriList, + ...mediaMimes, + ]; + private readonly _yieldTo = [ { mimeType: 'text/plain' }, { extensionId: 'vscode.ipynb', providerId: 'insertAttachment' }, @@ -32,19 +38,26 @@ class PasteEditProvider implements vscode.DocumentPasteEditProvider { return createEdit; } - const uriEdit = new vscode.DocumentPasteEdit('', ''); - const urlList = await dataTransfer.get('text/uri-list')?.asString(); - if (!urlList) { + if (token.isCancellationRequested) { + return; + } + + return this._getUriListEdit(document, ranges, dataTransfer, token); + } + + private async _getUriListEdit(document: vscode.TextDocument, ranges: readonly vscode.Range[], dataTransfer: vscode.DataTransfer, token: vscode.CancellationToken): Promise { + const uriList = await dataTransfer.get(Mime.textUriList)?.asString(); + if (!uriList || token.isCancellationRequested) { return; } const pasteUrlSetting = getPasteUrlAsFormattedLinkSetting(document); - const pasteEdit = await createEditAddingLinksForUriList(document, ranges, urlList, false, pasteUrlSetting === PasteUrlAsFormattedLink.Smart, token); + const pasteEdit = await createEditAddingLinksForUriList(document, ranges, uriList, false, pasteUrlSetting === PasteUrlAsFormattedLink.Smart, token); if (!pasteEdit) { return; } - uriEdit.label = pasteEdit.label; + const uriEdit = new vscode.DocumentPasteEdit('', pasteEdit.label); uriEdit.additionalEdit = pasteEdit.additionalEdits; uriEdit.yieldTo = this._yieldTo; return uriEdit; @@ -73,11 +86,5 @@ class PasteEditProvider implements vscode.DocumentPasteEditProvider { } export function registerPasteSupport(selector: vscode.DocumentSelector,) { - return vscode.languages.registerDocumentPasteEditProvider(selector, new PasteEditProvider(), { - id: PasteEditProvider.id, - pasteMimeTypes: [ - 'text/uri-list', - ...mediaMimes, - ] - }); + return vscode.languages.registerDocumentPasteEditProvider(selector, new PasteResourceEditProvider(), PasteResourceEditProvider); } diff --git a/extensions/markdown-language-features/src/languageFeatures/copyFiles/copyPasteLinks.ts b/extensions/markdown-language-features/src/languageFeatures/copyFiles/pasteUrlProvider.ts similarity index 84% rename from extensions/markdown-language-features/src/languageFeatures/copyFiles/copyPasteLinks.ts rename to extensions/markdown-language-features/src/languageFeatures/copyFiles/pasteUrlProvider.ts index 4da71d20690..b68b9cdaa2b 100644 --- a/extensions/markdown-language-features/src/languageFeatures/copyFiles/copyPasteLinks.ts +++ b/extensions/markdown-language-features/src/languageFeatures/copyFiles/pasteUrlProvider.ts @@ -4,14 +4,17 @@ *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; +import { Mime } from '../../util/mimes'; import { createEditAddingLinksForUriList, getPasteUrlAsFormattedLinkSetting, PasteUrlAsFormattedLink, validateLink } from './shared'; -const textPlainMime = 'text/plain'; - -class PasteLinkEditProvider implements vscode.DocumentPasteEditProvider { +class PasteUrlEditProvider implements vscode.DocumentPasteEditProvider { public static readonly id = 'insertMarkdownLink'; + public static readonly pasteMimeTypes = [ + Mime.textPlain, + ]; + async provideDocumentPasteEdits( document: vscode.TextDocument, ranges: readonly vscode.Range[], @@ -23,7 +26,7 @@ class PasteLinkEditProvider implements vscode.DocumentPasteEditProvider { return; } - const item = dataTransfer.get(textPlainMime); + const item = dataTransfer.get(Mime.textPlain); const urlList = await item?.asString(); if (token.isCancellationRequested || !urlList || !validateLink(urlList).isValid) { return; @@ -36,14 +39,11 @@ class PasteLinkEditProvider implements vscode.DocumentPasteEditProvider { const edit = new vscode.DocumentPasteEdit('', pasteEdit.label); edit.additionalEdit = pasteEdit.additionalEdits; - edit.yieldTo = pasteEdit.markdownLink ? undefined : [{ mimeType: textPlainMime }]; + edit.yieldTo = pasteEdit.markdownLink ? undefined : [{ mimeType: Mime.textPlain }]; return edit; } } export function registerLinkPasteSupport(selector: vscode.DocumentSelector,) { - return vscode.languages.registerDocumentPasteEditProvider(selector, new PasteLinkEditProvider(), { - id: PasteLinkEditProvider.id, - pasteMimeTypes: [textPlainMime] - }); + return vscode.languages.registerDocumentPasteEditProvider(selector, new PasteUrlEditProvider(), PasteUrlEditProvider); } diff --git a/extensions/markdown-language-features/src/languageFeatures/copyFiles/shared.ts b/extensions/markdown-language-features/src/languageFeatures/copyFiles/shared.ts index 0608698f5ca..ef4ec6b34be 100644 --- a/extensions/markdown-language-features/src/languageFeatures/copyFiles/shared.ts +++ b/extensions/markdown-language-features/src/languageFeatures/copyFiles/shared.ts @@ -6,10 +6,11 @@ import * as path from 'path'; import * as vscode from 'vscode'; import * as URI from 'vscode-uri'; -import { Schemes } from '../../util/schemes'; -import { NewFilePathGenerator } from './copyFiles'; import { coalesce } from '../../util/arrays'; import { getDocumentDir } from '../../util/document'; +import { mediaMimes } from '../../util/mimes'; +import { Schemes } from '../../util/schemes'; +import { NewFilePathGenerator } from './copyFiles'; enum MediaKind { Image, @@ -49,19 +50,6 @@ export const mediaFileExtensions = new Map([ ['wav', MediaKind.Audio], ]); -export const mediaMimes = new Set([ - 'image/bmp', - 'image/gif', - 'image/jpeg', - 'image/png', - 'image/webp', - 'video/mp4', - 'video/ogg', - 'audio/mpeg', - 'audio/aac', - 'audio/x-wav', -]); - const smartPasteRegexes = [ { regex: /(\[[^\[\]]*](?:\([^\(\)]*\)|\[[^\[\]]*]))/g }, // In a Markdown link { regex: /^```[\s\S]*?```$/gm }, // In a backtick fenced code block diff --git a/extensions/markdown-language-features/src/util/mimes.ts b/extensions/markdown-language-features/src/util/mimes.ts new file mode 100644 index 00000000000..8028294b3f4 --- /dev/null +++ b/extensions/markdown-language-features/src/util/mimes.ts @@ -0,0 +1,22 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +export const Mime = { + textUriList: 'text/uri-list', + textPlain: 'text/plain', +} as const; + +export const mediaMimes = new Set([ + 'image/bmp', + 'image/gif', + 'image/jpeg', + 'image/png', + 'image/webp', + 'video/mp4', + 'video/ogg', + 'audio/mpeg', + 'audio/aac', + 'audio/x-wav', +]);