9f3b17749051cd728d76375a72c9e13613b17aec
[elisp/tm.git] / tm-mule.el
1 ;;;
2 ;;; $Id: tm-mule.el,v 5.0 1994/10/19 23:47:58 morioka Exp $
3 ;;;
4
5 (provide 'tm-mule)
6
7 (require 'tl-list)
8 (require 'tl-mule)
9
10 (if (not (fboundp 'member))
11     (require 'tl-18)
12   )
13
14 ;;; @ variables
15 ;;;
16
17 (defvar mime/lc-charset-and-encoding-alist
18   (list
19    (cons lc-ascii nil)
20    (cons lc-jp   '("ISO-2022-JP" . "B"))
21    (cons lc-cn   '("ISO-2022-CN" . "B"))
22    (cons lc-kr   '("ISO-2022-KR" . "B"))
23    (cons lc-ltn1 '("ISO-8859-1"  . "Q"))
24    (cons lc-ltn2 '("ISO-8859-2"  . "Q"))
25    (cons lc-ltn3 '("ISO-8859-3"  . "Q"))
26    (cons lc-ltn4 '("ISO-8859-4"  . "Q"))
27    (cons lc-crl  '("ISO-8859-5"  . "B"))
28    (cons lc-arb  '("ISO-8859-6"  . "B"))
29    (cons lc-grk  '("ISO-8859-7"  . "B"))
30    (cons lc-hbw  '("ISO-8859-8"  . "B"))
31    (cons lc-ltn5 '("ISO-8859-9"  . "Q"))
32    ))
33
34 (defvar mime/latin-lc-list
35   (list lc-ascii lc-ltn1 lc-ltn2 lc-ltn3 lc-ltn4 lc-ltn5))
36
37 (defvar mime/charset-coding-system-alist
38   '(("ISO-2022-JP"     . *iso-2022-ss2-7*)
39     ("ISO-2022-JP-2"   . *iso-2022-ss2-7*)
40     ("X-ISO-2022-JP-2" . *iso-2022-ss2-7*)
41     ("ISO-2022-CN"     . *iso-2022-ss2-7*)
42     ("ISO-2022-KR"     . *iso-2022-kr*)
43     ("EUC-KR"          . *euc-kr*)
44     ))
45
46 (defvar mime/charset-lc-alist
47   (list
48    (cons "ISO-8859-1" lc-ltn1) ; Latin-1
49    (cons "ISO-8859-2" lc-ltn2) ; Latin-2
50    (cons "ISO-8859-3" lc-ltn3) ; Latin-3
51    (cons "ISO-8859-4" lc-ltn4) ; Latin-4
52    (cons "ISO-8859-5" lc-crl ) ; Cyrillic
53    (cons "ISO-8859-6" lc-arb ) ; Arabic
54    (cons "ISO-8859-7" lc-grk ) ; Greek
55    (cons "ISO-8859-8" lc-hbw ) ; Hebrew
56    (cons "ISO-8859-9" lc-ltn5) ; Latin-5
57    ))
58
59
60 ;;; @ define charset and encoding
61 ;;;
62 (defun mime/set-charset-and-encoding (lc cs charset encoding)
63   (setq mime/lc-charset-and-encoding-alist
64         (put-alist lc (cons charset encoding)
65                    mime/lc-charset-and-encoding-alist))
66   (if cs
67       (setq mime/charset-coding-system-alist
68             (put-alist charset cs mime/charset-coding-system-alist))
69     (setq mime/charset-lc-alist
70           (put-alist charset lc mime/charset-lc-alist))
71     ))
72 ;;; example
73 ;;;
74 ;;; (mime/set-charset-and-encoding lc-kr *euc-kr* "EUC-KR" "B")
75 ;;; (mime/set-charset-and-encoding lc-koi8 nil "KOI8" "B")
76
77
78 (defun mime/remove-leading-character (str)
79   (let ((dest "") (i 0) (len (length str)) chr)
80     (while (< i len)
81       (setq chr (elt str i))
82       (if (< chr 128)
83           (progn
84             (setq dest (concat dest (char-to-string chr)))
85             (setq i (+ i 1))
86             )
87         (progn
88           (setq dest (concat dest (char-to-string (elt str (+ i 1)))))
89           (setq i (+ i 2))
90           ))
91       )
92     dest))
93
94 (defun mime/insert-leading-character (str lc)
95   (let ((lc-str (char-to-string lc))
96         (dest "")
97         (i 0) (len (length str))
98         chr chr-str)
99     (while (< i len)
100       (setq chr (elt str i))
101       (setq chr-str (char-to-string chr))
102       (setq dest (concat dest
103                          (if (< chr 128)
104                              chr-str
105                            (concat lc-str chr-str)
106                            )))
107       (setq i (+ i 1))
108       )
109     dest))
110
111 (defun mime/convert-string-to-emacs (charset str)
112   (let ((cs (cdr (assoc charset mime/charset-coding-system-alist))))
113     (cond (cs
114            (code-convert-string str cs *internal*)
115            )
116           (t
117            (let ((lc (cdr (assoc charset mime/charset-lc-alist))))
118              (if lc
119                  (mime/insert-leading-character str lc)
120                str)
121              )))))
122
123 (defun mime/convert-string-from-emacs (str charset)
124   (let ((cs (cdr (assoc charset mime/charset-coding-system-alist))))
125     (cond (cs
126            (code-convert-string str *internal* cs)
127            )
128           (t
129            (if (assoc charset mime/charset-lc-alist)
130                (mime/remove-leading-character str)
131              str)))))
132
133 ;; by mol. 1993/10/4
134 (defun mime/decode-encoded-text (charset encoding str)
135   (mime/convert-string-to-emacs
136    charset
137    (cond ((string-match "^B$" encoding) (mime/base64-decode-string str))
138          ((string-match "^Q$" encoding) (mime/Quoted-Printable-decode-string str))
139          (t (message "unknown encoding %s" encoding) str)
140          )))