2

I must be overlooking something obvious, but I can't find a way to encode a string/region into HTML, for example "Hölle" to "Hölle". Is there anything in emacs or web-mode or any other plugin that can do that?

2
  • 2
    Not answering the question: it is only mandatory to encode &, >, < and " (it is even possible to leave & and > as is some times). All other HTML entities are only needed if you use single-byte encoding. So, if your goal is to simply have these characters in HTML, it's better to encode HTML using Unicode encoding (such as UTF-8).
    – wvxvw
    Commented Feb 12, 2015 at 6:31
  • Is there a reason to encode things this way? It makes the source hard to search.
    – Clément
    Commented Feb 3, 2016 at 19:14

2 Answers 2

1

This solution is amazingly ugly, but as far as I can tell, it works. Call it on the active region.

(defun my-replace-symbols-with-entity-names (start end)
  (interactive "r")
  (let ((count (count-matches "&")))
    (replace-string "&" "&amp;" nil start end)
    (setq end (+ end (* count 4))))
  (dolist (pair web-mode-html-entities)
    (unless (= (cdr pair) 38)
      (let* ((str (char-to-string (cdr pair)))
              (count (count-matches str start end)))
        (setq end (+ end (* count (1+ (length (car pair))))))
        (replace-string str
          (concat "&" (car pair) ";")
          nil start end)))))

Unfortunately, this is limited to web-mode's list of entities (web-mode-html-entities), which only contains 41 entities! (And does not seem to include accented characters).

You can easily add to this list yourself. Here is a list of all printable HTML entities that are named:

