From 4ad0430635362595f7f30a77532512717393c5d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Zyba=C5=82a?= Date: Fri, 11 Dec 2020 11:03:57 +0100 Subject: [PATCH] Add support for html tags inside documentation written in markdown --- scala3doc-testcases/src/tests/htmlTests.scala | 29 +++++++++++++++++++ .../tasty/comments/MarkdownConverter.scala | 11 ++++++- .../dokka/tasty/comments/MarkdownParser.scala | 7 +++-- .../dotty/renderers/ScalaHtmlRenderer.scala | 3 +- 4 files changed, 46 insertions(+), 4 deletions(-) create mode 100644 scala3doc-testcases/src/tests/htmlTests.scala diff --git a/scala3doc-testcases/src/tests/htmlTests.scala b/scala3doc-testcases/src/tests/htmlTests.scala new file mode 100644 index 000000000000..0132f217c197 --- /dev/null +++ b/scala3doc-testcases/src/tests/htmlTests.scala @@ -0,0 +1,29 @@ +package tests +package htmlTests + + +/** + * + * + * + * + * + * + * + * + * + * + *
ASD FGH JKL
123 456 789
+ * This is red text. + * I'm bold + * And I'm italic + * + * An example documention with markdown formatting + * + * + *

+  * def someScalaCode(x: String) = println("Hello " + x)
+  * 
+ * +*/ +class HtmlTest \ No newline at end of file diff --git a/scala3doc/src/dotty/dokka/tasty/comments/MarkdownConverter.scala b/scala3doc/src/dotty/dokka/tasty/comments/MarkdownConverter.scala index 66b6a70a7565..a705a60eae51 100644 --- a/scala3doc/src/dotty/dokka/tasty/comments/MarkdownConverter.scala +++ b/scala3doc/src/dotty/dokka/tasty/comments/MarkdownConverter.scala @@ -161,8 +161,17 @@ class MarkdownConverter(val repr: Repr) extends BaseConverter { case _: mda.SoftLineBreak => emit(dkkd.Br.INSTANCE) + case inline: mda.HtmlInline => + emit(dkkd.Html(List(dkk.text(inline.getSegments.mkString)).asJava, kt.emptyMap)) + + case entity: mda.HtmlEntity => + emit(dkkd.Html(List(dkk.text(entity.getSegments.mkString)).asJava, kt.emptyMap)) + + case block: mda.HtmlBlock => + emit(dkkd.Html(List(dkk.text(block.getContentChars.toString)).asJava, kt.emptyMap)) + // TODO (https://github.com/lampepfl/scala3doc/issues/205): for now just silent the warnigs - case _:mda.HtmlInline | _: mda.LinkRef | _: mda.HtmlEntity | _: mda.HtmlBlock | _: com.vladsch.flexmark.ext.emoji.Emoji => + case _: mda.LinkRef | _: com.vladsch.flexmark.ext.emoji.Emoji => emit(dkk.text(MarkdownParser.renderToText(n))) case _ => diff --git a/scala3doc/src/dotty/dokka/tasty/comments/MarkdownParser.scala b/scala3doc/src/dotty/dokka/tasty/comments/MarkdownParser.scala index 92915a86910d..024c3c3f5f80 100644 --- a/scala3doc/src/dotty/dokka/tasty/comments/MarkdownParser.scala +++ b/scala3doc/src/dotty/dokka/tasty/comments/MarkdownParser.scala @@ -1,6 +1,7 @@ package dotty.dokka.tasty.comments import java.util.{ Arrays } +import Regexes._ import com.vladsch.flexmark.util.{ast => mdu} import com.vladsch.flexmark.formatter.Formatter @@ -36,11 +37,13 @@ object MarkdownParser { "https://github.global.ssl.fastly.net/images/icons/emoji/") .set(WikiLinkExtension.LINK_ESCAPE_CHARS, "") + val parser = Parser.builder(markdownOptions).build() + val RENDERER = Formatter.builder(markdownOptions).build() def parseToMarkdown(text: String): mdu.Document = - Parser.builder(markdownOptions) - .build.parse(text).asInstanceOf[mdu.Document] + // We need to remove safe tag markers as they break flexmark parsing + parser.parse(text.replace(safeTagMarker.toString, "")).asInstanceOf[mdu.Document] def renderToText(node: mdu.Node): String = diff --git a/scala3doc/src/dotty/renderers/ScalaHtmlRenderer.scala b/scala3doc/src/dotty/renderers/ScalaHtmlRenderer.scala index acac28b06a4f..76ae2cb06ceb 100644 --- a/scala3doc/src/dotty/renderers/ScalaHtmlRenderer.scala +++ b/scala3doc/src/dotty/renderers/ScalaHtmlRenderer.scala @@ -97,7 +97,8 @@ class ScalaHtmlRenderer(using ctx: DokkaContext) extends HtmlRenderer(ctx) { override def buildContentNode(f: FlowContent, node: ContentNode, pageContext: ContentPage, sourceSetRestriciton: JSet[DisplaySourceSet]) = { node match { - case n: HtmlContentNode => withHtml(f, raw(n.body).toString) + case n: HtmlContentNode => + withHtml(f, raw(n.body).toString) case n: HierarchyGraphContentNode => buildDiagram(f, n.diagram, pageContext) case n: DocumentableList => val ss = if sourceSetRestriciton == null then Set.empty.asJava else sourceSetRestriciton