Updated MarkdownRenderer.ts to support any heading level

This commit is contained in:
i.morev 2021-11-24 18:10:07 +10:00
parent 82df17d871
commit 42fa0ed8ea

View File

@ -35,6 +35,11 @@ export interface MarkdownHeading {
description?: string; description?: string;
} }
export type HeadingLevelType = 1 | 2 | 3 | 4 | 5 | 6;
export type HeadingsMap = {
[key in HeadingLevelType]: MarkdownHeading;
};
export function buildComponentComment(name: string) { export function buildComponentComment(name: string) {
return `<!-- ReDoc-Inject: <${name}> -->`; return `<!-- ReDoc-Inject: <${name}> -->`;
} }
@ -54,8 +59,8 @@ export class MarkdownRenderer {
} }
headings: MarkdownHeading[] = []; headings: MarkdownHeading[] = [];
currentTopHeading: MarkdownHeading;
private headingsMap: HeadingsMap = {} as HeadingsMap;
private headingEnhanceRenderer: marked.Renderer; private headingEnhanceRenderer: marked.Renderer;
private originalHeadingRule: typeof marked.Renderer.prototype.heading; private originalHeadingRule: typeof marked.Renderer.prototype.heading;
@ -69,7 +74,7 @@ export class MarkdownRenderer {
saveHeading( saveHeading(
name: string, name: string,
level: number, level: HeadingLevelType,
container: MarkdownHeading[] = this.headings, container: MarkdownHeading[] = this.headings,
parentId?: string, parentId?: string,
): MarkdownHeading { ): MarkdownHeading {
@ -121,28 +126,18 @@ export class MarkdownRenderer {
prevRegexp = regexp; prevRegexp = regexp;
prevPos = currentPos; prevPos = currentPos;
} }
prevHeading.description = rawText prevHeading.description = rawText.substring(prevPos).replace(prevRegexp, '').trim();
.substring(prevPos)
.replace(prevRegexp, '')
.trim();
} }
headingRule = ( headingRule = (text: string, level: HeadingLevelType, raw: string, slugger: marked.Slugger) => {
text: string, const prevHeading = this.headingsMap[level - 1];
level: 1 | 2 | 3 | 4 | 5 | 6, this.headingsMap[level] = this.saveHeading(
raw: string,
slugger: marked.Slugger,
) => {
if (level === 1) {
this.currentTopHeading = this.saveHeading(text, level);
} else if (level === 2) {
this.saveHeading(
text, text,
level, level,
this.currentTopHeading && this.currentTopHeading.items, prevHeading && prevHeading.items,
this.currentTopHeading && this.currentTopHeading.id, prevHeading && prevHeading.id,
); );
}
return this.originalHeadingRule(text, level, raw, slugger); return this.originalHeadingRule(text, level, raw, slugger);
}; };