Skip to content

Commit

Permalink
GFM renderer: cleanup paragraphs and tables
Browse files Browse the repository at this point in the history
  • Loading branch information
msink committed Jun 30, 2021
1 parent 1c930e3 commit 7676563
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 49 deletions.
5 changes: 5 additions & 0 deletions tools/dokka-mygfm/src/main/kotlin/GfmPlugin.kt
Expand Up @@ -6,6 +6,7 @@ import org.jetbrains.dokka.base.renderers.PackageListCreator
import org.jetbrains.dokka.base.renderers.RootCreator
import org.jetbrains.dokka.base.resolvers.shared.RecognizedLinkFormat
import org.jetbrains.dokka.gfm.location.MarkdownLocationProvider
import org.jetbrains.dokka.gfm.renderer.BriefCommentPreprocessor
import org.jetbrains.dokka.gfm.renderer.CommonmarkRenderer
import org.jetbrains.dokka.plugability.DokkaPlugin
import org.jetbrains.dokka.transformers.pages.PageTransformer
Expand All @@ -28,6 +29,10 @@ class GfmPlugin : DokkaPlugin() {
gfmPreprocessors with RootCreator
}

val briefCommentPreprocessor by extending {
gfmPreprocessors with BriefCommentPreprocessor()
}

val packageListCreator by extending {
(gfmPreprocessors
providing { PackageListCreator(it, RecognizedLinkFormat.DokkaGFM) }
Expand Down
@@ -0,0 +1,16 @@
package org.jetbrains.dokka.gfm.renderer

import org.jetbrains.dokka.pages.*
import org.jetbrains.dokka.transformers.pages.PageTransformer

class BriefCommentPreprocessor : PageTransformer {
override fun invoke(input: RootPageNode) = input.transformContentPagesTree { contentPage ->
contentPage.modified(content = contentPage.content.deepMapTransform<ContentGroup, ContentNode> {
if (it.dci.kind == ContentKind.BriefComment) {
it.copy(style = it.style + setOf(TextStyle.Block))
} else {
it
}
})
}
}
81 changes: 32 additions & 49 deletions tools/dokka-mygfm/src/main/kotlin/renderer/CommonmarkRenderer.kt
Expand Up @@ -26,11 +26,7 @@ open class CommonmarkRenderer(
childrenCallback: StringBuilder.() -> Unit
) {
return when {
node.hasStyle(TextStyle.Block) -> {
childrenCallback()
buildParagraph()
}
node.hasStyle(TextStyle.Paragraph) -> {
node.hasStyle(TextStyle.Block) || node.hasStyle(TextStyle.Paragraph) -> {
buildParagraph()
childrenCallback()
buildParagraph()
Expand All @@ -43,7 +39,7 @@ open class CommonmarkRenderer(
buildParagraph()
append("#".repeat(level) + " ")
content()
appendNewLine()
buildParagraph()
}

override fun StringBuilder.buildLink(address: String, content: StringBuilder.() -> Unit) {
Expand All @@ -57,7 +53,9 @@ open class CommonmarkRenderer(
pageContext: ContentPage,
sourceSetRestriction: Set<DisplaySourceSet>?
) {
buildParagraph()
buildListLevel(node, pageContext)
buildParagraph()
}

private fun StringBuilder.buildListItem(items: List<ContentNode>, pageContext: ContentPage) {
Expand Down Expand Up @@ -135,10 +133,11 @@ open class CommonmarkRenderer(
}.groupBy(Pair<DisplaySourceSet, String>::second, Pair<DisplaySourceSet, String>::first)

distinct.filter { it.key.isNotBlank() }.forEach { (text, platforms) ->
append(" ")
buildParagraph()
buildSourceSetTags(platforms.toSet())
append(" $text")
appendNewLine()
buildNewLine()
append(text.trim())
buildParagraph()
}
}
}
Expand Down Expand Up @@ -170,46 +169,40 @@ open class CommonmarkRenderer(
}
} else {
val size = node.header.firstOrNull()?.children?.size ?: node.children.firstOrNull()?.children?.size ?: 0
if (size <= 0) return

if (node.header.isNotEmpty()) {
node.header.forEach {
append("| ")
it.children.forEach {
append(" ")
append("| ")
it.build(this, pageContext, it.sourceSets)
append(" | ")
append(" ")
}
append("\n")
}
} else {
append("| ".repeat(size))
if (size > 0) {
append("|")
appendNewLine()
}
}
append("|")
appendNewLine()

append("|---".repeat(size))
if (size > 0) {
append("|")
appendNewLine()
}
append("|")
appendNewLine()

node.children.forEach {
val builder = StringBuilder()
it.children.forEach {
builder.append("| ")
builder.append("<a name=\"${it.dci.dri.first()}\"></a>")
builder.append(
buildString { it.build(this, pageContext) }.replace(
Regex("#+ "),
""
)
) // Workaround for headers inside tables
node.children.forEach { row ->
row.children.forEach { cell ->
append("| ")
append(buildString { cell.build(this, pageContext) }
.trim()
.replace("#+ ".toRegex(), "") // Workaround for headers inside tables
.replace("\\\n", "\n\n")
.replace("\n[\n]+".toRegex(), "<br>")
.replace("\n", " ")
)
append(" ")
}
append(builder.toString().withEntersAsHtml())
append("|".repeat(size + 1 - it.children.size))
append("\n")
append("|")
appendNewLine()
}
}
}
Expand Down Expand Up @@ -259,25 +252,22 @@ open class CommonmarkRenderer(
distinct.values.forEach { entry ->
val (instance, sourceSets) = entry.getInstanceAndSourceSets()

buildParagraph()
buildSourceSetTags(sourceSets)
buildNewLine()

instance.before?.let {
buildNewLine()
append("Brief description")
buildNewLine()
buildContentNode(
it,
pageContext,
sourceSets.first()
) // It's workaround to render content only once
buildParagraph()
}

buildNewLine()
append("Content")
entry.groupBy { buildString { buildContentNode(it.first.divergent, pageContext, setOf(it.second)) } }
.values.forEach { innerEntry ->
val (innerInstance, innerSourceSets) = innerEntry.getInstanceAndSourceSets()
buildNewLine()
if (sourceSets.size > 1) {
buildSourceSetTags(innerSourceSets)
buildNewLine()
Expand All @@ -287,12 +277,10 @@ open class CommonmarkRenderer(
pageContext,
setOf(innerSourceSets.first())
) // It's workaround to render content only once
buildParagraph()
}

instance.after?.let {
buildNewLine()
append("More info")
buildNewLine()
buildContentNode(
it,
pageContext,
Expand Down Expand Up @@ -358,11 +346,6 @@ open class CommonmarkRenderer(
}
}

private fun String.withEntersAsHtml(): String = this
.replace("\\\n", "\n\n")
.replace("\n[\n]+".toRegex(), "<br>")
.replace("\n", " ")

private fun List<Pair<ContentDivergentInstance, DisplaySourceSet>>.getInstanceAndSourceSets() =
this.let { Pair(it.first().first, it.map { it.second }.toSet()) }

Expand Down

0 comments on commit 7676563

Please sign in to comment.