egg-980304.
[elisp/egg.git] / its / zhuyin.el
1 ;;; its/zhuyin.el --- Zhuyin Input in Egg Input Method Architecture
2
3 ;; Copyright (C) 1997, 1998 Mule Project,
4 ;; Powered by Electrotechnical Laboratory, JAPAN.
5 ;; Project Leader: Satoru Tomura <tomura@etl.go.jp>
6
7 ;; Author: KATAYAMA Yoshio <kate@pfu.co.jp>
8
9 ;; This file will be part of GNU Emacs (in future).
10
11 ;; GNU Emacs is free software; you can redistribute it and/or modify
12 ;; it under the terms of the GNU General Public License as published by
13 ;; the Free Software Foundation; either version 2, or (at your option)
14 ;; any later version.
15
16 ;; GNU Emacs is distributed in the hope that it will be useful,
17 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
18 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19 ;; GNU General Public License for more details.
20
21 ;; You should have received a copy of the GNU General Public License
22 ;; along with GNU Emacs; see the file COPYING.  If not, write to the
23 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
24 ;; Boston, MA 02111-1307, USA.
25
26 ;;; Commentary:
27
28
29 ;;; Code:
30
31 (eval-when-compile
32   (require 'its)
33   (require 'cl))
34
35 (defvar its-zhuyin-cn-enable-quanjioao-alphabet t "*Enable Quanjiao alphabet")
36 (defvar its-zhuyin-cn-open-braket  "\e$A!8\e(B" "*[") ; "\e$A#[\e(B"
37 (defvar its-zhuyin-cn-close-braket "\e$A!9\e(B" "*]") ; "\e$A#]\e(B"
38
39 (defvar its-zhuyin-tw-enable-quanjioao-alphabet t "*Enable Quanjiao alphabet")
40 (defvar its-zhuyin-tw-open-braket  "\e$(G!V\e(B" "*[") ; "\e$(G!b\e(B "
41 (defvar its-zhuyin-tw-close-braket "\e$(G!W\e(B" "*]") ; "\e$(G!c\e(B"
42
43 (eval-when-compile
44   (defmacro its-do-zhuyin-table (list)
45     `(progn
46        ,@(mapcar (lambda (syl) `(its-define-zhuyin ,@syl))
47                  list)))
48
49   (defmacro its-define-zhuyin (shengmu yunmu1 &optional yunmu2 qing-only)
50     `(let ((s (list ,@shengmu))
51            (yi (concat (car ,yunmu1) (car ,yunmu2)))
52            (yo (concat (nth 1 ,yunmu1) (nth 1 ,yunmu2)))
53            (tone (if ,qing-only "\e(0A\e(B" "\e(0@\e(B"))
54            in out out1 state)
55        (while s
56          (setq in (concat (car (car s)) yi)
57                out (concat (nth 1 (car s)) yo)
58                out1 (concat out tone)
59                state (its-goto-state in nil t))
60          (if (and ,qing-only (its-get-kst/t state))
61              (its-set-output state out)
62            (its-set-output state out1))
63          (its-make-next-state state -1 in out1)
64          (its-make-next-state state ?  (concat in " ") out1)
65          (its-define-otherwise state (its-make-otherwise
66                                       out1
67                                       its-otherwise-back-one))
68          ,(if qing-only
69               nil
70             '(progn
71                (its-make-next-state state ?1 (concat in 1) (concat out "\e(0A\e(B"))
72                (its-make-next-state state ?2 (concat in 2) (concat out "\e(0B\e(B"))
73                (its-make-next-state state ?3 (concat in 3) (concat out "\e(0C\e(B"))
74                (its-make-next-state state ?4 (concat in 4) (concat out "\e(0D\e(B"))))
75          (setq s (cdr s)))))
76
77   (defmacro its-define-zhuyin-table ()
78     '(let ((-  '(""  ""))
79            (B  '("b" "\e(0E\e(B")) (P  '("p" "\e(0F\e(B")) (M  '("m" "\e(0G\e(B")) (F '("f" "\e(0H\e(B"))
80            (D  '("d" "\e(0I\e(B")) (T  '("t" "\e(0J\e(B")) (N  '("n" "\e(0K\e(B")) (L '("l" "\e(0L\e(B"))
81            (G  '("v" "\e(0M\e(B")) (K  '("k" "\e(0N\e(B")) (H  '("h" "\e(0O\e(B"))
82            (J  '("g" "\e(0P\e(B")) (Q  '("7" "\e(0Q\e(B")) (X  '("c" "\e(0R\e(B"))
83            (ZH '("," "\e(0S\e(B")) (CH '("." "\e(0T\e(B")) (SH '("/" "\e(0U\e(B")) (R '("j"  "\e(0V\e(B"))
84            (Z  '(";" "\e(0W\e(B")) (C  '(":" "\e(0X\e(B")) (S  '("s" "\e(0Y\e(B"))
85
86            (A   '("a" "\e(0Z\e(B")) (O   '("o" "\e(0[\e(B")) (e   '("r" "\e(0\\e(B")) (E   '("w" "\e(0]\e(B"))
87            (AI  '("i" "\e(0^\e(B")) (EI  '("q" "\e(0_\e(B")) (AO  '("z" "\e(0`\e(B")) 
88            (AN  '("8" "\e(0b\e(B")) (EN  '("9" "\e(0c\e(B")) (ANG '("0" "\e(0d\e(B")) (ENG '("-" "\e(0e\e(B"))
89            (ER  '("^" "\e(0f\e(B")) (OU  '("y" "\e(0a\e(B"))
90            (I   '("e" "\e(0g\e(B")) (U   '("x" "\e(0h\e(B")) (V   '("u" "\e(0i\e(B")))
91
92        (mapcar (lambda (s) (its-defrule (car s) (nth 1 s)))
93                (list B P M F D T N L G K H J Q X))
94
95        (its-do-zhuyin-table
96         (((- B P M F D T N L G K H       ZH CH SH   Z C S ) A)
97          ((- B P M F       L                              ) O)
98          ((-     M   D T N L G K H       ZH CH SH R Z C S ) e)
99          ((- B P M   D T N L G K H       ZH CH SH   Z C S ) AI)
100          ((- B P M F D T N L G K H       ZH    SH   Z C   ) EI)
101          ((- B P M   D T N L G K H       ZH CH SH R Z C S ) AO)
102          ((- B P M F D T N L G K H       ZH CH SH R Z C S ) AN)
103          ((- B P M F D   N   G K H       ZH CH SH R Z C S ) EN)
104          ((- B P M F D T N L G K H       ZH CH SH R Z C S ) ANG)
105          ((- B P M F D T N L G K H       ZH CH SH R Z C S ) ENG)
106          ((-                                              ) ER)
107          ((-   P M F D T N L G K H       ZH CH SH R Z C S ) OU)
108          ((                              ZH CH SH R Z C S ) -)
109          ((- B P M   D T N L       J Q X                  ) I)
110          ((-         D     L       J Q X                  ) I A)
111          ((-                                              ) I O)
112          ((- B P M   D T N L       J Q X                  ) I E)
113          ((- B P M   D T N L       J Q X                  ) I AO)
114          ((-     M   D   N L       J Q X                  ) I OU)
115          ((- B P M   D T N L       J Q X                  ) I AN)
116          ((- B P M       N L       J Q X                  ) I EN)
117          ((-             N L       J Q X                  ) I ANG)
118          ((- B P M   D T N L       J Q X                  ) I ENG)
119          ((- B P M F D T N L G K H       ZH CH SH R Z C S ) U)
120          ((-                 G K H       ZH CH SH R       ) U A)
121          ((-         D T N L G K H       ZH CH SH R Z C S ) U O)
122          ((-                 G K H       ZH CH SH         ) U AI)
123          ((-         D T     G K H       ZH CH SH R Z C S ) U EI)
124          ((-         D T N L G K H       ZH CH SH R Z C S ) U AN)
125          ((-         D T   L G K H       ZH CH SH R Z C S ) U EN)
126          ((-                 G K H       ZH CH SH         ) U ANG)
127          ((-         D T N L G K H       ZH CH    R Z C S ) U ENG)
128          ((-             N L       J Q X                  ) V)
129          ((-             N L       J Q X                  ) V E)
130          ((-                       J Q X                  ) V AN)
131          ((-                       J Q X                  ) V EN)
132          ((-                       J Q X                  ) V ENG)
133
134          ((- H) M nil t)
135          ((- H) '("@" "@") nil t)
136          ((-  ) N nil t)))
137
138         (its-defrule (concat (car N) 2) (concat (nth 1 N) "\e(0B\e(B"))
139         (its-defrule (concat (car N) 3) (concat (nth 1 N) "\e(0C\e(B"))
140         (its-defrule (concat (car N) 4) (concat (nth 1 N) "\e(0D\e(B")))))
141
142 (define-its-state-machine its-zhuyin-cn-map
143   "zhuyin-cn" "\e$AW"\e(BG" "Chinese-GB"
144   "Map for Zhuyin input. (Chinese-GB)"
145
146   (defconst its-quanjiao-escape "Z")
147   (defconst its-banjiao-escape  "X")
148
149   (its-defrule-select-mode-temporally "B" downcase)
150   (its-defrule-select-mode-temporally "Q" quanjiao-downcase-cn)
151
152   (its-define-zhuyin-table)
153   (dolist (ascii '(("0" . "\e$A#0\e(B")  ("1" . "\e$A#1\e(B")  ("2" . "\e$A#2\e(B")  ("3" . "\e$A#3\e(B")
154                    ("4" . "\e$A#4\e(B")  ("5" . "\e$A#5\e(B")  ("6" . "\e$A#6\e(B")  ("7" . "\e$A#7\e(B")
155                    ("8" . "\e$A#8\e(B")  ("9" . "\e$A#9\e(B") 
156                    (" " . "\e$A!!\e(B")  ("!" . "\e$A#!\e(B")  ("@" . "\e$A#@\e(B")  ("#" . "\e$A##\e(B")
157                    ("$" . "\e$A!g\e(B")  ("%" . "\e$A#%\e(B")  ("^" . "\e$A#^\e(B")  ("&" . "\e$A#&\e(B")
158                    ("*" . "\e$A#*\e(B")  ("(" . "\e$A#(\e(B")  (")" . "\e$A#)\e(B")
159                    ("-" . "\e$A#-\e(B")  ("=" . "\e$A#=\e(B")  ("`" . "\e$A#`\e(B")  ("\\" . "\e$A#\\e(B")
160                    ("|" . "\e$A#|\e(B")  ("_" . "\e$A#_\e(B")  ("+" . "\e$A#+\e(B")  ("~" . "\e$A!+\e(B")
161                    ("[" . "\e$A#[\e(B")  ("]" . "\e$A#]\e(B")  ("{" . "\e$A#{\e(B")  ("}" . "\e$A#}\e(B")
162                    (":" . "\e$A#:\e(B")  (";" . "\e$A#;\e(B")  ("\"" . "\e$A#"\e(B") ("'" . "\e$A#'\e(B")
163                    ("<" . "\e$A#<\e(B")  (">" . "\e$A#>\e(B")  ("?" . "\e$A#?\e(B")  ("/" . "\e$A#/\e(B")
164                    ("," . "\e$A#,\e(B")  ("." . "\e$A#.\e(B")
165                    ("a" . "\e$A#a\e(B")  ("b" . "\e$A#b\e(B")  ("c" . "\e$A#c\e(B")  ("d" . "\e$A#d\e(B")
166                    ("e" . "\e$A#e\e(B")  ("f" . "\e$A#f\e(B")  ("g" . "\e$A#g\e(B")  ("h" . "\e$A#h\e(B")
167                    ("i" . "\e$A#i\e(B")  ("j" . "\e$A#j\e(B")  ("k" . "\e$A#k\e(B")  ("l" . "\e$A#l\e(B")
168                    ("m" . "\e$A#m\e(B")  ("n" . "\e$A#n\e(B")  ("o" . "\e$A#o\e(B")  ("p" . "\e$A#p\e(B")
169                    ("q" . "\e$A#q\e(B")  ("r" . "\e$A#r\e(B")  ("s" . "\e$A#s\e(B")  ("t" . "\e$A#t\e(B")
170                    ("u" . "\e$A#u\e(B")  ("v" . "\e$A#v\e(B")  ("w" . "\e$A#w\e(B")  ("x" . "\e$A#x\e(B")
171                    ("y" . "\e$A#y\e(B")  ("z" . "\e$A#z\e(B")
172                    ("A" . "\e$A#A\e(B")  ("B" . "\e$A#B\e(B")  ("C" . "\e$A#C\e(B")  ("D" . "\e$A#D\e(B")
173                    ("E" . "\e$A#E\e(B")  ("F" . "\e$A#F\e(B")  ("G" . "\e$A#G\e(B")  ("H" . "\e$A#H\e(B")
174                    ("I" . "\e$A#I\e(B")  ("J" . "\e$A#J\e(B")  ("K" . "\e$A#K\e(B")  ("L" . "\e$A#L\e(B")
175                    ("M" . "\e$A#M\e(B")  ("N" . "\e$A#N\e(B")  ("O" . "\e$A#O\e(B")  ("P" . "\e$A#P\e(B")
176                    ("Q" . "\e$A#Q\e(B")  ("R" . "\e$A#R\e(B")  ("S" . "\e$A#S\e(B")  ("T" . "\e$A#T\e(B")
177                    ("U" . "\e$A#U\e(B")  ("V" . "\e$A#V\e(B")  ("W" . "\e$A#W\e(B")  ("X" . "\e$A#X\e(B")
178                    ("Y" . "\e$A#Y\e(B")  ("Z" . "\e$A#Z\e(B")))
179     (let ((in (car ascii)) (out (cdr ascii)))
180       (its-defrule (concat its-banjiao-escape in) in)
181       (its-defrule (concat its-quanjiao-escape in) out)))
182
183     (its-defrule "<" "\e$A#,\e(B")
184     (its-defrule ">" "\e$A!#\e(B")
185     (its-defrule "?" "\e$A!"\e(B"))
186
187 (define-its-state-machine its-zhuyin-tw-map
188   "zhuyin-tw" "\e$(GNC\e(BC" "Chinese-CNS"
189   "Map for Zhuyin input."
190
191   (defconst its-quanjiao-escape "Z")
192   (defconst its-banjiao-escape  "X")
193
194   (its-defrule-select-mode-temporally "B" downcase)
195   (its-defrule-select-mode-temporally "Q" quanjiao-downcase-tw)
196
197   (its-define-zhuyin-table)
198   (dolist (ascii '(("0" . "\e$(G$!\e(B")  ("1" . "\e$(G$"\e(B")  ("2" . "\e$(G$#\e(B")  ("3" . "\e$(G$$\e(B")
199                    ("4" . "\e$(G$%\e(B")  ("5" . "\e$(G$&\e(B")  ("6" . "\e$(G$'\e(B")  ("7" . "\e$(G$(\e(B")
200                    ("8" . "\e$(G$)\e(B")  ("9" . "\e$(G$*\e(B") 
201                    (" " . "\e$(G!!\e(B")  ("!" . "\e$(G!*\e(B")  ("@" . "\e$(G"i\e(B")  ("#" . "\e$(G!l\e(B")
202                    ("$" . "\e$(G"c\e(B")  ("%" . "\e$(G"h\e(B")  ("^" . "\e$(G!T\e(B")  ("&" . "\e$(G!m\e(B")
203                    ("*" . "\e$(G!n\e(B")  ("(" . "\e$(G!>\e(B")  (")" . "\e$(G!?\e(B")
204                    ("-" . "\e$(G"1\e(B")  ("=" . "\e$(G"8\e(B")  ("`" . "\e$(G!j\e(B")  ("\\" . "\e$(G"b\e(B")
205                    ("|" . "\e$(G"^\e(B")  ("_" . "\e$(G"%\e(B")  ("+" . "\e$(G"0\e(B")  ("~" . "\e$(G"D\e(B")
206                    ("[" . "\e$(G!b\e(B")  ("]" . "\e$(G!c\e(B")  ("{" . "\e$A#{\e(B")  ("}" . "\e$(G!a\e(B")
207                    (":" . "\e$(G!(\e(B")  (";" . "\e$(G!'\e(B")  ("\"" . "\e$(G!i\e(B") ("'" . "\e$(G!k\e(B")
208                    ("<" . "\e$(G"6\e(B")  (">" . "\e$(G"7\e(B")  ("?" . "\e$(G!)\e(B")  ("/" . "\e$(G"a\e(B")
209                    ("," . "\e$(G!"\e(B")  ("." . "\e$(G!%\e(B")
210                    ("a" . "\e$(G$[\e(B")  ("b" . "\e$(G$\\e(B")  ("c" . "\e$(G$]\e(B")  ("d" . "\e$(G$^\e(B")
211                    ("e" . "\e$(G$_\e(B")  ("f" . "\e$(G$`\e(B")  ("g" . "\e$(G$a\e(B")  ("h" . "\e$(G$b\e(B")
212                    ("i" . "\e$(G$c\e(B")  ("j" . "\e$(G$d\e(B")  ("k" . "\e$(G$e\e(B")  ("l" . "\e$(G$f\e(B")
213                    ("m" . "\e$(G$g\e(B")  ("n" . "\e$(G$h\e(B")  ("o" . "\e$(G$i\e(B")  ("p" . "\e$(G$j\e(B")
214                    ("q" . "\e$(G$k\e(B")  ("r" . "\e$(G$l\e(B")  ("s" . "\e$(G$m\e(B")  ("t" . "\e$(G$n\e(B")
215                    ("u" . "\e$(G$o\e(B")  ("v" . "\e$(G$p\e(B")  ("w" . "\e$(G$q\e(B")  ("x" . "\e$(G$r\e(B")
216                    ("y" . "\e$(G$s\e(B")  ("z" . "\e$(G$t\e(B")
217                    ("A" . "\e$(G$A\e(B")  ("B" . "\e$(G$B\e(B")  ("C" . "\e$(G$C\e(B")  ("D" . "\e$(G$D\e(B")
218                    ("E" . "\e$(G$E\e(B")  ("F" . "\e$(G$F\e(B")  ("G" . "\e$(G$G\e(B")  ("H" . "\e$(G$H\e(B")
219                    ("I" . "\e$(G$I\e(B")  ("J" . "\e$(G$J\e(B")  ("K" . "\e$(G$K\e(B")  ("L" . "\e$(G$L\e(B")
220                    ("M" . "\e$(G$M\e(B")  ("N" . "\e$(G$N\e(B")  ("O" . "\e$(G$O\e(B")  ("P" . "\e$(G$P\e(B")
221                    ("Q" . "\e$(G$Q\e(B")  ("R" . "\e$(G$R\e(B")  ("S" . "\e$(G$S\e(B")  ("T" . "\e$(G$T\e(B")
222                    ("U" . "\e$(G$U\e(B")  ("V" . "\e$(G$V\e(B")  ("W" . "\e$(G$W\e(B")  ("X" . "\e$(G$X\e(B")
223                    ("Y" . "\e$(G$Y\e(B")  ("Z" . "\e$(G$Z\e(B")))
224     (let ((in (car ascii)) (out (cdr ascii)))
225       (its-defrule (concat its-banjiao-escape in) in)
226       (its-defrule (concat its-quanjiao-escape in) out)))
227
228     (its-defrule "<" "\e$(G!"\e(B")
229     (its-defrule ">" "\e$(G!$\e(B")
230     (its-defrule "?" "\e$(G!#\e(B"))
231
232 (define-its-state-machine-append its-zhuyin-cn-map
233   (its-defrule "[" its-zhuyin-cn-open-braket nil t)
234   (its-defrule "]" its-zhuyin-cn-close-braket nil t)
235
236 (if its-zhuyin-cn-enable-quanjioao-alphabet
237       (progn
238         (its-defrule "#"  "\e$A##\e(B")  (its-defrule "$"  "\e$A!g\e(B")
239         (its-defrule "%"  "\e$A#%\e(B")
240         (its-defrule "&"  "\e$A#&\e(B")  (its-defrule "*"  "\e$A#*\e(B")
241         (its-defrule "("  "\e$A#(\e(B")  (its-defrule ")"  "\e$A#)\e(B")
242         (its-defrule "~"  "\e$A!+\e(B")
243         (its-defrule "="  "\e$A#=\e(B")  (its-defrule "`"  "\e$A#`\e(B")
244         (its-defrule "\\" "\e$A#\\e(B")  (its-defrule "|"  "\e$A#|\e(B")
245         (its-defrule "_"  "\e$A#_\e(B")  (its-defrule "+"  "\e$A#+\e(B")
246         (its-defrule "{"  "\e$A#{\e(B")  (its-defrule "}"  "\e$A#}\e(B")
247         (its-defrule "\"" "\e$A#"\e(B")  (its-defrule "'"  "\e$A#'\e(B"))
248     (progn
249       (its-defrule "#"  "#")  (its-defrule "$"  "$")
250       (its-defrule "%"  "%")
251       (its-defrule "&"  "&")  (its-defrule "*"  "*")
252       (its-defrule "("  "(")  (its-defrule ")"  ")")
253       (its-defrule "~"  "~")
254       (its-defrule "="  "=")  (its-defrule "`"  "`")
255       (its-defrule "\\" "\\") (its-defrule "|"  "|")
256       (its-defrule "_"  "_")  (its-defrule "+"  "+")
257       (its-defrule "{"  "{")  (its-defrule "}"  "}")
258       (its-defrule "\"" "\"") (its-defrule "'"  "'"))))
259
260 (define-its-state-machine-append its-zhuyin-tw-map
261   (its-defrule "[" its-zhuyin-tw-open-braket nil t)
262   (its-defrule "]" its-zhuyin-tw-close-braket nil t)
263
264   (if its-zhuyin-tw-enable-quanjioao-alphabet
265       (progn
266         (its-defrule "#"  "\e$(G!l\e(B")  (its-defrule "$"  "\e$(G"c\e(B")
267         (its-defrule "%"  "\e$(G"h\e(B")
268         (its-defrule "&"  "\e$(G!m\e(B")  (its-defrule "*"  "\e$(G!n\e(B")
269         (its-defrule "("  "\e$(G!>\e(B")  (its-defrule ")"  "\e$(G!?\e(B")
270         (its-defrule "~"  "\e$(G"D\e(B")
271         (its-defrule "="  "\e$(G"8\e(B")  (its-defrule "`"  "\e$(G!j\e(B")
272         (its-defrule "\\" "\e$(G"b\e(B")  (its-defrule "|"  "\e$(G"^\e(B")
273         (its-defrule "_"  "\e$(G"%\e(B")  (its-defrule "+"  "\e$(G"0\e(B")
274         (its-defrule "{"  "\e$A#{\e(B")  (its-defrule "}"  "\e$(G!a\e(B")
275         (its-defrule "\"" "\e$(G!i\e(B")  (its-defrule "'"  "\e$(G!k\e(B"))
276     (progn
277       (its-defrule "#"  "#")  (its-defrule "$"  "$")
278       (its-defrule "%"  "%")
279       (its-defrule "&"  "&")  (its-defrule "*"  "*")
280       (its-defrule "("  "(")  (its-defrule ")"  ")")
281       (its-defrule "~"  "~")
282       (its-defrule "="  "=")  (its-defrule "`"  "`")
283       (its-defrule "\\" "\\") (its-defrule "|"  "|")
284       (its-defrule "_"  "_")  (its-defrule "+"  "+")
285       (its-defrule "{"  "{")  (its-defrule "}"  "}")
286       (its-defrule "\"" "\"") (its-defrule "'"  "'"))))
287
288 (provide 'its/zhuyin)