2010-05-30 2 views
8

Я потратил свой необходимый два часа на поиски Google, и я не могу найти никаких хороших ответов, поэтому давайте посмотрим, смогут ли люди победить компьютеры Google.Можно ли разобрать таблицу стилей с помощью Nokogiri?

Я хочу проанализировать таблицу стилей в Ruby, чтобы я мог применять эти стили к элементам в моем документе (чтобы сделать стили вложенными). Итак, я хочу, чтобы взять что-то вроде

<style> 
.mystyle { 
    color:white; 
} 
</style> 

И быть в состоянии извлечь его в объект Nokogiri какой-то.

Класс Nocogiri «CSS :: Parser» (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 

Какой бы извлечь стили из таблицы стилей и добавить их все как встраиваются стили в моем документе.

ответ

4

@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 
15

Nokogiri не может анализировать таблицы стилей CSS.

CSS::Parser что вы столкнулись с разборами CSS выражения. Он используется всякий раз, когда вы перемещаете дерево HTML с помощью селекторов CSS, а не XPath (это cool feature из Nokogiri).

Существует рубин CSS parser. Вы можете использовать его вместе с Нокогири, чтобы достичь того, чего хотите.

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 
+1

html.css (selector) возвращает массив элементов. Таким образом, это должны быть элементы. Каждый элемент | элемент | – Alagu

Смежные вопросы