premailer / css_parser

Ruby CSS Parser
Other
279 stars 110 forks source link

find_by_selector should return more easily navigable / parseable data structure #71

Open getaaron opened 8 years ago

getaaron commented 8 years ago

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"]}]
grosser commented 8 years ago

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) }]
getaaron commented 8 years ago

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

grosser commented 8 years ago

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

tres commented 8 years ago

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.