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