syntax .markdown-escape

state char special
    char !-/:-@[-`{-~ END special
    recolor text 1
    noeat END

syntax .markdown-fenced-code-block

state body code-block
    char "\n" line-start
    eat this

state line-start code-block
    heredocend end
    noeat body

state end code-block
    char "\n" END
    noeat body

syntax markdown

# TODO: All variations of links and references
# TODO: Underlined headings
# TODO: Escapes

state file-start
    str -- "---\n" yaml
    noeat line-start

state yaml
    str -- "---\n" line-start yaml
    str "...\n" line-start yaml
    eat this

state line-start
    str "\t" code-block
    str "    " code-block
    char " " this
    char # hash-heading
    char > block-quote
    char [ maybe-link-def
    char -b 0-9 digit
    str "**" double-asterisk
    char * bullet-asterisk emphasis
    char +- bullet
    char -b "~" tilde
    char -b "`" backtick
    noeat text

state text
    char "\n" line-start
    char '`' code-span
    char [ reference
    str '**' double-asterisk
    str '__' double-underline
    char * asterisk
    char _ underscore
    char "\\" .markdown-escape:this
    eat this

state bullet
    char "\n" line-start
    char -n " \t" text
    recolor unordered-list 2
    noeat text

state bullet-asterisk
    char "\n" line-start
    char -n " \t" asterisk emphasis
    recolor unordered-list 2
    noeat text

state code-block
    char "\n" line-start
    eat this

state backtick code-block
    char -b '`' this
    bufis '`' code-span
    bufis '``' text code-span
    heredocbegin .markdown-fenced-code-block line-start

state tilde code-block
    char -b '~' this
    bufis '~' text
    bufis '~~' text
    heredocbegin .markdown-fenced-code-block line-start

state block-quote
    char "\n" line-start
    eat this

state digit
    char "\n" line-start
    char -b 0-9 this
    char -n . text
    recolor ordered-list
    eat text ordered-list

state hash-heading heading
    char "\n" line-start
    eat this

state code-span
    char "\n" line-start
    char ` text code-span
    eat this

state asterisk emphasis
    char * text emphasis
    char -n "\n" this
    noeat line-start

state double-asterisk strong-emphasis
    char "\n" line-start
    str '**' text strong-emphasis
    eat this

state underscore emphasis
    char _ text emphasis
    char -n "\n" this
    noeat line-start

state double-underline strong-emphasis
    char "\n" line-start
    str '__' text strong-emphasis
    eat this

state reference
    char "\\" .markdown-escape:this
    char ] reference-close reference
    eat this

state reference-close
    char "\n" line-start
#    char ( reference-link
#    char [ reference-pointer
    noeat text

state maybe-link-def reference
    char "\\" .markdown-escape:this
    char ] maybe-link-def-close
    eat this

state maybe-link-def-close reference
    char : link-def reference
    noeat reference-close

state link-def
    char " \t" this
    char "\n" line-start
    noeat link-def-url

state link-def-url url
    char "\n" line-start
    char " \t" link-def-after-url
    eat this

state link-def-after-url text
    char "\n" line-start
    eat this

default comment yaml
default special unordered-list
default numeric ordered-list
