mirror of
https://github.com/microsoft/vscode.git
synced 2026-04-22 01:29:04 +01:00
turning highlighted Markdown text to link to pasted URL (#185924)
* turning highlighted Mardown text to link to pasted URL * resolved comments * resolved more comments * preserved behavior of existing file pasting logic --------- Co-authored-by: Meghan Kulkarni <t-mekulkarni@microsoft.com>
This commit is contained in:
@@ -56,10 +56,32 @@ export const mediaMimes = new Set([
|
||||
'audio/x-wav',
|
||||
]);
|
||||
|
||||
export async function getMarkdownLink(document: vscode.TextDocument, ranges: readonly vscode.Range[], urlList: string, token: vscode.CancellationToken): Promise<{ additionalEdits: vscode.WorkspaceEdit; label: string } | undefined> {
|
||||
if (ranges.length === 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
export async function tryGetUriListSnippet(document: vscode.TextDocument, dataTransfer: vscode.DataTransfer, token: vscode.CancellationToken): Promise<{ snippet: vscode.SnippetString; label: string } | undefined> {
|
||||
const urlList = await dataTransfer.get('text/uri-list')?.asString();
|
||||
if (!urlList || token.isCancellationRequested) {
|
||||
const edits: vscode.SnippetTextEdit[] = [];
|
||||
let placeHolderValue: number = ranges.length;
|
||||
let label: string = '';
|
||||
for (let i = 0; i < ranges.length; i++) {
|
||||
const snippet = await tryGetUriListSnippet(document, urlList, token, document.getText(ranges[i]), placeHolderValue);
|
||||
if (!snippet) {
|
||||
return;
|
||||
}
|
||||
placeHolderValue--;
|
||||
edits.push(new vscode.SnippetTextEdit(ranges[i], snippet.snippet));
|
||||
label = snippet.label;
|
||||
}
|
||||
|
||||
const additionalEdits = new vscode.WorkspaceEdit();
|
||||
additionalEdits.set(document.uri, edits);
|
||||
|
||||
return { additionalEdits, label };
|
||||
}
|
||||
|
||||
export async function tryGetUriListSnippet(document: vscode.TextDocument, urlList: String, token: vscode.CancellationToken, title = '', placeHolderValue = 0): Promise<{ snippet: vscode.SnippetString; label: string } | undefined> {
|
||||
if (token.isCancellationRequested) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
@@ -72,7 +94,7 @@ export async function tryGetUriListSnippet(document: vscode.TextDocument, dataTr
|
||||
}
|
||||
}
|
||||
|
||||
return createUriListSnippet(document, uris);
|
||||
return createUriListSnippet(document, uris, title, placeHolderValue);
|
||||
}
|
||||
|
||||
interface UriListSnippetOptions {
|
||||
@@ -90,11 +112,12 @@ interface UriListSnippetOptions {
|
||||
readonly separator?: string;
|
||||
}
|
||||
|
||||
|
||||
export function createUriListSnippet(
|
||||
document: vscode.TextDocument,
|
||||
uris: readonly vscode.Uri[],
|
||||
options?: UriListSnippetOptions
|
||||
title = '',
|
||||
placeholderValue = 0,
|
||||
options?: UriListSnippetOptions,
|
||||
): { snippet: vscode.SnippetString; label: string } | undefined {
|
||||
if (!uris.length) {
|
||||
return;
|
||||
@@ -119,27 +142,27 @@ export function createUriListSnippet(
|
||||
if (insertAsVideo) {
|
||||
insertedAudioVideoCount++;
|
||||
snippet.appendText(`<video src="${escapeHtmlAttribute(mdPath)}" controls title="`);
|
||||
snippet.appendPlaceholder('Title');
|
||||
snippet.appendPlaceholder(escapeBrackets(title) || 'Title', placeholderValue);
|
||||
snippet.appendText('"></video>');
|
||||
} else if (insertAsAudio) {
|
||||
insertedAudioVideoCount++;
|
||||
snippet.appendText(`<audio src="${escapeHtmlAttribute(mdPath)}" controls title="`);
|
||||
snippet.appendPlaceholder('Title');
|
||||
snippet.appendPlaceholder(escapeBrackets(title) || 'Title', placeholderValue);
|
||||
snippet.appendText('"></audio>');
|
||||
} else {
|
||||
if (insertAsMedia) {
|
||||
insertedImageCount++;
|
||||
snippet.appendText('})`);
|
||||
} else {
|
||||
insertedLinkCount++;
|
||||
snippet.appendText('[');
|
||||
snippet.appendPlaceholder(escapeBrackets(title) || 'Title', placeholderValue);
|
||||
snippet.appendText(`](${escapeMarkdownLinkPath(mdPath)})`);
|
||||
}
|
||||
|
||||
snippet.appendText(insertAsMedia ? '})`);
|
||||
}
|
||||
|
||||
if (i < uris.length - 1 && uris.length > 1) {
|
||||
@@ -267,6 +290,12 @@ function escapeMarkdownLinkPath(mdPath: string): string {
|
||||
return encodeURI(mdPath);
|
||||
}
|
||||
|
||||
function escapeBrackets(value: string): string {
|
||||
value = value.replace(/[\[\]]/g, '\\$&');
|
||||
// value = value.replace(/\r\n\r\n/g, '\n\n');
|
||||
return value;
|
||||
}
|
||||
|
||||
function needsBracketLink(mdPath: string) {
|
||||
// Links with whitespace or control characters must be enclosed in brackets
|
||||
if (mdPath.startsWith('<') || /\s|[\u007F\u0000-\u001f]/.test(mdPath)) {
|
||||
|
||||
Reference in New Issue
Block a user