@@ -2,14 +2,16 @@ package dotty.tools.scaladoc
2
2
package renderers
3
3
4
4
import scala .collection .immutable .SortedMap
5
- import scala .util .chaining ._
6
- import util .HTML ._
7
- import scala .jdk .CollectionConverters ._
5
+ import scala .util .chaining .*
6
+ import util .HTML .*
7
+
8
+ import scala .jdk .CollectionConverters .*
8
9
import dotty .tools .scaladoc .translators .FilterAttributes
9
10
import dotty .tools .scaladoc .tasty .comments .markdown .DocFlexmarkRenderer
10
- import com .vladsch .flexmark .util .ast .{ Node => MdNode }
11
+ import com .vladsch .flexmark .util .ast .Node as MdNode
11
12
import dotty .tools .scaladoc .tasty .comments .wiki .WikiDocElement
12
- import translators ._
13
+ import org .jsoup .Jsoup
14
+ import translators .*
13
15
14
16
class MemberRenderer (signatureRenderer : SignatureRenderer )(using DocContext ) extends DocRender (signatureRenderer):
15
17
import signatureRenderer ._
@@ -122,8 +124,14 @@ class MemberRenderer(signatureRenderer: SignatureRenderer)(using DocContext) ext
122
124
Option .when(bodyContents.nonEmpty || attributes.nonEmpty)(
123
125
div(cls := " cover" )(
124
126
div(cls := " doc" )(bodyContents),
125
- Option .when(withAttributes)(h2(cls := " h500" )(" Attributes" )).toList,
126
- dl(cls := " attributes" )(attributes* )
127
+ Option .when(withAttributes)(
128
+ section(id := " attributes" )(
129
+ h2(cls := " h500" )(" Attributes" ),
130
+ dl(cls := " attributes" )(attributes* )
131
+ )
132
+ ).getOrElse(
133
+ dl(cls := " attributes" )(attributes* )
134
+ )
127
135
)
128
136
)
129
137
).flatten
@@ -206,20 +214,22 @@ class MemberRenderer(signatureRenderer: SignatureRenderer)(using DocContext) ext
206
214
private def actualGroup (name : String , members : Seq [Member | MGroup ]): Seq [AppliedTag ] =
207
215
if members.isEmpty then Nil else
208
216
div(cls := " documentableList expand" )(
209
- button(cls := " icon-button show-content expand" ),
210
- h3(cls := " groupHeader h200" )(name),
211
- members.sortBy {
212
- case m : Member => m.name
213
- case MGroup (_, _, name) => name
214
- }.map {
215
- case element : Member =>
216
- member(element)
217
- case MGroup (header, members, _) =>
218
- div(
219
- header,
220
- members.map(member)
221
- )
222
- }
217
+ section(id := name.replace(' ' , '-' ))(
218
+ button(cls := " icon-button show-content expand" ),
219
+ h3(cls := " groupHeader h200" )(name),
220
+ members.sortBy {
221
+ case m : Member => m.name
222
+ case MGroup (_, _, name) => name
223
+ }.map {
224
+ case element : Member =>
225
+ member(element)
226
+ case MGroup (header, members, _) =>
227
+ div(
228
+ header,
229
+ members.map(member)
230
+ )
231
+ }
232
+ )
223
233
) :: Nil
224
234
225
235
private def isDeprecated (m : Member | MGroup ): Boolean = m match
@@ -371,7 +381,9 @@ class MemberRenderer(signatureRenderer: SignatureRenderer)(using DocContext) ext
371
381
if tabs.isEmpty then Nil else
372
382
Seq (div(cls := (if singleSelection then " tabs single" else " tabs" ))(
373
383
div(cls := " contents" )(tabs.map(t =>
374
- div(tabAttr(t.id), cls := s " tab ${t.cls}" )(t.content)
384
+ section(id := t.name.replace(' ' , '-' ))(
385
+ div(tabAttr(t.id), cls := s " tab ${t.cls}" )(t.content)
386
+ )
375
387
))
376
388
))
377
389
@@ -462,13 +474,28 @@ class MemberRenderer(signatureRenderer: SignatureRenderer)(using DocContext) ext
462
474
memberSignature(m)
463
475
)
464
476
)
465
- PageContent (
466
- div(
467
- intro,
468
- memberInfo(m, withAttributes = true ),
477
+
478
+ val memberContent = div(
479
+ intro,
480
+ memberInfo(m, withAttributes = true ),
481
+ section(id := " members-list" )(
469
482
h2(cls := " h500" )(" Members list" ),
470
483
buildDocumentableFilter,
471
484
buildMembers(m)
472
- ),
473
- Seq .empty // For now, we don't support table of contents in members
485
+ )
486
+ )
487
+
488
+ val memberDocument = Jsoup .parse(memberContent.toString)
489
+
490
+ val toc = memberDocument.select(" section[id]" ).asScala.toSeq
491
+ .flatMap { elem =>
492
+ val header = elem.selectFirst(" h1, h2, h3, h4, h5, h6" )
493
+ Option (header).map { h =>
494
+ TocEntry (h.tag().getName, h.text(), s " # ${elem.id()}" )
495
+ }
496
+ }
497
+
498
+ PageContent (
499
+ memberContent,
500
+ toc
474
501
)
0 commit comments