Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add member icons to navigation menu (#2578)
- Loading branch information
1 parent
26dde5b
commit 7a875ee
Showing
25 changed files
with
757 additions
and
538 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
90 changes: 90 additions & 0 deletions
90
plugins/base/src/main/kotlin/renderers/html/NavigationDataProvider.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,90 @@ | ||
package org.jetbrains.dokka.base.renderers.html | ||
|
||
import org.jetbrains.dokka.base.renderers.sourceSets | ||
import org.jetbrains.dokka.base.transformers.documentables.isException | ||
import org.jetbrains.dokka.base.translators.documentables.DocumentableLanguage | ||
import org.jetbrains.dokka.base.translators.documentables.documentableLanguage | ||
import org.jetbrains.dokka.model.* | ||
import org.jetbrains.dokka.pages.* | ||
|
||
abstract class NavigationDataProvider { | ||
open fun navigableChildren(input: RootPageNode): NavigationNode = input.withDescendants() | ||
.first { it is ModulePage || it is MultimoduleRootPage }.let { visit(it as ContentPage) } | ||
|
||
open fun visit(page: ContentPage): NavigationNode = | ||
NavigationNode( | ||
name = page.displayableName(), | ||
dri = page.dri.first(), | ||
sourceSets = page.sourceSets(), | ||
icon = chooseNavigationIcon(page), | ||
children = page.navigableChildren() | ||
) | ||
|
||
/** | ||
* Parenthesis is applied in 1 case: | ||
* - page only contains functions (therefore documentable from this page is [DFunction]) | ||
*/ | ||
private fun ContentPage.displayableName(): String = | ||
if (this is WithDocumentables && documentables.all { it is DFunction }) { | ||
"$name()" | ||
} else { | ||
name | ||
} | ||
|
||
private fun chooseNavigationIcon(contentPage: ContentPage): NavigationNodeIcon? { | ||
return if (contentPage is WithDocumentables) { | ||
val documentable = contentPage.documentables.firstOrNull() | ||
val isJava = documentable?.hasAnyJavaSources() ?: false | ||
|
||
when (documentable) { | ||
is DClass -> when { | ||
documentable.isException -> NavigationNodeIcon.EXCEPTION | ||
documentable.isAbstract() -> { | ||
if (isJava) NavigationNodeIcon.ABSTRACT_CLASS else NavigationNodeIcon.ABSTRACT_CLASS_KT | ||
} | ||
else -> if (isJava) NavigationNodeIcon.CLASS else NavigationNodeIcon.CLASS_KT | ||
} | ||
is DFunction -> NavigationNodeIcon.FUNCTION | ||
is DProperty -> { | ||
val isVar = documentable.extra[IsVar] != null | ||
if (isVar) NavigationNodeIcon.VAR else NavigationNodeIcon.VAL | ||
} | ||
is DInterface -> if (isJava) NavigationNodeIcon.INTERFACE else NavigationNodeIcon.INTERFACE_KT | ||
is DEnum, | ||
is DEnumEntry -> if (isJava) NavigationNodeIcon.ENUM_CLASS else NavigationNodeIcon.ENUM_CLASS_KT | ||
is DAnnotation -> { | ||
if (isJava) NavigationNodeIcon.ANNOTATION_CLASS else NavigationNodeIcon.ANNOTATION_CLASS_KT | ||
} | ||
is DObject -> NavigationNodeIcon.OBJECT | ||
else -> null | ||
} | ||
} else { | ||
null | ||
} | ||
} | ||
|
||
private fun Documentable.hasAnyJavaSources(): Boolean { | ||
val withSources = this as? WithSources ?: return false | ||
return this.sourceSets.any { withSources.documentableLanguage(it) == DocumentableLanguage.JAVA } | ||
} | ||
|
||
private fun DClass.isAbstract(): Boolean { | ||
return modifier.values.all { it is KotlinModifier.Abstract || it is JavaModifier.Abstract } | ||
} | ||
|
||
private fun ContentPage.navigableChildren(): List<NavigationNode> { | ||
return if (this !is ClasslikePageNode) { | ||
children | ||
.filterIsInstance<ContentPage>() | ||
.map { visit(it) } | ||
.sortedBy { it.name.toLowerCase() } | ||
} else if (documentables.any { it is DEnum }) { | ||
// no sorting for enum entries, should be the same as in source code | ||
children | ||
.filter { child -> child is WithDocumentables && child.documentables.any { it is DEnumEntry } } | ||
.map { visit(it as ContentPage) } | ||
} else { | ||
emptyList() | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
22 changes: 22 additions & 0 deletions
22
plugins/base/src/main/resources/dokka/images/nav-icons/abstract-class-kotlin.svg
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
20 changes: 20 additions & 0 deletions
20
plugins/base/src/main/resources/dokka/images/nav-icons/abstract-class.svg
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Oops, something went wrong.