99using concurrent
1010using fandoc:: FandocParser
1111using fandoc:: Heading
12+ using markdown:: XetodocChapter
13+ using markdown:: XetodocHeading
1214
1315**
1416** DocChapter models a fandoc "chapter" in a manual like docLang
@@ -31,26 +33,62 @@ const class DocChapter : Doc
3133 meta := Str : Str [: ]
3234 try
3335 {
34- // parse fandoc silently - don't worry about errors,
35- // we'll catch and report them at render time
36- parser := FandocParser()
37- parser.silent = true
38- fandocDoc := parser.parse(f.name, doc.text.in)
39- meta = fandocDoc.meta
40- fandocHeadings := fandocDoc.findHeadings
41-
42- // map headings into tree structure
43- buildHeadingsTree(loader, fandocHeadings, headingTop, headingMap)
36+ text := doc.text
37+ if (format === DocFormat.markdown)
38+ buildHeadingsMarkdown(loader, headingTop, headingMap, meta)
39+ else
40+ buildHeadingsFandoc(loader, headingTop, headingMap, meta)
4441 }
4542 catch (Err e)
4643 {
47- loader.err("Cannot parse fandoc chapter" , loc, e)
44+ loader.err("Cannot parse chapter" , loc, e)
4845 }
4946 this .headings = headingTop
5047 this .headingMap = headingMap
5148 this .meta = meta
5249 }
5350
51+ //////////////////////////////////////////////////////////////////////////
52+ // Markdown Headings
53+ //////////////////////////////////////////////////////////////////////////
54+
55+ private Void buildHeadingsMarkdown(DocPodLoader loader, DocHeading[] headingTop, Str : DocHeading headingMap, Str : Str meta)
56+ {
57+ xc := XetodocChapter.parse(doc.text)
58+ meta.setAll(xc.meta)
59+ xc.top.each |x|
60+ {
61+ headingTop.add(mapXetodocHeading(x, headingMap))
62+ }
63+ }
64+
65+ private DocHeading mapXetodocHeading(XetodocHeading x, Str : DocHeading acc)
66+ {
67+ h := DocHeading { it .level = x.level; it .title = x.text; it .anchorId = x.anchor }
68+ acc[h.anchorId] = h
69+ children := x.children.map |kid- > DocHeading| { mapXetodocHeading(kid, acc) }
70+ h.childrenRef.val = children.toImmutable
71+ return h
72+ }
73+
74+ //////////////////////////////////////////////////////////////////////////
75+ // Fandoc Headings
76+ //////////////////////////////////////////////////////////////////////////
77+
78+ private Void buildHeadingsFandoc(DocPodLoader loader, DocHeading[] headingTop, Str : DocHeading headingMap, Str : Str meta)
79+ {
80+ // parse fandoc silently - don't worry about errors,
81+ // we'll catch and report them at render time
82+ parser := FandocParser()
83+ parser.silent = true
84+ fandocDoc := parser.parse(name, doc.text.in)
85+ meta.addAll(fandocDoc.meta)
86+ fandocHeadings := fandocDoc.findHeadings
87+
88+ // map headings into tree structure
89+ buildHeadingsTree(loader, fandocHeadings, headingTop, headingMap)
90+ }
91+
5492 private Void buildHeadingsTree(DocPodLoader loader, Heading[] fandoc, DocHeading[] top, Str : DocHeading map)
5593 {
5694 // if no headings just bail
@@ -100,6 +138,10 @@ const class DocChapter : Doc
100138 children.each |kids, h| { h.childrenRef.val = kids.toImmutable }
101139 }
102140
141+ //////////////////////////////////////////////////////////////////////////
142+ // Identity
143+ //////////////////////////////////////////////////////////////////////////
144+
103145 ** Pod which defines this chapter such as "docLang"
104146 const DocPod pod
105147
@@ -181,6 +223,10 @@ const class DocChapter : Doc
181223 }
182224}
183225
226+ **************************************************************************
227+ ** DocHeading
228+ **************************************************************************
229+
184230**
185231** DocHeader models a heading in a table of contents for pod/chapter.
186232**
0 commit comments