diff options
Diffstat (limited to 'plugins/base/src/main/kotlin')
6 files changed, 88 insertions, 6 deletions
diff --git a/plugins/base/src/main/kotlin/DokkaBase.kt b/plugins/base/src/main/kotlin/DokkaBase.kt index de7e1e5e..afda6f24 100644 --- a/plugins/base/src/main/kotlin/DokkaBase.kt +++ b/plugins/base/src/main/kotlin/DokkaBase.kt @@ -14,6 +14,7 @@ import org.jetbrains.dokka.base.resolvers.local.LocationProviderFactory import org.jetbrains.dokka.base.resolvers.shared.RecognizedLinkFormat import org.jetbrains.dokka.base.signatures.KotlinSignatureProvider import org.jetbrains.dokka.base.signatures.SignatureProvider +import org.jetbrains.dokka.base.templating.Command import org.jetbrains.dokka.base.transformers.documentables.* import org.jetbrains.dokka.base.transformers.pages.annotations.SinceKotlinTransformer import org.jetbrains.dokka.base.transformers.pages.comments.CommentsToContentConverter @@ -37,6 +38,7 @@ class DokkaBase : DokkaPlugin() { val htmlPreprocessors by extensionPoint<PageTransformer>() val kotlinAnalysis by extensionPoint<KotlinAnalysis>() val tabSortingStrategy by extensionPoint<TabSortingStrategy>() + val templatingCommand by extensionPoint<Class<out Command>>() val descriptorToDocumentableTranslator by extending { CoreExtensions.sourceToDocumentableTranslator providing ::DefaultDescriptorToDocumentableTranslator diff --git a/plugins/base/src/main/kotlin/renderers/html/HtmlRenderer.kt b/plugins/base/src/main/kotlin/renderers/html/HtmlRenderer.kt index 9fbecad3..661e1e58 100644 --- a/plugins/base/src/main/kotlin/renderers/html/HtmlRenderer.kt +++ b/plugins/base/src/main/kotlin/renderers/html/HtmlRenderer.kt @@ -13,6 +13,7 @@ import org.jetbrains.dokka.base.renderers.isImage import org.jetbrains.dokka.base.renderers.pageId import org.jetbrains.dokka.base.resolvers.anchors.SymbolAnchorHint import org.jetbrains.dokka.base.resolvers.local.DokkaBaseLocationProvider +import org.jetbrains.dokka.base.templating.ResolveLinkCommand import org.jetbrains.dokka.links.DRI import org.jetbrains.dokka.model.DisplaySourceSet import org.jetbrains.dokka.model.properties.PropertyContainer @@ -657,8 +658,7 @@ open class HtmlRenderer( buildLink(address) { buildText(node.children, pageContext, sourceSetRestriction) } - } ?: span { - attributes["data-unresolved-link"] = node.address.toString().htmlEscape() + } ?: templateCommand(ResolveLinkCommand(node.address)) { buildText(node.children, pageContext, sourceSetRestriction) } diff --git a/plugins/base/src/main/kotlin/renderers/html/Tags.kt b/plugins/base/src/main/kotlin/renderers/html/Tags.kt index a3951eff..67eed686 100644 --- a/plugins/base/src/main/kotlin/renderers/html/Tags.kt +++ b/plugins/base/src/main/kotlin/renderers/html/Tags.kt @@ -1,12 +1,21 @@ package org.jetbrains.dokka.base.renderers.html import kotlinx.html.* +import org.jetbrains.dokka.base.templating.Command +import org.jetbrains.dokka.base.templating.toJsonString @HtmlTagMarker -fun FlowOrPhrasingContent.wbr(classes : String? = null, block : WBR.() -> Unit = {}) : Unit = WBR(attributesMapOf("class", classes), consumer).visit(block) +fun FlowOrPhrasingContent.wbr(classes: String? = null, block: WBR.() -> Unit = {}): Unit = + WBR(attributesMapOf("class", classes), consumer).visit(block) @Suppress("unused") -open class WBR(initialAttributes : Map<String, String>, override val consumer : TagConsumer<*>) : HTMLTag("wbr", consumer, initialAttributes, null, true, false), - HtmlBlockInlineTag { +open class WBR(initialAttributes: Map<String, String>, consumer: TagConsumer<*>) : + HTMLTag("wbr", consumer, initialAttributes, namespace = null, inlineTag = true, emptyTag = false), + HtmlBlockInlineTag -}
\ No newline at end of file +fun FlowOrPhrasingContent.templateCommand(data: Command, block: TemplateCommand.() -> Unit = {}):Unit = + TemplateCommand(attributesMapOf("data", toJsonString(data)), consumer).visit(block) + +class TemplateCommand(initialAttributes: Map<String, String>, consumer: TagConsumer<*>) : + HTMLTag("dokka-template-command", consumer, initialAttributes, namespace = null, inlineTag = true, emptyTag = false), + CommonAttributeGroupFacadeFlowInteractivePhrasingContent diff --git a/plugins/base/src/main/kotlin/templating/Command.kt b/plugins/base/src/main/kotlin/templating/Command.kt new file mode 100644 index 00000000..e352ba32 --- /dev/null +++ b/plugins/base/src/main/kotlin/templating/Command.kt @@ -0,0 +1,9 @@ +package org.jetbrains.dokka.base.templating + +import com.fasterxml.jackson.annotation.JsonSubTypes +import com.fasterxml.jackson.annotation.JsonSubTypes.Type +import com.fasterxml.jackson.annotation.JsonTypeInfo +import com.fasterxml.jackson.annotation.JsonTypeInfo.Id.CLASS + +@JsonTypeInfo(use= CLASS) +interface Command diff --git a/plugins/base/src/main/kotlin/templating/ResolveLinkCommand.kt b/plugins/base/src/main/kotlin/templating/ResolveLinkCommand.kt new file mode 100644 index 00000000..83b7e0d8 --- /dev/null +++ b/plugins/base/src/main/kotlin/templating/ResolveLinkCommand.kt @@ -0,0 +1,6 @@ +package org.jetbrains.dokka.base.templating + +import com.fasterxml.jackson.annotation.JsonTypeInfo +import org.jetbrains.dokka.links.DRI + +class ResolveLinkCommand(val dri: DRI): Command diff --git a/plugins/base/src/main/kotlin/templating/jsonMapperForPlugins.kt b/plugins/base/src/main/kotlin/templating/jsonMapperForPlugins.kt new file mode 100644 index 00000000..9b656309 --- /dev/null +++ b/plugins/base/src/main/kotlin/templating/jsonMapperForPlugins.kt @@ -0,0 +1,56 @@ +package org.jetbrains.dokka.base.templating + +import com.fasterxml.jackson.core.JsonGenerator +import com.fasterxml.jackson.databind.DeserializationFeature +import com.fasterxml.jackson.databind.SerializerProvider +import com.fasterxml.jackson.databind.module.SimpleModule +import com.fasterxml.jackson.databind.ser.std.StdScalarSerializer +import com.fasterxml.jackson.databind.type.TypeFactory +import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper +import com.fasterxml.jackson.module.kotlin.jacksonTypeRef +import org.jetbrains.dokka.base.DokkaBase +import java.io.File + +// THIS IS COPIED FROM BASE SINCE IT NEEDS TO BE INSTANTIATED ON THE SAME CLASS LOADER AS PLUGINS + +private val objectMapper = run { + val module = SimpleModule().apply { + addSerializer(FileSerializer) + } + jacksonObjectMapper() + .apply { + typeFactory = PluginTypeFactory() + } + .registerModule(module) + .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) +} + +@PublishedApi +internal class TypeReference<T> private constructor( + internal val jackson: com.fasterxml.jackson.core.type.TypeReference<T> +) { + companion object { + internal inline operator fun <reified T> invoke(): TypeReference<T> = TypeReference(jacksonTypeRef()) + } +} + +fun toJsonString(value: Any): String = objectMapper.writeValueAsString(value) + +inline fun <reified T : Any> parseJson(json: String): T = parseJson(json, TypeReference()) + + +@PublishedApi +internal fun <T : Any> parseJson(json: String, typeReference: TypeReference<T>): T = + objectMapper.readValue(json, typeReference.jackson) + + +private object FileSerializer : StdScalarSerializer<File>(File::class.java) { + override fun serialize(value: File, g: JsonGenerator, provider: SerializerProvider) { + g.writeString(value.path) + } +} + +private class PluginTypeFactory: TypeFactory(null) { + override fun findClass(className: String): Class<out Any>? = + Class.forName(className, true, DokkaBase::class.java.classLoader) ?: super.findClass(className) +}
\ No newline at end of file |