notedown_parser 0.2.0

Notedown Text parser and formatter
Documentation
program = _{SOI ~ statement*  ~  EOI}
TextMode = _{SOI ~ (TextElement|TextRest)*  ~  EOI}
statement = _{
    SPACE_SEPARATOR* ~ Header
  | SPACE_SEPARATOR* ~ HorizontalRule
  | SPACE_SEPARATOR* ~ Code
  | SPACE_SEPARATOR* ~ Table
  | SPACE_SEPARATOR* ~ List
  | SPACE_SEPARATOR* ~ Command
  | EmptyLine{1,}
  | TextBlock
}
EmptyLine = _{SPACE_SEPARATOR*  ~  NEWLINE}
/*====================================================================================================================*/
//!#E06C75: Header
Header = ${Sharp{1, 6}  ~  RestOfLine}
/*====================================================================================================================*/
TextBlock = {TextHeaderCharacter  ~  TextBlockLine*}
TextHeaderCharacter = _{!NEWLINE  ~ ANY}
TextBlockLine = _{!(EmptyLine{2,}|Sharp)  ~ ANY}
TextElement = _{StyleStatement|LineStatement|MathStatement|RawStatement|NEWLINE|Escaped|Command}
TextRest = {(!(NEWLINE|Escape|Tilde|Asterisk|Dollar|Accent) ~ ANY)+}
/*====================================================================================================================*/
//!#61AFEF: Code
//!#E06C75: CodeText
Code = {CodeLevel ~ CodeAction? ~SYMBOL? ~ arguments? ~SPACE_SEPARATOR*~ CodeText ~ POP ~ CodeMark{3}}
CodeAction = {At|Asterisk|Sharp}
CodeLevel = {CodeMark{3}~PUSH(CodeMark*)}
CodeText = {(!(CodeMark ~ PEEK) ~ ANY)*}
CodeMark = @{Accent}
/*====================================================================================================================*/
//!Orange: TableMark
Table = {TableMark ~ (!TableEnd~ANY)* ~ TableEnd}
TableEnd = {EmptyLine{2}|EmptyLine~EOI|EOI}

TableMode = _{SOI ~ TableLine*  ~  EOI}
TableLine = _{TableEscape |TableMark |TextElement| TableRest}
TableEscape = @{Escape ~ TableMark}
TableText = {(TextElement)+}
TableRest = {(!(TableMark|Escape) ~ ANY)+}
TableMark = @{Vertical}
/*====================================================================================================================*/
//!Green: ListMark
List = {ListMark ~ (!ListEnd~ANY)* ~ ListEnd}
ListEnd = {EmptyLine{2}|EmptyLine~EOI|EOI}
program_list = _{SOI ~ ListStatement+  ~  EOI}
ListStatement = {NEWLINE~ListHeadLevel~ListMark~ ListRest}
ListHeadLevel = {SPACE_SEPARATOR*}
ListRest = {(!ListStatement~ANY)*}
ListMark = @{Plus|Minus|Vertical|QuoteMark|Integer~Dot}
/*====================================================================================================================*/
///Red
HorizontalRule = @{Set{3,}|Minus{3,}}
/*====================================================================================================================*/
MathStatement = _{Math|MathRest}
///#E06C75
Math = {MathLevel ~ MathText ~ POP ~ Dollar}
MathLevel = {Dollar~PUSH (Dollar*)}
MathText = {(Escape~Dollar|!(Dollar ~ PEEK) ~ ANY)*}
///Gray
MathRest = {Dollar+}
/*====================================================================================================================*/
RawStatement = _{Raw|RawRest}
///#98C379
Raw = {RawLevel ~ RawText ~ POP ~ Accent}
RawLevel = {Accent~PUSH (Accent*)}
RawText = {(Escape~Accent|!(Accent ~ PEEK) ~ ANY)*}
///Gray
RawRest = {Accent+}
/*====================================================================================================================*/
StyleStatement = _{Style|StyleRest}
///#D19A66
Style = {StyleLevel ~ StyleText ~ POP ~ Asterisk}
StyleLevel = {Asterisk~PUSH (Asterisk*)}
StyleText = {(Escape~Asterisk|!(Asterisk ~ PEEK) ~ ANY)*}
///Gray
StyleRest = {Asterisk+}
/*====================================================================================================================*/
LineStatement = _{Line|LineRest}
///#61AFEF
Line = {LineLevel ~ LineText ~ POP ~ Tilde}
LineLevel = {Tilde~PUSH (Tilde*)}
LineText = {(Escape~Tilde|!(Tilde ~ PEEK) ~ ANY)*}
///Gray
LineRest = {Tilde+}
/*====================================================================================================================*/
Command = _{CommandLine| CommandBlock}

