diff options
Diffstat (limited to 'plugins/base/src/main/kotlin/renderers')
4 files changed, 73 insertions, 20 deletions
diff --git a/plugins/base/src/main/kotlin/renderers/DefaultRenderer.kt b/plugins/base/src/main/kotlin/renderers/DefaultRenderer.kt index 26c75dbf..4178e427 100644 --- a/plugins/base/src/main/kotlin/renderers/DefaultRenderer.kt +++ b/plugins/base/src/main/kotlin/renderers/DefaultRenderer.kt @@ -1,5 +1,7 @@ package org.jetbrains.dokka.base.renderers +import com.sun.jna.platform.win32.COM.Dispatch +import kotlinx.coroutines.* import org.jetbrains.dokka.base.DokkaBase import org.jetbrains.dokka.base.resolvers.local.LocationProvider import org.jetbrains.dokka.pages.* @@ -22,10 +24,20 @@ abstract class DefaultRenderer<T>( abstract fun T.buildHeader(level: Int, content: T.() -> Unit) abstract fun T.buildLink(address: String, content: T.() -> Unit) - abstract fun T.buildList(node: ContentList, pageContext: ContentPage, platformRestriction: PlatformData? = null) + abstract fun T.buildList( + node: ContentList, + pageContext: ContentPage, + platformRestriction: PlatformData? = null + ) + abstract fun T.buildNewLine() abstract fun T.buildResource(node: ContentEmbeddedResource, pageContext: ContentPage) - abstract fun T.buildTable(node: ContentTable, pageContext: ContentPage, platformRestriction: PlatformData? = null) + abstract fun T.buildTable( + node: ContentTable, + pageContext: ContentPage, + platformRestriction: PlatformData? = null + ) + abstract fun T.buildText(textNode: ContentText) abstract fun T.buildNavigation(page: PageNode) @@ -35,7 +47,11 @@ abstract class DefaultRenderer<T>( open fun T.buildPlatformDependent(content: PlatformHintedContent, pageContext: ContentPage) = buildContentNode(content.inner, pageContext) - open fun T.buildGroup(node: ContentGroup, pageContext: ContentPage, platformRestriction: PlatformData? = null) = + open fun T.buildGroup( + node: ContentGroup, + pageContext: ContentPage, + platformRestriction: PlatformData? = null + ) = wrapGroup(node, pageContext) { node.children.forEach { it.build(this, pageContext, platformRestriction) } } open fun T.wrapGroup(node: ContentGroup, pageContext: ContentPage, childrenCallback: T.() -> Unit) = @@ -53,11 +69,19 @@ abstract class DefaultRenderer<T>( code.forEach { it.build(this, pageContext) } } - open fun T.buildHeader(node: ContentHeader, pageContext: ContentPage, platformRestriction: PlatformData? = null) { + open fun T.buildHeader( + node: ContentHeader, + pageContext: ContentPage, + platformRestriction: PlatformData? = null + ) { buildHeader(node.level) { node.children.forEach { it.build(this, pageContext, platformRestriction) } } } - open fun ContentNode.build(builder: T, pageContext: ContentPage, platformRestriction: PlatformData? = null) = + open fun ContentNode.build( + builder: T, + pageContext: ContentPage, + platformRestriction: PlatformData? = null + ) = builder.buildContentNode(this, pageContext, platformRestriction) open fun T.buildContentNode( @@ -93,14 +117,14 @@ abstract class DefaultRenderer<T>( page.content.build(context, page) } - open fun renderPage(page: PageNode) { + open suspend fun renderPage(page: PageNode) { val path by lazy { locationProvider.resolve(page, skipExtension = true) } when (page) { - is ContentPage -> outputWriter.write(path, buildPage(page) { c, p -> buildPageContent(c, p) }, ".html") + is ContentPage -> outputWriter.write(path, runBlocking { buildPage(page) { c, p -> buildPageContent(c, p) } }, ".html") is RendererSpecificPage -> when (val strategy = page.strategy) { is RenderingStrategy.Copy -> outputWriter.writeResources(strategy.from, path) is RenderingStrategy.Write -> outputWriter.write(path, strategy.text, "") - is RenderingStrategy.Callback -> outputWriter.write(path, strategy.instructions(this, page), ".html") + is RenderingStrategy.Callback -> outputWriter.write(path, strategy.instructions(this@DefaultRenderer, page), ".html") RenderingStrategy.DoNothing -> Unit } else -> throw AssertionError( @@ -109,12 +133,33 @@ abstract class DefaultRenderer<T>( } } - open fun renderPages(root: PageNode) { - renderPage(root) - root.children.forEach { renderPages(it) } + private suspend fun CoroutineScope.renderPages(root: PageNode) { + coroutineScope { + launch(Dispatchers.IO) { renderPage(root) }.join() + root.children.forEach { + renderPages(it) + } + } } - override fun render(root: RootPageNode) { + // reimplement this as preprocessor + open suspend fun renderPackageList(root: ContentPage) = + getPackageNamesAndPlatforms(root) + .keys + .joinToString("\n") + .also { outputWriter.write("${root.name}/package-list", it, "") } + + open suspend fun getPackageNamesAndPlatforms(root: PageNode): Map<String, List<PlatformData>> = + root.children + .map { getPackageNamesAndPlatforms(it) } + .fold(emptyMap<String, List<PlatformData>>()) { e, acc -> acc + e } + + if (root is PackagePageNode) { + mapOf(root.name to root.platforms()) + } else { + emptyMap() + } + + protected fun renderImpl(coroutineScope: CoroutineScope, root: RootPageNode): Job = coroutineScope.launch(Dispatchers.Default) { val newRoot = preprocessors.fold(root) { acc, t -> t(acc) } locationProvider = @@ -122,6 +167,8 @@ abstract class DefaultRenderer<T>( renderPages(newRoot) } + + override fun CoroutineScope.render(root: RootPageNode) = renderImpl(this, root) } fun ContentPage.platforms() = this.content.platforms.toList()
\ No newline at end of file diff --git a/plugins/base/src/main/kotlin/renderers/FileWriter.kt b/plugins/base/src/main/kotlin/renderers/FileWriter.kt index bf2426fe..07d25eb6 100644 --- a/plugins/base/src/main/kotlin/renderers/FileWriter.kt +++ b/plugins/base/src/main/kotlin/renderers/FileWriter.kt @@ -11,7 +11,7 @@ class FileWriter(val context: DokkaContext): OutputWriter { private val jarUriPrefix = "jar:file:" private val root = File(context.configuration.outputDir).absolutePath - override fun write(path: String, text: String, ext: String) { + override suspend fun write(path: String, text: String, ext: String) { if (createdFiles.contains(path)) { context.logger.error("An attempt to write ${root}/$path several times!") return @@ -28,7 +28,7 @@ class FileWriter(val context: DokkaContext): OutputWriter { } } - override fun writeResources(pathFrom: String, pathTo: String) = + override suspend fun writeResources(pathFrom: String, pathTo: String) = if (javaClass.getResource(pathFrom).toURI().toString().startsWith(jarUriPrefix)) { copyFromJar(pathFrom, pathTo) } else { diff --git a/plugins/base/src/main/kotlin/renderers/OutputWriter.kt b/plugins/base/src/main/kotlin/renderers/OutputWriter.kt index a6fda51a..1827c7f0 100644 --- a/plugins/base/src/main/kotlin/renderers/OutputWriter.kt +++ b/plugins/base/src/main/kotlin/renderers/OutputWriter.kt @@ -2,6 +2,6 @@ package org.jetbrains.dokka.base.renderers interface OutputWriter { - fun write(path: String, text: String, ext: String) - fun writeResources(pathFrom: String, pathTo: String) + suspend fun write(path: String, text: String, ext: String) + suspend fun writeResources(pathFrom: String, pathTo: String) }
\ 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 bbb5b685..a32cb715 100644 --- a/plugins/base/src/main/kotlin/renderers/html/HtmlRenderer.kt +++ b/plugins/base/src/main/kotlin/renderers/html/HtmlRenderer.kt @@ -1,5 +1,9 @@ package org.jetbrains.dokka.base.renderers.html +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.launch import kotlinx.html.* import kotlinx.html.stream.createHTML import org.jetbrains.dokka.base.DokkaBase @@ -264,7 +268,7 @@ open class HtmlRenderer( } } - override fun renderPage(page: PageNode) { + override suspend fun renderPage(page: PageNode) { super.renderPage(page) if (page is ContentPage) { pageList.add( @@ -282,9 +286,11 @@ open class HtmlRenderer( text(textNode.text) } - override fun render(root: RootPageNode) { - super.render(root) - outputWriter.write("scripts/pages", "var pages = [\n${pageList.joinToString(",\n")}\n]", ".js") + override fun CoroutineScope.render(root: RootPageNode): Job { + super.renderImpl(this, root) + return launch(Dispatchers.IO) { + outputWriter.write("scripts/pages", "var pages = [\n${pageList.joinToString(",\n")}\n]", ".js") + } } private fun PageNode.root(path: String) = locationProvider.resolveRoot(this) + path |