Skip to content

Commit b5a4613

Browse files
Markdown link pasting does not encode or decode links (microsoft#188992)
* uris pasted with no encoding or decoding * add tests for checking encoding
1 parent c838b56 commit b5a4613

File tree

3 files changed

+30
-16
lines changed

3 files changed

+30
-16
lines changed

extensions/markdown-language-features/src/commands/insertResource.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ async function insertLink(activeEditor: vscode.TextEditor, selectedFiles: vscode
7979
function createInsertLinkEdit(activeEditor: vscode.TextEditor, selectedFiles: vscode.Uri[], insertAsMedia: boolean, title = '', placeholderValue = 0, pasteAsMarkdownLink = true, isExternalLink = false) {
8080
const snippetEdits = coalesce(activeEditor.selections.map((selection, i): vscode.SnippetTextEdit | undefined => {
8181
const selectionText = activeEditor.document.getText(selection);
82-
const snippet = createUriListSnippet(activeEditor.document, selectedFiles, title, placeholderValue, pasteAsMarkdownLink, isExternalLink, {
82+
const snippet = createUriListSnippet(activeEditor.document, selectedFiles, [], title, placeholderValue, pasteAsMarkdownLink, isExternalLink, {
8383
insertAsMedia,
8484
placeholderText: selectionText,
8585
placeholderStartIndex: (i + 1) * selectedFiles.length,

extensions/markdown-language-features/src/languageFeatures/copyFiles/shared.ts

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -171,17 +171,17 @@ export async function tryGetUriListSnippet(document: SkinnyTextDocument, urlList
171171
if (token.isCancellationRequested) {
172172
return undefined;
173173
}
174-
174+
const uriStrings: string[] = [];
175175
const uris: vscode.Uri[] = [];
176176
for (const resource of urlList.split(/\r?\n/g)) {
177177
try {
178178
uris.push(vscode.Uri.parse(resource));
179+
uriStrings.push(resource);
179180
} catch {
180181
// noop
181182
}
182183
}
183-
184-
return createUriListSnippet(document, uris, title, placeHolderValue, pasteAsMarkdownLink, isExternalLink);
184+
return createUriListSnippet(document, uris, uriStrings, title, placeHolderValue, pasteAsMarkdownLink, isExternalLink);
185185
}
186186

187187
interface UriListSnippetOptions {
@@ -204,11 +204,10 @@ export function appendToLinkSnippet(
204204
pasteAsMarkdownLink: boolean,
205205
mdPath: string,
206206
title: string,
207-
uri: vscode.Uri,
207+
uriString: string,
208208
placeholderValue: number,
209209
isExternalLink: boolean,
210210
): vscode.SnippetString {
211-
const uriString = uri.toString(true);
212211
if (pasteAsMarkdownLink) {
213212
snippet.appendText('[');
214213
snippet.appendPlaceholder(escapeBrackets(title) || 'Title', placeholderValue);
@@ -222,6 +221,7 @@ export function appendToLinkSnippet(
222221
export function createUriListSnippet(
223222
document: SkinnyTextDocument,
224223
uris: readonly vscode.Uri[],
224+
uriStrings?: readonly string[],
225225
title = '',
226226
placeholderValue = 0,
227227
pasteAsMarkdownLink = true,
@@ -272,7 +272,9 @@ export function createUriListSnippet(
272272
}
273273
} else {
274274
insertedLinkCount++;
275-
snippet = appendToLinkSnippet(snippet, pasteAsMarkdownLink, mdPath, title, uri, placeholderValue, isExternalLink);
275+
if (uriStrings) {
276+
snippet = appendToLinkSnippet(snippet, pasteAsMarkdownLink, mdPath, title, uriStrings[i], placeholderValue, isExternalLink);
277+
}
276278
}
277279

278280
if (i < uris.length - 1 && uris.length > 1) {

extensions/markdown-language-features/src/test/markdownLink.test.ts

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -98,21 +98,33 @@ suite('createEditAddingLinksForUriList', () => {
9898

9999
suite('appendToLinkSnippet', () => {
100100
test('Should not create Markdown link snippet when pasteAsMarkdownLink is false', () => {
101-
const uri = vscode.Uri.parse('https://www.microsoft.com/');
102-
const snippet = appendToLinkSnippet(new vscode.SnippetString(''), false, 'https:/www.microsoft.com', '', uri, 0, true);
103-
assert.strictEqual(snippet?.value, 'https://www.microsoft.com/');
101+
const uriString = 'https://www.microsoft.com';
102+
const snippet = appendToLinkSnippet(new vscode.SnippetString(''), false, 'https:/www.microsoft.com', '', uriString, 0, true);
103+
assert.strictEqual(snippet?.value, 'https://www.microsoft.com');
104104
});
105105

106106
test('Should create Markdown link snippet when pasteAsMarkdownLink is true', () => {
107-
const uri = vscode.Uri.parse('https://www.microsoft.com/');
108-
const snippet = appendToLinkSnippet(new vscode.SnippetString(''), true, 'https:/www.microsoft.com', '', uri, 0, true);
109-
assert.strictEqual(snippet?.value, '[${0:Title}](https://www.microsoft.com/)');
107+
const uriString = 'https://www.microsoft.com';
108+
const snippet = appendToLinkSnippet(new vscode.SnippetString(''), true, 'https:/www.microsoft.com', '', uriString, 0, true);
109+
assert.strictEqual(snippet?.value, '[${0:Title}](https://www.microsoft.com)');
110110
});
111111

112112
test('Should use an unencoded URI string in Markdown link when passing in an external browser link', () => {
113-
const uri = vscode.Uri.parse('https://www.microsoft.com/');
114-
const snippet = appendToLinkSnippet(new vscode.SnippetString(''), true, 'https:/www.microsoft.com', '', uri, 0, true);
115-
assert.strictEqual(snippet?.value, '[${0:Title}](https://www.microsoft.com/)');
113+
const uriString = 'https://www.microsoft.com';
114+
const snippet = appendToLinkSnippet(new vscode.SnippetString(''), true, 'https:/www.microsoft.com', '', uriString, 0, true);
115+
assert.strictEqual(snippet?.value, '[${0:Title}](https://www.microsoft.com)');
116+
});
117+
118+
test('Should not decode an encoded URI string when passing in an external browser link', () => {
119+
const uriString = 'https://www.microsoft.com/%20';
120+
const snippet = appendToLinkSnippet(new vscode.SnippetString(''), true, 'https:/www.microsoft.com', '', uriString, 0, true);
121+
assert.strictEqual(snippet?.value, '[${0:Title}](https://www.microsoft.com/%20)');
122+
});
123+
124+
test('Should not encode an unencoded URI string when passing in an external browser link', () => {
125+
const uriString = 'https://www.example.com/path?query=value&another=value#fragment';
126+
const snippet = appendToLinkSnippet(new vscode.SnippetString(''), true, 'https:/www.microsoft.com', '', uriString, 0, true);
127+
assert.strictEqual(snippet?.value, '[${0:Title}](https://www.example.com/path?query=value&another=value#fragment)');
116128
});
117129
});
118130

0 commit comments

Comments
 (0)