diff options
| author | Szymon Świstun <sswistun@virtuslab.com> | 2020-02-06 15:51:07 +0100 |
|---|---|---|
| committer | Paweł Marks <Kordyjan@users.noreply.github.com> | 2020-02-12 13:33:10 +0100 |
| commit | 1e0271e4e2888022f2ac93366c397d7315008c45 (patch) | |
| tree | fa6c9726fb0b2dbb0a7eebfa4a1b968164f14d9a /core/src/main/kotlin/transformers | |
| parent | 2a60f8adbab66e7b671949960c7cd90ea86992d7 (diff) | |
| download | dokka-1e0271e4e2888022f2ac93366c397d7315008c45.tar.gz dokka-1e0271e4e2888022f2ac93366c397d7315008c45.tar.bz2 dokka-1e0271e4e2888022f2ac93366c397d7315008c45.zip | |
page merger strategy
Diffstat (limited to 'core/src/main/kotlin/transformers')
4 files changed, 55 insertions, 38 deletions
diff --git a/core/src/main/kotlin/transformers/pages/DefaultPageMergerStrategy.kt b/core/src/main/kotlin/transformers/pages/DefaultPageMergerStrategy.kt new file mode 100644 index 00000000..81da71ce --- /dev/null +++ b/core/src/main/kotlin/transformers/pages/DefaultPageMergerStrategy.kt @@ -0,0 +1,30 @@ +package org.jetbrains.dokka.transformers.pages + +import org.jetbrains.dokka.pages.* + +object DefaultPageMergerStrategy : PageMergerStrategy() { + override fun tryMerge(pages: List<PageNode>): List<PageNode> = listOf(pages.mergePageNodes()) + + private fun List<PageNode>.mergePageNodes(): ContentPage { + val name = first().name + val resChildren = this.flatMap { it.children }.distinct() + val contentChildren = this.filterIsInstance<ContentPage>() + val dri = contentChildren.flatMap { it.dri }.toSet() + val dci = DCI( + dri = dri, + kind = contentChildren.first().content.dci.kind + ) + return contentChildren.first() + .modified( + dri = dri, + name = name, + children = resChildren, + content = asGroup(dci, contentChildren.map { it.content }) + ) + } + + fun asGroup(dci: DCI, nodes: List<ContentNode>): ContentGroup { + val n = nodes.first() + return ContentGroup(nodes, dci, n.platforms, n.style, n.extras) + } +}
\ No newline at end of file diff --git a/core/src/main/kotlin/transformers/pages/DefaultPageNodeMerger.kt b/core/src/main/kotlin/transformers/pages/DefaultPageNodeMerger.kt index 7cd4aba8..72e491cf 100644 --- a/core/src/main/kotlin/transformers/pages/DefaultPageNodeMerger.kt +++ b/core/src/main/kotlin/transformers/pages/DefaultPageNodeMerger.kt @@ -1,45 +1,23 @@ package org.jetbrains.dokka.transformers.pages -import org.jetbrains.dokka.pages.* +import org.jetbrains.dokka.CoreExtensions +import org.jetbrains.dokka.pages.PageNode +import org.jetbrains.dokka.pages.RootPageNode +import org.jetbrains.dokka.plugability.DokkaContext -object DefaultPageNodeMerger : PageNodeTransformer { +class DefaultPageNodeMerger(val context: DokkaContext) : PageNodeTransformer(context) { override fun invoke(input: RootPageNode): RootPageNode = input.modified(children = input.children.map { it.mergeChildren() }) - fun asGroup(dci: DCI, nodes: List<ContentNode>): ContentGroup { - val n = nodes.first() - return ContentGroup(nodes, dci, n.platforms, n.style, n.extras) - } + fun PageNode.mergeChildren(): PageNode = children.groupBy { it.name } + .map { (_, v) -> v.mergePageNodes() } + .let { pages -> modified(children = pages.map { it.first().mergeChildren() }) } - fun PageNode.mergeChildren(): PageNode = if (children.isNotEmpty()) { - children.groupBy { it.name } - .map { (k, v) -> - if (v.size > 1) { - v.mergePageNodes(k) - } else v.first() - } - .map { it.mergeChildren() } - .let { - modified(children = it) - } - } else this + private fun List<PageNode>.mergePageNodes(): List<PageNode> = + context[CoreExtensions.pageMergerStrategy].fold(this) { pages, strategy -> tryMerge(strategy, pages) } - private fun List<PageNode>.mergePageNodes( - k: String - ): ContentPage { - val resChildren = this.flatMap { it.children }.distinct() - val contentChildren = this.filterIsInstance<ContentPage>() - val dri = contentChildren.flatMap { it.dri }.toSet() - val dci = DCI( - dri = dri, - kind = contentChildren.first().content.dci.kind - ) - return contentChildren.first() - .modified( - dri = dri, - name = k, - children = resChildren, - content = asGroup(dci, contentChildren.map { it.content }) - ) - } + private fun tryMerge(strategy: PageMergerStrategy, pages: List<PageNode>) = if (pages.size > 1) + strategy.tryMerge(pages) + else + pages }
\ No newline at end of file diff --git a/core/src/main/kotlin/transformers/pages/PageMergerStrategy.kt b/core/src/main/kotlin/transformers/pages/PageMergerStrategy.kt new file mode 100644 index 00000000..37dc5a6a --- /dev/null +++ b/core/src/main/kotlin/transformers/pages/PageMergerStrategy.kt @@ -0,0 +1,9 @@ +package org.jetbrains.dokka.transformers.pages + +import org.jetbrains.dokka.pages.PageNode + +abstract class PageMergerStrategy { + + abstract fun tryMerge(pages: List<PageNode>): List<PageNode> + +}
\ No newline at end of file diff --git a/core/src/main/kotlin/transformers/pages/PageNodeTransformer.kt b/core/src/main/kotlin/transformers/pages/PageNodeTransformer.kt index 45357060..ebf53d30 100644 --- a/core/src/main/kotlin/transformers/pages/PageNodeTransformer.kt +++ b/core/src/main/kotlin/transformers/pages/PageNodeTransformer.kt @@ -4,6 +4,6 @@ import org.jetbrains.dokka.pages.ModulePageNode import org.jetbrains.dokka.pages.RootPageNode import org.jetbrains.dokka.plugability.DokkaContext -interface PageNodeTransformer { - operator fun invoke(input: RootPageNode): RootPageNode +abstract class PageNodeTransformer(context: DokkaContext? = null) { + abstract operator fun invoke(input: RootPageNode): RootPageNode }
\ No newline at end of file |
