Pure Ruby CSS selector parser.
gem 'parselly'bundle installOr install it directly:
gem install parsellyRequires Ruby 2.7 or newer.
require 'parselly'
ast = Parselly.parse('article#main.content[data-state="open"] > a:hover')
ast.ids
#=> ["main"]
ast.attributes
#=> [{ name: "data-state", operator: "=", value: "open" }]
ast.pseudo_class_names
#=> ["hover"]
ast.specificity
#=> [1, 3, 2]Strict parsing raises Parselly::LexError or Parselly::SyntaxError for invalid selectors:
Parselly.parse('div >')Use tolerant mode when you want a Parselly::ParseResult instead:
result = Parselly.parse('div >', tolerant: true)
result.success?
#=> false
result.errors.first[:message]
#=> "Parse error: unexpected $end '' at 1:6"Use Parselly.sanitize to escape text for a CSS identifier:
Parselly.sanitize('1st item')
#=> "\\31 st\\ item"bin/setup
bundle exec rakeMIT