Как добавить не экранированные амперсанды в HTML с помощью Nokogiri :: XML :: Builder - PullRequest
3 голосов
/ 28 ноября 2009

Я хотел бы добавить такие вещи, как маркеры «•» в HTML, используя XML Builder в Nokogiri, но все экранируется. Как мне предотвратить побег?

Я бы хотел, чтобы результат был:

<span>&#8226;</span> 

вместо:

<span>&amp;#8226;</span> 

Я просто делаю это:

xml.span { 
  xml.text "&#8226;\ " 
}

Что мне не хватает?

Ответы [ 2 ]

3 голосов
/ 28 ноября 2009

Если вы определите

  class Nokogiri::XML::Builder
    def entity(code)
      doc = Nokogiri::XML("<?xml version='1.0'?><root>&##{code};</root>")
      insert(doc.root.children.first)
    end
  end

тогда это

  builder = Nokogiri::XML::Builder.new do |xml|
    xml.span {
      xml.text "I can has "
      xml.entity 8665
      xml.text " entity?"
    }
  end
  puts builder.to_xml

выходы

<?xml version="1.0"?>
<span>I can has &#x2022; entity?</span>

PS это только обходной путь, для чистого решения обратитесь к документации libxml2 (Nokogiri построен на libxml2) для получения дополнительной помощи Тем не менее, даже эти люди признают, что обработка сущностей может быть довольно .. ошибочной, иногда громоздкой .

0 голосов
/ 28 ноября 2009

Когда вы устанавливаете текст элемента, вы действительно устанавливаете текст, а не исходный текст HTML. < и & не имеют никакого особого значения в простом тексте.

Так что просто введите пулю: '•'. Конечно, ваш исходный код и ваш XML-файл должны будут использовать одну и ту же кодировку, чтобы получилось правильно. Если ваш XML-файл имеет формат UTF-8, а исходный код - нет, вам, вероятно, придется сказать '\xe2\x80\xa2', который представляет собой последовательность байтов UTF-8 для символа маркера в виде строкового литерала.

(В общем, не-ASCII-символы в Ruby 1.8 сложны. Байт-интерфейсы не слишком хорошо сочетаются с миром XML "весь текст в юникоде".)

...