mm-util.el (mm-extra-numeric-entities): New variable.
[gnus] / lisp / mm-decode.el
index bd9e704..216ed66 100644 (file)
@@ -1699,7 +1699,7 @@ If RECURSIVE, search recursively."
                                  (when handle
                                    (mm-with-part handle
                                      (buffer-string))))))
-       shr-inhibit-images shr-blocked-images charset)
+       shr-inhibit-images shr-blocked-images charset char)
     (if (and (boundp 'gnus-summary-buffer)
             (buffer-name gnus-summary-buffer))
        (with-current-buffer gnus-summary-buffer
@@ -1714,13 +1714,25 @@ If RECURSIVE, search recursively."
       (narrow-to-region (point) (point))
       (shr-insert-document
        (mm-with-part handle
-        (when (and charset
-                   (setq charset (mm-charset-to-coding-system charset))
-                   (not (eq charset 'ascii)))
-          (insert (prog1
-                      (mm-decode-coding-string (buffer-string) charset)
-                    (erase-buffer)
-                    (mm-enable-multibyte))))
+        (insert (prog1
+                    (if (and charset
+                             (setq charset
+                                   (mm-charset-to-coding-system charset))
+                             (not (eq charset 'ascii)))
+                        (mm-decode-coding-string (buffer-string) charset)
+                      (mm-string-as-multibyte (buffer-string)))
+                  (erase-buffer)
+                  (mm-enable-multibyte)))
+        (goto-char (point-min))
+        (setq case-fold-search t)
+        (while (re-search-forward
+                "&#\\(?:x\\([89][0-9a-f]\\)\\|\\(1[2-5][0-9]\\)\\);" nil t)
+          (when (setq char
+                      (cdr (assq (if (match-beginning 1)
+                                     (string-to-number (match-string 1) 16)
+                                   (string-to-number (match-string 2)))
+                                 mm-extra-numeric-entities)))
+            (replace-match (char-to-string char))))
         (libxml-parse-html-region (point-min) (point-max))))
       (mm-handle-set-undisplayer
        handle