Nokogiri портит разметку Erb

Я использую Nokogiri для обработки страниц в моем приложении Sinatra, Ruby.

Итак, когда я делаю это:

require 'nokogiri'
s='<a href="<%=@prevHref%>">a</a>'
doc = Nokogiri::HTML.fragment(s)
puts doc.to_s

я получил

<a href="%5C&lt;%=@prevHref%%5C&gt;">a</a>

Код был экранирован. Как этого избежать? Собственно, что я делаю:

  1. Открыть шаблон на диске
  2. Разберите его с Нокогири
  3. Замените некоторые узлы (не тот, который экранирован, а некоторые другие)
  4. Сохранить шаблон обратно на диск
  5. Разобрать шаблон с помощью ERB, который явно не работает, так как разметка ERB была испорчена.

person Yan    schedule 25.05.2012    source источник
comment
Nokogiri не предназначен для работы с erb, он предназначен для разбора html и xml. Таким образом, он видит неверный HTML и пытается его исправить. Экранирование значений внутри строкового атрибута по ходу дела.   -  person Matthew Rudy    schedule 25.05.2012
comment
Согласитесь, вы не можете использовать для этого Nokogiri, так как Nokogiri не понимает синтаксиса. Вам нужно будет найти другой способ редактирования шаблона.   -  person Eugene    schedule 25.05.2012
comment
У @maerics есть хороший обходной путь: stackoverflow.com/questions/6362189/   -  person hcarreras    schedule 03.12.2015


Ответы (2)


Как описано в другом месте на этой странице, Nokogiri (и, точнее, libxml2) не может внутренне представлять Erb. Например, рассмотрим этот допустимый шаблон Erb, который выводит значение HTML:

<p<%="> Hello"%> World!<%="</p"%>>

Если вы подумаете об этом, вы поймете, что неразумно ожидать, что Nokogiri сможет создать из этого DOM.

Вместо использования Erb (который не может быть проанализирован как HTML или XML) вам нужно будет использовать язык шаблонов, который использует допустимую разметку. Например:

  • Amrita – принимает действительный X/HTML и объединяет его со структурами данных Ruby для создания вывода HTML.
  • Kwartz – принимает действительный X/HTML и объединяет его с файлом привязки данных в стиле CSS для создания шаблонов Erb. .
person Phrogz    schedule 25.05.2012
comment
Спасибо :) Я думал о nokogiri не как о конструкторе DOM, а как о поисковике текста. Я не ожидал, что это что-то изменит из коробки. Теперь я понимаю, что Nokogiri начинает с того, что разрывает мой HTML на части и создает DOM. И только тогда он может его использовать. - person Yan; 28.05.2012

Вы должны сначала запустить строку s через erb, прежде чем сможете проанализировать ее с помощью Nokogiri. В противном случае вы делаете это правильно.

person three    schedule 25.05.2012
comment
Я редактирую шаблон ERB с помощью nokogiri. Я не вывожу его пользователю. Я редактирую шаблон и сохраняю шаблон. - person Yan; 25.05.2012
comment
@Yan Как говорится в этом ответе и двух других комментариях к вашему вопросу, вы не можете этого сделать. ERB не является допустимой разметкой XML (или HTML), поэтому не может быть проанализирован или представлен Nokogiri/libxml2. Вы задали хороший вопрос и у вас есть разумное желание, но это невозможно. - person Phrogz; 25.05.2012