diff --git a/extensions/markdown-language-features/package.json b/extensions/markdown-language-features/package.json index ee9484ad6c9..dc1a07ae6b0 100644 --- a/extensions/markdown-language-features/package.json +++ b/extensions/markdown-language-features/package.json @@ -308,7 +308,6 @@ "dependencies": { "highlight.js": "9.12.0", "markdown-it": "^8.4.1", - "markdown-it-named-headers": "0.0.4", "vscode-extension-telemetry": "0.0.22", "vscode-nls": "^4.0.0" }, diff --git a/extensions/markdown-language-features/src/markdownEngine.ts b/extensions/markdown-language-features/src/markdownEngine.ts index 909bc760c2f..085b1a5e2eb 100644 --- a/extensions/markdown-language-features/src/markdownEngine.ts +++ b/extensions/markdown-language-features/src/markdownEngine.ts @@ -17,8 +17,8 @@ export class MarkdownEngine { private md?: MarkdownIt; private firstLine?: number; - private currentDocument?: vscode.Uri; + private _slugCount = new Map(); public constructor( private readonly extensionPreviewResourceProvider: MarkdownContributions, @@ -36,7 +36,6 @@ export class MarkdownEngine { private async getEngine(resource: vscode.Uri): Promise { if (!this.md) { const hljs = await import('highlight.js'); - const mdnh = await import('markdown-it-named-headers'); this.md = (await import('markdown-it'))({ html: true, highlight: (str: string, lang?: string) => { @@ -54,8 +53,6 @@ export class MarkdownEngine { } return `
${this.md!.utils.escapeHtml(str)}
`; } - }).use(mdnh, { - slugify: (header: string) => this.slugifier.fromHeading(header).value }); for (const plugin of this.extensionPreviewResourceProvider.markdownItPlugins) { @@ -71,6 +68,7 @@ export class MarkdownEngine { this.addLinkNormalizer(this.md); this.addLinkValidator(this.md); + this.addNamedHeaders(this.md); } const config = vscode.workspace.getConfiguration('markdown', resource); @@ -101,6 +99,8 @@ export class MarkdownEngine { } this.currentDocument = document; this.firstLine = offset; + this._slugCount = new Map(); + const engine = await this.getEngine(document); return engine.render(text); } @@ -108,6 +108,8 @@ export class MarkdownEngine { public async parse(document: vscode.Uri, source: string): Promise { const { text, offset } = this.stripFrontmatter(source); this.currentDocument = document; + this._slugCount = new Map(); + const engine = await this.getEngine(document); return engine.parse(text, {}).map(token => { @@ -219,4 +221,29 @@ export class MarkdownEngine { return validateLink(link) || link.indexOf('file:') === 0; }; } + + private addNamedHeaders(md: any): void { + const original = md.renderer.rules.heading_open; + md.renderer.rules.heading_open = (tokens: any, idx: number, options: any, env: any, self: any) => { + const title = tokens[idx + 1].children.reduce((acc: string, t: any) => acc + t.content, ''); + let slug = this.slugifier.fromHeading(title); + + if (this._slugCount.has(slug.value)) { + const count = this._slugCount.get(slug.value)!; + this._slugCount.set(slug.value, count + 1); + slug = this.slugifier.fromHeading(slug.value + '-' + (count + 1)); + } else { + this._slugCount.set(slug.value, 0); + } + + tokens[idx].attrs = tokens[idx].attrs || []; + tokens[idx].attrs.push(['id', slug.value]); + + if (original) { + return original(tokens, idx, options, env, self); + } else { + return self.renderToken(tokens, idx, options, env, self); + } + }; + } } \ No newline at end of file diff --git a/extensions/markdown-language-features/yarn.lock b/extensions/markdown-language-features/yarn.lock index 2ee630f88b9..e95b79f5238 100644 --- a/extensions/markdown-language-features/yarn.lock +++ b/extensions/markdown-language-features/yarn.lock @@ -3895,13 +3895,6 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" -markdown-it-named-headers@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/markdown-it-named-headers/-/markdown-it-named-headers-0.0.4.tgz#82efc28324240a6b1e77b9aae501771d5f351c1f" - integrity sha1-gu/CgyQkCmsed7mq5QF3HV81HB8= - dependencies: - string "^3.0.1" - markdown-it@^8.4.1: version "8.4.1" resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-8.4.1.tgz#206fe59b0e4e1b78a7c73250af9b34a4ad0aaf44" @@ -5711,11 +5704,6 @@ string-width@^2.0.0, string-width@^2.1.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" -string@^3.0.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/string/-/string-3.3.1.tgz#8d2757ec1c0e6c526796fbb6b14036a4098398b7" - integrity sha1-jSdX7BwObFJnlvu2sUA2pAmDmLc= - string_decoder@^1.0.0, string_decoder@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab"