// 媒体查询相关语法
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 }