aboutsummaryrefslogtreecommitdiff
path: root/plugins/javadoc/src
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/javadoc/src')
-rw-r--r--plugins/javadoc/src/main/kotlin/javadoc/JavadocDocumentableToPageTranslator.kt18
-rw-r--r--plugins/javadoc/src/main/kotlin/javadoc/JavadocLocationProvider.kt103
-rw-r--r--plugins/javadoc/src/main/kotlin/javadoc/JavadocPageCreator.kt92
-rw-r--r--plugins/javadoc/src/main/kotlin/javadoc/JavadocPlugin.kt29
-rw-r--r--plugins/javadoc/src/main/kotlin/javadoc/JavadocRenderer.kt28
-rw-r--r--plugins/javadoc/src/main/kotlin/javadoc/KorteJavadocRenderer.kt193
-rw-r--r--plugins/javadoc/src/main/kotlin/javadoc/pages/JavadocContentNodes.kt163
-rw-r--r--plugins/javadoc/src/main/kotlin/javadoc/pages/JavadocPageNodes.kt328
-rw-r--r--plugins/javadoc/src/main/kotlin/javadoc/pages/OverviewSummary.kt161
-rw-r--r--plugins/javadoc/src/main/kotlin/javadoc/pages/htmlGeneration.kt391
-rw-r--r--plugins/javadoc/src/main/kotlin/javadoc/pages/htmlPreprocessors.kt63
-rw-r--r--plugins/javadoc/src/main/kotlin/javadoc/pages/pages.kt17
-rw-r--r--plugins/javadoc/src/main/resources/META-INF/services/org.jetbrains.dokka.plugability.DokkaPlugin1
-rw-r--r--plugins/javadoc/src/main/resources/static_res/jquery/external/jquery/jquery.js10364
-rw-r--r--plugins/javadoc/src/main/resources/static_res/jquery/images/ui-bg_glass_55_fbf9ee_1x400.pngbin0 -> 335 bytes
-rw-r--r--plugins/javadoc/src/main/resources/static_res/jquery/images/ui-bg_glass_65_dadada_1x400.pngbin0 -> 262 bytes
-rw-r--r--plugins/javadoc/src/main/resources/static_res/jquery/images/ui-bg_glass_75_dadada_1x400.pngbin0 -> 262 bytes
-rw-r--r--plugins/javadoc/src/main/resources/static_res/jquery/images/ui-bg_glass_75_e6e6e6_1x400.pngbin0 -> 262 bytes
-rw-r--r--plugins/javadoc/src/main/resources/static_res/jquery/images/ui-bg_glass_95_fef1ec_1x400.pngbin0 -> 332 bytes
-rw-r--r--plugins/javadoc/src/main/resources/static_res/jquery/images/ui-bg_highlight-soft_75_cccccc_1x100.pngbin0 -> 280 bytes
-rw-r--r--plugins/javadoc/src/main/resources/static_res/jquery/images/ui-icons_222222_256x240.pngbin0 -> 6922 bytes
-rw-r--r--plugins/javadoc/src/main/resources/static_res/jquery/images/ui-icons_2e83ff_256x240.pngbin0 -> 4549 bytes
-rw-r--r--plugins/javadoc/src/main/resources/static_res/jquery/images/ui-icons_454545_256x240.pngbin0 -> 6992 bytes
-rw-r--r--plugins/javadoc/src/main/resources/static_res/jquery/images/ui-icons_888888_256x240.pngbin0 -> 6999 bytes
-rw-r--r--plugins/javadoc/src/main/resources/static_res/jquery/images/ui-icons_cd0a0a_256x240.pngbin0 -> 4549 bytes
-rw-r--r--plugins/javadoc/src/main/resources/static_res/jquery/jquery-3.3.1.js10364
-rw-r--r--plugins/javadoc/src/main/resources/static_res/jquery/jquery-migrate-3.0.1.js628
-rw-r--r--plugins/javadoc/src/main/resources/static_res/jquery/jquery-ui.css582
-rw-r--r--plugins/javadoc/src/main/resources/static_res/jquery/jquery-ui.js2659
-rw-r--r--plugins/javadoc/src/main/resources/static_res/jquery/jquery-ui.min.css7
-rw-r--r--plugins/javadoc/src/main/resources/static_res/jquery/jquery-ui.min.js6
-rw-r--r--plugins/javadoc/src/main/resources/static_res/jquery/jquery-ui.structure.css156
-rw-r--r--plugins/javadoc/src/main/resources/static_res/jquery/jquery-ui.structure.min.css5
-rw-r--r--plugins/javadoc/src/main/resources/static_res/jquery/jszip-utils/dist/jszip-utils-ie.js56
-rw-r--r--plugins/javadoc/src/main/resources/static_res/jquery/jszip-utils/dist/jszip-utils-ie.min.js10
-rw-r--r--plugins/javadoc/src/main/resources/static_res/jquery/jszip-utils/dist/jszip-utils.js118
-rw-r--r--plugins/javadoc/src/main/resources/static_res/jquery/jszip-utils/dist/jszip-utils.min.js10
-rw-r--r--plugins/javadoc/src/main/resources/static_res/jquery/jszip/dist/jszip.js11623
-rw-r--r--plugins/javadoc/src/main/resources/static_res/jquery/jszip/dist/jszip.min.js15
-rw-r--r--plugins/javadoc/src/main/resources/static_res/package-search-index.js1
-rw-r--r--plugins/javadoc/src/main/resources/static_res/resources/glass.pngbin0 -> 499 bytes
-rw-r--r--plugins/javadoc/src/main/resources/static_res/resources/x.pngbin0 -> 394 bytes
-rw-r--r--plugins/javadoc/src/main/resources/static_res/stylesheet.css906
-rw-r--r--plugins/javadoc/src/main/resources/views/class.korte2
-rw-r--r--plugins/javadoc/src/main/resources/views/components/base.korte27
-rw-r--r--plugins/javadoc/src/main/resources/views/components/bottomNavbar.korte20
-rw-r--r--plugins/javadoc/src/main/resources/views/components/head.korte19
-rw-r--r--plugins/javadoc/src/main/resources/views/components/indexPage.korte10
-rw-r--r--plugins/javadoc/src/main/resources/views/components/indexTable.korte12
-rw-r--r--plugins/javadoc/src/main/resources/views/components/navList.korte25
-rw-r--r--plugins/javadoc/src/main/resources/views/components/pageStart.korte38
-rw-r--r--plugins/javadoc/src/main/resources/views/components/subNav.korte30
-rw-r--r--plugins/javadoc/src/main/resources/views/components/topNavbar.korte24
-rw-r--r--plugins/javadoc/src/main/resources/views/listPage.korte13
-rw-r--r--plugins/javadoc/src/main/resources/views/tabPage.korte4
-rw-r--r--plugins/javadoc/src/main/resources/views/treePage.korte48
-rw-r--r--plugins/javadoc/src/test/kotlin/javadoc/JavadocTest.kt70
-rw-r--r--plugins/javadoc/src/test/resources/javadoc/test/main/java/adaptation/Adaptation.kt50
58 files changed, 39489 insertions, 0 deletions
diff --git a/plugins/javadoc/src/main/kotlin/javadoc/JavadocDocumentableToPageTranslator.kt b/plugins/javadoc/src/main/kotlin/javadoc/JavadocDocumentableToPageTranslator.kt
new file mode 100644
index 00000000..840bdc55
--- /dev/null
+++ b/plugins/javadoc/src/main/kotlin/javadoc/JavadocDocumentableToPageTranslator.kt
@@ -0,0 +1,18 @@
+package javadoc
+
+import org.jetbrains.dokka.base.signatures.SignatureProvider
+import org.jetbrains.dokka.base.transformers.pages.comments.CommentsToContentConverter
+import org.jetbrains.dokka.model.DModule
+import org.jetbrains.dokka.pages.ModulePageNode
+import org.jetbrains.dokka.pages.RootPageNode
+import org.jetbrains.dokka.transformers.documentation.DocumentableToPageTranslator
+import org.jetbrains.dokka.utilities.DokkaLogger
+
+class JavadocDocumentableToPageTranslator(
+ private val commentsToContentConverter: CommentsToContentConverter,
+ private val signatureProvider: SignatureProvider,
+ private val logger: DokkaLogger
+) : DocumentableToPageTranslator {
+ override fun invoke(module: DModule): RootPageNode =
+ JavadocPageCreator(commentsToContentConverter, signatureProvider, logger).pageForModule(module)
+} \ No newline at end of file
diff --git a/plugins/javadoc/src/main/kotlin/javadoc/JavadocLocationProvider.kt b/plugins/javadoc/src/main/kotlin/javadoc/JavadocLocationProvider.kt
new file mode 100644
index 00000000..520486f6
--- /dev/null
+++ b/plugins/javadoc/src/main/kotlin/javadoc/JavadocLocationProvider.kt
@@ -0,0 +1,103 @@
+package javadoc
+
+import javadoc.pages.*
+import org.jetbrains.dokka.Platform
+import org.jetbrains.dokka.base.DokkaBase
+import org.jetbrains.dokka.base.resolvers.local.LocationProvider
+import org.jetbrains.dokka.links.DRI
+import org.jetbrains.dokka.model.SourceSetData
+import org.jetbrains.dokka.pages.ContentPage
+import org.jetbrains.dokka.pages.PageNode
+import org.jetbrains.dokka.pages.RootPageNode
+import org.jetbrains.dokka.plugability.DokkaContext
+import org.jetbrains.dokka.plugability.plugin
+import org.jetbrains.dokka.plugability.query
+import java.nio.file.Paths
+import java.util.*
+
+class JavadocLocationProvider(pageRoot: RootPageNode, private val context: DokkaContext) : LocationProvider {
+ private val externalLocationProviderFactories =
+ context.plugin<DokkaBase>().query { externalLocationProviderFactory }
+ private val externalLocationProvider =
+ externalLocationProviderFactories.asSequence().map { it.getExternalLocationProvider("javadoc10") }
+ .filterNotNull().take(1).firstOrNull()
+ private val externalDocumentationLinks by lazy {
+ context.configuration.passesConfigurations
+ .filter { passConfig -> passConfig.analysisPlatform == Platform.jvm }
+ .flatMap { it.externalDocumentationLinks }
+ .distinct()
+ }
+
+ private val pathIndex = IdentityHashMap<PageNode, List<String>>().apply {
+ fun registerPath(page: PageNode, prefix: List<String> = emptyList()) {
+ val newPrefix = prefix + page.takeIf { it is JavadocPackagePageNode }?.name.orEmpty()
+ val path = (prefix + when (page) {
+ is AllClassesPage -> listOf("allclasses")
+ is TreeViewPage -> if (page.classes == null)
+ listOf("overview-tree")
+ else
+ listOf("package-tree")
+ is ContentPage -> if (page.dri.isNotEmpty() && page.dri.first().classNames != null)
+ listOfNotNull(page.dri.first().classNames)
+ else if (page is JavadocPackagePageNode)
+ listOf(page.name, "package-summary")
+ else
+ listOf("index")
+ else -> emptyList()
+ }).filterNot { it.isEmpty() }
+
+ put(page, path)
+ page.children.forEach { registerPath(it, newPrefix) }
+
+ }
+ put(pageRoot, listOf("index"))
+ pageRoot.children.forEach { registerPath(it) }
+ }
+
+ private val nodeIndex = IdentityHashMap<DRI, PageNode>().apply {
+ fun registerNode(node: PageNode) {
+ if (node is ContentPage) put(node.dri.first(), node)
+
+ node.children.forEach(::registerNode)
+ }
+ registerNode(pageRoot)
+ }
+
+ private operator fun IdentityHashMap<PageNode, List<String>>.get(dri: DRI) = this[nodeIndex[dri]]
+
+ override fun resolve(dri: DRI, sourceSets: List<SourceSetData>, context: PageNode?): String =
+ context?.let { resolve(it, skipExtension = false) } ?: nodeIndex[dri]?.let {
+ resolve(it, skipExtension = true)
+ } ?: with(externalLocationProvider!!) {
+ dri.toLocation()
+ }
+
+ override fun resolve(node: PageNode, context: PageNode?, skipExtension: Boolean): String =
+ pathIndex[node]?.joinToString("/")?.let {
+ if (skipExtension) it.removeSuffix(".html") else it
+ } ?: run {
+ throw IllegalStateException("Path for ${node::class.java.canonicalName}:${node.name} not found")
+ }
+
+ fun resolve(link: LinkJavadocListEntry, dir: String = "", skipExtension: Boolean = true) = pathIndex[link.dri.first()]?.let {
+ when (link.kind) {
+ JavadocContentKind.Class -> it
+ JavadocContentKind.OverviewSummary -> it.dropLast(1) + "index"
+ JavadocContentKind.PackageSummary -> it.dropLast(1) + "package-summary"
+ JavadocContentKind.AllClasses -> it.dropLast(1) + "allclasses"
+ JavadocContentKind.OverviewTree -> it.dropLast(1) + "overview-tree"
+ JavadocContentKind.PackageTree -> it.dropLast(1) + "package-tree"
+ else -> it
+ }
+ }?.joinToString("/")?.let {if (skipExtension) "$it.html" else it}?.let {
+ Paths.get(dir).relativize(Paths.get(it)).toString()
+ } ?: run {throw IllegalStateException("Page for ${link.name} not found")}
+
+ override fun resolveRoot(node: PageNode): String {
+ TODO("Not yet implemented")
+ }
+
+ override fun ancestors(node: PageNode): List<PageNode> {
+ TODO("Not yet implemented")
+ }
+} \ No newline at end of file
diff --git a/plugins/javadoc/src/main/kotlin/javadoc/JavadocPageCreator.kt b/plugins/javadoc/src/main/kotlin/javadoc/JavadocPageCreator.kt
new file mode 100644
index 00000000..f5ca4bb3
--- /dev/null
+++ b/plugins/javadoc/src/main/kotlin/javadoc/JavadocPageCreator.kt
@@ -0,0 +1,92 @@
+package javadoc
+
+import javadoc.pages.*
+import org.jetbrains.dokka.Platform
+import org.jetbrains.dokka.base.signatures.SignatureProvider
+import org.jetbrains.dokka.base.transformers.pages.comments.CommentsToContentConverter
+import org.jetbrains.dokka.model.*
+import org.jetbrains.dokka.pages.ContentKind
+import org.jetbrains.dokka.utilities.DokkaLogger
+
+open class JavadocPageCreator(
+ commentsToContentConverter: CommentsToContentConverter,
+ signatureProvider: SignatureProvider,
+ val logger: DokkaLogger
+) {
+ fun pageForModule(m: DModule): JavadocModulePageNode =
+ JavadocModulePageNode(
+ m.name.ifEmpty { "root" },
+ contentForModule(m),
+ m.packages.map { pageForPackage(it) },
+ setOf(m.dri)
+ )
+
+ fun pageForPackage(p: DPackage) =
+ JavadocPackagePageNode(p.name, contentForPackage(p), setOf(p.dri), p,
+ p.classlikes.map { pageForClasslike(it) } // TODO: nested classlikes
+ ).also {
+ it
+ }
+
+ fun pageForClasslike(c: DClasslike): JavadocClasslikePageNode {
+ val constructors = when (c) {
+ is DClass -> c.constructors
+ is DEnum -> c.constructors
+ else -> emptyList()
+ }
+
+ return JavadocClasslikePageNode(c.name.orEmpty(), contentForClasslike(c), setOf(c.dri), c, emptyList())
+ }
+
+ fun contentForModule(m: DModule): JavadocContentNode =
+ JavadocContentGroup(
+ setOf(m.dri),
+ JavadocContentKind.OverviewSummary,
+ m.sourceSets.filter { it.platform == Platform.jvm }.toSet()
+ ) {
+ title(m.name, "0.0.1", dri = setOf(m.dri), kind = ContentKind.Main)
+ list("Packages", "Package", setOf(m.dri), ContentKind.Packages, m.packages.map { p ->
+ val doc = p.documentation.entries.find { (k, _) -> k.platform == Platform.jvm }?.value?.let {
+ it.children.joinToString("\n") { it.root.toString() }
+ }.orEmpty()
+ RowJavadocListEntry(
+ LinkJavadocListEntry(p.name, setOf(p.dri), JavadocContentKind.PackageSummary, sourceSets),
+ doc
+ )
+ })
+ }
+
+ fun contentForPackage(p: DPackage): JavadocContentNode =
+ JavadocContentGroup(
+ setOf(p.dri),
+ JavadocContentKind.PackageSummary,
+ p.sourceSets.filter { it.platform == Platform.jvm }.toSet()
+ ) {
+ title(p.name, "0.0.1", dri = setOf(p.dri), kind = ContentKind.Packages)
+ list("Packages", "Package", setOf(p.dri), ContentKind.Packages, p.classlikes.map { c ->
+ val doc = c.documentation.entries.find { (k, _) -> k.platform == Platform.jvm }?.value?.let {
+ it.children.joinToString("\n") { it.root.toString() }
+ }.orEmpty()
+ RowJavadocListEntry(
+ LinkJavadocListEntry(c.name.orEmpty(), setOf(c.dri), JavadocContentKind.Class, sourceSets),
+ doc
+ )
+ })
+ }
+
+ fun contentForClasslike(c: DClasslike): JavadocContentNode =
+ JavadocContentGroup(
+ setOf(c.dri),
+ JavadocContentKind.Class,
+ c.sourceSets.filter { it.platform == Platform.jvm }.toSet()
+ ) {
+ title(
+ c.name.orEmpty(),
+ "0.0.1",
+ parent = c.dri.packageName,
+ dri = setOf(c.dri),
+ kind = JavadocContentKind.Class
+ )
+ }
+}
+
diff --git a/plugins/javadoc/src/main/kotlin/javadoc/JavadocPlugin.kt b/plugins/javadoc/src/main/kotlin/javadoc/JavadocPlugin.kt
new file mode 100644
index 00000000..f58faa49
--- /dev/null
+++ b/plugins/javadoc/src/main/kotlin/javadoc/JavadocPlugin.kt
@@ -0,0 +1,29 @@
+package org.jetbrains.dokka.javadoc
+
+import javadoc.JavadocDocumentableToPageTranslator
+import javadoc.KorteJavadocRenderer
+import org.jetbrains.dokka.CoreExtensions
+import org.jetbrains.dokka.base.DokkaBase
+import org.jetbrains.dokka.plugability.DokkaPlugin
+import org.jetbrains.dokka.plugability.querySingle
+
+class JavadocPlugin : DokkaPlugin() {
+ val dokkaJavadocPlugin by extending {
+ val dokkaBasePlugin = plugin<DokkaBase>()
+ CoreExtensions.renderer providing { ctx ->
+ KorteJavadocRenderer(dokkaBasePlugin.querySingle { outputWriter }, ctx, "views")
+ } applyIf { format == "javadoc" }
+ }
+
+ val pageTranslator by extending {
+ val dokkaBasePlugin = plugin<DokkaBase>()
+ CoreExtensions.documentableToPageTranslator providing { ctx ->
+ JavadocDocumentableToPageTranslator(
+ dokkaBasePlugin.querySingle { commentsToContentConverter },
+ dokkaBasePlugin.querySingle { signatureProvider },
+ ctx.logger
+ )
+ }
+ }
+}
+
diff --git a/plugins/javadoc/src/main/kotlin/javadoc/JavadocRenderer.kt b/plugins/javadoc/src/main/kotlin/javadoc/JavadocRenderer.kt
new file mode 100644
index 00000000..588d89ba
--- /dev/null
+++ b/plugins/javadoc/src/main/kotlin/javadoc/JavadocRenderer.kt
@@ -0,0 +1,28 @@
+package org.jetbrains.dokka.javadoc
+
+//class JavadocRenderer(val outputWriter: OutputWriter, val context: DokkaContext) : Renderer {
+// override fun render(root: RootPageNode) {
+// val rootIndex = (root as RootIndexPage)
+// val instructions = (rootIndex.strategy as RenderingStrategy.Callback).instructions
+// outputWriter.writeHtml("index", instructions(this, rootIndex)) // TODO get version
+// rootIndex.children.forEach { renderPages(it) }
+// }
+//
+// private fun renderPages(node: PageNode, dir: String = "") {
+// val path = if (node is JavadocPageNode) node.fullPath else "$dir/${node.name}"
+// if (node is RendererSpecificPage) {
+// when (val strategy = node.strategy) {
+// is RenderingStrategy.Copy -> outputWriter.writeResources(strategy.from, "")
+// is RenderingStrategy.Write -> outputWriter.writeHtml(path, strategy.text)
+// is RenderingStrategy.Callback -> outputWriter.writeHtml(path, strategy.instructions(this, node))
+// RenderingStrategy.DoNothing -> Unit
+// }
+// }
+//// else
+//// throw IllegalStateException("${node.name} was not expected here")
+//
+// node.children.forEach { renderPages(it, path) }
+// }
+//
+// private fun OutputWriter.writeHtml(path: String, text: String) = write(path, text, ".html")
+//} \ No newline at end of file
diff --git a/plugins/javadoc/src/main/kotlin/javadoc/KorteJavadocRenderer.kt b/plugins/javadoc/src/main/kotlin/javadoc/KorteJavadocRenderer.kt
new file mode 100644
index 00000000..ad83968e
--- /dev/null
+++ b/plugins/javadoc/src/main/kotlin/javadoc/KorteJavadocRenderer.kt
@@ -0,0 +1,193 @@
+package javadoc
+
+import com.soywiz.korte.*
+import javadoc.pages.*
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.runBlocking
+import org.jetbrains.dokka.base.renderers.OutputWriter
+import org.jetbrains.dokka.links.DRI
+import org.jetbrains.dokka.pages.PageNode
+import org.jetbrains.dokka.pages.RendererSpecificPage
+import org.jetbrains.dokka.pages.RenderingStrategy
+import org.jetbrains.dokka.pages.RootPageNode
+import org.jetbrains.dokka.plugability.DokkaContext
+import org.jetbrains.dokka.renderers.Renderer
+import java.nio.file.Path
+import java.nio.file.Paths
+import java.time.LocalDate
+
+class KorteJavadocRenderer(val outputWriter: OutputWriter, val context: DokkaContext, val resourceDir: String) :
+ Renderer {
+ private lateinit var locationProvider: JavadocLocationProvider
+
+ override fun render(root: RootPageNode) = root.let { preprocessors.fold(root) { r, t -> t.invoke(r) } }.let { r ->
+ locationProvider = JavadocLocationProvider(r, context)
+ runBlocking(Dispatchers.IO) {
+ renderModulePageNode(r as JavadocModulePageNode)
+ }
+ }
+
+ private fun templateForNode(node: JavadocPageNode) = when (node) {
+ is JavadocClasslikePageNode -> "class.korte"
+ is JavadocPackagePageNode -> "tabPage.korte"
+ is JavadocModulePageNode -> "tabPage.korte"
+ is AllClassesPage -> "listPage.korte"
+ is TreeViewPage -> "treePage.korte"
+ else -> ""
+ }
+
+ private fun CoroutineScope.renderNode(node: PageNode, path: String = "") {
+ if (node is JavadocPageNode) {
+ renderJavadocNode(node)
+ } else if (node is RendererSpecificPage) {
+ renderSpecificPage(node, path)
+ }
+ }
+
+ private fun CoroutineScope.renderModulePageNode(node: JavadocModulePageNode) {
+ val link = "."
+ val name = "index"
+ val pathToRoot = ""
+
+ val contentMap = mapOf(
+ "docName" to "docName", // todo docname
+ "pathToRoot" to pathToRoot
+ ) + node.contentMap
+ writeFromTemplate(outputWriter, "$link/$name".toNormalized(), "tabPage.korte", contentMap.toList())
+ node.children.forEach { renderNode(it, link) }
+ }
+
+ private fun CoroutineScope.renderJavadocNode(node: JavadocPageNode) {
+ val link = locationProvider.resolve(node, skipExtension = true)
+ val dir = Paths.get(link).parent?.let { it.toNormalized() }.orEmpty()
+ val pathToRoot = dir.split("/").joinToString("/") { ".." }.let {
+ if (it.isNotEmpty()) "$it/" else it
+ }
+
+ val contentMap = mapOf(
+ "docName" to "docName", // todo docname
+ "pathToRoot" to pathToRoot,
+ "dir" to dir
+ ) + node.contentMap
+// DokkaConsoleLogger.info("${node::class.java.canonicalName}::${node.name} - $link")
+ writeFromTemplate(outputWriter, link, templateForNode(node), contentMap.toList())
+ node.children.forEach { renderNode(it, link.toNormalized()) }
+ }
+
+ fun CoroutineScope.renderSpecificPage(node: RendererSpecificPage, path: String) = launch {
+ when (val strategy = node.strategy) {
+ is RenderingStrategy.Copy -> outputWriter.writeResources(strategy.from, "")
+ is RenderingStrategy.Write -> outputWriter.writeHtml(path, strategy.text)
+ is RenderingStrategy.Callback -> outputWriter.writeResources(
+ path,
+ strategy.instructions(this@KorteJavadocRenderer, node)
+ )
+ RenderingStrategy.DoNothing -> Unit
+ }
+ }
+
+ fun Pair<String, String>.pairToTag() = "\n<th class=\"colFirst\" scope=\"row\">${first}</th>\n<td class=\"colLast\">${second}</td>"
+
+ fun LinkJavadocListEntry.toLinkTag(parent: String? = null) =
+ createLinkTag(locationProvider.resolve(dri.first(), sourceSets.toList()).let {
+ if (parent != null) it.relativizePath(parent)
+ else it
+ }, name)
+
+ fun DRI.toLink(context: PageNode? = null) = locationProvider.resolve(this, emptyList(), context)
+
+ fun createLinkTag(address: String, name: String) =
+ address.let { if (it.endsWith(".html")) it else "$it.html" }.let {
+ """<a href="$it">$name</a>"""
+ }
+
+ private fun String.parent() = Paths.get(this).parent.toNormalized()
+ private fun Path.toNormalized() = this.normalize().toFile().toString()
+ private fun String.toNormalized() = Paths.get(this).toNormalized()
+ private fun String.relativizePath(parent: String) = Paths.get(parent).relativize(Paths.get(this)).toNormalized()
+
+ private suspend fun OutputWriter.writeHtml(path: String, text: String) = write(path, text, ".html")
+ private fun CoroutineScope.writeFromTemplate(
+ writer: OutputWriter,
+ path: String,
+ template: String,
+ args: List<Pair<String, *>>
+ ) =
+ launch {
+ val tmp = templateRenderer.render(template, *(args.toTypedArray()))
+ writer.writeHtml(
+ path,
+ tmp
+ )
+ }
+
+ fun getTemplateConfig() = TemplateConfig().also { config ->
+ listOf(
+ TeFunction("curDate") { LocalDate.now() },
+ TeFunction("jQueryVersion") { "3.1" },
+ TeFunction("jQueryMigrateVersion") { "1.2.1" },
+ TeFunction("rowColor") { args -> if ((args.first() as Int) % 2 == 0) "altColor" else "rowColor" },
+ TeFunction("h1Title") { args -> if ((args.first() as? String) == "package") "title=\"Package\" " else "" },
+ TeFunction("createTabRow") { args ->
+ val (link, doc) = args.first() as RowJavadocListEntry
+ val dir = args[1] as String?
+ (createLinkTag(locationProvider.resolve(link, dir.orEmpty()), link.name) to doc).pairToTag().trim()
+ },
+ TeFunction("createListRow") { args ->
+ val link = args.first() as LinkJavadocListEntry
+ val dir = args[1] as String?
+// link.toLinkTag(dir)
+ createLinkTag(locationProvider.resolve(link, dir.orEmpty()), link.name)
+ },
+ TeFunction("createPackageHierarchy") { args ->
+ val list = args.first() as List<JavadocPackagePageNode>
+ list.mapIndexed { i, p ->
+ val content = if (i + 1 == list.size) "" else ", "
+ val name = p.name
+ "<li><a href=\"$name/package-tree.html\">$name</a>$content</li>"
+ }.joinToString("\n")
+ },
+ TeFunction("renderInheritanceGraph") { args ->
+ val node = args.first() as TreeViewPage.InheritanceNode
+
+ fun drawRec(node: TreeViewPage.InheritanceNode): String =
+ "<li class=\"circle\">" + node.dri.let { dri ->
+ listOfNotNull(
+ dri.packageName,
+ dri.classNames
+ ).joinToString(".") + node.interfaces.takeUnless { node.isInterface || it.isEmpty() }
+ ?.let {
+ " implements " + it.joinToString(", ") { n ->
+ listOfNotNull(
+ n.packageName,
+ createLinkTag(n.toLink(), n.classNames.orEmpty())
+ ).joinToString(".")
+ }
+ }.orEmpty()
+ } + node.children.filterNot { it.isInterface }.takeUnless { it.isEmpty() }?.let {
+ "<ul>" + it.joinToString("\n", transform = ::drawRec) + "</ul>"
+ }.orEmpty() + "</li>"
+
+ drawRec(node)
+ },
+ Filter("length") { subject.dynamicLength() }
+ ).forEach {
+ when (it) {
+ is TeFunction -> config.register(it)
+ is Filter -> config.register(it)
+ is Tag -> config.register(it)
+