Advertisement
Guest User

Untitled

a guest
Oct 24th, 2016
52
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.59 KB | None | 0 0
  1. extern crate cssparser;
  2.  
  3. fn main() {
  4. const CSS: &'static str = "html { border: 1px solid; }\nbody { display: block; }";
  5. let x: Vec<_> = cssparser::RuleListParser::new_for_stylesheet(&mut cssparser::Parser::new(CSS), MyParser).collect();
  6. println!("{:?}", x);
  7. // [Ok(("html", "border: 1px solid;")), Ok(("body", "display: block;"))]
  8. }
  9.  
  10. struct MyParser;
  11.  
  12. impl cssparser::QualifiedRuleParser for MyParser {
  13. type Prelude = String;
  14. type QualifiedRule = (String, String);
  15.  
  16. fn parse_prelude(&mut self, input: &mut cssparser::Parser) -> Result<Self::Prelude, ()> {
  17. input.parse_until_before(cssparser::Delimiter::CurlyBracketBlock, to_str_without_comments)
  18. }
  19.  
  20. fn parse_block(&mut self, prelude: Self::Prelude, input: &mut cssparser::Parser) -> Result<Self::QualifiedRule, ()> {
  21. to_str_without_comments(input).map(|x| (prelude, x))
  22. }
  23. }
  24.  
  25. impl cssparser::AtRuleParser for MyParser {
  26. type Prelude = ();
  27. type AtRule = (String, String);
  28. }
  29.  
  30. fn to_str_without_comments(input: &mut cssparser::Parser) -> Result<String, ()> {
  31. use cssparser::ToCss;
  32. use cssparser::Token::*;
  33.  
  34. let mut s = String::new();
  35. let mut insert_whitespace = false;
  36.  
  37. while let Ok(t) = input.next_including_whitespace_and_comments() {
  38. match t {
  39. WhiteSpace(_) | Comment(_) => insert_whitespace = true,
  40. t => {
  41. if insert_whitespace {
  42. if s.len() > 0 { s.push(' ') }
  43. insert_whitespace = false;
  44. }
  45. try!(t.to_css(&mut s).map_err(|_| ()));
  46. }
  47. }
  48. }
  49.  
  50. Ok(s)
  51. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement