From 43957996a2c530d7c22e00d841af9ad349cbf70a Mon Sep 17 00:00:00 2001 From: Andrzej Ratajczak Date: Fri, 10 Jul 2020 15:20:13 +0200 Subject: Fix rendering of classlikes on packages page --- .../src/main/kotlin/javadoc/JavadocPageCreator.kt | 49 +++++++++++++++------- .../kotlin/javadoc/pages/JavadocContentNodes.kt | 42 ++++++++++++++++--- .../JavadocContentToTemplateMapTranslator.kt | 11 ++++- .../resources/views/components/indexPage.korte | 20 +++++++-- .../resources/views/components/indexTable.korte | 6 ++- .../javadoc/JavadocPackageTemplateMapTest.kt | 10 ++--- 6 files changed, 107 insertions(+), 31 deletions(-) (limited to 'plugins/javadoc/src') diff --git a/plugins/javadoc/src/main/kotlin/javadoc/JavadocPageCreator.kt b/plugins/javadoc/src/main/kotlin/javadoc/JavadocPageCreator.kt index 1bafa111..b1549729 100644 --- a/plugins/javadoc/src/main/kotlin/javadoc/JavadocPageCreator.kt +++ b/plugins/javadoc/src/main/kotlin/javadoc/JavadocPageCreator.kt @@ -9,13 +9,13 @@ import org.jetbrains.dokka.base.transformers.pages.comments.CommentsToContentCon import org.jetbrains.dokka.base.transformers.pages.comments.DocTagToContentConverter import org.jetbrains.dokka.model.* import org.jetbrains.dokka.model.doc.Description -import org.jetbrains.dokka.model.doc.NamedTagWrapper import org.jetbrains.dokka.model.doc.Param import org.jetbrains.dokka.model.doc.TagWrapper import org.jetbrains.dokka.model.properties.PropertyContainer import org.jetbrains.dokka.model.properties.WithExtraProperties import org.jetbrains.dokka.pages.* import org.jetbrains.dokka.utilities.DokkaLogger +import kotlin.reflect.KClass open class JavadocPageCreator( commentsToContentConverter: CommentsToContentConverter, @@ -71,12 +71,16 @@ open class JavadocPageCreator( m.jvmSourceSets.toSet() ) { title(m.name, m.brief(), "0.0.1", dri = setOf(m.dri), kind = ContentKind.Main) - list("Packages", "Package", setOf(m.dri), ContentKind.Packages, m.packages.sortedBy { it.name }.map { p -> - RowJavadocListEntry( - LinkJavadocListEntry(p.name, setOf(p.dri), JavadocContentKind.PackageSummary, sourceSets), - p.brief() - ) - }) + leafList(setOf(m.dri), + ContentKind.Packages, JavadocList( + "Packages", "Package", + m.packages.sortedBy { it.name }.map { p -> + RowJavadocListEntry( + LinkJavadocListEntry(p.name, setOf(p.dri), JavadocContentKind.PackageSummary, sourceSets), + p.brief() + ) + } + )) } private fun contentForPackage(p: DPackage): JavadocContentNode = @@ -86,14 +90,30 @@ open class JavadocPageCreator( p.jvmSourceSets.toSet() ) { title(p.name, p.brief(), "0.0.1", dri = setOf(p.dri), kind = ContentKind.Packages) - list("Packages", "Package", setOf(p.dri), ContentKind.Packages, p.classlikes.sortedBy { it.name }.map { c -> - RowJavadocListEntry( - LinkJavadocListEntry(c.name.orEmpty(), setOf(c.dri), JavadocContentKind.Class, sourceSets), - c.brief() - ) - }) + val rootList = p.classlikes.groupBy { it::class }.map { (key, value) -> + JavadocList(key.tabTitle, key.colTitle, value.map { c -> + RowJavadocListEntry( + LinkJavadocListEntry(c.name ?: "", setOf(c.dri), JavadocContentKind.Class, sourceSets), + c.brief() + ) + }) + } + rootList(setOf(p.dri), JavadocContentKind.Class, rootList) } + private val KClass.colTitle: String + get() = when(this) { + DClass::class -> "Class" + DObject::class -> "Object" + DAnnotation::class -> "Annotation" + DEnum::class -> "Enum" + DInterface::class -> "Interface" + else -> "" + } + + private val KClass.tabTitle: String + get() = colTitle + if(colTitle.last() != 's') "s" else "es" + private fun contentForClasslike(c: DClasslike): JavadocContentNode = JavadocContentGroup( setOf(c.dri), @@ -181,7 +201,8 @@ open class JavadocPageCreator( briefFromContentNodes(paramsToContentNodes(sourceSet).dropWhile { it is ContentDRILink }) private fun ContentNode.asJavadocNode(): JavadocSignatureContentNode = - (this as ContentGroup).firstChildOfTypeOrNull() ?: throw IllegalStateException("No content for javadoc signature found") + (this as ContentGroup).firstChildOfTypeOrNull() + ?: throw IllegalStateException("No content for javadoc signature found") private fun signatureForNode(documentable: Documentable, sourceSet: DokkaSourceSet): JavadocSignatureContentNode = signatureProvider.signature(documentable).nodeForJvm(sourceSet).asJavadocNode() diff --git a/plugins/javadoc/src/main/kotlin/javadoc/pages/JavadocContentNodes.kt b/plugins/javadoc/src/main/kotlin/javadoc/pages/JavadocContentNodes.kt index 5e24ce9e..d83704a6 100644 --- a/plugins/javadoc/src/main/kotlin/javadoc/pages/JavadocContentNodes.kt +++ b/plugins/javadoc/src/main/kotlin/javadoc/pages/JavadocContentNodes.kt @@ -20,6 +20,12 @@ abstract class JavadocContentNode( override fun withNewExtras(newExtras: PropertyContainer): ContentNode = this } +interface JavadocList { + val tabTitle: String + val colTitle: String + val children: List +} + interface JavadocListEntry { val stringTag: String } @@ -86,7 +92,16 @@ fun JavaContentGroupBuilder.title( list.add(TitleNode(title, subtitle, version, parent, dri, kind, sourceSets)) } -class ListNode( +class RootListNode( + val entries: List, + val dri: Set, + val kind: Kind, + sourceSets: Set, +) : JavadocContentNode(dri, kind, sourceSets) { + override fun hasAnyContent(): Boolean = children.isNotEmpty() +} + +class LeafListNode( val tabTitle: String, val colTitle: String, val entries: List, @@ -97,16 +112,31 @@ class ListNode( override fun hasAnyContent(): Boolean = children.isNotEmpty() } -fun JavaContentGroupBuilder.list( - tabTitle: String, - colTitle: String, + +fun JavaContentGroupBuilder.rootList( + dri: Set, + kind: Kind, + rootList: List +) { + val children = rootList.map { + LeafListNode(it.tabTitle, it.colTitle, it.children, dri, kind, sourceSets) + } + list.add(RootListNode(children, dri, kind, sourceSets)) +} + +fun JavaContentGroupBuilder.leafList( dri: Set, kind: Kind, - children: List + leafList: JavadocList ) { - list.add(ListNode(tabTitle, colTitle, children, dri, kind, sourceSets)) + list.add(LeafListNode(leafList.tabTitle, leafList.colTitle, leafList.children, dri, kind, sourceSets)) } +fun JavadocList(tabTitle: String, colTitle: String, children: List) = object : JavadocList { + override val tabTitle = tabTitle + override val colTitle = colTitle + override val children = children +} class LinkJavadocListEntry( val name: String, diff --git a/plugins/javadoc/src/main/kotlin/javadoc/renderer/JavadocContentToTemplateMapTranslator.kt b/plugins/javadoc/src/main/kotlin/javadoc/renderer/JavadocContentToTemplateMapTranslator.kt index 760647fa..0c952fe9 100644 --- a/plugins/javadoc/src/main/kotlin/javadoc/renderer/JavadocContentToTemplateMapTranslator.kt +++ b/plugins/javadoc/src/main/kotlin/javadoc/renderer/JavadocContentToTemplateMapTranslator.kt @@ -114,7 +114,8 @@ internal class JavadocContentToTemplateMapTranslator( when (node) { is TitleNode -> templateMapForTitleNode(node) is JavadocContentGroup -> templateMapForJavadocContentGroup(node) - is ListNode -> templateMapForListNode(node) + is LeafListNode -> templateMapForLeafListNode(node) + is RootListNode -> templateMapForRootListNode(node) else -> emptyMap() } @@ -195,7 +196,7 @@ internal class JavadocContentToTemplateMapTranslator( } } - private fun templateMapForListNode(node: ListNode): TemplateMap { + private fun templateMapForLeafListNode(node: LeafListNode): TemplateMap { return mapOf( "tabTitle" to node.tabTitle, "colTitle" to node.colTitle, @@ -203,6 +204,12 @@ internal class JavadocContentToTemplateMapTranslator( ) } + private fun templateMapForRootListNode(node: RootListNode): TemplateMap { + return mapOf( + "lists" to node.entries.map { templateMapForLeafListNode(it) } + ) + } + private fun renderInlineParameter(parameter: JavadocParameterNode): String = htmlForContentNode(parameter.type, contextNode) + " ${parameter.name}" diff --git a/plugins/javadoc/src/main/resources/views/components/indexPage.korte b/plugins/javadoc/src/main/resources/views/components/indexPage.korte index 02b94b75..d22b89ea 100644 --- a/plugins/javadoc/src/main/resources/views/components/indexPage.korte +++ b/plugins/javadoc/src/main/resources/views/components/indexPage.korte @@ -9,8 +9,22 @@

See: Description

-
- {% include "components/indexTable.korte" %} -
+ {% if lists %} +
    + {% for item in lists%} +
  • + {% set list = item.list %} + {% set colTitle = item.colTitle %} + {% set tabTitle = item.tabTitle %} + {% set isTypeSummary = "true" %} + {% include "components/indexTable.korte" %} +
  • + {% endfor %} +
+ {% else %} +
+ {% include "components/indexTable.korte" %} +
+ {% endif %}
\ No newline at end of file diff --git a/plugins/javadoc/src/main/resources/views/components/indexTable.korte b/plugins/javadoc/src/main/resources/views/components/indexTable.korte index 9ee387e1..e1b507b9 100644 --- a/plugins/javadoc/src/main/resources/views/components/indexTable.korte +++ b/plugins/javadoc/src/main/resources/views/components/indexTable.korte @@ -1,4 +1,8 @@ - +{% if isTypeSummary %} +
+{% else %} +
+{% endif %} diff --git a/plugins/javadoc/src/test/kotlin/javadoc/JavadocPackageTemplateMapTest.kt b/plugins/javadoc/src/test/kotlin/javadoc/JavadocPackageTemplateMapTest.kt index bb53a571..a1b99ba0 100644 --- a/plugins/javadoc/src/test/kotlin/javadoc/JavadocPackageTemplateMapTest.kt +++ b/plugins/javadoc/src/test/kotlin/javadoc/JavadocPackageTemplateMapTest.kt @@ -28,13 +28,13 @@ internal class JavadocPackageTemplateMapTest : AbstractJavadocTemplateMapTest() """ ) { val map = singlePageOfType().templateMap - assertEquals("Packages", map["tabTitle"]) - assertEquals("Package", map["colTitle"]) + assertEquals("Classes", ((map["lists"] as List<*>).first() as Map)["tabTitle"]) + assertEquals("Class", ((map["lists"] as List<*>).first() as Map)["colTitle"]) assertEquals("com.test.package0", map["title"]) assertEquals("", map["subtitle"]) assertEquals("package", map["kind"]) - val list = assertIsInstance>(map["list"]) + val list = assertIsInstance>(((map["lists"] as List<*>).first() as Map)["list"]) val entry = assertIsInstance(list.single()) assertEquals("Test", entry.link.name) assertEquals(JavadocContentKind.Class, entry.link.kind) @@ -69,8 +69,8 @@ internal class JavadocPackageTemplateMapTest : AbstractJavadocTemplateMapTest() val packagePages = allPagesOfType() packagePages.forEach { page -> val map = page.templateMap - assertEquals("Packages", map["tabTitle"]) - assertEquals("Package", map["colTitle"]) + assertEquals("Classes", ((map["lists"] as List<*>).first() as Map)["tabTitle"]) + assertEquals("Class", ((map["lists"] as List<*>).first() as Map)["colTitle"]) assertEquals("", map["subtitle"]) assertEquals("package", map["kind"]) } -- cgit
{{ tabTitle }} 
{{ colTitle }}