rust-less 0.1.0

A LESS to CSS parser and converter library written in Rust
Documentation
// 媒体查询相关语法
mediaQueryType = { "screen" | "print" | "all" | "speech" | "only" }
// 修改媒体查询特性规则,直接捕获括号内的整个内容
mediaQueryFeature = { (!(")" | "{") ~ ANY)* }
// 重新定义条件规则,确保直接使用括号和内容
mediaQueryCondition = { "(" ~ mediaQueryFeature ~ ")" }
// 重新定义and关键字处理
mediaQueryAnd = _{ "and" }
// 重新定义or关键字处理(用于复杂嵌套媒体查询)
mediaQueryOr = _{ "," }
// 更加灵活地定义媒体查询表达式,支持直接使用条件而不需要媒体类型
mediaQueryExpression = {
    (mediaQueryType ~ (mediaQueryAnd ~ mediaQueryCondition)* ~ (mediaQueryOr ~ mediaQueryType ~ (mediaQueryAnd ~ mediaQueryCondition)*)*)
  | (mediaQueryCondition ~ (mediaQueryAnd ~ mediaQueryCondition)*)
}

// 媒体查询规则同时支持嵌套
mediaQuery = { "@media" ~ mediaQueryExpression ~ start ~ (attr | variable | select | mediaQuery)* ~ end }

// 修改WHITESPACE规则,使用具体的字符而不是SPACE
WHITESPACE = _{ " " | NEWLINE | "\t" }

// 修改COMMENT规则,确保注释被正确处理
COMMENT = _{
    "//" ~ (!NEWLINE ~ ANY)*
}

singleValue = _{
    ASCII_ALPHA
  | ASCII_DIGIT
  | "#"
  | "-"
  | "@"
  | "%"
  | "/"
  | ":"
  | "*"
  | "_"
  | "."
  | ","
  | "'"
  | "\""
  | "("
  | ")"
}

value = _{
    singleValue+ ~ singleValue*
}

attrName = @{ (ASCII_ALPHA | "-")+ }

attrValue = {
    value
}

attr = { attrName ~ ":" ~ attrValue ~ ";" }

className = @{
    "." ~ (ASCII_DIGIT | ASCII_ALPHA | "-")+
}

label = @{
    "*"
  | (ASCII_DIGIT | ASCII_ALPHA | "-")+
}

id = @{
    "#" ~ (ASCII_DIGIT | ASCII_ALPHA | "-")+
}

commonLabel = @{
    (ASCII_DIGIT | ASCII_ALPHA)+
}

parent = @{ "&" }

// 伪类
fakeClass = @{ (commonLabel | className | label | id | parent) ~ ":" ~ (ASCII_DIGIT | ASCII_ALPHA | "-")+ }

// 伪选择器
fakeSelect = @{ (commonLabel | className | label | id | parent) ~ "::" ~ (ASCII_DIGIT | ASCII_ALPHA | "-")+ }

// 最基础的选择器
baseSelectName = { fakeSelect | fakeClass | className | label | id | parent | commonLabel }

// 选择器列表
listSelect = { baseSelectName ~ "," ~ baseSelectName }

// 后代组合器
descendantsSelect = { baseSelectName ~ WHITE_SPACE ~ baseSelectName }

// 直接子代组合器
directChildSelect = { baseSelectName ~ ">" ~ baseSelectName }

// 一般兄弟组合器
commonBroSelect = { baseSelectName ~ "~" ~ baseSelectName }

// 紧邻兄弟组合器
strictBorSelect = { baseSelectName ~ "+" ~ baseSelectName }

// 紧邻兄弟组合器
lineSelect = { baseSelectName ~ "||" ~ baseSelectName }

// 选择器集合
composeSelectName = _{
    listSelect
  | descendantsSelect
  | directChildSelect
  | commonBroSelect
  | strictBorSelect
  | lineSelect
  | baseSelectName
}

selectName = {
    (composeSelectName ~ "," ~ composeSelectName)
  | (composeSelectName ~ ">" ~ composeSelectName)
  | (composeSelectName ~ "~" ~ composeSelectName)
  | (composeSelectName ~ "+" ~ composeSelectName)
  | (composeSelectName ~ "||" ~ composeSelectName)
  | (composeSelectName ~ WHITE_SPACE ~ composeSelectName)
  | composeSelectName
}

start = _{ "{" }

end = _{ "}" }

variableName = { "@" ~ (ASCII_DIGIT | ASCII_ALPHA | "-")+ }

variableValue = { value }

variable = { variableName ~ ":" ~ variableValue ~ ";" }

select = { selectName ~ start ~ (attr | variable | select | mediaQuery)* ~ end }

// 修改顶层规则,确保它能正确匹配整个文件内容
selects = { SOI ~ (select | variable | mediaQuery | COMMENT)* ~ EOI }