[[[
some statements
[[[
some more statements
]]]
some final statements
]]]
some statements
[[[
some more statements
]]]
some final statements
def Start = rule { str("[[[") }
def End = rule { str("]]]") }
def Code = rule {
Start ~ capture(!End ~ ANY) ~ End
}
def Code = rule {
Start ~ capture(!RULE ~ ANY) ~ End
}
protected def Code: Rule1[ast.Text] = {
var countStart = 0
var countEnd = 0
def lastTriplet = (charAt(-3) :: charAt(-2) :: charAt(-1) :: Nil).mkString
def ValidCodeChar = {
val lt = lastTriplet
if (lt == BasicToken.CODE_START.entryName) countStart += 1
if (lt == BasicToken.CODE_END.entryName) countEnd += 1
if (countStart - countEnd > 1) {
rule {
ANY
}
}
else {
rule {
!CodeEnd ~ ANY
}
}
}
rule {
CodeStart ~
capture(oneOrMore(ValidCodeChar)) ~
CodeEnd ~>
((s: String) => ast.Text(Seq(ast.PlainText(s))))
}
}
private def CodeEnd = rule {
str("]]]")
}
private def CodeStart = rule {
str("[[[")
}