forked from MapComplete/MapComplete
Fix: add workaround for limited html conversion, add documentation and cleanup some code
This commit is contained in:
parent
24cb539559
commit
de402a7d84
2 changed files with 22 additions and 15 deletions
|
@ -141,7 +141,9 @@ export class GenerateDocs extends Script {
|
|||
|
||||
this.WriteMarkdownFile("./Docs/SpecialRenderings.md", SpecialVisualizations.HelpMessage(), [
|
||||
"src/UI/SpecialVisualizations.ts",
|
||||
])
|
||||
], {
|
||||
tocMaxDepth: 3
|
||||
})
|
||||
|
||||
if (!existsSync("./Docs/Themes")) {
|
||||
mkdirSync("./Docs/Themes")
|
||||
|
@ -217,7 +219,8 @@ export class GenerateDocs extends Script {
|
|||
markdown: string,
|
||||
autogenSource: string[],
|
||||
options?: {
|
||||
noTableOfContents?: boolean
|
||||
noTableOfContents?: boolean,
|
||||
tocMaxDepth?: number
|
||||
}
|
||||
): void {
|
||||
for (const source of autogenSource) {
|
||||
|
@ -236,7 +239,7 @@ export class GenerateDocs extends Script {
|
|||
let md = markdown
|
||||
|
||||
if (options?.noTableOfContents !== false) {
|
||||
md = TableOfContents.insertTocIntoMd(md)
|
||||
md = TableOfContents.insertTocIntoMd(md, options?.tocMaxDepth)
|
||||
}
|
||||
|
||||
md = md.replace(/\n\n\n+/g, "\n\n")
|
||||
|
|
|
@ -48,13 +48,21 @@ export default class TableOfContents {
|
|||
return TableOfContents.mergeLevel(result)
|
||||
}
|
||||
|
||||
public static insertTocIntoMd(md: string): string {
|
||||
const htmlSource = <string>marked.parse(md)
|
||||
public static insertTocIntoMd(md: string, maxDepth: number): string {
|
||||
// parse_html has a limit on how much html it can parse. We strip away the actual content, only keeping the titles
|
||||
const mdStripped = md.split("\n\n").filter(l => l.trim().startsWith("#")).join("\n\n")
|
||||
const htmlSource = <string>marked.parse(mdStripped)
|
||||
const el = parse_html(htmlSource)
|
||||
const structure = TableOfContents.generateStructure(<any>el)
|
||||
if(structure.length <= 1){
|
||||
return md
|
||||
}
|
||||
const firstTitle = structure[1]
|
||||
let minDepth = undefined
|
||||
do {
|
||||
// The document probably has a _single_ title at the top, denoting the title of the document
|
||||
// We don't care for that title in the table of content; it'll just be clutter and use a single, valuable level
|
||||
// So: we search this element, check if there indeed is only one and, if that is the case, erase it
|
||||
minDepth = Math.min(...structure.map((s) => s.depth))
|
||||
const minDepthCount = structure.filter((s) => s.depth === minDepth)
|
||||
if (minDepthCount.length > 1) {
|
||||
|
@ -65,6 +73,7 @@ export default class TableOfContents {
|
|||
structure.findIndex((s) => s.depth === minDepth),
|
||||
1
|
||||
)
|
||||
// As long as we have a lone top level, we continue cleaning up; hence the 'do-while'
|
||||
} while (structure.length > 0)
|
||||
|
||||
if (structure.length <= 1) {
|
||||
|
@ -84,7 +93,7 @@ export default class TableOfContents {
|
|||
if (depthDiff === 0) {
|
||||
topLevelCount++
|
||||
toc += `${topLevelCount}. ${link}\n`
|
||||
} else if (depthDiff <= 3) {
|
||||
} else if (depthDiff <= 3 &&(maxDepth === undefined || depthDiff < maxDepth)) {
|
||||
toc += `${separators[depthDiff]} ${link}\n`
|
||||
}
|
||||
}
|
||||
|
@ -101,23 +110,18 @@ export default class TableOfContents {
|
|||
}
|
||||
|
||||
public static generateStructure(
|
||||
html: Element
|
||||
html: Element | ChildNode
|
||||
): { depth: number; title: string; el: Element }[] {
|
||||
if (html === undefined) {
|
||||
return []
|
||||
}
|
||||
return [].concat(
|
||||
...Array.from(html.childNodes ?? []).map((child) => {
|
||||
return Array.from(html.childNodes ?? []).flatMap((child) => {
|
||||
const tag: string = child["tagName"]?.toLowerCase()
|
||||
if (!tag) {
|
||||
return []
|
||||
}
|
||||
if (tag.match(/h[0-9]/)) {
|
||||
if (tag?.match(/h[0-9]/)) {
|
||||
const depth = Number(tag.substring(1))
|
||||
return [{ depth, title: child.textContent, el: child }]
|
||||
return [{ depth, title: child.textContent, el: <Element> child }]
|
||||
}
|
||||
return TableOfContents.generateStructure(<Element>child)
|
||||
})
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue