2009-10-27 3 views
4

Некоторые интернет-сайты, как кодировать весь свой текст через HTML сущностей, поэтому вместо того, чтобы видеть текст какДекодирование HTML сущности в Emacs/Elisp

So I'm looking 

Вы получаете что-то вроде:

So I'm looking  

Мне было интересно, есть ли встроенный способ перевести закодированный текст в обычный текст с помощью любых встроенных модулей Emacsили если я должен объявить свою карту строк («& 83» => «S» ...) и вручную декодировать он использует карта.

Любые указатели были бы весьма благодарны.

+2

BTW: Это НЕ объекты HTML, но юникодные сущности - это разные. См. Http://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references#Character_reference_overview – ty812

ответ

0

Не знаю, если есть встроенная функция, но эта маленькая функция может сделать работу:

(defun my-insert-encode-entities-string (str) 
    (mapconcat 
    (lambda (char) (format "&#%d;" char)) 
    (string-to-list str) 
    "")) 

Если вы только хотите кодировать HTML-объекты, использовать url-insert-entities-in-string вместо этого.

+0

Функция неверна, так как вы не хотите форматировать как% d, вы хотите получить% d и форматировать ее как символ. –

+0

@Federico: Я не уверен, могу ли я увидеть вашу мысль. Вызов '(my-insert-encode-entities-string" So I'm looking ")' возвращает точно тот же результат, который вы указали. Переменная 'char' содержит текущий символ, представленный как целое число, поэтому в данном конкретном случае я думаю, что это неважно, использует ли'% s' или '% d'. –

+0

@ Török: Было немного недоразумений, как вы можете видеть в вопросе, который я искал «... встроенный способ перевода закодированного текста в обычный текст». Ваше решение конвертирует обычный в закодированный текст :) Я написал этот http://gist.github.com/222709, чтобы исправить это, но это явно не так чисто, как ваше первоначальное предложение. –

2

Я написал эту функцию, чтобы иметь дело с нечисловыми юникодными сущностями, если кому-то понадобится.

(defun html-entities-to-unicode (string) 
    (let* ((plist '(Aacute "Á" aacute "á" Acirc "Â" acirc "â" acute "´" AElig "Æ" aelig "æ" Agrave "À" agrave "à" alefsym "ℵ" Alpha "Α" alpha "α" amp "&" and "∧" ang "∠" apos "'" aring "å" Aring "Å" asymp "≈" atilde "ã" Atilde "Ã" auml "ä" Auml "Ä" bdquo "„" Beta "Β" beta "β" brvbar "¦" bull "•" cap "∩" ccedil "ç" Ccedil "Ç" cedil "¸" cent "¢" Chi "Χ" chi "χ" circ "ˆ" clubs "♣" cong "≅" copy "©" crarr "↵" cup "∪" curren "¤" Dagger "‡" dagger "†" darr "↓" dArr "⇓" deg "°" Delta "Δ" delta "δ" diams "♦" divide "÷" eacute "é" Eacute "É" ecirc "ê" Ecirc "Ê" egrave "è" Egrave "È" empty "∅" emsp " " ensp " " Epsilon "Ε" epsilon "ε" equiv "≡" Eta "Η" eta "η" eth "ð" ETH "Ð" euml "ë" Euml "Ë" euro "€" exist "∃" fnof "ƒ" forall "∀" frac12 "½" frac14 "¼" frac34 "¾" frasl "⁄" Gamma "Γ" gamma "γ" ge "≥" gt ">" harr "↔" hArr "⇔" hearts "♥" hellip "…" iacute "í" Iacute "Í" icirc "î" Icirc "Î" iexcl "¡" igrave "ì" Igrave "Ì" image "ℑ" infin "∞" int "∫" Iota "Ι" iota "ι" iquest "¿" isin "∈" iuml "ï" Iuml "Ï" Kappa "Κ" kappa "κ" Lambda "Λ" lambda "λ" lang "〈" laquo "«" larr "←" lArr "⇐" lceil "⌈" ldquo "“" le "≤" lfloor "⌊" lowast "∗" loz "◊" lrm "" lsaquo "‹" lsquo "‘" lt "<" macr "¯" mdash "—" micro "µ" middot "·" minus "−" Mu "Μ" mu "μ" nabla "∇" nbsp "" ndash "–" ne "≠" ni "∋" not "¬" notin "∉" nsub "⊄" ntilde "ñ" Ntilde "Ñ" Nu "Ν" nu "ν" oacute "ó" Oacute "Ó" ocirc "ô" Ocirc "Ô" OElig "Œ" oelig "œ" ograve "ò" Ograve "Ò" oline "‾" omega "ω" Omega "Ω" Omicron "Ο" omicron "ο" oplus "⊕" or "∨" ordf "ª" ordm "º" oslash "ø" Oslash "Ø" otilde "õ" Otilde "Õ" otimes "⊗" ouml "ö" Ouml "Ö" para "¶" part "∂" permil "‰" perp "⊥" Phi "Φ" phi "φ" Pi "Π" pi "π" piv "ϖ" plusmn "±" pound "£" Prime "″" prime "′" prod "∏" prop "∝" Psi "Ψ" psi "ψ" quot "\"" radic "√" rang "〉" raquo "»" rarr "→" rArr "⇒" rceil "⌉" rdquo "”" real "ℜ" reg "®" rfloor "⌋" Rho "Ρ" rho "ρ" rlm "" rsaquo "›" rsquo "’" sbquo "‚" scaron "š" Scaron "Š" sdot "⋅" sect "§" shy "" Sigma "Σ" sigma "σ" sigmaf "ς" sim "∼" spades "♠" sub "⊂" sube "⊆" sum "∑" sup "⊃" sup1 "¹" sup2 "²" sup3 "³" supe "⊇" szlig "ß" Tau "Τ" tau "τ" there4 "∴" Theta "Θ" theta "θ" thetasym "ϑ" thinsp " " thorn "þ" THORN "Þ" tilde "˜" times "×" trade "™" uacute "ú" Uacute "Ú" uarr "↑" uArr "⇑" ucirc "û" Ucirc "Û" ugrave "ù" Ugrave "Ù" uml "¨" upsih "ϒ" Upsilon "Υ" upsilon "υ" uuml "ü" Uuml "Ü" weierp "℘" Xi "Ξ" xi "ξ" yacute "ý" Yacute "Ý" yen "¥" yuml "ÿ" Yuml "Ÿ" Zeta "Ζ" zeta "ζ" zwj "" zwnj "")) 
     (get-function (lambda (s) (or (plist-get plist (intern (substring s 1 -1))) s)))) 
    (replace-regexp-in-string "&[^; ]*;" get-function string))) 
1

Я написал следующее, которое делает то, что вам нужно, @ federico-builes. (Мне нужно было то же самое.)

(defun ajs-decimal-escapes-to-unicode (start end) 
    "Convert escapes like '&#955;' to Unicode like 'λ'. 
Operates on the active region or the whole buffer." 
    (interactive (list (point) (mark))) 
    (or (use-region-p) 
     (setq start (point-min) end (point-max))) 
    (insert (replace-regexp-in-string 
      "&#[0-9]*;" 
      (lambda (match) 
      (format "%c" (string-to-number (substring match 2 -1)))) 
      (filter-buffer-substring start end t)))) 

@ Отзыв konr был полезен - спасибо! Я также наслаждаюсь An Introduction to Programming in Emacs Lisp. Это первый Lisp, который я написал, который может быть полезен. Я был бы признателен за отзывы, даже за такие вещи, как пробелы; благодаря!

Смежные вопросы