Skip to content

Commit 0dae77d

Browse files
committed
Enable markdown links with line numbers to non-md files
Fixes #125320
1 parent ecae847 commit 0dae77d

File tree

3 files changed

+45
-20
lines changed

3 files changed

+45
-20
lines changed

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

Lines changed: 29 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -106,11 +106,15 @@ export class OpenDocumentLinkCommand implements Command {
106106
}
107107

108108
private static async tryNavigateToFragmentInActiveEditor(engine: MarkdownEngine, resource: vscode.Uri, args: OpenDocumentLinkArgs): Promise<boolean> {
109-
if (vscode.window.activeTextEditor && isMarkdownFile(vscode.window.activeTextEditor.document)) {
110-
if (vscode.window.activeTextEditor.document.uri.fsPath === resource.fsPath) {
111-
await this.tryRevealLine(engine, vscode.window.activeTextEditor, args.fragment);
112-
return true;
109+
const activeEditor = vscode.window.activeTextEditor;
110+
if (activeEditor?.document.uri.fsPath === resource.fsPath) {
111+
if (isMarkdownFile(activeEditor.document)) {
112+
if (await this.tryRevealLineUsingTocFragment(engine, activeEditor, args.fragment)) {
113+
return true;
114+
}
113115
}
116+
this.tryRevealLineUsingLineFragment(activeEditor, args.fragment);
117+
return true;
114118
}
115119
return false;
116120
}
@@ -127,25 +131,30 @@ export class OpenDocumentLinkCommand implements Command {
127131
}
128132
}
129133

130-
private static async tryRevealLine(engine: MarkdownEngine, editor: vscode.TextEditor, fragment?: string) {
131-
if (fragment) {
132-
const toc = new TableOfContentsProvider(engine, editor.document);
133-
const entry = await toc.lookup(fragment);
134-
if (entry) {
135-
const lineStart = new vscode.Range(entry.line, 0, entry.line, 0);
134+
private static async tryRevealLineUsingTocFragment(engine: MarkdownEngine, editor: vscode.TextEditor, fragment: string): Promise<boolean> {
135+
const toc = new TableOfContentsProvider(engine, editor.document);
136+
const entry = await toc.lookup(fragment);
137+
if (entry) {
138+
const lineStart = new vscode.Range(entry.line, 0, entry.line, 0);
139+
editor.selection = new vscode.Selection(lineStart.start, lineStart.end);
140+
editor.revealRange(lineStart, vscode.TextEditorRevealType.AtTop);
141+
return true;
142+
}
143+
return false;
144+
}
145+
146+
private static tryRevealLineUsingLineFragment(editor: vscode.TextEditor, fragment: string): boolean {
147+
const lineNumberFragment = fragment.match(/^L(\d+)$/i);
148+
if (lineNumberFragment) {
149+
const line = +lineNumberFragment[1] - 1;
150+
if (!isNaN(line)) {
151+
const lineStart = new vscode.Range(line, 0, line, 0);
136152
editor.selection = new vscode.Selection(lineStart.start, lineStart.end);
137-
return editor.revealRange(lineStart, vscode.TextEditorRevealType.AtTop);
138-
}
139-
const lineNumberFragment = fragment.match(/^L(\d+)$/i);
140-
if (lineNumberFragment) {
141-
const line = +lineNumberFragment[1] - 1;
142-
if (!isNaN(line)) {
143-
const lineStart = new vscode.Range(line, 0, line, 0);
144-
editor.selection = new vscode.Selection(lineStart.start, lineStart.end);
145-
return editor.revealRange(lineStart, vscode.TextEditorRevealType.AtTop);
146-
}
153+
editor.revealRange(lineStart, vscode.TextEditorRevealType.AtTop);
154+
return true;
147155
}
148156
}
157+
return false;
149158
}
150159
}
151160

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,17 @@ suite('Markdown Document links', () => {
9494
assert.strictEqual(vscode.window.activeTextEditor!.selection.start.line, 1);
9595
});
9696

97+
98+
test('Should navigate to line number within non-md file', async () => {
99+
await withFileContents(testFileA, '[b](sub/foo.txt#L3)');
100+
101+
const [link] = await getLinksForFile(testFileA);
102+
await executeLink(link);
103+
104+
assertActiveDocumentUri(workspaceFile('sub', 'foo.txt'));
105+
assert.strictEqual(vscode.window.activeTextEditor!.selection.start.line, 2);
106+
});
107+
97108
test('Should navigate to fragment within current file', async () => {
98109
await withFileContents(testFileA, joinLines(
99110
'[](a#header)',
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
1
2+
2
3+
3
4+
4
5+
5

0 commit comments

Comments
 (0)