css_parser icon indicating copy to clipboard operation
css_parser copied to clipboard

find_by_selector should return more easily navigable / parseable data structure

Open getaaron opened this issue 9 years ago • 4 comments

This code:

parser = CssParser::Parser.new
parser.load_string! 'a { color: hotpink; font-size: 13px; }'
parser.find_by_selector 'a'

Returns an array of one string:

["color: hotpink; font-size: 13px;"]

Is there a more easily navigable / parseable data structure we could return? For example, maybe something like:

[{:color=>["hotpink"], :font_size=>["13px"]}]

getaaron avatar Jun 22 '16 15:06 getaaron

sounds like an useful feature, I think the internal structure should exist ... you could either add a raw: true option or as_hash: true ... but a simpler workaround could be to do

Hash[s.split(';').map {|k| k.split(': ', 2) }]

grosser avatar Jun 22 '16 15:06 grosser

That doesn't work exactly right on shorthand properties like border:

["color: hotpink; font-size: 13px;border: 5px solid red"]

Also there are some spacing issues (we get the key " font-size" with a leading space), and also the split wouldn't work on variants like color : hotpink or color:hotpink

getaaron avatar Jun 24 '16 17:06 getaaron

I think it produces normalized css, so spaces should not be an issue, shorthand won't work though

grosser avatar Jun 24 '16 17:06 grosser

https://github.com/premailer/css_parser/pull/72

this pull request adds a to_h instance method that will allow traversal of CSS as nested Hash objects.

don't know if that's going to get you where you need to go @getaaron , but it solves an issue for me & saw this so I thought I'd drop by & let you know about it.

tres avatar Jul 19 '16 22:07 tres