diff options
author | Li Haoyi <haoyi@dropbox.com> | 2014-11-02 21:03:28 -0800 |
---|---|---|
committer | Li Haoyi <haoyi@dropbox.com> | 2014-11-02 21:03:28 -0800 |
commit | 5cf89bb9d5e0d3c42610d3d2be47815ef41ecd65 (patch) | |
tree | 1bfa790b317c176ff7e087ab8ecad66d1130394b /scalatexApi/src/main/scala/scalatex/ScalatexParser.scala | |
parent | 5dbe9747db34b1aea95df002270e9634df533805 (diff) | |
download | hands-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.scala | 37 |
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)) } +} |