comparison lisp/gnus/mm-util.el @ 92153:37d6263f580b

Revert removal of `mm-hack-charsets' in Gnus Revision: emacs@sv.gnu.org/emacs--devo--0--patch-1076
author Miles Bader <miles@gnu.org>
date Sun, 24 Feb 2008 15:23:45 +0000
parents 89610dccd10a
children e931cb410f95
comparison
equal deleted inserted replaced
92152:2c181d4110e5 92153:37d6263f580b
574 (coding-system-get cs 'safe-charsets)))) 574 (coding-system-get cs 'safe-charsets))))
575 (not (assq mime alist))) 575 (not (assq mime alist)))
576 (push (cons mime (delq 'ascii mule)) alist))) 576 (push (cons mime (delq 'ascii mule)) alist)))
577 (setq mm-mime-mule-charset-alist (nreverse alist))))) 577 (setq mm-mime-mule-charset-alist (nreverse alist)))))
578 578
579 (defvar mm-hack-charsets '(iso-8859-15 iso-2022-jp-2)
580 "A list of special charsets.
581 Valid elements include:
582 `iso-8859-15' convert ISO-8859-1, -9 to ISO-8859-15 if ISO-8859-15 exists.
583 `iso-2022-jp-2' convert ISO-2022-jp to ISO-2022-jp-2 if ISO-2022-jp-2 exists."
584 )
585
586 (defvar mm-iso-8859-15-compatible
587 '((iso-8859-1 "\xA4\xA6\xA8\xB4\xB8\xBC\xBD\xBE")
588 (iso-8859-9 "\xA4\xA6\xA8\xB4\xB8\xBC\xBD\xBE\xD0\xDD\xDE\xF0\xFD\xFE"))
589 "ISO-8859-15 exchangeable coding systems and inconvertible characters.")
590
591 (defvar mm-iso-8859-x-to-15-table
592 (and (fboundp 'coding-system-p)
593 (mm-coding-system-p 'iso-8859-15)
594 (mapcar
595 (lambda (cs)
596 (if (mm-coding-system-p (car cs))
597 (let ((c (string-to-char
598 (decode-coding-string "\341" (car cs)))))
599 (cons (char-charset c)
600 (cons
601 (- (string-to-char
602 (decode-coding-string "\341" 'iso-8859-15)) c)
603 (string-to-list (decode-coding-string (car (cdr cs))
604 (car cs))))))
605 '(gnus-charset 0)))
606 mm-iso-8859-15-compatible))
607 "A table of the difference character between ISO-8859-X and ISO-8859-15.")
608
579 (defcustom mm-coding-system-priorities 609 (defcustom mm-coding-system-priorities
580 (if (boundp 'current-language-environment) 610 (if (boundp 'current-language-environment)
581 (let ((lang (symbol-value 'current-language-environment))) 611 (let ((lang (symbol-value 'current-language-environment)))
582 (cond ((string= lang "Japanese") 612 (cond ((string= lang "Japanese")
583 ;; Japanese users prefer iso-2022-jp to euc-japan or 613 ;; Japanese users prefer iso-2022-jp to euc-japan or
827 (if (featurep 'mule) 857 (if (featurep 'mule)
828 (if (boundp 'default-enable-multibyte-characters) 858 (if (boundp 'default-enable-multibyte-characters)
829 default-enable-multibyte-characters 859 default-enable-multibyte-characters
830 t))) 860 t)))
831 861
862 (defun mm-iso-8859-x-to-15-region (&optional b e)
863 (if (fboundp 'char-charset)
864 (let (charset item c inconvertible)
865 (save-restriction
866 (if e (narrow-to-region b e))
867 (goto-char (point-min))
868 (skip-chars-forward "\0-\177")
869 (while (not (eobp))
870 (cond
871 ((not (setq item (assq (char-charset (setq c (char-after)))
872 mm-iso-8859-x-to-15-table)))
873 (forward-char))
874 ((memq c (cdr (cdr item)))
875 (setq inconvertible t)
876 (forward-char))
877 (t
878 (insert-before-markers (prog1 (+ c (car (cdr item)))
879 (delete-char 1)))))
880 (skip-chars-forward "\0-\177")))
881 (not inconvertible))))
882
832 (defun mm-sort-coding-systems-predicate (a b) 883 (defun mm-sort-coding-systems-predicate (a b)
833 (let ((priorities 884 (let ((priorities
834 (mapcar (lambda (cs) 885 (mapcar (lambda (cs)
835 ;; Note: invalid entries are dropped silently 886 ;; Note: invalid entries are dropped silently
836 (and (setq cs (mm-coding-system-p cs)) 887 (and (setq cs (mm-coding-system-p cs))
974 (setq charsets 1025 (setq charsets
975 (mm-delete-duplicates 1026 (mm-delete-duplicates
976 (mapcar 'mm-mime-charset 1027 (mapcar 'mm-mime-charset
977 (delq 'ascii 1028 (delq 'ascii
978 (mm-find-charset-region b e)))))) 1029 (mm-find-charset-region b e))))))
1030 (if (and (> (length charsets) 1)
1031 (memq 'iso-8859-15 charsets)
1032 (memq 'iso-8859-15 hack-charsets)
1033 (save-excursion (mm-iso-8859-x-to-15-region b e)))
1034 (dolist (x mm-iso-8859-15-compatible)
1035 (setq charsets (delq (car x) charsets))))
1036 (if (and (memq 'iso-2022-jp-2 charsets)
1037 (memq 'iso-2022-jp-2 hack-charsets))
1038 (setq charsets (delq 'iso-2022-jp charsets)))
1039 ;; Attempt to reduce the number of charsets if utf-8 is available.
1040 (if (and (featurep 'xemacs)
1041 (> (length charsets) 1)
1042 (mm-coding-system-p 'utf-8))
1043 (let ((mm-coding-system-priorities
1044 (cons 'utf-8 mm-coding-system-priorities)))
1045 (setq charsets
1046 (mm-delete-duplicates
1047 (mapcar 'mm-mime-charset
1048 (delq 'ascii
1049 (mm-find-charset-region b e)))))))
979 charsets)) 1050 charsets))
980 1051
981 (defmacro mm-with-unibyte-buffer (&rest forms) 1052 (defmacro mm-with-unibyte-buffer (&rest forms)
982 "Create a temporary buffer, and evaluate FORMS there like `progn'. 1053 "Create a temporary buffer, and evaluate FORMS there like `progn'.
983 Use unibyte mode for this." 1054 Use unibyte mode for this."