Saya baru-baru ini mengalami masalah decoding entitas html. Saya memiliki dua string berikut ( Perhatikan bagaimana dua metode pengkodean digunakan, dinamai dan diberi nomor ).
The old "how to fold xml" question
Babel doesn't wrap results in verbatim
Dan saya perlu mengubahnya menjadi
The old "how to fold xml" question
Babel doesn't wrap results in verbatim
Mencari-cari di sekitar, saya menemukan pertanyaan lama ini pada SO (yang adalah apa yang saya lakukan untuk saat ini), tetapi saya menolak untuk percaya Emacs tidak memiliki cara bawaan untuk melakukan ini. Kami memiliki beberapa browser web, setidaknya dua di antaranya saya tahu adalah built-in, belum lagi klien email dan pembaca feed.
Apakah tidak ada cara bawaan untuk mendekode entitas html?
Saya mencari fungsi yang mengambil string dari contoh pertama dan mengembalikan string dari contoh kedua.
libxml-parse-html-region
melakukan ini, tentu saja, tetapi mungkin melakukan lebih dari yang Anda inginkan, dalam hal itu mem-parsing tag HTML juga ... (Dan tidak semua Emacs dibangun dengan dukungan LibXML, kurasa).Jawaban:
Emacs menyertakan parser XML murni-Elisp
xml.el
, yangxml-parse-string
fungsinya melakukan pekerjaan, meskipun sepertinya sedikit seperti fungsi internal tidak berdokumen. Saya tidak yakin apakah ada entitas hanya HTML yang tidak akan ditangani dengan benar dengan memperlakukan string sebagai fragmen XML.Fungsi wrapper ini hanya akan menghilangkan tag tambahan dari string input, meskipun Anda bisa membuatnya lebih ketat:
Dalam Emacs dengan dukungan LibXML, cara lain yang sedikit meretas adalah dengan menulis pembungkus
libxml-html-parse-region
. Karena parser LibXML menganggap argumennya adalah dokumen HTML yang lengkap, fungsi wrapper harus mengekstrak data karakter parsing dari struktur dokumen yang dikembalikan, menggunakanpcase
. Mencoba memecahkan kode string yang berisi tag HTML apa pun akan menghasilkan kesalahan:Hasil:
Tampaknya sedikit terbelakang untuk memecahkan kode fragmen dokumen dengan menguraikannya sebagai dokumen yang lengkap, hanya untuk segera menghapus tag sekitarnya. Di sisi lain, menggunakan LibXML harus cepat dan memberikan hasil yang akurat.
sumber
xml.el
solusi yang lebih sederhana terlebih dahulu.lisp/xml.el
selalu disertakan fungsixml-substitute-special
, yang melakukan entitas yang sama decoding seperti Jon O. inidecode-entities
. Namun, itu tidak menghilangkan tag tambahan.web-mode.el
melakukan ini denganweb-mode-dom-entities-replace
.sumber