ws1 = _{ (" " | "\t") }
ws = _{ ws1 * }
wsnl1 = _{ ws1 | "\n" }
wsnl = _{ wsnl1* }
identifier = {
(ASCII_ALPHANUMERIC) ~
(ASCII_ALPHANUMERIC | "_" | "/" | "-" | ":" ) *
}
indent = { " " * }
class = { "." ~ identifier }
id = { "#" ~ identifier }
element = { identifier }
value = { string1 | string2 }
string1 = _{ "'" ~ inner1 ~ "'" }
inner1 = { char1* }
char1 = {
!("'" | "\\") ~ ANY
| "\\" ~ ("'" | "\\" | "/" | "b" | "f" | "n" | "r" | "t")
| "\\" ~ ("u" ~ ASCII_HEX_DIGIT{4})
}
string2 = _{ "\"" ~ inner2 ~ "\"" }
inner2 = { char2* }
char2 = _{
!("\"" | "\\") ~ ANY
| "\\" ~ ("\"" | "\\" | "/" | "b" | "f" | "n" | "r" | "t")
| "\\" ~ ("u" ~ ASCII_HEX_DIGIT{4})
}
attr_name = {
(ASCII_ALPHANUMERIC) ~
(ASCII_ALPHANUMERIC | ":" | "." | "_" | "/" | "-" ) *
}
attr = { attr_name ~ ws ~ "=" ~ ws ~ value ~ wsnl ~ ","? ~ wsnl}
attrs = { ( "(" ~ wsnl ~ attr * ~ wsnl ~ ")" ) }
anystr = {(ASCII_ALPHANUMERIC | ":" | "." | "_" | "/" | "-" ) *}
doctype = {"doctype" ~ ws ~ anystr}
include = {"include" ~ ws ~ anystr }
tag = {
(class | id | element ) ~
(class | id ) * ~
attrs ?
}
text = { (!("\n") ~ ANY)+ }
plaintext = _{ "|" ~ ws1? ~ text }
comment = { "//" ~ text }
decl = _{
indent ~
( doctype |
include |
comment |
plaintext |
tag ~ ( ws1+ ~ text?)? ) ~
("\n")
}
emptyline = _{ ws1* ~ "\n" }
file = { SOI ~ (decl | emptyline )* ~ EOI }