Change:
Steps to Reproduce: the markdown: Bug Only is detected as a clickable link.
Hey can I try working on this one?
Sure, here's the relevant regular expression that matches links: And the related tests: You can run the tests by opening VS Code and selecting the from the debug target menu. The regexp is rather complex so let me know if you have any questions
Could you please tell me what is the expected behaviour?
In the example, it should underline and as clickable links that open files and

Discussion:
return out; } <ins> function extractDocumentLink( document: vscode.TextDocument, base: string, pre: number, link: string, matchIndex: number | undefined ): vscode.DocumentLink | undefined { const offset = (matchIndex || 0) + pre; const linkStart = document.positionAt(offset); const linkEnd = document.positionAt(offset + link.length); try { return new vscode.DocumentLink( new vscode.Range(linkStart, linkEnd), normalizeLink(document, link, base)); } catch (e) { return undefined; } } </ins> export default class LinkProvider implements vscode.DocumentLinkProvider { <del> private readonly linkPattern = /([[^]]*](s*)((([^s()]|(S*?))+))s*(".*?")?)/g; </del> <ins> private readonly linkPattern = /([((![[^]]*?](s*)([^s()]+?)s*)]|[^]]*])(s*)(([^s()]|(S*?))+)s*(".*?")?)/g; </ins> private readonly referenceLinkPattern = /([([^]]+)][s*?)([^s]]*?)]/g; private readonly definitionPattern = /^([t ]*[([^]]+)]:s*)(S+)/gm;

): vscode.DocumentLink[] { const results: vscode.DocumentLink[] = []; for (const match of matchAll(this.linkPattern, text)) { <del> const pre = match[1]; const link = match[2]; const offset = (match.index || 0) + pre.length; const linkStart = document.positionAt(offset); const linkEnd = document.positionAt(offset + link.length); try { results.push(new vscode.DocumentLink( new vscode.Range(linkStart, linkEnd), normalizeLink(document, link, base))); } catch (e) { // noop </del> <ins> const matchImage = match[4] && extractDocumentLink(document, base, match[3].length + 1, match[4], match.index); if (matchImage) { results.push(matchImage); } const matchLink = extractDocumentLink(document, base, match[1].length, match[5], match.index); if (matchLink) { results.push(matchLink); </ins> } } return results; }

} return out; } <del> } </del> <ins> } </ins>  No newline at end of file

assertRangeEqual(link1.range, new vscode.Range(0, 10, 0, 14)); assertRangeEqual(link2.range, new vscode.Range(0, 23, 0, 28)); }); <ins> // #49238 test('should handle hyperlinked images', () => { { const links = getLinksForFile('[![alt text](image.jpg)](https://example.com)'); assert.strictEqual(links.length, 2); const [link1, link2] = links; assertRangeEqual(link1.range, new vscode.Range(0,13,0,22)); assertRangeEqual(link2.range, new vscode.Range(0,25,0,44)); } { const links = getLinksForFile('[![a]( whitespace.jpg )]( https://whitespace.com )'); assert.strictEqual(links.length, 2); const [link1, link2] = links; assertRangeEqual(link1.range, new vscode.Range(0,7,0,21)); assertRangeEqual(link2.range, new vscode.Range(0,26,0,48)); } { const links = getLinksForFile('[![a](img1.jpg)](file1.txt) text [![a](img2.jpg)](file2.txt)'); assert.strictEqual(links.length, 4); const [link1, link2, link3, link4] = links; assertRangeEqual(link1.range, new vscode.Range(0,6,0,14)); assertRangeEqual(link2.range, new vscode.Range(0,17,0,26)); assertRangeEqual(link3.range, new vscode.Range(0,39,0,47)); assertRangeEqual(link4.range, new vscode.Range(0,50,0,59)); } }); </ins> });