WHITESPACE = _{ (" " | "\t" | "\r") }
SHORTCODE_SIGIL = _{ "#" }
command_disallow = _{ !command_name }
BASE_CHARS = _{ ASCII_ALPHANUMERIC | SYMBOL | NEWLINE | "-" | "/" | " " | "*" | "_" | "." | "," | "`" | ":" | ";" | "%" | "^" | "$" | "\\" | "(" | ")" | "\t" | "=" | "<" | ">" | "?" | "'" }
string = { (!"\\{" ~ !"\\}" ~ !"$" ~ BASE_CHARS)+ }
md_val = { (command | code_def | math_block | verbatim_def | string)* }
string_v = _{ ("\"" | "“") ~ string ~ ("\"" | "”") }
markdown_string = _{ "{" ~ md_val ~ "}" }
basic_val = { ASCII_ALPHANUMERIC ~ (ASCII_ALPHANUMERIC | WHITESPACE | "#" | " " | "-" | "/" | "*" | "_" | "." | ":" | ";" | "%" | "^" | "$" | "\\" | "<" | ">" | "{" | "}" | "?" | "'")* }
ident = { ASCII_ALPHANUMERIC ~ (ASCII_ALPHANUMERIC | "_" | "-" | ":")+ }
key = { (ASCII_ALPHANUMERIC | "_" | "-")+ }
flag = { (ASCII_ALPHANUMERIC | "_" | "-")+ }
flag_def = _{ ":" ~ flag }
value = _{ basic_val | string_v | markdown_string | flag_def }
param = { (key ~ "=" ~ value) | value }
parameters = { "(" ~ NEWLINE* ~ param ~ ("," ~ NEWLINE* ~ param)* ~ NEWLINE* ~ ")" }
body = { (!"}" ~ !"\\{" ~ command_disallow ~ !"`" ~ !"$" ~ ANY)+ }
body_inner = _{ (code_def | math_block | command | verbatim_def | body)* }
body_def = { "{" ~ body_inner ~ "}" }
label_def = _{ "|" ~ label }
label = ${ ident }
command_name = ${ SHORTCODE_SIGIL ~ ident }
command = { command_name ~ !")" ~ label_def? ~ parameters? ~ body_def? ~ !"(" ~ !")" }
math_block = { math_lvl ~ math ~ POP ~ label_def? }
math_lvl = { PUSH("$"+) }
math = { (!PEEK ~ ANY)+ }
verbatim_def = _{ "\\{" ~ verbatim ~ "\\}" }
code_param = { (key ~ "=" ~ basic_val) | basic_val }
code_def = { code_lvl ~ code_params? ~ code ~ POP ~ label_def? }
code_params = { code_param ~ ("," ~ code_param)* ~ NEWLINE }
code_lvl = { PUSH("`"+) }
code = { (!PEEK ~ ANY)+ }
verbatim = { (!"\\}" ~ ANY)+ }
src = ${ ("#"+ ~ WHITESPACE) | (command_disallow ~ !"$" ~ !"`" ~ !"\\{" ~ !"\\}" ~ ANY)+ }
element = _{ math_block | code_def | verbatim_def | command | src }
meta = { (!(NEWLINE ~ "---") ~ ANY)* }
meta_def = _{ ("---" ~ NEWLINE) ~ meta ~ (NEWLINE ~ "---") }
doc = { meta_def? ~ element* }
top = _{ doc ~ EOI }