57 lines
2.2 KiB
Markdown
57 lines
2.2 KiB
Markdown
rust-cssparser
|
||
==============
|
||
|
||
[](https://github.com/servo/rust-cssparser/actions)
|
||
|
||
[Documentation](https://docs.rs/cssparser)
|
||
|
||
Rust implementation of
|
||
[CSS Syntax Module Level 3](https://drafts.csswg.org/css-syntax/)
|
||
|
||
|
||
Overview
|
||
--------
|
||
|
||
Parsing CSS involves a series of steps:
|
||
|
||
* When parsing from bytes,
|
||
(e.g. reading a file or fetching an URL from the network,)
|
||
detect the character encoding
|
||
(based on a `Content-Type` HTTP header, an `@charset` rule, a BOM, etc.)
|
||
and decode to Unicode text.
|
||
|
||
rust-cssparser does not do this yet and just assumes UTF-8.
|
||
|
||
This step is skipped when parsing from Unicode, e.g. in an HTML `<style>` element.
|
||
|
||
* Tokenization, a.k.a. lexing.
|
||
The input, a stream of Unicode text, is transformed into a stream of *tokens*.
|
||
Tokenization never fails, although the output may contain *error tokens*.
|
||
|
||
* This flat stream of tokens is then transformed into a tree of *component values*,
|
||
which are either *preserved tokens*,
|
||
or blocks/functions (`{ … }`, `[ … ]`, `( … )`, `foo( … )`)
|
||
that contain more component values.
|
||
|
||
rust-cssparser does this at the same time as tokenization:
|
||
raw tokens are never materialized, you only get component values.
|
||
|
||
* Component values can then be parsed into generic rules or declarations.
|
||
The header and body of rules as well as the value of declarations
|
||
are still just lists of component values at this point.
|
||
See [the `Token` enum](src/tokenizer.rs) for the data structure.
|
||
|
||
* The last step of a full CSS parser is
|
||
parsing the remaining component values
|
||
into [Selectors](https://drafts.csswg.org/selectors/),
|
||
specific CSS properties, etc.
|
||
|
||
By design, rust-cssparser does not do this last step
|
||
which depends a lot on what you want to do:
|
||
which properties you want to support, what you want to do with selectors, etc.
|
||
|
||
It does however provide some helper functions to parse [CSS colors](src/color.rs)
|
||
and [An+B](src/nth.rs) (the argument to `:nth-child()` and related selectors.
|
||
|
||
See [Servo’s `style` crate](https://github.com/servo/stylo/tree/main/style)
|
||
for an example of a parser based on rust-cssparser.
|