diff options
author | Marcin Aman <marcin.aman@gmail.com> | 2021-07-09 16:38:05 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-07-09 16:38:05 +0200 |
commit | b616e2dde76b7424276b980785f08477815a52fd (patch) | |
tree | d282b2ae3ccb3a422270a07397507fb8c508ed84 /plugins/base/src | |
parent | fdf5eda3d22ef96f6760cdf80c2ca4d206dc396c (diff) | |
download | dokka-b616e2dde76b7424276b980785f08477815a52fd.tar.gz dokka-b616e2dde76b7424276b980785f08477815a52fd.tar.bz2 dokka-b616e2dde76b7424276b980785f08477815a52fd.zip |
Add missing text styles in html (#2007)
Diffstat (limited to 'plugins/base/src')
3 files changed, 98 insertions, 4 deletions
diff --git a/plugins/base/src/main/kotlin/renderers/html/HtmlRenderer.kt b/plugins/base/src/main/kotlin/renderers/html/HtmlRenderer.kt index 6d6f71fb..5a6f7c83 100644 --- a/plugins/base/src/main/kotlin/renderers/html/HtmlRenderer.kt +++ b/plugins/base/src/main/kotlin/renderers/html/HtmlRenderer.kt @@ -703,18 +703,37 @@ open class HtmlRenderer( } } - override fun FlowContent.buildText(textNode: ContentText) = + override fun FlowContent.buildText(textNode: ContentText) = buildText(textNode, textNode.style) + + private fun FlowContent.buildText(textNode: ContentText, unappliedStyles: Set<Style>) { when { textNode.extra[HtmlContent] != null -> { consumer.onTagContentUnsafe { raw(textNode.text) } } - textNode.hasStyle(TextStyle.Indented) -> { + unappliedStyles.contains(TextStyle.Indented) -> { consumer.onTagContentEntity(Entities.nbsp) - text(textNode.text) + buildText(textNode, unappliedStyles - TextStyle.Indented) + } + unappliedStyles.size == 1 && unappliedStyles.contains(TextStyle.Cover) -> buildBreakableText(textNode.text) + unappliedStyles.isNotEmpty() -> { + val styleToApply = unappliedStyles.first() + applyStyle(styleToApply){ + buildText(textNode, unappliedStyles - styleToApply) + } } - textNode.hasStyle(TextStyle.Cover) -> buildBreakableText(textNode.text) else -> text(textNode.text) } + } + + private inline fun FlowContent.applyStyle(styleToApply: Style, crossinline body: FlowContent.() -> Unit){ + when(styleToApply){ + TextStyle.Bold -> b { body() } + TextStyle.Italic -> i { body() } + TextStyle.Strikethrough -> strike { body() } + TextStyle.Strong -> strong { body() } + else -> body() + } + } override fun render(root: RootPageNode) { shouldRenderSourceSetBubbles = shouldRenderSourceSetBubbles(root) diff --git a/plugins/base/src/main/kotlin/renderers/html/Tags.kt b/plugins/base/src/main/kotlin/renderers/html/Tags.kt index 729fc966..f79d1633 100644 --- a/plugins/base/src/main/kotlin/renderers/html/Tags.kt +++ b/plugins/base/src/main/kotlin/renderers/html/Tags.kt @@ -17,6 +17,16 @@ open class WBR(initialAttributes: Map<String, String>, consumer: TagConsumer<*>) HTMLTag("wbr", consumer, initialAttributes, namespace = null, inlineTag = true, emptyTag = false), HtmlBlockInlineTag +/** + * Work-around until next version of kotlinx.html doesn't come out + */ +@HtmlTagMarker +inline fun FlowOrPhrasingContent.strike(classes : String? = null, crossinline block : STRIKE.() -> Unit = {}) : Unit = STRIKE(attributesMapOf("class", classes), consumer).visit(block) + +open class STRIKE(initialAttributes : Map<String, String>, override val consumer : TagConsumer<*>) : HTMLTag("strike", consumer, initialAttributes, null, false, false), HtmlBlockInlineTag { + +} + fun FlowOrMetaDataContent.templateCommand(data: Command, block: TemplateBlock = {}): Unit = (consumer as? ImmediateResolutionTagConsumer)?.processCommand(data, block) ?: TemplateCommand(attributesMapOf("data", toJsonString(data)), consumer).visit(block) diff --git a/plugins/base/src/test/kotlin/renderers/html/TextStylesTest.kt b/plugins/base/src/test/kotlin/renderers/html/TextStylesTest.kt new file mode 100644 index 00000000..3c38e68c --- /dev/null +++ b/plugins/base/src/test/kotlin/renderers/html/TextStylesTest.kt @@ -0,0 +1,65 @@ +package renderers.html + +import org.jetbrains.dokka.base.renderers.html.HtmlRenderer +import org.jetbrains.dokka.pages.TextStyle +import org.jsoup.Jsoup +import org.jsoup.nodes.Element +import org.junit.jupiter.api.Test +import renderers.testPage +import utils.B +import utils.I +import utils.STRIKE +import utils.match + +class TextStylesTest : HtmlRenderingOnlyTestBase() { + @Test + fun `should include bold`(){ + val page = testPage { + text("bold text", styles = setOf(TextStyle.Bold)) + } + HtmlRenderer(context).render(page) + renderedContent.match(B("bold text")) + } + + @Test + fun `should include italics`(){ + val page = testPage { + text("italics text", styles = setOf(TextStyle.Italic)) + } + HtmlRenderer(context).render(page) + renderedContent.match(I("italics text")) + } + + @Test + fun `should include strikethrought`(){ + val page = testPage { + text("strike text", styles = setOf(TextStyle.Strikethrough)) + } + HtmlRenderer(context).render(page) + renderedContent.match(STRIKE("strike text")) + } + + @Test + fun `should include multiple styles at one`(){ + val page = testPage { + text( + "styled text", + styles = setOf( + TextStyle.Strikethrough, + TextStyle.Bold, + TextStyle.Indented, + TextStyle.UnderCoverText, + TextStyle.BreakableAfter + ) + ) + } + HtmlRenderer(context).render(page) + renderedContent.match(STRIKE(B("styled text"))) + //Our dsl swallows nbsp so i manually check for it + files.contents.getValue("test-page.html").contains(" <strike><b>styled text</b></strike>") + } + + + override val renderedContent: Element + get() = files.contents.getValue("test-page.html").let { Jsoup.parse(it) }.select("#content").single() +}
\ No newline at end of file |