rust_less/selects/
media_query.rs

1use pest::iterators::Pair;
2use crate::parser::Rule;
3use crate::utils::get_variable;
4use crate::selects::{Variable, Select, ToCss};
5
6#[derive(Debug)]
7pub struct MediaQuery {
8    pub query_expression: String,
9    pub children: Vec<Select>,
10    pub variable_list: Vec<Variable>,
11    pub nested_media_queries: Vec<MediaQuery>, // 添加嵌套媒体查询支持
12    pub span: (usize, usize),
13}
14
15impl MediaQuery {
16    pub fn new(pair: &Pair<Rule>, ancestor_variable_list: Vec<Variable>) -> Self {
17        let mut query_expression = String::new();
18        let mut children = vec![];
19        let mut variable_list = vec![];
20        let mut nested_media_queries = vec![]; // 初始化嵌套媒体查询列表
21        let span = (pair.as_span().start(), pair.as_span().end());
22
23        for inner_pair in pair.clone().into_inner() {
24            match inner_pair.as_rule() {
25                Rule::mediaQueryExpression => {
26                    query_expression = inner_pair.as_span().as_str().to_string();
27                }
28                Rule::select => {
29                    let mut new_ancestor_variable_list = ancestor_variable_list.clone();
30                    for item in variable_list.clone() {
31                        new_ancestor_variable_list.insert(0, item);
32                    }
33                    children.push(Select::new(&inner_pair, vec![], new_ancestor_variable_list));
34                }
35                Rule::variable => {
36                    variable_list.insert(0, get_variable(inner_pair));
37                }
38                Rule::mediaQuery => {
39                    // 处理嵌套的媒体查询
40                    let mut new_ancestor_variable_list = ancestor_variable_list.clone();
41                    for item in variable_list.clone() {
42                        new_ancestor_variable_list.insert(0, item);
43                    }
44                    nested_media_queries.push(MediaQuery::new(&inner_pair, new_ancestor_variable_list));
45                }
46                _ => {}
47            }
48        }
49
50        MediaQuery {
51            query_expression,
52            children,
53            variable_list,
54            nested_media_queries, // 添加嵌套媒体查询
55            span,
56        }
57    }
58}
59
60impl ToCss for MediaQuery {
61    fn to_css(&self) -> String {
62        let mut result = String::from("@media ");
63        result.push_str(&self.query_expression);
64        result.push_str(" {\n");
65
66        // 添加普通选择器子元素
67        for child in &self.children {
68            result.push_str(&child.to_css());
69        }
70
71        // 添加嵌套媒体查询
72        for nested_query in &self.nested_media_queries {
73            result.push_str(&nested_query.to_css());
74        }
75
76        result.push_str("}\n");
77        result
78    }
79}