summaryrefslogtreecommitdiff
path: root/docs/build.sc
diff options
context:
space:
mode:
authorLi Haoyi <haoyi.sg@gmail.com>2018-08-12 22:42:47 +0800
committerLi Haoyi <haoyi.sg@gmail.com>2018-08-12 22:55:53 +0800
commitc0f39d743fbdf07544a6f5b6284d7123e5c36296 (patch)
tree64470286acb80c61e711299eded0b67fd516a8b8 /docs/build.sc
parentfd9c399db8c1c0d86cc65d5e1c41968b42a813d1 (diff)
downloadcask-c0f39d743fbdf07544a6f5b6284d7123e5c36296.tar.gz
cask-c0f39d743fbdf07544a6f5b6284d7123e5c36296.tar.bz2
cask-c0f39d743fbdf07544a6f5b6284d7123e5c36296.zip
auto publishing of docs w/ example downloads works
Diffstat (limited to 'docs/build.sc')
-rw-r--r--docs/build.sc198
1 files changed, 198 insertions, 0 deletions
diff --git a/docs/build.sc b/docs/build.sc
new file mode 100644
index 0000000..48fd3e7
--- /dev/null
+++ b/docs/build.sc
@@ -0,0 +1,198 @@
+// Load dependencies
+import $ivy.{`org.pegdown:pegdown:1.6.0`, `com.lihaoyi::scalatags:0.6.5`}
+import $file.pageStyles, pageStyles._
+import $file.pages, pages._
+import scalatags.Text.all._
+import $file.^.version
+import ammonite.ops._
+import collection.JavaConverters._
+import org.pegdown.{PegDownProcessor, ToHtmlSerializer, LinkRenderer, Extensions}
+import org.pegdown.ast.{VerbatimNode, ExpImageNode, HeaderNode, TextNode, SimpleNode, TableNode}
+
+val (releaseTag, label) = version.publishVersion
+
+val postsFolder = cwd/'pages
+
+interp.watch(postsFolder)
+
+val targetFolder = cwd/'target
+
+
+val (markdownFiles, otherFiles) = ls! postsFolder partition (_.ext == "md")
+markdownFiles.foreach(println)
+// Walk the posts/ folder and parse out the name, full- and first-paragraph-
+// HTML of each post to be used on their respective pages and on the index
+
+val posts = {
+ val split = for(path <- markdownFiles) yield {
+ val Array(number, name) = path.last.split(" - ", 2)
+ (number, name.stripSuffix(".md"), path)
+ }
+ for ((index, name, path) <- split.sortBy(_._1.toInt)) yield {
+ val processor = new PegDownProcessor(
+ Extensions.FENCED_CODE_BLOCKS | Extensions.TABLES | Extensions.AUTOLINKS
+ )
+
+ val txt = read(path)
+ .replaceAll(
+ """\$\$\$([a-zA-Z_0-9]+)""",
+ s"[example project](https://github.com/lihaoyi/cask/releases/download/$releaseTag/$label.$$1)"
+ )
+
+ val ast = processor.parseMarkdown(txt.toArray)
+ val headers = collection.mutable.Buffer.empty[(String, Int)]
+ class Serializer extends ToHtmlSerializer(new LinkRenderer){
+ override def printImageTag(rendering: LinkRenderer.Rendering) {
+ printer.print("<div style=\"text-align: center\"><img")
+ printAttribute("src", rendering.href)
+ // shouldn't include the alt attribute if its empty
+ if(!rendering.text.equals("")){
+ printAttribute("alt", rendering.text)
+ }
+ import collection.JavaConversions._
+ for (attr <- rendering.attributes) {
+ printAttribute(attr.name, attr.value)
+ }
+ printer.print(" style=\"max-width: 100%; max-height: 500px\"")
+ printer.print(" /></div>")
+ }
+ override def visit(node: HeaderNode) = {
+ val tag = "h" + node.getLevel()
+
+
+ val id =
+ node
+ .getChildren
+ .asScala
+ .collect{case t: TextNode => t.getText}
+ .mkString
+
+ headers.append(id -> node.getLevel())
+
+
+ val setId = s"id=${'"'+sanitize(id)+'"'}"
+ printer.print(s"""<$tag $setId class="${Styles.hoverBox.name}">""")
+ visitChildren(node)
+ printer.print(
+ a(href := ("#" + sanitize(id)), Styles.hoverLink)(
+ i(cls := "fa fa-link", aria.hidden := true)
+ ).render
+ )
+ printer.print(s"</$tag>")
+ }
+
+ override def visit(node: VerbatimNode) = {
+ printer.println().print(
+ """<pre style="background-color: #f8f8f8">""" +
+ s"""<code style="white-space:pre; background-color: #f8f8f8" class="${node.getType()}">"""
+ )
+
+ var text = node.getText()
+ // print HTML breaks for all initial newlines
+ while(text.charAt(0) == '\n') {
+ printer.print("\n")
+ text = text.substring(1)
+ }
+ printer.printEncoded(text)
+ printer.print("</code></pre>")
+ }
+ override def visit(node: TableNode) = {
+ currentTableNode = node
+ printer.print("<table class=\"table table-bordered\">")
+ visitChildren(node)
+ printer.print("</table>")
+ currentTableNode = null
+ }
+ }
+
+ val postlude = Seq[Frag](
+ hr,
+
+ p(
+ b("About the Author:"),
+ i(
+ " Haoyi is a software engineer, an early contributor to ",
+ a(href:="http://www.scala-js.org/")("Scala.js"),
+ ", and the author of many open-source Scala tools such as Mill, the ",
+ a(href:="lihaoyi.com/Ammonite", "Ammonite REPL"), " and ",
+ a(href:="https://github.com/lihaoyi/fastparse", "FastParse"), ". "
+ )
+ ),
+ p(
+ i(
+ "If you've enjoy using Mill, or enjoyed using Haoyi's other open ",
+ "source libraries, please chip in (or get your Company to chip in!) via ",
+ a(href:="https://www.patreon.com/lihaoyi", "Patreon"), " so he can ", "continue his open-source work"
+ )
+ ),
+ hr
+ ).render
+
+ val rawHtmlContent = new Serializer().toHtml(ast) + postlude
+ PostInfo(name, headers, rawHtmlContent)
+ }
+}
+
+def formatRssDate(date: java.time.LocalDate) = {
+ date
+ .atTime(0, 0)
+ .atZone(java.time.ZoneId.of("UTC"))
+ .format(java.time.format.DateTimeFormatter.RFC_1123_DATE_TIME)
+}
+
+@main
+def main(publish: Boolean = false) = {
+
+ rm! targetFolder
+
+ mkdir! targetFolder/'page
+ for(otherFile <- otherFiles){
+ cp(otherFile, targetFolder/'page/(otherFile relativeTo postsFolder))
+ }
+
+ cp(pwd/"favicon.png", targetFolder/"favicon.ico")
+ cp(pwd/"logo-white.svg", targetFolder/"logo-white.svg")
+
+ for(i <- posts.indices){
+ val post = posts(i)
+
+ val adjacentLinks = div(display.flex, flexDirection.row, justifyContent.spaceBetween)(
+ for((j, isNext) <- Seq(i-1 -> false, i+1 -> true))
+ yield posts.lift(j) match{
+ case None => div()
+ case Some(dest) =>
+ renderAdjacentLink(
+ isNext,
+ dest.name,
+ (i == 0, j == 0) match {
+ case (true, true) => s"index.html"
+ case (true, false) => s"page/${sanitize(dest.name)}.html"
+ case (false, true) => s"../index.html"
+ case (false, false) => s"${sanitize(dest.name)}.html"
+ }
+ )
+ }
+ )
+
+
+ write(
+ if (i == 0) targetFolder / "index.html"
+ else targetFolder/'page/s"${sanitize(post.name)}.html",
+ postContent(
+ i == 0,
+ post,
+ adjacentLinks,
+ posts.map(_.name)
+ )
+ )
+ }
+
+ if (publish){
+ implicit val wd = cwd/'target
+ %git 'init
+ %git('add, "-A", ".")
+ %git('commit, "-am", "first commit")
+ %git('remote, 'add, 'origin, "git@github.com:lihaoyi/cask.git")
+ %git('push, "-uf", 'origin, "master:gh-pages")
+ }
+} \ No newline at end of file