Skip to content

Instantly share code, notes, and snippets.

@hroi
Last active February 17, 2019 00:38
Show Gist options
  • Save hroi/c38d6c67844dda07d815d2cd91d80295 to your computer and use it in GitHub Desktop.
Save hroi/c38d6c67844dda07d815d2cd91d80295 to your computer and use it in GitHub Desktop.
Document = { SOI ~ (WHITE_SPACE+ | instr_doctype | Text | Element )+ ~ EOI }
Text = { (!(WHITE_SPACE* ~ "<" | ">") ~ ANY)+ }
Comment = { (!(WHITE_SPACE* ~ "-->") ~ ANY)+ }
Element = {
WHITE_SPACE* ~
(
tag_comment |
tag_void |
tag_open ~ WHITE_SPACE* ~ (Element | Text | WHITE_SPACE+)* ~ tag_close |
tag_empty
)
~ WHITE_SPACE*
}
Attr = { Name ~ (WHITE_SPACE* ~ "=" ~ WHITE_SPACE* ~ Value)? }
Name = { (ASCII_ALPHA) ~ (("-" | ":") ~ ASCII_ALPHANUMERIC | ASCII_ALPHANUMERIC)* }
Value = { PUSH("\"" | "'") ~ Quoted ~ POP | Unquoted }
Quoted = { (("\\" | !PEEK) ~ ANY)+ }
Unquoted = { !("\"" | "\'") ~ (!(WHITE_SPACE | ">") ~ ANY)+ }
Doctype = { (!">" ~ ANY)+ }
instr_doctype = _{ ^"<!doctype" ~ WHITE_SPACE* ~ Doctype ~ WHITE_SPACE* ~ ">"}
tag_comment = _{ "<!--" ~ WHITE_SPACE* ~ Comment* ~ WHITE_SPACE* ~ "-->"}
tag_open = _{ "<" ~ WHITE_SPACE* ~ PUSH(Name) ~ (WHITE_SPACE+ ~ Attr)* ~ WHITE_SPACE* ~ ">"}
tag_close = _{ "</" ~ WHITE_SPACE* ~ POP ~ WHITE_SPACE* ~ ">"}
tag_empty = _{ "<" ~ WHITE_SPACE* ~ Name ~ (WHITE_SPACE+ ~ Attr)* ~ WHITE_SPACE* ~ "/>"}
tag_void = _{ WHITE_SPACE* ~ "<" ~ WHITE_SPACE* ~ &self_closing ~ Name ~ (WHITE_SPACE+ ~ Attr)* ~ WHITE_SPACE* ~ "/"? ~ ">" }
self_closing = _{
^"area" | ^"base" | ^"br" | ^"col" | ^"embed" | ^"hr" | ^"img" |
^"input" | ^"link" | ^"meta" | ^"param" | ^"source" | ^"track" | ^"wbr"
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment