(chise-tex-encode-region-for-gb): Add setting for KS character.
[chise/omega.git] / chise2otf / elisp / chise-tex.el
1 ;;; chise-tex.el --- Coding-system based chise2otf like tool
2
3 ;; Copyright (C) 2004,2005 MORIOKA Tomohiko
4
5 ;; Author: MORIOKA Tomohiko <tomo@kanji.zinbun.kyoto-u.ac.jp>
6 ;; Keywords: OTF package, pTeX, CHISE, Multiscript, Multilingual
7
8 ;; This file is a part of Omega/CHISE.
9
10 ;; This program is free software; you can redistribute it and/or
11 ;; modify it under the terms of the GNU General Public License as
12 ;; published by the Free Software Foundation; either version 2, or (at
13 ;; your option) any later version.
14
15 ;; This program is distributed in the hope that it will be useful, but
16 ;; WITHOUT ANY WARRANTY; without even the implied warranty of
17 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18 ;; General Public License for more details.
19
20 ;; You should have received a copy of the GNU General Public License
21 ;; along with this program; see the file COPYING.  If not, write to
22 ;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
23 ;; Boston, MA 02111-1307, USA.
24
25 ;;; Code:
26
27 (defvar chise-tex-coded-charset-expression-alist
28   '((=ucs-hangul "UCShang"      4 X)
29     (=ucs@gb    "UCSgb"         4 X)
30     (=ucs@jis   "UCSjis"        4 X)
31     (=ucs@jis/2000 "UCSjis"     4 X)
32     (=ucs@ks    "UCSks"         4 X)
33     (=gt-pj-1   "GTpj1"         4 X)
34     (=gt-pj-2   "GTpj2"         4 X)
35     (=gt-pj-3   "GTpj3"         4 X)
36     (=gt-pj-4   "GTpj4"         4 X)
37     (=gt-pj-5   "GTpj5"         4 X)
38     (=gt-pj-6   "GTpj6"         4 X)
39     (=gt-pj-7   "GTpj7"         4 X)
40     (=gt-pj-8   "GTpj8"         4 X)
41     (=gt-pj-9   "GTpj9"         4 X)
42     (=gt-pj-10  "GTpj10"        4 X)
43     (=gt-pj-11  "GTpj11"        4 X)
44     (=ucs@cns   "UCScns"        4 X)))
45
46 (defun chise-tex-encode-region-for-gb (start end)
47   (interactive "r")
48   (save-excursion
49     (save-restriction
50       (narrow-to-region start end)
51       (goto-char start)
52       (let (chr ret rest spec)
53         (while (and (skip-chars-forward "\x00-\xFF")
54                     (not (eobp)))
55           (setq chr (char-after))
56           (cond ((memq chr '(?\e$(O#@\e(B))
57                  (delete-char)
58                  (insert (format "\\UCSjis{%04X}"
59                                  (encode-char chr '=ucs@jis)))
60                  )
61                 ((and (setq ret (encode-char chr '=jis-x0208-1983))
62                       (< ret #x3021))
63                  (forward-char))
64                 ;; ((setq ret (encode-char chr '=jis-x0208-1990))
65                 ;;  (delete-char)
66                 ;;  (insert (decode-char '=jis-x0208-1983 ret)))
67                 ((and (encode-char chr '=ks-x1001)
68                       (setq ret (or (encode-char chr '=ucs@ks)
69                                     (char-ucs chr))))
70                  (delete-char)
71                  ;; (if (eq (char-before) ?\e$B!T\e(B)
72                  ;;     (insert " "))
73                  (insert (format "\\UCSks{%04X}" ret)))
74                 ((catch 'tag
75                    (setq rest chise-tex-coded-charset-expression-alist)
76                    (while (setq spec (car rest))
77                      (if (setq ret (encode-char chr (car spec)))
78                          (throw 'tag ret))
79                      (setq rest (cdr rest))))
80                  (delete-char)
81                  ;; (if (eq (char-before) ?\e$B!T\e(B)
82                  ;;     (insert " "))
83                  (insert (format (format "\\%s{%%0%d%s}"
84                                          (nth 1 spec)
85                                          (nth 2 spec)
86                                          (nth 3 spec))
87                                  ret)))
88                 (t
89                  (forward-char))))))))
90
91 (defun chise-tex-encode-region-for-jis (start end)
92   (interactive "r")
93   (save-excursion
94     (save-restriction
95       (narrow-to-region start end)
96       (goto-char start)
97       (let (chr ret rest spec)
98         (while (and (skip-chars-forward "\x00-\xFF")
99                     (not (eobp)))
100           (setq chr (char-after))
101           (cond ((encode-char chr '=jis-x0208-1983)
102                  (forward-char))
103                 ;; ((setq ret (encode-char chr '=jis-x0208-1990))
104                 ;;  (delete-char)
105                 ;;  (insert (decode-char '=jis-x0208-1983 ret)))
106                 ((and (or (encode-char chr '=jis-x0213-1-2000)
107                           (encode-char chr '=jis-x0213-2-2000))
108                       (setq ret (or (encode-char chr '=ucs@jis/2000)
109                                     (encode-char chr '=ucs@jis/fw))))
110                  (delete-char)
111                  ;; (if (eq (char-before) ?\e$B!T\e(B)
112                  ;;     (insert " "))
113                  (insert (format "\\UCSjis{%04X}" ret)))
114                 ((and (encode-char chr '=ks-x1001)
115                       (setq ret (or (encode-char chr '=ucs@ks)
116                                     (char-ucs chr))))
117                  (delete-char)
118                  ;; (if (eq (char-before) ?\e$B!T\e(B)
119                  ;;     (insert " "))
120                  (insert (format "\\UCSks{%04X}" ret)))
121                 ((setq ret (encode-char chr '=ucs-hangul))
122                  (delete-char)
123                  ;; (if (eq (char-before) ?\e$B!T\e(B)
124                  ;;     (insert " "))
125                  (insert (format "\\UCSks{%04X}" ret)))
126                 ((eq chr ?\u2022)
127                  (delete-char)
128                  (insert "\\textbullet{}"))
129                 ((eq chr ?\u0294)
130                  (delete-char)
131                  (insert "\\UCSjis{0294}"))
132                 ((and (encode-char chr '=ucs@jp)
133                       (setq ret (char-representative-of-domain chr 'gb))
134                       (setq ret (encode-char ret '=ucs@gb)))
135                  (delete-char)
136                  ;; (if (eq (char-before) ?\e$B!T\e(B)
137                  ;;     (insert " "))
138                  (insert (format "\\UCSgb{%04X}" ret)))
139                 ((catch 'tag
140                    (setq rest chise-tex-coded-charset-expression-alist)
141                    (while (setq spec (car rest))
142                      (if (setq ret (encode-char chr (car spec)))
143                          (throw 'tag ret))
144                      (setq rest (cdr rest))))
145                  (delete-char)
146                  ;; (if (eq (char-before) ?\e$B!T\e(B)
147                  ;;     (insert " "))
148                  (insert (format (format "\\%s{%%0%d%s}"
149                                          (nth 1 spec)
150                                          (nth 2 spec)
151                                          (nth 3 spec))
152                                  ret)))
153                 (t
154                  (forward-char))))))))
155
156 (defun chise-tex-decode-region (start end)
157   (interactive "r")
158   (save-excursion
159     (save-restriction
160       (narrow-to-region start end)
161       (goto-char start)
162       (let (macro code ret me rest spec)
163         (while (re-search-forward "\\\\\\([a-zA-Z0-9]+\\){\\([0-9A-Fa-f]+\\)}"
164                                   nil t)
165           (setq macro (match-string 1)
166                 code (match-string 2)
167                 me (match-end 0))
168           (if (and (catch 'tag
169                      (setq rest chise-tex-coded-charset-expression-alist)
170                      (while (setq spec (car rest))
171                        (if (string= (nth 1 spec) macro)
172                            (throw 'tag spec))
173                        (setq rest (cdr rest))))
174                    (setq ret (decode-char (car spec)
175                                           (string-to-int
176                                            code
177                                            (if (eq (nth 3 spec) 'X)
178                                                16)))))
179               (progn
180                 (delete-region (match-beginning 0)(match-end 0))
181                 (insert ret))
182             (goto-char me)))))))
183
184 (make-coding-system
185  'iso-2022-jp-tex-gb 'iso2022
186  "ISO-2022-JP with TeX representation for GB fonts."
187  '(charset-g0 ascii
188    short t
189    seven t
190    input-charset-conversion ((latin-jisx0201 ascii)
191                              (japanese-jisx0208-1978 japanese-jisx0208))
192    pre-write-conversion chise-tex-encode-region-for-gb
193    post-read-conversion chise-tex-decode-region
194    mnemonic "pTeX(GB)/7bit"
195    ))
196
197 (make-coding-system
198  'iso-2022-jp-tex-jis 'iso2022
199  "ISO-2022-JP with TeX representation for JIS fonts."
200  '(charset-g0 ascii
201    short t
202    seven t
203    input-charset-conversion ((latin-jisx0201 ascii)
204                              (japanese-jisx0208-1978 japanese-jisx0208))
205    pre-write-conversion chise-tex-encode-region-for-jis
206    post-read-conversion chise-tex-decode-region
207    mnemonic "pTeX(JIS)/7bit"
208    ))
209
210
211 ;;; @ End.
212 ;;;
213
214 (provide 'chise-tex)
215
216 ;;; chise-tex.el ends here