program = _{SOI ~ statement* ~ EOI} statement = _{ Header | HorizontalRule | Code | Table | List | Template | Command | EmptyLine{1,} | TextBlock } EmptyLine = _{WHITE_SPACE* ~ LINE_SEPARATOR} BlockEnd = !{EmptyLine{2}|EmptyLine~EOI|EOI} RestOfLine = !{(!LINE_SEPARATOR ~ ANY)*} /*====================================================================================================================*/ //!#E06C75: Header Header = ${WHITE_SPACE* ~ Sharp{1, 6} ~ WHITE_SPACE ~ TextElement+} /*====================================================================================================================*/ TextBlock = {(TextElement|(!LINE_SEPARATOR{2,} ~ LINE_SEPARATOR))+} TextElement = _{ StyleStatement|TildeStatement|MathStatement|RawStatement| CommandLine|CommandBlock|HTMLSelfClose|HTMLOpenClose|URL|Escaped| TextRest // | WHITE_SPACE } /// Black TextRest = {(!(LINE_SEPARATOR|Escape|Vertical|Tilde|Asterisk|Dollar|Accent|Colon|"<") ~ ANY)+} /// Red URL = ${ASCII_ALPHA+ ~ "://" ~ (!PATTERN_WHITE_SPACE ~ ANY)+} /*====================================================================================================================*/ //!#61AFEF: Code //!#E06C75: CodeText Code = {WHITE_SPACE* ~ CodeLevel ~ CodeAction? ~SYMBOL? ~ arguments? ~WHITE_SPACE*~ CodeText ~ POP ~ CodeMark{3}} CodeAction = {At|Asterisk|Sharp} CodeLevel = {CodeMark{3}~PUSH(CodeMark*)} CodeText = {(!(CodeMark ~ PEEK) ~ ANY)*} CodeMark = @{Accent} /*====================================================================================================================*/ /// Green Table = {WHITE_SPACE* ~ TableFirstLine ~ (LINE_SEPARATOR ~ TableRestLine)*} TableFirstLine = {Vertical ~ (Escape ~ Vertical |Vertical |TextElement)*} TableRestLine = {(Escape ~ Vertical |Vertical |TextElement)*} /*====================================================================================================================*/ /// Green List = {ListFirstLine ~ (LINE_SEPARATOR ~ ListRestLine)*} ListFirstLine = { WHITE_SPACE* ~ ListMark ~ Checkmark ~ TextElement+ | WHITE_SPACE* ~ ListMark ~ TextElement+ } ListRestLine = { WHITE_SPACE* ~ (ListMark|Vertical) ~ Checkmark ~ TextElement+ | WHITE_SPACE* ~ (ListMark|Vertical) ~ TextElement+ } ListMark = @{(Minus|Plus|QuoteMark|Integer~Dot) ~ WHITE_SPACE+} Checkmark = @{"["~ ANY ~"]"} /*====================================================================================================================*/ ///Red HorizontalRule = @{WHITE_SPACE* ~ (Minus{3,}|Set{3,})} /*====================================================================================================================*/ MathStatement = _{Math|MathRest} ///#E06C75 Math = {MathLevel ~ MathText ~ POP ~ Dollar} MathLevel = {Dollar~PUSH (Dollar*)} MathText = {(Escape ~ Dollar|!(Dollar ~ PEEK) ~ (!LINE_SEPARATOR{2,} ~ ANY))*} MathBlock = { WHITE_SPACE* ~ "$$" ~ "$$" } ///Gray MathRest = {Dollar+} /*====================================================================================================================*/ RawStatement = _{Raw|RawRest} ///#98C379 Raw = {RawLevel ~ RawText ~ POP ~ Accent} RawLevel = {Accent~PUSH (Accent*)} RawText = {(Escape~Accent|!(Accent ~ PEEK) ~ (!LINE_SEPARATOR{2,} ~ ANY))*} ///Gray RawRest = {Accent+} /*====================================================================================================================*/ StyleStatement = _{Style|StyleRest} ///#D19A66 Style = {StyleLevel ~ StyleText ~ POP ~ Asterisk} StyleLevel = {Asterisk~PUSH (Asterisk*)} StyleText = {(Escape~Asterisk|!(Asterisk ~ PEEK) ~ (!LINE_SEPARATOR{2,} ~ TextElement))*} ///Gray StyleRest = {Asterisk+} /*====================================================================================================================*/ TildeStatement = _{TildeLine|TildeRest} ///#61AFEF TildeLine = {TildeLevel ~ TildeText ~ POP ~ Tilde} TildeLevel = {Tilde ~ PUSH(Tilde*)} TildeText = {(Escape ~ Tilde|!(Tilde ~ PEEK) ~ (!LINE_SEPARATOR{2,} ~ TextElement))*} ///Gray TildeRest = {Tilde+} /*====================================================================================================================*/ //!#E5C07B: HTMLOpen|HTMLClose|HTMLSelfClose Template = _{WHITE_SPACE* ~ (HTMLSelfClose|HTMLOpenClose)} HTMLOpenClose = {HTMLOpen ~ TextElement* ~HTMLClose} HTMLOpen = {"<" ~ PATTERN_WHITE_SPACE* ~ PUSH(SYMBOL) ~(PATTERN_WHITE_SPACE* ~ key_value ~PATTERN_WHITE_SPACE*)* ~ ">"} HTMLClose = {""} HTMLSelfClose = ${"<" ~ PATTERN_WHITE_SPACE* ~ SYMBOL ~(PATTERN_WHITE_SPACE* ~ key_value ~PATTERN_WHITE_SPACE*)* ~ "/>" } /*====================================================================================================================*/ //!#61AFEF: CommandLine|CommandBlock|CommandSection Command = _{WHITE_SPACE* ~ (CommandLine|CommandBlock)} CommandLine = ${Escape ~ SYMBOL ~ WHITE_SPACE* ~ Colon ~ RestOfLine} //!#56B6C2: Set //!#E06C75: key CommandBlock = !{ Escape ~ call | Escape ~ SYMBOL ~ WHITE_SPACE* ~ ("[" ~ argument_literal ~ "]")* } call = _{SYMBOL ~ WHITE_SPACE* ~ arguments} arguments = _{ "(" ~ PATTERN_WHITE_SPACE* ~ ")"| "(" ~ (PATTERN_WHITE_SPACE*~ (key_value|argument) ~PATTERN_WHITE_SPACE*)+ ~ ")" } argument_literal={(!"]" ~ ANY)*} argument = {value ~ PATTERN_WHITE_SPACE* ~ Comma?} key_value = {key ~WHITE_SPACE*~ Set ~WHITE_SPACE*~ value ~PATTERN_WHITE_SPACE*~ Comma?} key = {Integer|String|SYMBOL} value = {Integer|String|Keywords|call|SYMBOL} //expression = {SYMBOL~(Dot~ function)+} //function = {SYMBOL ~ ("("~PATTERN_WHITE_SPACE*~ (key_value|argument)* ~PATTERN_WHITE_SPACE*~ ")")?} /*====================================================================================================================*/ //!#D19A66: Integer|Decimal|DecimalBad|Exponent|ComplexHandler Number = ${Sign? ~ (Decimal|DecimalBad|Integer)} Decimal = ${Integer ~ Dot ~ ASCII_DIGIT+} DecimalBad = ${Integer ~ Dot | Dot ~ ASCII_DIGIT+} Integer = @{"0"|ASCII_NONZERO_DIGIT ~ ASCII_DIGIT*} Sign = @{Plus|Minus} /*====================================================================================================================*/ ///#98C379 String = ${ S1 ~ (Escape ~ (Escape|S1)|!S1 ~ ANY)* ~ S1 | S2 ~ (Escape ~ (Escape|S2)|!S2 ~ ANY)* ~ S2 } S1 = _{"'"} S2 = _{"\""} /*====================================================================================================================*/ //!#C678DD: Keywords SYMBOL = @{ XID_START ~ XID_CONTINUE* | Underline ~ XID_CONTINUE+ } Escaped = @{Escape~ANY} Keywords = @{"true"|"false"|"null"} /*====================================================================================================================*/ //!Gray:BlockComment|LineComment //COMMENT = ${Escape ~ "comment" ~ WHITE_SPACE* ~ Colon ~ RestOfLine } //LineComment = ${Comment ~ SPACE_SEPARATOR* ~ Colon ~ RestOfLine} //BlockComment = ${Comment ~ SPACE_SEPARATOR* ~ "{" ~ MultiLineComment ~ "}"} //MultiLineComment = ${(BlockComment | !"}" ~ ANY)*} //Comment = @{Escape ~ "comment"} /*====================================================================================================================*/ LINE_SEPARATOR = @{NEWLINE} WHITE_SPACE = @{SPACE_SEPARATOR|"\t"} PATTERN_WHITE_SPACE = @{NEWLINE|WHITE_SPACE} //TAB = @{"\t"} //CR = @{"\r"} //LF = @{"\n"} /*====================================================================================================================*/ Escape = @{"\\"} At = @{"@"} Sharp = @{"#"} Underline = @{"_"} Asterisk = @{"*"} Comma = @{","} Dot = @{"."} Set = @{"="} Colon = @{":"} Vertical = @{"|"} Plus = @{"+"} Minus = @{"-"} QuoteMark = @{">"} Accent = @{"`"} Dollar = @{"$"} Tilde = @{"~"}