2011-06-15 106 views
2

如何使用nokogiri替換所有帶圖像標籤的img標籤?這是爲了利用Rails自動插入正確資產服務器的能力?使用Nokogiri用<%= image_tag%>替換<img src />標籤?

require 'nokogiri' 

class ToImageTag 

    def self.convert 
    Dir.glob("app/views/**/*").each do |filename| 
     doc = Nokogiri::HTML(File.open(filename)) 
     doc.xpath("//img").each |img_tags| 
     # grab the src and all the attributes and move them to ERB 
     end 

    # rewrite the file 
    end 

    rescue => err 
    puts "Exception: #{err}" 
    end 

end 
+0

也許你可以用一個例子來澄清你想要做什麼,爲什麼? 是您想要更改資產服務器,並添加緩存清除時間戳嗎? – 2011-06-15 19:28:21

回答

1

有點受到maerics'響應的啓發,我創建了一個腳本來做到這一點。它對HTML實體沒有任何問題,因爲它僅使用nokogiri輸出作爲替換指南。實際的替換是通過使用String#gsub完成的!

https://gist.github.com/1254319

4

我可以想出最接近的是如下:

# ...... 
Dir.glob("app/views/**/*").each do |filename| 
    # Convert each "img" tag into a text node. 
    doc = Nokogiri::HTML(File.open(filename)) 
    doc.xpath("//img").each do |img| 
    image_tag = "<%= image_tag('#{img['src']}') %>" 
    img.replace(doc.create_text_node(image_tag)) 
    end 
    # Replace the new text nodes with ERB markup. 
    s = doc.to_s.gsub(/(&lt;%|%&gt;)/) {|x| x=='&lt;%' ? '<%' : '%>'} 
    File.open(filename, "w") {|f| f.write(s)} 
end 

該解決方案將肆虐在包含序列「&lt%」的任何文件或「%&gt;」(例如,如果你是在HTML中描述ERB語法)。問題在於你試圖使用XML解析器來替換必須轉義的文本的XML節點,所以我不確定你可以做得比這更好,除非有一些隱藏的「raw_outer_xml=(str)」方法。

你最好總體打賭是編寫一個自定義的SAX解析器,它只是迴應給你回調的數據(或將它存儲在字符串緩衝區中),除非它是帶有「img」的「start_element」,其中它會寫入ERB序列。

+1

看來nokogiri無法解析ERB,所以我將不得不使用正則表達式。 – maletor 2011-06-16 23:09:09

+0

Nokogiri不是ERB解析器。 ERB文檔可以包含HTML標籤,但這些標籤也可以是XML或用於批量郵寄活動的文字處理模板。 – 2011-06-19 08:16:00

+1

對,我正在考慮在純HTML文檔中將一些標籤轉換爲ERB,但ERB文檔則是另一回事。 ERB是否公開其解析器? – maerics 2011-06-19 15:50:48

相關問題