jisx0213
[elisp/tamago.git] / its / pinyin.el
1 ;;; its/pinyin.el --- Pinyin Input in Egg Input Method Architecture
2
3 ;; Copyright (C) 1999,2000 PFU LIMITED
4
5 ;; Author: KATAYAMA Yoshio <kate@pfu.co.jp>
6
7 ;; Maintainer: TOMURA Satoru <tomura@etl.go.jp>
8
9 ;; Keywords: mule, multilingual, input method
10
11 ;; This file is part of EGG.
12
13 ;; EGG is free software; you can redistribute it and/or modify
14 ;; it under the terms of the GNU General Public License as published by
15 ;; the Free Software Foundation; either version 2, or (at your option)
16 ;; any later version.
17
18 ;; EGG is distributed in the hope that it will be useful,
19 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
20 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21 ;; GNU General Public License for more details.
22
23 ;; You should have received a copy of the GNU General Public License
24 ;; along with GNU Emacs; see the file COPYING.  If not, write to the
25 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
26 ;; Boston, MA 02111-1307, USA.
27
28 ;;; Commentary:
29
30
31 ;;; Code:
32
33 (eval-when-compile
34   (require 'its)
35   (require 'cl))
36
37 (eval-when (compile)
38   (defconst its-compaction-enable t))
39
40 (defvar its-pinyin-cn-enable-quanjioao-alphabet
41   (if (boundp 'its-enable-fullwidth-alphabet)
42       its-enable-fullwidth-alphabet
43     t)
44   "*Enable Quanjiao alphabet")
45
46 (defvar its-pinyin-cn-open-braket  "\e$A!8\e(B" "*[") ; "\e$A#[\e(B"
47 (defvar its-pinyin-cn-close-braket "\e$A!9\e(B" "*]") ; "\e$A#]\e(B"
48
49 (defvar its-pinyin-tw-enable-quanjioao-alphabet
50   (if (boundp 'its-enable-fullwidth-alphabet)
51       its-enable-fullwidth-alphabet
52     t)
53   "*Enable Quanjiao alphabet")
54
55 (defvar its-pinyin-tw-open-braket  "\e$(G!V\e(B" "*[") ; "\e$(G!b\e(B "
56 (defvar its-pinyin-tw-close-braket "\e$(G!W\e(B" "*]") ; "\e$(G!c\e(B"
57
58 (eval-when-compile
59   (defun its-prev-terminal-state (state-list)
60     (while (and state-list
61                 (null (its-get-next-state (car state-list) -1)))
62       (setq state-list (cdr state-list)))
63     (car state-list))
64
65   (defun its-define-qingsheng (shengmu yunmu &optional s y)
66     (let ((input (concat shengmu yunmu))
67           (output (concat (if s s (capitalize shengmu)) (if y y yunmu) "\e(0@\e(B"))
68           state term-state)
69       (setq state (its-defrule* input output))
70       (its-make-next-state state ?  output)
71       (its-make-next-state state ?0 output)
72       (setq term-state (its-prev-terminal-state its-parent-states))
73       (if term-state
74           (let ((back (- (length (its-get-keyseq term-state)) (length input)))
75                 (output (its-get-output (its-get-next-state term-state -1)))
76                 (parents its-parent-states))
77             (while (null (eq (car parents) term-state))
78               (its-make-next-state (car parents) -1 output (1+ back))
79               (its-defrule-otherwise (car parents) output nil back)
80               (setq back (1+ back)
81                     parents (cdr parents)))))
82       state))
83
84   (defmacro its-do-sisheng-table (list)
85     `(progn
86        ,@(mapcar (lambda (syl)
87                    `(its-define-sisheng ,@syl))
88                  list)))
89
90   (defmacro its-define-sisheng (shengmu yunmu)
91     `(let ((qing (nth 5 ,yunmu)) (y (car ,yunmu))
92            (ss (list ,@shengmu)) s cs state i)
93        (while ss
94          (setq s (car ss)
95                ss (cdr ss)
96                cs (capitalize s)
97                state (its-define-qingsheng s y cs qing))
98          (its-make-next-state state ?1 (concat cs (nth 1 ,yunmu) "\e(0@\e(B"))
99          (its-make-next-state state ?2 (concat cs (nth 2 ,yunmu) "\e(0@\e(B"))
100          (its-make-next-state state ?3 (concat cs (nth 3 ,yunmu) "\e(0@\e(B"))
101          (its-make-next-state state ?4 (concat cs (nth 4 ,yunmu) "\e(0@\e(B")))))
102
103   (defmacro its-define-pinyin-table ()
104     '(let ((- "")  (B "b") (C "c") (D "d") (F "f") (G "g") (H "h")
105            (J "j") (K "k") (L "l") (M "m") (N "n") (P "p") (Q "q")
106            (R "r") (S "s") (T "t") (W "w") (X "x") (Y "y") (Z "z")
107            (CH "ch") (SH "sh") (ZH "zh")
108
109            (A    '("a"    "\e(0!\e(B"    "\e(0"\e(B"    "\e(0#\e(B"    "\e(0$\e(B"    "a"   ))
110            (AI   '("ai"   "\e(0!\e(Bi"   "\e(0"\e(Bi"   "\e(0#\e(Bi"   "\e(0$\e(Bi"   "ai"  ))
111            (AN   '("an"   "\e(0!\e(Bn"   "\e(0"\e(Bn"   "\e(0#\e(Bn"   "\e(0$\e(Bn"   "an"  ))
112            (ANG  '("ang"  "\e(0!\e(Bng"  "\e(0"\e(Bng"  "\e(0#\e(Bng"  "\e(0$\e(Bng"  "ang" ))
113            (AO   '("ao"   "\e(0!\e(Bo"   "\e(0"\e(Bo"   "\e(0#\e(Bo"   "\e(0$\e(Bo"   "ao"  ))
114            (E    '("e"    "\e(0%\e(B"    "\e(0&\e(B"    "\e(0'\e(B"    "\e(0(\e(B"    "e"   ))
115            (EI   '("ei"   "\e(0%\e(Bi"   "\e(0&\e(Bi"   "\e(0'\e(Bi"   "\e(0(\e(Bi"   "ei"  ))
116            (EN   '("en"   "\e(0%\e(Bn"   "\e(0&\e(Bn"   "\e(0'\e(Bn"   "\e(0(\e(Bn"   "en"  ))
117            (ENG  '("eng"  "\e(0%\e(Bng"  "\e(0&\e(Bng"  "\e(0'\e(Bng"  "\e(0(\e(Bng"  "eng" ))
118            (ER   '("er"   "\e(0%\e(Br"   "\e(0&\e(Br"   "\e(0'\e(Br"   "\e(0(\e(Br"   "er"  ))
119            (I    '("i"    "\e(0)\e(B"    "\e(0*\e(B"    "\e(0+\e(B"    "\e(0,\e(B"    "i"   ))
120            (IA   '("ia"   "i\e(0!\e(B"   "i\e(0"\e(B"   "i\e(0#\e(B"   "i\e(0$\e(B"   "ia"  ))
121            (IAN  '("ian"  "i\e(0!\e(Bn"  "i\e(0"\e(Bn"  "i\e(0#\e(Bn"  "i\e(0$\e(Bn"  "ian" ))
122            (IANG '("iang" "i\e(0!\e(Bng" "i\e(0"\e(Bng" "i\e(0#\e(Bng" "i\e(0$\e(Bng" "iang"))
123            (IAO  '("iao"  "i\e(0!\e(Bo"  "i\e(0"\e(Bo"  "i\e(0#\e(Bo"  "i\e(0$\e(Bo"  "iao" ))
124            (IE   '("ie"   "i\e(0%\e(B"   "i\e(0&\e(B"   "i\e(0'\e(B"   "i\e(0(\e(B"   "ie"  ))
125            (IN   '("in"   "\e(0)\e(Bn"   "\e(0*\e(Bn"   "\e(0+\e(Bn"   "\e(0,\e(Bn"   "in"  ))
126            (ING  '("ing"  "\e(0)\e(Bng"  "\e(0*\e(Bng"  "\e(0+\e(Bng"  "\e(0,\e(Bng"  "ing" ))
127            (IONG '("iong" "i\e(0-\e(Bng" "i\e(0.\e(Bng" "i\e(0/\e(Bng" "i\e(00\e(Bng" "iong"))
128            (IU   '("iu"   "i\e(01\e(B"   "i\e(02\e(B"   "i\e(03\e(B"   "i\e(04\e(B"   "iu"  ))
129            (O    '("o"    "\e(0-\e(B"    "\e(0.\e(B"    "\e(0/\e(B"    "\e(00\e(B"    "o"   ))
130            (ONG  '("ong"  "\e(0-\e(Bng"  "\e(0.\e(Bng"  "\e(0/\e(Bng"  "\e(00\e(Bng"  "ong" ))
131            (OU   '("ou"   "\e(0-\e(Bu"   "\e(0.\e(Bu"   "\e(0/\e(Bu"   "\e(00\e(Bu"   "ou"  ))
132            (U    '("u"    "\e(01\e(B"    "\e(02\e(B"    "\e(03\e(B"    "\e(04\e(B"    "u"   ))
133            (V    '("v"    "\e(05\e(B"    "\e(06\e(B"    "\e(07\e(B"    "\e(08\e(B"    "\e(09\e(B"   ))
134            (UA   '("ua"   "u\e(0!\e(B"   "u\e(0"\e(B"   "u\e(0#\e(B"   "u\e(0$\e(B"   "ua"  ))
135            (UAI  '("uai"  "u\e(0!\e(Bi"  "u\e(0"\e(Bi"  "u\e(0#\e(Bi"  "u\e(0$\e(Bi"  "uai" ))
136            (UAN  '("uan"  "u\e(0!\e(Bn"  "u\e(0"\e(Bn"  "u\e(0#\e(Bn"  "u\e(0$\e(Bn"  "uan" ))
137            (UANG '("uang" "u\e(0!\e(Bng" "u\e(0"\e(Bng" "u\e(0#\e(Bng" "u\e(0$\e(Bng" "uang"))
138            (UE   '("ue"   "u\e(0%\e(B"   "u\e(0&\e(B"   "u\e(0'\e(B"   "u\e(0(\e(B"   "ue"  ))
139            (VE   '("ve"   "\e(09%\e(B"   "\e(09&\e(B"   "\e(09'\e(B"   "\e(09(\e(B"   "\e(09\e(Be"  ))
140            (UI   '("ui"   "u\e(0)\e(B"   "u\e(0*\e(B"   "u\e(0+\e(B"   "u\e(0,\e(B"   "ui"  ))
141            (UN   '("un"   "\e(01\e(Bn"   "\e(02\e(Bn"   "\e(03\e(Bn"   "\e(04\e(Bn"   "un"  ))
142            (UO   '("uo"   "u\e(0-\e(B"   "u\e(0.\e(B"   "u\e(0/\e(B"   "u\e(00\e(B"   "uo"  )))
143
144        (its-define-qingsheng    "hm"    "")
145        (its-define-qingsheng    "hng"   "")
146        (its-defrule*            "m"     "m\e(0@\e(B")
147        (its-defrule             "m0"    "m\e(0@\e(B")
148        (its-defrule*            "n"     "n\e(0@\e(B")
149        (its-defrule             "n0"    "n\e(0@\e(B")
150        (its-defrule             "n2"    "\e(0=@\e(B")
151        (its-defrule             "n3"    "\e(0>@\e(B")
152        (its-defrule             "n4"    "\e(0?@\e(B")
153        (its-define-qingsheng    ""      "ng")
154
155        (its-do-sisheng-table
156         (((- B C D F G H   K L M N P     S T W   Y Z CH SH ZH ) A)
157          ((- B C D   G H   K L M N P     S T W     Z CH SH ZH ) AI)
158          ((- B C D F G H   K L M N P   R S T W   Y Z CH SH ZH ) AN)
159          ((- B C D F G H   K L M N P   R S T W   Y Z CH SH ZH ) ANG)
160          ((- B C D   G H   K L M N P   R S T     Y Z CH SH ZH ) AO)
161          ((-   C D   G H   K L M N     R S T     Y Z CH SH ZH ) E)
162          ((- B C D F G H   K L M N P       T W     Z    SH ZH ) EI)
163          ((- B C D F G H   K   M N P   R S   W     Z CH SH ZH ) EN)
164          ((- B C D F G H   K L M N P   R S T W     Z CH SH ZH ) ENG)
165          ((-                                                  ) ER)
166          ((  B C D       J   L M N P Q R S T   X Y Z CH SH ZH ) I)
167          ((      D       J   L       Q         X              ) IA)
168          ((  B   D       J   L M N P Q     T   X              ) IAN)
169          ((              J   L   N   Q         X              ) IANG)
170          ((  B   D       J   L M N P Q     T   X              ) IAO)
171          ((  B   D       J   L M N P Q     T   X              ) IE)
172          ((  B           J   L M N P Q         X Y            ) IN)
173          ((  B   D       J   L M N P Q     T   X Y            ) ING)
174          ((              J           Q         X              ) IONG)
175          ((      D       J   L M N   Q         X              ) IU)
176          ((- B     F         L M   P         W   Y            ) O)
177          ((    C D   G H   K L   N     R S T     Y Z CH    ZH ) ONG)
178          ((-   C D F G H   K L M N P   R S T     Y Z CH SH ZH ) OU)
179          ((  B C D F G H J K L M N P Q R S T W X Y Z CH SH ZH ) U)
180          ((                  L   N                            ) V)
181          ((          G H   K           R             CH SH ZH ) UA)
182          ((          G H   K                         CH SH ZH ) UAI)
183          ((    C D   G H J K L   N   Q R S T   X Y Z CH SH ZH ) UAN)
184          ((          G H   K                         CH SH ZH ) UANG)
185          ((              J           Q         X Y            ) UE)
186          ((                  L   N                            ) VE)
187          ((    C D   G H   K           R S T       Z CH SH ZH ) UI)
188          ((    C D   G H J K L       Q R S T   X Y Z CH SH ZH ) UN)
189          ((    C D   G H   K L   N     R S T       Z CH SH ZH ) UO)
190
191          ((J Q X) (cons "a"   (cdr IA  )))
192          ((J Q X) (cons "ai"  (cdr IA  )))
193          ((J Q X) (cons "an"  (cdr IAN )))
194          ((J Q X) (cons "ang" (cdr IANG)))
195          ((J Q X) (cons "ao"  (cdr IAO )))
196          ((J Q X) (cons "e"   (cdr IE  )))
197          ((J Q X) (cons "ei"  (cdr IE  )))
198          ((J Q X) (cons "en"  (cdr IN  )))
199          ((J Q X) (cons "eng" (cdr ING )))
200          ((J Q X) (cons "ou"  (cdr IU  ))))))))
201
202 (define-its-state-machine its-pinyin-cn-map
203   "pinyin-cn" "\e$AF4\e(BG" Chinese-GB
204   "Map for Pinyin input. (Chinese-GB)"
205
206   (defconst its-quanjiao-escape "Z")
207   (defconst its-banjiao-escape  "X")
208
209   (its-defrule-select-mode-temporally "B" downcase)
210   (its-defrule-select-mode-temporally "Q" quanjiao-downcase-cn)
211
212   (its-define-pinyin-table)
213   (its-defrule  "b "    "\e$A2;\e(B")
214   (its-defrule  "c "    "\e$A2E\e(B")
215   (its-defrule  "ch "   "\e$A3v\e(B")
216   (its-defrule  "d "    "\e$A5D\e(B")
217   (its-defrule  "f "    "\e$A74\e(B")
218   (its-defrule  "g "    "\e$A8v\e(B")
219   (its-defrule  "h "    "\e$A:M\e(B")
220   (its-defrule  "i "    "\e$AR;\e(B")
221   (its-defrule  "j "    "\e$A>M\e(B")
222   (its-defrule  "k "    "\e$A?I\e(B")
223   (its-defrule  "l "    "\e$AAK\e(B")
224   (its-defrule  "m "    "\e$AC?\e(B")
225   (its-defrule  "n "    "\e$ADj\e(B")
226   (its-defrule  "p "    "\e$AEz\e(B")
227   (its-defrule  "q "    "\e$AH%\e(B")
228   (its-defrule  "r "    "\e$AHU\e(B")
229   (its-defrule  "s "    "\e$AJG\e(B")
230   (its-defrule  "sh "   "\e$AIO\e(B")
231   (its-defrule  "t "    "\e$AK{\e(B")
232   (its-defrule  "w "    "\e$ANR\e(B")
233   (its-defrule  "x "    "\e$AOr\e(B")
234   (its-defrule  "y "    "\e$ASV\e(B")
235   (its-defrule  "z "    "\e$ATZ\e(B")
236   (its-defrule  "zh "   "\e$AWE\e(B")
237
238   (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")
239                    ("4" . "\e$A#4\e(B")  ("5" . "\e$A#5\e(B")  ("6" . "\e$A#6\e(B")  ("7" . "\e$A#7\e(B")
240                    ("8" . "\e$A#8\e(B")  ("9" . "\e$A#9\e(B")
241                    (" " . "\e$A!!\e(B")  ("!" . "\e$A#!\e(B")  ("@" . "\e$A#@\e(B")  ("#" . "\e$A##\e(B")
242                    ("$" . "\e$A!g\e(B")  ("%" . "\e$A#%\e(B")  ("^" . "\e$A#^\e(B")  ("&" . "\e$A#&\e(B")
243                    ("*" . "\e$A#*\e(B")  ("(" . "\e$A#(\e(B")  (")" . "\e$A#)\e(B")
244                    ("-" . "\e$A#-\e(B")  ("=" . "\e$A#=\e(B")  ("`" . "\e$A#`\e(B")  ("\\" . "\e$A#\\e(B")
245                    ("|" . "\e$A#|\e(B")  ("_" . "\e$A#_\e(B")  ("+" . "\e$A#+\e(B")  ("~" . "\e$A!+\e(B")
246                    ("[" . "\e$A#[\e(B")  ("]" . "\e$A#]\e(B")  ("{" . "\e$A#{\e(B")  ("}" . "\e$A#}\e(B")
247                    (":" . "\e$A#:\e(B")  (";" . "\e$A#;\e(B")  ("\"" . "\e$A#"\e(B") ("'" . "\e$A#'\e(B")
248                    ("<" . "\e$A#<\e(B")  (">" . "\e$A#>\e(B")  ("?" . "\e$A#?\e(B")  ("/" . "\e$A#/\e(B")
249                    ("," . "\e$A#,\e(B")  ("." . "\e$A#.\e(B")
250                    ("a" . "\e$A#a\e(B")  ("b" . "\e$A#b\e(B")  ("c" . "\e$A#c\e(B")  ("d" . "\e$A#d\e(B")
251                    ("e" . "\e$A#e\e(B")  ("f" . "\e$A#f\e(B")  ("g" . "\e$A#g\e(B")  ("h" . "\e$A#h\e(B")
252                    ("i" . "\e$A#i\e(B")  ("j" . "\e$A#j\e(B")  ("k" . "\e$A#k\e(B")  ("l" . "\e$A#l\e(B")
253                    ("m" . "\e$A#m\e(B")  ("n" . "\e$A#n\e(B")  ("o" . "\e$A#o\e(B")  ("p" . "\e$A#p\e(B")
254                    ("q" . "\e$A#q\e(B")  ("r" . "\e$A#r\e(B")  ("s" . "\e$A#s\e(B")  ("t" . "\e$A#t\e(B")
255                    ("u" . "\e$A#u\e(B")  ("v" . "\e$A#v\e(B")  ("w" . "\e$A#w\e(B")  ("x" . "\e$A#x\e(B")
256                    ("y" . "\e$A#y\e(B")  ("z" . "\e$A#z\e(B")
257                    ("A" . "\e$A#A\e(B")  ("B" . "\e$A#B\e(B")  ("C" . "\e$A#C\e(B")  ("D" . "\e$A#D\e(B")
258                    ("E" . "\e$A#E\e(B")  ("F" . "\e$A#F\e(B")  ("G" . "\e$A#G\e(B")  ("H" . "\e$A#H\e(B")
259                    ("I" . "\e$A#I\e(B")  ("J" . "\e$A#J\e(B")  ("K" . "\e$A#K\e(B")  ("L" . "\e$A#L\e(B")
260                    ("M" . "\e$A#M\e(B")  ("N" . "\e$A#N\e(B")  ("O" . "\e$A#O\e(B")  ("P" . "\e$A#P\e(B")
261                    ("Q" . "\e$A#Q\e(B")  ("R" . "\e$A#R\e(B")  ("S" . "\e$A#S\e(B")  ("T" . "\e$A#T\e(B")
262                    ("U" . "\e$A#U\e(B")  ("V" . "\e$A#V\e(B")  ("W" . "\e$A#W\e(B")  ("X" . "\e$A#X\e(B")
263                    ("Y" . "\e$A#Y\e(B")  ("Z" . "\e$A#Z\e(B")))
264     (let ((in (car ascii)) (out (cdr ascii)))
265       (its-defrule (concat its-banjiao-escape in) in)
266       (its-defrule (concat its-quanjiao-escape in) out)))
267
268   (its-defrule  ","     "\e$A#,\e(B")
269   (its-defrule  "."     "\e$A!#\e(B")
270   (its-defrule  "/"     "\e$A!"\e(B")
271   (its-defrule  ":"     "\e$A#:\e(B")
272   (its-defrule  ";"     "\e$A#;\e(B")
273   (its-defrule  "?"     "\e$A#?\e(B")
274   (its-defrule  "!"     "\e$A#!\e(B"))
275
276 (define-its-state-machine its-pinyin-tw-map
277   "pinyin-tw" "\e$(GQ;\e(BC" Chinese-CNS
278   "Map for Pinyin input."
279
280   (defconst its-quanjiao-escape "Z")
281   (defconst its-banjiao-escape  "X")
282
283   (its-defrule-select-mode-temporally "B" downcase)
284   (its-defrule-select-mode-temporally "Q" quanjiao-downcase-tw)
285
286   (its-define-pinyin-table)
287   (its-defrule  "b "    "\e$(GDb\e(B")
288   (its-defrule  "c "    "\e$(GD_\e(B")
289   (its-defrule  "ch "   "\e$(GEx\e(B")
290   (its-defrule  "d "    "\e$(GN{\e(B")
291   (its-defrule  "f "    "\e$(GE0\e(B")
292   (its-defrule  "g "    "\e$(GT6\e(B")
293   (its-defrule  "h "    "\e$(GLO\e(B")
294   (its-defrule  "i "    "\e$(GD!\e(B")
295   (its-defrule  "j "    "\e$(G^s\e(B")
296   (its-defrule  "k "    "\e$(GF+\e(B")
297   (its-defrule  "l "    "\e$(GD'\e(B")
298   (its-defrule  "m "    "\e$(GJd\e(B")
299   (its-defrule  "n "    "\e$(GH!\e(B")
300   (its-defrule  "p "    "\e$(GJG\e(B")
301   (its-defrule  "q "    "\e$(GF*\e(B")
302   (its-defrule  "r "    "\e$(GEJ\e(B")
303   (its-defrule  "s "    "\e$(GQR\e(B")
304   (its-defrule  "sh "   "\e$(GD8\e(B")
305   (its-defrule  "t "    "\e$(GEl\e(B")
306   (its-defrule  "w "    "\e$(GJ<\e(B")
307   (its-defrule  "x "    "\e$(GGW\e(B")
308   (its-defrule  "y "    "\e$(GD4\e(B")
309   (its-defrule  "z "    "\e$(GGc\e(B")
310   (its-defrule  "zh "   "\e$(Gaa\e(B")
311
312   (dolist (ascii '(("0" . "\e$(G$!\e(B")  ("1" . "\e$(G$"\e(B")  ("2" . "\e$(G$#\e(B")  ("3" . "\e$(G$$\e(B")
313                    ("4" . "\e$(G$%\e(B")  ("5" . "\e$(G$&\e(B")  ("6" . "\e$(G$'\e(B")  ("7" . "\e$(G$(\e(B")
314                    ("8" . "\e$(G$)\e(B")  ("9" . "\e$(G$*\e(B")
315                    (" " . "\e$(G!!\e(B")  ("!" . "\e$(G!*\e(B")  ("@" . "\e$(G"i\e(B")  ("#" . "\e$(G!l\e(B")
316                    ("$" . "\e$(G"c\e(B")  ("%" . "\e$(G"h\e(B")  ("^" . "\e$(G!T\e(B")  ("&" . "\e$(G!m\e(B")
317                    ("*" . "\e$(G!n\e(B")  ("(" . "\e$(G!>\e(B")  (")" . "\e$(G!?\e(B")
318                    ("-" . "\e$(G"1\e(B")  ("=" . "\e$(G"8\e(B")  ("`" . "\e$(G!j\e(B")  ("\\" . "\e$(G"`\e(B")
319                    ("|" . "\e$(G"^\e(B")  ("_" . "\e$(G"%\e(B")  ("+" . "\e$(G"0\e(B")  ("~" . "\e$(G"D\e(B")
320                    ("[" . "\e$(G!b\e(B")  ("]" . "\e$(G!c\e(B")  ("{" . "\e$(G!B\e(B")  ("}" . "\e$(G!C\e(B")
321                    (":" . "\e$(G!(\e(B")  (";" . "\e$(G!'\e(B")  ("\"" . "\e$(G!i\e(B") ("'" . "\e$(G!k\e(B")
322                    ("<" . "\e$(G"6\e(B")  (">" . "\e$(G"7\e(B")  ("?" . "\e$(G!)\e(B")  ("/" . "\e$(G"_\e(B")
323                    ("," . "\e$(G!"\e(B")  ("." . "\e$(G!%\e(B")
324                    ("a" . "\e$(G$[\e(B")  ("b" . "\e$(G$\\e(B")  ("c" . "\e$(G$]\e(B")  ("d" . "\e$(G$^\e(B")
325                    ("e" . "\e$(G$_\e(B")  ("f" . "\e$(G$`\e(B")  ("g" . "\e$(G$a\e(B")  ("h" . "\e$(G$b\e(B")
326                    ("i" . "\e$(G$c\e(B")  ("j" . "\e$(G$d\e(B")  ("k" . "\e$(G$e\e(B")  ("l" . "\e$(G$f\e(B")
327                    ("m" . "\e$(G$g\e(B")  ("n" . "\e$(G$h\e(B")  ("o" . "\e$(G$i\e(B")  ("p" . "\e$(G$j\e(B")
328                    ("q" . "\e$(G$k\e(B")  ("r" . "\e$(G$l\e(B")  ("s" . "\e$(G$m\e(B")  ("t" . "\e$(G$n\e(B")
329                    ("u" . "\e$(G$o\e(B")  ("v" . "\e$(G$p\e(B")  ("w" . "\e$(G$q\e(B")  ("x" . "\e$(G$r\e(B")
330                    ("y" . "\e$(G$s\e(B")  ("z" . "\e$(G$t\e(B")
331                    ("A" . "\e$(G$A\e(B")  ("B" . "\e$(G$B\e(B")  ("C" . "\e$(G$C\e(B")  ("D" . "\e$(G$D\e(B")
332                    ("E" . "\e$(G$E\e(B")  ("F" . "\e$(G$F\e(B")  ("G" . "\e$(G$G\e(B")  ("H" . "\e$(G$H\e(B")
333                    ("I" . "\e$(G$I\e(B")  ("J" . "\e$(G$J\e(B")  ("K" . "\e$(G$K\e(B")  ("L" . "\e$(G$L\e(B")
334                    ("M" . "\e$(G$M\e(B")  ("N" . "\e$(G$N\e(B")  ("O" . "\e$(G$O\e(B")  ("P" . "\e$(G$P\e(B")
335                    ("Q" . "\e$(G$Q\e(B")  ("R" . "\e$(G$R\e(B")  ("S" . "\e$(G$S\e(B")  ("T" . "\e$(G$T\e(B")
336                    ("U" . "\e$(G$U\e(B")  ("V" . "\e$(G$V\e(B")  ("W" . "\e$(G$W\e(B")  ("X" . "\e$(G$X\e(B")
337                    ("Y" . "\e$(G$Y\e(B")  ("Z" . "\e$(G$Z\e(B")))
338     (let ((in (car ascii)) (out (cdr ascii)))
339       (its-defrule (concat its-banjiao-escape in) in)
340       (its-defrule (concat its-quanjiao-escape in) out)))
341
342   (its-defrule  ","     "\e$(G!"\e(B")
343   (its-defrule  "."     "\e$(G!$\e(B")
344   (its-defrule  "/"     "\e$(G!#\e(B")
345   (its-defrule  ":"     "\e$(G!(\e(B")
346   (its-defrule  ";"     "\e$(G!'\e(B")
347   (its-defrule  "?"     "\e$(G!)\e(B")
348   (its-defrule  "!"     "\e$(G!*\e(B"))
349
350 (define-its-state-machine-append its-pinyin-cn-map
351   (its-defrule "[" its-pinyin-cn-open-braket)
352   (its-defrule "]" its-pinyin-cn-close-braket)
353
354   (if its-pinyin-cn-enable-quanjioao-alphabet
355       (progn
356         (its-defrule "1"  "\e$A#1\e(B")  (its-defrule "2"  "\e$A#2\e(B")
357         (its-defrule "3"  "\e$A#3\e(B")  (its-defrule "4"  "\e$A#4\e(B")
358         (its-defrule "5"  "\e$A#5\e(B")  (its-defrule "6"  "\e$A#6\e(B")
359         (its-defrule "7"  "\e$A#7\e(B")  (its-defrule "8"  "\e$A#8\e(B")
360         (its-defrule "9"  "\e$A#9\e(B")  (its-defrule "0"  "\e$A#0\e(B")
361         (its-defrule "@"  "\e$A#@\e(B")
362         (its-defrule "#"  "\e$A##\e(B")  (its-defrule "$"  "\e$A!g\e(B")
363         (its-defrule "%"  "\e$A#%\e(B")  (its-defrule "^"  "\e$A#^\e(B")
364         (its-defrule "&"  "\e$A#&\e(B")  (its-defrule "*"  "\e$A#*\e(B")
365         (its-defrule "("  "\e$A#(\e(B")  (its-defrule ")"  "\e$A#)\e(B")
366         (its-defrule "-"  "\e$A#-\e(B")  (its-defrule "~"  "\e$A!+\e(B")
367         (its-defrule "="  "\e$A#=\e(B")  (its-defrule "`"  "\e$A#`\e(B")
368         (its-defrule "\\" "\e$A#\\e(B")  (its-defrule "|"  "\e$A#|\e(B")
369         (its-defrule "_"  "\e$A#_\e(B")  (its-defrule "+"  "\e$A#+\e(B")
370         (its-defrule "{"  "\e$A#{\e(B")  (its-defrule "}"  "\e$A#}\e(B")
371         (its-defrule "\"" "\e$A#"\e(B")  (its-defrule "'"  "\e$A#'\e(B")
372         (its-defrule "<"  "\e$A#<\e(B")  (its-defrule ">"  "\e$A#>\e(B"))
373     (progn
374       (its-defrule "1"  "1")  (its-defrule "2"  "2")
375       (its-defrule "3"  "3")  (its-defrule "4"  "4")
376       (its-defrule "5"  "5")  (its-defrule "6"  "6")
377       (its-defrule "7"  "7")  (its-defrule "8"  "8")
378       (its-defrule "9"  "9")  (its-defrule "0"  "0")
379       (its-defrule "@"  "@")
380       (its-defrule "#"  "#")  (its-defrule "$"  "$")
381       (its-defrule "%"  "%")  (its-defrule "^"  "^")
382       (its-defrule "&"  "&")  (its-defrule "*"  "*")
383       (its-defrule "("  "(")  (its-defrule ")"  ")")
384       (its-defrule "-"  "-")  (its-defrule "~"  "~")
385       (its-defrule "="  "=")  (its-defrule "`"  "`")
386       (its-defrule "\\" "\\") (its-defrule "|"  "|")
387       (its-defrule "_"  "_")  (its-defrule "+"  "+")
388       (its-defrule "{"  "{")  (its-defrule "}"  "}")
389       (its-defrule "\"" "\"") (its-defrule "'"  "'")
390       (its-defrule "<"  "<")  (its-defrule ">"  ">"))))
391
392 (define-its-state-machine-append its-pinyin-tw-map
393   (its-defrule "[" its-pinyin-tw-open-braket)
394   (its-defrule "]" its-pinyin-tw-close-braket)
395
396   (if its-pinyin-tw-enable-quanjioao-alphabet
397       (progn
398         (its-defrule "1"  "\e$(G$"\e(B")  (its-defrule "2"  "\e$(G$#\e(B")
399         (its-defrule "3"  "\e$(G$$\e(B")  (its-defrule "4"  "\e$(G$%\e(B")
400         (its-defrule "5"  "\e$(G$&\e(B")  (its-defrule "6"  "\e$(G$'\e(B")
401         (its-defrule "7"  "\e$(G$(\e(B")  (its-defrule "8"  "\e$(G$)\e(B")
402         (its-defrule "9"  "\e$(G$*\e(B")  (its-defrule "0"  "\e$(G$!\e(B")
403         (its-defrule "@"  "\e$(G"i\e(B")
404         (its-defrule "#"  "\e$(G!l\e(B")  (its-defrule "$"  "\e$(G"c\e(B")
405         (its-defrule "%"  "\e$(G"h\e(B")  (its-defrule "^"  "\e$(G!T\e(B")
406         (its-defrule "&"  "\e$(G!m\e(B")  (its-defrule "*"  "\e$(G!n\e(B")
407         (its-defrule "("  "\e$(G!>\e(B")  (its-defrule ")"  "\e$(G!?\e(B")
408         (its-defrule "-"  "\e$(G"1\e(B")  (its-defrule "~"  "\e$(G"D\e(B")
409         (its-defrule "="  "\e$(G"8\e(B")  (its-defrule "`"  "\e$(G!j\e(B")
410         (its-defrule "\\" "\e$(G"b\e(B")  (its-defrule "|"  "\e$(G"^\e(B")
411         (its-defrule "_"  "\e$(G"%\e(B")  (its-defrule "+"  "\e$(G"0\e(B")
412         (its-defrule "{"  "\e$(G!B\e(B")  (its-defrule "}"  "\e$(G!C\e(B")
413         (its-defrule "\"" "\e$(G!i\e(B")  (its-defrule "'"  "\e$(G!k\e(B")
414         (its-defrule "<"  "\e$(G"6\e(B")  (its-defrule ">"  "\e$(G"7\e(B"))
415     (progn
416       (its-defrule "1"  "1")  (its-defrule "2"  "2")
417       (its-defrule "3"  "3")  (its-defrule "4"  "4")
418       (its-defrule "5"  "5")  (its-defrule "6"  "6")
419       (its-defrule "7"  "7")  (its-defrule "8"  "8")
420       (its-defrule "9"  "9")  (its-defrule "0"  "0")
421       (its-defrule "@"  "@")
422       (its-defrule "#"  "#")  (its-defrule "$"  "$")
423       (its-defrule "%"  "%")  (its-defrule "^"  "^")
424       (its-defrule "&"  "&")  (its-defrule "*"  "*")
425       (its-defrule "("  "(")  (its-defrule ")"  ")")
426       (its-defrule "-"  "-")  (its-defrule "~"  "~")
427       (its-defrule "="  "=")  (its-defrule "`"  "`")
428       (its-defrule "\\" "\\") (its-defrule "|"  "|")
429       (its-defrule "_"  "_")  (its-defrule "+"  "+")
430       (its-defrule "{"  "{")  (its-defrule "}"  "}")
431       (its-defrule "\"" "\"") (its-defrule "'"  "'")
432       (its-defrule "<"  "<")  (its-defrule ">"  ">"))))
433
434 (provide 'its/pinyin)