diff options
author | metamuffin <metamuffin@disroot.org> | 2022-09-26 16:53:23 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2022-09-26 16:53:23 +0200 |
commit | b14edcc66993a3e84bbfa0606bff04d0fe271e48 (patch) | |
tree | ac3c5f9055b0beb0244cd59dc428c758036d1303 /code/grammar | |
parent | 6bccd84c8b846daa6fc3214cfcdb02474dd566e2 (diff) | |
download | metamuffin-blog-b14edcc66993a3e84bbfa0606bff04d0fe271e48.tar metamuffin-blog-b14edcc66993a3e84bbfa0606bff04d0fe271e48.tar.bz2 metamuffin-blog-b14edcc66993a3e84bbfa0606bff04d0fe271e48.tar.zst |
almost a good parser
Diffstat (limited to 'code/grammar')
-rw-r--r-- | code/grammar/markdown.pest | 30 |
1 files changed, 20 insertions, 10 deletions
diff --git a/code/grammar/markdown.pest b/code/grammar/markdown.pest index ebdfcd7..e387182 100644 --- a/code/grammar/markdown.pest +++ b/code/grammar/markdown.pest @@ -1,17 +1,27 @@ +// WHITESPACE = _{ " " | "\t" | NEWLINE } -file = _{ SOI ~ block* ~ EOI } +file = _{ SOI ~ NEWLINE* ~ (block ~ NEWLINE*)* ~ EOI } -block = { (code_block | header | list | paragraph | "") ~ NEWLINE } +block = { code_block | latex_block | header | unordered_list | ordered_list | paragraph } header = { "#"+ ~ span } - list = { list_item+ } - list_item = { "-" ~ span } + unordered_list = { unordered_list_item+ } + unordered_list_item = { "-" ~ span ~ NEWLINE } + ordered_list = { ordered_list_item+ } + ordered_list_item = { ASCII_DIGIT+ ~ "." ~ span ~ NEWLINE } paragraph = { span } - code_block = { "```" ~ (!"```" ~ ANY) ~ "```" } + code_block = { "```" ~ code_block_lang ~ NEWLINE ~ code_block_inner ~ "```" } + code_block_lang = { ASCII_ALPHANUMERIC* } + code_block_inner = { (!"```" ~ ANY)* } + latex_block = { "$$" ~ latex_block_inner ~ "$$" } + latex_block_inner = { (!"$$" ~ ANY)* } -span = { (style_bold | style_italic | style_code | text)+ } +span = { (style_bold | style_italic | style_code | inline_latex | text)+ } style_bold = { "**" ~ text ~ "**" } style_italic = { "_" ~ text ~ "_" } - style_code = { "`" ~ text ~ "`" } - text = { (!(NEWLINE | "*" | "_" | "`") ~ ANY)+ } - - + style_code = { "`" ~ code_inner ~ "`" } + code_inner = { (!"`" ~ ANY)+ } + inline_latex = { "$" ~ latex_inner ~ "$" } + latex_inner = { (!"$" ~ ANY)+ } + + text = { (!("\n" ~ forbidden_span_wrap | "*" | "_" | "`" | "$") ~ ANY)+ } + forbidden_span_wrap = _{ "\n" | "-" | ASCII_DIGIT+ ~ "." } |