J'ai récemment rencontré le problème du décodage des entités html. J'ai les deux chaînes suivantes ( notez comment deux méthodes d'encodage sont utilisées, nommées et numérotées ).
The old "how to fold xml" question
Babel doesn't wrap results in verbatim
Et je dois les convertir en
The old "how to fold xml" question
Babel doesn't wrap results in verbatim
En cherchant, j'ai trouvé cette vieille question sur SO (ce que je fais pour le moment), mais je refuse de croire qu'Emacs n'a pas de méthode intégrée pour le faire. Nous avons plusieurs navigateurs Web, dont au moins deux dont je sais qu'ils sont intégrés, sans parler des clients de messagerie et des lecteurs de flux.
N'y a-t-il pas un moyen intégré de décoder les entités html?
Je recherche une fonction qui prend une chaîne du premier exemple et renvoie une chaîne du deuxième exemple.
libxml-parse-html-region
fait cela, bien sûr, mais il peut faire plus que ce que vous voulez, car il analyse également les balises HTML… (Et tous les Emacs ne sont pas non plus construits avec le support LibXML, je suppose).Réponses:
Emacs comprend un analyseur XML Elisp pur
xml.el
, dont laxml-parse-string
fonction fait le travail, bien qu'il ressemble un peu à une fonction interne non documentée. Je ne sais pas s'il existe des entités HTML uniquement qui ne seront pas correctement gérées en traitant la chaîne comme un fragment XML.Cette fonction wrapper omettra simplement toutes les balises de fin de la chaîne d'entrée, bien que vous puissiez la rendre plus stricte:
Dans Emacs avec la prise en charge de LibXML, une autre façon légèrement hackée serait d'écrire un wrapper
libxml-html-parse-region
. Étant donné que l'analyseur LibXML suppose que son argument est un document HTML complet, la fonction wrapper doit extraire les données de caractères analysées de la structure de document retournée, à l'aide depcase
. Essayer de décoder une chaîne contenant des balises HTML produira une erreur:Résultats:
Il semble un peu en arrière de décoder un fragment de document en l'analysant comme un document complet, pour ensuite retirer immédiatement les balises environnantes. En revanche, l'utilisation de LibXML doit être rapide et donner des résultats précis.
la source
xml.el
solution la plus simple en premier.lisp/xml.el
a toujours inclus la fonctionxml-substitute-special
, qui effectue le même décodage d'entité que Jon Odecode-entities
.. Il n'omet cependant pas les balises de fin.web-mode.el
fait cela avecweb-mode-dom-entities-replace
.la source