Ich bin kürzlich auf das Problem gestoßen, HTML-Entitäten zu dekodieren. Ich habe die folgenden zwei Zeichenfolgen ( Beachten Sie, wie zwei Codierungsmethoden verwendet werden, benannt und nummeriert ).
The old "how to fold xml" question
Babel doesn't wrap results in verbatim
Und ich muss sie konvertieren
The old "how to fold xml" question
Babel doesn't wrap results in verbatim
Als ich mich umsah, fand ich diese alte Frage auf SO (was ich gerade mache), aber ich weigere mich zu glauben, dass Emacs keine eingebaute Möglichkeit hat, dies zu tun. Wir haben mehrere Webbrowser, von denen ich weiß, dass mindestens zwei integriert sind, ganz zu schweigen von Mail-Clients und Feed-Readern.
Gibt es keine integrierte Methode zum Dekodieren von HTML-Entitäten?
Ich suche nach einer Funktion, die eine Zeichenfolge aus dem ersten Beispiel nimmt und eine Zeichenfolge aus dem zweiten Beispiel zurückgibt.
libxml-parse-html-region
tut dies natürlich, aber es kann mehr als Sie wollen, da es auch HTML-Tags analysiert… (und ich denke, nicht alle Emacs werden mit LibXML-Unterstützung erstellt).Antworten:
Emacs enthält einen reinen Elisp-XML-Parser
xml.el
, dessenxml-parse-string
Funktion die Aufgabe übernimmt, obwohl es ein bisschen wie eine undokumentierte interne Funktion erscheint. Ich bin nicht sicher, ob es nur HTML-Entitäten gibt, die nicht richtig behandelt werden, wenn die Zeichenfolge als XML-Fragment behandelt wird.Diese Wrapper-Funktion lässt einfach alle nachfolgenden Tags in der Eingabezeichenfolge weg, obwohl Sie sie strenger gestalten könnten:
In Emacs mit LibXML-Unterstützung besteht eine andere, etwas hackige Möglichkeit darin, einen Wrapper herumzuschreiben
libxml-html-parse-region
. Da der LibXML-Parser davon ausgeht, dass sein Argument ein vollständiges HTML-Dokument ist, muss die Wrapper-Funktion die analysierten Zeichendaten mithilfe von aus der zurückgegebenen Dokumentstruktur extrahierenpcase
. Der Versuch, eine Zeichenfolge zu dekodieren, die HTML-Tags enthält, führt zu einem Fehler:Ergebnisse:
Es scheint ein wenig rückständig zu sein, ein Dokumentfragment zu dekodieren, indem es als vollständiges Dokument analysiert wird, um dann die umgebenden Tags sofort zu entfernen. Andererseits sollte die Verwendung von LibXML schnell sein und genaue Ergebnisse liefern.
quelle
xml.el
Lösung an die erste Stelle zu setzen.lisp/xml.el
immer die Funktion enthalten warxml-substitute-special
, die dieselbe Entitätsdecodierung wie die von Jon O.decode-entities
ausführt . Nachfolgende Tags werden jedoch nicht ausgelassen.web-mode.el
macht das mitweb-mode-dom-entities-replace
.quelle