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

nightly bin+lib procss

A simple CSS parsing and transformation framework

17 releases

0.1.16 Jul 4, 2024
0.1.15 Nov 26, 2023
0.1.13 May 1, 2023
0.1.12 Feb 20, 2023
0.1.5 Nov 25, 2022

#1582 in Web programming

Download history 110/week @ 2024-07-22 93/week @ 2024-07-29 29/week @ 2024-08-05 116/week @ 2024-08-12 34/week @ 2024-08-19 67/week @ 2024-08-26 62/week @ 2024-09-02 25/week @ 2024-09-09 103/week @ 2024-09-16 114/week @ 2024-09-23 273/week @ 2024-09-30 263/week @ 2024-10-07 172/week @ 2024-10-14 174/week @ 2024-10-21 76/week @ 2024-10-28 27/week @ 2024-11-04

457 downloads per month
Used in perspective-viewer

Apache-2.0

135KB
2K SLoC

PROCSS

CI

A simple CSS parsing and transformation framework.

Docs

Developer Setup

Build

cargo xbuild

Test

cargo xtest

Test coverage report (disables incremental builds)

cargo xtest --coverage

Lint

cargo clippy

Bench

cargo xbench

Generate docs (output at ./target/doc/procss/index.html)

cargo doc

lib.rs:

A simple CSS parsing and transformation framework. Procss can be used to quickly bundle a collection of CSS+ files, or write your own custom transforms.

Usage

Procss's parser understands a nested superset of CSS (which we refer to as CSS+), similar to the CSS nesting proposal, or languages like Sass. Start with source CSS+ as a [str], use crate::parse or crate::parse_unchecked to generate an ast::Tree.

use procss::{ast, parse};

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

The resulting ast::Tree can be converted to a de-nested ast::Css with the ast::Tree::flatten_tree method, which itself can then be rendered as a plain browser-readable CSS string via the RenderCss::as_css_string trait method.

use procss::RenderCss;

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

Intermediate structs ast::Css::transform amd ast::Tree::transform can be used to recursively mutate a tree for a variety of node structs in the [ast] module. Some useful Example of such transforms can be found in the transformers module.

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;}");

For coordinating large builds on a tree of CSS files, the BuildCss struct can parse and minify, applying all transforms (including transformers::apply_import) as the compilation is left-folded over the inputs.

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();

Dependencies

~5–9.5MB
~172K SLoC