progs/display/display.scala
changeset 738 084e2843f478
child 873 a25da86f7c8c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/progs/display/display.scala	Fri Jul 24 12:58:19 2020 +0100
@@ -0,0 +1,100 @@
+
+import scalatags.Text.all._
+import scalatags.Text._
+import scala.util.Random
+
+
+
+object MinimalApplication extends cask.MainRoutes{
+
+  abstract class Rexp 
+  case object ZERO extends Rexp
+  case object ONE extends Rexp
+  case class CHAR(c: Char) extends Rexp
+  case class ALT(r1: Rexp, r2: Rexp) extends Rexp 
+  case class SEQ(r1: Rexp, r2: Rexp) extends Rexp 
+  case class STAR(r: Rexp) extends Rexp 
+
+  val evil2 = ALT(SEQ(STAR(STAR(CHAR('a'))), CHAR('b')), ONE)
+
+  def pp(r: Rexp) : TypedTag[String] = r match {
+    case CHAR(c) => li(code(c.toString))
+    case ALT(r1, r2) => li(code("+"), ul(pp(r1), pp(r2)))
+    case SEQ(r1, r2) => li(code("o"), ul(pp(r1), pp(r2)))
+    case STAR(r1) => li(code("*"), ul(pp(r1)))
+    case ZERO => li(code("0"))
+    case ONE => li(code(div(style :="line-height:50%")
+                           ("1",br, 
+                            div(color:="blue", fontSize:=6.pt)("0101010101"))))
+  } 
+
+  abstract class ARexp 
+  case object AZERO extends ARexp
+  case class AONE(bs: String) extends ARexp
+  case class ACHAR(bs:String, c: Char) extends ARexp
+  case class AALT(bs:String, r1: ARexp, r2: ARexp) extends ARexp 
+  case class ASEQ(bs: String,r1: ARexp, r2: ARexp) extends ARexp 
+  case class ASTAR(bs:String,r: ARexp) extends ARexp 
+
+
+  def node(s: String, bs: String) = {
+    if (bs == "")
+      code(div(div(style :="line-height:75%")(s, br, div(color:="blue", fontSize:=6.pt)(raw("&nbsp")))))
+    else
+      code(div(div(style :="line-height:75%")(s, br, div(color:="blue", fontSize:=6.pt)(bs))))
+  }
+  
+
+  val aevil2 = AALT("", ASEQ(" ",ASTAR("111",ASTAR("0",ACHAR("00",'a'))), ACHAR("00",'b')), AONE("01"))
+
+  def ppa(r: ARexp) : TypedTag[String] = r match {
+    case ACHAR(bs, c) => li(node(c.toString, bs))
+    case AALT(bs, r1, r2) => li(node("+", bs), ul(ppa(r1), ppa(r2)))
+    case ASEQ(bs, r1, r2) => li(node("o", bs), ul(ppa(r1), ppa(r2)))
+    case ASTAR(bs, r1) => li(node("*", bs), ul(ppa(r1)))
+    case AZERO => li(node("0", ""))
+    case AONE(bs) => li(node("1", bs))
+  } 
+
+
+
+
+
+  val bootstrap = "https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.css"
+
+  var cnt = 0
+
+  @cask.get("/")
+  def hello() = 
+      doctype("html")(
+      html(
+        head(link(rel := "stylesheet", href := bootstrap),
+             link(rel := "stylesheet", href := "static/style.css")), 
+        body(
+          div(cls := "container")( 
+            h1(s"Hello"),
+            i(color.green)(s"$cnt"),
+            form(action := "/", method := "post")(
+              button(`type` := "submit", name := "name", value := 1)(s"1"),
+            ),
+            ul(cls := "tree")(pp(evil2)),
+	    ul(cls := "tree")(ppa(aevil2))
+          )
+        )
+      )
+    )
+
+  @cask.postForm("/")
+  def answer(name: String) = {
+    cnt = cnt + 1
+    hello()
+  }
+
+  //@cask.staticFiles("/static/")
+  //def staticFileRoutes() = "static"
+
+  @cask.staticResources("/static")
+  def staticResourceRoutes() = "static"
+
+  initialize()
+}