Самое близкое, что я могу придумать, это:
# ......
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(/(<%|%>)/) {|x| x=='<%' ? '<%' : '%>'}
File.open(filename, "w") {|f| f.write(s)}
end
Это решение нанесет ущерб любым файлам, которые содержат последовательности «<%
» или «%>
» (например, если вы описываете синтаксис ERB в HTML). Проблема в том, что вы пытаетесь использовать синтаксический анализатор XML для замены узла XML текстом, который должен быть экранирован, поэтому я не уверен, что вы можете сделать это намного лучше, если только не существует скрытого метода "raw_outer_xml=(str)
" .
Лучше всего в целом написать собственный синтаксический анализатор SAX, который просто отображает данные, переданные вашим обратным вызовам (или сохраняет их в строковом буфере), если это не «start_element» с «img», в этом случае будет записана последовательность ERB.