Как заменить узел на рубиновую строку? - PullRequest
0 голосов
/ 09 июля 2010

Я пытаюсь заменить все мои <img> теги в HTML-файле тегом <%= image_tag() %> rails.

Я хочу сделать что-то вроде:

doc = open("myfile.html") { |f| Hpricot(f) }
imgs = doc.search("//img") # here i got all Hpricot::Elements

imgs.each { |i|
  # fake function name !
  i.replace_by_HTML('<%= image_tag("/images/blabla.jpg") %>')
}

Что мне нужно, это функция, которая заменит узел в файле на строку, которую я передам.

< img src="/images/blalba.jpg" /> would give => <%= image_tag("/images/blabla.jpg") %>

Обновление:

Я не хочу использовать регулярные выражения, вотпочему я выбрал Hpricot, потому что он будет анализировать HTML для меня, и тогда я смогу сделать Element.attributes и сгенерировать image_tag со всеми включенными атрибутами.

Что если мои теги img похожи:

< img style="float:left;" src="images/blabla.jpg" width="30" height="30" ... />

или

< img src=\"images/blabla.jpg\" style=\"float:left;\" width=\"30\" height=\"30\" ... />

Понимаете, о чем я?Я могу проанализировать файл .SQL, содержащий экранирующие косые черты, атрибут src может быть после другого атрибута и т. Д.

Дело в том, что я уже выполнил функцию, которая вернет мой image_tag, если яукажите Hpricot::Element, но я не знаю, как заменить исходный узел моей строкой в ​​документе Hpricot.

1 Ответ

0 голосов
/ 09 июля 2010

Вы можете сделать это с помощью строкового метода gsub и регулярных выражений

doc = open("myfile.html") { |f| 
  f.read().gsub(/<img src="([^"]*)".*\/>/, '<%= image_tag("\1") %>') 
}

У меня не установлен hpricot, но кажется (отметьте это hpricot-altering ), что вы можете использовать метод swap для найденных элементов

imgs.each { |i|
  i.swap('<%= image_tag(' + i.src + ') %>')
}
...