From ca3bf30d821138e17659c22b19e29261e386932c Mon Sep 17 00:00:00 2001 From: IgnatBeresnev Date: Wed, 27 Jul 2022 15:54:25 +0200 Subject: [PATCH 1/2] Make current breadcrumb element not clickable and of default font color --- .../src/main/kotlin/renderers/html/HtmlRenderer.kt | 14 ++++++++++++-- .../base/src/main/resources/dokka/styles/style.css | 4 ++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/plugins/base/src/main/kotlin/renderers/html/HtmlRenderer.kt b/plugins/base/src/main/kotlin/renderers/html/HtmlRenderer.kt index 9be7428a8a..773d952965 100644 --- a/plugins/base/src/main/kotlin/renderers/html/HtmlRenderer.kt +++ b/plugins/base/src/main/kotlin/renderers/html/HtmlRenderer.kt @@ -635,8 +635,18 @@ open class HtmlRenderer( } private fun FlowContent.buildNavigationElement(node: PageNode, page: PageNode) = - if (node.isNavigable) buildLink(node, page) - else text(node.name) + if (node.isNavigable) { + val isCurrentPage = (node == page) + if (isCurrentPage) { + span(classes = "current") { + text(node.name) + } + } else { + buildLink(node, page) + } + } else { + text(node.name) + } private fun FlowContent.buildLink(to: PageNode, from: PageNode) = locationProvider.resolve(to, from)?.let { path -> diff --git a/plugins/base/src/main/resources/dokka/styles/style.css b/plugins/base/src/main/resources/dokka/styles/style.css index 9bc9f07d03..a9c6e327f9 100644 --- a/plugins/base/src/main/resources/dokka/styles/style.css +++ b/plugins/base/src/main/resources/dokka/styles/style.css @@ -150,6 +150,10 @@ html ::-webkit-scrollbar-thumb { margin: auto 2px; } +.breadcrumbs .current { + color: var(--default-font-color); +} + .tabs-section > .section-tab:first-child, .platform-hinted > .platform-bookmarks-row > .platform-bookmark:first-child { margin-left: 0; From 8eea1f143edca3f30cef0c5de80460867f4d7211 Mon Sep 17 00:00:00 2001 From: IgnatBeresnev Date: Wed, 27 Jul 2022 16:19:58 +0200 Subject: [PATCH 2/2] Add simple tests for breadcrumbs --- .../kotlin/renderers/html/BreadcrumbsTest.kt | 84 +++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 plugins/base/src/test/kotlin/renderers/html/BreadcrumbsTest.kt diff --git a/plugins/base/src/test/kotlin/renderers/html/BreadcrumbsTest.kt b/plugins/base/src/test/kotlin/renderers/html/BreadcrumbsTest.kt new file mode 100644 index 0000000000..bebc41dcde --- /dev/null +++ b/plugins/base/src/test/kotlin/renderers/html/BreadcrumbsTest.kt @@ -0,0 +1,84 @@ +package renderers.html + +import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest +import org.jsoup.nodes.Element +import org.junit.jupiter.api.Test +import signatures.renderedContent +import utils.* + +class BreadcrumbsTest : BaseAbstractTest() { + + private val configuration = dokkaConfiguration { + sourceSets { + sourceSet { + sourceRoots = listOf("src/") + } + } + } + + @Test + fun `should add breadcrumbs with current element`() { + val writerPlugin = TestOutputWriterPlugin() + testInline( + """ + |/src/main/kotlin/basic/TestClass.kt + |package testpackage + | + |class TestClass { + | fun foo() {} + |} + """.trimMargin(), + configuration, + pluginOverrides = listOf(writerPlugin) + ) { + renderingStage = { _, _ -> + writerPlugin.writer.renderedContent("root/testpackage/-test-class/foo.html").selectBreadcrumbs().match( + link("root"), + delimiter(), + link("testpackage"), + delimiter(), + link("TestClass"), + delimiter(), + current("foo"), + ignoreSpanWithTokenStyle = true + ) + } + } + } + + @Test + fun `should mark only one element as current even if more elements have the same name`() { + val writerPlugin = TestOutputWriterPlugin() + testInline( + """ + |/src/main/kotlin/basic/TestClass.kt + |package testpackage + | + |class testname { + | val testname: String = "" + |} + """.trimMargin(), + configuration, + pluginOverrides = listOf(writerPlugin) + ) { + renderingStage = { _, _ -> + writerPlugin.writer.renderedContent("root/testpackage/testname/testname.html").selectBreadcrumbs().match( + link("root"), + delimiter(), + link("testpackage"), + delimiter(), + link("testname"), + delimiter(), + current("testname"), + ignoreSpanWithTokenStyle = true + ) + } + } + } + + private fun Element.selectBreadcrumbs() = this.select("div.breadcrumbs").single() + + private fun link(text: String): Tag = A(text) + private fun delimiter(): Tag = Span().withClasses("delimiter") + private fun current(text: String): Tag = Span(text).withClasses("current") +}