css-modules 0.5.2

CSS Modules with a macro for convenience.
Documentation
stylesheet = _{
    SOI ~ WHITE_SPACE* ~ (comment | ruleset)* ~ EOI
}

comment = {
    "/*" ~ (!"*/" ~ ANY)* ~ "*/"
    ~ WHITE_SPACE*
}

identifier = {
    (!ASCII_DIGIT ~ identifier_char)
    ~ identifier_char*
}

identifier_char = _{
    !(PUNCTUATION | SYMBOL | WHITE_SPACE) ~ ANY
    | "-" | "_" | "\\" ~ ANY
}

ruleset = _{
    (atrule | selectrule)
     ~ WHITE_SPACE*
}

atrule = {
    "@"
    ~ identifier
    ~ WHITE_SPACE+
    ~ atrule_rule
    ~ WHITE_SPACE*
    ~ (";" | block)
}

atrule_rule = {
    (!("{" | "}" | ";") ~ ANY)+
}

selectrule = {
    selectrule_rule
    ~ WHITE_SPACE*
    ~ block
}

selectrule_rule = {
    (!("{" | "}" | ";") ~ ANY)+
}

block = _{
    "{"
    ~ WHITE_SPACE*
    ~ (
        WHITE_SPACE+
        | comment
        | property
        | ruleset
        | line_comment
    )*
    ~ ("}" ~ WHITE_SPACE* | error_block_not_terminated)
}

error_block_not_terminated = {
    ANY* ~ EOI
}

property = {
    identifier
    ~ WHITE_SPACE*
    ~ ":"
    ~ WHITE_SPACE*
    ~ property_value
    ~ (";" | &"}")
}

property_value = {
    property_contents*
}

line_comment = {
    ("*" | "//" | "#")
    ~ WHITE_SPACE*
    ~ identifier
    ~ WHITE_SPACE*
    ~ ":"
    ~ WHITE_SPACE*
    ~ (!(";" | "}") ~ ANY)*
    ~ (";" | &"}")
}

property_contents = _{
    property_text
    | property_round_brace
    | property_square_brace
    | property_string_single
    | property_string_double
    | comment
}

property_text = _{
    (!("{" | "}" | "(" | ")" | "[" | "]" | "'" | "\"" | "/*" | ";") ~ ANY)+
}

property_round_brace = _{
    "("
    ~ WHITE_SPACE*
    ~ (property_data_url | property_contents)*
    ~ ")"
    ~ WHITE_SPACE*
}

property_data_url = {
    "data:"
    ~ (!(WHITE_SPACE | ")") ~ ANY)+
    ~ WHITE_SPACE*
}

property_curly_brace = _{
    "{" ~ property_contents* ~ "}"
}

property_square_brace = _{
    "[" ~ property_contents* ~ "]"
}

property_string_single = _{
    "'" ~ (!"'" ~ ANY)* ~ "'"
}

property_string_double = _{
    "\"" ~ (!"\"" ~ ANY)* ~ "\""
}

///////////////////////////////////////////////////////////////////////////////

selector = _{
    WHITE_SPACE*
    ~ (selector_class | selector_other)+
}

selector_class = {
    "." ~ identifier
}

selector_other = {
    (!(".") ~ ANY)+
}

///////////////////////////////////////////////////////////////////////////////

animation = _{
    WHITE_SPACE*
    ~ comment?
    ~ identifier
    ~ animation_other?
}

animation_other = {
    ANY+
}