aboutsummaryrefslogtreecommitdiff
path: root/code/src/markdown/parser.pest
blob: a15277f5da4e2c473471395000f1629bf8c0e5ee (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
file = _{ SOI ~ NEWLINE* ~ (block ~ NEWLINE*)* ~ EOI }

block = { code_block | latex_block | header | unordered_list | ordered_list | paragraph }
    header = { "#"{1,6} ~ 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 = { "```" ~ 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 | inline_latex | hyperlink | text)+ }
    style_bold = { "**" ~ span ~ "**" }
    style_italic = { "_" ~ span ~ "_" }
    style_code = { "`" ~ code_inner ~ "`" }
        code_inner = { (!"`" ~ ANY)+ }
    inline_latex = { "$" ~ latex_inner ~ "$" }
        latex_inner = { (!"$" ~ ANY)+ }
    hyperlink = { "[" ~ hyperlink_label ~ "](" ~ hyperlink_location ~ ")" }
        hyperlink_label = { span }
        hyperlink_location = { (!")" ~ANY)+ }
    
    text = { (!("[" | "]" | "*" | "_" | "`" | "$" | ("\n" ~ forbidden_span_wrap)) ~ ANY)+ }
    forbidden_span_wrap = _{ "\n" | "- " | ASCII_DIGIT+ ~ ". " }