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