//
// CSS
//
css = _{ SOI ~ rule* ~ EOI }
//
// RULES
//
rule = _{ rule_comment | rule_normal }
rule_comment = { WHITE_SPACE* ~ comment ~ WHITE_SPACE* }
rule_normal = { r_base }
//
// COMMENTS
//
comment = _{ comment_start_tag ~ comment_body ~ comment_end_tag }
comment_body = { (!comment_end_tag ~ ANY)* }
comment_start_tag = _{ "/*" ~ WHITE_SPACE* }
comment_end_tag = _{ WHITE_SPACE* ~ "*/" }
//
// SELECTORS
//
sel_id = _{ prefix_id ~ sel_id_body }
sel_id_body = { ASCII_ALPHA ~ text_chars* }
sel_class = _{ prefix_class ~ sel_class_body }
sel_class_body = { ASCII_ALPHA ~ text_chars* }
sel_type = { ASCII_ALPHA ~ text_chars* }
sel_uni = _{ "*" }
sel_normal = { (sel_id | sel_class | sel_uni | sel_type)* }
selector = _{ WHITE_SPACE* ~ sel_normal ~ WHITE_SPACE* }
//
// DECLARATION
//
del_property = @{ ASCII_ALPHA ~ text_chars* }
del_val_keyword = @{ ASCII_ALPHA ~ text_chars* }
del_val_color = { prefix_id ~ (ASCII_ALPHA | ASCII_DIGIT){6} }
del_val_length = { del_val_length_body ~ length_type* }
del_val_length_body = { ASCII_DIGIT* }
del_value = _{ del_val_keyword | del_val_color | del_val_length }
declaration = { WHITE_SPACE* ~ del_property ~ property_separater ~ WHITE_SPACE* ~ del_value ~ end_seperater ~ WHITE_SPACE* }
//
// RULE BASE
//
// Ex: h1 { color: red }
r_base = _{ selector ~ left_curly_brace ~ (!right_curly_brace ~ declaration)* ~ right_curly_brace ~ WHITE_SPACE* }
//
// SYMBOLS / CHARACTERS
//
text_chars = _{ ASCII_ALPHA | ASCII_DIGIT | "_" | "-" }
left_curly_brace = _{ "{" }
right_curly_brace = _{ "}" }
// multiples_separater = _{ "," }
property_separater = _{ ":" }
end_seperater = _{ ";" }
prefix_id = _{ "#" }
prefix_class = _{ "." }
length_type = { "cm" | "mm" | "in" | "px" | "pt" | "pt" | "pc" | "em" | "ex" | "ch" | "rem" | "vw" | "vh" | "vmin" | "vmax" | "%" }