home ~ projects ~ socials

Get A Top Level List Of Selectors From A CSS File In Rust

This is still a work in progress

This is initial code to work on parsing CSS styles to combine the ones that come out of syntect. Note that it only works at the top level of the CSS file (i.e. it doesn't recurse into it)

```cargo
[dependencies]
lightningcss = { version = "1.0.0-alpha.59" }

```
use lightningcss::stylesheet::{
  StyleSheet, ParserOptions, 
  // MinifyOptions, PrinterOptions
};

use lightningcss::selector::Component;
use std::fs;

fn main() {
  let data = fs::read_to_string("/Users/alan/workshop/neopoligen/cli/example-site/themes/neopoligen-v0.1.0/files/styles/syntax-highlighting/code-solarized-light.css").unwrap();

  let styles = StyleSheet::parse(
    &data,
    ParserOptions::default()
  ).unwrap();

  styles.rules.0.iter().for_each(|rule| {
    // dbg!("---");
    match rule {
      lightningcss::rules::CssRule::Style(x) => {
        // dbg!(&x.selectors); 
        // dbg!(&x.declarations);
        let _ = &x.selectors.0.iter().for_each(|selector| {
          //dbg!(selector.iter());
          //dbg!(selector.iter_raw_match_order());
          //let t = selector.iter().fold("".to_string(), |acc, r| {
          let t = selector.iter_raw_match_order().rfold("".to_string(), |acc, r| {
          format!("{}{}", 
            match r {
              Component::Class(q) => {format!(".{}", q) },
              _ => " ".to_string()
            }, 
            acc
            )
          });
          dbg!(t);

          //let u = selector.iter();
          //dbg!(selector.fmt());

/*
          let selector_string = selector.iter().fold("".to_string(), |acc, r| {
           format!("{}{}", acc,  match r {
              Component::Class(q) => q.to_string(),
              _ => "-".to_string()
            }
            )
          } );
          dbg!(selector_string);

*/

/*
          let selector_string = selector.iter().fold("".to_string(), |acc, r| {
            let i = 
            match r {
              Component::Class(q) => q.to_string(),
              _ => "-".to_string()
            }
          } );
          dbg!(selector_string);
*/

          //let selector_string = selector.iter().fold("".to_string(), |acc, d| acc.push_str(d));
          //dbg!(selector_string);
          //selector.iter().for_each(|part| {
           // ()
          //}); 
        });
      },
      _ => ()
    }
    
  });

}
Output:
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".code"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".comment"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".meta.documentation"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".string"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".string.regexp"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".constant.character.escape"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".constant.numeric"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".variable"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".variable.function"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".variable.language"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".keyword"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".keyword.asdfasdfasdf .meta.import"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".keyword.control.import"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".keyword.control.import.from"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".keyword.other.import"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".keyword.control.at-rule.include"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".keyword.control.at-rule.import"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".keyword.operator.comparison"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".keyword.operator.assignment"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".keyword.operator.arithmetic"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".storage"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".storage.modifier"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".keyword.control.class"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".entity.name"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".entity.name.class"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".entity.name.type.class"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".entity.other.inherited-class"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".entity.other.attribute-name"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".support"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".support.type"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".support.class"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".entity.name.function"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".punctuation.definition.variable"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".constant"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".constant.language"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".meta.preprocessor"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".entity.name.section"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".support.function.construct"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".keyword.other.new"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".constant.character"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".constant.other"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".entity.name.tag"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".punctuation.definition.tag.html"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".punctuation.definition.tag.begin"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".punctuation.definition.tag.end"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".support.function"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".punctuation.separator.continuation"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".storage.type"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".support.type.exception"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".keyword.other.special-method"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".invalid"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".string.quoted.double"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".string.quoted.single"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".punctuation.definition.string"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".meta.brace.square"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".punctuation.section.brackets"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".meta.brace.round"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".meta.brace.curly"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".punctuation.section"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".punctuation.section.block"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".punctuation.definition.parameters"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".punctuation.section.group"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".support.constant.color"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".invalid.deprecated.color.w3c-non-standard-color-name.scss"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".meta.selector.css"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".entity.name.tag.css"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".entity.name.tag.scss"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".keyword.control.html.elements .source.less"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".keyword.control.untitled .source.sass"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".entity.other.attribute-name.class"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".entity.other.attribute-name.id"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".entity.other.attribute-name.pseudo-element"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".entity.other.attribute-name.tag.pseudo-element"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".entity.other.attribute-name.pseudo-class"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".entity.other.attribute-name.tag.pseudo-class"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".meta.tag.other.html .text.html.basic"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".meta.tag.any.html .text.html.basic"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".meta.tag.block.any .text.html.basic"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".meta.tag.inline.any .text.html.basic"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".meta.tag.structure.any.html .text.html.basic"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".source.js.embedded.html .text.html.basic"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".punctuation.separator.key-value.html"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".entity.other.attribute-name.html .text.html.basic"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".entity.other.attribute-name .meta.tag.xml"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".keyword.other.special-method.ruby"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".variable.other.constant.ruby"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".constant.other.symbol.ruby"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".keyword.other.special-method.ruby"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".support.function.construct.php .meta.array"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".entity.name.function.preprocessor.c"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".meta.preprocessor.c.include"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".meta.preprocessor.macro.c"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".string.quoted.other.lt-gt.include.c .meta.preprocessor.c.include"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".punctuation.definition.string.begin.c .meta.preprocessor.c.include"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".punctuation.definition.string.end.c .meta.preprocessor.c.include"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".other.package.exclude"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".other.remove"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".other.add"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".punctuation.section.group.tex"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".punctuation.definition.arguments.begin.latex"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".punctuation.definition.arguments.end.latex"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".punctuation.definition.arguments.latex"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".meta.group.braces.tex"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".string.other.math.tex"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".variable.parameter.function.latex"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".punctuation.definition.constant.math.tex"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".constant.other.math.tex .text.tex.latex"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".constant.other.general.math.tex"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".constant.other.general.math.tex"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".constant.character.math.tex"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".string.other.math.tex"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".punctuation.definition.string.begin.tex"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".punctuation.definition.string.end.tex"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".keyword.control.label.latex"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".constant.other.general.math.tex .text.tex.latex"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".variable.parameter.definition.label.latex"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".support.function.be.latex"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".support.function.section.latex"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".support.function.general.tex"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".keyword.control.ref.latex"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".storage.type.class.python"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".storage.type.function.python"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".storage.modifier.global.python"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".support.type.exception.python"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".meta.scope.for-in-loop.shell"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".variable.other.loop.shell"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".meta.scope.case-block.shell"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".meta.scope.case-body.shell"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".punctuation.definition.logical-expression.shell"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".storage.modifier.c"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".support.function.perl"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".meta.diff"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".meta.diff.header"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".meta.diff.range"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".markup.deleted"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".markup.changed"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".markup.inserted"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".markup.heading"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".punctuation.definition.heading.markdown"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".markup.quote"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".markup.italic"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".markup.bold"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".markup.underline.link.markdown"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".constant.other.reference.link.markdown .meta.link.reference"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".constant.other.reference.link.markdown"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".meta.dummy.line-break .meta.paragraph.markdown"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".sublimelinter.notes"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".sublimelinter.outline.illegal"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".sublimelinter.underline.illegal"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".sublimelinter.outline.warning"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".sublimelinter.underline.warning"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".sublimelinter.outline.violation"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".sublimelinter.underline.violation"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".sublimelinter.mark.warning"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".sublimelinter.mark.error"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".sublimelinter.gutter-mark"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".brackethighlighter.all"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".entity.name.filename.find-in-files"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".constant.numeric.line-number.find-in-files"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".markup.deleted.git_gutter"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".markup.inserted.git_gutter"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".markup.changed.git_gutter"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".variable.other.readwrite.js"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".variable.other.object.js"
[/Users/alan/.cargo/target/55/19854259915251/_active_nvim_run:44:11] t = ".variable.other.constant.js"
Output:

Notes

  • Started out trying to use the crate parcel_css but it didn't work. It looks like that was an earlier version of lightningcss. With parcel_css I kept getting errors like:

    error[E0599]: no function or associated item named `from_vec2` found for struct `Selector` in the current scope

-- end of line --

References

syntect - rust syntax highlighter