72 lines
2 KiB
Plaintext
72 lines
2 KiB
Plaintext
// Partly taken from Tera
|
|
WHITESPACE = _{ " " | "\t" | "\r" | "\n" }
|
|
|
|
/// LITERALS
|
|
int = @{ "-" ? ~ ("0" | '1'..'9' ~ '0'..'9' * ) }
|
|
float = @{
|
|
"-" ? ~
|
|
(
|
|
"0" ~ "." ~ '0'..'9' + |
|
|
'1'..'9' ~ '0'..'9' * ~ "." ~ '0'..'9' +
|
|
)
|
|
}
|
|
// matches anything between 2 double quotes
|
|
double_quoted_string = @{ "\"" ~ (!("\"") ~ ANY)* ~ "\""}
|
|
// matches anything between 2 single quotes
|
|
single_quoted_string = @{ "\'" ~ (!("\'") ~ ANY)* ~ "\'"}
|
|
// matches anything between 2 backquotes\backticks
|
|
backquoted_quoted_string = @{ "`" ~ (!("`") ~ ANY)* ~ "`"}
|
|
|
|
string = @{
|
|
double_quoted_string |
|
|
single_quoted_string |
|
|
backquoted_quoted_string
|
|
}
|
|
|
|
boolean = { "true" | "false" }
|
|
|
|
literal = { boolean | string | float | int }
|
|
array = { "[" ~ (literal ~ ",")* ~ literal? ~ "]"}
|
|
|
|
/// Idents
|
|
|
|
all_chars = _{'a'..'z' | 'A'..'Z' | "_" | '0'..'9'}
|
|
ident = @{
|
|
('a'..'z' | 'A'..'Z' | "_") ~
|
|
all_chars*
|
|
}
|
|
|
|
/// Now specific to Gutenberg
|
|
|
|
// shortcode is abbreviated to sc to keep things short
|
|
|
|
kwarg = { ident ~ "=" ~ (literal | array) }
|
|
kwargs = _{ kwarg ~ ("," ~ kwarg )* }
|
|
sc_def = _{ ident ~ "(" ~ kwargs* ~ ")" }
|
|
|
|
inline_shortcode = !{ "{{" ~ sc_def ~ "}}" }
|
|
ignored_inline_shortcode = !{ "{{/*" ~ sc_def ~ "*/}}" }
|
|
|
|
sc_body_start = !{ "{%" ~ sc_def ~ "%}" }
|
|
sc_body_end = !{ "{%" ~ "end" ~ "%}" }
|
|
ignored_sc_body_start = !{ "{%/*" ~ sc_def ~ "*/%}" }
|
|
ignored_sc_body_end = !{ "{%/*" ~ "end" ~ "*/%}" }
|
|
|
|
shortcode_with_body = !{ sc_body_start ~ text_in_body_sc ~ sc_body_end }
|
|
ignored_shortcode_with_body = { ignored_sc_body_start ~ text_in_ignored_body_sc ~ ignored_sc_body_end }
|
|
|
|
text_in_body_sc = ${ (!(sc_body_end) ~ ANY)+ }
|
|
text_in_ignored_body_sc = ${ (!(ignored_sc_body_end) ~ ANY)+ }
|
|
text = ${ (!(inline_shortcode | ignored_inline_shortcode | shortcode_with_body | ignored_shortcode_with_body) ~ ANY)+ }
|
|
|
|
content = _{
|
|
ignored_inline_shortcode |
|
|
inline_shortcode |
|
|
ignored_shortcode_with_body |
|
|
shortcode_with_body |
|
|
text
|
|
}
|
|
|
|
|
|
page = ${ SOI ~ content* ~ EOI }
|