# Subsets of Markdown syntax structure # expressed in parsing expression grammar (PEG) notation. # # Copyright 2025, Jonas Smedegaard # SPDX-License-Identifier: GPL-3+ # Document Markdown <- ('---' NEWLINE MetaBlock* '---' NEWLINE)? Block* # Block elements Block <- Header / List / LinkDefinition / Paragraph Header <- '#'+ SPACE* !NEWLINE Words? SPACE* NEWLINE List <- ([-*]+ / [[:digit:]]+ [).]) (_ (List / Words))? NEWLINE LinkDefinition <- LinkLabel ':' _? Uri (_ LinkTitle)? NEWLINE Paragraph <- Words (HardBreak Words)* NEWLINE+ # Inline elements Words <- StyledWords / LinkedWords / AnnotatedWords / PlainWords StyledWords <- '**' Words '**' / '*' Words '*' / '_' Words '_' LinkedWords <- '[' Words ']' '(' ((Uri _)? LinkTitle / Uri) ')' / '[' Words ']' LinkLabel / LinkLabel AnnotatedWords <- '[' Words ']' '{' ![{}] PlainWords '}' LinkLabel <- '[' _? ![\[\]] PlainWords _? ']' LinkTitle <- '"' _? !'"' _? PlainWords _? '"' / "'" _? !"'" PlainWords _? "'" / "(" _? ![()] PlainWords _? ")" PlainWords <- PRINTABLES (_ PRINTABLES)* Uri <- '<' ![<>] PRINTABLES? '>' / ![<>] PRINTABLES HardBreak <- SPACE SPACE+ NEWLINE _ <- SPACE+ / SPACE? NEWLINE SPACE? SPACE? SPACE? # Terminals PRINTABLES <- [[:graph:]]+ SPACE <- ' ' NEWLINE <- '\r\n' / '\n' / '\r' # Semantic Markdown AnnotatedWordsX <- '[' Words ']' ('{' (SemWords / ![{}] PlainWords) '}') SemWords <- SEMPREFIX '<' ![<>] PRINTABLES '>' / SEMPREFIX Curie Curie <- NAME? ':' NAME? SEMPREFIX <- [.#]