diff options
Diffstat (limited to 'dokka-subprojects/plugin-mathjax/src/main')
2 files changed, 72 insertions, 0 deletions
diff --git a/dokka-subprojects/plugin-mathjax/src/main/kotlin/org/jetbrains/dokka/mathjax/MathjaxPlugin.kt b/dokka-subprojects/plugin-mathjax/src/main/kotlin/org/jetbrains/dokka/mathjax/MathjaxPlugin.kt new file mode 100644 index 00000000..2a7ed6a4 --- /dev/null +++ b/dokka-subprojects/plugin-mathjax/src/main/kotlin/org/jetbrains/dokka/mathjax/MathjaxPlugin.kt @@ -0,0 +1,67 @@ +/* + * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package org.jetbrains.dokka.mathjax + + +import org.jetbrains.dokka.CoreExtensions +import org.jetbrains.dokka.DokkaConfiguration +import org.jetbrains.dokka.base.DokkaBase +import org.jetbrains.dokka.base.transformers.pages.tags.CustomTagContentProvider +import org.jetbrains.dokka.base.translators.documentables.PageContentBuilder.DocumentableContentBuilder +import org.jetbrains.dokka.model.doc.CustomTagWrapper +import org.jetbrains.dokka.pages.ContentPage +import org.jetbrains.dokka.pages.RootPageNode +import org.jetbrains.dokka.pages.WithDocumentables +import org.jetbrains.dokka.plugability.DokkaPlugin +import org.jetbrains.dokka.plugability.DokkaPluginApiPreview +import org.jetbrains.dokka.plugability.Extension +import org.jetbrains.dokka.plugability.PluginApiPreviewAcknowledgement +import org.jetbrains.dokka.transformers.pages.PageTransformer + +public class MathjaxPlugin : DokkaPlugin() { + + public val transformer: Extension<PageTransformer, *, *> by extending { + CoreExtensions.pageTransformer with MathjaxTransformer + } + + public val mathjaxTagContentProvider: Extension<CustomTagContentProvider, *, *> by extending { + plugin<DokkaBase>().customTagContentProvider with MathjaxTagContentProvider order { + before(plugin<DokkaBase>().sinceKotlinTagContentProvider) + } + } + + @OptIn(DokkaPluginApiPreview::class) + override fun pluginApiPreviewAcknowledgement(): PluginApiPreviewAcknowledgement = + PluginApiPreviewAcknowledgement +} + +private const val ANNOTATION = "usesMathJax" +internal const val LIB_PATH = "https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.6/MathJax.js?config=TeX-AMS_SVG&latest" + +public object MathjaxTransformer : PageTransformer { + + override fun invoke(input: RootPageNode): RootPageNode = input.transformContentPagesTree { + it.modified( + embeddedResources = it.embeddedResources + if (it.isNeedingMathjax) listOf(LIB_PATH) else emptyList() + ) + } + + private val ContentPage.isNeedingMathjax + get() = (this as WithDocumentables).documentables.any { it.documentation.values + .flatMap { it.children } + .any { (it as? CustomTagWrapper)?.name == ANNOTATION } } +} + +public object MathjaxTagContentProvider : CustomTagContentProvider { + + override fun isApplicable(customTag: CustomTagWrapper): Boolean = customTag.name == ANNOTATION + + override fun DocumentableContentBuilder.contentForDescription( + sourceSet: DokkaConfiguration.DokkaSourceSet, + customTag: CustomTagWrapper + ) { + comment(customTag.root, sourceSets = setOf(sourceSet)) + } +} diff --git a/dokka-subprojects/plugin-mathjax/src/main/resources/META-INF/services/org.jetbrains.dokka.plugability.DokkaPlugin b/dokka-subprojects/plugin-mathjax/src/main/resources/META-INF/services/org.jetbrains.dokka.plugability.DokkaPlugin new file mode 100644 index 00000000..4a9d7a9e --- /dev/null +++ b/dokka-subprojects/plugin-mathjax/src/main/resources/META-INF/services/org.jetbrains.dokka.plugability.DokkaPlugin @@ -0,0 +1,5 @@ +# +# Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. +# + +org.jetbrains.dokka.mathjax.MathjaxPlugin |