From e59241a2852eab53bdc0e22ea5b2dd394b231913 Mon Sep 17 00:00:00 2001 From: Felix Mulder Date: Tue, 24 Jan 2017 17:33:27 +0100 Subject: Allow links in static site to reference API entities --- .../dottydoc/staticsite/MarkdownLinkVisitor.scala | 28 +++++++++++++++++++--- .../src/dotty/tools/dottydoc/staticsite/Page.scala | 6 +++-- .../src/dotty/tools/dottydoc/staticsite/Site.scala | 10 ++++---- .../dotty/tools/dottydoc/util/MemberLookup.scala | 1 + .../tools/dottydoc/staticsite/PageTests.scala | 4 ++++ 5 files changed, 39 insertions(+), 10 deletions(-) (limited to 'doc-tool') diff --git a/doc-tool/src/dotty/tools/dottydoc/staticsite/MarkdownLinkVisitor.scala b/doc-tool/src/dotty/tools/dottydoc/staticsite/MarkdownLinkVisitor.scala index ac2b6fc6d..e33488e02 100644 --- a/doc-tool/src/dotty/tools/dottydoc/staticsite/MarkdownLinkVisitor.scala +++ b/doc-tool/src/dotty/tools/dottydoc/staticsite/MarkdownLinkVisitor.scala @@ -3,14 +3,36 @@ package dottydoc package staticsite import com.vladsch.flexmark.ast._ +import com.vladsch.flexmark.util.sequence.CharSubSequence +import model.{ Package, NonEntity, Val, Def, TypeAlias } +import dottydoc.util.MemberLookup object MarkdownLinkVisitor { - def apply(node: Node): Unit = + private val EntityLink = """([^\.]+)(\.[^\.]+)*""".r + def apply(node: Node, docs: Map[String, Package], params: Map[String, AnyRef]): Unit = (new NodeVisitor( - new VisitHandler(classOf[Link], new Visitor[Link] { + new VisitHandler(classOf[Link], new Visitor[Link] with MemberLookup { override def visit(node: Link): Unit = { val url = node.getUrl - if (url.endsWith(".md")) node.setUrl { + if (EntityLink.unapplySeq(url.toString).isDefined) { + lookup(NonEntity, docs, url.toString).foreach { ent => + val (path, suffix) = ent match { + case ent: Val => (ent.path.dropRight(1), ".html#" + ent.signature) + case ent: Def => (ent.path.dropRight(1), ".html#" + ent.signature) + case ent: TypeAlias => (ent.path.dropRight(1), ".html#" + ent.signature) + case ent: Package => (ent.path, "/index.html") + case ent => (ent.path, ".html") + } + + params("site") match { + case map: java.util.Map[String, String] @unchecked => node.setUrl { + CharSubSequence.of(path.mkString(map.get("baseurl") + "/api/", "/", suffix)) + } + case _ => () + } + } + } + else if (url.endsWith(".md")) node.setUrl { url.subSequence(0, url.lastIndexOf('.')).append(".html") } } diff --git a/doc-tool/src/dotty/tools/dottydoc/staticsite/Page.scala b/doc-tool/src/dotty/tools/dottydoc/staticsite/Page.scala index 0871fae6d..b637caf38 100644 --- a/doc-tool/src/dotty/tools/dottydoc/staticsite/Page.scala +++ b/doc-tool/src/dotty/tools/dottydoc/staticsite/Page.scala @@ -8,6 +8,8 @@ import com.vladsch.flexmark.html.HtmlRenderer import com.vladsch.flexmark.parser.Parser import com.vladsch.flexmark.ext.front.matter.AbstractYamlFrontMatterVisitor +import model.Package + import java.util.{ Map => JMap, List => JList } case class IllegalFrontMatter(message: String) extends Exception(message) @@ -116,14 +118,14 @@ class HtmlPage(fileContents: => String, val params: Map[String, AnyRef], val inc lazy val pageContent = fileContents } -class MarkdownPage(fileContents: => String, val params: Map[String, AnyRef], val includes: Map[String, String]) extends Page { +class MarkdownPage(fileContents: => String, val params: Map[String, AnyRef], val includes: Map[String, String], docs: Map[String, Package]) extends Page { lazy val pageContent = fileContents override protected[this] def initFields() = { super.initFields() val md = Parser.builder(Site.markdownOptions).build.parse(_html) // fix markdown linking - MarkdownLinkVisitor(md) + MarkdownLinkVisitor(md, docs, params) _html = HtmlRenderer .builder(Site.markdownOptions) .escapeHtml(false) diff --git a/doc-tool/src/dotty/tools/dottydoc/staticsite/Site.scala b/doc-tool/src/dotty/tools/dottydoc/staticsite/Site.scala index de16293a1..ace52725d 100644 --- a/doc-tool/src/dotty/tools/dottydoc/staticsite/Site.scala +++ b/doc-tool/src/dotty/tools/dottydoc/staticsite/Site.scala @@ -85,7 +85,7 @@ case class Site(val root: JFile, val projectTitle: String, val documentation: Ma val fileContents = Source.fromFile(file).mkString val params = defaultParams(file, 2).withUrl(s"/blog/$year/$month/$day/$name.html").toMap val page = - if (ext == "md") new MarkdownPage(fileContents, params, includes) + if (ext == "md") new MarkdownPage(fileContents, params, includes, documentation) else new HtmlPage(fileContents, params, includes) BlogPost(file, page) } @@ -154,8 +154,8 @@ case class Site(val root: JFile, val projectTitle: String, val documentation: Ma else (".html", 0) val target = mkdirs(fs.getPath(outDir.getAbsolutePath + "/api/" + e.path.mkString("/") + suffix)) - val params = defaultParams(target.toFile, -1).withPosts(blogInfo).withEntity(e) - val page = new HtmlPage(layouts("api-page"), params.toMap, includes) + val params = defaultParams(target.toFile, -1).withPosts(blogInfo).withEntity(e).toMap + val page = new HtmlPage(layouts("api-page"), params, includes) val rendered = render(page) val source = new ByteArrayInputStream(rendered.getBytes(StandardCharsets.UTF_8)) @@ -180,7 +180,7 @@ case class Site(val root: JFile, val projectTitle: String, val documentation: Ma val fileContents = Source.fromFile(asset).mkString val params = defaultParams(asset).withPosts(blogInfo).toMap val page = - if (asset.getName.endsWith(".md")) new MarkdownPage(fileContents, params, includes) + if (asset.getName.endsWith(".md")) new MarkdownPage(fileContents, params, includes, documentation) else new HtmlPage(fileContents, params, includes) val renderedPage = render(page) @@ -199,7 +199,7 @@ case class Site(val root: JFile, val projectTitle: String, val documentation: Ma val date = s"$year-$month-$day 00:00:00" val params = defaultParams(file, 2).withPosts(blogInfo).withDate(date).toMap val page = - if (ext == "md") new MarkdownPage(fileContents, params, includes) + if (ext == "md") new MarkdownPage(fileContents, params, includes, documentation) else new HtmlPage(fileContents, params, includes) diff --git a/doc-tool/src/dotty/tools/dottydoc/util/MemberLookup.scala b/doc-tool/src/dotty/tools/dottydoc/util/MemberLookup.scala index 7e37d0cfd..bb09a7090 100644 --- a/doc-tool/src/dotty/tools/dottydoc/util/MemberLookup.scala +++ b/doc-tool/src/dotty/tools/dottydoc/util/MemberLookup.scala @@ -69,6 +69,7 @@ trait MemberLookup { } (querys, entity) match { + case (xs, NonEntity) => globalLookup case (x :: Nil, e: Entity with Members) => localLookup(e, x) case (x :: _, e: Entity with Members) if x == entity.name => diff --git a/doc-tool/test/dotty/tools/dottydoc/staticsite/PageTests.scala b/doc-tool/test/dotty/tools/dottydoc/staticsite/PageTests.scala index 3dab4f02c..14886b681 100644 --- a/doc-tool/test/dotty/tools/dottydoc/staticsite/PageTests.scala +++ b/doc-tool/test/dotty/tools/dottydoc/staticsite/PageTests.scala @@ -16,6 +16,7 @@ class PageTests extends DottyDocTest { | |great""".stripMargin, Map.empty, + Map.empty, Map.empty ) @@ -35,6 +36,7 @@ class PageTests extends DottyDocTest { | |{{ content }}""".stripMargin, Map("content" -> "Hello, world!"), + Map.empty, Map.empty ) @@ -48,6 +50,7 @@ class PageTests extends DottyDocTest { val page2 = new MarkdownPage( """|{{ content }}""".stripMargin, Map("content" -> "hello"), + Map.empty, Map.empty ) assert( @@ -61,6 +64,7 @@ class PageTests extends DottyDocTest { |These shoes are awesome! |{% endif %}""".stripMargin, Map("product" -> Map("title" -> "Awesome Shoes").asJava), + Map.empty, Map.empty ) -- cgit v1.2.3