diff options
6 files changed, 68 insertions, 47 deletions
diff --git a/plugins/base/src/main/kotlin/renderers/DefaultRenderer.kt b/plugins/base/src/main/kotlin/renderers/DefaultRenderer.kt index a089f8f5..1684f819 100644 --- a/plugins/base/src/main/kotlin/renderers/DefaultRenderer.kt +++ b/plugins/base/src/main/kotlin/renderers/DefaultRenderer.kt @@ -23,7 +23,7 @@ abstract class DefaultRenderer<T>( protected open val preprocessors: Iterable<PageTransformer> = emptyList() - abstract fun T.buildHeader(level: Int, content: T.() -> Unit) + abstract fun T.buildHeader(level: Int, node: ContentHeader, content: T.() -> Unit) abstract fun T.buildLink(address: String, content: T.() -> Unit) abstract fun T.buildList( node: ContentList, @@ -78,7 +78,7 @@ abstract class DefaultRenderer<T>( pageContext: ContentPage, sourceSetRestriction: Set<SourceSetData>? = null ) { - buildHeader(node.level) { node.children.forEach { it.build(this, pageContext, sourceSetRestriction) } } + buildHeader(node.level, node) { node.children.forEach { it.build(this, pageContext, sourceSetRestriction) } } } open fun ContentNode.build( diff --git a/plugins/base/src/main/kotlin/renderers/html/HtmlRenderer.kt b/plugins/base/src/main/kotlin/renderers/html/HtmlRenderer.kt index 64c03bc7..388ee72f 100644 --- a/plugins/base/src/main/kotlin/renderers/html/HtmlRenderer.kt +++ b/plugins/base/src/main/kotlin/renderers/html/HtmlRenderer.kt @@ -197,29 +197,31 @@ open class HtmlRenderer( .filter { sourceSetRestriction == null || it.sourceSets.any { s -> s in sourceSetRestriction } } .takeIf { it.isNotEmpty() } ?.let { - div(classes = "table-row") { - it.filterIsInstance<ContentLink>().takeIf { it.isNotEmpty() }?.let { - div("main-subrow " + node.style.joinToString(" ")) { - it.filter { sourceSetRestriction == null || it.sourceSets.any { s -> s in sourceSetRestriction } } - .forEach { - it.build(this, pageContext, sourceSetRestriction) - if (ContentKind.shouldBePlatformTagged(node.dci.kind) && (node.sourceSets.size == 1)) - createPlatformTags(node) - } + withAnchor(node.dci.dri.first().toString()) { + div(classes = "table-row") { + it.filterIsInstance<ContentLink>().takeIf { it.isNotEmpty() }?.let { + div("main-subrow " + node.style.joinToString(" ")) { + it.filter { sourceSetRestriction == null || it.sourceSets.any { s -> s in sourceSetRestriction } } + .forEach { + it.build(this, pageContext, sourceSetRestriction) + if (ContentKind.shouldBePlatformTagged(node.dci.kind) && (node.sourceSets.size == 1)) + createPlatformTags(node) + } + } } - } - it.filter { it !is ContentLink }.takeIf { it.isNotEmpty() }?.let { - div("platform-dependent-row keyValue") { - val title = it.filter { it.style.contains(ContentStyle.RowTitle) } - div { - title.forEach { - it.build(this, pageContext, sourceSetRestriction) + it.filter { it !is ContentLink }.takeIf { it.isNotEmpty() }?.let { + div("platform-dependent-row keyValue") { + val title = it.filter { it.style.contains(ContentStyle.RowTitle) } + div { + title.forEach { + it.build(this, pageContext, sourceSetRestriction) + } } - } - div("title") { - (it - title).forEach { - it.build(this, pageContext, sourceSetRestriction) + div("title") { + (it - title).forEach { + it.build(this, pageContext, sourceSetRestriction) + } } } } @@ -255,17 +257,26 @@ open class HtmlRenderer( } - override fun FlowContent.buildHeader(level: Int, content: FlowContent.() -> Unit) { + override fun FlowContent.buildHeader(level: Int, node: ContentHeader, content: FlowContent.() -> Unit) { + val anchor = node.extra[SimpleAttr.SimpleAttrKey("anchor")]?.extraValue when (level) { - 1 -> h1(block = content) - 2 -> h2(block = content) - 3 -> h3(block = content) - 4 -> h4(block = content) - 5 -> h5(block = content) - else -> h6(block = content) + 1 -> h1() { withAnchor(anchor, content) } + 2 -> h2() { withAnchor(anchor, content) } + 3 -> h3() { withAnchor(anchor, content) } + 4 -> h4() { withAnchor(anchor, content) } + 5 -> h5() { withAnchor(anchor, content) } + else -> h6() { withAnchor(anchor, content) } } } + private fun FlowContent.withAnchor(anchorName: String?, content: FlowContent.() -> Unit) { + a { + anchorName?.let { attributes["name"] = it } + } + content() + } + + override fun FlowContent.buildNavigation(page: PageNode) = div(classes = "breadcrumbs") { locationProvider.ancestors(page).asReversed().forEach { node -> diff --git a/plugins/base/src/main/kotlin/transformers/pages/sourcelinks/SourceLinksTransformer.kt b/plugins/base/src/main/kotlin/transformers/pages/sourcelinks/SourceLinksTransformer.kt index c7b65aa9..c0b8233c 100644 --- a/plugins/base/src/main/kotlin/transformers/pages/sourcelinks/SourceLinksTransformer.kt +++ b/plugins/base/src/main/kotlin/transformers/pages/sourcelinks/SourceLinksTransformer.kt @@ -60,7 +60,7 @@ class SourceLinksTransformer(val context: DokkaContext, val builder: PageContent node.dri.first(), node.documentable!!.sourceSets.toSet() ) { - header(2) { text("Sources") } + header(2, "Sources") +ContentTable( emptyList(), sources.map { diff --git a/plugins/base/src/main/kotlin/translators/documentables/DefaultPageCreator.kt b/plugins/base/src/main/kotlin/translators/documentables/DefaultPageCreator.kt index 296b0de6..d4ee88d8 100644 --- a/plugins/base/src/main/kotlin/translators/documentables/DefaultPageCreator.kt +++ b/plugins/base/src/main/kotlin/translators/documentables/DefaultPageCreator.kt @@ -65,7 +65,7 @@ open class DefaultPageCreator( protected open fun contentForModule(m: DModule) = contentBuilder.contentFor(m) { group(kind = ContentKind.Cover) { - header(1) { text(m.name) } + header(1, m.name) } +contentForComments(m) block("Packages", 2, ContentKind.Packages, m.packages, m.sourceSets.toSet()) { @@ -77,7 +77,7 @@ open class DefaultPageCreator( protected open fun contentForPackage(p: DPackage) = contentBuilder.contentFor(p) { group(kind = ContentKind.Cover) { - header(1) { text("Package ${p.name}") } + header(1, "Package ${p.name}") } +contentForComments(p) +contentForScope(p, p.dri, p.sourceSets) @@ -108,7 +108,7 @@ open class DefaultPageCreator( s.safeAs<WithExtraProperties<Documentable>>()?.let { it.extra[InheritorsInfo] }?.let { inheritors -> val map = inheritors.value.filter { it.value.isNotEmpty() } if (map.values.any()) { - header(2) { text("Inheritors") } + header(2, "Inheritors") { } +ContentTable( emptyList(), map.entries.flatMap { entry -> entry.value.map { Pair(entry.key, it) } } @@ -130,7 +130,7 @@ open class DefaultPageCreator( protected open fun contentForEnumEntry(e: DEnumEntry) = contentBuilder.contentFor(e) { group(kind = ContentKind.Cover) { - header(1) { text(e.name) } + header(1, e.name) +buildSignature(e) } +contentForComments(e) @@ -139,8 +139,8 @@ open class DefaultPageCreator( protected open fun contentForClasslike(c: DClasslike) = contentBuilder.contentFor(c) { group(kind = ContentKind.Cover) { - header(1) { text(c.name.orEmpty()) } - sourceSetDependentHint(c.dri, c.sourceSets.toSet()) { + header(1, c.name.orEmpty()) + sourceSetDependentHint(c.dri, c.sourceSets.toSet()) { +buildSignature(c) } } @@ -215,7 +215,7 @@ open class DefaultPageCreator( val receiver = tags.withTypeUnnamed<Receiver>() val params = tags.withTypeNamed<Param>() platforms.forEach { - header(4, kind = ContentKind.Parameters, platformData = setOf(it)) { text("Parameters") } + header(4, "Parameters", kind = ContentKind.Parameters, platformData = setOf(it)) } table(kind = ContentKind.Parameters) { platforms.flatMap { platform -> @@ -245,7 +245,7 @@ open class DefaultPageCreator( if (tags.isNotEmptyForTag<See>()) { val seeAlsoTags = tags.withTypeNamed<See>() platforms.forEach { - header(4, kind = ContentKind.Comment, platformData = setOf(it)) { text("See also") } + header(4, "See also", kind = ContentKind.Comment, platformData = setOf(it)) } table(kind = ContentKind.Sample) { platforms.flatMap { platform -> @@ -270,7 +270,7 @@ open class DefaultPageCreator( val content = samples.filter { it.value.isEmpty() || platformData in it.value } if (content.isNotEmpty()) { group(sourceSets = setOf(platformData)) { - header(4, kind = ContentKind.Comment) { text("Samples") } + header(4, "Samples", kind = ContentKind.Comment) content.forEach { comment(Text(it.key)) } @@ -288,7 +288,7 @@ open class DefaultPageCreator( unnamedTags.forEach { pdTag -> pdTag[platform]?.also { tag -> group(sourceSets = setOf(platform)) { - header(4) { text(tag.toHeaderString()) } + header(4, tag.toHeaderString()) comment(tag.root) } } @@ -298,7 +298,7 @@ open class DefaultPageCreator( return contentBuilder.contentFor(d) { if (tags.isNotEmpty()) { - header(3) { text("Description") } + header(3, "Description") sourceSetDependentHint(sourceSets = platforms.toSet()) { contentForDescription() contentForSamples() @@ -323,7 +323,7 @@ open class DefaultPageCreator( protected open fun contentForFunction(f: DFunction) = contentForMember(f) protected open fun contentForTypeAlias(t: DTypeAlias) = contentForMember(t) protected open fun contentForMember(d: Documentable) = contentBuilder.contentFor(d) { - header(1) { text(d.name.orEmpty()) } + header(1, d.name.orEmpty()) divergentGroup(ContentDivergentGroup.GroupID("member")) { instance(setOf(d.dri), d.sourceSets.toSet()) { divergent(kind = ContentKind.Symbol) { @@ -342,7 +342,7 @@ open class DefaultPageCreator( kind: ContentKind ) { if (collection.any()) { - header(2) { text(name) } + header(2, name) table(kind) { collection.groupBy { it.name }.map { (elementName, elements) -> // This groupBy should probably use LocationProvider buildGroup(elements.map { it.dri }.toSet(), elements.flatMap { it.sourceSets }.toSet(), kind = kind) { diff --git a/plugins/base/src/main/kotlin/translators/documentables/PageContentBuilder.kt b/plugins/base/src/main/kotlin/translators/documentables/PageContentBuilder.kt index 9c80a9ea..658a86f2 100644 --- a/plugins/base/src/main/kotlin/translators/documentables/PageContentBuilder.kt +++ b/plugins/base/src/main/kotlin/translators/documentables/PageContentBuilder.kt @@ -85,15 +85,25 @@ open class PageContentBuilder( fun header( level: Int, + text: String, kind: Kind = ContentKind.Main, platformData: Set<SourceSetData> = mainPlatformData, styles: Set<Style> = mainStyles, extra: PropertyContainer<ContentNode> = mainExtra, - block: DocumentableContentBuilder.() -> Unit + block: DocumentableContentBuilder.() -> Unit = {} ) { contents += ContentHeader( level, - contentFor(mainDRI, platformData, kind, styles, extra, block) + contentFor( + mainDRI, + platformData, + kind, + styles, + extra + SimpleAttr("anchor", text.replace("\\s".toRegex(), "").toLowerCase()) + ){ + text(text) + block() + } ) } @@ -155,7 +165,7 @@ open class PageContentBuilder( operation: DocumentableContentBuilder.(T) -> Unit ) { if (renderWhenEmpty || elements.any()) { - header(level) { text(name) } + header(level, name) { } contents += ContentTable( emptyList(), elements.map { diff --git a/plugins/gfm/src/main/kotlin/GfmPlugin.kt b/plugins/gfm/src/main/kotlin/GfmPlugin.kt index fead66f1..cc79291c 100644 --- a/plugins/gfm/src/main/kotlin/GfmPlugin.kt +++ b/plugins/gfm/src/main/kotlin/GfmPlugin.kt @@ -50,7 +50,7 @@ open class CommonmarkRenderer( override val preprocessors = context.plugin<GfmPlugin>().query { gfmPreprocessors } - override fun StringBuilder.buildHeader(level: Int, content: StringBuilder.() -> Unit) { + override fun StringBuilder.buildHeader(level: Int, node: ContentHeader, content: StringBuilder.() -> Unit) { buildParagraph() append("#".repeat(level) + " ") content() |