rust_less/selects/
mod.rs

1pub mod traits;
2pub mod base;
3pub mod select;
4pub mod media_query;
5
6pub use traits::*;
7pub use base::*;
8pub use select::*;
9pub use media_query::*;
10
11use pest::iterators::Pairs;
12use crate::parser::Rule;
13use crate::utils::get_variable;
14
15#[derive(Debug)]
16pub struct Selects {
17    pub children: Vec<Select>, // 子选择器列表
18    pub media_queries: Vec<MediaQuery>, // 媒体查询列表
19    pub variables: Vec<Variable>, // 全局变量支持
20}
21
22impl Selects {
23    pub fn new(pairs: Pairs<Rule>) -> Self {
24        let mut children = vec![]; // 初始化子选择器列表
25        let mut media_queries = vec![]; // 初始化媒体查询列表
26        let mut variables = vec![]; // 初始化全局变量列表
27        let mut ancestor_variable_list = vec![]; // 初始化祖先变量列表
28        println!("{}",pairs.len()); // 打印 pairs 的长度
29
30        for pair in pairs {
31            if pair.as_rule() == Rule::selects {
32                for pair in pair.into_inner() {
33                    match pair.as_rule() {
34                        Rule::variable => {
35                            let var = get_variable(pair); // 获取变量
36                            variables.push(var.clone()); // 将变量添加到全局变量列表
37                            ancestor_variable_list.insert(0, var); // 插入到祖先变量列表的开头
38                        }
39                        Rule::select => {
40                            children.push(Select::new(
41                                &pair,
42                                vec![],
43                                ancestor_variable_list.clone(),
44                            )); // 创建新的选择器并添加到子选择器列表
45                        }
46                        Rule::mediaQuery => {
47                            media_queries.push(MediaQuery::new(&pair, ancestor_variable_list.clone())); // 创建新的媒体查询并添加到媒体查询列表
48                        }
49                        _ => {}
50                    }
51                }
52            }
53        }
54
55        Selects {
56            children, // 子选择器
57            media_queries, // 媒体查询
58            variables, // 全局变量
59        }
60    }
61}
62
63impl ToCss for Selects {
64    fn to_css(&self) -> String {
65        let mut result = String::new(); // 初始化结果字符串
66
67        // 添加选择器
68        for child in &self.children {
69            result.push_str(&child.to_css()); // 将子选择器转换为 CSS 并添加到结果中
70            result.push('\n'); // 添加换行符
71        }
72
73        // 添加媒体查询
74        for media_query in &self.media_queries {
75            result.push_str(&media_query.to_css()); // 将媒体查询转换为 CSS 并添加到结果中
76            result.push('\n'); // 添加换行符
77        }
78
79        // 清理多余的换行符
80        if !result.is_empty() && result.ends_with("\n\n") {
81            result.pop(); // 移除最后一个换行符
82            result.pop(); // 再次移除换行符
83        } else if !result.is_empty() && result.ends_with('\n') {
84            result.pop(); // 移除最后一个换行符
85        }
86
87        result // 返回结果字符串
88    }
89}