@@ -22,7 +22,7 @@ class HtmlRenderer(rootPackage: Member, members: Map[DRI, Member])(using ctx: Do
22
22
html(
23
23
mkHead(page),
24
24
body(
25
- if ! page.hasFrame then renderContent(page)
25
+ if ! page.hasFrame then renderContent(page).content
26
26
else mkFrame(page.link, parents, renderContent(page))
27
27
)
28
28
)
@@ -148,7 +148,23 @@ class HtmlRenderer(rootPackage: Member, members: Map[DRI, Member])(using ctx: Do
148
148
)
149
149
}
150
150
151
- private def mkFrame (link : Link , parents : Vector [Link ], content : => AppliedTag ): AppliedTag =
151
+ private def renderTableOfContents (toc : Seq [TocEntry ]): Option [AppliedTag ] =
152
+ def renderTocRec (level : Int , rest : Seq [TocEntry ]): Seq [AppliedTag ] =
153
+ rest match {
154
+ case Nil => Nil
155
+ case head :: tail if head.level == level =>
156
+ val (nested, rest) = tail.span(_.level > level)
157
+ val nestedList = if nested.nonEmpty then Seq (ul(renderTocRec(level + 1 , nested))) else Nil
158
+ li(a(href := head.anchor)(head.content), nestedList) +: renderTocRec(level, rest)
159
+ case rest @ (head :: tail) if head.level > level =>
160
+ val (prefix, suffix) = rest.span(_.level > level)
161
+ li(ul(renderTocRec(level + 1 , prefix))) +: renderTocRec(level, suffix)
162
+ }
163
+
164
+ renderTocRec(1 , toc).headOption.map(toc => nav(cls := " toc-nav" )(ul(cls := " toc-list" )(toc)))
165
+
166
+
167
+ private def mkFrame (link : Link , parents : Vector [Link ], content : => PageContent ): AppliedTag =
152
168
val projectLogo =
153
169
args.projectLogo.map { path =>
154
170
val fileName = Paths .get(path).getFileName()
@@ -202,7 +218,7 @@ class HtmlRenderer(rootPackage: Member, members: Map[DRI, Member])(using ctx: Do
202
218
div(id := " scaladoc-searchBar" ),
203
219
main(id := " main-content" )(
204
220
parentsHtml,
205
- div(id := " content" )(content),
221
+ div(id := " content" )(content.content ),
206
222
),
207
223
footer(
208
224
div(id := " generated-by" )(
@@ -239,5 +255,11 @@ class HtmlRenderer(rootPackage: Member, members: Map[DRI, Member])(using ctx: Do
239
255
)
240
256
)
241
257
)
242
- )
258
+ ),
259
+ renderTableOfContents(content.toc).fold(Nil ) { toc =>
260
+ div(id := " toc" )(
261
+ span(cls := " toc-title" )(" In this article" ),
262
+ toc
263
+ )
264
+ }
243
265
)
0 commit comments