diff options
Diffstat (limited to 'plugins/xml/src/main/kotlin/XmlPlugin.kt')
-rw-r--r-- | plugins/xml/src/main/kotlin/XmlPlugin.kt | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/plugins/xml/src/main/kotlin/XmlPlugin.kt b/plugins/xml/src/main/kotlin/XmlPlugin.kt new file mode 100644 index 00000000..e19b76b3 --- /dev/null +++ b/plugins/xml/src/main/kotlin/XmlPlugin.kt @@ -0,0 +1,63 @@ +package org.jetbrains.dokka.xml + +import org.jetbrains.dokka.CoreExtensions +import org.jetbrains.dokka.model.Documentable +import org.jetbrains.dokka.model.dfs +import org.jetbrains.dokka.pages.* +import org.jetbrains.dokka.plugability.DokkaContext +import org.jetbrains.dokka.plugability.DokkaPlugin +import org.jetbrains.dokka.plugability.single +import org.jetbrains.dokka.transformers.descriptors.XMLMega +import org.jetbrains.dokka.transformers.pages.PageNodeTransformer + +class XmlPlugin : DokkaPlugin() { + val transformer by extending { + CoreExtensions.pageTransformer providing ::XmlTransformer + } +} + +class XmlTransformer(private val dokkaContext: DokkaContext) : PageNodeTransformer { + private val commentsToContentConverter by lazy { dokkaContext.single(CoreExtensions.commentsToContentConverter) } + + enum class XMLKind : Kind { + Main, XmlList + } + + override fun invoke(input: RootPageNode): RootPageNode = + input.transformPageNodeTree { if (it is ModulePageNode) transformModule(it) else it } + + private fun transformModule(module: ModulePageNode) = module.transformContentPagesTree { node -> + if (node !is ClasslikePageNode) node + else { + val refs = + node.documentable?.extra?.filterIsInstance<XMLMega>()?.filter { it.key == "@attr ref" } + .orEmpty() + val elementsToAdd = mutableListOf<Documentable>() + + refs.forEach { ref -> + module.documentable?.dfs { it.dri == ref.dri }?.let { elementsToAdd.add(it) } + } + val platformData = node.platforms().toSet() + val refTable = DefaultPageContentBuilder.group( + node.dri, + platformData, + XMLKind.XmlList, + commentsToContentConverter, + dokkaContext.logger + ) { + block("XML Attributes", 2, XMLKind.XmlList, elementsToAdd, platformData) { element -> + link(element.dri, XMLKind.XmlList) { + text(element.name ?: "<unnamed>", XMLKind.Main) + } + text(element.briefDocTagString, XMLKind.XmlList) + } + } + + val content = node.content as ContentGroup + val children = (node.content as ContentGroup).children + node.modified(content = content.copy(children = children + refTable)) + } + } + + private fun ContentPage.platforms() = this.content.platforms.toList() +}
\ No newline at end of file |