Pergunta

Eu gostaria de adicionar coisas como pontos de bala "•" para HTML usando o XML Builder em Nokogiri, mas tudo está sendo escapou. Como faço para impedir que ele seja escapou?

Eu gostaria que o resultado seja:

<span>&#8226;</span> 

em vez de:

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

Eu só estou fazendo isso:

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

O que eu estou ausente?

Foi útil?

Solução

Se você definir

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

então este

  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

rendimentos

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

PS isso uma única solução, para uma solução limpa, por favor consulte a documentação libxml2 (Nokogiri é construído sobre libxml2) para obter mais ajuda. No entanto, mesmo essas pessoas admitir que entidades manipulação pode ser bastante ..err, complicado às vezes .

Outras dicas

Quando você está definindo o texto de um elemento, você realmente está definindo texto, não HTML. < e & não tem nenhum significado especial em texto simples.

Então, basta digitar uma bala: '•'. Claro que o seu código-fonte e seu arquivo XML terá de estar usando a mesma codificação para que isso dar certo. Se o arquivo XML é UTF-8, mas o seu código fonte não está, você provavelmente tem a dizer '\xe2\x80\xa2' que é a seqüência de bytes UTF-8 para o carácter de marca como um literal string.

(em caracteres gerais não-ASCII em Ruby 1.8 são complicados. As interfaces baseadas em bytes não combinam muito bem com o mundo de XML de todos-text-é-Unicode.)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top