aboutsummaryrefslogtreecommitdiff
path: root/core/src/main/kotlin/pages
diff options
context:
space:
mode:
authorPaweł Marks <pmarks@virtuslab.com>2020-01-27 09:34:16 +0100
committerPaweł Marks <Kordyjan@users.noreply.github.com>2020-01-31 15:07:06 +0100
commit885ecd28153b484277c9ddcbf4a7f9d761a59545 (patch)
treedb453e66762ebebb3ee05c0301b38c4465ea20a3 /core/src/main/kotlin/pages
parentc29605d92d1999434ecc79e774281a8280ae2823 (diff)
downloaddokka-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.kt92
-rw-r--r--core/src/main/kotlin/pages/RendererSpecificPage.kt40
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