diff -r 14a348d050b3 -r 084e2843f478 progs/display/display.scala --- /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(" "))))) + 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() +}