Я провел свои необходимые два часа, гугля это, и я не могу найти хорошие ответы, поэтому давайте посмотрим, могут ли люди победить компьютеры Google.
Я хочу проанализировать таблицу стилей в Ruby так, чтобы я мог применить те стили к элементам в моем документе (для создания стилей встроенными). Так, я хочу взять что-то как
И смогите извлечь его в какой-то объект Nokogiri.
Класс Nokogiri "CSS:: Синтаксический анализатор" (http://nokogiri.rubyforge.org/nokogiri/Nokogiri/CSS/Parser.html), конечно, имеет многообещающее имя, но я не могу найти документацию относительно того, что это или как это работает, таким образом, я понятия не имею, может ли это сделать то, что я после здесь.
Моя конечная цель должна смочь написать код что-то как:
a_web_page = Nokogiri::HTML(html_page_as_string)
parsed_styles = Nokogiri::CSS.parse(html_page_as_string)
parsed_styles.each do |style|
existing_inlined_style = a_web_page.css(style.declaration) || ''
a_web_page.css(style.declaration)['css'] = existing_inlined_style + style.definition
end
Который извлек бы стили из таблицы стилей и добавил бы их всех как встроенные стили к моему документу.
У @molf определенно был отличный старт, но все же потребовалось отладить несколько проблем, чтобы заставить его работать в продакшене. Вот текущая протестированная версия этого:
html = Nokogiri::HTML(html_string)
css = CssParser::Parser.new
css.add_block!(html_string) # Warning: This line modifies the string passed into it. In potentially bad ways. Make sure the string has been duped and stored elsewhere before passing this.
css.each_selector do |selector, declarations, specificity|
next unless selector =~ /^[\d\w\s\#\.\-]*$/ # Some of the selectors given by css_parser aren't actually selectors.
begin
elements = html.css(selector)
elements.each do |match|
match["style"] = [match["style"], declarations].compact.join(" ")
end
rescue
logger.info("Couldn't parse selector '#{selector}'")
end
end
html_with_inline_styles = html.to_s
Nokogiri не может анализировать таблицы стилей CSS.
CSS :: Parser
, с которым вы столкнулись, анализирует выражения CSS . Он используется всякий раз, когда вы перемещаетесь по дереву HTML с помощью селекторов CSS, а не XPath (это классная функция Nokogiri).
Тем не менее, существует парсер CSS Ruby . Вы можете использовать его вместе с Nokogiri для достижения желаемого.
require "nokogiri"
require "css_parser"
html = Nokogiri::HTML(html_string)
css = CssParser::Parser.new
css.add_block!(css_string)
css.each_selector do |selector, declarations, specificity|
element = html.css(selector)
element["style"] = [element["style"], declarations].compact.join(" ")
end