ipug 0.2.0

pug.js port to Rust
Documentation
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 }