Como adicionar ampersands não escapou para HTML com Nokogiri :: XML :: Builder
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>•</span>
em vez de:
<span>&#8226;</span>
Eu só estou fazendo isso:
xml.span {
xml.text "•\ "
}
O que eu estou ausente?
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 • 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.)