Cómo agregar símbolos sin escape a HTML con Nokogiri::XML::Builder
Pregunta
Me gustaría agregar cosas como viñetas "•" a HTML usando XML Builder en Nokogiri, pero todo se escapa.¿Cómo evito que se escape?
Me gustaría que el resultado fuera:
<span>•</span>
en vez de:
<span>&#8226;</span>
Sólo estoy haciendo esto:
xml.span {
xml.text "•\ "
}
¿Qué me estoy perdiendo?
Solución
Si define
class Nokogiri::XML::Builder
def entity(code)
doc = Nokogiri::XML("<?xml version='1.0'?><root>&##{code};</root>")
insert(doc.root.children.first)
end
end
entonces esto
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
rendimientos
<?xml version="1.0"?>
<span>I can has • entity?</span>
& nbsp;
PS esta es solo una solución, para una solución limpia, consulte la documentación de libxml2
(Nokogiri está construido en libxml2) para obtener más ayuda. Sin embargo, incluso estas personas admiten que manejar entidades puede ser bastante ...err, a veces engorroso .
Otros consejos
Cuando configuras el texto de un elemento, en realidad estás configurando texto, no fuente HTML. <
y &
no tiene ningún significado especial en texto plano.
Así que simplemente escribe una viñeta: '•'
.Por supuesto, su código fuente y su archivo XML tendrán que usar la misma codificación para que salga bien.Si su archivo XML es UTF-8 pero su código fuente no lo es, probablemente tendrá que decir '\xe2\x80\xa2'
que es la secuencia de bytes UTF-8 para el carácter de viñeta como literal de cadena.
(En general, los caracteres que no son ASCII en Ruby 1.8 son complicados.Las interfaces basadas en bytes no encajan muy bien con el mundo XML de todo texto es Unicode.)