aboutsummaryrefslogtreecommitdiff
path: root/plugins/base/src/main/kotlin
diff options
context:
space:
mode:
authorBłażej Kardyś <bkardys@virtuslab.com>2020-05-27 01:16:48 +0200
committerBłażej Kardyś <bkardys@virtuslab.com>2020-06-04 11:26:05 +0200
commit6dc9498ca849645ecb4ec923bb7116b245dca706 (patch)
tree23022e6d6f3aea18b9e8efaaa482cafae9bee989 /plugins/base/src/main/kotlin
parentb614604effda51ca7c76c8901be78ced62b642b2 (diff)
downloaddokka-6dc9498ca849645ecb4ec923bb7116b245dca706.tar.gz
dokka-6dc9498ca849645ecb4ec923bb7116b245dca706.tar.bz2
dokka-6dc9498ca849645ecb4ec923bb7116b245dca706.zip
All modules page generation
Diffstat (limited to 'plugins/base/src/main/kotlin')
-rw-r--r--plugins/base/src/main/kotlin/DokkaBase.kt7
-rw-r--r--plugins/base/src/main/kotlin/allModulePage/MultimodulePageCreator.kt65
-rw-r--r--plugins/base/src/main/kotlin/renderers/html/HtmlRenderer.kt17
-rw-r--r--plugins/base/src/main/kotlin/resolvers/local/DefaultLocationProviderFactory.kt4
-rw-r--r--plugins/base/src/main/kotlin/resolvers/local/MultimoduleLocationProvider.kt32
-rw-r--r--plugins/base/src/main/kotlin/translators/documentables/PageContentBuilder.kt23
6 files changed, 132 insertions, 16 deletions
diff --git a/plugins/base/src/main/kotlin/DokkaBase.kt b/plugins/base/src/main/kotlin/DokkaBase.kt
index f217bbf1..c99372af 100644
--- a/plugins/base/src/main/kotlin/DokkaBase.kt
+++ b/plugins/base/src/main/kotlin/DokkaBase.kt
@@ -1,6 +1,7 @@
package org.jetbrains.dokka.base
import org.jetbrains.dokka.CoreExtensions
+import org.jetbrains.dokka.base.allModulePage.MultimodulePageCreator
import org.jetbrains.dokka.base.renderers.*
import org.jetbrains.dokka.base.renderers.html.*
import org.jetbrains.dokka.base.signatures.KotlinSignatureProvider
@@ -177,5 +178,9 @@ class DokkaBase : DokkaPlugin() {
htmlPreprocessors providing ::SourcesetDependencyAppender order { after(rootCreator)}
}
-
+ val allModulePageCreators by extending {
+ CoreExtensions.allModulePageCreator providing {
+ MultimodulePageCreator(it)
+ }
+ }
} \ No newline at end of file
diff --git a/plugins/base/src/main/kotlin/allModulePage/MultimodulePageCreator.kt b/plugins/base/src/main/kotlin/allModulePage/MultimodulePageCreator.kt
new file mode 100644
index 00000000..ea1d8510
--- /dev/null
+++ b/plugins/base/src/main/kotlin/allModulePage/MultimodulePageCreator.kt
@@ -0,0 +1,65 @@
+package org.jetbrains.dokka.base.allModulePage
+
+import org.jetbrains.dokka.base.DokkaBase
+import org.jetbrains.dokka.base.resolvers.local.MultimoduleLocationProvider.Companion.MULTIMODULE_PACKAGE_PLACEHOLDER
+import org.jetbrains.dokka.base.transformers.pages.comments.DocTagToContentConverter
+import org.jetbrains.dokka.base.translators.documentables.PageContentBuilder
+import org.jetbrains.dokka.links.DRI
+import org.jetbrains.dokka.model.SourceSetData
+import org.jetbrains.dokka.model.doc.DocumentationNode
+import org.jetbrains.dokka.model.doc.P
+import org.jetbrains.dokka.pages.*
+import org.jetbrains.dokka.parsers.MarkdownParser
+import org.jetbrains.dokka.plugability.DokkaContext
+import org.jetbrains.dokka.plugability.querySingle
+import org.jetbrains.dokka.transformers.pages.PageCreator
+import org.jetbrains.dokka.utilities.DokkaLogger
+import java.io.File
+
+class MultimodulePageCreator(
+ val context: DokkaContext
+) : PageCreator {
+ private val logger: DokkaLogger = context.logger
+
+ override fun invoke(): RootPageNode {
+ val parser = MarkdownParser(logger = logger)
+ val modules = context.configuration.modules
+
+ val commentsConverter = context.plugin(DokkaBase::class)?.querySingle { commentsToContentConverter }
+ val signatureProvider = context.plugin(DokkaBase::class)?.querySingle { signatureProvider }
+ if (commentsConverter == null || signatureProvider == null)
+ throw IllegalStateException("Both comments converter and signature provider must not be null")
+
+ val sourceSetData = emptySet<SourceSetData>()
+ val builder = PageContentBuilder(commentsConverter, signatureProvider, context.logger)
+ val contentNode = builder.contentFor(dri = DRI(MULTIMODULE_PACKAGE_PLACEHOLDER), kind = ContentKind.Cover, sourceSets = sourceSetData) {
+ header(2, "All modules:")
+ table(styles = setOf(MultimoduleTable)) {
+ modules.mapNotNull { module ->
+ val paragraph = module.docFile.let(::File).readText().let { parser.parse(it).firstParagraph() }
+ paragraph?.let {
+ val dri = DRI(packageName = MULTIMODULE_PACKAGE_PLACEHOLDER, classNames = module.name)
+ val dci = DCI(setOf(dri), ContentKind.Main)
+ val header =
+ ContentHeader(listOf(linkNode(module.name, dri)), 2, dci, emptySet(), emptySet())
+ val content = ContentGroup(
+ DocTagToContentConverter.buildContent(it, dci, emptySet()),
+ dci,
+ emptySet(),
+ emptySet()
+ )
+ ContentGroup(listOf(header, content), dci, emptySet(), emptySet())
+ }
+ }
+ }
+ }
+ return MultimoduleRootPageNode(
+ "Modules",
+ setOf(DRI(packageName = MULTIMODULE_PACKAGE_PLACEHOLDER, classNames = "allModules")),
+ contentNode
+ )
+ }
+
+ private fun DocumentationNode.firstParagraph() =
+ this.children.flatMap { it.root.children }.filterIsInstance<P>().firstOrNull()
+} \ No newline at end of file
diff --git a/plugins/base/src/main/kotlin/renderers/html/HtmlRenderer.kt b/plugins/base/src/main/kotlin/renderers/html/HtmlRenderer.kt
index e73a36b2..76a52a83 100644
--- a/plugins/base/src/main/kotlin/renderers/html/HtmlRenderer.kt
+++ b/plugins/base/src/main/kotlin/renderers/html/HtmlRenderer.kt
@@ -265,7 +265,8 @@ open class HtmlRenderer(
private fun FlowContent.buildRow(
node: ContentGroup,
pageContext: ContentPage,
- sourceSetRestriction: Set<SourceSetData>?
+ sourceSetRestriction: Set<SourceSetData>?,
+ style: Set<Style>
) {
node.children
.filter { sourceSetRestriction == null || it.sourceSets.any { s -> s in sourceSetRestriction } }
@@ -273,11 +274,13 @@ open class HtmlRenderer(
?.let {
withAnchor(node.dci.dri.first().toString()) {
div(classes = "table-row") {
- attributes["data-filterable-current"] = node.sourceSets.joinToString(" ") {
- it.sourceSetName
- }
- attributes["data-filterable-set"] = node.sourceSets.joinToString(" ") {
- it.sourceSetName
+ if (!style.contains(MultimoduleTable)) {
+ attributes["data-filterable-current"] = node.sourceSets.joinToString(" ") {
+ it.sourceSetName
+ }
+ attributes["data-filterable-set"] = node.sourceSets.joinToString(" ") {
+ it.sourceSetName
+ }
}
it.filterIsInstance<ContentLink>().takeIf { it.isNotEmpty() }?.let {
div("main-subrow " + node.style.joinToString(" ")) {
@@ -344,7 +347,7 @@ open class HtmlRenderer(
else -> div(classes = "table") {
node.extra.extraHtmlAttributes().forEach { attributes[it.extraKey] = it.extraValue }
node.children.forEach {
- buildRow(it, pageContext, sourceSetRestriction)
+ buildRow(it, pageContext, sourceSetRestriction, node.style)
}
}
}
diff --git a/plugins/base/src/main/kotlin/resolvers/local/DefaultLocationProviderFactory.kt b/plugins/base/src/main/kotlin/resolvers/local/DefaultLocationProviderFactory.kt
index 57f53ba6..1918472b 100644
--- a/plugins/base/src/main/kotlin/resolvers/local/DefaultLocationProviderFactory.kt
+++ b/plugins/base/src/main/kotlin/resolvers/local/DefaultLocationProviderFactory.kt
@@ -1,10 +1,12 @@
package org.jetbrains.dokka.base.resolvers.local
+import org.jetbrains.dokka.pages.MultimoduleRootPageNode
import org.jetbrains.dokka.pages.RootPageNode
import org.jetbrains.dokka.plugability.DokkaContext
class DefaultLocationProviderFactory(private val context: DokkaContext) : LocationProviderFactory {
override fun getLocationProvider(pageNode: RootPageNode) =
- DefaultLocationProvider(pageNode, context)
+ if (pageNode.children.first() is MultimoduleRootPageNode) MultimoduleLocationProvider(pageNode, context)
+ else DefaultLocationProvider(pageNode, context)
} \ No newline at end of file
diff --git a/plugins/base/src/main/kotlin/resolvers/local/MultimoduleLocationProvider.kt b/plugins/base/src/main/kotlin/resolvers/local/MultimoduleLocationProvider.kt
new file mode 100644
index 00000000..21692bf9
--- /dev/null
+++ b/plugins/base/src/main/kotlin/resolvers/local/MultimoduleLocationProvider.kt
@@ -0,0 +1,32 @@
+package org.jetbrains.dokka.base.resolvers.local
+
+import org.jetbrains.dokka.links.DRI
+import org.jetbrains.dokka.model.SourceSetData
+import org.jetbrains.dokka.pages.PageNode
+import org.jetbrains.dokka.pages.RootPageNode
+import org.jetbrains.dokka.plugability.DokkaContext
+
+class MultimoduleLocationProvider(private val root: RootPageNode, context: DokkaContext) : LocationProvider {
+
+ val defaultLocationProvider = DefaultLocationProvider(root, context)
+
+ val paths = context.configuration.modules.map {
+ it.name to it.path
+ }.toMap()
+
+ override fun resolve(dri: DRI, platforms: List<SourceSetData>, context: PageNode?): String =
+ dri.takeIf { it.packageName == MULTIMODULE_PACKAGE_PLACEHOLDER }?.classNames?.let { paths[it] }?.let {
+ "$it/${dri.classNames}/index.html"
+ } ?: defaultLocationProvider.resolve(dri, platforms, context)
+
+ override fun resolve(node: PageNode, context: PageNode?, skipExtension: Boolean): String =
+ defaultLocationProvider.resolve(node, context, skipExtension)
+
+ override fun resolveRoot(node: PageNode): String = defaultLocationProvider.resolveRoot(node)
+
+ override fun ancestors(node: PageNode): List<PageNode> = listOf(root)
+
+ companion object {
+ const val MULTIMODULE_PACKAGE_PLACEHOLDER = ".ext"
+ }
+} \ No newline at end of file
diff --git a/plugins/base/src/main/kotlin/translators/documentables/PageContentBuilder.kt b/plugins/base/src/main/kotlin/translators/documentables/PageContentBuilder.kt
index 5ff5a954..b670626a 100644
--- a/plugins/base/src/main/kotlin/translators/documentables/PageContentBuilder.kt
+++ b/plugins/base/src/main/kotlin/translators/documentables/PageContentBuilder.kt
@@ -100,7 +100,7 @@ open class PageContentBuilder(
kind,
styles,
extra + SimpleAttr("anchor", text.replace("\\s".toRegex(), "").toLowerCase())
- ){
+ ) {
text(text)
block()
}
@@ -206,14 +206,23 @@ open class PageContentBuilder(
styles: Set<Style> = mainStyles,
extra: PropertyContainer<ContentNode> = mainExtra
) {
- contents += ContentDRILink(
- listOf(createText(text, kind, sourceSets, styles, extra)),
- address,
- DCI(mainDRI, kind),
- sourceSets
- )
+ contents += linkNode(text, address, kind, sourceSets, styles, extra)
}
+ fun linkNode(
+ text: String,
+ address: DRI,
+ kind: Kind = ContentKind.Main,
+ sourceSets: Set<SourceSetData> = mainPlatformData,
+ styles: Set<Style> = mainStyles,
+ extra: PropertyContainer<ContentNode> = mainExtra
+ ) = ContentDRILink(
+ listOf(createText(text, kind, sourceSets, styles, extra)),
+ address,
+ DCI(mainDRI, kind),
+ sourceSets
+ )
+
fun link(
text: String,
address: String,