@@ -22,7 +22,7 @@ class HtmlRenderer(rootPackage: Member, members: Map[DRI, Member])(using ctx: Do
2222 html(
2323 mkHead(page),
2424 body(
25- if ! page.hasFrame then renderContent(page)
25+ if ! page.hasFrame then renderContent(page).content
2626 else mkFrame(page.link, parents, renderContent(page))
2727 )
2828 )
@@ -148,7 +148,23 @@ class HtmlRenderer(rootPackage: Member, members: Map[DRI, Member])(using ctx: Do
148148 )
149149 }
150150
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 => ul(cls := " toc-list" )(toc))
165+
166+
167+ private def mkFrame (link : Link , parents : Vector [Link ], content : => PageContent ): AppliedTag =
152168 val projectLogo =
153169 args.projectLogo.map { path =>
154170 val fileName = Paths .get(path).getFileName()
@@ -202,7 +218,7 @@ class HtmlRenderer(rootPackage: Member, members: Map[DRI, Member])(using ctx: Do
202218 div(id := " scaladoc-searchBar" ),
203219 main(id := " main-content" )(
204220 parentsHtml,
205- div(id := " content" )(content),
221+ div(id := " content" )(content.content ),
206222 ),
207223 footer(
208224 div(id := " generated-by" )(
@@ -239,5 +255,11 @@ class HtmlRenderer(rootPackage: Member, members: Map[DRI, Member])(using ctx: Do
239255 )
240256 )
241257 )
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+ }
243265 )
0 commit comments