From d66a05cf574d74fcb1bdc39244cb672ee2dd839b Mon Sep 17 00:00:00 2001 From: Andrey Lomakin Date: Tue, 2 Feb 2021 10:45:21 +0300 Subject: [PATCH] Fix broken Markdown headings with quotes --- src/services/MenuStore.ts | 16 ++++++++++++---- src/utils/helpers.ts | 3 ++- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/services/MenuStore.ts b/src/services/MenuStore.ts index ac60fee8..4e080065 100644 --- a/src/services/MenuStore.ts +++ b/src/services/MenuStore.ts @@ -46,7 +46,7 @@ export class MenuStore { if (!id) { return; } - scroll.scrollIntoViewBySelector(`[${SECTION_ATTR}="${id}"]`); + scroll.scrollIntoViewBySelector(`[${SECTION_ATTR}="${MenuStore.escapeQuotes(id)}"]`); } /** @@ -152,7 +152,7 @@ export class MenuStore { item = this.flatItems.find(i => SECURITY_SCHEMES_SECTION_PREFIX.startsWith(i.id)); this.activate(item); } - this.scroll.scrollIntoViewBySelector(`[${SECTION_ATTR}="${id}"]`); + this.scroll.scrollIntoViewBySelector(`[${SECTION_ATTR}="${MenuStore.escapeQuotes(id)}"]`); } }; @@ -162,7 +162,7 @@ export class MenuStore { */ getElementAt(idx: number): Element | null { const item = this.flatItems[idx]; - return (item && querySelector(`[${SECTION_ATTR}="${item.id}"]`)) || null; + return (item && querySelector(`[${SECTION_ATTR}="${MenuStore.escapeQuotes(item.id)}"]`)) || null; } /** @@ -174,7 +174,7 @@ export class MenuStore { if (item && item.type === 'group') { item = item.items[0]; } - return (item && querySelector(`[${SECTION_ATTR}="${item.id}"]`)) || null; + return (item && querySelector(`[${SECTION_ATTR}="${MenuStore.escapeQuotes(item.id)}"]`)) || null; } /** @@ -274,4 +274,12 @@ export class MenuStore { this._unsubscribe(); this._hashUnsubscribe(); } + + private static escapeQuotes(str: string) : string { + if (typeof str != 'undefined') { + str = str.replace(/["\\]/g, '\\$&'); + } + + return str; + } } diff --git a/src/utils/helpers.ts b/src/utils/helpers.ts index d84217a9..8c2782a4 100644 --- a/src/utils/helpers.ts +++ b/src/utils/helpers.ts @@ -198,5 +198,6 @@ function parseURL(url: string) { export function unescapeHTMLChars(str: string): string { return str .replace(/&#(\d+);/g, (_m, code) => String.fromCharCode(parseInt(code, 10))) - .replace(/&/g, '&'); + .replace(/&/g, '&') + .replace(/"/g, '"'); }