cdoc-parser 0.1.0-alpha1

A markdown-based document parser with custom syntax
Documentation
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 }