From a33254276bd211bf33be86eeb871ddbfe36fdb47 Mon Sep 17 00:00:00 2001 From: Li Haoyi Date: Sun, 2 Nov 2014 04:57:37 -0800 Subject: Moved `examples` into `examples/demos`, sketched out a simple example cross-module --- examples/build.sbt | 11 --- examples/crossBuilds/simple/build.sbt | 8 ++ .../simple/js/src/main/scala/simple/Platform.scala | 18 ++++ .../jvm/src/main/scala/simple/Platform.scala | 23 +++++ examples/crossBuilds/simple/project/build.sbt | 1 + .../simple/shared/main/scala/simple/Simple.scala | 9 ++ examples/demos/build.sbt | 11 +++ .../demos/src/main/resources/webpage/weather.js | 17 ++++ examples/demos/src/main/scala/Splash.scala | 43 +++++++++ .../demos/src/main/scala/canvasapp/Clock.scala | 51 ++++++++++ .../src/main/scala/canvasapp/FlappyLine.scala | 107 +++++++++++++++++++++ .../src/main/scala/canvasapp/ScratchPad.scala | 40 ++++++++ .../demos/src/main/scala/webpage/HelloWorld0.scala | 19 ++++ .../demos/src/main/scala/webpage/HelloWorld1.scala | 18 ++++ examples/demos/src/main/scala/webpage/Inputs.scala | 35 +++++++ .../demos/src/main/scala/webpage/Search0.scala | 50 ++++++++++ .../demos/src/main/scala/webpage/Search1.scala | 62 ++++++++++++ .../demos/src/main/scala/webpage/Weather0.scala | 27 ++++++ .../demos/src/main/scala/webpage/Weather1.scala | 30 ++++++ .../demos/src/main/scala/webpage/Weather2.scala | 35 +++++++ .../demos/src/main/scala/webpage/Weather3.scala | 55 +++++++++++ .../src/main/scala/webpage/WeatherSearch.scala | 90 +++++++++++++++++ examples/src/main/resources/webpage/weather.js | 17 ---- examples/src/main/scala/Splash.scala | 43 --------- examples/src/main/scala/canvasapp/Clock.scala | 51 ---------- examples/src/main/scala/canvasapp/FlappyLine.scala | 107 --------------------- examples/src/main/scala/canvasapp/ScratchPad.scala | 40 -------- examples/src/main/scala/webpage/HelloWorld0.scala | 19 ---- examples/src/main/scala/webpage/HelloWorld1.scala | 18 ---- examples/src/main/scala/webpage/Inputs.scala | 35 ------- examples/src/main/scala/webpage/Search0.scala | 50 ---------- examples/src/main/scala/webpage/Search1.scala | 62 ------------ examples/src/main/scala/webpage/Weather0.scala | 27 ------ examples/src/main/scala/webpage/Weather1.scala | 30 ------ examples/src/main/scala/webpage/Weather2.scala | 35 ------- examples/src/main/scala/webpage/Weather3.scala | 55 ----------- .../src/main/scala/webpage/WeatherSearch.scala | 90 ----------------- 37 files changed, 749 insertions(+), 690 deletions(-) delete mode 100644 examples/build.sbt create mode 100644 examples/crossBuilds/simple/build.sbt create mode 100644 examples/crossBuilds/simple/js/src/main/scala/simple/Platform.scala create mode 100644 examples/crossBuilds/simple/jvm/src/main/scala/simple/Platform.scala create mode 100644 examples/crossBuilds/simple/project/build.sbt create mode 100644 examples/crossBuilds/simple/shared/main/scala/simple/Simple.scala create mode 100644 examples/demos/build.sbt create mode 100644 examples/demos/src/main/resources/webpage/weather.js create mode 100644 examples/demos/src/main/scala/Splash.scala create mode 100644 examples/demos/src/main/scala/canvasapp/Clock.scala create mode 100644 examples/demos/src/main/scala/canvasapp/FlappyLine.scala create mode 100644 examples/demos/src/main/scala/canvasapp/ScratchPad.scala create mode 100644 examples/demos/src/main/scala/webpage/HelloWorld0.scala create mode 100644 examples/demos/src/main/scala/webpage/HelloWorld1.scala create mode 100644 examples/demos/src/main/scala/webpage/Inputs.scala create mode 100644 examples/demos/src/main/scala/webpage/Search0.scala create mode 100644 examples/demos/src/main/scala/webpage/Search1.scala create mode 100644 examples/demos/src/main/scala/webpage/Weather0.scala create mode 100644 examples/demos/src/main/scala/webpage/Weather1.scala create mode 100644 examples/demos/src/main/scala/webpage/Weather2.scala create mode 100644 examples/demos/src/main/scala/webpage/Weather3.scala create mode 100644 examples/demos/src/main/scala/webpage/WeatherSearch.scala delete mode 100644 examples/src/main/resources/webpage/weather.js delete mode 100644 examples/src/main/scala/Splash.scala delete mode 100644 examples/src/main/scala/canvasapp/Clock.scala delete mode 100644 examples/src/main/scala/canvasapp/FlappyLine.scala delete mode 100644 examples/src/main/scala/canvasapp/ScratchPad.scala delete mode 100644 examples/src/main/scala/webpage/HelloWorld0.scala delete mode 100644 examples/src/main/scala/webpage/HelloWorld1.scala delete mode 100644 examples/src/main/scala/webpage/Inputs.scala delete mode 100644 examples/src/main/scala/webpage/Search0.scala delete mode 100644 examples/src/main/scala/webpage/Search1.scala delete mode 100644 examples/src/main/scala/webpage/Weather0.scala delete mode 100644 examples/src/main/scala/webpage/Weather1.scala delete mode 100644 examples/src/main/scala/webpage/Weather2.scala delete mode 100644 examples/src/main/scala/webpage/Weather3.scala delete mode 100644 examples/src/main/scala/webpage/WeatherSearch.scala (limited to 'examples') diff --git a/examples/build.sbt b/examples/build.sbt deleted file mode 100644 index 7e6b685..0000000 --- a/examples/build.sbt +++ /dev/null @@ -1,11 +0,0 @@ -scalaJSSettings - -name := "Example" - -version := "0.1-SNAPSHOT" - -scalaVersion := "2.11.1" - -libraryDependencies += "org.scala-lang.modules.scalajs" %%% "scalajs-dom" % "0.6" - -libraryDependencies += "com.scalatags" %%% "scalatags" % "0.4.2" \ No newline at end of file diff --git a/examples/crossBuilds/simple/build.sbt b/examples/crossBuilds/simple/build.sbt new file mode 100644 index 0000000..df0c84b --- /dev/null +++ b/examples/crossBuilds/simple/build.sbt @@ -0,0 +1,8 @@ +lazy val js = project.in(file("js")).settings(scalaJSSettings:_*).settings( + unmanagedSourceDirectories in Compile += + baseDirectory.value / ".." / "shared" / "main" / "scala" +) +lazy val jvm = project.in(file("jvm")).settings( + unmanagedSourceDirectories in Compile += + baseDirectory.value / ".." / "shared" / "main" / "scala" +) \ No newline at end of file diff --git a/examples/crossBuilds/simple/js/src/main/scala/simple/Platform.scala b/examples/crossBuilds/simple/js/src/main/scala/simple/Platform.scala new file mode 100644 index 0000000..40f65f4 --- /dev/null +++ b/examples/crossBuilds/simple/js/src/main/scala/simple/Platform.scala @@ -0,0 +1,18 @@ +/*js/src/main/scala/simple/Platform.scala*/ +package simple +import scala.scalajs.js + +object Platform extends js.JSApp{ + def format(ts: Long) = { + new js.Date(ts).toLocaleString(); + } + def main() = { + println("simple.js") + val times = Seq( + System.currentTimeMillis(), + System.currentTimeMillis() + 1000, + System.currentTimeMillis() + 2000 + ) + println(Simple.formatTimestamps(times)) + } +} \ No newline at end of file diff --git a/examples/crossBuilds/simple/jvm/src/main/scala/simple/Platform.scala b/examples/crossBuilds/simple/jvm/src/main/scala/simple/Platform.scala new file mode 100644 index 0000000..af70429 --- /dev/null +++ b/examples/crossBuilds/simple/jvm/src/main/scala/simple/Platform.scala @@ -0,0 +1,23 @@ +/*jvm/src/main/scala/simple/Platform.scala*/ +package simple +import java.text.SimpleDateFormat + +object Platform{ + def format(ts: Long) = { + // http://docs.oracle.com/javase/7/ + // docs/api/java/text/SimpleDateFormat.html + val fmt = "MMMM d, yyyy h:mm:ss aaa z" + new SimpleDateFormat(fmt).format( + new java.util.Date(ts) + ) + } + def main(args: Array[String]) = { + println("simple.jvm") + val times = Seq( + System.currentTimeMillis(), + System.currentTimeMillis() + 1000, + System.currentTimeMillis() + 2000 + ) + println(Simple.formatTimestamps(times)) + } +} \ No newline at end of file diff --git a/examples/crossBuilds/simple/project/build.sbt b/examples/crossBuilds/simple/project/build.sbt new file mode 100644 index 0000000..5ac559a --- /dev/null +++ b/examples/crossBuilds/simple/project/build.sbt @@ -0,0 +1 @@ +addSbtPlugin("org.scala-lang.modules.scalajs" % "scalajs-sbt-plugin" % "0.5.5") \ No newline at end of file diff --git a/examples/crossBuilds/simple/shared/main/scala/simple/Simple.scala b/examples/crossBuilds/simple/shared/main/scala/simple/Simple.scala new file mode 100644 index 0000000..4e693e4 --- /dev/null +++ b/examples/crossBuilds/simple/shared/main/scala/simple/Simple.scala @@ -0,0 +1,9 @@ +/*shared/main/scala/simple/Simple.scala*/ +package simple +object Simple{ + def formatTimestamps(timestamps: Seq[Long]) = { + timestamps.map(Platform.format) + .mkString("\n") + } + } +} \ No newline at end of file diff --git a/examples/demos/build.sbt b/examples/demos/build.sbt new file mode 100644 index 0000000..7e6b685 --- /dev/null +++ b/examples/demos/build.sbt @@ -0,0 +1,11 @@ +scalaJSSettings + +name := "Example" + +version := "0.1-SNAPSHOT" + +scalaVersion := "2.11.1" + +libraryDependencies += "org.scala-lang.modules.scalajs" %%% "scalajs-dom" % "0.6" + +libraryDependencies += "com.scalatags" %%% "scalatags" % "0.4.2" \ No newline at end of file diff --git a/examples/demos/src/main/resources/webpage/weather.js b/examples/demos/src/main/resources/webpage/weather.js new file mode 100644 index 0000000..8e95305 --- /dev/null +++ b/examples/demos/src/main/resources/webpage/weather.js @@ -0,0 +1,17 @@ +function WeatherJs(target) { + var xhr = new XMLHttpRequest() + + xhr.open("GET", + "http://api.openweathermap.org/data/" + + "2.5/weather?q=Singapore" + ); + + xhr.onload = function (e) { + if (xhr.status == 200) { + var pre = document.createElement("pre"); + pre.textContent = xhr.responseText; + target.appendChild(pre); + } + }; + xhr.send(); +} \ No newline at end of file diff --git a/examples/demos/src/main/scala/Splash.scala b/examples/demos/src/main/scala/Splash.scala new file mode 100644 index 0000000..c68bdca --- /dev/null +++ b/examples/demos/src/main/scala/Splash.scala @@ -0,0 +1,43 @@ +import java.lang.Math._ + +import org.scalajs.dom + +import scala.scalajs.js.annotation.JSExport + +@JSExport +object Splash extends{ + @JSExport + def main(canvas: dom.HTMLCanvasElement) = { + + def clear() = { + canvas.width = canvas.parentElement.clientWidth + canvas.height = canvas.parentElement.clientHeight + } + clear() + + val renderer = + canvas.getContext("2d") + .asInstanceOf[dom.CanvasRenderingContext2D] + + def h = canvas.height + def w = canvas.width + + var x = 0.0 + type Graph = (String, Double => Double) + val graphs = Seq[Graph]( + ("red", sin), + ("green", x => 1 - abs(x % 4 - 2)), + ("blue", x => pow(sin(x/12), 2) * sin(x)) + ).zipWithIndex + dom.setInterval(() => { + x = (x + 1) % w; if (x == 0) clear() + for (((color, f), i) <- graphs) { + val offset = h / 3 * (i + 0.5) + val y = f(x / w * 75) * h / 30 + renderer.fillStyle = color + renderer.fillRect(x, y + offset, 3, 3) + } + }, 20) + + } +} \ No newline at end of file diff --git a/examples/demos/src/main/scala/canvasapp/Clock.scala b/examples/demos/src/main/scala/canvasapp/Clock.scala new file mode 100644 index 0000000..af9d8aa --- /dev/null +++ b/examples/demos/src/main/scala/canvasapp/Clock.scala @@ -0,0 +1,51 @@ +package canvasapp + + +import org.scalajs.dom + +import scala.scalajs.js +import scala.scalajs.js.annotation.JSExport +@JSExport +object Clock extends{ + @JSExport + def main(canvas: dom.HTMLCanvasElement) = { + /*setup*/ + val renderer = canvas.getContext("2d") + .asInstanceOf[dom.CanvasRenderingContext2D] + + canvas.width = canvas.parentElement.clientWidth + canvas.height = canvas.parentElement.clientHeight + + val gradient = renderer.createLinearGradient( + canvas.width / 2 - 100, 0, canvas.width/ 2 + 100, 0 + ) + gradient.addColorStop(0,"red") + gradient.addColorStop(0.5,"green") + gradient.addColorStop(1,"blue") + renderer.fillStyle = gradient + //renderer.fillStyle = "black" + + renderer.textAlign = "center" + renderer.textBaseline = "middle" + + /*code*/ + def render() = { + val date = new js.Date() + renderer.clearRect( + 0, 0, canvas.width, canvas.height + ) + + renderer.font = "75px sans-serif" + renderer.fillText( + Seq( + date.getHours(), + date.getMinutes(), + date.getSeconds() + ).mkString(":"), + canvas.width / 2, + canvas.height / 2 + ) + } + dom.setInterval(render _, 1000) + } +} \ No newline at end of file diff --git a/examples/demos/src/main/scala/canvasapp/FlappyLine.scala b/examples/demos/src/main/scala/canvasapp/FlappyLine.scala new file mode 100644 index 0000000..50c9906 --- /dev/null +++ b/examples/demos/src/main/scala/canvasapp/FlappyLine.scala @@ -0,0 +1,107 @@ +package canvasapp + + +import org.scalajs.dom + +import scala.scalajs.js.annotation.JSExport +import scala.util.Random + +@JSExport +object FlappyLine extends{ + @JSExport + def main(canvas: dom.HTMLCanvasElement) = { + /*setup*/ + + val renderer = canvas.getContext("2d") + .asInstanceOf[dom.CanvasRenderingContext2D] + + canvas.width = canvas.parentElement.clientWidth + canvas.height = 400 + + renderer.font = "50px sans-serif" + renderer.textAlign = "center" + renderer.textBaseline = "middle" + + /*variables*/ + val obstacleGap = 200 // Gap between the approaching obstacles + val holeSize = 50 // Size of the hole in each obstacle you must go through + val gravity = 0.1 // Y acceleration of the player + + var playerY = canvas.height / 2.0 // Y position of the player; X is fixed + var playerV = 0.0 // Y velocity of the player + // Whether the player is dead or not; + // 0 means alive, >0 is number of frames before respawning + var dead = 0 + // What frame this is; used to keep track + // of where the obstacles should be positioned + var frame = -50 + // List of each obstacle, storing only the Y position of the hole. + // The X position of the obstacle is calculated by its position in the + // queue and in the current frame. + val obstacles = collection.mutable.Queue.empty[Int] + + + def runLive() = { + frame += 2 + + // Create new obstacles, or kill old ones as necessary + if (frame >= 0 && frame % obstacleGap == 0) + obstacles.enqueue(Random.nextInt(canvas.height - 2 * holeSize) + holeSize) + if (obstacles.length > 7){ + obstacles.dequeue() + frame -= obstacleGap + } + + // Apply physics + playerY = playerY + playerV + playerV = playerV + gravity + + + // Render obstacles, and check for collision + renderer.fillStyle = "darkblue" + for((holeY, i) <- obstacles.zipWithIndex){ + val holeX = i * obstacleGap - frame + canvas.width + renderer.fillRect(holeX, 0, 5, holeY - holeSize) + renderer.fillRect( + holeX, holeY + holeSize, 5, canvas.height - holeY - holeSize + ) + if (math.abs(holeX - canvas.width/2) < 5 && + math.abs(holeY - playerY) > holeSize){ + dead = 50 + } + } + + // Render player + renderer.fillStyle = "darkgreen" + renderer.fillRect(canvas.width / 2 - 5, playerY - 5, 10, 10) + + // Check for out-of-bounds player + if (playerY < 0 || playerY > canvas.height){ + dead = 50 + } + } + + + def runDead() = { + playerY = canvas.height / 2 + playerV = 0 + frame = -50 + obstacles.clear() + dead -= 1 + renderer.fillStyle = "darkred" + renderer.fillText("You Died", canvas.width / 2, canvas.height / 2) + } + + def run() = { + renderer.clearRect(0, 0, canvas.width, canvas.height) + if (dead > 0) runDead() + else runLive() + } + + dom.setInterval(run _, 20) + + canvas.onclick = (e: dom.MouseEvent) => { + playerV -= 5 + } + } +} \ No newline at end of file diff --git a/examples/demos/src/main/scala/canvasapp/ScratchPad.scala b/examples/demos/src/main/scala/canvasapp/ScratchPad.scala new file mode 100644 index 0000000..cc3d7e0 --- /dev/null +++ b/examples/demos/src/main/scala/canvasapp/ScratchPad.scala @@ -0,0 +1,40 @@ +package canvasapp + + +import org.scalajs.dom + +import scala.scalajs.js.annotation.JSExport + +@JSExport +object ScratchPad extends{ + @JSExport + def main(canvas: dom.HTMLCanvasElement) = { + /*setup*/ + val renderer = canvas.getContext("2d") + .asInstanceOf[dom.CanvasRenderingContext2D] + + canvas.width = canvas.parentElement.clientWidth + canvas.height = canvas.parentElement.clientHeight + + renderer.fillStyle = "#f8f8f8" + renderer.fillRect(0, 0, canvas.width, canvas.height) + + /*code*/ + renderer.fillStyle = "black" + var down = false + canvas.onmousedown = (e: dom.MouseEvent)=>{ + down = true + } + canvas.onmouseup = (e: dom.MouseEvent)=>{ + down = false + } + canvas.onmousemove = (e: dom.MouseEvent)=>{ + val rect = canvas.getBoundingClientRect() + if (down) renderer.fillRect( + e.clientX - rect.left, + e.clientY - rect.top, + 10, 10 + ) + } + } +} \ No newline at end of file diff --git a/examples/demos/src/main/scala/webpage/HelloWorld0.scala b/examples/demos/src/main/scala/webpage/HelloWorld0.scala new file mode 100644 index 0000000..df458ac --- /dev/null +++ b/examples/demos/src/main/scala/webpage/HelloWorld0.scala @@ -0,0 +1,19 @@ +package webpage +import org.scalajs.dom +import scala.scalajs.js.annotation.JSExport +@JSExport +object HelloWorld0 extends{ + @JSExport + def main(target: dom.HTMLDivElement) = { + val (animalA, animalB) = ("fox", "dog") + target.innerHTML = s""" +
+

Hello World!

+

+ The quick brown $animalA + jumped over the lazy $animalB +

+
+ """ + } +} \ No newline at end of file diff --git a/examples/demos/src/main/scala/webpage/HelloWorld1.scala b/examples/demos/src/main/scala/webpage/HelloWorld1.scala new file mode 100644 index 0000000..1dc77b3 --- /dev/null +++ b/examples/demos/src/main/scala/webpage/HelloWorld1.scala @@ -0,0 +1,18 @@ +package webpage +import org.scalajs.dom +import scala.scalajs.js.annotation.JSExport +import scalatags.JsDom.all._ +@JSExport +object HelloWorld1 extends{ + @JSExport + def main(target: dom.HTMLDivElement) = { + val (animalA, animalB) = ("fox", "dog") + target.appendChild( + div( + h1("Hello World!"), + p("The quick brown ", b(animalA), + " jumped over the lazy ", i(animalB), ".") + ).render + ) + } +} \ No newline at end of file diff --git a/examples/demos/src/main/scala/webpage/Inputs.scala b/examples/demos/src/main/scala/webpage/Inputs.scala new file mode 100644 index 0000000..9339e84 --- /dev/null +++ b/examples/demos/src/main/scala/webpage/Inputs.scala @@ -0,0 +1,35 @@ +package webpage + +import org.scalajs.dom +import scala.scalajs.js.annotation.JSExport +import scalatags.JsDom.all._ + +@JSExport +object Inputs extends{ + @JSExport + def main(target: dom.HTMLDivElement) = { + val box = input( + `type`:="text", + placeholder:="Type here!" + ).render + + val output = span.render + + box.onkeyup = (e: dom.Event) => { + output.textContent = + box.value.toUpperCase + } + + target.appendChild( + div( + h1("Capital Box!"), + p( + "Type here and " + + "have it capitalized!" + ), + div(box), + div(output) + ).render + ) + } +} \ No newline at end of file diff --git a/examples/demos/src/main/scala/webpage/Search0.scala b/examples/demos/src/main/scala/webpage/Search0.scala new file mode 100644 index 0000000..300b506 --- /dev/null +++ b/examples/demos/src/main/scala/webpage/Search0.scala @@ -0,0 +1,50 @@ +package webpage + +import org.scalajs.dom +import scala.scalajs.js.annotation.JSExport +import scalatags.JsDom.all._ + +@JSExport +object Search0 extends{ + @JSExport + def main(target: dom.HTMLDivElement) = { + val listings = Seq( + "Apple", "Apricot", "Banana", "Cherry", + "Mango", "Mangosteen", "Mandarin", + "Grape", "Grapefruit", "Guava" + ) + + def renderListings = ul( + for { + fruit <- listings + if fruit.toLowerCase.startsWith( + box.value.toLowerCase + ) + } yield li(fruit) + ).render + + lazy val box = input( + `type`:="text", + placeholder:="Type here!" + ).render + + val output = div(renderListings).render + + box.onkeyup = (e: dom.Event) => { + output.innerHTML = "" + output.appendChild(renderListings) + } + + target.appendChild( + div( + h1("Search Box!"), + p( + "Type here to filter " + + "the list of things below!" + ), + div(box), + output + ).render + ) + } +} \ No newline at end of file diff --git a/examples/demos/src/main/scala/webpage/Search1.scala b/examples/demos/src/main/scala/webpage/Search1.scala new file mode 100644 index 0000000..1936898 --- /dev/null +++ b/examples/demos/src/main/scala/webpage/Search1.scala @@ -0,0 +1,62 @@ +package webpage + +import org.scalajs.dom +import scala.scalajs.js.annotation.JSExport +import scalatags.JsDom.all._ + +@JSExport +object Search1 extends{ + @JSExport + def main(target: dom.HTMLDivElement) = { + val listings = Seq( + "Apple", "Apricot", "Banana", "Cherry", + "Mango", "Mangosteen", "Mandarin", + "Grape", "Grapefruit", "Guava" + ) + + def renderListings = ul( + for { + fruit <- listings + if fruit.toLowerCase.startsWith( + box.value.toLowerCase + ) + } yield { + val (first, last) = fruit.splitAt( + box.value.length + ) + li( + span( + backgroundColor:="yellow", + first + ), + last + ) + } + ).render + + + lazy val box = input( + `type`:="text", + placeholder:="Type here!" + ).render + + val output = div(renderListings).render + + box.onkeyup = (e: dom.Event) => { + output.innerHTML = "" + output.appendChild(renderListings) + } + + target.appendChild( + div( + h1("Search Box!"), + p( + "Type here to filter " + + "the list of things below!" + ), + div(box), + output + ).render + ) + } +} \ No newline at end of file diff --git a/examples/demos/src/main/scala/webpage/Weather0.scala b/examples/demos/src/main/scala/webpage/Weather0.scala new file mode 100644 index 0000000..4a2c6f0 --- /dev/null +++ b/examples/demos/src/main/scala/webpage/Weather0.scala @@ -0,0 +1,27 @@ +package webpage + +import org.scalajs.dom +import org.scalajs.dom.{Node, Element} +import scala.scalajs.js +import scala.scalajs.js.annotation.JSExport +import scalatags.JsDom.all._ + +@JSExport +object Weather0 extends{ + @JSExport + def main(target: dom.HTMLDivElement) = { + val xhr = new dom.XMLHttpRequest() + xhr.open("GET", + "http://api.openweathermap.org/" + + "data/2.5/weather?q=Singapore" + ) + xhr.onload = (e: dom.Event) => { + if (xhr.status == 200) { + target.appendChild( + pre(xhr.responseText).render + ) + } + } + xhr.send() + } +} \ No newline at end of file diff --git a/examples/demos/src/main/scala/webpage/Weather1.scala b/examples/demos/src/main/scala/webpage/Weather1.scala new file mode 100644 index 0000000..c509cb5 --- /dev/null +++ b/examples/demos/src/main/scala/webpage/Weather1.scala @@ -0,0 +1,30 @@ +package webpage + +import org.scalajs.dom +import org.scalajs.dom.{Node, Element} +import scala.scalajs.js +import scala.scalajs.js.annotation.JSExport +import scalatags.JsDom.all._ + +@JSExport +object Weather1 extends{ + @JSExport + def main(target: dom.HTMLDivElement) = { + import dom.extensions._ + import scala.scalajs + .concurrent + .JSExecutionContext + .Implicits + .runNow + + val url = + "http://api.openweathermap.org/" + + "data/2.5/weather?q=Singapore" + + Ajax.get(url).onSuccess{ case xhr => + target.appendChild( + pre(xhr.responseText).render + ) + } + } +} \ No newline at end of file diff --git a/examples/demos/src/main/scala/webpage/Weather2.scala b/examples/demos/src/main/scala/webpage/Weather2.scala new file mode 100644 index 0000000..aa04059 --- /dev/null +++ b/examples/demos/src/main/scala/webpage/Weather2.scala @@ -0,0 +1,35 @@ +package webpage + +import org.scalajs.dom +import org.scalajs.dom.{Node, Element} +import scala.scalajs.js +import scala.scalajs.js.annotation.JSExport +import scalatags.JsDom.all._ + +@JSExport +object Weather2 extends{ + @JSExport + def main(target: dom.HTMLDivElement) = { + import dom.extensions._ + import scala.scalajs + .concurrent + .JSExecutionContext + .Implicits + .runNow + + val url = + "http://api.openweathermap.org/" + + "data/2.5/weather?q=Singapore" + + Ajax.get(url).onSuccess{ case xhr => + target.appendChild( + pre( + js.JSON.stringify( + js.JSON.parse(xhr.responseText), + space=4 + ) + ).render + ) + } + } +} \ No newline at end of file diff --git a/examples/demos/src/main/scala/webpage/Weather3.scala b/examples/demos/src/main/scala/webpage/Weather3.scala new file mode 100644 index 0000000..4dadf94 --- /dev/null +++ b/examples/demos/src/main/scala/webpage/Weather3.scala @@ -0,0 +1,55 @@ +package webpage + +import org.scalajs.dom +import org.scalajs.dom.{Node, Element} +import scala.scalajs.js +import scala.scalajs.js.annotation.JSExport +import scalatags.JsDom.all._ + +@JSExport +object Weather3 extends{ + @JSExport + def main(target: dom.HTMLDivElement) = { + import dom.extensions._ + import scala.scalajs + .concurrent + .JSExecutionContext + .Implicits + .runNow + + val url = + "http://api.openweathermap.org/" + + "data/2.5/weather?q=Singapore" + + Ajax.get(url).onSuccess{ case xhr => + if (xhr.status == 200) { + val json = js.JSON.parse( + xhr.responseText + ) + val name = json.name.toString + val weather = json.weather + .pop() + .main + .toString + + def celsius(kelvins: js.Dynamic) = { + kelvins.asInstanceOf[Double] - 273.15 + }.toInt + val min = celsius(json.main.temp_min) + val max = celsius(json.main.temp_max) + val humid = json.main.humidity.toString + target.appendChild( + div( + b("Weather in Singapore:"), + ul( + li(b("Country "), name), + li(b("Weather "), weather), + li(b("Temp "), min, " - ", max), + li(b("Humidity "), humid, "%") + ) + ).render + ) + } + } + } +} \ No newline at end of file diff --git a/examples/demos/src/main/scala/webpage/WeatherSearch.scala b/examples/demos/src/main/scala/webpage/WeatherSearch.scala new file mode 100644 index 0000000..0c8acc9 --- /dev/null +++ b/examples/demos/src/main/scala/webpage/WeatherSearch.scala @@ -0,0 +1,90 @@ +package webpage + +import org.scalajs.dom +import dom.extensions._ +import scala.scalajs.concurrent.JSExecutionContext.Implicits.runNow +import scala.scalajs.js +import scala.scalajs.js.annotation.JSExport +import scalatags.JsDom.all._ + +@JSExport +object WeatherSearch extends{ + @JSExport + def main(target: dom.HTMLDivElement) = { + + lazy val box = input( + `type`:="text", + placeholder:="Type here!" + ).render + + lazy val output = div( + height:="400px", + overflowY:="scroll" + ).render + + box.onkeyup = (e: dom.Event) => { + output.innerHTML = "Loading..." + fetchWeather(box.value) + } + + target.appendChild( + div( + h1("Weather Search"), + p( + "Enter the name of a city to pull the ", + "latest weather data from api.openweathermap.com!" + ), + p(box), + hr, output, hr + ).render + ) + + def fetchWeather(query: String) = { + val searchUrl = + "http://api.openweathermap.org/data/" + + "2.5/find?type=like&mode=json&q=" + + query + + for{ + xhr <- Ajax.get(searchUrl) + if query == box.value + } js.JSON.parse(xhr.responseText).list match{ + case jsonlist: js.Array[js.Dynamic] => + output.innerHTML = "" + showResults(jsonlist, query) + case _ => + output.innerHTML = "No Results" + } + } + + def showResults(jsonlist: js.Array[js.Dynamic], query: String) = { + for (json <- jsonlist) { + val name = json.name.toString + val country = json.sys.country.toString + val weather = json.weather.pop().main.toString + + def celsius(kelvins: js.Dynamic) = { + kelvins.asInstanceOf[Double] - 273.15 + }.toInt + + val min = celsius(json.main.temp_min) + val max = celsius(json.main.temp_max) + val humid = json.main.humidity.toString + val (first, last) = name.splitAt(query.length) + output.appendChild( + div( + b(span(first, backgroundColor:="yellow"), last, ", ", country), + ul( + li(b("Weather "), weather), + li(b("Temp "), min, " - ", max), + li(b("Humidity "), humid, "%") + ) + ).render + ) + } + + } + + + } +} \ No newline at end of file diff --git a/examples/src/main/resources/webpage/weather.js b/examples/src/main/resources/webpage/weather.js deleted file mode 100644 index 8e95305..0000000 --- a/examples/src/main/resources/webpage/weather.js +++ /dev/null @@ -1,17 +0,0 @@ -function WeatherJs(target) { - var xhr = new XMLHttpRequest() - - xhr.open("GET", - "http://api.openweathermap.org/data/" + - "2.5/weather?q=Singapore" - ); - - xhr.onload = function (e) { - if (xhr.status == 200) { - var pre = document.createElement("pre"); - pre.textContent = xhr.responseText; - target.appendChild(pre); - } - }; - xhr.send(); -} \ No newline at end of file diff --git a/examples/src/main/scala/Splash.scala b/examples/src/main/scala/Splash.scala deleted file mode 100644 index c68bdca..0000000 --- a/examples/src/main/scala/Splash.scala +++ /dev/null @@ -1,43 +0,0 @@ -import java.lang.Math._ - -import org.scalajs.dom - -import scala.scalajs.js.annotation.JSExport - -@JSExport -object Splash extends{ - @JSExport - def main(canvas: dom.HTMLCanvasElement) = { - - def clear() = { - canvas.width = canvas.parentElement.clientWidth - canvas.height = canvas.parentElement.clientHeight - } - clear() - - val renderer = - canvas.getContext("2d") - .asInstanceOf[dom.CanvasRenderingContext2D] - - def h = canvas.height - def w = canvas.width - - var x = 0.0 - type Graph = (String, Double => Double) - val graphs = Seq[Graph]( - ("red", sin), - ("green", x => 1 - abs(x % 4 - 2)), - ("blue", x => pow(sin(x/12), 2) * sin(x)) - ).zipWithIndex - dom.setInterval(() => { - x = (x + 1) % w; if (x == 0) clear() - for (((color, f), i) <- graphs) { - val offset = h / 3 * (i + 0.5) - val y = f(x / w * 75) * h / 30 - renderer.fillStyle = color - renderer.fillRect(x, y + offset, 3, 3) - } - }, 20) - - } -} \ No newline at end of file diff --git a/examples/src/main/scala/canvasapp/Clock.scala b/examples/src/main/scala/canvasapp/Clock.scala deleted file mode 100644 index af9d8aa..0000000 --- a/examples/src/main/scala/canvasapp/Clock.scala +++ /dev/null @@ -1,51 +0,0 @@ -package canvasapp - - -import org.scalajs.dom - -import scala.scalajs.js -import scala.scalajs.js.annotation.JSExport -@JSExport -object Clock extends{ - @JSExport - def main(canvas: dom.HTMLCanvasElement) = { - /*setup*/ - val renderer = canvas.getContext("2d") - .asInstanceOf[dom.CanvasRenderingContext2D] - - canvas.width = canvas.parentElement.clientWidth - canvas.height = canvas.parentElement.clientHeight - - val gradient = renderer.createLinearGradient( - canvas.width / 2 - 100, 0, canvas.width/ 2 + 100, 0 - ) - gradient.addColorStop(0,"red") - gradient.addColorStop(0.5,"green") - gradient.addColorStop(1,"blue") - renderer.fillStyle = gradient - //renderer.fillStyle = "black" - - renderer.textAlign = "center" - renderer.textBaseline = "middle" - - /*code*/ - def render() = { - val date = new js.Date() - renderer.clearRect( - 0, 0, canvas.width, canvas.height - ) - - renderer.font = "75px sans-serif" - renderer.fillText( - Seq( - date.getHours(), - date.getMinutes(), - date.getSeconds() - ).mkString(":"), - canvas.width / 2, - canvas.height / 2 - ) - } - dom.setInterval(render _, 1000) - } -} \ No newline at end of file diff --git a/examples/src/main/scala/canvasapp/FlappyLine.scala b/examples/src/main/scala/canvasapp/FlappyLine.scala deleted file mode 100644 index 50c9906..0000000 --- a/examples/src/main/scala/canvasapp/FlappyLine.scala +++ /dev/null @@ -1,107 +0,0 @@ -package canvasapp - - -import org.scalajs.dom - -import scala.scalajs.js.annotation.JSExport -import scala.util.Random - -@JSExport -object FlappyLine extends{ - @JSExport - def main(canvas: dom.HTMLCanvasElement) = { - /*setup*/ - - val renderer = canvas.getContext("2d") - .asInstanceOf[dom.CanvasRenderingContext2D] - - canvas.width = canvas.parentElement.clientWidth - canvas.height = 400 - - renderer.font = "50px sans-serif" - renderer.textAlign = "center" - renderer.textBaseline = "middle" - - /*variables*/ - val obstacleGap = 200 // Gap between the approaching obstacles - val holeSize = 50 // Size of the hole in each obstacle you must go through - val gravity = 0.1 // Y acceleration of the player - - var playerY = canvas.height / 2.0 // Y position of the player; X is fixed - var playerV = 0.0 // Y velocity of the player - // Whether the player is dead or not; - // 0 means alive, >0 is number of frames before respawning - var dead = 0 - // What frame this is; used to keep track - // of where the obstacles should be positioned - var frame = -50 - // List of each obstacle, storing only the Y position of the hole. - // The X position of the obstacle is calculated by its position in the - // queue and in the current frame. - val obstacles = collection.mutable.Queue.empty[Int] - - - def runLive() = { - frame += 2 - - // Create new obstacles, or kill old ones as necessary - if (frame >= 0 && frame % obstacleGap == 0) - obstacles.enqueue(Random.nextInt(canvas.height - 2 * holeSize) + holeSize) - if (obstacles.length > 7){ - obstacles.dequeue() - frame -= obstacleGap - } - - // Apply physics - playerY = playerY + playerV - playerV = playerV + gravity - - - // Render obstacles, and check for collision - renderer.fillStyle = "darkblue" - for((holeY, i) <- obstacles.zipWithIndex){ - val holeX = i * obstacleGap - frame + canvas.width - renderer.fillRect(holeX, 0, 5, holeY - holeSize) - renderer.fillRect( - holeX, holeY + holeSize, 5, canvas.height - holeY - holeSize - ) - if (math.abs(holeX - canvas.width/2) < 5 && - math.abs(holeY - playerY) > holeSize){ - dead = 50 - } - } - - // Render player - renderer.fillStyle = "darkgreen" - renderer.fillRect(canvas.width / 2 - 5, playerY - 5, 10, 10) - - // Check for out-of-bounds player - if (playerY < 0 || playerY > canvas.height){ - dead = 50 - } - } - - - def runDead() = { - playerY = canvas.height / 2 - playerV = 0 - frame = -50 - obstacles.clear() - dead -= 1 - renderer.fillStyle = "darkred" - renderer.fillText("You Died", canvas.width / 2, canvas.height / 2) - } - - def run() = { - renderer.clearRect(0, 0, canvas.width, canvas.height) - if (dead > 0) runDead() - else runLive() - } - - dom.setInterval(run _, 20) - - canvas.onclick = (e: dom.MouseEvent) => { - playerV -= 5 - } - } -} \ No newline at end of file diff --git a/examples/src/main/scala/canvasapp/ScratchPad.scala b/examples/src/main/scala/canvasapp/ScratchPad.scala deleted file mode 100644 index cc3d7e0..0000000 --- a/examples/src/main/scala/canvasapp/ScratchPad.scala +++ /dev/null @@ -1,40 +0,0 @@ -package canvasapp - - -import org.scalajs.dom - -import scala.scalajs.js.annotation.JSExport - -@JSExport -object ScratchPad extends{ - @JSExport - def main(canvas: dom.HTMLCanvasElement) = { - /*setup*/ - val renderer = canvas.getContext("2d") - .asInstanceOf[dom.CanvasRenderingContext2D] - - canvas.width = canvas.parentElement.clientWidth - canvas.height = canvas.parentElement.clientHeight - - renderer.fillStyle = "#f8f8f8" - renderer.fillRect(0, 0, canvas.width, canvas.height) - - /*code*/ - renderer.fillStyle = "black" - var down = false - canvas.onmousedown = (e: dom.MouseEvent)=>{ - down = true - } - canvas.onmouseup = (e: dom.MouseEvent)=>{ - down = false - } - canvas.onmousemove = (e: dom.MouseEvent)=>{ - val rect = canvas.getBoundingClientRect() - if (down) renderer.fillRect( - e.clientX - rect.left, - e.clientY - rect.top, - 10, 10 - ) - } - } -} \ No newline at end of file diff --git a/examples/src/main/scala/webpage/HelloWorld0.scala b/examples/src/main/scala/webpage/HelloWorld0.scala deleted file mode 100644 index df458ac..0000000 --- a/examples/src/main/scala/webpage/HelloWorld0.scala +++ /dev/null @@ -1,19 +0,0 @@ -package webpage -import org.scalajs.dom -import scala.scalajs.js.annotation.JSExport -@JSExport -object HelloWorld0 extends{ - @JSExport - def main(target: dom.HTMLDivElement) = { - val (animalA, animalB) = ("fox", "dog") - target.innerHTML = s""" -
-

Hello World!

-

- The quick brown $animalA - jumped over the lazy $animalB -

-
- """ - } -} \ No newline at end of file diff --git a/examples/src/main/scala/webpage/HelloWorld1.scala b/examples/src/main/scala/webpage/HelloWorld1.scala deleted file mode 100644 index 1dc77b3..0000000 --- a/examples/src/main/scala/webpage/HelloWorld1.scala +++ /dev/null @@ -1,18 +0,0 @@ -package webpage -import org.scalajs.dom -import scala.scalajs.js.annotation.JSExport -import scalatags.JsDom.all._ -@JSExport -object HelloWorld1 extends{ - @JSExport - def main(target: dom.HTMLDivElement) = { - val (animalA, animalB) = ("fox", "dog") - target.appendChild( - div( - h1("Hello World!"), - p("The quick brown ", b(animalA), - " jumped over the lazy ", i(animalB), ".") - ).render - ) - } -} \ No newline at end of file diff --git a/examples/src/main/scala/webpage/Inputs.scala b/examples/src/main/scala/webpage/Inputs.scala deleted file mode 100644 index 9339e84..0000000 --- a/examples/src/main/scala/webpage/Inputs.scala +++ /dev/null @@ -1,35 +0,0 @@ -package webpage - -import org.scalajs.dom -import scala.scalajs.js.annotation.JSExport -import scalatags.JsDom.all._ - -@JSExport -object Inputs extends{ - @JSExport - def main(target: dom.HTMLDivElement) = { - val box = input( - `type`:="text", - placeholder:="Type here!" - ).render - - val output = span.render - - box.onkeyup = (e: dom.Event) => { - output.textContent = - box.value.toUpperCase - } - - target.appendChild( - div( - h1("Capital Box!"), - p( - "Type here and " + - "have it capitalized!" - ), - div(box), - div(output) - ).render - ) - } -} \ No newline at end of file diff --git a/examples/src/main/scala/webpage/Search0.scala b/examples/src/main/scala/webpage/Search0.scala deleted file mode 100644 index 300b506..0000000 --- a/examples/src/main/scala/webpage/Search0.scala +++ /dev/null @@ -1,50 +0,0 @@ -package webpage - -import org.scalajs.dom -import scala.scalajs.js.annotation.JSExport -import scalatags.JsDom.all._ - -@JSExport -object Search0 extends{ - @JSExport - def main(target: dom.HTMLDivElement) = { - val listings = Seq( - "Apple", "Apricot", "Banana", "Cherry", - "Mango", "Mangosteen", "Mandarin", - "Grape", "Grapefruit", "Guava" - ) - - def renderListings = ul( - for { - fruit <- listings - if fruit.toLowerCase.startsWith( - box.value.toLowerCase - ) - } yield li(fruit) - ).render - - lazy val box = input( - `type`:="text", - placeholder:="Type here!" - ).render - - val output = div(renderListings).render - - box.onkeyup = (e: dom.Event) => { - output.innerHTML = "" - output.appendChild(renderListings) - } - - target.appendChild( - div( - h1("Search Box!"), - p( - "Type here to filter " + - "the list of things below!" - ), - div(box), - output - ).render - ) - } -} \ No newline at end of file diff --git a/examples/src/main/scala/webpage/Search1.scala b/examples/src/main/scala/webpage/Search1.scala deleted file mode 100644 index 1936898..0000000 --- a/examples/src/main/scala/webpage/Search1.scala +++ /dev/null @@ -1,62 +0,0 @@ -package webpage - -import org.scalajs.dom -import scala.scalajs.js.annotation.JSExport -import scalatags.JsDom.all._ - -@JSExport -object Search1 extends{ - @JSExport - def main(target: dom.HTMLDivElement) = { - val listings = Seq( - "Apple", "Apricot", "Banana", "Cherry", - "Mango", "Mangosteen", "Mandarin", - "Grape", "Grapefruit", "Guava" - ) - - def renderListings = ul( - for { - fruit <- listings - if fruit.toLowerCase.startsWith( - box.value.toLowerCase - ) - } yield { - val (first, last) = fruit.splitAt( - box.value.length - ) - li( - span( - backgroundColor:="yellow", - first - ), - last - ) - } - ).render - - - lazy val box = input( - `type`:="text", - placeholder:="Type here!" - ).render - - val output = div(renderListings).render - - box.onkeyup = (e: dom.Event) => { - output.innerHTML = "" - output.appendChild(renderListings) - } - - target.appendChild( - div( - h1("Search Box!"), - p( - "Type here to filter " + - "the list of things below!" - ), - div(box), - output - ).render - ) - } -} \ No newline at end of file diff --git a/examples/src/main/scala/webpage/Weather0.scala b/examples/src/main/scala/webpage/Weather0.scala deleted file mode 100644 index 4a2c6f0..0000000 --- a/examples/src/main/scala/webpage/Weather0.scala +++ /dev/null @@ -1,27 +0,0 @@ -package webpage - -import org.scalajs.dom -import org.scalajs.dom.{Node, Element} -import scala.scalajs.js -import scala.scalajs.js.annotation.JSExport -import scalatags.JsDom.all._ - -@JSExport -object Weather0 extends{ - @JSExport - def main(target: dom.HTMLDivElement) = { - val xhr = new dom.XMLHttpRequest() - xhr.open("GET", - "http://api.openweathermap.org/" + - "data/2.5/weather?q=Singapore" - ) - xhr.onload = (e: dom.Event) => { - if (xhr.status == 200) { - target.appendChild( - pre(xhr.responseText).render - ) - } - } - xhr.send() - } -} \ No newline at end of file diff --git a/examples/src/main/scala/webpage/Weather1.scala b/examples/src/main/scala/webpage/Weather1.scala deleted file mode 100644 index c509cb5..0000000 --- a/examples/src/main/scala/webpage/Weather1.scala +++ /dev/null @@ -1,30 +0,0 @@ -package webpage - -import org.scalajs.dom -import org.scalajs.dom.{Node, Element} -import scala.scalajs.js -import scala.scalajs.js.annotation.JSExport -import scalatags.JsDom.all._ - -@JSExport -object Weather1 extends{ - @JSExport - def main(target: dom.HTMLDivElement) = { - import dom.extensions._ - import scala.scalajs - .concurrent - .JSExecutionContext - .Implicits - .runNow - - val url = - "http://api.openweathermap.org/" + - "data/2.5/weather?q=Singapore" - - Ajax.get(url).onSuccess{ case xhr => - target.appendChild( - pre(xhr.responseText).render - ) - } - } -} \ No newline at end of file diff --git a/examples/src/main/scala/webpage/Weather2.scala b/examples/src/main/scala/webpage/Weather2.scala deleted file mode 100644 index aa04059..0000000 --- a/examples/src/main/scala/webpage/Weather2.scala +++ /dev/null @@ -1,35 +0,0 @@ -package webpage - -import org.scalajs.dom -import org.scalajs.dom.{Node, Element} -import scala.scalajs.js -import scala.scalajs.js.annotation.JSExport -import scalatags.JsDom.all._ - -@JSExport -object Weather2 extends{ - @JSExport - def main(target: dom.HTMLDivElement) = { - import dom.extensions._ - import scala.scalajs - .concurrent - .JSExecutionContext - .Implicits - .runNow - - val url = - "http://api.openweathermap.org/" + - "data/2.5/weather?q=Singapore" - - Ajax.get(url).onSuccess{ case xhr => - target.appendChild( - pre( - js.JSON.stringify( - js.JSON.parse(xhr.responseText), - space=4 - ) - ).render - ) - } - } -} \ No newline at end of file diff --git a/examples/src/main/scala/webpage/Weather3.scala b/examples/src/main/scala/webpage/Weather3.scala deleted file mode 100644 index 4dadf94..0000000 --- a/examples/src/main/scala/webpage/Weather3.scala +++ /dev/null @@ -1,55 +0,0 @@ -package webpage - -import org.scalajs.dom -import org.scalajs.dom.{Node, Element} -import scala.scalajs.js -import scala.scalajs.js.annotation.JSExport -import scalatags.JsDom.all._ - -@JSExport -object Weather3 extends{ - @JSExport - def main(target: dom.HTMLDivElement) = { - import dom.extensions._ - import scala.scalajs - .concurrent - .JSExecutionContext - .Implicits - .runNow - - val url = - "http://api.openweathermap.org/" + - "data/2.5/weather?q=Singapore" - - Ajax.get(url).onSuccess{ case xhr => - if (xhr.status == 200) { - val json = js.JSON.parse( - xhr.responseText - ) - val name = json.name.toString - val weather = json.weather - .pop() - .main - .toString - - def celsius(kelvins: js.Dynamic) = { - kelvins.asInstanceOf[Double] - 273.15 - }.toInt - val min = celsius(json.main.temp_min) - val max = celsius(json.main.temp_max) - val humid = json.main.humidity.toString - target.appendChild( - div( - b("Weather in Singapore:"), - ul( - li(b("Country "), name), - li(b("Weather "), weather), - li(b("Temp "), min, " - ", max), - li(b("Humidity "), humid, "%") - ) - ).render - ) - } - } - } -} \ No newline at end of file diff --git a/examples/src/main/scala/webpage/WeatherSearch.scala b/examples/src/main/scala/webpage/WeatherSearch.scala deleted file mode 100644 index 0c8acc9..0000000 --- a/examples/src/main/scala/webpage/WeatherSearch.scala +++ /dev/null @@ -1,90 +0,0 @@ -package webpage - -import org.scalajs.dom -import dom.extensions._ -import scala.scalajs.concurrent.JSExecutionContext.Implicits.runNow -import scala.scalajs.js -import scala.scalajs.js.annotation.JSExport -import scalatags.JsDom.all._ - -@JSExport -object WeatherSearch extends{ - @JSExport - def main(target: dom.HTMLDivElement) = { - - lazy val box = input( - `type`:="text", - placeholder:="Type here!" - ).render - - lazy val output = div( - height:="400px", - overflowY:="scroll" - ).render - - box.onkeyup = (e: dom.Event) => { - output.innerHTML = "Loading..." - fetchWeather(box.value) - } - - target.appendChild( - div( - h1("Weather Search"), - p( - "Enter the name of a city to pull the ", - "latest weather data from api.openweathermap.com!" - ), - p(box), - hr, output, hr - ).render - ) - - def fetchWeather(query: String) = { - val searchUrl = - "http://api.openweathermap.org/data/" + - "2.5/find?type=like&mode=json&q=" + - query - - for{ - xhr <- Ajax.get(searchUrl) - if query == box.value - } js.JSON.parse(xhr.responseText).list match{ - case jsonlist: js.Array[js.Dynamic] => - output.innerHTML = "" - showResults(jsonlist, query) - case _ => - output.innerHTML = "No Results" - } - } - - def showResults(jsonlist: js.Array[js.Dynamic], query: String) = { - for (json <- jsonlist) { - val name = json.name.toString - val country = json.sys.country.toString - val weather = json.weather.pop().main.toString - - def celsius(kelvins: js.Dynamic) = { - kelvins.asInstanceOf[Double] - 273.15 - }.toInt - - val min = celsius(json.main.temp_min) - val max = celsius(json.main.temp_max) - val humid = json.main.humidity.toString - val (first, last) = name.splitAt(query.length) - output.appendChild( - div( - b(span(first, backgroundColor:="yellow"), last, ", ", country), - ul( - li(b("Weather "), weather), - li(b("Temp "), min, " - ", max), - li(b("Humidity "), humid, "%") - ) - ).render - ) - } - - } - - - } -} \ No newline at end of file -- cgit v1.2.3