#macro #visitor #css-parser #file #aggregate

macro-visit

类似于proc-macro visitor的函数,用于build.rs

2个不稳定版本

0.2.0 2024年2月13日
0.1.0 2023年12月7日

过程宏中排名第587


用于rcss-bundler

MIT许可证

22KB
420

简单的助手,用于在build.rs中注册宏处理程序并处理其输入。目前仅支持函数式宏。

当你的宏应该输出文件,但你又想避免增量编译和其他操作中的竞争条件时,非常有用。

使用syn解析文件并访问它们的宏。

想象你有一些宏css实现了作用域CSS技术。它处理CSS语法并返回css_class。但你还需要聚合所有css调用并保存到style.css`

fn main() {
    use rcss::css as my_css;
    let css_class = my_css!{
        .container {
            background-color: black;
        }
    };
    
    let html = format!(r#"<div class="{} my-class">Hello</div>"#, css_class);
    let html = format!(r#"<link rel="stylesheet" href="style.css" />{}"#, html);
    // output html.
}

为了聚合所有CSS,你应该打开所有源文件,找到是否使用了`css!``,并处理它们的输入。你还应该处理导入和重命名。

这个crate的目标是处理这些问题。

在build.rs中

fn main () {
    let project_path = std::env!("CARGO_MANIFEST_DIR");
    let crate_name = std::env::var("CARGO_CRATE_NAME").unwrap_or("rcss".to_owned());
    let collect_style = RefCell::new(String::new());

    let mut css_handler = |context, token_stream: TokenStream| {
       collect_style.borrow_mut().push_str(/* Handle token_stream */ )
    };

    let mut visitor = Visitor::new();

    let css_macro_path = vec![format!("{crate_name}::css")];
    let css_macro = Rc::new(RefCell::new(MacroCall::new(&mut css_handler)));
    visitor.add_macro(css_macro_path, css_macro);
    visitor.visit_project(project_path);
    let content = collect_style.into_inner();
    // .. save content to a file
}

macro-visit将找到所有css!宏的出现,即使它已经被重命名。目前,它一次只查找一个文件中的导入,并且不会并行处理文件。

依赖项

~310–750KB
~18K SLoC