From d41965ca3cb180bc82bd5dd6fa747d2b83381b31 Mon Sep 17 00:00:00 2001 From: Paweł Marks Date: Wed, 7 Oct 2020 19:36:49 +0200 Subject: Implement immediate temaplates resolution --- .../consumers/ImmediateResolutionTagConsumer.kt | 31 ++++++++++++++++++++++ .../html/command/consumers/PathToRootConsumer.kt | 22 +++++++++++++++ .../html/command/consumers/ResolveLinkConsumer.kt | 30 +++++++++++++++++++++ 3 files changed, 83 insertions(+) create mode 100644 plugins/base/src/main/kotlin/renderers/html/command/consumers/ImmediateResolutionTagConsumer.kt create mode 100644 plugins/base/src/main/kotlin/renderers/html/command/consumers/PathToRootConsumer.kt create mode 100644 plugins/base/src/main/kotlin/renderers/html/command/consumers/ResolveLinkConsumer.kt (limited to 'plugins/base/src/main/kotlin/renderers/html/command') diff --git a/plugins/base/src/main/kotlin/renderers/html/command/consumers/ImmediateResolutionTagConsumer.kt b/plugins/base/src/main/kotlin/renderers/html/command/consumers/ImmediateResolutionTagConsumer.kt new file mode 100644 index 00000000..68f6dc81 --- /dev/null +++ b/plugins/base/src/main/kotlin/renderers/html/command/consumers/ImmediateResolutionTagConsumer.kt @@ -0,0 +1,31 @@ +package org.jetbrains.dokka.base.renderers.html.command.consumers + +import kotlinx.html.TagConsumer +import kotlinx.html.visit +import org.jetbrains.dokka.base.DokkaBase +import org.jetbrains.dokka.base.renderers.html.TemplateBlock +import org.jetbrains.dokka.base.renderers.html.templateCommand +import org.jetbrains.dokka.base.renderers.html.templateCommandFor +import org.jetbrains.dokka.base.templating.Command +import org.jetbrains.dokka.plugability.DokkaContext +import org.jetbrains.dokka.plugability.plugin +import org.jetbrains.dokka.plugability.query + +class ImmediateResolutionTagConsumer( + private val downstream: TagConsumer, + private val context: DokkaContext +): TagConsumer by downstream { + fun processCommand(command: Command, block: TemplateBlock) { + context.plugin().query { immediateHtmlCommandConsumer } + .find { it.canProcess(command) } + ?.processCommand(command, block, this) + ?: run { templateCommandFor(command, downstream).visit(block) } + } + + fun processCommandAndFinalize(command: Command, block: TemplateBlock): R = + context.plugin().query { immediateHtmlCommandConsumer } + .find { it.canProcess(command) } + ?.processCommandAndFinalize(command, block, this) + ?: downstream.templateCommand(command, block) +} + diff --git a/plugins/base/src/main/kotlin/renderers/html/command/consumers/PathToRootConsumer.kt b/plugins/base/src/main/kotlin/renderers/html/command/consumers/PathToRootConsumer.kt new file mode 100644 index 00000000..b4649af6 --- /dev/null +++ b/plugins/base/src/main/kotlin/renderers/html/command/consumers/PathToRootConsumer.kt @@ -0,0 +1,22 @@ +package org.jetbrains.dokka.base.renderers.html.command.consumers + +import org.jetbrains.dokka.base.renderers.html.TemplateBlock +import org.jetbrains.dokka.base.renderers.html.buildAsInnerHtml +import org.jetbrains.dokka.base.templating.Command +import org.jetbrains.dokka.base.templating.ImmediateHtmlCommandConsumer +import org.jetbrains.dokka.base.templating.PathToRootSubstitutionCommand + +object PathToRootConsumer: ImmediateHtmlCommandConsumer { + override fun canProcess(command: Command) = command is PathToRootSubstitutionCommand + + override fun processCommand(command: Command, block: TemplateBlock, tagConsumer: ImmediateResolutionTagConsumer) { + command as PathToRootSubstitutionCommand + tagConsumer.onTagContentUnsafe { +block.buildAsInnerHtml().replace(command.pattern, command.default) } + } + + override fun processCommandAndFinalize(command: Command, block: TemplateBlock, tagConsumer: ImmediateResolutionTagConsumer): R { + processCommand(command, block, tagConsumer) + return tagConsumer.finalize() + } + +} \ No newline at end of file diff --git a/plugins/base/src/main/kotlin/renderers/html/command/consumers/ResolveLinkConsumer.kt b/plugins/base/src/main/kotlin/renderers/html/command/consumers/ResolveLinkConsumer.kt new file mode 100644 index 00000000..1c42c3d5 --- /dev/null +++ b/plugins/base/src/main/kotlin/renderers/html/command/consumers/ResolveLinkConsumer.kt @@ -0,0 +1,30 @@ +package org.jetbrains.dokka.base.renderers.html.command.consumers + +import kotlinx.html.SPAN +import kotlinx.html.span +import kotlinx.html.unsafe +import kotlinx.html.visit +import org.jetbrains.dokka.base.renderers.html.TemplateBlock +import org.jetbrains.dokka.base.renderers.html.buildAsInnerHtml +import org.jetbrains.dokka.base.templating.Command +import org.jetbrains.dokka.base.templating.ImmediateHtmlCommandConsumer +import org.jetbrains.dokka.base.templating.ResolveLinkCommand +import org.jetbrains.dokka.utilities.htmlEscape + +object ResolveLinkConsumer: ImmediateHtmlCommandConsumer { + override fun canProcess(command: Command) = command is ResolveLinkCommand + + override fun processCommand(command: Command, block: TemplateBlock, tagConsumer: ImmediateResolutionTagConsumer) { + command as ResolveLinkCommand + SPAN(mapOf("data-unresolved-link" to command.dri.toString().htmlEscape()), tagConsumer).visit { + unsafe { block.buildAsInnerHtml() } + } + } + + override fun processCommandAndFinalize(command: Command, block: TemplateBlock, tagConsumer: ImmediateResolutionTagConsumer): R { + command as ResolveLinkCommand + return tagConsumer.span { + attributes["data-unresolved-link"] = command.dri.toString().htmlEscape() + } + } +} \ No newline at end of file -- cgit