// 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 Zola

// 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 }
