diff --git a/extensions/markdown-language-features/src/slugify.ts b/extensions/markdown-language-features/src/slugify.ts index 93c68d8f0e60db7bc02a56326e76956a3909a616..c3e167e89e07d2c61b09f7ca23818a14b96a4d25 100644 --- a/extensions/markdown-language-features/src/slugify.ts +++ b/extensions/markdown-language-features/src/slugify.ts @@ -23,7 +23,7 @@ export const githubSlugifier: Slugifier = new class implements Slugifier { heading.trim() .toLowerCase() .replace(/\s+/g, '-') // Replace whitespace with - - .replace(/[^\w\-]+/gu, '') // Remove non-word chars + .replace(/[\]\[\!\'\#\$\%\&\'\(\)\*\+\,\.\/\:\;\<\=\>\?\@\\\^\_\{\|\}\~\`]/g, '') // Remove known puctuators .replace(/^\-+/, '') // Remove leading - .replace(/\-+$/, '') // Remove trailing - ); diff --git a/extensions/markdown-language-features/src/test/tableOfContentsProvider.test.ts b/extensions/markdown-language-features/src/test/tableOfContentsProvider.test.ts index fd98088c8e87b846eaf9ead60012ca4e8e7af2e2..6d6f382ae7e9c27f6ab6e25d05f98b76a9c9576d 100644 --- a/extensions/markdown-language-features/src/test/tableOfContentsProvider.test.ts +++ b/extensions/markdown-language-features/src/test/tableOfContentsProvider.test.ts @@ -88,4 +88,22 @@ suite('markdown.TableOfContentsProvider', () => { assert.strictEqual((await provider.lookup('инструкция---делай-раз-делай-два'))!.line, 0); }); + + test('should handle special characters 3, #37079', async () => { + const doc = new InMemoryDocument(testFileName, `## Header 2 +### Header 3 +## Заголовок 2 +### Заголовок 3 +### Заголовок Header 3 +## Заголовок`); + + const provider = new TableOfContentsProvider(createNewMarkdownEngine(), doc); + + assert.strictEqual((await provider.lookup('header-2'))!.line, 0); + assert.strictEqual((await provider.lookup('header-3'))!.line, 1); + assert.strictEqual((await provider.lookup('Заголовок-2'))!.line, 2); + assert.strictEqual((await provider.lookup('Заголовок-3'))!.line, 3); + assert.strictEqual((await provider.lookup('Заголовок-header-3'))!.line, 4); + assert.strictEqual((await provider.lookup('Заголовок'))!.line, 5); + }); });