2010-05-30 12 views
8

Ho trascorso le mie due ore a cercarlo su google, e non riesco a trovare nessuna risposta valida, quindi vediamo se gli esseri umani possono battere i computer di Google.È possibile analizzare un foglio di stile con Nokogiri?

Voglio analizzare un foglio di stile in Ruby in modo che possa applicare quegli stili agli elementi nel mio documento (per rendere gli stili in linea). Quindi, voglio prendere qualcosa come

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

Ed essere in grado di estrarre in un oggetto Nokogiri di qualche tipo.

La classe Nokogiri "CSS :: Parser" (http://nokogiri.rubyforge.org/nokogiri/Nokogiri/CSS/Parser.html) ha certamente un nome promettente, ma non riesco a trovare alcuna documentazione su cosa sia o come funzioni, quindi non ho idea se possa fare ciò che Sono qui dopo.

Il mio obiettivo finale è quello di essere in grado di scrivere codice qualcosa del tipo:

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 

Il che estrarre gli stili da un foglio di stile e li aggiungere come stili inline per il mio documento.

risposta

4

@molf sicuramente avuto un grande inizio lì, ma è ancora necessario il debug di una manciata di problemi per farlo funzionare in produzione. Ecco la versione attuale e testata di questo:

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 non può analizzare fogli di stile CSS.

CSS::Parser che si è verificato con parses CSS espressioni. Viene utilizzato ogni volta che si attraversa un albero HTML da selettori CSS anziché XPath (questo è un cool feature di Nokogiri).

C'è un Rubino CSS parser, però. Puoi usarlo insieme a Nokogiri per ottenere ciò che desideri.

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 (selettore) restituisce una matrice di elementi. Quindi dovrebbe essere elements.each do | element | – Alagu

Problemi correlati