Недавно я столкнулся с проблемой декодирования HTML-объектов. У меня есть следующие две строки ( обратите внимание, как используются два метода кодирования, именованные и пронумерованные ).
The old "how to fold xml" question
Babel doesn't wrap results in verbatim
И мне нужно преобразовать их в
The old "how to fold xml" question
Babel doesn't wrap results in verbatim
Осматривая, я нашел этот старый вопрос о SO (что я сейчас и делаю), но я отказываюсь верить, что Emacs не имеет встроенного способа сделать это. У нас есть несколько веб-браузеров, по крайней мере два из которых, я знаю, являются встроенными, не говоря уже о почтовых клиентах и читателях каналов.
Разве нет встроенного способа декодирования html-сущностей?
Я ищу функцию, которая берет строку из первого примера и возвращает строку из второго примера.
libxml-parse-html-region
делает это, конечно, но он может делать больше, чем вы хотите, в том смысле, что он также анализирует HTML-теги… (И я полагаю, что не все Emacs построены с поддержкой LibXML).Ответы:
Emacs включает в себя синтаксический анализатор XML с чистым Elisp
xml.el
, чьяxml-parse-string
функция выполняет свою работу, хотя это выглядит как недокументированная внутренняя функция. Я не уверен, есть ли какие-либо объекты только для HTML, которые не будут должным образом обработаны, рассматривая строку как фрагмент XML.Эта функция-обертка просто пропустит любые конечные теги из входной строки, хотя вы можете сделать ее более строгой:
В Emacs с поддержкой LibXML, другой слегка хакерский способ - написать обертку
libxml-html-parse-region
. Так как синтаксический анализатор LibXML предполагает, что его аргумент является полным документом HTML, функция-обертка должна извлекать проанализированные символьные данные из возвращенной структуры документа, используяpcase
. Попытка декодировать строку, содержащую какие-либо теги HTML, приведет к ошибке:Результаты:
Кажется немного отсталым декодировать фрагмент документа, анализируя его как законченный документ, только чтобы сразу удалить лишние теги. С другой стороны, использование LibXML должно быть быстрым и давать точные результаты.
источник
xml.el
сначала поставить более простое решение.lisp/xml.el
всегда включали в себя функциюxml-substitute-special
, которая выполняет ту же сущность декодирования , как Джон О. - хdecode-entities
. Однако он не пропускает конечные теги.web-mode.el
делает это сweb-mode-dom-entities-replace
.источник