Skip to content

Commit 3efe571

Browse files
Florian3kszymon-rd
authored andcommitted
Display packages in nested way in sidebar
1 parent 455fbd2 commit 3efe571

File tree

3 files changed

+36
-7
lines changed

3 files changed

+36
-7
lines changed

scaladoc/src/dotty/tools/scaladoc/ScalaModuleProvider.scala

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,31 @@ object ScalaModuleProvider:
1010
def mkModule()(using ctx: DocContext): Module =
1111
val (result, rootDoc) = ScaladocTastyInspector().result()
1212
val (rootPck, rest) = result.partition(_.name == "API")
13-
val packageMembers = (rest ++ rootPck.flatMap(_.members))
13+
val (emptyPackages, nonemptyPackages) = (rest ++ rootPck.flatMap(_.members))
1414
.filter(p => p.members.nonEmpty || p.docs.nonEmpty).sortBy(_.name)
15+
.partition(_.name == "<empty>")
16+
17+
val groupedMembers =
18+
def groupMembers(ms: List[Member], n: Int = 0): List[Member] =
19+
ms.groupBy(_.name.split('.')(n)).values.map {
20+
case m :: ms if m.name.count(_ == '.') == n =>
21+
m.withMembers(groupMembers(ms, n + 1) ++ m.members)
22+
case ms =>
23+
groupMembers(ms, n + 1) match
24+
case m :: Nil => m
25+
case ms =>
26+
val name = ms.head.name.split('.').take(n + 1).mkString(".")
27+
Member(
28+
name = name,
29+
fullName = name,
30+
dri = DRI(location = name),
31+
kind = Kind.Package,
32+
members = ms,
33+
)
34+
}.toList.sortBy(_.name)
35+
groupMembers(nonemptyPackages)
36+
37+
val packageMembers = groupedMembers ++ emptyPackages.flatMap(_.members)
1538

1639
def flattenMember(m: Member): Seq[(DRI, Member)] = (m.dri -> m) +: m.members.flatMap(flattenMember)
1740

scaladoc/src/dotty/tools/scaladoc/renderers/HtmlRenderer.scala

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -105,10 +105,16 @@ class HtmlRenderer(rootPackage: Member, members: Map[DRI, Member])(using ctx: Do
105105
case _ => Nil
106106
}
107107

108-
def renderNested(nav: Page, nestLevel: Int): (Boolean, AppliedTag) =
108+
def renderNested(nav: Page, nestLevel: Int, prefix: String = ""): (Boolean, AppliedTag) =
109109
val isApi = nav.content.isInstanceOf[Member]
110110
val isSelected = nav.link.dri == pageLink.dri
111111
val isTopElement = nestLevel == 0
112+
val name = nav.content match {
113+
case m: Member if m.kind == Kind.Package =>
114+
m.name.stripPrefix(prefix).stripPrefix(".")
115+
case _ => nav.link.name
116+
}
117+
val newPrefix = if prefix == "" then name else s"$prefix.$name"
112118

113119
def linkHtml(expanded: Boolean = false, withArrow: Boolean = false) =
114120
val attrs: Seq[String] = Seq(
@@ -124,14 +130,14 @@ class HtmlRenderer(rootPackage: Member, members: Map[DRI, Member])(using ctx: Do
124130
Seq(
125131
span(cls := s"nh " + attrs.mkString(" "))(
126132
if withArrow then Seq(button(cls := s"ar icon-button ${if isSelected || expanded then "expanded" else ""}")) else Nil,
127-
a(href := pathToPage(pageLink.dri, nav.link.dri))(icon, span(nav.link.name))
133+
a(href := pathToPage(pageLink.dri, nav.link.dri))(icon, span(name))
128134
)
129135
)
130136

131137
nav.children.filterNot(_.hidden) match
132138
case Nil => isSelected -> div(cls := s"ni n$nestLevel ${if isSelected then "expanded" else ""}")(linkHtml())
133139
case children =>
134-
val nested = children.map(renderNested(_, nestLevel + 1))
140+
val nested = children.map(renderNested(_, nestLevel + 1, newPrefix))
135141
val expanded = nested.exists(_._1)
136142
val attr =
137143
if expanded || isSelected then Seq(cls := s"ni n$nestLevel expanded") else Seq(cls := s"ni n$nestLevel")

scaladoc/test/dotty/tools/scaladoc/site/NavigationTest.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@ class NavigationTest extends BaseHtmlTest:
3030

3131
val apiNav = Seq(
3232
NavMenuTestEntry("tests.site", "site.html", Seq(
33+
NavMenuTestEntry("some.other", "site/some/other.html", Seq(
34+
NavMenuTestEntry("SomeOtherPackage", "site/some/other/SomeOtherPackage.html", Nil),
35+
)),
3336
NavMenuTestEntry("BrokenLink", "site/BrokenLink.html", Nil),
3437
NavMenuTestEntry("BrokenLinkWiki", "site/BrokenLinkWiki.html", Nil),
3538
NavMenuTestEntry("OtherPackageLink", "site/OtherPackageLink.html", Nil),
@@ -38,9 +41,6 @@ class NavigationTest extends BaseHtmlTest:
3841
NavMenuTestEntry("SamePackageLinkWiki", "site/SamePackageLinkWiki.html", Nil),
3942
NavMenuTestEntry("SomeClass", "site/SomeClass.html", Nil)
4043
)),
41-
NavMenuTestEntry("tests.site.some.other", "site/some/other.html", Seq(
42-
NavMenuTestEntry("SomeOtherPackage", "site/some/other/SomeOtherPackage.html", Nil),
43-
))
4444
)
4545

4646
testNavMenu("docs/Adoc.html", docsNav)

0 commit comments

Comments
 (0)