aboutsummaryrefslogtreecommitdiff
path: root/plugins/base/src/main/kotlin/renderers
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/base/src/main/kotlin/renderers')
-rw-r--r--plugins/base/src/main/kotlin/renderers/html/HtmlRenderer.kt150
1 files changed, 75 insertions, 75 deletions
diff --git a/plugins/base/src/main/kotlin/renderers/html/HtmlRenderer.kt b/plugins/base/src/main/kotlin/renderers/html/HtmlRenderer.kt
index 26560e4f..8ae4628f 100644
--- a/plugins/base/src/main/kotlin/renderers/html/HtmlRenderer.kt
+++ b/plugins/base/src/main/kotlin/renderers/html/HtmlRenderer.kt
@@ -6,10 +6,8 @@ import org.jetbrains.dokka.DokkaSourceSetID
import org.jetbrains.dokka.base.DokkaBase
import org.jetbrains.dokka.base.DokkaBaseConfiguration
import org.jetbrains.dokka.base.DokkaBaseConfiguration.Companion.defaultFooterMessage
-import org.jetbrains.dokka.base.renderers.DefaultRenderer
-import org.jetbrains.dokka.base.renderers.TabSortingStrategy
+import org.jetbrains.dokka.base.renderers.*
import org.jetbrains.dokka.base.renderers.html.command.consumers.ImmediateResolutionTagConsumer
-import org.jetbrains.dokka.base.renderers.isImage
import org.jetbrains.dokka.base.renderers.pageId
import org.jetbrains.dokka.base.resolvers.anchors.SymbolAnchorHint
import org.jetbrains.dokka.base.resolvers.local.DokkaBaseLocationProvider
@@ -23,6 +21,7 @@ import org.jetbrains.dokka.pages.*
import org.jetbrains.dokka.pages.HtmlContent
import org.jetbrains.dokka.plugability.*
import org.jetbrains.dokka.utilities.htmlEscape
+import org.jetbrains.kotlin.utils.addIfNotNull
import java.net.URI
open class HtmlRenderer(
@@ -169,13 +168,13 @@ open class HtmlRenderer(
nodes: Map<DisplaySourceSet, Collection<ContentNode>>,
pageContext: ContentPage,
extra: PropertyContainer<ContentNode> = PropertyContainer.empty(),
- styles: Set<Style> = emptySet()
+ styles: Set<Style> = emptySet(),
+ shouldHaveTabs: Boolean = true
) {
val contents = contentsForSourceSetDependent(nodes, pageContext)
- val shouldHaveTabs = contents.size != 1
- val styles = "platform-hinted ${styles.joinToString()}" + if (shouldHaveTabs) " with-platform-tabs" else ""
- div(styles) {
+ val divStyles = "platform-hinted ${styles.joinToString()}" + if (shouldHaveTabs) " with-platform-tabs" else ""
+ div(divStyles) {
attributes["data-platform-hinted"] = "data-platform-hinted"
extra.extraHtmlAttributes().forEach { attributes[it.extraKey] = it.extraValue }
if (shouldHaveTabs) {
@@ -228,68 +227,63 @@ open class HtmlRenderer(
}
override fun FlowContent.buildDivergent(node: ContentDivergentGroup, pageContext: ContentPage) {
-
- val distinct =
- node.groupDivergentInstances(pageContext,
- beforeTransformer = { instance, _, sourceSet ->
- createHTML(prettyPrint = false).prepareForTemplates().div {
- instance.before?.let { before ->
- buildContentNode(before, pageContext, sourceSet)
- }
- }.stripDiv()
- },
- afterTransformer = { instance, _, sourceSet ->
- createHTML(prettyPrint = false).prepareForTemplates().div {
- instance.after?.let { after ->
- buildContentNode(after, pageContext, sourceSet)
- }
- }.stripDiv()
- })
-
- distinct.forEach { distinctInstances ->
- val groupedDivergent = distinctInstances.value.groupBy { it.second }
-
- consumer.onTagContentUnsafe {
- +createHTML().prepareForTemplates().div("divergent-group") {
- attributes["data-filterable-current"] = groupedDivergent.keys.joinToString(" ") {
- it.sourceSetIDs.merged.toString()
- }
- attributes["data-filterable-set"] = groupedDivergent.keys.joinToString(" ") {
- it.sourceSetIDs.merged.toString()
- }
-
- val divergentForPlatformDependent = groupedDivergent.map { (sourceSet, elements) ->
- sourceSet to elements.map { e -> e.first.divergent }
- }.toMap()
-
- val content = contentsForSourceSetDependent(divergentForPlatformDependent, pageContext)
-
- consumer.onTagContentUnsafe {
- +createHTML().prepareForTemplates().div("with-platform-tags") {
- consumer.onTagContentUnsafe { +distinctInstances.key.first }
-
- consumer.onTagContentUnsafe {
- +createHTML().prepareForTemplates().span("pull-right") {
- if ((distinct.size > 1 && groupedDivergent.size == 1) || groupedDivergent.size == 1 || content.size == 1) {
- if (node.sourceSets.size != 1) {
- createPlatformTags(node, setOf(content.first().first))
- }
- }
+ fun groupDivergentInstancesWithSourceSet(
+ instances: List<ContentDivergentInstance>,
+ sourceSet: DisplaySourceSet,
+ pageContext: ContentPage,
+ beforeTransformer: (ContentDivergentInstance, ContentPage, DisplaySourceSet) -> String,
+ afterTransformer: (ContentDivergentInstance, ContentPage, DisplaySourceSet) -> String
+ ): Map<SerializedBeforeAndAfter, List<ContentDivergentInstance>> =
+ instances.map { instance ->
+ instance to Pair(
+ beforeTransformer(instance, pageContext, sourceSet),
+ afterTransformer(instance, pageContext, sourceSet)
+ )
+ }.groupBy(
+ Pair<ContentDivergentInstance, SerializedBeforeAndAfter>::second,
+ Pair<ContentDivergentInstance, SerializedBeforeAndAfter>::first
+ )
+
+ if (node.implicitlySourceSetHinted) {
+ val groupedInstancesBySourceSet = node.children.flatMap { instance ->
+ instance.sourceSets.map { sourceSet -> instance to sourceSet }
+ }.groupBy(
+ Pair<ContentDivergentInstance, DisplaySourceSet>::second,
+ Pair<ContentDivergentInstance, DisplaySourceSet>::first
+ )
+
+ val nodes = groupedInstancesBySourceSet.mapValues {
+ val distinct =
+ groupDivergentInstancesWithSourceSet(it.value, it.key, pageContext,
+ beforeTransformer = { instance, _, sourceSet ->
+ createHTML(prettyPrint = false).prepareForTemplates().div {
+ instance.before?.let { before ->
+ buildContentNode(before, pageContext, sourceSet)
}
- }
- }
- }
- div {
- if (node.implicitlySourceSetHinted) {
- buildPlatformDependent(divergentForPlatformDependent, pageContext)
- } else {
- distinctInstances.value.forEach {
- buildContentNode(it.first.divergent, pageContext, setOf(it.second))
- }
- }
- }
- consumer.onTagContentUnsafe { +distinctInstances.key.second }
+ }.stripDiv()
+ },
+ afterTransformer = { instance, _, sourceSet ->
+ createHTML(prettyPrint = false).prepareForTemplates().div {
+ instance.after?.let { after ->
+ buildContentNode(after, pageContext, sourceSet)
+ }
+ }.stripDiv()
+ })
+ val contentOfSourceSet = mutableListOf<ContentNode>()
+ distinct.onEachIndexed{ i, (_, distinctInstances) ->
+ contentOfSourceSet.addIfNotNull(distinctInstances.firstOrNull()?.before)
+ contentOfSourceSet.addAll(distinctInstances.map { it.divergent })
+ contentOfSourceSet.addIfNotNull(
+ distinctInstances.firstOrNull()?.after
+ ?: if (i != distinct.size - 1) ContentBreakLine(it.key) else null
+ )
}
+ contentOfSourceSet
+ }
+ buildPlatformDependent(nodes, pageContext)
+ } else {
+ node.children.forEach {
+ buildContentNode(it.divergent, pageContext, it.sourceSets)
}
}
}
@@ -416,9 +410,6 @@ open class HtmlRenderer(
div {
toRender.filter { it !is ContentLink && !it.hasStyle(ContentStyle.RowTitle) }
.takeIf { it.isNotEmpty() }?.let {
- if (ContentKind.shouldBePlatformTagged(contextNode.dci.kind) && contextNode.sourceSets.size == 1)
- createPlatformTags(contextNode)
-
div("title") {
it.forEach {
it.build(this, pageContext, sourceSetRestriction)
@@ -678,7 +669,7 @@ open class HtmlRenderer(
- it is useless
- it overflows with playground's run button
*/
- if(!code.style.contains(ContentStyle.RunnableSample)) copyButton()
+ if (!code.style.contains(ContentStyle.RunnableSample)) copyButton()
}
}
@@ -758,13 +749,17 @@ open class HtmlRenderer(
script { unsafe { +"""var pathToRoot = "###";""" } }
}
// This script doesn't need to be there but it is nice to have since app in dark mode doesn't 'blink' (class is added before it is rendered)
- script { unsafe { +"""
+ script {
+ unsafe {
+ +"""
const storage = localStorage.getItem("dokka-dark-mode")
const savedDarkMode = storage ? JSON.parse(storage) : false
if(savedDarkMode === true){
document.getElementsByTagName("html")[0].classList.add("theme-dark")
}
- """.trimIndent() } }
+ """.trimIndent()
+ }
+ }
resources.forEach {
when {
it.substringBefore('?').substringAfterLast('.') == "css" ->
@@ -840,7 +835,7 @@ open class HtmlRenderer(
content()
div(classes = "footer") {
span("go-to-top-icon") {
- a(href = "#content"){
+ a(href = "#content") {
id = "go-to-top-link"
}
}
@@ -872,7 +867,12 @@ open class HtmlRenderer(
templateCommand(PathToRootSubstitutionCommand(pattern = "###", default = pathToRoot)) {
a {
href = "###index.html"
- templateCommand(ProjectNameSubstitutionCommand(pattern = "@@@", default = context.configuration.moduleName)) {
+ templateCommand(
+ ProjectNameSubstitutionCommand(
+ pattern = "@@@",
+ default = context.configuration.moduleName
+ )
+ ) {
span {
text("@@@")
}