2 releases

Uses old Rust 2015

0.1.1 Jul 7, 2019
0.1.0 Jul 7, 2019

#55 in #tokenizer

Download history 84/week @ 2022-08-07 42/week @ 2022-08-14 65/week @ 2022-08-21 63/week @ 2022-08-28 83/week @ 2022-09-04 66/week @ 2022-09-11 50/week @ 2022-09-18 127/week @ 2022-09-25 92/week @ 2022-10-02 67/week @ 2022-10-09 23/week @ 2022-10-16 113/week @ 2022-10-23 47/week @ 2022-10-30 148/week @ 2022-11-06 38/week @ 2022-11-13 34/week @ 2022-11-20

275 downloads per month
Used in 6 crates (via azul-css-parser)

MPL-2.0 license

30KB
552 lines

azul-simplecss

Fork of https://github.com/RazrFalcon/simplecss (because lack of maintainer). Added @rules + better parsing on top of original parser.

----aa

A very simple streaming parser/tokenizer for CSS 2.1 data format without heap allocations.

Since it's very simple we will start with limitations:

Limitations

  • At-rules are not supported.

    @import, @media, etc. will lead to a parsing error.

  • The ident token must be ASCII only.

    CSS like #аттр { имя:значение } will lead to a parsing error.

  • Property values are not parsed.

    In CSS like * { width: 5px } you will get width property with 5px values as a string.

  • Attribute selector rule is not parsed.

    [foo~="warning"] will be parsed as Token::AttributeSelector("foo~=\"warning\"").

  • There are no data validation.

    • Pseudo-class tokens can contain any text, language pseudo-class can contain any text or even none.
    • Declarations can contain any kind of names and values.
  • All comments will be ignored.

    They didn't have it's own Token item.

  • CDO/CDC comments are not supported.

  • Parser is case sensitive. All keywords should be lowercase.

  • Unicode escape, like \26, is not supported.

  • No spec-defined error handling.

    If something will go wrong you will get an error. Parser will not recover an invalid input. Details.

Where to use

simplecss can be useful for parsing a very simple or predefined CSS.

It's tiny, dependency free and pretty fast.

Examples

Simple

* { color : red }
| | |           ||
| | |           |+- Token::EndOfStream
| | |           +- Token::BlockEnd
| | +- Token::Declaration("color", "red")
| +- Token::BlockStart
+- Token::UniversalSelector

Complex

div#x:first-letter em[id] + .hh1 { color : red }
|  | |            || |    | |    | |           ||
|  | |            || |    | |    | |           |+- Token::EndOfStream
|  | |            || |    | |    | |           +- Token::BlockEnd
|  | |            || |    | |    | +- Token::Declaration("color", "red")
|  | |            || |    | |    +- Token::BlockStart
|  | |            || |    | +- Token::ClassSelector("hh1")
|  | |            || |    +- Token::Combinator(Combinator::Plus)
|  | |            || +- Token::AttributeSelector("id")
|  | |            |+- Token::TypeSelector("em")
|  | |            +- Token::Combinator(Combinator::Space)
|  | +- Token::PseudoClass("first-letter")
|  +- Token::IdSelector("x")
+- Token::TypeSelector("div")

No runtime deps