ori-core 0.1.0-alpha.1

Core library for Ori, a declarative UI framework for Rust.
Documentation
// a parser for style sheets in ori

WHITESPACE = _{ " " | "\t" | "\n" | "\r" }
COMMENT = _{ "/*" ~ (!"*/" ~ ANY)* ~ "*/" }

// atoms
Identifier = @{ (ASCII_ALPHA | "-" | "_") ~ (ASCII_ALPHANUMERIC | "-" | "_")* }
Number = @{ ASCII_DIGIT+ ~ ("." ~ ASCII_DIGIT+)? ~ (^"e" ~ ("-" | "-") ~ ASCII_DIGIT+)? }

// values
Px = { "px" }
Pt = { "pt" }
Pc = { "pc" | "%" }
Vw = { "vw" }
Vh = { "vh" }
Em = { "em" }
Unit = { Number ~ (Px | Pt | Pc | Vw | Vh | Em)? }
HexColor = @{ "#" ~ (ASCII_HEX_DIGIT{8} | ASCII_HEX_DIGIT{6} | ASCII_HEX_DIGIT{3, 4}) }
RgbColor = { "rgb(" ~ Number ~ "," ~ Number ~ "," ~ Number ~ ")" }
RgbaColor = { "rgba(" ~ Number ~ "," ~ Number ~ "," ~ Number ~ "," ~ Number ~ ")" }
Color = { HexColor | RgbColor | RgbaColor }
Enum = { Identifier }
String = { "\"" ~ (!"\"" ~ ANY)* ~ "\"" }

// transitions
Transition = _{ Number ~ "s" }

// attribute
Transitionable = _{ Unit | Color }
AttributeValue = { Transitionable ~ Transition? | Enum | String }
Attribute = { Identifier ~ ":" ~ AttributeValue ~ ";" }

// selector
State = { ":" ~ Identifier }
Element = { (Identifier | Wildcard) ~ State* }
Class = { "." ~ Identifier }
Wildcard = { "*" }
Selector = { (Element ~ Class*) | Class+ }
Selectors = { Selector+ }

// stylesheet
StyleRule = { Selectors ~ "{" ~ Attribute* ~ "}" }
Style = { SOI ~ StyleRule* ~ EOI }