From 558c694d473142173ebe6e1d3fb5be8d84d24ba3 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Fri, 25 May 2018 11:56:41 -0700 Subject: [PATCH] Use blacklist for puctuators Currently we can't use `/\p{L}/u` which would let use use a whitelist instead Fixes #37079 --- .../markdown-language-features/src/slugify.ts | 2 +- .../src/test/tableOfContentsProvider.test.ts | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/extensions/markdown-language-features/src/slugify.ts b/extensions/markdown-language-features/src/slugify.ts index 93c68d8f0e6..c3e167e89e0 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 fd98088c8e8..6d6f382ae7e 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); + }); });