diff options
Diffstat (limited to 'scalatexApi/src')
4 files changed, 199 insertions, 146 deletions
diff --git a/scalatexApi/src/main/scala/scalatex/stages/Compiler.scala b/scalatexApi/src/main/scala/scalatex/stages/Compiler.scala index 8bb203a..7d1492c 100644 --- a/scalatexApi/src/main/scala/scalatex/stages/Compiler.scala +++ b/scalatexApi/src/main/scala/scalatex/stages/Compiler.scala @@ -38,6 +38,17 @@ object Compiler{ case Ast.Block.Text(str, _) => q"$str" case Ast.Chain(code, parts, offset) => compileChain(code, parts, offset) case Ast.Header(header, block, offset) => compileHeader(header, block, offset) + case b @ Ast.Block.IfElse(condString, Ast.Block(parts2, offset2), elseBlock, offset) => + println("AST " + b) + val If(cond, _, _) = c.parse(condString + "{}") + val elseCompiled = elseBlock match{ + case Some(Ast.Block(parts3, offset3)) => wrapBlock(compileBlock(parts3, offset3)) + case None => EmptyTree + } + + val res = If(cond, wrapBlock(compileBlock(parts2, offset2)), elseCompiled) + println("Tree " + res) + res case Ast.Block.For(generators, Ast.Block(parts2, offset2), offset) => val fresh = c.fresh() @@ -48,7 +59,7 @@ object Compiler{ val a2 = Apply(fun, List(f2)) a2 case Ident(x: TermName) if x.decoded == fresh => - q"Seq[$fragType](..${compileBlock(parts2, offset2)})" + wrapBlock(compileBlock(parts2, offset2)) } val out = rec(tree) diff --git a/scalatexApi/src/main/scala/scalatex/stages/Parser.scala b/scalatexApi/src/main/scala/scalatex/stages/Parser.scala index 48138af..7b694da 100644 --- a/scalatexApi/src/main/scala/scalatex/stages/Parser.scala +++ b/scalatexApi/src/main/scala/scalatex/stages/Parser.scala @@ -51,7 +51,8 @@ class Parser(input: ParserInput, indent: Int = 0) extends ScalaSyntax(input) { } def BlankLine = rule{ '\n' ~ zeroOrMore(' ') ~ &('\n') } - def Indent = rule{ '\n' ~ indent.times(' ') ~ zeroOrMore(' ') } + def IndentSpaces = rule{ indent.times(' ') ~ zeroOrMore(' ') } + def Indent = rule{ '\n' ~ IndentSpaces } def LoneScalaChain: Rule2[Ast.Block.Text, Ast.Chain] = rule { (capture(Indent) ~> (Ast.Block.Text(_))) ~ ScalaChain ~ @@ -60,26 +61,27 @@ class Parser(input: ParserInput, indent: Int = 0) extends ScalaSyntax(input) { } } def IndentBlock = rule{ + &("\n") ~ test(cursorNextIndent() > indent) ~ runSubParser(new Parser(_, cursorNextIndent()).Body) } def IfHead = rule{ "@" ~ capture("if" ~ "(" ~ Expr ~ ")") } def IfElse1 = rule{ - IfHead ~ BraceBlock ~ optional("else" ~ (BraceBlock | IndentBlock)) + IfHead ~ BraceBlock ~ optional("else" ~ (BraceBlock | IndentBlock)) } def IfElse2 = rule{ - IfHead ~ IndentBlock ~ optional(Indent ~ "@else" ~ (BraceBlock | IndentBlock)) + Indent ~ IfHead ~ IndentBlock ~ optional(Indent ~ "@else" ~ (BraceBlock | IndentBlock)) } def IfElse = rule{ (IfElse1 | IfElse2) ~> (Ast.Block.IfElse(_, _, _)) } def ForHead = rule{ - "@" ~ capture("for" ~ '(' ~ Enumerators ~ ')'~ run(println("f"))) + "@" ~ capture("for" ~ '(' ~ Enumerators ~ ')') } def ForLoop = rule{ - run(println("A")) ~ ForHead ~ run(println("B")) ~ - BraceBlock ~ run(println("C")) ~> (Ast.Block.For(_, _)) + ForHead ~ + BraceBlock ~> (Ast.Block.For(_, _)) } def LoneForLoop = rule{ (capture(Indent) ~> (Ast.Block.Text(_))) ~ diff --git a/scalatexApi/src/test/scala/scalatex/BasicTests.scala b/scalatexApi/src/test/scala/scalatex/BasicTests.scala index 2412456..4bc362c 100644 --- a/scalatexApi/src/test/scala/scalatex/BasicTests.scala +++ b/scalatexApi/src/test/scala/scalatex/BasicTests.scala @@ -193,22 +193,22 @@ object BasicTests extends TestSuite{ """ ) } -// 'linearNested{ -// check( -// tw(""" -// @h1 @span @a Hello World -// @h2 @span @a hello -// @b world -// @h3 @i -// @div Cow -// """), -// """ -// <h1></h1><span></span><a></a>HelloWorld -// <h2></h2><span></span><a></a>hello<b></b>world -// <h3></h3><i></i><div></div>Cow -// """ -// ) -// } + 'linearNested{ + check( + tw(""" + @h1 @span @a Hello World + @h2 @span @a hello + @b world + @h3 @i + @div Cow + """), + """ + <h1></h1><span></span><a></a>HelloWorld + <h2></h2><span></span><a></a>hello<b></b>world + <h3></h3><i></i><div></div>Cow + """ + ) + } 'crasher{ tw(""" @html @@ -294,9 +294,9 @@ object BasicTests extends TestSuite{ // """ // ) // } -// } + } // -// 'loops { + 'loops { // * - check( tw(""" @@ -310,124 +310,124 @@ object BasicTests extends TestSuite{ """), "lollollol" ) -// -// -// * - check( -// tw(""" -// @p -// @for(x <- 0 until 2) -// @for(y <- 0 until 2) -// lol@x@y -// """), -// tw( """ -// @p -// @for(x <- 0 until 2) { -// @for(y <- 0 until 2) -// lol@x@y -// } -// """), -// tw(""" -// @p -// @for(x <- 0 until 2) -// @for(y <- 0 until 2){ -// lol@x@y -// } -// """), -// "<p>lol00lol01lol10lol11</p>" -// ) -// check( -// tw(""" -// @p -// @for(x <- 0 until 2) -// @for(y <- 0 until 2) -// lol@x@y -// """), -// "<p>lol00lol01lol10lol11</p>" -// ) -// -// * - check( -// tw( -// """ -// @for(x <- 0 until 2; y <- 0 until 2) -// @div{@x@y} -// -// """), -// """<div>00</div><div>01</div><div>10</div><div>11</div>""" -// ) -// } -// -// 'ifElse{ -// 'basicExamples{ -// * - check( -// tw(""" -// @if(false) -// Hello -// @else -// lols -// @p -// """), -// "lols<p></p>" -// ) -// -// * - check( -// tw(""" -// @div -// @if(true) -// Hello -// @else -// lols -// """), -// "<div>Hello</div>" -// ) -// -// * - check( -// tw(""" -// @div -// @if(true) -// Hello -// @else -// lols -// """), -// "<div>Hello</div>" -// ) -// * - check( -// tw(""" -// @if(false) -// Hello -// @else -// lols -// """), -// "lols" -// ) -// * - check( -// tw(""" -// @if(false) -// Hello -// @else -// lols -// @img -// """), -// "lols<img/>" -// ) -// * - check( -// tw(""" -// @p -// @if(true) -// Hello -// @else -// lols -// """), -// tw(""" -// @p -// @if(true) { -// Hello -// } else { -// lols -// } -// """), -// "<p>Hello</p>" -// ) -// } + + + * - check( + tw(""" + @p + @for(x <- 0 until 2) + @for(y <- 0 until 2) + lol@x@y + """), + tw( """ + @p + @for(x <- 0 until 2){ + @for(y <- 0 until 2) + lol@x@y + } + """), + tw(""" + @p + @for(x <- 0 until 2) + @for(y <- 0 until 2){ + lol@x@y + } + """), + "<p>lol00lol01lol10lol11</p>" + ) + check( + tw(""" + @p + @for(x <- 0 until 2) + @for(y <- 0 until 2) + lol@x@y + """), + "<p>lol00lol01lol10lol11</p>" + ) + + * - check( + tw( + """ + @for(x <- 0 until 2; y <- 0 until 2) + @div{@x@y} + + """), + """<div>00</div><div>01</div><div>10</div><div>11</div>""" + ) + } + + 'ifElse{ + 'basicExamples{ + * - check( + tw(""" + @if(false) + Hello + @else + lols + @p + """), + "lols<p></p>" + ) + + * - check( + tw(""" + @div + @if(true) + Hello + @else + lols + """), + "<div>Hello</div>" + ) + + * - check( + tw(""" + @div + @if(true) + Hello + @else + lols + """), + "<div>Hello</div>" + ) + * - check( + tw(""" + @if(false) + Hello + @else + lols + """), + "lols" + ) + * - check( + tw(""" + @if(false) + Hello + @else + lols + @img + """), + "lols<img/>" + ) + * - check( + tw(""" + @p + @if(true) + Hello + @else + lols + """), + tw(""" + @p + @if(true){ + Hello + }else{ + lols + } + """), + "<p>Hello</p>" + ) + } // 'funkyExpressions{ // * - check( // tw(""" diff --git a/scalatexApi/src/test/scala/scalatex/ParserTests.scala b/scalatexApi/src/test/scala/scalatex/ParserTests.scala index 5cefa67..150f766 100644 --- a/scalatexApi/src/test/scala/scalatex/ParserTests.scala +++ b/scalatexApi/src/test/scala/scalatex/ParserTests.scala @@ -173,7 +173,7 @@ object ParserTests extends utest.TestSuite{ _.Body.run(), Block(Seq( Text("\n"), - For("for(x <- 0 until 3)", Block(Seq(Text("\n "), Text("lol")))) + For("for(x <- 0 until 3)", Block(Seq(Text("\n "), Text("lol"), Text("\n")))) )) ) } @@ -189,13 +189,15 @@ object ParserTests extends utest.TestSuite{ IfElse("if(true)", Block(Seq(Text("lol"))), Some(Block(Seq(Text(" omg "))))) ) 'ifBlock - check( - """@if(true) + """ + |@if(true) | omg""".stripMargin, _.IfElse.run(), IfElse("if(true)", Block(Seq(Text("\n "), Text("omg"))), None) ) 'ifBlockElseBlock - check( - """@if(true) + """ + |@if(true) | omg |@else | wtf""".stripMargin, @@ -206,6 +208,43 @@ object ParserTests extends utest.TestSuite{ Some(Block(Seq(Text("\n "), Text("wtf")))) ) ) + 'ifBlockElseBraceBlock - check( + """@if(true){ + | omg + |}else{ + | wtf + |}""".stripMargin, + _.IfElse.run(), + IfElse( + "if(true)", + Block(Seq(Text("\n "), Text("omg"), Text("\n"))), + Some(Block(Seq(Text("\n "), Text("wtf"), Text("\n")))) + ) + ) + 'ifBlockElseBraceBlockNested - { + val res = Parser(Trim( + """ + @p + @if(true){ + Hello + }else{ + lols + } + """)) + val expected = + Block(Vector( + Text("\n"), + Chain("p",Vector(Block(Vector( + Text("\n "), + IfElse("if(true)", Block(Vector( + Text("\n "), Text("Hello"), Text("\n "))), + Some(Block(Vector( + Text("\n "), Text("lols"), Text("\n ")))) + ))))), + Text("\n") + )) + assert(res == expected) + } 'ifElseBlock - check( """@if(true){ | omg @@ -219,6 +258,7 @@ object ParserTests extends utest.TestSuite{ ) ) } + } 'Body{ 'indents - check( |