Don't treat escaped markdown reference links as links (#149407)
Fixes #149406 Make sure that escaping the leading `[` of a reference link means it is not considered a link - Picks up new grammar with fixes - Updates our document link provider to also not consider these as linkpull/149428/head
parent
9e8b4e53ba
commit
113287ccc3
|
@ -33,7 +33,7 @@
|
||||||
"git": {
|
"git": {
|
||||||
"name": "microsoft/vscode-markdown-tm-grammar",
|
"name": "microsoft/vscode-markdown-tm-grammar",
|
||||||
"repositoryUrl": "https://github.com/microsoft/vscode-markdown-tm-grammar",
|
"repositoryUrl": "https://github.com/microsoft/vscode-markdown-tm-grammar",
|
||||||
"commitHash": "b068fcb2fbfa834e695505bfb02bbcc0b4edab8b"
|
"commitHash": "09c3e715102d08bba4c4ea828634474fc58b6f57"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
"If you want to provide a fix or improvement, please create a pull request against the original repository.",
|
"If you want to provide a fix or improvement, please create a pull request against the original repository.",
|
||||||
"Once accepted there, we are happy to receive an update request."
|
"Once accepted there, we are happy to receive an update request."
|
||||||
],
|
],
|
||||||
"version": "https://github.com/microsoft/vscode-markdown-tm-grammar/commit/b068fcb2fbfa834e695505bfb02bbcc0b4edab8b",
|
"version": "https://github.com/microsoft/vscode-markdown-tm-grammar/commit/09c3e715102d08bba4c4ea828634474fc58b6f57",
|
||||||
"name": "Markdown",
|
"name": "Markdown",
|
||||||
"scopeName": "text.html.markdown",
|
"scopeName": "text.html.markdown",
|
||||||
"patterns": [
|
"patterns": [
|
||||||
|
@ -2838,7 +2838,7 @@
|
||||||
"name": "punctuation.definition.constant.end.markdown"
|
"name": "punctuation.definition.constant.end.markdown"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"match": "(\\[)((?<square>[^\\[\\]\\\\]|\\\\.|\\[\\g<square>*+\\])*+)(\\])(\\[)([^\\]]*+)(\\])",
|
"match": "(?<![\\]\\\\])(\\[)((?<square>[^\\[\\]\\\\]|\\\\.|\\[\\g<square>*+\\])*+)(\\])(\\[)([^\\]]*+)(\\])",
|
||||||
"name": "meta.link.reference.markdown"
|
"name": "meta.link.reference.markdown"
|
||||||
},
|
},
|
||||||
"link-ref-literal": {
|
"link-ref-literal": {
|
||||||
|
@ -2859,7 +2859,7 @@
|
||||||
"name": "punctuation.definition.constant.end.markdown"
|
"name": "punctuation.definition.constant.end.markdown"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"match": "(\\[)((?<square>[^\\[\\]\\\\]|\\\\.|\\[\\g<square>*+\\])*+)(\\])[ ]?(\\[)(\\])",
|
"match": "(?<![\\]\\\\])(\\[)((?<square>[^\\[\\]\\\\]|\\\\.|\\[\\g<square>*+\\])*+)(\\])[ ]?(\\[)(\\])",
|
||||||
"name": "meta.link.reference.literal.markdown"
|
"name": "meta.link.reference.literal.markdown"
|
||||||
},
|
},
|
||||||
"link-ref-shortcut": {
|
"link-ref-shortcut": {
|
||||||
|
@ -2874,7 +2874,7 @@
|
||||||
"name": "punctuation.definition.link.title.end.markdown"
|
"name": "punctuation.definition.link.title.end.markdown"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"match": "(\\[)(\\S+?)(\\])",
|
"match": "(?<![\\]\\\\])(\\[)(\\S+?)(\\])",
|
||||||
"name": "meta.link.reference.markdown"
|
"name": "meta.link.reference.markdown"
|
||||||
},
|
},
|
||||||
"raw": {
|
"raw": {
|
||||||
|
|
|
@ -166,9 +166,9 @@ function stripAngleBrackets(link: string) {
|
||||||
const linkPattern = /(\[((!\[[^\]]*?\]\(\s*)([^\s\(\)]+?)\s*\)\]|(?:\\\]|[^\]])*\])\(\s*)(([^\s\(\)]|\([^\s\(\)]*?\))+)\s*(".*?")?\)/g;
|
const linkPattern = /(\[((!\[[^\]]*?\]\(\s*)([^\s\(\)]+?)\s*\)\]|(?:\\\]|[^\]])*\])\(\s*)(([^\s\(\)]|\([^\s\(\)]*?\))+)\s*(".*?")?\)/g;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Matches `[text][ref]`
|
* Matches `[text][ref]` or `[shorthand]`
|
||||||
*/
|
*/
|
||||||
const referenceLinkPattern = /(?:(\[((?:\\\]|[^\]])+)\]\[\s*?)([^\s\]]*?)\]|\[\s*?([^\s\]]*?)\])(?![\:\(])/g;
|
const referenceLinkPattern = /(^|[^\]\\])(?:(?:(\[((?:\\\]|[^\]])+)\]\[\s*?)([^\s\]]*?)\]|\[\s*?([^\s\]]*?)\])(?![\:\(]))/gm;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Matches `<http://example.com>`
|
* Matches `<http://example.com>`
|
||||||
|
@ -318,15 +318,15 @@ export class MdLinkProvider implements vscode.DocumentLinkProvider {
|
||||||
for (const match of text.matchAll(referenceLinkPattern)) {
|
for (const match of text.matchAll(referenceLinkPattern)) {
|
||||||
let linkStart: vscode.Position;
|
let linkStart: vscode.Position;
|
||||||
let linkEnd: vscode.Position;
|
let linkEnd: vscode.Position;
|
||||||
let reference = match[3];
|
let reference = match[4];
|
||||||
if (reference) { // [text][ref]
|
if (reference) { // [text][ref]
|
||||||
const pre = match[1];
|
const pre = match[2];
|
||||||
const offset = (match.index || 0) + pre.length;
|
const offset = ((match.index ?? 0) + match[1].length) + pre.length;
|
||||||
linkStart = document.positionAt(offset);
|
linkStart = document.positionAt(offset);
|
||||||
linkEnd = document.positionAt(offset + reference.length);
|
linkEnd = document.positionAt(offset + reference.length);
|
||||||
} else if (match[4]) { // [ref][], [ref]
|
} else if (match[5]) { // [ref][], [ref]
|
||||||
reference = match[4];
|
reference = match[5];
|
||||||
const offset = (match.index || 0) + 1;
|
const offset = ((match.index ?? 0) + match[1].length) + 1;
|
||||||
linkStart = document.positionAt(offset);
|
linkStart = document.positionAt(offset);
|
||||||
linkEnd = document.positionAt(offset + reference.length);
|
linkEnd = document.positionAt(offset + reference.length);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -172,6 +172,16 @@ suite('markdown.DocumentLinkProvider', () => {
|
||||||
assert.strictEqual(links.length, 0);
|
assert.strictEqual(links.length, 0);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('Should not include reference links with escaped leading brackets', async () => {
|
||||||
|
const links = await getLinksForFile(joinLines(
|
||||||
|
`\\[bad link][good]`,
|
||||||
|
`\\[good]`,
|
||||||
|
`[good]: http://example.com`,
|
||||||
|
));
|
||||||
|
assert.strictEqual(links.length, 1);
|
||||||
|
assertRangeEqual(links[0].range, new vscode.Range(2, 8, 2, 26)); // Should only find the definition
|
||||||
|
});
|
||||||
|
|
||||||
test('Should not consider links in code fenced with backticks', async () => {
|
test('Should not consider links in code fenced with backticks', async () => {
|
||||||
const links = await getLinksForFile(joinLines(
|
const links = await getLinksForFile(joinLines(
|
||||||
'```',
|
'```',
|
||||||
|
|
Loading…
Reference in New Issue