Skip to content

This project aims to implement a CSS(less like) parser in rust. Currently the code is targeting the PostCSS AST. Very early stage, do not use in production.

Notifications You must be signed in to change notification settings

hlhr202/rust-css-parser

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

23 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

CSS(less like) parser written in rust (WIP)

This project aims to implement a CSS(less like) parser in rust. Currently the code is targeting the PostCSS AST.

Features:

Nestable CSS Standard

  • rule
  • prop
  • declaration
    • url
    • hex
    • string
    • number
    • calc
    • var
    • !important
  • at rule
    • media query
    • import
    • keyframe
    • variable
  • selector
    • block
    • class
    • id
    • data attribute
    • &
    • ,
    • +
    • *
    • sudo class
    • more W3C standard to be tested...
  • comment
  • function?

Diagnostic

  • location
  • error report

APIs

  • transformer
  • generator
  • wasm

Example

  • input
@variable: #999;

@variable2: #fff;

@variable3: white !important;

@import url();

@media only screen and (max-width: 1000px) {
    color: white;
    font-size: 10px !important;
}

main {
    * {
        font-size: 3em;
    }
    color: #999;
    -webkit-line-clamp: 3;
    h3 {
        font-size: large;
        background: url("https://www.baidu.com");
    }
    div + p {
        list-style: "|";
    }
    .test-1, #test2 {
        --theme-color: var(--white);
    }
    [data-attr] {
        background-color: white;
        left: calc(100% - 10px);
    }
    &.img {
        width: fit-content;
    }
    & {
        div {
            overflow: initial;
        }
    }
    #what {
        right: 0;
    }
}

.test-class1 {
    color: white;
}

@keyframes anim {
    from {
        left: 0%;
    }
    to {
        right: 100%;
    }
}
  • output
[
    Atrule {
        type: "atrule",
        name: "variable",
        params: "#999",
        value: Some(
            "#999",
        ),
        nodes: None,
    },
    Atrule {
        type: "atrule",
        name: "variable2",
        params: "#fff",
        value: Some(
            "#fff",
        ),
        nodes: None,
    },
    Atrule {
        type: "atrule",
        name: "variable3",
        params: "white !important",
        value: Some(
            "white !important",
        ),
        nodes: None,
    },
    Atrule {
        type: "atrule",
        name: "import",
        params: "url()",
        value: None,
        nodes: None,
    },
    Atrule {
        type: "atrule",
        name: "media",
        params: "only screen and (max-width 1000px)",
        value: None,
        nodes: Some(
            [
                Decl {
                    type: "decl",
                    prop: "color",
                    value: "white",
                    important: None,
                },
                Decl {
                    type: "decl",
                    prop: "font-size",
                    value: "10px ",
                    important: Some(
                        true,
                    ),
                },
            ],
        ),
    },
    Rule {
        type: "rule",
        selector: "main",
        nodes: [
            Rule {
                type: "rule",
                selector: "*",
                nodes: [
                    Decl {
                        type: "decl",
                        prop: "font-size",
                        value: "3em",
                        important: None,
                    },
                ],
            },
            Decl {
                type: "decl",
                prop: "color",
                value: "#999",
                important: None,
            },
            Decl {
                type: "decl",
                prop: "-webkit-line-clamp",
                value: "3",
                important: None,
            },
            Rule {
                type: "rule",
                selector: "h3",
                nodes: [
                    Decl {
                        type: "decl",
                        prop: "font-size",
                        value: "large",
                        important: None,
                    },
                    Decl {
                        type: "decl",
                        prop: "background",
                        value: "url(\"https://www.baidu.com\")",
                        important: None,
                    },
                ],
            },
            Rule {
                type: "rule",
                selector: "div + p",
                nodes: [
                    Decl {
                        type: "decl",
                        prop: "list-style",
                        value: "\"|\"",
                        important: None,
                    },
                ],
            },
            Rule {
                type: "rule",
                selector: ".test-1, #test2",
                nodes: [
                    Decl {
                        type: "decl",
                        prop: "--theme-color",
                        value: "var(--white)",
                        important: None,
                    },
                ],
            },
            Rule {
                type: "rule",
                selector: "[data-attr]",
                nodes: [
                    Decl {
                        type: "decl",
                        prop: "background-color",
                        value: "white",
                        important: None,
                    },
                    Decl {
                        type: "decl",
                        prop: "left",
                        value: "calc(100% - 10px)",
                        important: None,
                    },
                ],
            },
            Rule {
                type: "rule",
                selector: "&.img",
                nodes: [
                    Decl {
                        type: "decl",
                        prop: "width",
                        value: "fit-content",
                        important: None,
                    },
                ],
            },
            Rule {
                type: "rule",
                selector: "&",
                nodes: [
                    Rule {
                        type: "rule",
                        selector: "div",
                        nodes: [
                            Decl {
                                type: "decl",
                                prop: "overflow",
                                value: "initial",
                                important: None,
                            },
                        ],
                    },
                ],
            },
            Rule {
                type: "rule",
                selector: "#what",
                nodes: [
                    Decl {
                        type: "decl",
                        prop: "right",
                        value: "0",
                        important: None,
                    },
                ],
            },
        ],
    },
    Rule {
        type: "rule",
        selector: ".test-class1",
        nodes: [
            Decl {
                type: "decl",
                prop: "color",
                value: "white",
                important: None,
            },
        ],
    },
    Atrule {
        type: "atrule",
        name: "keyframes",
        params: "anim",
        value: None,
        nodes: Some(
            [
                Rule {
                    type: "rule",
                    selector: "from",
                    nodes: [
                        Decl {
                            type: "decl",
                            prop: "left",
                            value: "0%",
                            important: None,
                        },
                    ],
                },
                Rule {
                    type: "rule",
                    selector: "to",
                    nodes: [
                        Decl {
                            type: "decl",
                            prop: "right",
                            value: "100%",
                            important: None,
                        },
                    ],
                },
            ],
        ),
    },
]

About

This project aims to implement a CSS(less like) parser in rust. Currently the code is targeting the PostCSS AST. Very early stage, do not use in production.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages