1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
|
package org.jetbrains.dokka.base.renderers.html
import kotlinx.html.h1
import kotlinx.html.id
import kotlinx.html.table
import kotlinx.html.tbody
import org.jetbrains.dokka.DokkaConfiguration
import org.jetbrains.dokka.Platform
import org.jetbrains.dokka.base.DokkaBase
import org.jetbrains.dokka.base.renderers.sourceSets
import org.jetbrains.dokka.base.resolvers.local.LocationProvider
import org.jetbrains.dokka.model.DEnum
import org.jetbrains.dokka.model.DEnumEntry
import org.jetbrains.dokka.pages.*
import org.jetbrains.dokka.plugability.DokkaContext
import org.jetbrains.dokka.plugability.plugin
import org.jetbrains.dokka.plugability.querySingle
import org.jetbrains.dokka.transformers.pages.PageTransformer
object SearchPageInstaller : PageTransformer {
override fun invoke(input: RootPageNode) = input.modified(children = input.children + searchPage)
private val searchPage = RendererSpecificResourcePage(
name = "Search",
children = emptyList(),
strategy = RenderingStrategy<HtmlRenderer> {
buildHtml(it, listOf("styles/style.css", "scripts/pages.js", "scripts/search.js")) {
h1 {
id = "searchTitle"
text("Search results for ")
}
table {
tbody {
id = "searchTable"
}
}
}
})
}
object NavigationPageInstaller : PageTransformer {
override fun invoke(input: RootPageNode) = input.modified(
children = input.children + NavigationPage(
input.children.filterIsInstance<ContentPage>().single()
.let(NavigationPageInstaller::visit)
)
)
private fun visit(page: ContentPage): NavigationNode =
NavigationNode(
page.name,
page.dri.first(),
page.sourceSets(),
page.navigableChildren()
)
private fun ContentPage.navigableChildren(): List<NavigationNode> =
when {
this !is ClasslikePageNode ->
children.filterIsInstance<ContentPage>().map { visit(it) }
documentable is DEnum ->
children.filter { it is ContentPage && it.documentable is DEnumEntry }.map { visit(it as ContentPage) }
else -> emptyList()
}.sortedBy { it.name.toLowerCase() }
}
object ResourceInstaller : PageTransformer {
override fun invoke(input: RootPageNode) = input.modified(children = input.children + resourcePages)
private val resourcePages = listOf("styles", "scripts", "images").map {
RendererSpecificResourcePage(it, emptyList(), RenderingStrategy.Copy("/dokka/$it"))
}
}
object StyleAndScriptsAppender : PageTransformer {
override fun invoke(input: RootPageNode) = input.transformContentPagesTree {
it.modified(
embeddedResources = it.embeddedResources + listOf(
"styles/style.css",
"scripts/navigationLoader.js",
"scripts/platformContentHandler.js",
"scripts/sourceset_dependencies.js",
"scripts/clipboard.js",
"styles/jetbrains-mono.css"
)
)
}
}
class SourcesetDependencyAppender(val context: DokkaContext) : PageTransformer {
override fun invoke(input: RootPageNode): RootPageNode {
val dependenciesMap = context.configuration.sourceSets.map {
it.sourceSetID to it.dependentSourceSets
}.toMap()
fun createDependenciesJson(): String = "sourceset_dependencies = '{${
dependenciesMap.entries.joinToString(", ") {
"\"${it.key}\": [${it.value.joinToString(",") {
"\"$it\""
}}]"
}
}}'"
val deps = RendererSpecificResourcePage(
name = "scripts/sourceset_dependencies.js",
children = emptyList(),
strategy = RenderingStrategy.Write(createDependenciesJson())
)
return input.modified(
children = input.children + deps
)
}
}
|