使用Nokogiri将<img src=""/>代码替换为&lt;%= image_tag%&gt;?

时间:2011-06-15 18:03:57

标签: ruby-on-rails ruby nokogiri erb

如何使用nokogiri将所有img标签替换为图像标签?这是为了利用Rails能够自动插入正确的资产服务器吗?

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

2 个答案:

答案 0 :(得分: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 :(得分:1)

受到maerics回应的启发,我创建了一个执行此操作的脚本。它没有HTML实体的问题,因为它只使用nokogiri输出作为替换指南。实际替换是使用String#gsub!

完成的

https://gist.github.com/1254319