diff options
Diffstat (limited to 'doc-tool/src/dotty/tools/dottydoc/staticsite')
3 files changed, 124 insertions, 12 deletions
diff --git a/doc-tool/src/dotty/tools/dottydoc/staticsite/LiquidTemplate.scala b/doc-tool/src/dotty/tools/dottydoc/staticsite/LiquidTemplate.scala index 99ee54b74..a92e5d48e 100644 --- a/doc-tool/src/dotty/tools/dottydoc/staticsite/LiquidTemplate.scala +++ b/doc-tool/src/dotty/tools/dottydoc/staticsite/LiquidTemplate.scala @@ -12,14 +12,12 @@ case class LiquidTemplate(contents: String) extends ResourceFinder { import liqp.filters.Filter import liqp.parser.Flavor.JEKYLL import java.util.{ HashMap, Map => JMap } + import filters._ - Filter.registerFilter(new Filter("reverse") { - override def apply(value: Any, params: AnyRef*): AnyRef = { - val array = super.asArray(value) - if (array.length == 0) null - else array.reverse - } - }) + /** Register filters to static container */ + Filter.registerFilter(new Reverse) + Filter.registerFilter(new RenderReference) + Filter.registerFilter(new RenderLink) // For some reason, liqp rejects a straight conversion using `.asJava` private def toJavaMap(map: Map[String, AnyRef]): HashMap[String, Object] = diff --git a/doc-tool/src/dotty/tools/dottydoc/staticsite/Site.scala b/doc-tool/src/dotty/tools/dottydoc/staticsite/Site.scala index 03e78024c..d314f0eab 100644 --- a/doc-tool/src/dotty/tools/dottydoc/staticsite/Site.scala +++ b/doc-tool/src/dotty/tools/dottydoc/staticsite/Site.scala @@ -10,7 +10,7 @@ import java.nio.file.Path import java.io.ByteArrayInputStream import java.nio.charset.StandardCharsets -import com.vladsch.flexmark.parser.ParserEmulationFamily +import com.vladsch.flexmark.parser.ParserEmulationProfile import com.vladsch.flexmark.parser.Parser import com.vladsch.flexmark.ext.gfm.tables.TablesExtension import com.vladsch.flexmark.ext.gfm.strikethrough.StrikethroughExtension @@ -311,9 +311,7 @@ case class Site(val root: JFile, val documentation: Map[String, Package]) extend val defaultIncludes: Map[String, String] = Map( "header.html" -> "/_includes/header.html", "scala-logo.html" -> "/_includes/scala-logo.html", - "toc.html" -> "/_includes/toc.html", - "reference.html" -> "/_includes/reference.html", - "link.html" -> "/_includes/link.html" + "toc.html" -> "/_includes/toc.html" ).mapValues(getResource) @@ -345,7 +343,7 @@ case class Site(val root: JFile, val documentation: Map[String, Package]) extend object Site { val markdownOptions: DataHolder = new MutableDataSet() - .setFrom(ParserEmulationFamily.KRAMDOWN.getOptions) + .setFrom(ParserEmulationProfile.KRAMDOWN.getOptions) .set(Parser.EXTENSIONS, Arrays.asList( TablesExtension.create(), TaskListExtension.create(), diff --git a/doc-tool/src/dotty/tools/dottydoc/staticsite/filters.scala b/doc-tool/src/dotty/tools/dottydoc/staticsite/filters.scala new file mode 100644 index 000000000..bb6f314dc --- /dev/null +++ b/doc-tool/src/dotty/tools/dottydoc/staticsite/filters.scala @@ -0,0 +1,116 @@ +package dotty.tools +package dottydoc +package staticsite + +import model.references._ +import java.util.{ Map => JMap } + +import liqp.filters.Filter + +/** Custom liquid template filters */ +object filters { + + /** Used to reverse arrays: + * + * ```html + * {% assign array = "1,2,3,4,5" | split: "," %} + * {{ array | reverse }} + * ``` + */ + final class Reverse extends Filter("reverse") { + override def apply(value: Any, params: AnyRef*): AnyRef = { + val array = super.asArray(value) + if (array.length == 0) null + else array.reverse + } + } + + /** Renders a `Reference` as HTML. Example: + * + * ```html + * {{ ref | renderRef }} + * ``` + * + * where `ref` is: + * + * ```scala + * TypeReference("Seq", MaterializedLink("Seq", "../../scala/collection/Seq.html"), Nil) + * ``` + * + * will render: + * + * ```html + * <a href="../../scala/collection/Seq.html">Seq</a> + * <span class="no-left no-right">[</span> + * A + * <span class="no-left">]</span> + * ``` + */ + final class RenderReference extends Filter("renderRef") { + // might need to be rewritten to be stack safe + private def renderReference(ref: Reference): String = ref match { + case TypeReference(_, tpeLink, paramLinks) => { + if (paramLinks.nonEmpty) { + s"""|${renderLink(tpeLink)} + |<span class="no-left no-right">[</span> + |${ paramLinks.map(renderReference).mkString("""<span class="">, </span>""") } + |<span class="no-left">]</span>""".stripMargin + } + else renderLink(tpeLink) + } + + case AndOrTypeReference(left, sep, right) => + s"""${renderReference(left)}<span class="and-or-separator"> $sep </span>${renderReference(right)}""" + + case FunctionReference(args, returnValue) => { + val params = + if (args.isEmpty) "<span>() => </span>" + else if (args.tail.isEmpty) renderReference(args.head) + """<span class="right-arrow"> => </span>""" + else args.map(renderReference).mkString("<span>(</span>", "<span>, </span>", "<span>) => </span>") + + params + renderReference(returnValue) + } + + case TupleReference(args) => + s"""|<span class="no-right">(</span> + |${ args.map(renderReference).mkString("<span>, </span>") } + |<span class="no-left">)</span>""".stripMargin + + case BoundsReference(low, high) => + s"""${ renderReference(low) }<span class="bounds"> <: </span>${ renderReference(high) }""" + + case NamedReference(title, _, _, _) => + /*dottydoc.*/println(s"received illegal named reference in rendering: $ref") + title + + case ConstantReference(title) => title + } + + override def apply(value: Any, params: AnyRef*): AnyRef = value match { + case value: JMap[String, _] @unchecked => + renderReference(value.get("scala").asInstanceOf[Reference]) + case _ => + /*dottydoc.*/println(s"couldn't render: '$value'") + null + } + } + + /** Renders a `MaterializableLink` into a HTML anchor tag. If the link is + * `NoLink` it will just return a string with the link's title. + */ + final class RenderLink extends Filter("renderLink") { + override def apply(value: Any, params: AnyRef*): AnyRef = value match { + case value: JMap[String, _] @unchecked => + renderLink(value.get("scala").asInstanceOf[MaterializableLink]) + case _ => + /*dottydoc.*/println(s"couldn't render: '$value'") + null + } + } + + private[this] def renderLink(link: MaterializableLink): String = link match { + case MaterializedLink(title, target) => + s"""<a href="$target">$title</a>""" + case _ => link.title + } +} |