mm-util.el (mm-ucs-to-char): Use eval-and-compile.
[gnus] / lisp / mm-util.el
index 2be5667..c07d0bf 100644 (file)
@@ -24,7 +24,7 @@
 
 ;;; Code:
 
-;; For Emacs < 22.2.
+;; For Emacs <22.2 and XEmacs.
 (eval-and-compile
   (unless (fboundp 'declare-function) (defmacro declare-function (&rest r))))
 
     (require 'timer)))
 
 (defvar mm-mime-mule-charset-alist )
+;; Note this is not presently used on Emacs >= 23, which is good,
+;; since it means standalone message-mode (which requires mml and
+;; hence mml-util) does not load gnus-util.
+(autoload 'gnus-completing-read "gnus-util")
 
 ;; Emulate functions that are not available in every (X)Emacs version.
 ;; The name of a function is prefixed with mm-, like `mm-char-int' for
       . ,(lambda (prompt)
           "Return a charset."
           (intern
-           (completing-read
+           (gnus-completing-read
             prompt
-            (mapcar (lambda (e) (list (symbol-name (car e))))
+            (mapcar (lambda (e) (symbol-name (car e)))
                     mm-mime-mule-charset-alist)
-            nil t))))
+            t))))
      ;; `subst-char-in-string' is not available in XEmacs 21.4.
      (subst-char-in-string
       . ,(lambda (from to string &optional inplace)
@@ -202,19 +206,10 @@ to the contents of the accessible portion of the buffer."
     (defalias 'mm-decode-coding-region 'decode-coding-region)
     (defalias 'mm-encode-coding-region 'encode-coding-region)))
 
-;; `string-to-multibyte' is available only in Emacs 22.1 or greater.
-(defalias 'mm-string-to-multibyte
-  (cond
-   ((featurep 'xemacs)
-    'identity)
-   ((fboundp 'string-to-multibyte)
-    'string-to-multibyte)
-   (t
-    (lambda (string)
-      "Return a multibyte string with the same individual chars as STRING."
-      (mapconcat
-       (lambda (ch) (mm-string-as-multibyte (char-to-string ch)))
-       string "")))))
+;; `string-to-multibyte' is available only in Emacs.
+(defalias 'mm-string-to-multibyte (if (featurep 'xemacs)
+                                     'identity
+                                   'string-to-multibyte))
 
 ;; `char-or-char-int-p' is an XEmacs function, not available in Emacs.
 (eval-and-compile
@@ -225,42 +220,43 @@ to the contents of the accessible portion of the buffer."
      (t 'identity))))
 
 ;; `ucs-to-char' is a function that Mule-UCS provides.
-(if (featurep 'xemacs)
-    (cond ((and (fboundp 'unicode-to-char) ;; XEmacs 21.5.
-               (subrp (symbol-function 'unicode-to-char)))
-          (if (featurep 'mule)
-              (defalias 'mm-ucs-to-char 'unicode-to-char)
+(eval-and-compile
+  (if (featurep 'xemacs)
+      (cond ((and (fboundp 'unicode-to-char) ;; XEmacs 21.5.
+                 (subrp (symbol-function 'unicode-to-char)))
+            (if (featurep 'mule)
+                (defalias 'mm-ucs-to-char 'unicode-to-char)
+              (defun mm-ucs-to-char (codepoint)
+                "Convert Unicode codepoint to character."
+                (or (unicode-to-char codepoint) ?#))))
+           ((featurep 'mule)
+            (defun mm-ucs-to-char (codepoint)
+              "Convert Unicode codepoint to character."
+              (if (fboundp 'ucs-to-char) ;; Mule-UCS is loaded.
+                  (progn
+                    (defalias 'mm-ucs-to-char
+                      (lambda (codepoint)
+                        "Convert Unicode codepoint to character."
+                        (condition-case nil
+                            (or (ucs-to-char codepoint) ?#)
+                          (error ?#))))
+                    (mm-ucs-to-char codepoint))
+                (condition-case nil
+                    (or (int-to-char codepoint) ?#)
+                  (error ?#)))))
+           (t
             (defun mm-ucs-to-char (codepoint)
               "Convert Unicode codepoint to character."
-              (or (unicode-to-char codepoint) ?#))))
-         ((featurep 'mule)
-          (defun mm-ucs-to-char (codepoint)
-            "Convert Unicode codepoint to character."
-            (if (fboundp 'ucs-to-char) ;; Mule-UCS is loaded.
-                (progn
-                  (defalias 'mm-ucs-to-char
-                    (lambda (codepoint)
-                      "Convert Unicode codepoint to character."
-                      (condition-case nil
-                          (or (ucs-to-char codepoint) ?#)
-                        (error ?#))))
-                  (mm-ucs-to-char codepoint))
               (condition-case nil
                   (or (int-to-char codepoint) ?#)
                 (error ?#)))))
-         (t
-          (defun mm-ucs-to-char (codepoint)
-            "Convert Unicode codepoint to character."
-            (condition-case nil
-                (or (int-to-char codepoint) ?#)
-              (error ?#)))))
-  (if (let ((char (make-char 'japanese-jisx0208 36 34)))
-       (eq char (decode-char 'ucs char)))
-      ;; Emacs 23.
-      (defalias 'mm-ucs-to-char 'identity)
-    (defun mm-ucs-to-char (codepoint)
-      "Convert Unicode codepoint to character."
-      (or (decode-char 'ucs codepoint) ?#))))
+    (if (let ((char (make-char 'japanese-jisx0208 36 34)))
+         (eq char (decode-char 'ucs char)))
+       ;; Emacs 23.
+       (defalias 'mm-ucs-to-char 'identity)
+      (defun mm-ucs-to-char (codepoint)
+       "Convert Unicode codepoint to character."
+       (or (decode-char 'ucs codepoint) ?#)))))
 
 ;; Fixme:  This seems always to be used to read a MIME charset, so it
 ;; should be re-named and fixed (in Emacs) to offer completion only on
@@ -272,18 +268,19 @@ to the contents of the accessible portion of the buffer."
 ;; Actually, there should be an `mm-coding-system-mime-charset'.
 (eval-and-compile
   (defalias 'mm-read-coding-system
-    (cond
-     ((fboundp 'read-coding-system)
-      (if (and (featurep 'xemacs)
-              (<= (string-to-number emacs-version) 21.1))
-         (lambda (prompt &optional default-coding-system)
-           (read-coding-system prompt))
-       'read-coding-system))
-     (t (lambda (prompt &optional default-coding-system)
-         "Prompt the user for a coding system."
-         (completing-read
-          prompt (mapcar (lambda (s) (list (symbol-name (car s))))
-                         mm-mime-mule-charset-alist)))))))
+    (if (featurep 'emacs) 'read-coding-system
+      (cond
+       ((fboundp 'read-coding-system)
+       (if (and (featurep 'xemacs)
+                (<= (string-to-number emacs-version) 21.1))
+           (lambda (prompt &optional default-coding-system)
+             (read-coding-system prompt))
+         'read-coding-system))
+       (t (lambda (prompt &optional default-coding-system)
+           "Prompt the user for a coding system."
+           (gnus-completing-read
+            prompt (mapcar (lambda (s) (symbol-name (car s)))
+                           mm-mime-mule-charset-alist))))))))
 
 (defvar mm-coding-system-list nil)
 (defun mm-get-coding-system-list ()
@@ -316,8 +313,8 @@ the alias.  Else windows-NUMBER is used."
                         (cp-supported-codepages)
                       ;; Removed in Emacs 23 (unicode), so signal an error:
                       (error "`codepage-setup' not present in this Emacs version"))))
-     (list (completing-read "Setup DOS Codepage: (default 437) " candidates
-                           nil t nil nil "437"))))
+     (list (gnus-completing-read "Setup DOS Codepage" candidates
+                                 t nil nil "437"))))
   (when alias
     (setq alias (if (stringp alias)
                    (intern alias)
@@ -383,8 +380,7 @@ See `mm-codepage-iso-8859-list' and `mm-codepage-ibm-list'.")
 (defcustom mm-codepage-iso-8859-list
   (list 1250 ;; Windows-1250 is a variant of Latin-2 heavily used by Microsoft
        ;; Outlook users in Czech republic.  Use this to allow reading of
-       ;; their e-mails.  cp1250 should be defined by M-x codepage-setup
-       ;; (Emacs 21).
+       ;; their e-mails.
        '(1252 . 1) ;; Windows-1252 is a superset of iso-8859-1 (West
                    ;; Europe).  See also `gnus-article-dumbquotes-map'.
        '(1254 . 9) ;; Windows-1254 is a superset of iso-8859-9 (Turkish).
@@ -494,8 +490,8 @@ Unless LIST is given, `mm-codepage-ibm-list' is used."
 (defcustom mm-charset-eval-alist
   (if (featurep 'xemacs)
       nil ;; I don't know what would be useful for XEmacs.
-    '(;; Emacs 21 offers 1250 1251 1253 1257.  Emacs 22 provides autoloads for
-      ;; 1250-1258 (i.e. `mm-codepage-setup' does nothing).
+    '(;; Emacs 22 provides autoloads for 1250-1258
+      ;; (i.e. `mm-codepage-setup' does nothing).
       (windows-1250 . (mm-codepage-setup 1250 t))
       (windows-1251 . (mm-codepage-setup 1251 t))
       (windows-1253 . (mm-codepage-setup 1253 t))
@@ -871,6 +867,21 @@ variable is set, it overrides the default priority."
 Setting it to nil is useful on Emacsen supporting Unicode if sending
 mail with multiple parts is preferred to sending a Unicode one.")
 
+(defvar mm-extra-numeric-entities
+  (mapcar
+   (lambda (item)
+     (cons (car item) (mm-ucs-to-char (cdr item))))
+   '((#x80 . #x20AC) (#x82 . #x201A) (#x83 . #x0192) (#x84 . #x201E)
+     (#x85 . #x2026) (#x86 . #x2020) (#x87 . #x2021) (#x88 . #x02C6)
+     (#x89 . #x2030) (#x8A . #x0160) (#x8B . #x2039) (#x8C . #x0152)
+     (#x8E . #x017D) (#x91 . #x2018) (#x92 . #x2019) (#x93 . #x201C)
+     (#x94 . #x201D) (#x95 . #x2022) (#x96 . #x2013) (#x97 . #x2014)
+     (#x98 . #x02DC) (#x99 . #x2122) (#x9A . #x0161) (#x9B . #x203A)
+     (#x9C . #x0153) (#x9E . #x017E) (#x9F . #x0178)))
+  "*Alist of extra numeric entities and characters other than ISO 10646.
+This table is used for decoding extra numeric entities to characters,
+like \"&#128;\" to the euro sign, mainly in html messages.")
+
 ;;; Internal variables:
 
 ;;; Functions:
@@ -908,7 +919,7 @@ mail with multiple parts is preferred to sending a Unicode one.")
       "Set the multibyte flag of the current buffer.
 Only do this if the default value of `enable-multibyte-characters' is
 non-nil.  This is a no-op in XEmacs."
-      (set-buffer-multibyte t)))
+      (set-buffer-multibyte 'to)))
 
   (if (featurep 'xemacs)
       (defalias 'mm-disable-multibyte 'ignore)
@@ -966,7 +977,6 @@ If the charset is `composition', return the actual one."
   (if (eq charset 'unknown)
       (error "The message contains non-printable characters, please use attachment"))
   (if (and (fboundp 'coding-system-get) (fboundp 'get-charset-property))
-      ;; This exists in Emacs 20.
       (or
        (and (mm-preferred-coding-system charset)
            (or (coding-system-get
@@ -980,6 +990,7 @@ If the charset is `composition', return the actual one."
     ;; This is for XEmacs.
     (mm-mule-charset-to-mime-charset charset)))
 
+;; `delete-dups' is not available in XEmacs 21.4.
 (if (fboundp 'delete-dups)
     (defalias 'mm-delete-duplicates 'delete-dups)
   (defun mm-delete-duplicates (list)
@@ -1429,16 +1440,23 @@ If SUFFIX is non-nil, add that at the end of the file name."
        ;; Reset the umask.
        (set-default-file-modes umask)))))
 
+(defvar mm-image-load-path-cache nil)
+
 (defun mm-image-load-path (&optional package)
-  (let (dir result)
-    (dolist (path load-path (nreverse result))
-      (when (and path
-                (file-directory-p
-                 (setq dir (concat (file-name-directory
-                                    (directory-file-name path))
-                                   "etc/images/" (or package "gnus/")))))
-       (push dir result))
-      (push path result))))
+  (if (and mm-image-load-path-cache
+          (equal load-path (car mm-image-load-path-cache)))
+      (cdr mm-image-load-path-cache)
+    (let (dir result)
+      (dolist (path load-path)
+       (when (and path
+                  (file-directory-p
+                   (setq dir (concat (file-name-directory
+                                      (directory-file-name path))
+                                     "etc/images/" (or package "gnus/")))))
+         (push dir result)))
+      (setq result (nreverse result)
+           mm-image-load-path-cache (cons load-path result))
+      result)))
 
 ;; Fixme: This doesn't look useful where it's used.
 (if (fboundp 'detect-coding-region)
@@ -1532,14 +1550,13 @@ decompressed data.  The buffer's multibyteness must be turned off."
                                       prog t (list t err-file) nil args)
                                jka-compr-acceptable-retval-list)
                    (erase-buffer)
-                   (insert (mapconcat
-                            'identity
-                            (delete "" (split-string
-                                        (prog2
-                                            (insert-file-contents err-file)
-                                            (buffer-string)
-                                          (erase-buffer))))
-                            " ")
+                   (insert (mapconcat 'identity
+                                      (split-string
+                                       (prog2
+                                           (insert-file-contents err-file)
+                                           (buffer-string)
+                                         (erase-buffer)) t)
+                                      " ")
                            "\n")
                    (setq err-msg
                          (format "Error while executing \"%s %s < %s\""
@@ -1653,5 +1670,4 @@ gzip, bzip2, etc. are allowed."
 
 (provide 'mm-util)
 
-;; arch-tag: 94dc5388-825d-4fd1-bfa5-2100aa351238
 ;;; mm-util.el ends here