From 1c6f2f9a8012565adcc50616c3aa90cb444e8797 Mon Sep 17 00:00:00 2001 From: Yu Zhang <583181285@qq.com> Date: Wed, 23 Aug 2017 10:17:15 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20include=20setext=20heading=20lev?= =?UTF-8?q?els=20(Markdown)=20(#32987)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 🐛 include setext heading levels * 📝 typo * 💚 use `===` --- .../markdown/src/documentSymbolProvider.ts | 2 +- .../markdown/src/tableOfContentsProvider.ts | 17 +++++++++++++++-- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/extensions/markdown/src/documentSymbolProvider.ts b/extensions/markdown/src/documentSymbolProvider.ts index 24439ebf18c..77c0e0baad8 100644 --- a/extensions/markdown/src/documentSymbolProvider.ts +++ b/extensions/markdown/src/documentSymbolProvider.ts @@ -19,7 +19,7 @@ export default class MDDocumentSymbolProvider implements vscode.DocumentSymbolPr public async provideDocumentSymbols(document: vscode.TextDocument): Promise { const toc = await new TableOfContentsProvider(this.engine, document).getToc(); return toc.map(entry => { - return new vscode.SymbolInformation(entry.text, vscode.SymbolKind.Namespace, '', entry.location); + return new vscode.SymbolInformation('#'.repeat(entry.level) + ' ' + entry.text, vscode.SymbolKind.Namespace, '', entry.location); }); } } \ No newline at end of file diff --git a/extensions/markdown/src/tableOfContentsProvider.ts b/extensions/markdown/src/tableOfContentsProvider.ts index f080f64ce3b..26e64e4d837 100644 --- a/extensions/markdown/src/tableOfContentsProvider.ts +++ b/extensions/markdown/src/tableOfContentsProvider.ts @@ -12,6 +12,7 @@ import { MarkdownEngine } from './markdownEngine'; export interface TocEntry { slug: string; text: string; + level: number; line: number; location: vscode.Location; } @@ -53,10 +54,12 @@ export class TableOfContentsProvider { const lineNumber = heading.map[0]; const line = document.lineAt(lineNumber); const href = TableOfContentsProvider.slugify(line.text); + const level = TableOfContentsProvider.getHeaderLevel(heading.markup); if (href) { toc.push({ slug: href, text: TableOfContentsProvider.getHeaderText(line.text), + level: level, line: lineNumber, location: new vscode.Location(document.uri, line.range) }); @@ -65,14 +68,24 @@ export class TableOfContentsProvider { return toc; } + private static getHeaderLevel(markup: string): number { + if (markup === '=') { + return 1; + } else if (markup === '-') { + return 2; + } else { // '#', '##', ... + return markup.length; + } + } + private static getHeaderText(header: string): string { - return header.replace(/^\s*(#+)\s*(.*?)\s*\1*$/, (_, level, word) => `${level} ${word.trim()}`); + return header.replace(/^\s*#+\s*(.*?)\s*\1*$/, (_, word) => `${word.trim()}`); } public static slugify(header: string): string { return encodeURI(header.trim() .toLowerCase() - .replace(/[\]\[\!\"\#\$\%\&\'\(\)\*\+\,\.\/\:\;\<\=\>\?\@\\\^\_\{\|\}\~]/g, '') + .replace(/[\]\[\!\"\#\$\%\&\'\(\)\*\+\,\.\/\:\;\<\=\>\?\@\\\^\_\{\|\}\~\`]/g, '') .replace(/\s+/g, '-') .replace(/^\-+/, '') .replace(/\-+$/, '')); -- GitLab