//!#56B6C2: Set
//!#E06C75: key
CommandBlock = !{command ~ arguments*}
arguments = _{
    "{"  ~SPACE_SEPARATOR*~ (key_value|argument)* ~SPACE_SEPARATOR*~  "}"
  | "["  ~ argument_literal ~  "]"
}
argument_literal = {(Escape ~ (Escape|"]")|!"]" ~ ANY)*}
argument = {value  ~SPACE_SEPARATOR*~  Comma? ~ SPACE_SEPARATOR*}
key_value = {key  ~SPACE_SEPARATOR*~  Set  ~SPACE_SEPARATOR*~ value  ~SPACE_SEPARATOR*~  Comma? ~ SPACE_SEPARATOR*}
key = {Integer|String|SYMBOL}
value = {Integer|String|expression|Keywords|SYMBOL}
expression = {SYMBOL~(Dot~ function)+}
function = {
    SYMBOL ~ ("("~SPACE_SEPARATOR*~ (key_value|argument)* ~SPACE_SEPARATOR*~  ")")?
}

//!#61AFEF: CommandBlock
CommandLine = {command ~ Colon  ~  RestOfLine}
command = @{Escape ~ SYMBOL}
RestOfLine = !{(!NEWLINE  ~  ANY)*}
/*====================================================================================================================*/
//!#D19A66: Integer|Decimal|DecimalBad|Exponent|ComplexHandler
Number = ${Decimal|DecimalBad|Integer}
Decimal = ${Integer  ~ Dot ~  ASCII_DIGIT+}
DecimalBad = ${Integer ~ Dot | Dot ~ ASCII_DIGIT+}
Integer = @{Zero|ASCII_DIGIT  ~  (Underline?  ~  ASCII_NONZERO_DIGIT)* }
Zero = @{"0"}
/*====================================================================================================================*/
///#98C379
String = ${
    S1  ~  (Escape ~ (Escape|S1)|!S1 ~ ANY)*  ~  S1
  | S2  ~  (Escape ~ (Escape|S2)|!S2 ~ ANY)*  ~  S2
}
S1 = _{"'"}
S2 = _{"\""}
/*====================================================================================================================*/
SYMBOL = @{
    XID_START ~ XID_CONTINUE*
  | Underline~XID_CONTINUE+
}
Escaped = @{Escape~(Escape|Tilde|Asterisk|Dollar|Accent)}
Keywords = @{"true"|"false"|"null"}
// = _{!SPACE_SEPARATOR ~ ANY}
/*====================================================================================================================*/
//!Gray:BlockComment|LineComment
COMMENT = ${BlockComment|LineComment }
LineComment = ${Comment  ~ SPACE_SEPARATOR* ~  Colon  ~  RestOfLine}
BlockComment = ${Comment  ~ SPACE_SEPARATOR* ~  "{"  ~ MultiLineComment ~  "}"}
MultiLineComment = ${(BlockComment | !"}"  ~  ANY)*}
Comment = @{Escape ~ "comment"}
/*====================================================================================================================*/
NEWLINE = @{CR ~ LF|CR|LF}
SPACE_SEPARATOR = {" "|"\t"}
TAB = @{"\t"}
CR = @{"\r"}
LF = @{"\n"}
/*====================================================================================================================*/
Escape = @{"\\"}
At = @{"@"}
Sharp = @{"#"}
Underline = @{"_"}
Asterisk = @{"*"}
Comma = @{","}
Dot = @{"."}
Set = @{"="}
Colon = @{":"}
Vertical = @{"|"}
Plus = @{"+"}
Minus = @{"-"}
QuoteMark = @{">"}
Accent = @{"`"}
Dollar = @{"$"}
Tilde = @{"~"}