diff --git a/src/services/MarkdownRenderer.ts b/src/services/MarkdownRenderer.ts index 74d11aeb..9e833eb8 100644 --- a/src/services/MarkdownRenderer.ts +++ b/src/services/MarkdownRenderer.ts @@ -41,9 +41,13 @@ export class MarkdownRenderer { this.headingEnhanceRenderer.heading = this.headingRule; } - saveHeading(name: string, container: MarkdownHeading[] = this.headings): MarkdownHeading { + saveHeading( + name: string, + container: MarkdownHeading[] = this.headings, + parentId?: string, + ): MarkdownHeading { const item = { - id: 'section' + '/' + slugify(name), + id: parentId ? `${parentId}/${slugify(name)}` : `section/${slugify(name)}`, name, items: [], }; @@ -95,7 +99,11 @@ export class MarkdownRenderer { `${text}` ); } else if (level === 2) { - const { id } = this.saveHeading(text, this.currentTopHeading && this.currentTopHeading.items); + const { id } = this.saveHeading( + text, + this.currentTopHeading && this.currentTopHeading.items, + this.currentTopHeading && this.currentTopHeading.id, + ); return ( `` + `` + diff --git a/src/services/models/Group.model.ts b/src/services/models/Group.model.ts index 45b76359..d2a8d658 100644 --- a/src/services/models/Group.model.ts +++ b/src/services/models/Group.model.ts @@ -2,6 +2,7 @@ import { action, observable } from 'mobx'; import slugify from 'slugify'; import { OpenAPIExternalDocumentation, OpenAPITag } from '../../types'; +import { MarkdownHeading } from '../MarkdownRenderer'; import { ContentItemModel } from '../MenuBuilder'; import { IMenuItem, MenuItemGroupType } from '../MenuStore'; @@ -25,13 +26,18 @@ export class GroupModel implements IMenuItem { depth: number; //#endregion - constructor(type: MenuItemGroupType, tagOrGroup: OpenAPITag, parent?: GroupModel) { - this.id = type + '/' + slugify(tagOrGroup.name); + constructor( + type: MenuItemGroupType, + tagOrGroup: OpenAPITag | MarkdownHeading, + parent?: GroupModel, + ) { + // markdown headings already have ids calculated as they are needed for heading anchors + this.id = (tagOrGroup as MarkdownHeading).id || type + '/' + slugify(tagOrGroup.name); this.type = type; this.name = tagOrGroup['x-displayName'] || tagOrGroup.name; this.description = tagOrGroup.description || ''; this.parent = parent; - this.externalDocs = tagOrGroup.externalDocs; + this.externalDocs = (tagOrGroup as OpenAPITag).externalDocs; // groups are active (expanded) by default if (this.type === 'group') {