Skip to content

Commit 934cd52

Browse files
Links paste as plain text over markdown links (microsoft#189366)
* remove updateTitle * fixed ranges and tests * fix tests
1 parent 9a6d4fa commit 934cd52

File tree

2 files changed

+36
-80
lines changed

2 files changed

+36
-80
lines changed

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

Lines changed: 12 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -86,11 +86,6 @@ export interface SmartPaste {
8686
*/
8787
pasteAsMarkdownLink: boolean;
8888

89-
/**
90-
* `true` if the link is being pasted over a markdown link.
91-
*/
92-
updateTitle: boolean;
93-
9489
}
9590

9691
export enum PasteUrlAsFormattedLink {
@@ -118,26 +113,24 @@ export async function createEditAddingLinksForUriList(
118113
const edits: vscode.SnippetTextEdit[] = [];
119114
let placeHolderValue: number = ranges.length;
120115
let label: string = '';
121-
let smartPaste = { pasteAsMarkdownLink: true, updateTitle: false };
116+
let pasteAsMarkdownLink: boolean = true;
122117

123118
for (const range of ranges) {
124-
let title = document.getText(range);
125119
const selectedRange: vscode.Range = new vscode.Range(
126120
new vscode.Position(range.start.line, document.offsetAt(range.start)),
127121
new vscode.Position(range.end.line, document.offsetAt(range.end))
128122
);
129123

130124
if (useSmartPaste) {
131-
smartPaste = checkSmartPaste(document, selectedRange);
132-
title = smartPaste.updateTitle ? '' : document.getText(range);
125+
pasteAsMarkdownLink = checkSmartPaste(document, selectedRange, range);
133126
}
134127

135-
const snippet = await tryGetUriListSnippet(document, urlList, token, title, placeHolderValue, smartPaste.pasteAsMarkdownLink, isExternalLink);
128+
const snippet = await tryGetUriListSnippet(document, urlList, token, document.getText(range), placeHolderValue, pasteAsMarkdownLink, isExternalLink);
136129
if (!snippet) {
137130
return;
138131
}
139132

140-
smartPaste.pasteAsMarkdownLink = true;
133+
pasteAsMarkdownLink = true;
141134
placeHolderValue--;
142135
edits.push(new vscode.SnippetTextEdit(range, snippet.snippet));
143136
label = snippet.label;
@@ -149,25 +142,23 @@ export async function createEditAddingLinksForUriList(
149142
return { additionalEdits, label };
150143
}
151144

152-
export function checkSmartPaste(document: SkinnyTextDocument, selectedRange: vscode.Range): SmartPaste {
153-
const SmartPaste: SmartPaste = { pasteAsMarkdownLink: true, updateTitle: false };
154-
if (selectedRange.isEmpty || /^[\s\n]*$/.test(document.getText(selectedRange)) || validateLink(document.getText(selectedRange)).isValid) {
155-
return { pasteAsMarkdownLink: false, updateTitle: false };
145+
export function checkSmartPaste(document: SkinnyTextDocument, selectedRange: vscode.Range, range: vscode.Range): boolean {
146+
if (selectedRange.isEmpty || /^[\s\n]*$/.test(document.getText(range)) || validateLink(document.getText(range)).isValid) {
147+
return false;
156148
}
157149
for (const regex of smartPasteRegexes) {
158150
const matches = [...document.getText().matchAll(regex.regex)];
159151
for (const match of matches) {
160152
if (match.index !== undefined) {
161-
const useDefaultPaste = selectedRange.start.character > match.index && selectedRange.end.character < match.index + match[0].length;
162-
SmartPaste.pasteAsMarkdownLink = !useDefaultPaste;
163-
SmartPaste.updateTitle = regex.isMarkdownLink && selectedRange.start.character === match.index && selectedRange.end.character === match.index + match[0].length;
164-
if (!SmartPaste.pasteAsMarkdownLink || SmartPaste.updateTitle) {
165-
return SmartPaste;
153+
const inLink = selectedRange.start.character > match.index && selectedRange.end.character < match.index + match[0].length;
154+
const overLink = regex.isMarkdownLink && selectedRange.start.character === match.index && selectedRange.end.character === match.index + match[0].length;
155+
if (inLink || overLink) {
156+
return false;
166157
}
167158
}
168159
}
169160
}
170-
return SmartPaste;
161+
return true;
171162
}
172163

173164
export function validateLink(urlList: string): { isValid: boolean; cleanedUrlList: string } {

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

Lines changed: 24 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -151,70 +151,52 @@ suite('createEditAddingLinksForUriList', () => {
151151
uri: vscode.Uri.file('/path/to/your/file'),
152152
offsetAt: function () { return 0; },
153153
getText: function () { return 'hello world!'; },
154-
// lineAt: function (position: vscode.Position) {
155-
// return {
156-
// lineNumber: 0,
157-
// text: 'hello world!',
158-
// range: new vscode.Range(position, position),
159-
// rangeIncludingLineBreak: new vscode.Range(position, position),
160-
// firstNonWhitespaceCharacterIndex: 0,
161-
// isEmptyOrWhitespace: false
162-
// } as vscode.TextLine;
163-
// }
164154
};
165155

166156
test('Should evaluate pasteAsMarkdownLink as true for selected plain text', () => {
167-
const range = new vscode.Range(0, 0, 0, 12);
168-
const smartPaste = checkSmartPaste(skinnyDocument, range);
169-
assert.strictEqual(smartPaste.pasteAsMarkdownLink, true);
157+
const pasteAsMarkdownLink = checkSmartPaste(skinnyDocument, new vscode.Range(0, 0, 0, 12), new vscode.Range(0, 0, 0, 12));
158+
assert.strictEqual(pasteAsMarkdownLink, true);
170159
});
171160

172161
test('Should evaluate pasteAsMarkdownLink as false for a valid selected link', () => {
173162
skinnyDocument.getText = function () { return 'https://www.microsoft.com'; };
174-
const range = new vscode.Range(0, 0, 0, 25);
175-
const smartPaste = checkSmartPaste(skinnyDocument, range);
176-
assert.strictEqual(smartPaste.pasteAsMarkdownLink, false);
163+
const pasteAsMarkdownLink = checkSmartPaste(skinnyDocument, new vscode.Range(0, 0, 0, 25), new vscode.Range(0, 0, 0, 25));
164+
assert.strictEqual(pasteAsMarkdownLink, false);
177165
});
178166

179167
test('Should evaluate pasteAsMarkdownLink as false for a valid selected link with trailing whitespace', () => {
180168
skinnyDocument.getText = function () { return ' https://www.microsoft.com '; };
181-
const range = new vscode.Range(0, 0, 0, 30);
182-
const smartPaste = checkSmartPaste(skinnyDocument, range);
183-
assert.strictEqual(smartPaste.pasteAsMarkdownLink, false);
169+
const pasteAsMarkdownLink = checkSmartPaste(skinnyDocument, new vscode.Range(0, 0, 0, 30), new vscode.Range(0, 0, 0, 30));
170+
assert.strictEqual(pasteAsMarkdownLink, false);
184171
});
185172

186173
test('Should evaluate pasteAsMarkdownLink as false for no selection', () => {
187-
const range = new vscode.Range(0, 0, 0, 0);
188-
const smartPaste = checkSmartPaste(skinnyDocument, range);
189-
assert.strictEqual(smartPaste.pasteAsMarkdownLink, false);
174+
const pasteAsMarkdownLink = checkSmartPaste(skinnyDocument, new vscode.Range(0, 0, 0, 0), new vscode.Range(0, 0, 0, 0));
175+
assert.strictEqual(pasteAsMarkdownLink, false);
190176
});
191177

192178
test('Should evaluate pasteAsMarkdownLink as false for selected whitespace and new lines', () => {
193179
skinnyDocument.getText = function () { return ' \r\n\r\n'; };
194-
const range = new vscode.Range(0, 0, 0, 7);
195-
const smartPaste = checkSmartPaste(skinnyDocument, range);
196-
assert.strictEqual(smartPaste.pasteAsMarkdownLink, false);
180+
const pasteAsMarkdownLink = checkSmartPaste(skinnyDocument, new vscode.Range(0, 0, 0, 7), new vscode.Range(0, 0, 0, 7));
181+
assert.strictEqual(pasteAsMarkdownLink, false);
197182
});
198183

199184
test('Should evaluate pasteAsMarkdownLink as false for pasting within a backtick code block', () => {
200185
skinnyDocument.getText = function () { return '```\r\n\r\n```'; };
201-
const range = new vscode.Range(0, 5, 0, 5);
202-
const smartPaste = checkSmartPaste(skinnyDocument, range);
203-
assert.strictEqual(smartPaste.pasteAsMarkdownLink, false);
186+
const pasteAsMarkdownLink = checkSmartPaste(skinnyDocument, new vscode.Range(0, 5, 0, 5), new vscode.Range(0, 5, 0, 5));
187+
assert.strictEqual(pasteAsMarkdownLink, false);
204188
});
205189

206190
test('Should evaluate pasteAsMarkdownLink as false for pasting within a tilde code block', () => {
207191
skinnyDocument.getText = function () { return '~~~\r\n\r\n~~~'; };
208-
const range = new vscode.Range(0, 5, 0, 5);
209-
const smartPaste = checkSmartPaste(skinnyDocument, range);
210-
assert.strictEqual(smartPaste.pasteAsMarkdownLink, false);
192+
const pasteAsMarkdownLink = checkSmartPaste(skinnyDocument, new vscode.Range(0, 5, 0, 5), new vscode.Range(0, 5, 0, 5));
193+
assert.strictEqual(pasteAsMarkdownLink, false);
211194
});
212195

213196
test('Should evaluate pasteAsMarkdownLink as false for pasting within a math block', () => {
214197
skinnyDocument.getText = function () { return '$$$\r\n\r\n$$$'; };
215-
const range = new vscode.Range(0, 5, 0, 5);
216-
const smartPaste = checkSmartPaste(skinnyDocument, range);
217-
assert.strictEqual(smartPaste.pasteAsMarkdownLink, false);
198+
const pasteAsMarkdownLink = checkSmartPaste(skinnyDocument, new vscode.Range(0, 5, 0, 5), new vscode.Range(0, 5, 0, 5));
199+
assert.strictEqual(pasteAsMarkdownLink, false);
218200
});
219201

220202
const linkSkinnyDoc: SkinnyTextDocument = {
@@ -223,17 +205,9 @@ suite('createEditAddingLinksForUriList', () => {
223205
getText: function () { return '[a](bcdef)'; },
224206
};
225207

226-
test('Should evaluate updateTitle as true for pasting over a Markdown link', () => {
227-
const range = new vscode.Range(0, 0, 0, 10);
228-
const smartPaste = checkSmartPaste(linkSkinnyDoc, range);
229-
assert.strictEqual(smartPaste.updateTitle, true);
230-
});
231-
232208
test('Should evaluate pasteAsMarkdownLink as false for pasting within a Markdown link', () => {
233-
const range = new vscode.Range(0, 4, 0, 6);
234-
const smartPaste = checkSmartPaste(linkSkinnyDoc, range);
235-
236-
assert.strictEqual(smartPaste.pasteAsMarkdownLink, false);
209+
const pasteAsMarkdownLink = checkSmartPaste(linkSkinnyDoc, new vscode.Range(0, 4, 0, 6), new vscode.Range(0, 4, 0, 6));
210+
assert.strictEqual(pasteAsMarkdownLink, false);
237211
});
238212

239213

@@ -243,16 +217,9 @@ suite('createEditAddingLinksForUriList', () => {
243217
getText: function () { return '![a](bcdef)'; },
244218
};
245219

246-
test('Should evaluate updateTitle as true for pasting over a Markdown image link', () => {
247-
const range = new vscode.Range(0, 0, 0, 11);
248-
const smartPaste = checkSmartPaste(imageLinkSkinnyDoc, range);
249-
assert.strictEqual(smartPaste.updateTitle, true);
250-
});
251-
252220
test('Should evaluate pasteAsMarkdownLink as false for pasting within a Markdown image link', () => {
253-
const range = new vscode.Range(0, 5, 0, 10);
254-
const smartPaste = checkSmartPaste(imageLinkSkinnyDoc, range);
255-
assert.strictEqual(smartPaste.pasteAsMarkdownLink, false);
221+
const pasteAsMarkdownLink = checkSmartPaste(imageLinkSkinnyDoc, new vscode.Range(0, 5, 0, 10), new vscode.Range(0, 5, 0, 10));
222+
assert.strictEqual(pasteAsMarkdownLink, false);
256223
});
257224

258225
const inlineCodeSkinnyCode: SkinnyTextDocument = {
@@ -262,9 +229,8 @@ suite('createEditAddingLinksForUriList', () => {
262229
};
263230

264231
test('Should evaluate pasteAsMarkdownLink as false for pasting within inline code', () => {
265-
const range = new vscode.Range(0, 1, 0, 1);
266-
const smartPaste = checkSmartPaste(inlineCodeSkinnyCode, range);
267-
assert.strictEqual(smartPaste.pasteAsMarkdownLink, false);
232+
const pasteAsMarkdownLink = checkSmartPaste(inlineCodeSkinnyCode, new vscode.Range(0, 1, 0, 1), new vscode.Range(0, 1, 0, 1));
233+
assert.strictEqual(pasteAsMarkdownLink, false);
268234
});
269235

270236
const inlineMathSkinnyDoc: SkinnyTextDocument = {
@@ -274,9 +240,8 @@ suite('createEditAddingLinksForUriList', () => {
274240
};
275241

276242
test('Should evaluate pasteAsMarkdownLink as false for pasting within inline math', () => {
277-
const range = new vscode.Range(0, 1, 0, 1);
278-
const smartPaste = checkSmartPaste(inlineMathSkinnyDoc, range);
279-
assert.strictEqual(smartPaste.pasteAsMarkdownLink, false);
243+
const pasteAsMarkdownLink = checkSmartPaste(inlineMathSkinnyDoc, new vscode.Range(0, 1, 0, 1), new vscode.Range(0, 1, 0, 1));
244+
assert.strictEqual(pasteAsMarkdownLink, false);
280245
});
281246
});
282247
});

0 commit comments

Comments
 (0)