(setq web-mode-html-entities
  '(("quot" . 34)
     ("amp" . 38)
     ("apos" . 39)
     ("lt" . 60)
     ("gt" . 62)
     ("nbsp" . 160)
     ("iexcl" . 161)
     ("cent" . 162)
     ("pound" . 163)
     ("curren" . 164)
     ("yen" . 165)
     ("brvbar" . 166)
     ("sect" . 167)
     ("uml" . 168)
     ("copy" . 169)
     ("ordf" . 170)
     ("laquo" . 171)
     ("not" . 172)
     ("shy" . 173)
     ("reg" . 174)
     ("macr" . 175)
     ("deg" . 176)
     ("plusmn" . 177)
     ("sup2" . 178)
     ("sup3" . 179)
     ("acute" . 180)
     ("micro" . 181)
     ("para" . 182)
     ("middot" . 183)
     ("cedil" . 184)
     ("sup1" . 185)
     ("ordm" . 186)
     ("raquo" . 187)
     ("frac14" . 188)
     ("frac12" . 189)
     ("frac34" . 190)
     ("iquest" . 191)
     ("Agrave" . 192)
     ("Aacute" . 193)
     ("Acirc" . 194)
     ("Atilde" . 195)
     ("Auml" . 196)
     ("Aring" . 197)
     ("AElig" . 198)
     ("Ccedil" . 199)
     ("Egrave" . 200)
     ("Eacute" . 201)
     ("Ecirc" . 202)
     ("Euml" . 203)
     ("Igrave" . 204)
     ("Iacute" . 205)
     ("Icirc" . 206)
     ("Iuml" . 207)
     ("ETH" . 208)
     ("Ntilde" . 209)
     ("Ograve" . 210)
     ("Oacute" . 211)
     ("Ocirc" . 212)
     ("Otilde" . 213)
     ("Ouml" . 214)
     ("times" . 215)
     ("Oslash" . 216)
     ("Ugrave" . 217)
     ("Uacute" . 218)
     ("Ucirc" . 219)
     ("Uuml" . 220)
     ("Yacute" . 221)
     ("THORN" . 222)
     ("szlig" . 223)
     ("agrave" . 224)
     ("aacute" . 225)
     ("acirc" . 226)
     ("atilde" . 227)
     ("auml" . 228)
     ("aring" . 229)
     ("aelig" . 230)
     ("ccedil" . 231)
     ("egrave" . 232)
     ("eacute" . 233)
     ("ecirc" . 234)
     ("euml" . 235)
     ("igrave" . 236)
     ("iacute" . 237)
     ("icirc" . 238)
     ("iuml" . 239)
     ("eth" . 240)
     ("ntilde" . 241)
     ("ograve" . 242)
     ("oacute" . 243)
     ("ocirc" . 244)
     ("otilde" . 245)
     ("ouml" . 246)
     ("divide" . 247)
     ("oslash" . 248)
     ("Ugrave" . 249)
     ("Uacute" . 250)
     ("Ucirc" . 251)
     ("Uuml" . 252)
     ("yacute" . 253)
     ("thorn" . 254)
     ("yuml" . 255)
     ("OElig" . 338)
     ("oelig" . 339)
     ("Scaron" . 352)
     ("scaron" . 353)
     ("Yuml" . 376)
     ("fnof" . 402)
     ("circ" . 710)
     ("tilde" . 732)
     ("Alpha" . 913)
     ("Beta" . 914)
     ("Gamma" . 915)
     ("Delta" . 916)
     ("Epsilon" . 917)
     ("Zeta" . 918)
     ("Eta" . 919)
     ("Theta" . 920)
     ("Iota" . 921)
     ("Kappa" . 922)
     ("Lambda" . 923)
     ("Mu" . 924)
     ("Nu" . 925)
     ("Xi" . 926)
     ("Omicron" . 927)
     ("Pi" . 928)
     ("Rho" . 929)
     ("Sigma" . 931)
     ("Tau" . 932)
     ("Upsilon" . 933)
     ("Phi" . 934)
     ("Chi" . 935)
     ("Psi" . 936)
     ("Omega" . 937)
     ("alpha" . 945)
     ("beta" . 946)
     ("gamma" . 947)
     ("delta" . 948)
     ("epsilon" . 949)
     ("zeta" . 950)
     ("eta" . 951)
     ("theta" . 952)
     ("iota" . 953)
     ("kappa" . 954)
     ("lambda" . 955)
     ("mu" . 956)
     ("nu" . 957)
     ("xi" . 958)
     ("omicron" . 959)
     ("pi" . 960)
     ("rho" . 961)
     ("sigmaf" . 962)
     ("sigma" . 963)
     ("tau" . 964)
     ("upsilon" . 965)
     ("phi" . 966)
     ("chi" . 967)
     ("psi" . 968)
     ("omega" . 969)
     ("thetasym" . 977)
     ("Upsih" . 978)
     ("piv" . 982)
     ("ensp" . 8194)
     ("emsp" . 8195)
     ("thinsp" . 8201)
     ("zwnj" . 8204)
     ("zwj" . 8205)
     ("lrm" . 8206)
     ("rlm" . 8207)
     ("ndash" . 8211)
     ("mdash" . 8212)
     ("lsquo" . 8216)
     ("rsquo" . 8217)
     ("sbquo" . 8218)
     ("ldquo" . 8220)
     ("rdquo" . 8221)
     ("bdquo" . 8222)
     ("dagger" . 8224)
     ("Dagger" . 8225)
     ("bull" . 8226)
     ("hellip" . 8230)
     ("permil" . 8240)
     ("prime" . 8242)
     ("Prime" . 8243)
     ("lsaquo" . 8249)
     ("rsaquo" . 8250)
     ("oline" . 8254)
     ("frasl" . 8260)
     ("euro" . 8364)
     ("image" . 8465)
     ("weierp" . 8472)
     ("real" . 8476)
     ("trade" . 8482)
     ("alefsym" . 8501)
     ("larr" . 8592)
     ("uarr" . 8593)
     ("rarr" . 8594)
     ("darr" . 8595)
     ("harr" . 8596)
     ("crarr" . 8629)
     ("lArr" . 8656)
     ("UArr" . 8657)
     ("rArr" . 8658)
     ("dArr" . 8659)
     ("hArr" . 8660)
     ("forall" . 8704)
     ("part" . 8706)
     ("exist" . 8707)
     ("empty" . 8709)
     ("nabla" . 8711)
     ("isin" . 8712)
     ("notin" . 8713)
     ("ni" . 8715)
     ("prod" . 8719)
     ("sum" . 8721)
     ("minus" . 8722)
     ("lowast" . 8727)
     ("radic" . 8730)
     ("prop" . 8733)
     ("infin" . 8734)
     ("ang" . 8736)
     ("and" . 8743)
     ("or" . 8744)
     ("cap" . 8745)
     ("cup" . 8746)
     ("int" . 8747)
     ("there4" . 8756)
     ("sim" . 8764)
     ("cong" . 8773)
     ("asymp" . 8776)
     ("ne" . 8800)
     ("equiv" . 8801)
     ("le" . 8804)
     ("ge" . 8805)
     ("sub" . 8834)
     ("sup" . 8835)
     ("nsub" . 8836)
     ("sube" . 8838)
     ("supe" . 8839)
     ("oplus" . 8853)
     ("otimes" . 8855)
     ("perp" . 8869)
     ("sdot" . 8901)
     ("lceil" . 8968)
     ("rceil" . 8969)
     ("lfloor" . 8970)
     ("rfloor" . 8971)
     ("lang" . 9001)
     ("rang" . 9002)
     ("loz" . 9674)
     ("spades" . 9824)
     ("clubs" . 9827)
     ("hearts" . 9829)
     ("diams" . 9830)))

Sorry about non-printable entities, I couldn't get my macros to format them correctly.

3
  • It would be great to submit these entities to web-mode's maintainers. Also see lisp/org/org-entities.el which is part of Emacs currently and has a much better list. It seems that this could be abstracted into a general list that all modes could use... Commented Feb 12, 2015 at 10:26
  • This is really cool! Thank you! How is something like this not part of standard emacs or at least something like web mode?!
    – Max
    Commented Feb 12, 2015 at 12:27
  • I would accept all the entities that web-mode users need. I really do not need to have "all" the entities
    – fxbois
    Commented Feb 12, 2015 at 13:46
2

I just use an external utility (recode) for that

(defun my-html-entity-encode (b e)
  (interactive "r")
  (call-process-region b e "recode" t t nil "..HTML_4.0"))

E.g. select a region, then M-x my-html-entity-encode Return.

1
  • In the same spirit, one could press C-u M-|, enter "recode ..HTML", and press RET. (C-u M-| calls shell-command-on-region and replaces the current region.) Commented Feb 3, 2016 at 17:01

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.