From 04cf1cdd3a909fa62e5ffda5b7d04695c749177e Mon Sep 17 00:00:00 2001 From: Marcin Aman Date: Thu, 9 Jul 2020 10:45:06 +0200 Subject: Implement javadoc search --- .../src/main/kotlin/javadoc/JavadocPageCreator.kt | 34 +- .../main/kotlin/javadoc/pages/JavadocIndexExtra.kt | 10 + .../main/kotlin/javadoc/pages/JavadocPageNodes.kt | 41 +- .../main/kotlin/javadoc/pages/htmlPreprocessors.kt | 7 +- .../renderer/JavadocContentToHtmlTranslator.kt | 22 +- .../JavadocContentToTemplateMapTranslator.kt | 13 +- .../javadoc/renderer/KorteJavadocRenderer.kt | 9 +- .../javadoc/renderer/SearchScriptsCreator.kt | 261 + .../jquery/jszip-utils/dist/jszip-utils-ie.js | 56 - .../jquery/jszip-utils/dist/jszip-utils-ie.min.js | 10 - .../jquery/jszip-utils/dist/jszip-utils.js | 118 - .../jquery/jszip-utils/dist/jszip-utils.min.js | 10 - .../static_res/jquery/jszip/dist/jszip.js | 11623 ------------------- .../static_res/jquery/jszip/dist/jszip.min.js | 15 - .../resources/static_res/package-search-index.js | 1 - .../src/main/resources/static_res/script.js | 139 - .../src/main/resources/static_res/search.js | 208 + .../src/main/resources/views/components/base.korte | 5 +- .../src/main/resources/views/components/head.korte | 16 +- .../resources/views/components/pageStart.korte | 1 - .../main/resources/views/components/subNav.korte | 2 +- .../javadoc/AbstractJavadocTemplateMapTest.kt | 7 +- .../javadoc/search/JavadocIndexSearchTest.kt | 59 + 23 files changed, 641 insertions(+), 12026 deletions(-) create mode 100644 plugins/javadoc/src/main/kotlin/javadoc/pages/JavadocIndexExtra.kt create mode 100644 plugins/javadoc/src/main/kotlin/javadoc/renderer/SearchScriptsCreator.kt delete mode 100644 plugins/javadoc/src/main/resources/static_res/jquery/jszip-utils/dist/jszip-utils-ie.js delete mode 100644 plugins/javadoc/src/main/resources/static_res/jquery/jszip-utils/dist/jszip-utils-ie.min.js delete mode 100644 plugins/javadoc/src/main/resources/static_res/jquery/jszip-utils/dist/jszip-utils.js delete mode 100644 plugins/javadoc/src/main/resources/static_res/jquery/jszip-utils/dist/jszip-utils.min.js delete mode 100644 plugins/javadoc/src/main/resources/static_res/jquery/jszip/dist/jszip.js delete mode 100644 plugins/javadoc/src/main/resources/static_res/jquery/jszip/dist/jszip.min.js delete mode 100644 plugins/javadoc/src/main/resources/static_res/package-search-index.js delete mode 100644 plugins/javadoc/src/main/resources/static_res/script.js create mode 100644 plugins/javadoc/src/main/resources/static_res/search.js create mode 100644 plugins/javadoc/src/test/kotlin/javadoc/search/JavadocIndexSearchTest.kt (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 6fe18001..7420f78e 100644 --- a/plugins/javadoc/src/main/kotlin/javadoc/JavadocPageCreator.kt +++ b/plugins/javadoc/src/main/kotlin/javadoc/JavadocPageCreator.kt @@ -4,11 +4,11 @@ import javadoc.pages.* import org.jetbrains.dokka.DokkaConfiguration.DokkaSourceSet import org.jetbrains.dokka.Platform import org.jetbrains.dokka.base.signatures.SignatureProvider -import org.jetbrains.dokka.base.signatures.function import org.jetbrains.dokka.base.transformers.pages.comments.CommentsToContentConverter 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.Index import org.jetbrains.dokka.model.doc.Param import org.jetbrains.dokka.model.doc.TagWrapper import org.jetbrains.dokka.model.properties.PropertyContainer @@ -51,7 +51,8 @@ open class JavadocPageCreator( it.dri, it.name, signatureForNode(it, jvm), - it.descriptionToContentNodes(jvm) + it.descriptionToContentNodes(jvm), + PropertyContainer.withAll(it.indexesInDocumentation()) ) }.orEmpty(), classlikes = c.classlikes.mapNotNull { pageForClasslike(it) }, @@ -60,11 +61,12 @@ open class JavadocPageCreator( it.dri, it.name, signatureForNode(it, jvm), - it.descriptionToContentNodes(jvm) + it.descriptionToContentNodes(jvm), + PropertyContainer.withAll(it.indexesInDocumentation()) ) }, documentable = c, - extras = (c as? WithExtraProperties)?.extra ?: PropertyContainer.empty() + extra = ((c as? WithExtraProperties)?.extra ?: PropertyContainer.empty()) + c.indexesInDocumentation() ) } @@ -148,11 +150,12 @@ open class JavadocPageCreator( type = type, description = it.brief(), typeBound = it.type, - dri = it.dri + dri = it.dri, + extra = PropertyContainer.withAll(it.indexesInDocumentation()) ) } }, - extras = extra + extra = extra + indexesInDocumentation() ) } @@ -212,5 +215,24 @@ open class JavadocPageCreator( private fun signatureForNode(documentable: Documentable, sourceSet: DokkaSourceSet): JavadocSignatureContentNode = signatureProvider.signature(documentable).nodeForJvm(sourceSet).asJavadocNode() + + private fun Documentable.indexesInDocumentation(): JavadocIndexExtra { + val indexes = documentation[highestJvmSourceSet]?.withDescendants()?.filterIsInstance()?.toList().orEmpty() + return JavadocIndexExtra( + indexes.map { + ContentGroup( + children = DocTagToContentConverter.buildContent( + it, + DCI(setOf(dri), JavadocContentKind.OverviewSummary), + sourceSets.toSet() + ), + dci = DCI(setOf(dri), JavadocContentKind.OverviewSummary), + sourceSets = sourceSets.toSet(), + style = emptySet(), + extra = PropertyContainer.empty() + ) + } + ) + } } diff --git a/plugins/javadoc/src/main/kotlin/javadoc/pages/JavadocIndexExtra.kt b/plugins/javadoc/src/main/kotlin/javadoc/pages/JavadocIndexExtra.kt new file mode 100644 index 00000000..3ae04cae --- /dev/null +++ b/plugins/javadoc/src/main/kotlin/javadoc/pages/JavadocIndexExtra.kt @@ -0,0 +1,10 @@ +package javadoc.pages + +import org.jetbrains.dokka.model.Documentable +import org.jetbrains.dokka.model.properties.ExtraProperty +import org.jetbrains.dokka.pages.ContentNode + +data class JavadocIndexExtra(val index: List) : ExtraProperty { + override val key: ExtraProperty.Key = JavadocIndexExtra + companion object : ExtraProperty.Key +} \ No newline at end of file diff --git a/plugins/javadoc/src/main/kotlin/javadoc/pages/JavadocPageNodes.kt b/plugins/javadoc/src/main/kotlin/javadoc/pages/JavadocPageNodes.kt index 216b9319..daa4fda5 100644 --- a/plugins/javadoc/src/main/kotlin/javadoc/pages/JavadocPageNodes.kt +++ b/plugins/javadoc/src/main/kotlin/javadoc/pages/JavadocPageNodes.kt @@ -9,6 +9,7 @@ import org.jetbrains.dokka.base.renderers.sourceSets import org.jetbrains.dokka.links.DRI import org.jetbrains.dokka.model.* import org.jetbrains.dokka.model.properties.PropertyContainer +import org.jetbrains.dokka.model.properties.WithExtraProperties import org.jetbrains.dokka.pages.* import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.ClassKind @@ -17,6 +18,11 @@ import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstance interface JavadocPageNode : ContentPage +interface WithJavadocExtra : WithExtraProperties { + override fun withNewExtras(newExtras: PropertyContainer): T = + throw IllegalStateException("Merging extras is not applicable for javadoc") +} + class JavadocModulePageNode( override val name: String, override val content: JavadocContentNode, @@ -85,23 +91,26 @@ data class JavadocEntryNode( override val dri: DRI, val name: String, val signature: JavadocSignatureContentNode, - val brief: List -): AnchorableJavadocNode(dri) + val brief: List, + override val extra: PropertyContainer = PropertyContainer.empty() +): AnchorableJavadocNode(dri), WithJavadocExtra data class JavadocParameterNode( override val dri: DRI, val name: String, val type: ContentNode, val description: List, - val typeBound: Bound -): AnchorableJavadocNode(dri) + val typeBound: Bound, + override val extra: PropertyContainer = PropertyContainer.empty() +): AnchorableJavadocNode(dri), WithJavadocExtra data class JavadocPropertyNode( override val dri: DRI, val name: String, val signature: JavadocSignatureContentNode, - val brief: List -): AnchorableJavadocNode(dri) + val brief: List, + override val extra: PropertyContainer = PropertyContainer.empty() +): AnchorableJavadocNode(dri), WithJavadocExtra data class JavadocFunctionNode( val signature: JavadocSignatureContentNode, @@ -109,8 +118,16 @@ data class JavadocFunctionNode( val parameters: List, val name: String, override val dri: DRI, - val extras: PropertyContainer = PropertyContainer.empty() -): AnchorableJavadocNode(dri) + override val extra: PropertyContainer = PropertyContainer.empty() +): AnchorableJavadocNode(dri), WithJavadocExtra { + val isInherited: Boolean + get() { + val extra = extra[InheritedFunction] + return extra?.inheritedFrom?.keys?.firstOrNull { it.analysisPlatform == Platform.jvm }?.let { jvm -> + extra.isInherited(jvm) + } ?: false + } +} class JavadocClasslikePageNode( override val name: String, @@ -126,8 +143,8 @@ class JavadocClasslikePageNode( override val documentable: Documentable? = null, override val children: List = emptyList(), override val embeddedResources: List = listOf(), - val extras: PropertyContainer, -) : JavadocPageNode { + override val extra: PropertyContainer = PropertyContainer.empty(), +) : JavadocPageNode, WithJavadocExtra { val kind: String? = documentable?.kind() val packageName = dri.first().packageName @@ -149,7 +166,7 @@ class JavadocClasslikePageNode( documentable, children, embeddedResources, - extras + extra ) override fun modified( @@ -173,7 +190,7 @@ class JavadocClasslikePageNode( documentable, children, embeddedResources, - extras + extra ) } diff --git a/plugins/javadoc/src/main/kotlin/javadoc/pages/htmlPreprocessors.kt b/plugins/javadoc/src/main/kotlin/javadoc/pages/htmlPreprocessors.kt index 3ccd1d71..18096ad4 100644 --- a/plugins/javadoc/src/main/kotlin/javadoc/pages/htmlPreprocessors.kt +++ b/plugins/javadoc/src/main/kotlin/javadoc/pages/htmlPreprocessors.kt @@ -35,7 +35,12 @@ object TreeViewInstaller : PageTransformer { root = root ) - return node.modified(children = node.children.map { node -> install(node, root) } + overviewTree) as JavadocModulePageNode + return node.modified(children = node.children.map { node -> + install( + node, + root + ) + } + overviewTree) as JavadocModulePageNode } private fun installPackageTreeNode(node: JavadocPackagePageNode, root: RootPageNode): JavadocPackagePageNode { diff --git a/plugins/javadoc/src/main/kotlin/javadoc/renderer/JavadocContentToHtmlTranslator.kt b/plugins/javadoc/src/main/kotlin/javadoc/renderer/JavadocContentToHtmlTranslator.kt index aeff192a..ceb6f9ad 100644 --- a/plugins/javadoc/src/main/kotlin/javadoc/renderer/JavadocContentToHtmlTranslator.kt +++ b/plugins/javadoc/src/main/kotlin/javadoc/renderer/JavadocContentToHtmlTranslator.kt @@ -4,6 +4,7 @@ import javadoc.location.JavadocLocationProvider import javadoc.pages.JavadocSignatureContentNode import org.jetbrains.dokka.pages.* import org.jetbrains.dokka.plugability.DokkaContext +import org.jetbrains.dokka.utilities.formatToEndWithHtml import org.jetbrains.dokka.utilities.htmlEscape internal class JavadocContentToHtmlTranslator( @@ -13,21 +14,30 @@ internal class JavadocContentToHtmlTranslator( fun htmlForContentNode(node: ContentNode, relative: PageNode?): String = when (node) { - is ContentGroup -> htmlForContentNodes(node.children, relative) - is ContentText -> node.text.htmlEscape() + is ContentGroup -> htmlForContentNodes(node.children, node.style, relative) + is ContentText -> buildText(node) is ContentDRILink -> buildLink( locationProvider.resolve(node.address, node.sourceSets, relative), - htmlForContentNodes(node.children, relative) + htmlForContentNodes(node.children, node.style, relative) ) - is ContentResolvedLink -> buildLink(node.address, htmlForContentNodes(node.children, relative)) + is ContentResolvedLink -> buildLink(node.address, htmlForContentNodes(node.children, node.style, relative)) is ContentCode -> htmlForCode(node.children) is JavadocSignatureContentNode -> htmlForSignature(node, relative) else -> "" } - fun htmlForContentNodes(list: List, relative: PageNode?) = + fun htmlForContentNodes(list: List, styles: Set