diff options
author | Paweł Marks <pmarks@virtuslab.com> | 2020-01-27 09:34:16 +0100 |
---|---|---|
committer | Paweł Marks <Kordyjan@users.noreply.github.com> | 2020-01-31 15:07:06 +0100 |
commit | 885ecd28153b484277c9ddcbf4a7f9d761a59545 (patch) | |
tree | db453e66762ebebb3ee05c0301b38c4465ea20a3 /core/src/main/kotlin/pages | |
parent | c29605d92d1999434ecc79e774281a8280ae2823 (diff) | |
download | dokka-885ecd28153b484277c9ddcbf4a7f9d761a59545.tar.gz dokka-885ecd28153b484277c9ddcbf4a7f9d761a59545.tar.bz2 dokka-885ecd28153b484277c9ddcbf4a7f9d761a59545.zip |
Unifing model for pages with content ant technical renderer specific pages
Diffstat (limited to 'core/src/main/kotlin/pages')
-rw-r--r-- | core/src/main/kotlin/pages/PageNodes.kt | 92 | ||||
-rw-r--r-- | core/src/main/kotlin/pages/RendererSpecificPage.kt | 40 |
2 files changed, 101 insertions, 31 deletions
diff --git a/core/src/main/kotlin/pages/PageNodes.kt b/core/src/main/kotlin/pages/PageNodes.kt index 9274ac2b..80b21547 100644 --- a/core/src/main/kotlin/pages/PageNodes.kt +++ b/core/src/main/kotlin/pages/PageNodes.kt @@ -7,18 +7,57 @@ import java.util.* interface PageNode { val name: String + val children: List<PageNode> + + fun modified( + name: String = this.name, + children: List<PageNode> = this.children + ): PageNode +} + +interface ContentPage: PageNode { val content: ContentNode val dri: DRI val documentable: Documentable? val embeddedResources: List<String> - val children: List<PageNode> fun modified( name: String = this.name, content: ContentNode = this.content, embeddedResources: List<String> = this.embeddedResources, children: List<PageNode> = this.children - ): PageNode + ): ContentPage +} + +abstract class RootPageNode: PageNode { + val parentMap: Map<PageNode, PageNode> by lazy { + IdentityHashMap<PageNode, PageNode>().apply { + fun process(parent: PageNode) { + parent.children.forEach { child -> + put(child, parent) + process(child) + } + } + process(this@RootPageNode) + } + } + + fun transformPageNodeTree(operation: (PageNode) -> PageNode) = + this.transformNode(operation) as RootPageNode + + fun transformContentPagesTree(operation: (ContentPage) -> ContentPage) = transformPageNodeTree { + if (it is ContentPage) operation(it) else it + } as RootPageNode + + private fun PageNode.transformNode(operation: (PageNode) -> PageNode): PageNode = + operation(this).let { newNode -> + newNode.modified(children = newNode.children.map { it.transformNode(operation) }) + } + + abstract override fun modified( + name: String, + children: List<PageNode> + ): RootPageNode } class ModulePageNode( @@ -28,9 +67,12 @@ class ModulePageNode( override val documentable: Documentable?, override val children: List<PageNode>, override val embeddedResources: List<String> = listOf() -) : PageNode { +) : RootPageNode(), ContentPage { override val dri: DRI = DRI.topLevel + override fun modified(name: String, children: List<PageNode>): ModulePageNode = + modified(name = name, content = this.content, children = children) + override fun modified( name: String, content: ContentNode, @@ -39,26 +81,6 @@ class ModulePageNode( ): ModulePageNode = if (name == this.name && content === this.content && embeddedResources === this.embeddedResources && children shallowEq this.children) this else ModulePageNode(name, content, documentable, children, embeddedResources) - - private fun PageNode.transformNode(operation: (PageNode) -> PageNode): PageNode = - operation(this).let { newNode -> - newNode.modified(children = newNode.children.map { it.transformNode(operation) }) - } - - fun transformPageNodeTree(operation: (PageNode) -> PageNode) = - this.transformNode(operation) as ModulePageNode - - val parentMap: IdentityHashMap<PageNode, PageNode> by lazy { - IdentityHashMap<PageNode, PageNode>().apply { - fun addParent(parent: PageNode) { - parent.children.forEach { child -> - put(child, parent) - addParent(child) - } - } - addParent(this@ModulePageNode) - } - } } class PackagePageNode( @@ -69,7 +91,9 @@ class PackagePageNode( override val documentable: Documentable?, override val children: List<PageNode>, override val embeddedResources: List<String> = listOf() -) : PageNode { +) : ContentPage { + override fun modified(name: String, children: List<PageNode>): PackagePageNode = + modified(name = name, content = this.content, children = children) override fun modified( name: String, @@ -88,7 +112,9 @@ class ClassPageNode( override val documentable: Documentable?, override val children: List<PageNode>, override val embeddedResources: List<String> = listOf() -) : PageNode { +) : ContentPage { + override fun modified(name: String, children: List<PageNode>): ClassPageNode = + modified(name = name, content = this.content, children = children) override fun modified( name: String, @@ -107,7 +133,9 @@ class MemberPageNode( override val documentable: Documentable?, override val children: List<PageNode> = emptyList(), override val embeddedResources: List<String> = listOf() -) : PageNode { +) : ContentPage { + override fun modified(name: String, children: List<PageNode>): MemberPageNode = + modified(name = name, content = this.content, children = children) override fun modified( name: String, @@ -129,10 +157,12 @@ fun PageNode.dfs(predicate: (PageNode) -> Boolean): PageNode? = if (predicate(th this.children.asSequence().mapNotNull { it.dfs(predicate) }.firstOrNull() } -private infix fun <T> List<T>.shallowEq(other: List<T>) = - this === other || (this.size == other.size && (this zip other).all { (a, b) -> a === b }) +fun PageNode.asSequence(): Sequence<PageNode> = sequence { + yield(this@asSequence) + children.asSequence().flatMap { it.asSequence() }.forEach { yield(it) } +} -// Navigation?? +inline fun <reified T: PageNode> PageNode.children() = children.filterIsInstance<T>() -// content modifier? -//data class ContentLink(val link: String): ContentNode
\ No newline at end of file +private infix fun <T> List<T>.shallowEq(other: List<T>) = + this === other || (this.size == other.size && (this zip other).all { (a, b) -> a === b }) diff --git a/core/src/main/kotlin/pages/RendererSpecificPage.kt b/core/src/main/kotlin/pages/RendererSpecificPage.kt new file mode 100644 index 00000000..85e6d530 --- /dev/null +++ b/core/src/main/kotlin/pages/RendererSpecificPage.kt @@ -0,0 +1,40 @@ +package org.jetbrains.dokka.pages + +import org.jetbrains.dokka.renderers.Renderer +import kotlin.reflect.KClass + +interface RendererSpecificPage : PageNode { + val strategy: RenderingStrategy +} + +class RendererSpecificRootPage( + override val name: String, + override val children: List<PageNode>, + override val strategy: RenderingStrategy +) : RootPageNode(), RendererSpecificPage { + override fun modified(name: String, children: List<PageNode>): RendererSpecificRootPage = + RendererSpecificRootPage(name, children, strategy) +} + +class RendererSpecificResourcePage( + override val name: String, + override val children: List<PageNode>, + override val strategy: RenderingStrategy +): RendererSpecificPage { + override fun modified(name: String, children: List<PageNode>): RendererSpecificResourcePage = + RendererSpecificResourcePage(name, children, strategy) +} + +sealed class RenderingStrategy { + class Callback(val instructions: Renderer.(PageNode) -> String): RenderingStrategy() + data class Copy(val from: String) : RenderingStrategy() + data class Write(val text: String) : RenderingStrategy() + object DoNothing : RenderingStrategy() + + companion object { + inline operator fun <reified T: Renderer> invoke(crossinline instructions: T.(PageNode) -> String) = + Callback { if (this is T) instructions(it) else throw WrongRendererTypeException(T::class) } + } +} + +data class WrongRendererTypeException(val expectedType: KClass<*>): Exception()
\ No newline at end of file |