2010-05-30 14 views
8

Ich habe meine erforderlichen zwei Stunden damit verbracht, dies zu googeln, und ich kann keine guten Antworten finden, also sehen wir, ob Menschen Google-Computer schlagen können.Ist es möglich, ein Stylesheet mit Nokogiri zu analysieren?

Ich möchte ein Stylesheet in Ruby analysieren, damit ich diese Stile auf Elemente in meinem Dokument anwenden kann (um die Stile inline zu machen). Also, ich mag so etwas wie

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

und in der Lage, es nehmen in einen Nokogiri Gegenstand irgendeine Art zu extrahieren.

Die Nokogiri-Klasse "CSS :: Parser" (http://nokogiri.rubyforge.org/nokogiri/Nokogiri/CSS/Parser.html) hat sicherlich einen vielversprechenden Namen, aber ich kann keine Dokumentation darüber finden, was es ist oder wie es funktioniert, also habe ich keine Ahnung, ob es was ich kann Ich bin nach hier.

Mein Endziel ist es, Code so etwas wie schreiben:

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 

Welche Stile aus einem Stylesheet extrahieren würde und sie alle als inlined Stile zu meinem Dokument hinzufügen.

Antwort

4

@molf definitiv einen guten Start hatte, aber es bedurfte noch eine Handvoll Probleme Debuggen es in der Produktion zu bekommen. Hier ist die aktuelle, getestete Version davon:

15

Nokogiri kann CSS-Stylesheets nicht analysieren.

Die CSS::Parser, die Sie gefunden haben, analysiert CSS Ausdrücke. Es wird immer dann verwendet, wenn Sie einen HTML-Baum durch CSS-Selektoren anstatt durch XPath durchlaufen (dies ist ein cool feature von Nokogiri).

Es gibt einen Rubin CSS parser, obwohl. Sie können es zusammen mit Nokogiri verwenden, um zu erreichen, was Sie wollen.

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) gibt ein Array von Elementen zurück. Also sollte es elements.each do | element | sein – Alagu

Verwandte Themen