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