aboutsummaryrefslogtreecommitdiff
path: root/core/src/main/kotlin/transformers
diff options
context:
space:
mode:
authorBłażej Kardyś <bkardys@virtuslab.com>2019-11-15 03:37:27 +0100
committerBłażej Kardyś <bkardys@virtuslab.com>2019-11-25 16:08:44 +0100
commitdef5b63ec4afa69d22f66bf1af76175fc1cdec3f (patch)
treed920fd0460506d75dac1aac279ac8f50e525f58a /core/src/main/kotlin/transformers
parent1be2870b600cdbbe6aebb9f64c0226b26e42ca5a (diff)
downloaddokka-def5b63ec4afa69d22f66bf1af76175fc1cdec3f.tar.gz
dokka-def5b63ec4afa69d22f66bf1af76175fc1cdec3f.tar.bz2
dokka-def5b63ec4afa69d22f66bf1af76175fc1cdec3f.zip
Page generation changes
Diffstat (limited to 'core/src/main/kotlin/transformers')
-rw-r--r--core/src/main/kotlin/transformers/DefaultDocumentationToPageTransformer.kt166
1 files changed, 102 insertions, 64 deletions
diff --git a/core/src/main/kotlin/transformers/DefaultDocumentationToPageTransformer.kt b/core/src/main/kotlin/transformers/DefaultDocumentationToPageTransformer.kt
index 771226d5..3f3cb7a2 100644
--- a/core/src/main/kotlin/transformers/DefaultDocumentationToPageTransformer.kt
+++ b/core/src/main/kotlin/transformers/DefaultDocumentationToPageTransformer.kt
@@ -15,112 +15,129 @@ class DefaultDocumentationToPageTransformer(
private val markdownConverter: MarkdownToContentConverter,
private val logger: DokkaLogger
) : DocumentationToPageTransformer {
- override fun transform(module: Module): ModulePageNode {
- val platformData = emptyList<PlatformData>()
- return PageBuilder(platformData).pageForModule(module)
- }
-
- private inner class PageBuilder(private val platformData: List<PlatformData>) {
- fun pageForModule(m: Module) =
- ModulePageNode("root", contentForModule(m), documentationNode = m).apply {
- // TODO change name
- appendChildren(m.packages.map { pageForPackage(it, this) })
- }
-
- private fun pageForPackage(p: Package, parent: PageNode) =
- PackagePageNode(p.name, contentForPackage(p), parent, p.dri, p).apply {
- appendChildren(p.classes.map { pageForClass(it, this) })
- appendChildren(p.functions.map { pageForMember(it, this) })
- appendChildren(p.properties.map { pageForMember(it, this) })
- }
-
- private fun pageForClass(c: Class, parent: PageNode): ClassPageNode =
- ClassPageNode(c.name, contentForClass(c), parent, c.dri, c).apply {
- appendChildren(c.constructors.map { pageForMember(it, this) })
- appendChildren(c.classes.map { pageForClass(it, this) })
- appendChildren(c.functions.map { pageForMember(it, this) })
- appendChildren(c.properties.map { pageForMember(it, this) })
- }
-
- private fun pageForMember(m: CallableNode<*>, parent: PageNode): MemberPageNode =
+ override fun transform(module: Module): ModulePageNode =
+ PageBuilder().pageForModule(module)
+
+ private inner class PageBuilder {
+ fun pageForModule(m: Module): ModulePageNode =
+ ModulePageNode("root", contentForModule(m), m, m.packages.map { pageForPackage(it) })
+
+ private fun pageForPackage(p: Package) =
+ PackagePageNode(p.name, contentForPackage(p), p.dri, p,
+ p.classes.map { pageForClass(it) } +
+ p.functions.map { pageForMember(it) } +
+ p.properties.map { pageForMember(it) })
+
+ private fun pageForClass(c: Class): ClassPageNode =
+ ClassPageNode(c.name, contentForClass(c), c.dri, c,
+ c.constructors.map { pageForMember(it) } +
+ c.classes.map { pageForClass(it) } +
+ c.functions.map { pageForMember(it) })
+
+ private fun pageForMember(m: CallableNode<*>): MemberPageNode =
when (m) {
- is Function -> MemberPageNode(m.name, contentForFunction(m), parent, m.dri, m)
- is Property -> MemberPageNode(m.name, emptyList(), parent, m.dri, m)
+ is Function ->
+ MemberPageNode(m.name, contentForFunction(m), m.dri, m)
else -> throw IllegalStateException("$m should not be present here")
}
- private fun contentForModule(m: Module) = content(DCI(m.dri, platformData)) {
+ private fun contentForModule(m: Module) = group(m) {
header(1) { text("root") }
- block("Packages", m.packages) { link(it.name, it.dri) }
+ block("Packages", 2, ContentKind.Packages, m.packages, m.platformData) {
+ link(it.name, it.dri)
+ }
text("Index\n")
text("Link to allpage here")
}
- private fun contentForPackage(p: Package) = content(DCI(p.dri, platformData)) {
+ private fun contentForPackage(p: Package) = group(p) {
header(1) { text("Package ${p.name}") }
- block("Types", p.classes) {
+ block("Types", 2, ContentKind.Properties, p.classes, p.platformData) {
link(it.name, it.dri)
text(it.briefDocstring)
}
- block("Functions", p.functions) {
+ block("Functions", 2, ContentKind.Functions, p.functions, p.platformData) {
link(it.name, it.dri)
signature(it)
text(it.briefDocstring)
}
}
- private fun contentForClass(c: Class) = content(DCI(c.dri, platformData)) {
+ private fun contentForClass(c: Class) = group(c) {
header(1) { text(c.name) }
c.commentsData.forEach { (doc, links) -> comment(doc, links) }
- block("Constructors", c.constructors) {
+ block("Constructors", 2, ContentKind.Functions, c.constructors, c.platformData) {
link(it.name, it.dri)
signature(it)
text(it.briefDocstring)
}
- block("Functions", c.functions) {
+ block("Functions", 2, ContentKind.Functions, c.functions, c.platformData) {
link(it.name, it.dri)
signature(it)
text(it.briefDocstring)
}
}
- private fun contentForFunction(f: Function) = content(DCI(f.dri, platformData)) {
+ private fun contentForFunction(f: Function) = group(f) {
header(1) { text(f.name) }
signature(f)
- f.commentsData.forEach { (doc, links) -> markdown(doc, links) }
- block("Parameters", f.children) { param ->
- group {
- text(param.name ?: "<receiver>")
- param.commentsData.forEach { (doc, links) -> markdown(doc, links) }
- }
+ f.commentsData.forEach { (doc, links) -> markdown(doc, links) }
+ block("Parameters", 2, ContentKind.Parameters, f.children, f.platformData) {
+ text(it.name ?: "<receiver>")
+ it.commentsData.forEach { (doc, links) -> markdown(doc, links) }
}
}
}
// TODO: Make some public builder or merge it with page builder, whateva
- private inner class ContentBuilder(private val dci: DCI) {
+ private inner class ContentBuilder(
+ val node: DocumentationNode<*>,
+ val kind: Kind,
+ val styles: Set<Style> = emptySet(),
+ val extras: Set<Extra> = emptySet()
+ ) {
private val contents = mutableListOf<ContentNode>()
- fun build() = contents.toList() // should include nodes coalescence
+ fun build() = ContentGroup(
+ contents.toList(),
+ DCI(node.dri, kind),
+ node.platformData,
+ styles,
+ extras
+ )
- inline fun header(level: Int, block: ContentBuilder.() -> Unit) {
- contents += ContentHeader(content(block), level, dci)
+ fun header(level: Int, block: ContentBuilder.() -> Unit) {
+ contents += ContentHeader(level, group(ContentKind.Symbol, block))
}
+ private fun createText(text: String) =
+ ContentText(text, DCI(node.dri, ContentKind.Symbol), node.platformData, styles, extras)
+
fun text(text: String) {
- contents += ContentText(text, dci)
+ contents += createText(text)
}
- inline fun symbol(block: ContentBuilder.() -> Unit) {
- contents += ContentSymbol(content(block), dci)
+ inline fun signature(f: Function, block: ContentBuilder.() -> Unit) {
+ contents += group(f, ContentKind.Symbol, block)
}
- inline fun <T: DocumentationNode<*>> block(name: String, elements: Iterable<T>, block: ContentBuilder.(T) -> Unit) {
- contents += ContentBlock(name, elements.flatMap { content(dci.copy(dri = it.dri)) { group { block(it) } } }, dci)
- }
+ inline fun <T : DocumentationNode<*>> block(
+ name: String,
+ level: Int,
+ kind: Kind,
+ elements: Iterable<T>,
+ platformData: Set<PlatformData>,
+ operation: ContentBuilder.(T) -> Unit
+ ) {
+ header(level) { text(name) }
- inline fun group(block: ContentBuilder.() -> Unit) {
- contents += ContentGroup(content(block), dci)
+ contents += ContentGroup(
+ elements.map {
+ group(it, kind) { operation(it) }
+ },
+ DCI(node.dri, kind),
+ platformData, styles, extras
+ )
}
inline fun <T> list(
@@ -142,24 +159,45 @@ class DefaultDocumentationToPageTransformer(
}
fun link(text: String, address: DRI) {
- contents += ContentLink(text, address, dci)
+ contents += ContentDRILink(
+ listOf(createText(text)),
+ address,
+ DCI(node.dri, ContentKind.Symbol),
+ node.platformData
+ )
}
+
fun comment(raw: String, links: Map<String, DRI>) {
- contents += ContentComment(markdownConverter.buildContent(parseMarkdown(raw), dci, links), dci)
+ contents += group(ContentKind.Comment) {
+ contents += markdownConverter.buildContent(
+ parseMarkdown(raw),
+ DCI(node.dri, ContentKind.Comment),
+ node.platformData,
+ links
+ )
+ }
}
fun markdown(raw: String, links: Map<String, DRI>) {
- contents += markdownConverter.buildContent(parseMarkdown(raw), dci, links)
+ contents += markdownConverter.buildContent(
+ parseMarkdown(raw), DCI(node.dri, ContentKind.Sample),
+ node.platformData,
+ links
+ )
}
- private inline fun content(block: ContentBuilder.() -> Unit): List<ContentNode> = content(dci, block)
+ private inline fun group(kind: Kind, block: ContentBuilder.() -> Unit): ContentGroup =
+ group(node, kind, block)
}
- private inline fun content(dci: DCI, block: ContentBuilder.() -> Unit): List<ContentNode> =
- ContentBuilder(dci).apply(block).build()
+ private inline fun group(
+ node: DocumentationNode<*>,
+ kind: Kind = ContentKind.Main,
+ block: ContentBuilder.() -> Unit
+ ) = ContentBuilder(node, kind).apply(block).build()
// When builder is made public it will be moved as extension method to someplace near Function model
- private fun ContentBuilder.signature(f: Function) = symbol {
+ private fun ContentBuilder.signature(f: Function) = signature(f) {
text("fun ")
if (f.receiver is Parameter) {
type(f.receiver.descriptors.first().descriptor.type)