mirror of
https://github.com/Microsoft/vscode
synced 2024-09-13 21:55:38 +00:00
Links paste as plain text over markdown links (#189366)
* remove updateTitle * fixed ranges and tests * fix tests
This commit is contained in:
parent
9a6d4fac97
commit
934cd52fa8
|
@ -86,11 +86,6 @@ export interface SmartPaste {
|
||||||
*/
|
*/
|
||||||
pasteAsMarkdownLink: boolean;
|
pasteAsMarkdownLink: boolean;
|
||||||
|
|
||||||
/**
|
|
||||||
* `true` if the link is being pasted over a markdown link.
|
|
||||||
*/
|
|
||||||
updateTitle: boolean;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum PasteUrlAsFormattedLink {
|
export enum PasteUrlAsFormattedLink {
|
||||||
|
@ -118,26 +113,24 @@ export async function createEditAddingLinksForUriList(
|
||||||
const edits: vscode.SnippetTextEdit[] = [];
|
const edits: vscode.SnippetTextEdit[] = [];
|
||||||
let placeHolderValue: number = ranges.length;
|
let placeHolderValue: number = ranges.length;
|
||||||
let label: string = '';
|
let label: string = '';
|
||||||
let smartPaste = { pasteAsMarkdownLink: true, updateTitle: false };
|
let pasteAsMarkdownLink: boolean = true;
|
||||||
|
|
||||||
for (const range of ranges) {
|
for (const range of ranges) {
|
||||||
let title = document.getText(range);
|
|
||||||
const selectedRange: vscode.Range = new vscode.Range(
|
const selectedRange: vscode.Range = new vscode.Range(
|
||||||
new vscode.Position(range.start.line, document.offsetAt(range.start)),
|
new vscode.Position(range.start.line, document.offsetAt(range.start)),
|
||||||
new vscode.Position(range.end.line, document.offsetAt(range.end))
|
new vscode.Position(range.end.line, document.offsetAt(range.end))
|
||||||
);
|
);
|
||||||
|
|
||||||
if (useSmartPaste) {
|
if (useSmartPaste) {
|
||||||
smartPaste = checkSmartPaste(document, selectedRange);
|
pasteAsMarkdownLink = checkSmartPaste(document, selectedRange, range);
|
||||||
title = smartPaste.updateTitle ? '' : document.getText(range);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const snippet = await tryGetUriListSnippet(document, urlList, token, title, placeHolderValue, smartPaste.pasteAsMarkdownLink, isExternalLink);
|
const snippet = await tryGetUriListSnippet(document, urlList, token, document.getText(range), placeHolderValue, pasteAsMarkdownLink, isExternalLink);
|
||||||
if (!snippet) {
|
if (!snippet) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
smartPaste.pasteAsMarkdownLink = true;
|
pasteAsMarkdownLink = true;
|
||||||
placeHolderValue--;
|
placeHolderValue--;
|
||||||
edits.push(new vscode.SnippetTextEdit(range, snippet.snippet));
|
edits.push(new vscode.SnippetTextEdit(range, snippet.snippet));
|
||||||
label = snippet.label;
|
label = snippet.label;
|
||||||
|
@ -149,25 +142,23 @@ export async function createEditAddingLinksForUriList(
|
||||||
return { additionalEdits, label };
|
return { additionalEdits, label };
|
||||||
}
|
}
|
||||||
|
|
||||||
export function checkSmartPaste(document: SkinnyTextDocument, selectedRange: vscode.Range): SmartPaste {
|
export function checkSmartPaste(document: SkinnyTextDocument, selectedRange: vscode.Range, range: vscode.Range): boolean {
|
||||||
const SmartPaste: SmartPaste = { pasteAsMarkdownLink: true, updateTitle: false };
|
if (selectedRange.isEmpty || /^[\s\n]*$/.test(document.getText(range)) || validateLink(document.getText(range)).isValid) {
|
||||||
if (selectedRange.isEmpty || /^[\s\n]*$/.test(document.getText(selectedRange)) || validateLink(document.getText(selectedRange)).isValid) {
|
return false;
|
||||||
return { pasteAsMarkdownLink: false, updateTitle: false };
|
|
||||||
}
|
}
|
||||||
for (const regex of smartPasteRegexes) {
|
for (const regex of smartPasteRegexes) {
|
||||||
const matches = [...document.getText().matchAll(regex.regex)];
|
const matches = [...document.getText().matchAll(regex.regex)];
|
||||||
for (const match of matches) {
|
for (const match of matches) {
|
||||||
if (match.index !== undefined) {
|
if (match.index !== undefined) {
|
||||||
const useDefaultPaste = selectedRange.start.character > match.index && selectedRange.end.character < match.index + match[0].length;
|
const inLink = selectedRange.start.character > match.index && selectedRange.end.character < match.index + match[0].length;
|
||||||
SmartPaste.pasteAsMarkdownLink = !useDefaultPaste;
|
const overLink = regex.isMarkdownLink && selectedRange.start.character === match.index && selectedRange.end.character === match.index + match[0].length;
|
||||||
SmartPaste.updateTitle = regex.isMarkdownLink && selectedRange.start.character === match.index && selectedRange.end.character === match.index + match[0].length;
|
if (inLink || overLink) {
|
||||||
if (!SmartPaste.pasteAsMarkdownLink || SmartPaste.updateTitle) {
|
return false;
|
||||||
return SmartPaste;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return SmartPaste;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function validateLink(urlList: string): { isValid: boolean; cleanedUrlList: string } {
|
export function validateLink(urlList: string): { isValid: boolean; cleanedUrlList: string } {
|
||||||
|
|
|
@ -151,70 +151,52 @@ suite('createEditAddingLinksForUriList', () => {
|
||||||
uri: vscode.Uri.file('/path/to/your/file'),
|
uri: vscode.Uri.file('/path/to/your/file'),
|
||||||
offsetAt: function () { return 0; },
|
offsetAt: function () { return 0; },
|
||||||
getText: function () { return 'hello world!'; },
|
getText: function () { return 'hello world!'; },
|
||||||
// lineAt: function (position: vscode.Position) {
|
|
||||||
// return {
|
|
||||||
// lineNumber: 0,
|
|
||||||
// text: 'hello world!',
|
|
||||||
// range: new vscode.Range(position, position),
|
|
||||||
// rangeIncludingLineBreak: new vscode.Range(position, position),
|
|
||||||
// firstNonWhitespaceCharacterIndex: 0,
|
|
||||||
// isEmptyOrWhitespace: false
|
|
||||||
// } as vscode.TextLine;
|
|
||||||
// }
|
|
||||||
};
|
};
|
||||||
|
|
||||||
test('Should evaluate pasteAsMarkdownLink as true for selected plain text', () => {
|
test('Should evaluate pasteAsMarkdownLink as true for selected plain text', () => {
|
||||||
const range = new vscode.Range(0, 0, 0, 12);
|
const pasteAsMarkdownLink = checkSmartPaste(skinnyDocument, new vscode.Range(0, 0, 0, 12), new vscode.Range(0, 0, 0, 12));
|
||||||
const smartPaste = checkSmartPaste(skinnyDocument, range);
|
assert.strictEqual(pasteAsMarkdownLink, true);
|
||||||
assert.strictEqual(smartPaste.pasteAsMarkdownLink, true);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
test('Should evaluate pasteAsMarkdownLink as false for a valid selected link', () => {
|
test('Should evaluate pasteAsMarkdownLink as false for a valid selected link', () => {
|
||||||
skinnyDocument.getText = function () { return 'https://www.microsoft.com'; };
|
skinnyDocument.getText = function () { return 'https://www.microsoft.com'; };
|
||||||
const range = new vscode.Range(0, 0, 0, 25);
|
const pasteAsMarkdownLink = checkSmartPaste(skinnyDocument, new vscode.Range(0, 0, 0, 25), new vscode.Range(0, 0, 0, 25));
|
||||||
const smartPaste = checkSmartPaste(skinnyDocument, range);
|
assert.strictEqual(pasteAsMarkdownLink, false);
|
||||||
assert.strictEqual(smartPaste.pasteAsMarkdownLink, false);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
test('Should evaluate pasteAsMarkdownLink as false for a valid selected link with trailing whitespace', () => {
|
test('Should evaluate pasteAsMarkdownLink as false for a valid selected link with trailing whitespace', () => {
|
||||||
skinnyDocument.getText = function () { return ' https://www.microsoft.com '; };
|
skinnyDocument.getText = function () { return ' https://www.microsoft.com '; };
|
||||||
const range = new vscode.Range(0, 0, 0, 30);
|
const pasteAsMarkdownLink = checkSmartPaste(skinnyDocument, new vscode.Range(0, 0, 0, 30), new vscode.Range(0, 0, 0, 30));
|
||||||
const smartPaste = checkSmartPaste(skinnyDocument, range);
|
assert.strictEqual(pasteAsMarkdownLink, false);
|
||||||
assert.strictEqual(smartPaste.pasteAsMarkdownLink, false);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
test('Should evaluate pasteAsMarkdownLink as false for no selection', () => {
|
test('Should evaluate pasteAsMarkdownLink as false for no selection', () => {
|
||||||
const range = new vscode.Range(0, 0, 0, 0);
|
const pasteAsMarkdownLink = checkSmartPaste(skinnyDocument, new vscode.Range(0, 0, 0, 0), new vscode.Range(0, 0, 0, 0));
|
||||||
const smartPaste = checkSmartPaste(skinnyDocument, range);
|
assert.strictEqual(pasteAsMarkdownLink, false);
|
||||||
assert.strictEqual(smartPaste.pasteAsMarkdownLink, false);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
test('Should evaluate pasteAsMarkdownLink as false for selected whitespace and new lines', () => {
|
test('Should evaluate pasteAsMarkdownLink as false for selected whitespace and new lines', () => {
|
||||||
skinnyDocument.getText = function () { return ' \r\n\r\n'; };
|
skinnyDocument.getText = function () { return ' \r\n\r\n'; };
|
||||||
const range = new vscode.Range(0, 0, 0, 7);
|
const pasteAsMarkdownLink = checkSmartPaste(skinnyDocument, new vscode.Range(0, 0, 0, 7), new vscode.Range(0, 0, 0, 7));
|
||||||
const smartPaste = checkSmartPaste(skinnyDocument, range);
|
assert.strictEqual(pasteAsMarkdownLink, false);
|
||||||
assert.strictEqual(smartPaste.pasteAsMarkdownLink, false);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
test('Should evaluate pasteAsMarkdownLink as false for pasting within a backtick code block', () => {
|
test('Should evaluate pasteAsMarkdownLink as false for pasting within a backtick code block', () => {
|
||||||
skinnyDocument.getText = function () { return '```\r\n\r\n```'; };
|
skinnyDocument.getText = function () { return '```\r\n\r\n```'; };
|
||||||
const range = new vscode.Range(0, 5, 0, 5);
|
const pasteAsMarkdownLink = checkSmartPaste(skinnyDocument, new vscode.Range(0, 5, 0, 5), new vscode.Range(0, 5, 0, 5));
|
||||||
const smartPaste = checkSmartPaste(skinnyDocument, range);
|
assert.strictEqual(pasteAsMarkdownLink, false);
|
||||||
assert.strictEqual(smartPaste.pasteAsMarkdownLink, false);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
test('Should evaluate pasteAsMarkdownLink as false for pasting within a tilde code block', () => {
|
test('Should evaluate pasteAsMarkdownLink as false for pasting within a tilde code block', () => {
|
||||||
skinnyDocument.getText = function () { return '~~~\r\n\r\n~~~'; };
|
skinnyDocument.getText = function () { return '~~~\r\n\r\n~~~'; };
|
||||||
const range = new vscode.Range(0, 5, 0, 5);
|
const pasteAsMarkdownLink = checkSmartPaste(skinnyDocument, new vscode.Range(0, 5, 0, 5), new vscode.Range(0, 5, 0, 5));
|
||||||
const smartPaste = checkSmartPaste(skinnyDocument, range);
|
assert.strictEqual(pasteAsMarkdownLink, false);
|
||||||
assert.strictEqual(smartPaste.pasteAsMarkdownLink, false);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
test('Should evaluate pasteAsMarkdownLink as false for pasting within a math block', () => {
|
test('Should evaluate pasteAsMarkdownLink as false for pasting within a math block', () => {
|
||||||
skinnyDocument.getText = function () { return '$$$\r\n\r\n$$$'; };
|
skinnyDocument.getText = function () { return '$$$\r\n\r\n$$$'; };
|
||||||
const range = new vscode.Range(0, 5, 0, 5);
|
const pasteAsMarkdownLink = checkSmartPaste(skinnyDocument, new vscode.Range(0, 5, 0, 5), new vscode.Range(0, 5, 0, 5));
|
||||||
const smartPaste = checkSmartPaste(skinnyDocument, range);
|
assert.strictEqual(pasteAsMarkdownLink, false);
|
||||||
assert.strictEqual(smartPaste.pasteAsMarkdownLink, false);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
const linkSkinnyDoc: SkinnyTextDocument = {
|
const linkSkinnyDoc: SkinnyTextDocument = {
|
||||||
|
@ -223,17 +205,9 @@ suite('createEditAddingLinksForUriList', () => {
|
||||||
getText: function () { return '[a](bcdef)'; },
|
getText: function () { return '[a](bcdef)'; },
|
||||||
};
|
};
|
||||||
|
|
||||||
test('Should evaluate updateTitle as true for pasting over a Markdown link', () => {
|
|
||||||
const range = new vscode.Range(0, 0, 0, 10);
|
|
||||||
const smartPaste = checkSmartPaste(linkSkinnyDoc, range);
|
|
||||||
assert.strictEqual(smartPaste.updateTitle, true);
|
|
||||||
});
|
|
||||||
|
|
||||||
test('Should evaluate pasteAsMarkdownLink as false for pasting within a Markdown link', () => {
|
test('Should evaluate pasteAsMarkdownLink as false for pasting within a Markdown link', () => {
|
||||||
const range = new vscode.Range(0, 4, 0, 6);
|
const pasteAsMarkdownLink = checkSmartPaste(linkSkinnyDoc, new vscode.Range(0, 4, 0, 6), new vscode.Range(0, 4, 0, 6));
|
||||||
const smartPaste = checkSmartPaste(linkSkinnyDoc, range);
|
assert.strictEqual(pasteAsMarkdownLink, false);
|
||||||
|
|
||||||
assert.strictEqual(smartPaste.pasteAsMarkdownLink, false);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
@ -243,16 +217,9 @@ suite('createEditAddingLinksForUriList', () => {
|
||||||
getText: function () { return '![a](bcdef)'; },
|
getText: function () { return '![a](bcdef)'; },
|
||||||
};
|
};
|
||||||
|
|
||||||
test('Should evaluate updateTitle as true for pasting over a Markdown image link', () => {
|
|
||||||
const range = new vscode.Range(0, 0, 0, 11);
|
|
||||||
const smartPaste = checkSmartPaste(imageLinkSkinnyDoc, range);
|
|
||||||
assert.strictEqual(smartPaste.updateTitle, true);
|
|
||||||
});
|
|
||||||
|
|
||||||
test('Should evaluate pasteAsMarkdownLink as false for pasting within a Markdown image link', () => {
|
test('Should evaluate pasteAsMarkdownLink as false for pasting within a Markdown image link', () => {
|
||||||
const range = new vscode.Range(0, 5, 0, 10);
|
const pasteAsMarkdownLink = checkSmartPaste(imageLinkSkinnyDoc, new vscode.Range(0, 5, 0, 10), new vscode.Range(0, 5, 0, 10));
|
||||||
const smartPaste = checkSmartPaste(imageLinkSkinnyDoc, range);
|
assert.strictEqual(pasteAsMarkdownLink, false);
|
||||||
assert.strictEqual(smartPaste.pasteAsMarkdownLink, false);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
const inlineCodeSkinnyCode: SkinnyTextDocument = {
|
const inlineCodeSkinnyCode: SkinnyTextDocument = {
|
||||||
|
@ -262,9 +229,8 @@ suite('createEditAddingLinksForUriList', () => {
|
||||||
};
|
};
|
||||||
|
|
||||||
test('Should evaluate pasteAsMarkdownLink as false for pasting within inline code', () => {
|
test('Should evaluate pasteAsMarkdownLink as false for pasting within inline code', () => {
|
||||||
const range = new vscode.Range(0, 1, 0, 1);
|
const pasteAsMarkdownLink = checkSmartPaste(inlineCodeSkinnyCode, new vscode.Range(0, 1, 0, 1), new vscode.Range(0, 1, 0, 1));
|
||||||
const smartPaste = checkSmartPaste(inlineCodeSkinnyCode, range);
|
assert.strictEqual(pasteAsMarkdownLink, false);
|
||||||
assert.strictEqual(smartPaste.pasteAsMarkdownLink, false);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
const inlineMathSkinnyDoc: SkinnyTextDocument = {
|
const inlineMathSkinnyDoc: SkinnyTextDocument = {
|
||||||
|
@ -274,9 +240,8 @@ suite('createEditAddingLinksForUriList', () => {
|
||||||
};
|
};
|
||||||
|
|
||||||
test('Should evaluate pasteAsMarkdownLink as false for pasting within inline math', () => {
|
test('Should evaluate pasteAsMarkdownLink as false for pasting within inline math', () => {
|
||||||
const range = new vscode.Range(0, 1, 0, 1);
|
const pasteAsMarkdownLink = checkSmartPaste(inlineMathSkinnyDoc, new vscode.Range(0, 1, 0, 1), new vscode.Range(0, 1, 0, 1));
|
||||||
const smartPaste = checkSmartPaste(inlineMathSkinnyDoc, range);
|
assert.strictEqual(pasteAsMarkdownLink, false);
|
||||||
assert.strictEqual(smartPaste.pasteAsMarkdownLink, false);
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in a new issue