summaryrefslogtreecommitdiff
path: root/scalatexApi/src/main/scala/scalatex/ScalatexParser.scala
diff options
context:
space:
mode:
authorLi Haoyi <haoyi@dropbox.com>2014-11-02 21:03:28 -0800
committerLi Haoyi <haoyi@dropbox.com>2014-11-02 21:03:28 -0800
commit5cf89bb9d5e0d3c42610d3d2be47815ef41ecd65 (patch)
tree1bfa790b317c176ff7e087ab8ecad66d1130394b /scalatexApi/src/main/scala/scalatex/ScalatexParser.scala
parent5dbe9747db34b1aea95df002270e9634df533805 (diff)
downloadhands-on-scala-js-5cf89bb9d5e0d3c42610d3d2be47815ef41ecd65.tar.gz
hands-on-scala-js-5cf89bb9d5e0d3c42610d3d2be47815ef41ecd65.tar.bz2
hands-on-scala-js-5cf89bb9d5e0d3c42610d3d2be47815ef41ecd65.zip
Moved new implementation out of test/ folder
Diffstat (limited to 'scalatexApi/src/main/scala/scalatex/ScalatexParser.scala')
-rw-r--r--scalatexApi/src/main/scala/scalatex/ScalatexParser.scala37
1 files changed, 37 insertions, 0 deletions
diff --git a/scalatexApi/src/main/scala/scalatex/ScalatexParser.scala b/scalatexApi/src/main/scala/scalatex/ScalatexParser.scala
new file mode 100644
index 0000000..406f4cd
--- /dev/null
+++ b/scalatexApi/src/main/scala/scalatex/ScalatexParser.scala
@@ -0,0 +1,37 @@
+package scalatex
+
+import org.parboiled2._
+import torimatomeru.ScalaSyntax
+
+trait Ast{
+ def offset: Int
+}
+object Ast{
+ case class Block(parts: Seq[Block.Sub], offset: Int = 0) extends Chain.Sub
+ object Block{
+ trait Sub
+ case class Text(txt: String, offset: Int = 0) extends Block.Sub
+ }
+ case class Code(code: String, offset: Int = 0)
+ case class Chain(lhs: Code, parts: Seq[Chain.Sub], offset: Int = 0) extends Block.Sub
+ object Chain{
+ trait Sub
+ case class Prop(str: String, offset: Int = 0) extends Sub
+ case class Args(str: String, offset: Int = 0) extends Sub
+ }
+}
+class ScalatexParser(input: ParserInput) extends ScalaSyntax(input) {
+ def TextNot(chars: String) = rule { capture(oneOrMore(noneOf(chars) | "@@")) ~> (x => Ast.Block.Text(x.replace("@@", "@"))) }
+ def Text = TextNot("@")
+ def Code = rule {
+ "@" ~ capture(Id | BlockExpr | ('(' ~ optional(Exprs) ~ ')')) ~> (Ast.Code(_))
+ }
+ def ScalaChain = rule { Code ~ zeroOrMore(Extension) ~> (Ast.Chain(_, _)) }
+ def Extension: Rule1[Ast.Chain.Sub] = rule {
+ (capture(('.' ~ Id) ~ optional(TypeArgs)) ~> (Ast.Chain.Prop(_))) |
+ (capture(!BlockExpr ~ ArgumentExprs) ~> (Ast.Chain.Args(_))) |
+ TBlock
+ }
+ def TBlock = rule{ '{' ~ Body ~ '}' }
+ def Body = rule{ zeroOrMore(TextNot("@}") | ScalaChain) ~> (x => Ast.Block(x)) }
+}