| 
     1   | 
         | 
     2 import scalatags.Text.all._  | 
         | 
     3 import scalatags.Text._  | 
         | 
     4 import scala.util.Random  | 
         | 
     5   | 
         | 
     6   | 
         | 
     7   | 
         | 
     8 object MinimalApplication extends cask.MainRoutes{ | 
         | 
     9   | 
         | 
    10   abstract class Rexp   | 
         | 
    11   case object ZERO extends Rexp  | 
         | 
    12   case object ONE extends Rexp  | 
         | 
    13   case class CHAR(c: Char) extends Rexp  | 
         | 
    14   case class ALT(r1: Rexp, r2: Rexp) extends Rexp   | 
         | 
    15   case class SEQ(r1: Rexp, r2: Rexp) extends Rexp   | 
         | 
    16   case class STAR(r: Rexp) extends Rexp   | 
         | 
    17   | 
         | 
    18   val evil2 = ALT(SEQ(STAR(STAR(CHAR('a'))), CHAR('b')), ONE) | 
         | 
    19   | 
         | 
    20   def pp(r: Rexp) : TypedTag[String] = r match { | 
         | 
    21     case CHAR(c) => li(code(c.toString))  | 
         | 
    22     case ALT(r1, r2) => li(code("+"), ul(pp(r1), pp(r2))) | 
         | 
    23     case SEQ(r1, r2) => li(code("o"), ul(pp(r1), pp(r2))) | 
         | 
    24     case STAR(r1) => li(code("*"), ul(pp(r1))) | 
         | 
    25     case ZERO => li(code("0")) | 
         | 
    26     case ONE => li(code(div(style :="line-height:50%")  | 
         | 
    27                            ("1",br,  | 
         | 
    28                             div(color:="blue", fontSize:=6.pt)("0101010101")))) | 
         | 
    29   }   | 
         | 
    30   | 
         | 
    31   abstract class ARexp   | 
         | 
    32   case object AZERO extends ARexp  | 
         | 
    33   case class AONE(bs: String) extends ARexp  | 
         | 
    34   case class ACHAR(bs:String, c: Char) extends ARexp  | 
         | 
    35   case class AALT(bs:String, r1: ARexp, r2: ARexp) extends ARexp   | 
         | 
    36   case class ASEQ(bs: String,r1: ARexp, r2: ARexp) extends ARexp   | 
         | 
    37   case class ASTAR(bs:String,r: ARexp) extends ARexp   | 
         | 
    38   | 
         | 
    39   | 
         | 
    40   def node(s: String, bs: String) = { | 
         | 
    41     if (bs == "")  | 
         | 
    42       code(div(div(style :="line-height:75%")(s, br, div(color:="blue", fontSize:=6.pt)(raw(" "))))) | 
         | 
    43     else  | 
         | 
    44       code(div(div(style :="line-height:75%")(s, br, div(color:="blue", fontSize:=6.pt)(bs))))  | 
         | 
    45   }  | 
         | 
    46     | 
         | 
    47   | 
         | 
    48   val aevil2 = AALT("", ASEQ(" ",ASTAR("111",ASTAR("0",ACHAR("00",'a'))), ACHAR("00",'b')), AONE("01")) | 
         | 
    49   | 
         | 
    50   def ppa(r: ARexp) : TypedTag[String] = r match { | 
         | 
    51     case ACHAR(bs, c) => li(node(c.toString, bs))  | 
         | 
    52     case AALT(bs, r1, r2) => li(node("+", bs), ul(ppa(r1), ppa(r2))) | 
         | 
    53     case ASEQ(bs, r1, r2) => li(node("o", bs), ul(ppa(r1), ppa(r2))) | 
         | 
    54     case ASTAR(bs, r1) => li(node("*", bs), ul(ppa(r1))) | 
         | 
    55     case AZERO => li(node("0", "")) | 
         | 
    56     case AONE(bs) => li(node("1", bs)) | 
         | 
    57   }   | 
         | 
    58   | 
         | 
    59   | 
         | 
    60   | 
         | 
    61   | 
         | 
    62   | 
         | 
    63   val bootstrap = "https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.css"  | 
         | 
    64   | 
         | 
    65   var cnt = 0  | 
         | 
    66   | 
         | 
    67   @cask.get("/") | 
         | 
    68   def hello() =   | 
         | 
    69       doctype("html")( | 
         | 
    70       html(  | 
         | 
    71         head(link(rel := "stylesheet", href := bootstrap),  | 
         | 
    72              link(rel := "stylesheet", href := "static/style.css")),   | 
         | 
    73         body(  | 
         | 
    74           div(cls := "container")(   | 
         | 
    75             h1(s"Hello"),  | 
         | 
    76             i(color.green)(s"$cnt"),  | 
         | 
    77             form(action := "/", method := "post")(  | 
         | 
    78               button(`type` := "submit", name := "name", value := 1)(s"1"),  | 
         | 
    79             ),  | 
         | 
    80             ul(cls := "tree")(pp(evil2)),  | 
         | 
    81 	    ul(cls := "tree")(ppa(aevil2))  | 
         | 
    82           )  | 
         | 
    83         )  | 
         | 
    84       )  | 
         | 
    85     )  | 
         | 
    86   | 
         | 
    87   @cask.postForm("/") | 
         | 
    88   def answer(name: String) = { | 
         | 
    89     cnt = cnt + 1  | 
         | 
    90     hello()  | 
         | 
    91   }  | 
         | 
    92   | 
         | 
    93   //@cask.staticFiles("/static/") | 
         | 
    94   //def staticFileRoutes() = "static"  | 
         | 
    95   | 
         | 
    96   @cask.staticResources("/static") | 
         | 
    97   def staticResourceRoutes() = "static"  | 
         | 
    98   | 
         | 
    99   initialize()  | 
         | 
   100 }  |