summaryrefslogtreecommitdiff
path: root/book/src
diff options
context:
space:
mode:
authorLi Haoyi <haoyi@dropbox.com>2014-10-28 00:11:20 -0700
committerLi Haoyi <haoyi@dropbox.com>2014-10-28 00:11:20 -0700
commit899ab6b865e4381b6f5b9b31bc662ea51604a7a5 (patch)
tree993d29801abb32acd457e98ed3f43551f0bc5195 /book/src
parent65fe456b96d81b6d166ff1a38a7c6ab529d284c2 (diff)
downloadhands-on-scala-js-899ab6b865e4381b6f5b9b31bc662ea51604a7a5.tar.gz
hands-on-scala-js-899ab6b865e4381b6f5b9b31bc662ea51604a7a5.tar.bz2
hands-on-scala-js-899ab6b865e4381b6f5b9b31bc662ea51604a7a5.zip
lots of cleanup
Diffstat (limited to 'book/src')
-rwxr-xr-xbook/src/main/resources/js/ui.js2
-rw-r--r--book/src/main/scala/book/Book.scala70
-rw-r--r--book/src/main/scala/book/Main.scala2
-rw-r--r--book/src/main/scala/book/Utils.scala41
4 files changed, 78 insertions, 37 deletions
diff --git a/book/src/main/resources/js/ui.js b/book/src/main/resources/js/ui.js
index e98327a..5f144bb 100755
--- a/book/src/main/resources/js/ui.js
+++ b/book/src/main/resources/js/ui.js
@@ -76,7 +76,7 @@ document.addEventListener("DOMContentLoaded", function(){
// Get id of current scroll item
for(var i = scrollItems.length - 1; i >= 0; i--){
- if (scrollHeaders[i].offsetTop < fromTop + 15 /*fudge factor*/){
+ if (scrollHeaders[i].offsetTop < fromTop + 100 /*fudge factor*/){
if (lastId != i) {
if (lastId != -1) {
scrollItems[lastId].parentElement.className = scrollItems[lastId].parentElement.className.replace(
diff --git a/book/src/main/scala/book/Book.scala b/book/src/main/scala/book/Book.scala
index 6e4122f..4e2d015 100644
--- a/book/src/main/scala/book/Book.scala
+++ b/book/src/main/scala/book/Book.scala
@@ -12,27 +12,56 @@ import scalatags.Text.all._
object Book {
import Utils.sect
- val intro = twf("book/intro.tw")
- val gettingStarted = twf("book/getting-started.tw")
+ lazy val intro = sect("Intro to Scala.js")(twf("book/intro.tw"))
+ lazy val gettingStarted = sect("Getting Started")(twf("book/getting-started.tw"))
+ val txt = twf("book/index.tw")
val contentBar = {
- def rec(current: Node, depth: Int): Seq[Frag] = Seq(
- li(
- a(
- current.name,
- href:="#"+Utils.munge(current.name),
- paddingLeft := s"${depth * 10 + 10}px",
- cls := "menu-item" + (if (depth == 1) " menu-item-divided " else "")
+ def rec(current: Node, depth: Int): Seq[Frag] = {
+ println("\t"*depth + current.name)
+ Seq(
+ li(
+ a(
+ current.name,
+ href:="#"+Utils.munge(current.name),
+ paddingLeft := s"${depth * 10 + 10}px",
+ cls := "menu-item" + (if (depth == 1) " menu-item-divided " else "")
+ )
)
- )
- ) ++ current.children.flatMap(rec(_, depth + 1))
+ ) ++ current.children.flatMap(rec(_, depth + 1))
+ }
- // @li(cls:="menu-item-divided pure-menu-selected")
+ println("TABLE OF CONTENTS")
rec(Utils.structure, 0)
}
-
-
- val txt = twf("book/index.tw").render
-
+ val site = Seq(
+ raw("<!doctype html>"),
+ html(
+ head(
+ meta(charset:="utf-8"),
+ meta(name:="viewport", content:="width=device-width, initial-scale=1.0"),
+ tags2.title("Hands-on Scala.js"),
+ Utils.includes
+ ),
+
+ div(id:="layout")(
+ a(href:="#menu", id:="menuLink", cls:="menu-link")(
+ span
+ ),
+
+ div(id:="menu")(
+ div(cls:="pure-menu pure-menu-open")(
+ a(cls:="pure-menu-heading", href:="#")(
+ "Contents"
+ ),
+ ul(cls:="menu-item-list")(
+ contentBar
+ )
+ )
+ )
+ ),
+ div(id:="main", txt)
+ )
+ ).render
object hli{
def javascript(code: String*) = hl.highlight(code, "javascript", inline=true)
def scala(code: String*) = hl.highlight(code, "scala", inline=true)
@@ -47,8 +76,6 @@ object Book {
if (inline){
code(cls:=lang + " highlight-me", lines(0), padding:=0, display:="inline")
}else{
- println("LINES " + lines.toList)
- println(snippet)
val minIndent = lines.map(_.takeWhile(_ == ' ').length)
.filter(_ > 0)
.min
@@ -114,15 +141,11 @@ object Book {
firstCharIndex == -1 || firstCharIndex >= whitespace + (if (indented) 1 else 0)
}
- things.foreach(println)
val stuff =
if (!indented) {
- println("NOT INDENTED " + things)
things
- }
- else {
+ } else {
val last = lines(firstLine + things.length + 1)
-// println("LAST: " + last)
if (last.trim.toSet subsetOf "}])".toSet) {
lines(firstLine) +: things :+ last
} else {
@@ -131,7 +154,6 @@ object Book {
}
stuff.map(_.drop(whitespace)).mkString("\n")
}
- println(blob)
pre(code(cls:=lang + " highlight-me", blob))
}
diff --git a/book/src/main/scala/book/Main.scala b/book/src/main/scala/book/Main.scala
index 89fb5e1..19b256a 100644
--- a/book/src/main/scala/book/Main.scala
+++ b/book/src/main/scala/book/Main.scala
@@ -32,7 +32,7 @@ object Main {
// .call()
- write(Book.txt, "output/index.html")
+ write(Book.site, "output/index.html")
for(res <- Utils.autoResources ++ Utils.manualResources) {
copy(getClass.getResourceAsStream("/" + res), "output/" + res)
diff --git a/book/src/main/scala/book/Utils.scala b/book/src/main/scala/book/Utils.scala
index df56c84..fbef8e8 100644
--- a/book/src/main/scala/book/Utils.scala
+++ b/book/src/main/scala/book/Utils.scala
@@ -38,27 +38,46 @@ object Utils{
raw("")
}
println(includes)
- var indent = 1
- val headers = Seq(h1, h1, h2, h3, h4, h5, h6)
- val structure = Node("Hands-on Scala.js", mutable.Buffer.empty)
- var current = structure
+ var indent = 0
+
+
+ val headers = Seq[(String => scalatags.Text.Tag, Option[Frag => Frag])](
+ (h => div(cls:="header")(
+ h1(h),
+ h2("Writing client-side web applications in Scala")
+ ), Some(f => div(cls:="content", f))),
+ (h => div(cls:="header")(
+ h1(id:=Utils.munge(h), h),
+ br
+ ), None),
+ (h1(_), None),
+ (h2(_), None),
+ (h3(_), None),
+ (h4(_), None),
+ (h5(_), None),
+ (h6(_), None)
+ )
+
+ var structure: Node = null
case class sect(name: String){
indent += 1
val newNode = Node(name, mutable.Buffer.empty)
- current.children.append(newNode)
- val prev = current
- current = newNode
+ val (headerWrap, contentWrap) = headers(indent-1)
+ if (structure!= null) structure.children.append(newNode)
+ val prev = structure
+ structure = newNode
def apply(args: Frag*) = {
- val res = Seq(
- headers(indent-1)(cls:="content-subhead", id:=munge(name), name) +: args:_*
+ val wrappedContents = contentWrap.getOrElse((x: Frag) => x)(args)
+ val res = Seq[Frag](
+ headerWrap(name)(cls:="content-subhead", id:=munge(name)),
+ wrappedContents
)
indent -= 1
- current = prev
+ if (prev != null) structure = prev
res
}
}
def munge(name: String) = {
name.replace(" ", "")
}
-
} \ No newline at end of file