Skip to content

Commit d814f81

Browse files
committed
compilerDoc: refactor DocChapter to support building headings from both markdown and fandoc
1 parent b2e63b3 commit d814f81

2 files changed

Lines changed: 58 additions & 12 deletions

File tree

src/compilerDoc/fan/model/DocChapter.fan

Lines changed: 57 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
using concurrent
1010
using fandoc::FandocParser
1111
using 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
**

src/compilerDoc/fan/model/DocPod.fan

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -319,7 +319,7 @@ internal class DocPodLoader
319319
}
320320

321321
// if doc/{type}.fandoc
322-
if (f.ext == "fandoc")
322+
if (f.ext == "fandoc" || f.ext == "md")
323323
{
324324
chapter := DocChapter(this, f)
325325
chapters[chapter.name] = chapter

0 commit comments

Comments
 (0)