aboutsummaryrefslogtreecommitdiff
path: root/doc-tool
diff options
context:
space:
mode:
authorFelix Mulder <felix.mulder@gmail.com>2017-01-24 17:33:27 +0100
committerFelix Mulder <felix.mulder@gmail.com>2017-01-31 14:32:41 +0100
commite59241a2852eab53bdc0e22ea5b2dd394b231913 (patch)
tree34cefdccf17b9fd32af7dee25ba5e987f5ad6515 /doc-tool
parent269c24b92a2cf15e90344430291b74ee30441d3a (diff)
downloaddotty-e59241a2852eab53bdc0e22ea5b2dd394b231913.tar.gz
dotty-e59241a2852eab53bdc0e22ea5b2dd394b231913.tar.bz2
dotty-e59241a2852eab53bdc0e22ea5b2dd394b231913.zip
Allow links in static site to reference API entities
Diffstat (limited to 'doc-tool')
-rw-r--r--doc-tool/src/dotty/tools/dottydoc/staticsite/MarkdownLinkVisitor.scala28
-rw-r--r--doc-tool/src/dotty/tools/dottydoc/staticsite/Page.scala6
-rw-r--r--doc-tool/src/dotty/tools/dottydoc/staticsite/Site.scala10
-rw-r--r--doc-tool/src/dotty/tools/dottydoc/util/MemberLookup.scala1
-rw-r--r--doc-tool/test/dotty/tools/dottydoc/staticsite/PageTests.scala4
5 files changed, 39 insertions, 10 deletions
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
)