From 42fa0ed8eabfbdfe37b501a2d2415e31f762e15e Mon Sep 17 00:00:00 2001 From: "i.morev" Date: Wed, 24 Nov 2021 18:10:07 +1000 Subject: [PATCH] Updated MarkdownRenderer.ts to support any heading level --- src/services/MarkdownRenderer.ts | 39 ++++++++++++++------------------ 1 file changed, 17 insertions(+), 22 deletions(-) diff --git a/src/services/MarkdownRenderer.ts b/src/services/MarkdownRenderer.ts index 9276a096..773a9ca7 100644 --- a/src/services/MarkdownRenderer.ts +++ b/src/services/MarkdownRenderer.ts @@ -35,6 +35,11 @@ export interface MarkdownHeading { description?: string; } +export type HeadingLevelType = 1 | 2 | 3 | 4 | 5 | 6; +export type HeadingsMap = { + [key in HeadingLevelType]: MarkdownHeading; +}; + export function buildComponentComment(name: string) { return ``; } @@ -54,8 +59,8 @@ export class MarkdownRenderer { } headings: MarkdownHeading[] = []; - currentTopHeading: MarkdownHeading; + private headingsMap: HeadingsMap = {} as HeadingsMap; private headingEnhanceRenderer: marked.Renderer; private originalHeadingRule: typeof marked.Renderer.prototype.heading; @@ -69,7 +74,7 @@ export class MarkdownRenderer { saveHeading( name: string, - level: number, + level: HeadingLevelType, container: MarkdownHeading[] = this.headings, parentId?: string, ): MarkdownHeading { @@ -121,28 +126,18 @@ export class MarkdownRenderer { prevRegexp = regexp; prevPos = currentPos; } - prevHeading.description = rawText - .substring(prevPos) - .replace(prevRegexp, '') - .trim(); + prevHeading.description = rawText.substring(prevPos).replace(prevRegexp, '').trim(); } - headingRule = ( - text: string, - level: 1 | 2 | 3 | 4 | 5 | 6, - raw: string, - slugger: marked.Slugger, - ) => { - if (level === 1) { - this.currentTopHeading = this.saveHeading(text, level); - } else if (level === 2) { - this.saveHeading( - text, - level, - this.currentTopHeading && this.currentTopHeading.items, - this.currentTopHeading && this.currentTopHeading.id, - ); - } + headingRule = (text: string, level: HeadingLevelType, raw: string, slugger: marked.Slugger) => { + const prevHeading = this.headingsMap[level - 1]; + this.headingsMap[level] = this.saveHeading( + text, + level, + prevHeading && prevHeading.items, + prevHeading && prevHeading.id, + ); + return this.originalHeadingRule(text, level, raw, slugger); };