Ostatnio natknąłem się na problem dekodowania jednostek HTML. Mam następujące dwa ciągi ( zwróć uwagę, jak używane są dwie metody kodowania, nazwane i numerowane ).
The old "how to fold xml" question
Babel doesn't wrap results in verbatim
I muszę je przekonwertować
The old "how to fold xml" question
Babel doesn't wrap results in verbatim
Rozglądając się, znalazłem to stare pytanie na SO (co obecnie robię), ale nie chcę wierzyć, że Emacs nie ma wbudowanego sposobu, aby to zrobić. Mamy kilka przeglądarek internetowych, z których przynajmniej dwie są wbudowane, nie wspominając o klientach pocztowych i czytnikach kanałów.
Czy nie ma wbudowanego sposobu dekodowania jednostek HTML?
Szukam funkcji, która pobiera ciąg z pierwszego przykładu i zwraca ciąg z drugiego przykładu.
libxml-parse-html-region
robi to oczywiście, ale może zrobić więcej, niż chcesz, ponieważ analizuje również tagi HTML… (I chyba nie wszystkie Emacsy są zbudowane z obsługą LibXML, jak sądzę).Odpowiedzi:
Emacs zawiera analizator składający się wyłącznie z Elisp XML
xml.el
, któregoxml-parse-string
funkcja wykonuje to zadanie, choć wygląda trochę jak nieudokumentowana funkcja wewnętrzna. Nie jestem pewien, czy istnieją jakieś jednostki tylko HTML, które nie będą poprawnie obsługiwane przez traktowanie łańcucha jako fragmentu XML.Ta funkcja otoki po prostu pominie wszystkie końcowe tagi w ciągu wejściowym, chociaż możesz to zaostrzyć:
W Emacsie z obsługą LibXML, innym nieco hackerskim sposobem byłoby napisanie otoki
libxml-html-parse-region
. Ponieważ parser LibXML zakłada, że jego argument jest kompletnym dokumentem HTML, funkcja opakowania musi wyodrębnić przeanalizowane dane znakowe ze struktury zwróconego dokumentu, używającpcase
. Próba odkodowania ciągu zawierającego dowolne tagi HTML spowoduje błąd:Wyniki:
Odkodowanie fragmentu dokumentu przez parsowanie go jako kompletnego dokumentu wydaje się trochę wstecz, tylko po to, aby natychmiast usunąć otaczające znaczniki. Z drugiej strony, używanie LibXML powinno być szybkie i dawać dokładne wyniki.
źródło
xml.el
rozwiązanie.lisp/xml.el
która zawsze zawierała funkcjęxml-substitute-special
, która wykonuje to samo dekodowanie bytu, co Jon O.'sdecode-entities
. Nie pomija jednak tagów końcowych.web-mode.el
robi to zweb-mode-dom-entities-replace
.źródło