#css-parser #css #web #compiler #ast-parser

nightly bin+lib procss

简单的CSS解析和转换框架

17次发布

0.1.16 2024年7月4日
0.1.15 2023年11月26日
0.1.13 2023年5月1日
0.1.12 2023年2月20日
0.1.5 2022年11月25日

#11 in #css-parser

Download history 42/week @ 2024-04-25 18/week @ 2024-05-02 30/week @ 2024-05-09 49/week @ 2024-05-16 37/week @ 2024-05-23 33/week @ 2024-05-30 17/week @ 2024-06-06 13/week @ 2024-06-13 11/week @ 2024-06-20 15/week @ 2024-06-27 184/week @ 2024-07-04 81/week @ 2024-07-11 129/week @ 2024-07-18 77/week @ 2024-07-25 68/week @ 2024-08-01 44/week @ 2024-08-08

每月 325 次下载
用于 2 crates

Apache-2.0

135KB
2K SLoC

PROCSS

CI

简单的CSS解析和转换框架。

文档

开发者配置

构建

cargo xbuild

测试

cargo xtest

测试覆盖率报告(禁用增量构建)

cargo xtest --coverage

代码风格检查

cargo clippy

基准测试

cargo xbench

生成文档(输出在 ./target/doc/procss/index.html

cargo doc

lib.rs:

简单的CSS解析和转换框架。Procss可以用来快速打包一组CSS+文件,或者编写自己的自定义转换。

用法

Procss的解析器理解CSS的嵌套超集(我们称之为CSS+),类似于CSS嵌套提案,或者像Sass这样的语言。以源CSS+作为[str]开始,使用crate::parsecrate::parse_unchecked生成一个ast::Tree

use procss::{ast, parse};

let ast = procss::parse("div{.open{color:red;}}").unwrap();

生成的ast::Tree可以使用ast::Tree::flatten_tree方法转换为去嵌套的ast::Css,然后可以通过RenderCss::as_css_string特质方法将其渲染为纯浏览器可读的CSS字符串。

use procss::RenderCss;

let flat: ast::Css = ast.flatten_tree();
let css: String = flat.as_css_string();
assert_eq!(css, "div .open{color:red;}");

中间结构体 ast::Css::transformast::Tree::transform 可以用于递归地修改 [ast] 模块中各种节点结构的树。此类转换的一些有用示例可以在 transformers 模块中找到。

use procss::transformers;

let test = "
@mixin test {color: red;}
div {@include test;}
";

let mut ast = procss::parse(test).unwrap();
transformers::apply_mixin(&mut ast);
let mut flat = ast.flatten_tree();
transformers::remove_mixin(&mut flat);
let css = flat.as_css_string();
assert_eq!(css, "div{color:red;}");

为了协调CSS文件树上的大型构建,BuildCss 结构体可以解析和压缩,在编译过程中将所有转换(包括 transformers::apply_import)应用于输入。

let mut build = procss::BuildCss::new("./src");
build.add_file("controls/menu.scss");
build.add_file("logout.scss"); // imports "controls/menu.scss"
build.add_file("my_app.scss"); // imports "controls/menu.scss" and "logout.scss"
build.compile().unwrap().write("./dist").unwrap();

依赖关系

~5–9MB
~168K SLoC