Используйте Nokogiri для замены тегов <img src /> на <% = image_tag%>? - PullRequest
2 голосов
/ 15 июня 2011

Как я могу использовать 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 ]

4 голосов
/ 15 июня 2011

Самое близкое, что я могу придумать, это:

# ......
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;» (например, если вы описываете синтаксис ERB в HTML). Проблема в том, что вы пытаетесь использовать синтаксический анализатор XML для замены узла XML текстом, который должен быть экранирован, поэтому я не уверен, что вы можете сделать это намного лучше, если только не существует скрытого метода "raw_outer_xml=(str)" .

Лучше всего в целом написать собственный синтаксический анализатор SAX, который просто отображает данные, переданные вашим обратным вызовам (или сохраняет их в строковом буфере), если это не «start_element» с «img», в этом случае будет записана последовательность ERB.

1 голос
/ 30 сентября 2011

Вдохновленный ответом maerics, я создал скрипт, который делает это. У него нет проблем с сущностями HTML, потому что он использует только вывод nokogiri в качестве руководства для замены. Фактическая замена выполняется с помощью String # gsub!

https://gist.github.com/1254319

...