【问题标题】:Use Nokogiri to replace <img src /> tags with <%= image_tag %>?使用 Nokogiri 将 <img src /> 标签替换为 <%= image_tag %>?
【发布时间】:2011-06-15 18:03:57
【问题描述】:

如何使用 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

【问题讨论】:

  • 也许你可以用一个例子来说明你到底想做什么,为什么?是不是要更改资产服务器,并附加一个缓存清除时间戳?

标签: ruby-on-rails ruby nokogiri erb


【解决方案1】:

我能想到的最接近的如下:

# ......
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

此解决方案将对任何包含序列“&amp;lt%”或“%&amp;gt;”的文件造成严重破坏(例如,如果您在 HTML 中描述 ERB 语法)。问题是您正在尝试使用 XML 解析器将 XML 节点替换为必须转义的文本,所以我不确定您能做得比这更好,除非有一些隐藏的“raw_outer_xml=(str)”方法.

你最好的总体选择是编写一个自定义 SAX 解析器,它只是回显给你的回调的数据(或将它存储在一个字符串缓冲区中),除非它是一个带有“img”的“start_element”,在这种情况下它会写ERB序列。

【讨论】:

  • 看来 nokogiri 无法解析 ERB,所以我将不得不使用正则表达式。
  • Nokogiri 不是 ERB 解析器。 ERB 文档可以包含 HTML 标签,但也可以是 XML 或用于批量邮寄活动的文字处理模板。
  • 对,我想在纯 HTML 文档中将一些标签转换为 ERB,但 ERB 文档是另一回事。 ERB 是否公开其解析器?
【解决方案2】:

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

https://gist.github.com/1254319

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-07
    • 2012-11-26
    • 2019-04-27
    • 1970-01-01
    • 2014-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多