980314 version
authorkate <kate>
Sat, 14 Mar 1998 09:36:41 +0000 (09:36 +0000)
committerkate <kate>
Sat, 14 Mar 1998 09:36:41 +0000 (09:36 +0000)
21 files changed:
egg-cnv.el
egg-com.el
egg-hilit.el [new file with mode: 0644]
egg-mlh.el
egg.el
egg/sj3.el
egg/sj3rpc.el
egg/wnn.el
its-keydef.el
its.el
its/ascii.el [new file with mode: 0644]
its/erpin.el [new file with mode: 0644]
its/hangul.el
its/hankata.el [new file with mode: 0644]
its/hira.el
its/jeonkak.el [new file with mode: 0644]
its/kata.el [new file with mode: 0644]
its/pinyin.el
its/quanjiao.el [new file with mode: 0644]
its/zenkaku.el [new file with mode: 0644]
its/zhuyin.el [new file with mode: 0644]

index 92c7593..b85cd04 100644 (file)
 
 ;;; Code:
 
+(defvar egg-current-language)
+(make-variable-buffer-local 'egg-current-language)
+(put 'egg-current-language 'permanent-local t)
+
 (defsubst egg-bunsetsu-info () 'intangible)
 
 (defun egg-get-bunsetsu-info (p)
-  (let ((info (get-text-property p (egg-bunsetsu-info))))
-    (cond
-     ((consp info)
-      (setq egg-conversion-backend (car info))
-      (cdr info)))))
+  (let ((bunsetsu-info (get-text-property p (egg-bunsetsu-info))))
+    (if bunsetsu-info
+       (setq egg-conversion-backend (get-text-property p 'egg-backend)
+             egg-current-language (get-text-property p 'egg-lang)))
+    bunsetsu-info))
 ;;
 
+(defconst egg-conversion-backend-other-languages
+  [ egg-init-other-languages
+
+        egg-start-conversion-other-languages
+      egg-get-bunsetsu-converted-other-languages
+      egg-get-bunsetsu-source-other-languages
+      egg-list-candidates-other-languages
+          egg-get-number-of-candidates-other-languages
+          egg-get-current-candidate-number-other-languages
+          egg-get-all-candidates-other-languages
+          egg-decide-candidate-other-languages
+      egg-change-bunsetsu-length-other-languages
+    egg-end-conversion-other-languages
+    nil
+
+    egg-fini-other-languages
+ ])
+
+(defun egg-init-other-languages ()
+  )
+
+(defun egg-start-conversion-other-languages (yomi-string language)
+  (list yomi-string))
+(defun egg-get-bunsetsu-converted-other-languages (bunsetsu-info)
+  bunsetsu-info)
+(defun egg-get-bunsetsu-source-other-languages (bunsetsu-info)
+  bunsetsu-info)
+(defun egg-list-candidates-other-languages (bunsetsu-info prev-bunsetsu-info)
+  1)
+(defun egg-get-number-of-candidates-other-languages (bunsetsu-info)
+  1)
+(defun egg-get-current-candidate-number-other-languages (bunsetsu-info)
+  0)
+(defun egg-get-all-candidates-other-languages (bunsetsu-info)
+  (list bunsetsu-info))
+(defun egg-decide-candidate-other-languages (bunsetsu-info candidate-pos)
+  bunsetsu-info)
+(defun egg-change-bunsetsu-length-other-languages (b0 b1 b2 len)
+  (let ((s (concat b1 b2)))
+    (set-text-properties 0 (length s) nil s)
+    (if (= len (length s))
+       (list s)
+      (list (substring s 0 len) (substring s len)))))
+(defun egg-end-conversion-other-languages (bunsetsu-info-list)
+  nil)
+(defun egg-fini-other-languages (language)
+  nil)
+
 (defvar egg-conversion-backend-alist nil)
 (make-variable-buffer-local 'egg-conversion-backend-alist)
 (defvar egg-conversion-backend nil)
 (defvar egg-finalize-backend-alist nil)
 
 (defun egg-set-current-backend (language)
-  (let ((backend (assoc lang  egg-conversion-backend-alist)))
-    (if (null backend)
-       (error "%S is not supported" lang)
-      (setq egg-conversion-backend (cdr backend)))))
+  (setq egg-conversion-backend
+       (cdr (assoc language egg-conversion-backend-alist)))
+  (if (null egg-conversion-backend)
+      (setq egg-conversion-backend egg-conversion-backend-other-languages)))
 
 (defun egg-initialize-backend (language)
   (egg-set-current-backend language)
   (funcall (aref egg-conversion-backend 9) b0 b1 b2 len))
 (defun egg-end-conversion (bunsetsu-info-list)
   (funcall (aref egg-conversion-backend 10) bunsetsu-info-list))
+(defun egg-start-reverse-conversion (yomi-string language)
+  (egg-set-current-backend language)
+  (if (aref egg-conversion-backend 11)
+      (funcall (aref egg-conversion-backend 11) yomi-string language)
+    (beep)))
 
 (defun egg-finalize-backend ()
   (let ((alist egg-finalize-backend-alist))
       (funcall (car (car (car alist))) (cdr (car (car alist))))
       (setq alist (cdr alist)))))
 
-(defmacro egg-set-conversion-backend-internal (backend langs &optional force)
-  `(let ((l ,langs) pair)
-     (while l
-       (setq pair (assoc (car l) egg-conversion-backend-alist))
-       (if (null pair)
-          (setq egg-conversion-backend-alist 
-                (cons (cons (car l) ,backend)
-                      egg-conversion-backend-alist))
-        ,(if force `(setcdr pair ,backend)))
-       (setq pair (cons (aref ,backend 11) (car l)))
-       (if (null (assoc pair egg-finalize-backend-alist))
-          (setq egg-finalize-backend-alist
-                (cons (list pair) egg-finalize-backend-alist)))
-       (setq l (cdr l)))))
-
-(defun egg-set-conversion-backend (backend curent-langs other-langs)
-  (egg-set-conversion-backend-internal backend curent-langs t)
-  (egg-set-conversion-backend-internal backend other-langs))
+(defun egg-set-conversion-backend (backend langs &optional force)
+  (let (pair)
+    (if backend
+       (setq egg-conversion-backend backend)
+      (setq backend egg-conversion-backend))
+    (while langs
+      (setq pair (assoc (car langs) egg-conversion-backend-alist))
+      (cond
+       ((null pair)
+       (setq egg-conversion-backend-alist
+             (cons (cons (car langs) backend) egg-conversion-backend-alist)))
+       (force
+       (setcdr pair backend)))
+      (setq pair (cons (aref backend (1- (length backend))) (car langs)))
+      (if (null (assoc pair egg-finalize-backend-alist))
+         (setq egg-finalize-backend-alist
+               (cons (list pair) egg-finalize-backend-alist)))
+      (setq langs (cdr langs)))))
 \f
-(defvar egg-conversion-open "|")
-(defvar egg-conversion-close "|")
+(defvar egg-conversion-open  "|"  "*\e$B%U%'%s%9$N;OE@$r<($9J8;zNs\e(B (1 \e$BJ8;z0J>e\e(B)")
+(defvar egg-conversion-close "|"  "*\e$B%U%'%s%9$N=*E@$r<($9J8;zNs\e(B (1 \e$BJ8;z0J>e\e(B)")
+(defvar egg-conversion-face  nil  "*\e$B%U%'%s%9I=<($KMQ$$$k\e(B face \e$B$^$?$O\e(B nil")
 (defvar egg-conversion-separator " ")
 
+(defun egg-get-conversion-face ()
+  (let ((face (and (listp egg-conversion-face)
+                  (or (assoc egg-current-language egg-conversion-face)
+                      (assoc t egg-conversion-face)))))
+    (if face (cdr face) egg-conversion-face)))
+
 ;;
 (defun egg-convert-region (start end)
   (interactive "r")
-  (let (bunsetsu-info-list lang contin p s e)
-    (save-restriction
-      (narrow-to-region start end)
-      (goto-char start)
-      (insert egg-conversion-open)
-      (add-text-properties start (point)
+  (if (>= start end)
+      ;; nothing to do
+      nil
+    (remove-text-properties start end '(read-only nil intangible nil))
+    (goto-char start)
+    (insert egg-conversion-open)
+    (let ((inhibit-read-only t)
+         (max (make-marker))
+         bunsetsu-info-list contin p s e result)
+      (setq p (+ (point) (- end start)))
+      (set-text-properties start (point)
                           (list
+                           'read-only t
                            'egg-start t
-                           'egg-source (buffer-substring (point)
-                                                         (point-max))))
+                           'egg-source (buffer-substring (point) p)))
       (if egg-conversion-face
-          (put-text-property start (point) 'invisible t))
+         (put-text-property start (point) 'invisible t))
       (setq start (point))
-      (egg-separate-languages start (point-max))
+      (goto-char p)
+      (insert egg-conversion-close)
+      (set-text-properties p (point) '(read-only t rear-nonsticky t egg-end t))
+      (if egg-conversion-face
+         (put-text-property p (point) 'invisible t))
+      (set-marker max p)
+      (egg-separate-languages start max)
       (goto-char start)
-      (while (< (point) (point-max))
-       (setq lang (get-text-property (point) 'egg-lang)
+      (while (< (point) max)
+       (setq egg-current-language (get-text-property (point) 'egg-lang)
              s (point)
              e (point))
-        (while (and (< e (point-max))
-                    (equal lang (get-text-property e 'egg-lang)))
-          (setq e (next-single-property-change e 'egg-lang nil (point-max))))
-       (setq bunsetsu-info-list
-             (egg-start-conversion (buffer-substring s e) lang))
-       (setq contin (< e (point-max)))
+       (while (and (< e max)
+                   (equal egg-current-language
+                          (get-text-property e 'egg-lang)))
+         (setq e (next-single-property-change e 'egg-lang nil max)))
+       (condition-case result
+           (setq bunsetsu-info-list
+                 (egg-start-conversion
+                  (buffer-substring-no-properties s e)
+                  egg-current-language))
+         (error
+          (setq egg-conversion-backend egg-conversion-backend-other-languages
+                bunsetsu-info-list (egg-start-conversion-other-languages
+                                    (buffer-substring-no-properties s e)
+                                    egg-current-language))
+          (message "egg %s backend: %s" egg-current-language (cadr result))))
+       (setq contin (< e max))
        (delete-region s e)
        (egg-insert-bunsetsu-list bunsetsu-info-list
-                                 (if (< (point) (point-max)) 'contine t))))
-    (setq p (point))
-    (insert egg-conversion-close)
-    (put-text-property p (point) 'egg-end t)
-    (if egg-conversion-face
-       (put-text-property p (point) 'invisible t))
-    (goto-char start)))
+                                 (if (< (point) max) 'contine t)))
+      (set-marker max nil)
+      (goto-char start))))
 
-(defun egg-separate-languages (start end)
-  (let (lang last-lang last-chinese p l c cset)
+(defun egg-separate-languages (start end &optional use-context)
+  (let (lang last-lang last-chinese p pe l c cset)
     ;; 1st pass -- mark undefined Chinese part
     (goto-char start)
+    (and use-context
+        (setq last-lang (get-text-property (1- (point)) 'egg-lang))
+        (or (equal last-lang "Chinese-GB") (equal last-lang "Chinese-CNS"))
+        (setq last-chinese last-lang))
     (while (< (point) end)
-      (setq p (next-single-property-change (point) 'its-lang nil end))
+      (setq p (point)
+           pe (next-single-property-change (point) 'egg-lang nil end))
       (cond
-       ((get-text-property (point) 'its-lang)
-       (goto-char p))
-       ((setq l (egg-chinese-syllable (buffer-substring (point) p)))
-       (setq p (point))
-       (goto-char (+ (point) l))
-       (put-text-property p (point) 'its-lang "Chinese"))
+       ((get-text-property (point) 'egg-lang)
+       (goto-char pe)
+       (setq lang nil))
+       ((setq l (egg-chinese-syllable (buffer-substring p pe)))
+       (goto-char (+ p l))
+       (setq lang "Chinese"))
        ((progn
          (setq c (following-char)
                cset (char-charset c))
          (eq cset 'chinese-sisheng))
-       (setq p (point))
        (forward-char)
-       (put-text-property p (point) 'its-lang "Chinese"))
+       (setq lang "Chinese"))
        ((eq cset 'ascii)
-       (forward-char))
-       (t
-       (setq p (point))
+       (skip-chars-forward "\0-\177" pe)
+       (if (eq (char-charset (following-char)) 'chinese-sisheng)
+           (goto-char (max (1+ pp) (- (point) 6))))
+       (setq lang nil))
+       ((eq cset 'composition)
        (forward-char)
-       (put-text-property p (point) 'its-lang (egg-char-to-language c)))))
+       (setq lang (egg-charset-to-language
+                   (char-charset (car (decompose-composite-char c 'list))))))
+       (t
+       (skip-chars-forward (concat (vector (make-char cset 33 33))
+                                   "-"
+                                   (vector (make-char cset 127 127)))
+                           pe)
+       (setq lang (egg-charset-to-language cset))))
+      (if lang
+         (put-text-property p (point) 'egg-lang lang)))
     ;; 2nd pass -- set language property
     (goto-char start)
     (while (< (point) end)
-      (setq lang (get-text-property (point) 'its-lang))
+      (setq lang (get-text-property (point) 'egg-lang))
       (cond
        ((null lang)
        (setq lang (or last-lang
       (if (or (equal lang "Chinese-GB") (equal lang "Chinese-CNS"))
          (setq last-chinese lang))
       (setq p (point))
-      (goto-char (next-single-property-change (point) 'its-lang nil end))
+      (goto-char (next-single-property-change (point) 'egg-lang nil end))
       (set-text-properties p (point) (list 'egg-lang lang)))))
 
-(defun egg-char-to-language (c)
-  (let ((charset (char-charset c))
-       (list language-info-alist))
+(defun egg-charset-to-language (charset)
+  (let ((list language-info-alist))
     (while (and list
                (null (memq charset (assq 'charset (car list)))))
       (setq list (cdr list)))
     (car (car list))))
 
 (defun egg-next-part-lang (end)
-  (let* ((p (next-single-property-change (point) 'its-lang nil end))
-        (lang (get-text-property p 'its-lang)))
+  (let* ((p (next-single-property-change (point) 'egg-lang nil end))
+        (lang (get-text-property p 'egg-lang)))
     (if (equal lang "Chinese")
        (egg-next-chinese-lang end)
       (or lang
   (let (p lang)
     (setq p (point))
     (while (and (< p end) (null lang))
-      (setq p (next-single-property-change p 'its-lang nil end))
-      (setq lang (get-text-property p 'its-lang))
+      (setq p (next-single-property-change p 'egg-lang nil end))
+      (setq lang (get-text-property p 'egg-lang))
       (if (null (or (equal lang "Chinese-GB")
                    (equal lang "Chinese-CNS")))
          (setq lang nil)))
       egg-default-language)
      (t "Chinese-GB"))))
 \f
-(defvar egg-conversion-face nil)
+(require 'its-keydef)
+
 (defvar egg-conversion-map
   (let ((map (make-sparse-keymap))
        (i 33))
     (define-key map "\C-n"   'egg-next-candidate)
     (define-key map "\C-o"   'egg-enlarge-bunsetsu)
     (define-key map "\C-p"   'egg-previous-candidate)
+    (define-key map "\C-r"   'egg-reverse-convert-bunsetu)
+    (define-key map "\M-r"   'egg-reconvert-bunsetsu)
     (define-key map "\M-s"   'egg-select-candidate)
     (define-key map [return] 'egg-exit-conversion)
-;;    (define-key map "\C-\\"  'egg-exit-mode-no-egg)
     (define-key map [right]  'egg-forward-bunsetsu)
     (define-key map [left]   'egg-backward-bunsetsu)
     (define-key map " "      'egg-next-candidate)
-    (define-key map "/"      'egg-exit-conversion)
+    (its-define-select-keys map)
     map)
   "Keymap for EGG Conversion mode.")
 
 
 (defun egg-insert-bunsetsu (bunsetsu-info last)
   (let ((bunsetsu (egg-get-bunsetsu-converted bunsetsu-info))
-       (p (point)))
+       (p (point)) p1)
     (insert bunsetsu)
+    (setq p1 (point))
     (if (null (eq last t))
        (insert egg-conversion-separator))
-    (add-text-properties p (point)
-                        (list 'face      egg-conversion-face
-                              'local-map egg-conversion-map
-                              (egg-bunsetsu-info) (cons egg-conversion-backend
-                                                        bunsetsu-info)
-                              'egg-bunsetsu-last last))))
+    (set-text-properties p (point)
+                        (list 'read-only          t
+                              (egg-bunsetsu-info) bunsetsu-info
+                              'egg-backend        egg-conversion-backend
+                              'egg-lang           egg-current-language
+                              'egg-bunsetsu-last  last
+                              'local-map          egg-conversion-map))
+    (if egg-conversion-face
+       (put-text-property p p1 'face (egg-get-conversion-face)))))
 
 (defun egg-insert-bunsetsu-list (bunsetsu-info-list &optional last)
   (let ((l bunsetsu-info-list)
-       bunsetsu-info bunsetsu p)
+       bunsetsu-info)
     (while l
       (setq bunsetsu-info (car l)
-           l (cdr l)
-           p (point))
+           l (cdr l))
       (egg-insert-bunsetsu bunsetsu-info (and (null l) last)))))
 
+(defun egg-beginning-of-conversion-buffer (n)
+  (interactive "p")
+  (cond
+   ((<= n 0)
+    (egg-end-of-conversion-buffer 1))
+   ((null (get-text-property (1- (point)) 'egg-start))
+    (goto-char (previous-single-property-change (1- (point)) 'egg-start)))))
+
+(defun egg-end-of-conversion-buffer(n)
+  (interactive "p")
+  (cond
+   ((<= n 0)
+    (egg-beginning-of-conversion-buffer 1))
+   (t
+    (goto-char (next-single-property-change (point) 'egg-end))
+    (backward-char))))
+
 (defun egg-backward-bunsetsu (n)
   (interactive "p")
   (let (start)
 
 (defun egg-enlarge-bunsetsu (n)
   (interactive "p")
-  (let* ((b0 (egg-get-previous-bunsetsu (point)))
+  (let* ((inhibit-read-only t)
+        (b0 (egg-get-previous-bunsetsu (point)))
         (b1 (egg-get-bunsetsu-info (point)))
         (s1 (egg-get-bunsetsu-source b1))
         (s1len (egg-separate-characters s1))
 
 (defun egg-next-candidate (n)
   (interactive "p")
-  (let ((last (get-text-property (point) 'egg-bunsetsu-last))
+  (let ((inhibit-read-only t)
+       (last (get-text-property (point) 'egg-bunsetsu-last))
        (b (egg-get-bunsetsu-info (point)))
        new i max+ p beep)
     (setq max+ (egg-get-number-of-candidates b))
          (setq max+ (egg-get-number-of-candidates b)))
       (setq i (egg-get-current-candidate-number b))
       (setq i (+ n i)))
-    (if (< i 0)                                ; go backward as if it is ring
-       (while (< i 0)
-         (setq i (+ i max+))))
-    (if (>= i max+)                    ; don't go forward 
-       (setq i (1- max+)
-             beep t))
-    (setq new (egg-decide-candidate b i))
-    (setq p (point))
-    (delete-region p (progn (forward-char) (point)))
-    (egg-insert-bunsetsu new last)
-    (goto-char p)
+    (if (null max+)
+       (setq beep t)
+      (if (< i 0)                      ; go backward as if it is ring
+         (while (< i 0)
+           (setq i (+ i max+))))
+      (if (>= i max+)                  ; don't go forward 
+         (setq i (1- max+)
+               beep t))
+      (setq new (egg-decide-candidate b i))
+      (setq p (point))
+      (delete-region p (progn (forward-char) (point)))
+      (egg-insert-bunsetsu new last)
+      (goto-char p))
     (if beep
        (ding))))
 
   (interactive "p")
   (egg-next-candidate (- n)))
 
-;; Bogus function 980220
-(defun egg-decide-bunsetsu (&optional end-marker)
-  (let ((in-loop t)
-       p bunsetsu-info-list bl)
-    (setq p (point))
-    (while in-loop
-      (let ((bl1 (cons (egg-get-bunsetsu-info p) nil)))
-       (if bl
-           (setq bl (setcdr bl bl1))
-         (setq bunsetsu-info-list (setq bl bl1))))
-      (forward-char)
-      (remove-text-properties p (point) '(face nil
-                                         intangible nil
-                                         local-map nil
-                                         egg-bunsetsu-last nil))
-      (setq p (point))
-      (if (or (and end-marker (= p end-marker))
-             (get-text-property p 'egg-end))
-         (setq in-loop nil)
-       (setq p (1- p))
-       (delete-region p (1+ p))))      ; Delete bunsetsu separator
-    bunsetsu-info-list))
+(defun egg-reconvert-bunsetsu-internal (n func)
+  (let ((inhibit-read-only t)
+       (p (point))
+       source last bunsetsu-list)
+    (if (<= n 0)
+       (beep)
+      (while (and (null last) (> n 0))
+       (setq source (concat source
+                            (egg-get-bunsetsu-converted
+                             (egg-get-bunsetsu-info (point))))
+             last (get-text-property (point) 'egg-bunsetsu-last)
+             n (1- n))
+       (forward-char))
+      (cond
+       ((> n 0)
+       (beep))
+       ((setq bunsetsu-list (funcall func source egg-current-language))
+       (delete-region p (point))
+       (egg-insert-bunsetsu-list bunsetsu-list (if (eq last t) t 'contine))
+       (goto-char p)
+       (if (egg-get-previous-bunsetsu p)
+           (progn
+             (backward-char)
+             (put-text-property (point) p 'egg-bunsetsu-last 'contine)
+             (forward-char))))))))
+
+(defun egg-reverse-convert-bunsetu (n)
+  (interactive "p")
+  (egg-reconvert-bunsetsu-internal n 'egg-start-reverse-conversion))
+
+(defun egg-reconvert-bunsetsu (n)
+  (interactive "p")
+  (egg-reconvert-bunsetsu-internal n 'egg-start-conversion))
 
 (defun egg-decide-before-point ()
   (interactive)
-  (let (bunsetsu-list bl (p (point)) source (dlen 0) l s)
+  (let ((inhibit-read-only t)
+       (len (length egg-conversion-open))
+       bunsetsu-list bl (p (point)) source lang s)
     (save-restriction
       (if (null (get-text-property (1- (point)) 'egg-start))
          (goto-char (previous-single-property-change (point) 'egg-start)))
-      (narrow-to-region (1- (point)) p)
-      (setq source (get-text-property (1- (point)) 'egg-source))
+      (narrow-to-region (- (point) len) p)
       (setq bunsetsu-list (setq bl (list nil)))
       (while (< (point) (point-max))
        ;; delete sparator/open marker
-       (delete-region (1- (point)) (point))
-       (setq bl (setcdr bl (list (egg-get-bunsetsu-info (point)))))
-       (setq dlen (+ dlen (length (egg-get-bunsetsu-source (car bl)))))
+       (delete-region (- (point) len) (point))
+       (setq len 1
+             bl (setcdr bl (list (egg-get-bunsetsu-info (point)))))
        (if (get-text-property (point) 'egg-bunsetsu-last)
            (progn
              (egg-end-conversion (cdr bunsetsu-list))
              (setq bunsetsu-list (setq bl (list nil)))))
        (setq p (point))
        (forward-char)
-       (remove-text-properties p (point) '(face nil
-                                                intangible nil
-                                                local-map nil
-                                                egg-bunsetsu-last nil))))
+       (set-text-properties p (point) nil)))
+    (if (cdr bunsetsu-list)
+       (egg-end-conversion (cdr bunsetsu-list)))
     (if (get-text-property (point) 'egg-end)
        (progn
          ;; delete close marker
-         (delete-region (point) (1+ (point)))
+         (delete-region (point) (+ (point) (length egg-conversion-close)))
          (egg-do-auto-fill)
          (run-hooks 'input-method-after-insert-chunk-hook))
-      ;; delete last from speparater to close marker
-      (delete-region (1- (point))
-                    (1+ (next-single-property-change (point) 'egg-end)))
-      ;; rebuild fence mode string
-      (setq p 0)
-      (while (< p dlen)
-       (setq s (car (get-text-property p 'its-syl source))
-             l (length s)
-             p (+ p l))
-       (if (> p dlen)
-           (put-text-property dlen p
-                              'its-syl (list (substring s (- dlen p)))
-                              source)))
-      (its-restart (substring source dlen)))))
+      ;; delete from last speparater
+      (delete-region (1- (point)) (point))
+      (setq source "")
+      (while (null (get-text-property (point) 'egg-end))
+       (setq s (egg-get-bunsetsu-source (egg-get-bunsetsu-info (point))))
+       (put-text-property 0 (length s) 'egg-lang egg-current-language s)
+       (setq source (concat source s))
+       (setq p (point))
+       (forward-char)
+       (delete-region p (point)))
+      ;; delete close marker
+      (delete-region (point) (+ (point) (length egg-conversion-close)))
+      (its-restart source t))))
 
 (defun egg-exit-conversion ()
   (interactive)
 
 (defun egg-abort-conversion ()
   (interactive)
-  (if (null (get-text-property (1- (point)) 'egg-start))
-      (goto-char (previous-single-property-change (point) 'egg-start)))
-  (egg-decide-before-point))
+  (let ((inhibit-read-only t) source)
+    (goto-char (- (if (get-text-property (1- (point)) 'egg-start)
+                     (point)
+                   (previous-single-property-change (point) 'egg-start))
+                 (length egg-conversion-open)))
+    (setq source (get-text-property (point) 'egg-source))
+    (delete-region (point) (+ (next-single-property-change (point) 'egg-end)
+                             (length egg-conversion-close)))
+    (its-restart source)))
 
 (defun egg-select-candidate ()
   (interactive)
-  (let ((last (get-text-property (point) 'egg-bunsetsu-last))
+  (let ((inhibit-read-only t)
+       (last (get-text-property (point) 'egg-bunsetsu-last))
        (b (egg-get-bunsetsu-info (point)))
        (in-loop t)
        new i max+ p)
          (setq i (egg-list-candidates b prev-b))
          (setq max+ (egg-get-number-of-candidates b)))
       (setq i (egg-get-current-candidate-number b)))
-    (let* ((candidate-list (egg-get-all-candidates b))
-          (l candidate-list)
-          (candidate (menudiag-select (list 'menu "\e$B8uJd\e(B:" l) (list (nth i l)))))
-      (setq i 0)
-      (while in-loop
-       (if (eq candidate (car l))
-           (setq in-loop nil)
-         (setq l (cdr l)
-               i (1+ i))))
-      (setq new (egg-decide-candidate b i))
-      (setq p (point))
-      (delete-region p (progn (forward-char) (point)))
-      (egg-insert-bunsetsu new last)
-      (goto-char p))))
+    (let (candidate-list candidate l)
+      (if (null max+)
+         ;; fake 1 candidate
+         (menudiag-select (list 'menu "\e$B8uJd\e(B:"
+                                (list (egg-get-bunsetsu-converted b))
+                                (list (egg-get-bunsetsu-converted b))))
+       (setq candidate-list (egg-get-all-candidates b)
+             l candidate-list
+             candidate (menudiag-select (list 'menu "\e$B8uJd\e(B:" l)
+                                        (list (nth i l))))
+       (setq i 0)
+       (while in-loop
+         (if (eq candidate (car l))
+             (setq in-loop nil)
+           (setq l (cdr l)
+                 i (1+ i))))
+       (setq new (egg-decide-candidate b i))
+       (setq p (point))
+       (delete-region p (progn (forward-char) (point)))
+       (egg-insert-bunsetsu new last)
+       (goto-char p)))))
 
 (provide 'egg-cnv)
 ;;; egg-cnv.el ends here.
index a15ba79..d9a97fe 100644 (file)
     ("X" . 20) ("Y" . 21) ("Z"  . 22) ("Zh" . 23)))
 
 (defconst yincode-pinyin-yunmu
-  '(("\9a À"      0 0) ("\9a À"      0 1) ("\9a À"      0 3) ("\9a À"      0 5) ("\9a À"      0 7)
-    ("a\9a À"     1 0) ("\9a ¡\9a À"     1 1) ("\9a ¢\9a À"     1 3) ("\9a £\9a À"     1 5) ("\9a ¤\9a À"     1 7)
-    ("ai\9a À"    2 0) ("\9a ¡i\9a À"    2 1) ("\9a ¢i\9a À"    2 3) ("\9a £i\9a À"    2 5) ("\9a ¤i\9a À"    2 7)
-    ("an\9a À"    3 0) ("\9a ¡n\9a À"    3 1) ("\9a ¢n\9a À"    3 3) ("\9a £n\9a À"    3 5) ("\9a ¤n\9a À"    3 7)
-    ("ang\9a À"   4 0) ("\9a ¡ng\9a À"   4 1) ("\9a ¢ng\9a À"   4 3) ("\9a £ng\9a À"   4 5) ("\9a ¤ng\9a À"   4 7)
-    ("ao\9a À"    5 0) ("\9a ¡o\9a À"    5 1) ("\9a ¢o\9a À"    5 3) ("\9a £o\9a À"    5 5) ("\9a ¤o\9a À"    5 7)
-    ("e\9a À"     6 0) ("\9a ¥\9a À"     6 1) ("\9a ¦\9a À"     6 3) ("\9a §\9a À"     6 5) ("\9a ¨\9a À"     6 7)
-    ("ei\9a À"    7 0) ("\9a ¥i\9a À"    7 1) ("\9a ¦i\9a À"    7 3) ("\9a §i\9a À"    7 5) ("\9a ¨i\9a À"    7 7)
-    ("en\9a À"    8 0) ("\9a ¥n\9a À"    8 1) ("\9a ¦n\9a À"    8 3) ("\9a §n\9a À"    8 5) ("\9a ¨n\9a À"    8 7)
-    ("eng\9a À"   9 0) ("\9a ¥ng\9a À"   9 1) ("\9a ¦ng\9a À"   9 3) ("\9a §ng\9a À"   9 5) ("\9a ¨ng\9a À"   9 7)
-    ("er\9a À"   10 0) ("\9a ¥r\9a À"   10 1) ("\9a ¦r\9a À"   10 3) ("\9a §r\9a À"   10 5) ("\9a ¨r\9a À"   10 7)
-    ("i\9a À"    11 0) ("\9a ©\9a À"    11 1) ("\9a ª\9a À"    11 3) ("\9a «\9a À"    11 5) ("\9a ¬\9a À"    11 7)
-    ("ia\9a À"   12 0) ("i\9a ¡\9a À"   12 1) ("i\9a ¢\9a À"   12 3) ("i\9a £\9a À"   12 5) ("i\9a ¤\9a À"   12 7)
-    ("ian\9a À"  13 0) ("i\9a ¡n\9a À"  13 1) ("i\9a ¢n\9a À"  13 3) ("i\9a £n\9a À"  13 5) ("i\9a ¤n\9a À"  13 7)
-    ("iang\9a À" 14 0) ("i\9a ¡ng\9a À" 14 1) ("i\9a ¢ng\9a À" 14 3) ("i\9a £ng\9a À" 14 5) ("i\9a ¤ng\9a À" 14 7)
-    ("iao\9a À"  15 0) ("i\9a ¡o\9a À"  15 1) ("i\9a ¢o\9a À"  15 3) ("i\9a £o\9a À"  15 5) ("i\9a ¤o\9a À"  15 7)
-    ("ie\9a À"   16 0) ("i\9a ¥\9a À"   16 1) ("i\9a ¦\9a À"   16 3) ("i\9a §\9a À"   16 5) ("i\9a ¨\9a À"   16 7)
-    ("in\9a À"   17 0) ("\9a ©n\9a À"   17 1) ("\9a ªn\9a À"   17 3) ("\9a «n\9a À"   17 5) ("\9a ¬n\9a À"   17 7)
-    ("ing\9a À"  18 0) ("\9a ©ng\9a À"  18 1) ("\9a ªng\9a À"  18 3) ("\9a «ng\9a À"  18 5) ("\9a ¬ng\9a À"  18 7)
-    ("iong\9a À" 19 0) ("i\9a ­ng\9a À" 19 1) ("i\9a ®ng\9a À" 19 3) ("i\9a ¯ng\9a À" 19 5) ("i\9a °ng\9a À" 19 7)
-    ("iu\9a À"   20 0) ("i\9a ±\9a À"   20 1) ("i\9a ²\9a À"   20 3) ("i\9a ³\9a À"   20 5) ("i\9a ´\9a À"   20 7)
-    ("m\9a À"    21 0) ("m\9a À"    21 1) ("m\9a À"    21 3) ("m\9a À"    21 5) ("m\9a À"    21 7)
-    ("n\9a À"    22 0) ("n\9a À"    22 1) ("\9a ½\9a À"    22 3) ("\9a ¾\9a À"    22 5) ("\9a ¿\9a À"    22 7)
-    ("ng\9a À"   23 0) ("ng\9a À"   23 1) ("ng\9a À"   23 3) ("ng\9a À"   23 5) ("ng\9a À"   23 7)
-    ("o\9a À"    24 0) ("\9a ­\9a À"    24 1) ("\9a ®\9a À"    24 3) ("\9a ¯\9a À"    24 5) ("\9a °\9a À"    24 7)
-    ("ong\9a À"  25 0) ("\9a ­ng\9a À"  25 1) ("\9a ®ng\9a À"  25 3) ("\9a ¯ng\9a À"  25 5) ("\9a °ng\9a À"  25 7)
-    ("ou\9a À"   26 0) ("\9a ­u\9a À"   26 1) ("\9a ®u\9a À"   26 3) ("\9a ¯u\9a À"   26 5) ("\9a °u\9a À"   26 7)
-    ("u\9a À"    27 0) ("\9a ±\9a À"    27 1) ("\9a ²\9a À"    27 3) ("\9a ³\9a À"    27 5) ("\9a ´\9a À"    27 7)
-    ("ua\9a À"   28 0) ("u\9a ¡\9a À"   28 1) ("u\9a ¢\9a À"   28 3) ("u\9a £\9a À"   28 5) ("u\9a ¤\9a À"   28 7)
-    ("uai\9a À"  29 0) ("u\9a ¡i\9a À"  29 1) ("u\9a ¢i\9a À"  29 3) ("u\9a £i\9a À"  29 5) ("u\9a ¤i\9a À"  29 7)
-    ("uan\9a À"  30 0) ("u\9a ¡n\9a À"  30 1) ("u\9a ¢n\9a À"  30 3) ("u\9a £n\9a À"  30 5) ("u\9a ¤n\9a À"  30 7)
-    ("uang\9a À" 31 0) ("u\9a ¡ng\9a À" 31 1) ("u\9a ¢ng\9a À" 31 3) ("u\9a £ng\9a À" 31 5) ("u\9a ¤ng\9a À" 31 7)
-    ("ue\9a À"   32 0) ("u\9a ¥\9a À"   32 1) ("u\9a ¦\9a À"   32 3) ("u\9a §\9a À"   32 5) ("u\9a ¨\9a À"   32 7)
-    ("ui\9a À"   33 0) ("u\9a ©\9a À"   33 1) ("u\9a ª\9a À"   33 3) ("u\9a «\9a À"   33 5) ("u\9a ¬\9a À"   33 7)
-    ("un\9a À"   34 0) ("\9a ±n\9a À"   34 1) ("\9a ²n\9a À"   34 3) ("\9a ³n\9a À"   34 5) ("\9a ´n\9a À"   34 7)
-    ("uo\9a À"   35 0) ("u\9a ­\9a À"   35 1) ("u\9a ®\9a À"   35 3) ("u\9a ¯\9a À"   35 5) ("u\9a °\9a À"   35 7)
-    ("\9a ¹\9a À"    36 0) ("\9a µ\9a À"    36 1) ("\9a ¶\9a À"    36 3) ("\9a ·\9a À"    36 5) ("\9a ¸\9a À"    36 7)
-    ("\9a ¹e\9a À"   37 0) ("\9a ¹\9a ¥\9a À"   37 1) ("\9a ¹\9a ¦\9a À"   37 3) ("\9a ¹\9a §\9a À"   37 5) ("\9a ¹\9a ¨\9a À"   37 7)
-    ("0\9a À"    38 0) ("1\9a À"    38 1) ("2\9a À"    38 3) ("3\9a À"    38 5) ("4\9a À"    38 7)))
+  '(("\e(0@\e(B"      0 0) ("\e(0@\e(B"      0 1) ("\e(0@\e(B"      0 3) ("\e(0@\e(B"      0 5) ("\e(0@\e(B"      0 7)
+    ("a\e(0@\e(B"     1 0) ("\e(0!@\e(B"     1 1) ("\e(0"@\e(B"     1 3) ("\e(0#@\e(B"     1 5) ("\e(0$@\e(B"     1 7)
+    ("ai\e(0@\e(B"    2 0) ("\e(0!\e(Bi\e(0@\e(B"    2 1) ("\e(0"\e(Bi\e(0@\e(B"    2 3) ("\e(0#\e(Bi\e(0@\e(B"    2 5) ("\e(0$\e(Bi\e(0@\e(B"    2 7)
+    ("an\e(0@\e(B"    3 0) ("\e(0!\e(Bn\e(0@\e(B"    3 1) ("\e(0"\e(Bn\e(0@\e(B"    3 3) ("\e(0#\e(Bn\e(0@\e(B"    3 5) ("\e(0$\e(Bn\e(0@\e(B"    3 7)
+    ("ang\e(0@\e(B"   4 0) ("\e(0!\e(Bng\e(0@\e(B"   4 1) ("\e(0"\e(Bng\e(0@\e(B"   4 3) ("\e(0#\e(Bng\e(0@\e(B"   4 5) ("\e(0$\e(Bng\e(0@\e(B"   4 7)
+    ("ao\e(0@\e(B"    5 0) ("\e(0!\e(Bo\e(0@\e(B"    5 1) ("\e(0"\e(Bo\e(0@\e(B"    5 3) ("\e(0#\e(Bo\e(0@\e(B"    5 5) ("\e(0$\e(Bo\e(0@\e(B"    5 7)
+    ("e\e(0@\e(B"     6 0) ("\e(0%@\e(B"     6 1) ("\e(0&@\e(B"     6 3) ("\e(0'@\e(B"     6 5) ("\e(0(@\e(B"     6 7)
+    ("ei\e(0@\e(B"    7 0) ("\e(0%\e(Bi\e(0@\e(B"    7 1) ("\e(0&\e(Bi\e(0@\e(B"    7 3) ("\e(0'\e(Bi\e(0@\e(B"    7 5) ("\e(0(\e(Bi\e(0@\e(B"    7 7)
+    ("en\e(0@\e(B"    8 0) ("\e(0%\e(Bn\e(0@\e(B"    8 1) ("\e(0&\e(Bn\e(0@\e(B"    8 3) ("\e(0'\e(Bn\e(0@\e(B"    8 5) ("\e(0(\e(Bn\e(0@\e(B"    8 7)
+    ("eng\e(0@\e(B"   9 0) ("\e(0%\e(Bng\e(0@\e(B"   9 1) ("\e(0&\e(Bng\e(0@\e(B"   9 3) ("\e(0'\e(Bng\e(0@\e(B"   9 5) ("\e(0(\e(Bng\e(0@\e(B"   9 7)
+    ("er\e(0@\e(B"   10 0) ("\e(0%\e(Br\e(0@\e(B"   10 1) ("\e(0&\e(Br\e(0@\e(B"   10 3) ("\e(0'\e(Br\e(0@\e(B"   10 5) ("\e(0(\e(Br\e(0@\e(B"   10 7)
+    ("i\e(0@\e(B"    11 0) ("\e(0)@\e(B"    11 1) ("\e(0*@\e(B"    11 3) ("\e(0+@\e(B"    11 5) ("\e(0,@\e(B"    11 7)
+    ("ia\e(0@\e(B"   12 0) ("i\e(0!@\e(B"   12 1) ("i\e(0"@\e(B"   12 3) ("i\e(0#@\e(B"   12 5) ("i\e(0$@\e(B"   12 7)
+    ("ian\e(0@\e(B"  13 0) ("i\e(0!\e(Bn\e(0@\e(B"  13 1) ("i\e(0"\e(Bn\e(0@\e(B"  13 3) ("i\e(0#\e(Bn\e(0@\e(B"  13 5) ("i\e(0$\e(Bn\e(0@\e(B"  13 7)
+    ("iang\e(0@\e(B" 14 0) ("i\e(0!\e(Bng\e(0@\e(B" 14 1) ("i\e(0"\e(Bng\e(0@\e(B" 14 3) ("i\e(0#\e(Bng\e(0@\e(B" 14 5) ("i\e(0$\e(Bng\e(0@\e(B" 14 7)
+    ("iao\e(0@\e(B"  15 0) ("i\e(0!\e(Bo\e(0@\e(B"  15 1) ("i\e(0"\e(Bo\e(0@\e(B"  15 3) ("i\e(0#\e(Bo\e(0@\e(B"  15 5) ("i\e(0$\e(Bo\e(0@\e(B"  15 7)
+    ("ie\e(0@\e(B"   16 0) ("i\e(0%@\e(B"   16 1) ("i\e(0&@\e(B"   16 3) ("i\e(0'@\e(B"   16 5) ("i\e(0(@\e(B"   16 7)
+    ("in\e(0@\e(B"   17 0) ("\e(0)\e(Bn\e(0@\e(B"   17 1) ("\e(0*\e(Bn\e(0@\e(B"   17 3) ("\e(0+\e(Bn\e(0@\e(B"   17 5) ("\e(0,\e(Bn\e(0@\e(B"   17 7)
+    ("ing\e(0@\e(B"  18 0) ("\e(0)\e(Bng\e(0@\e(B"  18 1) ("\e(0*\e(Bng\e(0@\e(B"  18 3) ("\e(0+\e(Bng\e(0@\e(B"  18 5) ("\e(0,\e(Bng\e(0@\e(B"  18 7)
+    ("iong\e(0@\e(B" 19 0) ("i\e(0-\e(Bng\e(0@\e(B" 19 1) ("i\e(0.\e(Bng\e(0@\e(B" 19 3) ("i\e(0/\e(Bng\e(0@\e(B" 19 5) ("i\e(00\e(Bng\e(0@\e(B" 19 7)
+    ("iu\e(0@\e(B"   20 0) ("i\e(01@\e(B"   20 1) ("i\e(02@\e(B"   20 3) ("i\e(03@\e(B"   20 5) ("i\e(04@\e(B"   20 7)
+    ("m\e(0@\e(B"    21 0) ("m\e(0@\e(B"    21 1) ("m\e(0@\e(B"    21 3) ("m\e(0@\e(B"    21 5) ("m\e(0@\e(B"    21 7)
+    ("n\e(0@\e(B"    22 0) ("n\e(0@\e(B"    22 1) ("\e(0=@\e(B"    22 3) ("\e(0>@\e(B"    22 5) ("\e(0?@\e(B"    22 7)
+    ("ng\e(0@\e(B"   23 0) ("ng\e(0@\e(B"   23 1) ("ng\e(0@\e(B"   23 3) ("ng\e(0@\e(B"   23 5) ("ng\e(0@\e(B"   23 7)
+    ("o\e(0@\e(B"    24 0) ("\e(0-@\e(B"    24 1) ("\e(0.@\e(B"    24 3) ("\e(0/@\e(B"    24 5) ("\e(00@\e(B"    24 7)
+    ("ong\e(0@\e(B"  25 0) ("\e(0-\e(Bng\e(0@\e(B"  25 1) ("\e(0.\e(Bng\e(0@\e(B"  25 3) ("\e(0/\e(Bng\e(0@\e(B"  25 5) ("\e(00\e(Bng\e(0@\e(B"  25 7)
+    ("ou\e(0@\e(B"   26 0) ("\e(0-\e(Bu\e(0@\e(B"   26 1) ("\e(0.\e(Bu\e(0@\e(B"   26 3) ("\e(0/\e(Bu\e(0@\e(B"   26 5) ("\e(00\e(Bu\e(0@\e(B"   26 7)
+    ("u\e(0@\e(B"    27 0) ("\e(01@\e(B"    27 1) ("\e(02@\e(B"    27 3) ("\e(03@\e(B"    27 5) ("\e(04@\e(B"    27 7)
+    ("ua\e(0@\e(B"   28 0) ("u\e(0!@\e(B"   28 1) ("u\e(0"@\e(B"   28 3) ("u\e(0#@\e(B"   28 5) ("u\e(0$@\e(B"   28 7)
+    ("uai\e(0@\e(B"  29 0) ("u\e(0!\e(Bi\e(0@\e(B"  29 1) ("u\e(0"\e(Bi\e(0@\e(B"  29 3) ("u\e(0#\e(Bi\e(0@\e(B"  29 5) ("u\e(0$\e(Bi\e(0@\e(B"  29 7)
+    ("uan\e(0@\e(B"  30 0) ("u\e(0!\e(Bn\e(0@\e(B"  30 1) ("u\e(0"\e(Bn\e(0@\e(B"  30 3) ("u\e(0#\e(Bn\e(0@\e(B"  30 5) ("u\e(0$\e(Bn\e(0@\e(B"  30 7)
+    ("uang\e(0@\e(B" 31 0) ("u\e(0!\e(Bng\e(0@\e(B" 31 1) ("u\e(0"\e(Bng\e(0@\e(B" 31 3) ("u\e(0#\e(Bng\e(0@\e(B" 31 5) ("u\e(0$\e(Bng\e(0@\e(B" 31 7)
+    ("ue\e(0@\e(B"   32 0) ("u\e(0%@\e(B"   32 1) ("u\e(0&@\e(B"   32 3) ("u\e(0'@\e(B"   32 5) ("u\e(0(@\e(B"   32 7)
+    ("ui\e(0@\e(B"   33 0) ("u\e(0)@\e(B"   33 1) ("u\e(0*@\e(B"   33 3) ("u\e(0+@\e(B"   33 5) ("u\e(0,@\e(B"   33 7)
+    ("un\e(0@\e(B"   34 0) ("\e(01\e(Bn\e(0@\e(B"   34 1) ("\e(02\e(Bn\e(0@\e(B"   34 3) ("\e(03\e(Bn\e(0@\e(B"   34 5) ("\e(04\e(Bn\e(0@\e(B"   34 7)
+    ("uo\e(0@\e(B"   35 0) ("u\e(0-@\e(B"   35 1) ("u\e(0.@\e(B"   35 3) ("u\e(0/@\e(B"   35 5) ("u\e(00@\e(B"   35 7)
+    ("\e(09@\e(B"    36 0) ("\e(05@\e(B"    36 1) ("\e(06@\e(B"    36 3) ("\e(07@\e(B"    36 5) ("\e(08@\e(B"    36 7)
+    ("\e(09\e(Be\e(0@\e(B"   37 0) ("\e(09%@\e(B"   37 1) ("\e(09&@\e(B"   37 3) ("\e(09'@\e(B"   37 5) ("\e(09(@\e(B"   37 7)
+    ("0\e(0@\e(B"    38 0) ("1\e(0@\e(B"    38 1) ("2\e(0@\e(B"    38 3) ("3\e(0@\e(B"    38 5) ("4\e(0@\e(B"    38 7)))
 
 (defconst yincode-pinyin-table
   [
    ])
 
 (defconst yincode-zhuyin-shengmu
-  '((""  .  0) ("\9a Å" .  1) ("\9a Ø" .  2) ("\9a Ô" .  3) ("\9a É" .  4)
-    ("\9a È" .  5) ("\9a Í" .  6) ("\9a Ï" .  7) ("\9a Ð" .  8) ("\9a Î" .  9)
-    ("\9a Ì" . 10) ("\9a Ç" . 11) ("\9a Ë" . 12) ("\9a Æ" . 13) ("\9a Ñ" . 14)
-    ("\9a Ö" . 15) ("\9a Ù" . 16) ("\9a Õ" . 17) ("\9a Ê" . 18) ("\9a è" . 19)
-    ("\9a Ò" . 20) ("\9a ç" . 21) ("\9a ×" . 22) ("\9a Ó" . 23)))
+  '((""  .  0) ("\e(0E\e(B" .  1) ("\e(0X\e(B" .  2) ("\e(0T\e(B" .  3) ("\e(0I\e(B" .  4)
+    ("\e(0H\e(B" .  5) ("\e(0M\e(B" .  6) ("\e(0O\e(B" .  7) ("\e(0P\e(B" .  8) ("\e(0N\e(B" .  9)
+    ("\e(0L\e(B" . 10) ("\e(0G\e(B" . 11) ("\e(0K\e(B" . 12) ("\e(0F\e(B" . 13) ("\e(0Q\e(B" . 14)
+    ("\e(0V\e(B" . 15) ("\e(0Y\e(B" . 16) ("\e(0U\e(B" . 17) ("\e(0J\e(B" . 18) ("\e(0h\e(B" . 19)
+    ("\e(0R\e(B" . 20) ("\e(0g\e(B" . 21) ("\e(0W\e(B" . 22) ("\e(0S\e(B" . 23)))
 
 (defconst yincode-zhuyin-yunmu
-  '(("\9a À"    0 0) ("\9a Á"    0 1) ("\9a Â"    0 3) ("\9a Ã"    0 5) ("\9a Ä"    0 7) ; i
-    ("\9a Ú\9a À"   1 0) ("\9a Ú\9a Á"   1 1) ("\9a Ú\9a Â"   1 3) ("\9a Ú\9a Ã"   1 5) ("\9a Ú\9a Ä"   1 7) ; a
-    ("\9a Þ\9a À"   2 0) ("\9a Þ\9a Á"   2 1) ("\9a Þ\9a Â"   2 3) ("\9a Þ\9a Ã"   2 5) ("\9a Þ\9a Ä"   2 7) ; ai
-    ("\9a â\9a À"   3 0) ("\9a â\9a Á"   3 1) ("\9a â\9a Â"   3 3) ("\9a â\9a Ã"   3 5) ("\9a â\9a Ä"   3 7) ; an
-    ("\9a ä\9a À"   4 0) ("\9a ä\9a Á"   4 1) ("\9a ä\9a Â"   4 3) ("\9a ä\9a Ã"   4 5) ("\9a ä\9a Ä"   4 7) ; ang
-    ("\9a à\9a À"   5 0) ("\9a à\9a Á"   5 1) ("\9a à\9a Â"   5 3) ("\9a à\9a Ã"   5 5) ("\9a à\9a Ä"   5 7) ; ao
-    ("\9a Ü\9a À"   6 0) ("\9a Ü\9a Á"   6 1) ("\9a Ü\9a Â"   6 3) ("\9a Ü\9a Ã"   6 5) ("\9a Ü\9a Ä"   6 7) ; e
-    ("\9a ß\9a À"   7 0) ("\9a ß\9a Á"   7 1) ("\9a ß\9a Â"   7 3) ("\9a ß\9a Ã"   7 5) ("\9a ß\9a Ä"   7 7) ; ei
-    ("\9a ã\9a À"   8 0) ("\9a ã\9a Á"   8 1) ("\9a ã\9a Â"   8 3) ("\9a ã\9a Ã"   8 5) ("\9a ã\9a Ä"   8 7) ; en
-    ("\9a å\9a À"   9 0) ("\9a å\9a Á"   9 1) ("\9a å\9a Â"   9 3) ("\9a å\9a Ã"   9 5) ("\9a å\9a Ä"   9 7) ; eng
-    ("\9a æ\9a À"  10 0) ("\9a æ\9a Á"  10 1) ("\9a æ\9a Â"  10 3) ("\9a æ\9a Ã"  10 5) ("\9a æ\9a Ä"  10 7) ; er
-    ("\9a ç\9a À"  11 0) ("\9a ç\9a Á"  11 1) ("\9a ç\9a Â"  11 3) ("\9a ç\9a Ã"  11 5) ("\9a ç\9a Ä"  11 7) ; i
-    ("\9a ç\9a Ú\9a À" 12 0) ("\9a ç\9a Ú\9a Á" 12 1) ("\9a ç\9a Ú\9a Â" 12 3) ("\9a ç\9a Ú\9a Ã" 12 5) ("\9a ç\9a Ú\9a Ä" 12 7) ; ia
-    ("\9a ç\9a â\9a À" 13 0) ("\9a ç\9a â\9a Á" 13 1) ("\9a ç\9a â\9a Â" 13 3) ("\9a ç\9a â\9a Ã" 13 5) ("\9a ç\9a â\9a Ä" 13 7) ; ian
-    ("\9a ç\9a ä\9a À" 14 0) ("\9a ç\9a ä\9a Á" 14 1) ("\9a ç\9a ä\9a Â" 14 3) ("\9a ç\9a ä\9a Ã" 14 5) ("\9a ç\9a ä\9a Ä" 14 7) ; iang
-    ("\9a ç\9a à\9a À" 15 0) ("\9a ç\9a à\9a Á" 15 1) ("\9a ç\9a à\9a Â" 15 3) ("\9a ç\9a à\9a Ã" 15 5) ("\9a ç\9a à\9a Ä" 15 7) ; iao
-    ("\9a ç\9a Ý\9a À" 16 0) ("\9a ç\9a Ý\9a Á" 16 1) ("\9a ç\9a Ý\9a Â" 16 3) ("\9a ç\9a Ý\9a Ã" 16 5) ("\9a ç\9a Ý\9a Ä" 16 7) ; ie
-    ("\9a ç\9a ã\9a À" 17 0) ("\9a ç\9a ã\9a Á" 17 1) ("\9a ç\9a ã\9a Â" 17 3) ("\9a ç\9a ã\9a Ã" 17 5) ("\9a ç\9a ã\9a Ä" 17 7) ; in
-    ("\9a ç\9a å\9a À" 18 0) ("\9a ç\9a å\9a Á" 18 1) ("\9a ç\9a å\9a Â" 18 3) ("\9a ç\9a å\9a Ã" 18 5) ("\9a ç\9a å\9a Ä" 18 7) ; ing
-    ("\9a é\9a å\9a À" 19 0) ("\9a é\9a å\9a Á" 19 1) ("\9a é\9a å\9a Â" 19 3) ("\9a é\9a å\9a Ã" 19 5) ("\9a é\9a å\9a Ä" 19 7) ; iong
-    ("\9a ç\9a á\9a À" 20 0) ("\9a ç\9a á\9a Á" 20 1) ("\9a ç\9a á\9a Â" 20 3) ("\9a ç\9a á\9a Ã" 20 5) ("\9a ç\9a á\9a Ä" 20 7) ; iu
-    ("\9a Ç\9a À"  21 0) ("\9a Ç\9a Á"  21 1) ("\9a Ç\9a Â"  21 3) ("\9a Ç\9a Ã"  21 5) ("\9a Ç\9a Ä"  21 7) ; m
-    ("\9a Ë\9a À"  22 0) ("\9a Ë\9a Á"  22 1) ("\9a Ë\9a Â"  22 3) ("\9a Ë\9a Ã"  22 5) ("\9a Ë\9a Ä"  22 7) ; n
-    ("@\9a À"  23 0) ("@\9a Á"  23 1) ("@\9a Â"  23 3) ("@\9a Ã"  23 5) ("@\9a Ä"  23 7) ; ng
-    ("\9a Û\9a À"  24 0) ("\9a Û\9a Á"  24 1) ("\9a Û\9a Â"  24 3) ("\9a Û\9a Ã"  24 5) ("\9a Û\9a Ä"  24 7) ; o
-    ("\9a è\9a å\9a À" 25 0) ("\9a è\9a å\9a Á" 25 1) ("\9a è\9a å\9a Â" 25 3) ("\9a è\9a å\9a Ã" 25 5) ("\9a è\9a å\9a Ä" 25 7) ; ong
-    ("\9a á\9a À"  26 0) ("\9a á\9a Á"  26 1) ("\9a á\9a Â"  26 3) ("\9a á\9a Ã"  26 5) ("\9a á\9a Ä"  26 7) ; ou
-    ("\9a è\9a À"  27 0) ("\9a è\9a Á"  27 1) ("\9a è\9a Â"  27 3) ("\9a è\9a Ã"  27 5) ("\9a è\9a Ä"  27 7) ; u
-    ("\9a è\9a Ú\9a À" 28 0) ("\9a è\9a Ú\9a Á" 28 1) ("\9a è\9a Ú\9a Â" 28 3) ("\9a è\9a Ú\9a Ã" 28 5) ("\9a è\9a Ú\9a Ä" 28 7) ; ua
-    ("\9a è\9a Þ\9a À" 29 0) ("\9a è\9a Þ\9a Á" 29 1) ("\9a è\9a Þ\9a Â" 29 3) ("\9a è\9a Þ\9a Ã" 29 5) ("\9a è\9a Þ\9a Ä" 29 7) ; uai
-    ("\9a è\9a â\9a À" 30 0) ("\9a è\9a â\9a Á" 30 1) ("\9a è\9a â\9a Â" 30 3) ("\9a è\9a â\9a Ã" 30 5) ("\9a è\9a â\9a Ä" 30 7) ; uan
-    ("\9a è\9a ä\9a À" 31 0) ("\9a è\9a ä\9a Á" 31 1) ("\9a è\9a ä\9a Â" 31 3) ("\9a è\9a ä\9a Ã" 31 5) ("\9a è\9a ä\9a Ä" 31 7) ; uang
-    ("\9a é\9a Ý\9a À" 37 0) ("\9a é\9a Ý\9a Á" 37 1) ("\9a é\9a Ý\9a Â" 37 3) ("\9a é\9a Ý\9a Ã" 37 5) ("\9a é\9a Ý\9a Ä" 37 7) ; ue
-    ("\9a è\9a ß\9a À" 33 0) ("\9a è\9a ß\9a Á" 33 1) ("\9a è\9a ß\9a Â" 33 3) ("\9a è\9a ß\9a Ã" 33 5) ("\9a è\9a ß\9a Ä" 33 7) ; ui
-    ("\9a è\9a ã\9a À" 34 0) ("\9a è\9a ã\9a Á" 34 1) ("\9a è\9a ã\9a Â" 34 3) ("\9a è\9a ã\9a Ã" 34 5) ("\9a è\9a ã\9a Ä" 34 7) ; un
-    ("\9a è\9a Û\9a À" 35 0) ("\9a è\9a Û\9a Á" 35 1) ("\9a è\9a Û\9a Â" 35 3) ("\9a è\9a Û\9a Ã" 35 5) ("\9a è\9a Û\9a Ä" 35 7) ; uo
-    ("\9a é\9a À"  36 0) ("\9a é\9a Á"  36 1) ("\9a é\9a Â"  36 3) ("\9a é\9a Ã"  36 5) ("\9a é\9a Ä"  36 7) ; \9a ¹
-    ("\9a é\9a Ý\9a À" 37 0) ("\9a é\9a Ý\9a Á" 37 1) ("\9a é\9a Ý\9a Â" 37 3) ("\9a é\9a Ý\9a Ã" 37 5) ("\9a é\9a Ý\9a Ä" 37 7) ; \9a ¹e
-    ("0\9a À"  38 0) ("1\9a Á"  38 1) ("2\9a Â"  38 3) ("3\9a Ã"  38 5) ("4\9a Ä"  38 7) ; undefined
-    ("\9a é\9a â\9a À" 39 0) ("\9a é\9a â\9a Á" 39 1) ("\9a é\9a â\9a Â" 39 3) ("\9a é\9a â\9a Ã" 39 5) ("\9a é\9a â\9a Ä" 39 7) ; \9a ¹an
-    ("\9a é\9a ã\9a À" 40 0) ("\9a é\9a ã\9a Á" 40 1) ("\9a é\9a ã\9a Â" 40 3) ("\9a é\9a ã\9a Ã" 40 5) ("\9a é\9a ã\9a Ä" 40 7) ; \9a ¹n
+  '(("\e(0@\e(B"    0 0) ("\e(0A\e(B"    0 1) ("\e(0B\e(B"    0 3) ("\e(0C\e(B"    0 5) ("\e(0D\e(B"    0 7) ; i
+    ("\e(0Z@\e(B"   1 0) ("\e(0ZA\e(B"   1 1) ("\e(0ZB\e(B"   1 3) ("\e(0ZC\e(B"   1 5) ("\e(0ZD\e(B"   1 7) ; a
+    ("\e(0^@\e(B"   2 0) ("\e(0^A\e(B"   2 1) ("\e(0^B\e(B"   2 3) ("\e(0^C\e(B"   2 5) ("\e(0^D\e(B"   2 7) ; ai
+    ("\e(0b@\e(B"   3 0) ("\e(0bA\e(B"   3 1) ("\e(0bB\e(B"   3 3) ("\e(0bC\e(B"   3 5) ("\e(0bD\e(B"   3 7) ; an
+    ("\e(0d@\e(B"   4 0) ("\e(0dA\e(B"   4 1) ("\e(0dB\e(B"   4 3) ("\e(0dC\e(B"   4 5) ("\e(0dD\e(B"   4 7) ; ang
+    ("\e(0`@\e(B"   5 0) ("\e(0`A\e(B"   5 1) ("\e(0`B\e(B"   5 3) ("\e(0`C\e(B"   5 5) ("\e(0`D\e(B"   5 7) ; ao
+    ("\e(0\@\e(B"   6 0) ("\e(0\A\e(B"   6 1) ("\e(0\B\e(B"   6 3) ("\e(0\C\e(B"   6 5) ("\e(0\D\e(B"   6 7) ; e
+    ("\e(0_@\e(B"   7 0) ("\e(0_A\e(B"   7 1) ("\e(0_B\e(B"   7 3) ("\e(0_C\e(B"   7 5) ("\e(0_D\e(B"   7 7) ; ei
+    ("\e(0c@\e(B"   8 0) ("\e(0cA\e(B"   8 1) ("\e(0cB\e(B"   8 3) ("\e(0cC\e(B"   8 5) ("\e(0cD\e(B"   8 7) ; en
+    ("\e(0e@\e(B"   9 0) ("\e(0eA\e(B"   9 1) ("\e(0eB\e(B"   9 3) ("\e(0eC\e(B"   9 5) ("\e(0eD\e(B"   9 7) ; eng
+    ("\e(0f@\e(B"  10 0) ("\e(0fA\e(B"  10 1) ("\e(0fB\e(B"  10 3) ("\e(0fC\e(B"  10 5) ("\e(0fD\e(B"  10 7) ; er
+    ("\e(0g@\e(B"  11 0) ("\e(0gA\e(B"  11 1) ("\e(0gB\e(B"  11 3) ("\e(0gC\e(B"  11 5) ("\e(0gD\e(B"  11 7) ; i
+    ("\e(0gZ@\e(B" 12 0) ("\e(0gZA\e(B" 12 1) ("\e(0gZB\e(B" 12 3) ("\e(0gZC\e(B" 12 5) ("\e(0gZD\e(B" 12 7) ; ia
+    ("\e(0gb@\e(B" 13 0) ("\e(0gbA\e(B" 13 1) ("\e(0gbB\e(B" 13 3) ("\e(0gbC\e(B" 13 5) ("\e(0gbD\e(B" 13 7) ; ian
+    ("\e(0gd@\e(B" 14 0) ("\e(0gdA\e(B" 14 1) ("\e(0gdB\e(B" 14 3) ("\e(0gdC\e(B" 14 5) ("\e(0gdD\e(B" 14 7) ; iang
+    ("\e(0g`@\e(B" 15 0) ("\e(0g`A\e(B" 15 1) ("\e(0g`B\e(B" 15 3) ("\e(0g`C\e(B" 15 5) ("\e(0g`D\e(B" 15 7) ; iao
+    ("\e(0g]@\e(B" 16 0) ("\e(0g]A\e(B" 16 1) ("\e(0g]B\e(B" 16 3) ("\e(0g]C\e(B" 16 5) ("\e(0g]D\e(B" 16 7) ; ie
+    ("\e(0gc@\e(B" 17 0) ("\e(0gcA\e(B" 17 1) ("\e(0gcB\e(B" 17 3) ("\e(0gcC\e(B" 17 5) ("\e(0gcD\e(B" 17 7) ; in
+    ("\e(0ge@\e(B" 18 0) ("\e(0geA\e(B" 18 1) ("\e(0geB\e(B" 18 3) ("\e(0geC\e(B" 18 5) ("\e(0geD\e(B" 18 7) ; ing
+    ("\e(0ie@\e(B" 19 0) ("\e(0ieA\e(B" 19 1) ("\e(0ieB\e(B" 19 3) ("\e(0ieC\e(B" 19 5) ("\e(0ieD\e(B" 19 7) ; iong
+    ("\e(0ga@\e(B" 20 0) ("\e(0gaA\e(B" 20 1) ("\e(0gaB\e(B" 20 3) ("\e(0gaC\e(B" 20 5) ("\e(0gaD\e(B" 20 7) ; iu
+    ("\e(0G@\e(B"  21 0) ("\e(0GA\e(B"  21 1) ("\e(0GB\e(B"  21 3) ("\e(0GC\e(B"  21 5) ("\e(0GD\e(B"  21 7) ; m
+    ("\e(0K@\e(B"  22 0) ("\e(0KA\e(B"  22 1) ("\e(0KB\e(B"  22 3) ("\e(0KC\e(B"  22 5) ("\e(0KD\e(B"  22 7) ; n
+    ("@\e(0@\e(B"  23 0) ("@\e(0A\e(B"  23 1) ("@\e(0B\e(B"  23 3) ("@\e(0C\e(B"  23 5) ("@\e(0D\e(B"  23 7) ; ng
+    ("\e(0[@\e(B"  24 0) ("\e(0[A\e(B"  24 1) ("\e(0[B\e(B"  24 3) ("\e(0[C\e(B"  24 5) ("\e(0[D\e(B"  24 7) ; o
+    ("\e(0he@\e(B" 25 0) ("\e(0heA\e(B" 25 1) ("\e(0heB\e(B" 25 3) ("\e(0heC\e(B" 25 5) ("\e(0heD\e(B" 25 7) ; ong
+    ("\e(0a@\e(B"  26 0) ("\e(0aA\e(B"  26 1) ("\e(0aB\e(B"  26 3) ("\e(0aC\e(B"  26 5) ("\e(0aD\e(B"  26 7) ; ou
+    ("\e(0h@\e(B"  27 0) ("\e(0hA\e(B"  27 1) ("\e(0hB\e(B"  27 3) ("\e(0hC\e(B"  27 5) ("\e(0hD\e(B"  27 7) ; u
+    ("\e(0hZ@\e(B" 28 0) ("\e(0hZA\e(B" 28 1) ("\e(0hZB\e(B" 28 3) ("\e(0hZC\e(B" 28 5) ("\e(0hZD\e(B" 28 7) ; ua
+    ("\e(0h^@\e(B" 29 0) ("\e(0h^A\e(B" 29 1) ("\e(0h^B\e(B" 29 3) ("\e(0h^C\e(B" 29 5) ("\e(0h^D\e(B" 29 7) ; uai
+    ("\e(0hb@\e(B" 30 0) ("\e(0hbA\e(B" 30 1) ("\e(0hbB\e(B" 30 3) ("\e(0hbC\e(B" 30 5) ("\e(0hbD\e(B" 30 7) ; uan
+    ("\e(0hd@\e(B" 31 0) ("\e(0hdA\e(B" 31 1) ("\e(0hdB\e(B" 31 3) ("\e(0hdC\e(B" 31 5) ("\e(0hdD\e(B" 31 7) ; uang
+    ("\e(0i]@\e(B" 37 0) ("\e(0i]A\e(B" 37 1) ("\e(0i]B\e(B" 37 3) ("\e(0i]C\e(B" 37 5) ("\e(0i]D\e(B" 37 7) ; ue
+    ("\e(0h_@\e(B" 33 0) ("\e(0h_A\e(B" 33 1) ("\e(0h_B\e(B" 33 3) ("\e(0h_C\e(B" 33 5) ("\e(0h_D\e(B" 33 7) ; ui
+    ("\e(0hc@\e(B" 34 0) ("\e(0hcA\e(B" 34 1) ("\e(0hcB\e(B" 34 3) ("\e(0hcC\e(B" 34 5) ("\e(0hcD\e(B" 34 7) ; un
+    ("\e(0h[@\e(B" 35 0) ("\e(0h[A\e(B" 35 1) ("\e(0h[B\e(B" 35 3) ("\e(0h[C\e(B" 35 5) ("\e(0h[D\e(B" 35 7) ; uo
+    ("\e(0i@\e(B"  36 0) ("\e(0iA\e(B"  36 1) ("\e(0iB\e(B"  36 3) ("\e(0iC\e(B"  36 5) ("\e(0iD\e(B"  36 7) ; \e(09\e(B
+    ("\e(0i]@\e(B" 37 0) ("\e(0i]A\e(B" 37 1) ("\e(0i]B\e(B" 37 3) ("\e(0i]C\e(B" 37 5) ("\e(0i]D\e(B" 37 7) ; \e(09\e(Be
+    ("0\e(0@\e(B"  38 0) ("1\e(0A\e(B"  38 1) ("2\e(0B\e(B"  38 3) ("3\e(0C\e(B"  38 5) ("4\e(0D\e(B"  38 7) ; undefined
+    ("\e(0ib@\e(B" 39 0) ("\e(0ibA\e(B" 39 1) ("\e(0ibB\e(B" 39 3) ("\e(0ibC\e(B" 39 5) ("\e(0ibD\e(B" 39 7) ; \e(09\e(Ban
+    ("\e(0ic@\e(B" 40 0) ("\e(0icA\e(B" 40 1) ("\e(0icB\e(B" 40 3) ("\e(0icC\e(B" 40 5) ("\e(0icD\e(B" 40 7) ; \e(09\e(Bn
     ))
 
 (defconst yincode-zhuyin-table
 
 (defun egg-pinyin-syllable (str)
   (let (s y end)
-    (if (string-match "^[A-Za-z\9a ¡-\9a ¿]+\9a À" str)
+    (if (string-match "^[A-Za-z\e(0!\e(B-\e(0?\e(B]+\e(0@\e(B" str)
        (progn
          (setq end (match-end 0))
          (cond
 
 (defun egg-zhuyin-syllable (str)
   (let (end s y c z (zhuyin-len (charset-bytes 'chinese-sisheng)))
-    (if (string-match "^[\9a Å-\9a é@0-4]+[\9a À\9a Á\9a Â\9a Ã\9a Ä]" str)
+    (if (string-match "^[\e(0E\e(B-\e(0i\e(B@0-4]+[\e(0@ABCD\e(B]" str)
        (progn
          (setq end (match-end 0)
                c (substring str 0 zhuyin-len)
 
 (defun encode-fixed-euc-china-region (beg end type)
   "Encode the text in the region to EUC-CN/TW."
-  (let (s syl c cset (maxlen (max (length "Zhu\9a ¡ng\9a À") (length "\9a Ó\9a è\9a ä\9a Á"))))
+  (let (s syl c cset (maxlen (max (length "Zhu\e(0!\e(Bng\e(0@\e(B") (length "\e(0ShdA\e(B"))))
     (save-excursion
       (save-restriction
        (narrow-to-region beg end)
diff --git a/egg-hilit.el b/egg-hilit.el
new file mode 100644 (file)
index 0000000..b5568a5
--- /dev/null
@@ -0,0 +1,33 @@
+(defvar        egg-face-color-japanese  "Cyan")
+(defvar        egg-face-color-chinese   "Pink")
+(defvar        egg-face-color-taiwanise "Salmon")
+(defvar        egg-face-color-korean    "Yellow")
+
+(defun egg-set-fg-color (color)
+  (let ((face (make-face (intern (concat "fg:" color)))))
+    (set-face-foreground face color)
+    face))
+
+(defun egg-set-bg-color (color)
+  (let ((face (make-face (intern (concat "bg:" color)))))
+    (set-face-background face color)
+    face))
+
+(defun egg-make-face (color)
+  (list 'underline (egg-set-bg-color color)))
+
+(defconst its-fence-face
+  (and window-system
+       (list (cons "Japanese"    (egg-make-face egg-face-color-japanese))
+            (cons "Chinese-GB"  (egg-make-face egg-face-color-chinese))
+            (cons "Chinese-CNS" (egg-make-face egg-face-color-taiwanise))
+            (cons "Korean"      (egg-make-face egg-face-color-korean))
+            (cons t             'underline))))
+
+(defconst egg-conversion-face
+  (and window-system
+       (list (cons "Japanese"    (egg-make-face egg-face-color-japanese))
+            (cons "Chinese-GB"  (egg-make-face egg-face-color-chinese))
+            (cons "Chinese-CNS" (egg-make-face egg-face-color-taiwanise))
+            (cons "Korean"      (egg-make-face egg-face-color-korean))
+            (cons t             'underline))))
index ee7ffca..a520acf 100644 (file)
@@ -6,6 +6,7 @@
 ;; Project Leader: Satoru Tomura <tomura@etl.go.jp>
 
 ;; Author: NIIBE Yutaka <gniibe@mri.co.jp>
+;;         KATAYAMA Yoshio <kate@pfu.co.jp>      ; Multilingual Enhancement
 ;; Maintainer: NIIBE Yutaka <gniibe@mri.co.jp>
 ;; Keywords: mule, multilingual, input method
 
@@ -38,7 +39,8 @@ Do `mlh-backward-henkan'.  Then, invoke appropriate conversion, if needed.
 Or else, execute command that space-bar invokes usually."
   (interactive)
   (let ((henkan-begin nil)
-        (inhibit-henkan t))
+        (inhibit-henkan t)
+        (its-disable-special-action t))
     (its-select-hiragana)    ;; force to Japanese
     (mlh-backward-henkan)
     (if henkan-begin
diff --git a/egg.el b/egg.el
index 9dd3b40..a88bcf2 100644 (file)
--- a/egg.el
+++ b/egg.el
@@ -58,6 +58,7 @@
     (if (null (string= (car arg) egg-last-method-name))
        (progn
          (funcall (nth 1 arg))
+         (egg-set-conversion-backend nil (list its-current-language) t)
          (setq egg-default-language its-current-language)))
     (setq egg-last-method-name (car arg))
     (use-local-map (if egg-mode-preference
                     (egg-modeless-map)))
     (setq inactivate-current-input-method-function 'egg-mode)
     (setq describe-current-input-method-function 'egg-help)
-    (add-hook 'input-method-activate-hook 'egg-set-mode-line-title)))
-
-(defun egg-set-mode-line-title ()
-  (setq current-input-method-title (its-get-indicator its-current-map))
-  (force-mode-line-update))
-
-(defun egg-check-language (lang)
-  (if (null (member lang egg-support-languages))
-      (error "%S is not supported" lang)))
+    (add-hook 'input-method-activate-hook 'its-set-mode-line-title)))
 
 (defun egg-modefull-map ()
   "Generate modefull keymap for EGG mode."  
index 6f059a7..0342dce 100644 (file)
           sj3-decide-candidate
       sj3-change-bunsetsu-length
     sj3-end-conversion
+    nil
 
     sj3-fini
  ])
 
-(defconst sj3-server-port 3000 "Port number of SJ3 server")
+(defvar sj3-server-port 3000 "Port number of SJ3 server")
 (defvar sj3-stdy-size 0 "STDYSIZE of SJ3 server")
 (defvar sj3-hostname "localhost"
   "Hostname of SJ3 server")
 
-(defun sj3-open (hostname)
+(defvar sj3-open-message)
+
+(defun sj3-open (hostname-list)
   "Establish the connection to SJ3 server.  Return process object."
   (let* ((buf (generate-new-buffer " *SJ3*"))
-        (proc (open-network-stream "SJ3" buf hostname sj3-server-port))
-        result)
-    (process-kill-without-query proc)
-    (set-process-coding-system proc 'no-conversion 'no-conversion)
-    (set-marker-insertion-type (process-mark proc) t)
+        (msg-form "SJ3: connecting to sj3serv at %s...")
+        hostname proc result msg)
     (save-excursion
       (set-buffer buf)
       (erase-buffer)
       (buffer-disable-undo)
       (setq enable-multibyte-characters nil))
-    ;; Initialize dictionaries
-    (setq sj3-sys-dict-list nil)
-    (setq sj3-user-dict-list nil)
-    (setq result (sj3rpc-open proc (system-name) (user-login-name)))
-    (if (< result 0)
-       (let ((msg (sj3rpc-get-error-message (- result))))
-         (delete-process proc)
-         (kill-buffer buf)
-         (error "Can't open SJ3 session (%s): %s" hostname msg)))
-    (setq result (sj3rpc-get-stdy-size proc))
-    (if (< result 0)
-       (let ((msg (sj3rpc-get-error-message (- result))))
-         (delete-process proc)
-         (kill-buffer buf)
-         (error "Can't get SJ3 STDYSIZE: %s"msg)))
-    (setq sj3-stdy-size result)
-    proc))
+    (cond
+     ((null hostname-list)
+      (setq hostname-list '("localhost")))
+     ((null (listp hostname-list))
+      (setq hostname-list (list hostname-list))))
+    (while (and hostname-list (null proc))
+      (setq hostname (car hostname-list)
+           hostname-list (cdr hostname-list))
+      (message msg-form hostname)
+      (sit-for 0)
+      (condition-case result
+         (setq proc (open-network-stream "SJ3" buf hostname sj3-server-port))
+       (error nil))
+      (if proc
+         (progn
+           (process-kill-without-query proc)
+           (set-process-coding-system proc 'no-conversion 'no-conversion)
+           (set-marker-insertion-type (process-mark proc) t)
+           ;; Initialize dictionaries
+           (setq sj3-sys-dict-list nil)
+           (setq sj3-user-dict-list nil)
+           (setq result (sj3rpc-open proc (system-name) (user-login-name)))
+           (if (< result 0)
+               (progn
+                 (delete-process proc)
+                 (setq proc nil
+                       msg (format "Can't open SJ3 session (%s): %s"
+                                   hostname msg)))
+             (setq result (sj3rpc-get-stdy-size proc))
+             (if (< result 0)
+                 (progn
+                   (delete-process proc)
+                   (setq proc nil
+                         msg (format "Can't get SJ3 STDYSIZE: %s"
+                                     (sj3rpc-get-error-message (- result)))))
+               (setq sj3-stdy-size result))))))
+    (if proc
+       (progn
+         (setq sj3-open-message (format (concat msg-form "done") hostname))
+         proc)
+      (kill-buffer buf)
+      (error "%s" (or msg "no sj3serv available")))))
 
 ;; <env> ::= [ <proc> <dictionary-list> ]
 (defvar sj3-environment nil
            (if (< dic-id 0)
                (error "Dame2")         ; XXX
              (setq dict-list (cons dic-id dict-list)
-                   l (cdr l))))))
-       (setq sj3-environment (vector proc dict-list)))))
+                   l (cdr l)))))
+       (message "%s" sj3-open-message)
+       (setq sj3-environment (vector proc dict-list))))))
 
 (defun sj3-init ()
   )
 
-(defun sj3-start-conversion (yomi lang)
+(defun sj3-start-conversion (yomi &optional lang)
   "Convert YOMI string to kanji, and enter conversion mode.
 Return the list of bunsetsu."
   (let ((env (sj3-get-environment)))
@@ -253,8 +279,7 @@ Return the list of bunsetsu."
   "Activate SJ3 backend of Tamagotchy."
   (egg-set-support-languages sj3-support-languages)
   (egg-set-conversion-backend sj3-conversion-backend 
-                             sj3-support-languages
-                             nil)
+                             sj3-support-languages)
   (apply 'egg-mode arg))
 
 ;;; egg/sj3.el ends here.
index c92dbb7..a7eda4c 100644 (file)
          ((eq c 'VERSION)       103)
          (t (error "No such constant")))))
 
+;; XXX
+(defconst sj3rpc-error-message (vector ))
+
 (defun sj3rpc-get-error-message (errno)
-  (or (aref sj3rpc-error-message errno) (format "#%d" errno)))
+  (or (and (>= errno 0)
+          (< errno (length sj3rpc-error-message))
+          (aref sj3rpc-error-message errno))
+      (format "#%d" errno)))
 
 (defmacro sj3rpc-call-with-environment (e vlist send-expr &rest receive-exprs)
   (let ((v (append
index a07977e..22822b3 100644 (file)
@@ -60,6 +60,7 @@
           wnn-decide-candidate
       wnn-change-bunsetsu-length
     wnn-end-conversion
+    wnn-start-reverse-conversion
 
     wnn-fini
  ])
 (defvar wnn-environments nil
   "Environment for WNN kana-kanji conversion")
 
-(defcustom wnn-jserver "localhost" "jserver host" :group 'wnn :type 'string)
-(defcustom wnn-cserver "localhost" "cserver host" :group 'wnn :type 'string)
-(defcustom wnn-tserver "localhost" "tserver host" :group 'wnn :type 'string)
-(defcustom wnn-kserver "localhost" "kserver host" :group 'wnn :type 'string)
+(defcustom wnn-jserver nil "jserver host list" :group 'wnn :type 'string)
+(defcustom wnn-cserver nil "cserver host list" :group 'wnn :type 'string)
+(defcustom wnn-tserver nil "tserver host list" :group 'wnn :type 'string)
+(defcustom wnn-kserver nil "kserver host list" :group 'wnn :type 'string)
+
+(defcustom wnn-jport 22273 "jserver port number" :group 'wnn :type 'integer)
+(defcustom wnn-cport 22289 "cserver port number" :group 'wnn :type 'integer)
+(defcustom wnn-tport 22321 "tserver port number" :group 'wnn :type 'integer)
+(defcustom wnn-kport 22305 "kserver port number" :group 'wnn :type 'integer)
 
 ;; The port number should be initialized from $WNNLIB/serverdefs by wnn-init
 (defconst wnn-server-info-list
-  ;; language      locale  server  port  stream coding-system hostname
-  '(("Japanese"    "ja_JP" jserver 22273 "Wnn"  fixed-euc-jp wnn-jserver)
-    ("Chinese-GB"  "zh_CN" cserver 22289 "cWnn" fixed-euc-cn wnn-cserver)
-    ("Chinese-CNS" "zh_TW" tserver 22321 "tWnn" fixed-euc-tw wnn-tserver)
-    ("Korean"      "ko_KR" kserver 22305 "kWnn" fixed-euc-kr wnn-kserver)))
+  ;; language      locale  server  port     stream coding-system hostname
+  '(("Japanese"    "ja_JP" jserver wnn-jport "Wnn"  fixed-euc-jp wnn-jserver)
+    ("Chinese-GB"  "zh_CN" cserver wnn-cport "cWnn" fixed-euc-cn wnn-cserver)
+    ("Chinese-CNS" "zh_TW" tserver wnn-tport "tWnn" fixed-euc-tw wnn-tserver)
+    ("Korean"      "ko_KR" kserver wnn-kport "kWnn" fixed-euc-kr wnn-kserver)))
 
 (defun wnn-get-server-info (lang)
   (let (info)
   (nth 2 info))
 
 (defsubst wnn-server-port (info)
-  (nth 3 info))
+  (symbol-value (nth 3 info)))
 
 (defsubst wnn-server-stream-name (info)
   (nth 4 info))
@@ -207,6 +213,9 @@ Return the list of bunsetsu."
     (wnnenv-set-daibunsetsu-info env (car result))
     (cdr result)))
 
+(defun wnn-start-reverse-conversion (yomi &optional language dic-set)
+  (wnn-start-conversion yomi language dic-set t))
+
 (defun wnn-get-bunsetsu-converted (bunsetsu)
   (concat (wnn-bunsetsu-get-converted bunsetsu)
          (wnn-bunsetsu-get-fuzokugo  bunsetsu)))
@@ -390,43 +399,65 @@ Return the list of bunsetsu."
              l (cdr l))))))
 
 ;;
+(defvar wnn-open-message)
+
 (defun wnn-open (server-info)
   "Establish the connection to WNN server.  Return process object."
   ;; Open the session to WNN server, 
   (let ((buf (generate-new-buffer (wnn-server-buffer-name server-info)))
-       (hostname (wnn-server-hostname server-info))
-       proc result)
-    (condition-case result
-       (setq proc (open-network-stream (wnn-server-stream-name server-info)
-                                       buf
-                                       hostname
-                                       (wnn-server-port server-info)))
-      (error (progn
-              (kill-buffer buf)
-              (signal (car result) (cdr result)))))
-    (process-kill-without-query proc)
-    (set-process-coding-system proc 'no-conversion 'no-conversion)
-    (set-process-sentinel proc 'wnn-comm-sentinel)
-    (set-marker-insertion-type (process-mark proc) t)
+       (server-type (wnn-server-type server-info))
+       (hostname-list (wnn-server-hostname server-info))
+       (msg-form "WNN: connecting to %S at %s...")
+       hostname proc result msg)
     (save-excursion
       (set-buffer buf)
       (erase-buffer)
       (buffer-disable-undo)
       (setq enable-multibyte-characters nil
            egg-fixed-euc (wnn-server-coding-system server-info)))
-    (setq result (wnnrpc-open proc
-                             (if (equal hostname "localhost")
-                                 "unix"
-                               (system-name))
-                             (user-login-name)))
-    (if (< result 0)
-       (let ((msg (wnnrpc-get-error-message (- result))))
-         (delete-process proc)
-         (kill-buffer buf)
-         (error "Can't open WNN session (%s %S): %s"
-                hostname
-                (wnn-server-type server-info) msg))
-      proc)))
+    (cond
+     ((null hostname-list)
+      (setq hostname-list '("localhost")))
+     ((null (listp hostname-list))
+      (setq hostname-list (list hostname-list))))
+    (while (and hostname-list (null proc))
+      (setq hostname (car hostname-list)
+           hostname-list (cdr hostname-list))
+      (message msg-form server-type hostname)
+      (sit-for 0)
+      (condition-case result
+         (setq proc (open-network-stream (wnn-server-stream-name server-info)
+                                         buf
+                                         hostname
+                                         (wnn-server-port server-info)))
+       (error nil))
+      (if proc
+         (progn
+           (process-kill-without-query proc)
+           (set-process-coding-system proc 'no-conversion 'no-conversion)
+           (set-process-sentinel proc 'wnn-comm-sentinel)
+           (set-marker-insertion-type (process-mark proc) t)
+           (setq result (wnnrpc-open proc
+                                     (if (equal hostname "localhost")
+                                         "unix"
+                                       (system-name))
+                                     (user-login-name)))
+           (if (< result 0)
+               (progn
+                 (delete-process proc)
+                 (setq proc nil
+                       msg (format "Can't open WNN session (%s %S): %s"
+                                   hostname
+                                   (wnn-server-type server-info)
+                                   msg)))))))
+    (if proc
+       (progn
+         (setq wnn-open-message (format (concat msg-form "done")
+                                        server-type
+                                        hostname))
+         proc)
+      (kill-buffer buf)
+      (error "%s" (or msg (format "no %S available" server-type))))))
 
 (defvar wnn-dictionary-specification-list
   '((jserver
@@ -722,6 +753,12 @@ REVERSE specifies reverse conversion, if non nil."
                 (eq (wnn-dic-spec-reverse s) reverse))
            (setq env e))
        (setq spec (cdr spec)))
+      (if (null env)
+         (error "WNN: environment for %S%s (%s) not found"
+                server-type
+                (if dic-set (format "(%S)" dic-set) "")
+                (if reverse 'reverse 'normal)))
+      (message "%s" wnn-open-message)
       env)))
 
 (defun wnn-create-environment (proc server-type spec)
@@ -884,7 +921,6 @@ REVERSE specifies reverse conversion, if non nil."
   "Activate Wnn backend of Tamagotchy."
   (egg-set-support-languages wnn-support-languages)
   (egg-set-conversion-backend wnn-conversion-backend
-                             (list (nth 2 arg))
                              wnn-support-languages)
   (apply 'egg-mode arg))
 
index 9ccbf1f..9372491 100644 (file)
@@ -1,37 +1,40 @@
 (eval-when-compile
   (require 'cl))
 
-(defvar its-current-language "Japanese")
-
 (defvar its-zhuyin nil)
 (make-variable-buffer-local 'its-zhuyin)
+(put 'its-zhuyin 'permanent-local t)
 
-(defun its-make-select-func (key1 key2 name file map &optional lang zhuyin)
-  (setq name (intern (concat "its-select-" (symbol-name name)))
-       file (intern (concat "its/" (symbol-name file)))
-       map (intern (concat "its-" (symbol-name map) "-map"))
-       lang (symbol-name lang))
-  (cons
-   `(defun ,name (&optional mode-line-unchange)
-      (interactive)
-      (cond
-       ((its-in-fence-p)
-       (its-input-end)
-       (its-put-cursor t))
-       ((egg-get-bunsetsu-info (point))
-       (egg-exit-conversion)))
-      ,(if lang `(egg-check-language ,lang))
-      (require ',file)
-      (setq its-current-map ,map)
-      ,(if lang `(setq its-current-language ,lang))
-      ,(if zhuyin `(setq its-zhuyin ,(eq zhuyin 'T)))
-      (if (null mode-line-unchange)
-         (egg-set-mode-line-title)))
-   `(define-key map
-      (if fence
-         ,(concat "\e" (vector key2))
-       ,(concat "\C-x\C-m" (vector key1)))
-      ',name)))
+(eval-when (eval compile)
+  (defun its-make-select-func (key1 key2 func file map &optional zhuyin)
+    (setq func (intern (concat "its-select-" (symbol-name func)))
+         file (intern (concat "its/" (symbol-name file)))
+         map (intern (concat "its-" (symbol-name map) "-map")))
+    (cons
+     `(defun ,func (&optional temporally mode-line-unchange)
+       (interactive "P")
+       (if temporally
+           (its-select-mode-temporally ',func)
+         (let ((inhibit-read-only t))
+           (require ',file)
+           (cond
+            ((its-in-fence-p)
+             (its-input-end)
+             (its-put-cursor t))
+            ((egg-get-bunsetsu-info (point))
+             (egg-exit-conversion)))
+           (setq its-current-select-func ',func)
+           (setq its-current-map ,map)
+           (if (its-get-language its-current-map)
+               (setq its-current-language (its-get-language its-current-map)))
+           ,(if zhuyin `(setq its-zhuyin ,(eq zhuyin 'T)))
+           (if (null mode-line-unchange)
+               (its-set-mode-line-title)))))
+     `(define-key map
+       (if fence
+           ,(concat "\e" key2)
+         ,(concat "\C-x\C-m" key1))
+       ',func))))
 
 (defmacro its-do-list-make-select-func (list)
   (eval-when (eval compile)
           ,@keydefs)))))
 
 (its-do-list-make-select-func
- ((?Q    ?Q    upcase               ascii    up)
-  (?q    ?q    downcase             ascii    down)
-  (?h    ?\C-h hiragana             hira     hira             Japanese)
-  (?k    ?\C-k katakana             kata     kata             Japanese)
-  (?x    ?\C-x hankaku-katakana     hankata  han-kata         Japanese)
-  (?Z    ?Z    zenkaku-upcase       zenkaku  zenkaku-up       Japanese)
-  (?z    ?z    zenkaku-downcase     zenkaku  zenkaku-down     Japanese)
-  (?\C-e ?\C-e erpin-cn             erpin    erpin-cn         Chinese-GB NIL)
-  (?\C-p ?\C-p pinyin-cn            pinyin   pinyin-cn        Chinese-GB NIL)
-  (?\C-z ?\C-z zhuyin-cn            zhuyin   zhuyin-cn        Chinese-GB T)
-  (?\C-u ?\C-u quanjiao-upcase-cn   quanjiao quanjiao-up-cn   Chinese-GB)
-  (?\C-d ?\C-d quanjiao-downcase-cn quanjiao quanjiao-down-cn Chinese-GB)
-  (?E    ?E    erpin-tw             erpin    erpin-tw         Chinese-CNS NIL)
-  (?P    ?P    pinyin-tw            pinyin   pinyin-tw        Chinese-CNS NIL)
-  (?Z    ?Z    zhuyin-tw            zhuyin   zhuyin-tw        Chinese-CNS T)
-  (?U    ?U    quanjiao-upcase-tw   quanjiao quanjiao-up-tw   Chinese-CNS)
-  (?C    ?C    quanjiao-downcase-tw quanjiao quanjiao-down-tw Chinese-CNS)
-  (?H    ?H    hangul               hangul   hangul           Korean)
-  (?J    ?J    jeonkak-upcase       jeonkak  jeonkak-up       Korean)
-  (?j    ?j    jeonkak-downcase     jeonkak  jeonkak-down     Korean)))
+ (("Q"    "Q"    upcase               ascii    up)
+  ("q"    "q"    downcase             ascii    down)
+  ("h"    "\C-h" hiragana             hira     hira)
+  ("k"    "\C-k" katakana             kata     kata)
+  ("x"    "\C-x" hankaku-katakana     hankata  han-kata)
+  ("Z"    "Z"    zenkaku-upcase       zenkaku  zenkaku-up)
+  ("z"    "z"    zenkaku-downcase     zenkaku  zenkaku-down)
+  ("\C-e" "\C-e" erpin-cn             erpin    erpin-cn          NIL)
+  ("\C-p" "\C-p" pinyin-cn            pinyin   pinyin-cn         NIL)
+  ("\C-z" "\C-z" zhuyin-cn            zhuyin   zhuyin-cn         T)
+  ("\C-u" "\C-u" quanjiao-upcase-cn   quanjiao quanjiao-up-cn)
+  ("\C-d" "\C-d" quanjiao-downcase-cn quanjiao quanjiao-down-cn)
+  ("E"    "E"    erpin-tw             erpin    erpin-tw          NIL)
+  ("P"    "P"    pinyin-tw            pinyin   pinyin-tw         NIL)
+  ("C"    "C"    zhuyin-tw            zhuyin   zhuyin-tw         T)
+  ("U"    "U"    quanjiao-upcase-tw   quanjiao quanjiao-up-tw)
+  ("D"    "D"    quanjiao-downcase-tw quanjiao quanjiao-down-tw)
+  ("H"    "H"    hangul               hangul   hangul)
+  ("J"    "J"    jeonkak-upcase       jeonkak  jeonkak-up)
+  ("j"    "j"    jeonkak-downcase     jeonkak  jeonkak-down)))
 
 (provide 'its-keydef)
diff --git a/its.el b/its.el
index 0c78b7f..d55f755 100644 (file)
--- a/its.el
+++ b/its.el
 
 (require 'cl)
 
+(defvar its-current-map nil)
+(make-variable-buffer-local 'its-current-map)
+(put 'its-current-map 'permanent-local t)
+
+(defvar its-current-select-func nil)
+(make-variable-buffer-local 'its-current-select-func)
+(put 'its-current-select-func 'permanent-local t)
+
+(defvar its-previous-select-func nil)
+(make-variable-buffer-local 'its-previous-select-func)
+(put 'its-previous-select-func 'permanent-local t)
+
 (defvar its-current-language)
 (make-variable-buffer-local 'its-current-language)
+(put 'its-current-language 'permanent-local t)
 \f
 ;; Data structure in ITS
 ;; (1) SYL and CURSOR
 ;;
 ;;
 
-(require 'its-keydef)
+(eval-when (eval load compile)
+  (require 'its-keydef))
 
 (defvar its-mode-map
   (let ((map (make-sparse-keymap))
        (i 33))
     (define-key map "\C-a" 'its-beginning-of-input-buffer)
     (define-key map "\C-b" 'its-backward-SYL)
+    (define-key map "\C-c" 'its-cancel-input)
     (define-key map "\C-d" 'its-delete-SYL)
     (define-key map "\C-e" 'its-end-of-input-buffer)
     (define-key map "\C-f" 'its-forward-SYL)
+    (define-key map "\C-g" 'its-select-previous-mode)
     (define-key map "\C-]" 'its-cancel-input)
     (define-key map "\C-h" 'its-mode-help-command)
     (define-key map "\C-k" 'its-kill-line)
     (define-key map "\C-m" 'its-exit-mode)     ; RET
     (define-key map [return] 'its-exit-mode)
     (define-key map "\C-t" 'its-transpose-chars)
+    (define-key map "\C-w" 'its-kick-convert-region)
+    (define-key map "\C-y" 'its-yank)
+    (define-key map "\M-y" 'its-yank-pop)
     (define-key map [backspace] 'its-delete-backward-SYL)
     (define-key map [delete] 'its-delete-backward-SYL)
     (define-key map [M-backspace] 'its-delete-backward-SYL-by-keystroke)
     (define-key map [M-delete] 'its-delete-backward-SYL-by-keystroke)
     (define-key map [right] 'its-forward-SYL)
     (define-key map [left] 'its-backward-SYL)
-    (define-key map "\C-\\" 'its-exit-mode-off-input-method)
     (while (< i 127)
       (define-key map (vector i) 'its-self-insert-char)
       (setq i (1+ i)))
-    (define-key map " "    'its-kick-convert-region)
+    (define-key map " "    'its-kick-convert-region-or-self-insert)
     (define-key map "\177" 'its-delete-backward-SYL)
     ;;
     (define-key map "\M-p" 'its-previous-map)
     map)
   "Keymap for ITS mode.")
 
-(defvar its-fence-open   "|" "*\e$B%U%'%s%9$N;OE@$r<($9J8;zNs\e(B (1 \e$BJ8;z\e(B)")
-(defvar its-fence-close  "|" "*\e$B%U%'%s%9$N=*E@$r<($9J8;zNs\e(B (1 \e$BJ8;z\e(B)")
-(defvar its-fence-face nil  "*\e$B%U%'%s%9I=<($KMQ$$$k\e(B face \e$B$^$?$O\e(B nil")
+(defvar its-fence-open  "|" "*\e$B%U%'%s%9$N;OE@$r<($9J8;zNs\e(B (1 \e$BJ8;z0J>e\e(B)")
+(defvar its-fence-close "|" "*\e$B%U%'%s%9$N=*E@$r<($9J8;zNs\e(B (1 \e$BJ8;z0J>e\e(B)")
+(defvar its-fence-face  nil "*\e$B%U%'%s%9I=<($KMQ$$$k\e(B face \e$B$^$?$O\e(B nil")
 
 (defconst its-setup-fence-before-insert-SYL nil)
 
+(defun its-get-fence-face ()
+  (let ((face (and (consp its-fence-face)
+                  (or (assoc its-current-language its-fence-face)
+                      (assoc t its-fence-face)))))
+    (if face (cdr face) its-fence-face)))
+
 (defun its-put-cursor (cursor)
   (let ((p (point))
        (map (copy-keymap its-mode-map)))
     (its-define-select-keys map)
     (insert "!")
     (add-text-properties p (point) (list 'local-map map
+                                        'read-only t
                                         'invisible t
                                         'intangible 'its-part-2
                                         'its-cursor cursor))
 ;;
 (defun its-setup-fence-mode ()
   (let ((open-props '(its-start t intangible its-part-1))
-       (close-props '(its-end t intangible its-part-2))
+       (close-props '(rear-nonsticky t its-end t intangible its-part-2))
        (p (point)) p1)
+    ;; Put open-fence before inhibit-read-only to detect read-nly
     (insert its-fence-open)
-    (setq p1 (point))
-    (add-text-properties p p1 open-props)
-    (insert its-fence-close)
-    (add-text-properties p1 (point) close-props)
-    (if its-fence-face
-       (put-text-property 'invisible t p (point)))
-    (goto-char p1)
-    (its-put-cursor t)))
+    (let ((inhibit-read-only t))
+      (setq p1 (point))
+      (add-text-properties p p1 open-props)
+      (insert its-fence-close)
+      (add-text-properties p1 (point) close-props)
+      (if its-fence-face
+         (put-text-property p (point) 'invisible t))
+      (put-text-property p (point) 'read-only t)
+      (goto-char p1)
+      (its-put-cursor t))))
 
 (defun its-start (key)
   (let ((its-setup-fence-before-insert-SYL t))
-    (its-input nil key)
-    (force-mode-line-update)))
+    (its-input nil key)))
 
-(defun its-restart (str)
+(defun its-restart (str &optional set-prop)
   (let (p)
-    (its-setup-fence-mode t)
+    (its-setup-fence-mode)
     (setq p (point))
     (insert str)
+    (if set-prop
+       (its-setup-yanked-portion p (point)))
     (its-beginning-of-input-buffer)))
 
 (defun its-self-insert-char ()
   (interactive)
-  (let ((key last-command-char)
+  (let ((inhibit-read-only t)
+       (key last-command-char)
        (cursor (get-text-property (point) 'its-cursor))
        (syl (get-text-property (1- (point)) 'its-syl)))
     (cond
      (setq syl nil)))
     (its-input syl key)))
 
-(defvar its-current-map nil)
-(make-variable-buffer-local 'its-current-map)
-(put 'its-current-map 'permanent-local t)
-
 (defun its-initial-ISYL ()
   (its-get-start-state its-current-map))
 
 ;;; ITS State Machine
 ;;;
 
+(defvar its-disable-special-action nil)
+
 ;; Return CURSOR
 (defun its-state-machine (state key emit)
   (let ((next-state (its-get-next-state state key))
        expr-output-back kst/t output keyseq back)
     (cond
      ;; proceed to next status
-     (next-state
+     ((and next-state
+           (not (and its-disable-special-action
+                     (eq (its-get-kst/t next-state) t))))
       (setq kst/t (its-get-kst/t next-state)
            output (its-get-output next-state)
            keyseq (its-get-keyseq next-state))
       (cond
+       ;; Special actions.
+       ((eq kst/t t)
+       (funcall emit (cons "" keyseq) state 'its-cursor)
+       (apply (car output) (cdr output)))
+
        ;; Still, it's a intermediate state.
        ((its-kst-p kst/t)
        (funcall emit next-state state nil))
        (funcall emit next-state state 'its-cursor)
        (its-state-machine-keyseq (substring keyseq kst/t) emit (< key 0)))
 
-       ;; Here we arrive to a terminal state.
-       ;; Emit a DSYL, and go ahead.
+       ;; Here we arrive to a terminal state.
+       ;; Emit a DSYL, and go ahead.
        (t
        (funcall emit next-state state 'its-cursor))))
 
       (progn
        (setq its-setup-fence-before-insert-SYL nil)
        (its-setup-fence-mode)))
-  (its-buffer-delete-SYL oldsyl)
-  (its-update-latest-SYL newsyl)
-  (let ((p (point)))
-    (insert (its-get-output newsyl))
-    (add-text-properties p (point)
-                        (list 'its-syl newsyl
-                              'its-map its-current-map
-                              'its-lang its-current-language
-                              'intangible 'its-part-1))
-    (if its-fence-face
-       (put-text-property p (point) 'face its-fence-face))
-    (its-set-cursor-status cursor)))
+  (let ((inhibit-read-only t))
+    (its-buffer-delete-SYL oldsyl)
+    (its-update-latest-SYL newsyl)
+    (let ((p (point)))
+      (insert (its-get-output newsyl))
+      (add-text-properties p (point)
+                          (list 'its-map its-current-map
+                                'its-syl newsyl
+                                'egg-lang its-current-language
+                                'read-only t
+                                'intangible 'its-part-1))
+      (if its-fence-face
+         (put-text-property p (point) 'face (its-get-fence-face)))
+      (its-set-cursor-status cursor))))
 
 (defun its-buffer-delete-SYL (syl)
   (let ((len (length (its-get-output syl))))
 
 (defun its-get-next-state (state key)
   (let ((kst/t (its-get-kst/t state)))
-    (cdr (assq key (car kst/t)))))
+    (and (listp kst/t)
+        (cdr (assq key (car kst/t))))))
 
 ;; XXX XXX XXX
 (defun its-otherwise-match (expr key)
        (emit (lambda (nsyl osyl cursor)
                (its-update-latest-SYL nsyl)
                cursor))
+       (its-current-map its-current-map)
+       (its-current-select-func its-current-select-func)
+       (its-current-language its-current-language)
+       (its-zhuyin its-zhuyin)
+       (its-previous-select-func its-previous-select-func)
        cursor)
     (if (null syl)
-       (setq (its-initial-ISYL)))
+       (setq syl (its-initial-ISYL)))
     (while (and syl (< i len))
       (setq cursor (its-state-machine syl (aref keyseq i) emit))
       (cond
        (t
        its-latest-SYL))
       (setq i (1+ i)))
-    (if eol
+    (if (and syl eol)
        (setq cursor (its-state-machine syl -1 emit)))
     (not (eq cursor 'its-keyseq-test-failed))))
 \f
@@ -579,39 +622,90 @@ Return last state."
 (defun its-make-next-state (state key keyseq output &optional back)
   (let ((next-state (its-new-state output keyseq back))
        (kst (its-get-kst/t state)))
-    (if kst
-       (setcar kst (cons (cons key next-state) (car kst)))
+    (cond
+     ((null kst)
       (its-set-kst state (list (list (cons key next-state)))))
+     ((consp kst)
+      (setcar kst (cons (cons key next-state) (car kst))))
+     (t
+      (error "Can't make new state after %S" (its-get-keyseq state))))
     next-state))
+
+(defmacro its-defrule-select-mode-temporally (input select-func)
+  `(its-defrule ,input '(its-select-mode-temporally
+                        ,(intern (concat "its-select-"
+                                         (symbol-name select-func))))
+               t))
 \f
 ;;;
 (defun its-beginning-of-input-buffer ()
   (interactive)
-  (its-input-end)
-  (if (not (get-text-property (1- (point)) 'its-start))
-      (let ((begpos (previous-single-property-change (point) 'its-start)))
-       ;; Make SYLs have property of "part 2"
-       (put-text-property begpos (point) 'intangible 'its-part-2)
-       (goto-char begpos)))
-  (its-put-cursor t))
+  (let ((inhibit-read-only t))
+    (its-input-end)
+    (if (not (get-text-property (1- (point)) 'its-start))
+       (let ((begpos (previous-single-property-change (point) 'its-start)))
+         ;; Make SYLs have property of "part 2"
+         (put-text-property begpos (point) 'intangible 'its-part-2)
+         (goto-char begpos)))
+    (its-put-cursor t)))
 
 (defun its-end-of-input-buffer ()
   (interactive)
-  (its-input-end)
-  (if (not (get-text-property (point) 'its-end))
-      (let ((endpos (next-single-property-change (point) 'its-end)))
-       ;; Make SYLs have property of "part 1"
-       (put-text-property (point) endpos 'intangible 'its-part-1)
-       (goto-char endpos)))
-  (its-put-cursor t))
+  (let ((inhibit-read-only t))
+    (its-input-end)
+    (if (not (get-text-property (point) 'its-end))
+       (let ((endpos (next-single-property-change (point) 'its-end)))
+         ;; Make SYLs have property of "part 1"
+         (put-text-property (point) endpos 'intangible 'its-part-1)
+         (goto-char endpos)))
+    (its-put-cursor t)))
+
+(defun its-kill-line (n)
+  (interactive "p")
+  (let ((inhibit-read-only t)
+       (p (point)))
+    (its-input-end)
+    (if (> n 0)
+       (cond
+        ((get-text-property (1- (point)) 'its-start)
+         (its-cancel-input))
+        ((get-text-property (point) 'its-end)
+         (its-put-cursor t))
+        (t
+         (delete-region (next-single-property-change (point) 'its-end)
+                        (point))
+         (its-put-cursor t)))
+      (cond
+       ((get-text-property (point) 'its-end)
+       (its-cancel-input))
+       ((get-text-property (1- (point)) 'its-start)
+       (its-put-cursor t))
+       (t
+       (delete-region (point)
+                      (previous-single-property-change (point) 'its-start))
+       (its-put-cursor t))))))
+
+(defun its-cancel-input ()
+  (interactive)
+  (let ((inhibit-read-only t))
+    (delete-region (if (get-text-property (1- (point)) 'its-start)
+                      (point)
+                    (previous-single-property-change (1- (point)) 'its-start))
+                  (if (get-text-property (point) 'its-end)
+                      (point)
+                    (next-single-property-change (point) 'its-end)))
+    (its-put-cursor t)
+    (its-exit-mode-internal)))
 
 ;; TODO: move in VSYL
 (defun its-backward-SYL (n)
   (interactive "p")
-  (its-input-end)
-  (let ((syl (get-text-property (1- (point)) 'its-syl))
-       (p (point))
-       (old-point (point)))
+  (let ((inhibit-read-only t)
+       syl p old-point)
+    (its-input-end)
+    (setq syl (get-text-property (1- (point)) 'its-syl)
+         p (point)
+         old-point (point))
     (while (and syl (> n 0))
       (setq p (- p (length (its-get-output syl))))
       (setq syl (get-text-property (1- p) 'its-syl))
@@ -626,10 +720,12 @@ Return last state."
 ;; TODO: move in VSYL
 (defun its-forward-SYL (n)
   (interactive "p")
-  (its-input-end)
-  (let ((syl (get-text-property (point) 'its-syl))
-       (p (point))
-       (old-point (point)))
+  (let ((inhibit-read-only t)
+       syl p old-point)
+    (its-input-end)
+    (setq syl (get-text-property (point) 'its-syl)
+         p (point)
+         old-point (point))
     (while (and syl (> n 0))
       (setq p (+ p (length (its-get-output syl))))
       (setq syl (get-text-property p 'its-syl))
@@ -644,9 +740,11 @@ Return last state."
 ;; TODO: handle VSYL.  KILLFLAG
 (defun its-delete-SYL (n killflag)
   (interactive "p\nP")
-  (its-input-end)
-  (let ((syl (get-text-property (point) 'its-syl))
-       (p (point)))
+  (let ((inhibit-read-only t)
+       syl p)
+    (its-input-end)
+    (setq syl (get-text-property (point) 'its-syl)
+         p (point))
     (while (and syl (> n 0))
       (setq p (+ p (length (its-get-output syl))))
       (setq syl (get-text-property p 'its-syl))
@@ -654,19 +752,19 @@ Return last state."
     (if (> n 0)
        (progn
          (its-put-cursor t)
-         (signal 'args-out-of-range (list p n)))
+         (signal 'end-of-buffer nil))
       (delete-region (point) p)
+      (its-put-cursor t)
       ;; Check if empty
-      (let ((s (get-text-property (1- (point)) 'its-start))
-           (e (get-text-property (point) 'its-end)))
-       (if (and s e)
-           (its-exit-mode-internal)
-         (its-put-cursor t))))))
+      (if (and (get-text-property (1- (point)) 'its-start)
+              (get-text-property (1+ (point)) 'its-end))
+         (its-exit-mode-internal)))))
 
 ;; TODO: killflag
 (defun its-delete-backward-SYL (n killflag)
   (interactive "p\nP")
-  (let ((syl (get-text-property (1- (point)) 'its-syl))
+  (let ((inhibit-read-only t)
+       (syl (get-text-property (1- (point)) 'its-syl))
        (cursor (get-text-property (point) 'its-cursor)))
     (if (null syl)
        (signal 'beginning-of-buffer nil)
@@ -683,20 +781,20 @@ Return last state."
       (setq syl (get-text-property (1- p) 'its-syl))
       (setq n (1- n)))
     (if (> n 0)
-       (signal 'args-out-of-range (list p n))
+       (signal 'beginning-of-buffer nil)
       (delete-region p (1+ (point)))   ; also delete cursor
+      (its-put-cursor t)
       ;; Check if empty
-      (let ((s (get-text-property (1- (point)) 'its-start))
-           (e (get-text-property (point) 'its-end)))
-       (if (and s e)
-           (its-exit-mode-internal)
-         (its-put-cursor t))))))
+      (if (and (get-text-property (1- (point)) 'its-start)
+              (get-text-property (1+ (point)) 'its-end))
+         (its-exit-mode-internal)))))
 
 (defvar its-delete-by-keystroke nil)
 
 (defun its-delete-backward-SYL-by-keystroke (n killflag)
   (interactive "p\nP")
-  (let ((its-delete-by-keystroke t))
+  (let ((inhibit-read-only t)
+       (its-delete-by-keystroke t))
     (its-delete-backward-SYL n killflag)))
 
 ;; TODO: killflag
@@ -705,6 +803,7 @@ Return last state."
         (len (length keyseq))
         (p (- (point) (length (its-get-output syl))))
         (its-current-map (get-text-property (1- (point)) 'its-map))
+        (its-current-language (get-text-property (1- (point)) 'egg-lang))
         back pp)
     (if (< n 0)
        (signal 'args-out-of-range (list (- (point) n) (point))))
@@ -743,8 +842,6 @@ Return last state."
      ;; Check if empty
      ((and (get-text-property (1- (point)) 'its-start)
           (get-text-property (1+ (point)) 'its-end))
-      ;; Delete CURSOR
-      (delete-region (point) (1+ (point)))
       (its-exit-mode-internal))
      ((and its-delete-by-keystroke
           (null (its-concrete-DSYL-p (get-text-property (1- p) 'its-syl))))
@@ -754,7 +851,8 @@ Return last state."
 
 (defun its-transpose-chars (n)
   (interactive "p")
-  (let ((syl (get-text-property (1- (point)) 'its-syl))
+  (let ((inhibit-read-only t)
+       (syl (get-text-property (1- (point)) 'its-syl))
        (cursor (get-text-property (point) 'its-cursor))
        keyseq len)
     (cond
@@ -802,6 +900,50 @@ Return last state."
        (delete-region (- (point) (length (its-get-output syl))) (point))
        (its-state-machine-keyseq keyseq 'its-buffer-ins/del-SYL)))))))
 
+(defun its-yank (&optional arg)
+  (interactive "*P")
+  (let ((inhibit-read-only t))
+    (its-input-end)
+    (its-put-cursor t)
+    (yank arg)
+    (its-setup-yanked-portion (region-beginning) (region-end))))
+
+(defun its-yank-pop (arg)
+  (interactive "*p")
+  (let ((inhibit-read-only t))
+    (its-input-end)
+    (its-put-cursor t)
+    (yank-pop arg)
+    (its-setup-yanked-portion (region-beginning) (region-end))))
+
+(defun its-setup-yanked-portion (start end)
+  (let ((yank-before (eq (point) end))
+       (max-sisheng (make-char 'chinese-sisheng 127))
+       p syl lang)
+    (remove-text-properties start end '(intangible nil))
+    (egg-separate-languages start end t)
+    (goto-char start)
+    (while (< (point) end)
+      (setq p (point)
+           lang (get-text-property p 'egg-lang))
+      (if (and
+          (or (equal lang "Chinese-GB") (equal lang "Chinese-CNS"))
+          (<= (following-char) max-sisheng)
+          (setq len (egg-chinese-syllable (buffer-substring (point) end))))
+         (goto-char (+ (point) len))
+       (forward-char))
+      (setq syl (buffer-substring-no-properties p (point)))
+      (put-text-property p (point) 'its-syl (cons syl syl))
+      (if its-fence-face
+         (let ((its-current-language (get-text-property p 'egg-lang)))
+           (put-text-property p (point) 'face (its-get-fence-face)))))
+    (if yank-before
+       (add-text-properties start end '(read-only t intangible its-part-1))
+      (add-text-properties start end '(read-only t intangible its-part-2))
+      (delete-region (point) (1+ (point)))
+      (goto-char start)
+      (its-put-cursor t))))
+
 ;; Return VOID
 (defun its-input-end ()
   (let ((cursor (get-text-property (point) 'its-cursor)))
@@ -813,43 +955,53 @@ Return last state."
 (defun its-exit-mode ()
   "Exit ITS mode."
   (interactive)
-  (its-input-end)
-  (its-exit-mode-internal))
+  (let ((inhibit-read-only t))
+    (its-exit-mode-internal)))
 
 (defun its-exit-mode-off-input-method ()
   "Exit ITS mode."
   (interactive)
-  (its-input-end)
-  (its-exit-mode-internal)
-  (inactivate-input-method))
+  (let ((inhibit-read-only t))
+    (its-exit-mode-internal)
+    (inactivate-input-method)))
 
 ;; TODO: handle overwrite-mode, insertion-hook, fill...
 (defun its-exit-mode-internal (&optional proceed-to-conversion)
-  (let (start end)
+  (let (start end s e)
+    (its-select-previous-mode t)
+    ;; Delete CURSOR
+    (delete-region (point) (1+ (point)))
     ;; Delete open fence
-    (if (get-text-property (1- (point)) 'its-start)
-       (setq start (1- (point)))
-      (setq start (1- (previous-single-property-change (point) 'its-start))))
-    (delete-region start (1+ start))
+    (setq s (if (get-text-property (1- (point)) 'its-start)
+               (point)
+             (previous-single-property-change (point) 'its-start))
+        start (- s (length its-fence-open)))
+    (delete-region start s)
     ;; Delete close fence
-    (if (get-text-property (point) 'its-end)
-       (setq end (point))
-      (setq end (next-single-property-change (point) 'its-end)))
-    (delete-region end (1+ end))
-    ;; Remove all properties added by ITS
-    (remove-text-properties start end '(its-map nil
-                                       face nil
-                                       intangible nil))
+    (setq end (if (get-text-property (point) 'its-end)
+                 (point)
+               (next-single-property-change (point) 'its-end))
+         e (+ end (length its-fence-close)))
+    (delete-region end e)
     (if proceed-to-conversion
        (egg-convert-region start end)
-      (remove-text-properties start end '(its-lang nil its-syl nil))
+      ;; Remove all properties
+      (set-text-properties start end nil)
       (egg-do-auto-fill)
       (run-hooks 'input-method-after-insert-chunk-hook))))
 
 (defun its-kick-convert-region ()
   (interactive)
-  (its-input-end)
-  (its-exit-mode-internal t))
+  (let ((inhibit-read-only t))
+    (its-exit-mode-internal t)))
+
+(defun its-kick-convert-region-or-self-insert ()
+  (interactive)
+  (let ((syl (and (null (get-text-property (point) 'its-cursor))
+                 (get-text-property (1- (point)) 'its-syl))))
+    (if (its-keyseq-acceptable-p (vector last-command-char) syl)
+       (its-self-insert-char)
+      (its-kick-convert-region))))
 
 (defun its-in-fence-p ()
   (eq (get-text-property (point) 'intangible) 'its-part-2))
@@ -866,14 +1018,14 @@ Return last state."
            (oldlen (length its-translation-result)))
        (setq its-translation-result (concat its-translation-result output))
        (put-text-property oldlen (length its-translation-result)
-                          'its-lang its-current-language
+                          'egg-lang its-current-language
                           its-translation-result)))
   cursor)
 
 (defun its-translate-region (start end)
   (interactive "r")
   (its-translate-region-internal start end)
-  (remove-text-properties start (point) '(its-lang nil)))
+  (set-text-properties start (point) nil))
 
 (defun its-translate-region-internal (start end)
   (setq its-translation-result "")
@@ -895,5 +1047,28 @@ Return last state."
     (delete-region start end)
     (insert its-translation-result)))
 \f
+(defun its-set-mode-line-title ()
+  (let ((title (its-get-indicator its-current-map)))
+    (setq current-input-method-title (if its-previous-select-func
+                                        (concat "<" title ">")
+                                      title))
+    (force-mode-line-update)))
+
+(defun its-select-mode-temporally (func)
+  (let ((select-func its-current-select-func))
+    (funcall func)
+    (if (null its-previous-select-func)
+       (setq its-previous-select-func select-func))
+    (its-set-mode-line-title)))
+
+(defun its-select-previous-mode (&optional quiet)
+  (interactive)
+  (if (null its-previous-select-func)
+      (if (null quiet)
+         (beep))
+    (funcall its-previous-select-func)
+    (setq its-previous-select-func nil)
+    (its-set-mode-line-title)))
+
 (provide 'its)
 ;;; its.el ends here.
diff --git a/its/ascii.el b/its/ascii.el
new file mode 100644 (file)
index 0000000..272a340
--- /dev/null
@@ -0,0 +1,55 @@
+;;; its/ascii.el --- ASCII Input in Egg Input Method Architecture
+
+;; Copyright (C) 1997, 1998 Mule Project,
+;; Powered by Electrotechnical Laboratory, JAPAN.
+;; Project Leader: Satoru Tomura <tomura@etl.go.jp>
+
+;; Author: KATAYAMA Yoshio <kate@pfu.co.jp>
+
+;; This file will be part of GNU Emacs (in future).
+
+;; GNU Emacs is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2, or (at your option)
+;; any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+;;
+;; Symbol input is desined by jiro@math.keio.ac.jp (TANAKA Jiro)
+;; This file is based on the rules of its/hira.el in Mule-2.3 distribution.
+;;
+
+;;; Code:
+
+(eval-when-compile
+  (require 'its))
+
+(define-its-state-machine its-up-map
+  "upcase" "aA" nil nil
+  "Map for upcase input."
+
+  (let ((i ? ))
+    (while (<= i ?~)
+      (its-defrule (char-to-string i) (upcase (char-to-string i)))
+      (setq i (1+ i)))))
+
+(define-its-state-machine its-down-map
+  "downcase" "aa" nil nil
+  "Map for downcase input."
+
+  (let ((i ? ))
+    (while (<= i ?~)
+      (its-defrule (char-to-string i) (char-to-string i))
+      (setq i (1+ i)))))
+
+(provide 'its/ascii)
diff --git a/its/erpin.el b/its/erpin.el
new file mode 100644 (file)
index 0000000..db0665b
--- /dev/null
@@ -0,0 +1,387 @@
+(eval-when-compile
+  (require 'its)
+  (require 'cl))
+
+(defvar its-erpin-cn-enable-quanjioao-alphabet t "*Enable Quanjiao alphabet")
+(defvar its-erpin-cn-open-braket  "\e$A!8\e(B" "*[") ; "\e$A#[\e(B"
+(defvar its-erpin-cn-close-braket "\e$A!9\e(B" "*]") ; "\e$A#]\e(B"
+
+(defvar its-erpin-tw-enable-quanjioao-alphabet t "*Enable Quanjiao alphabet")
+(defvar its-erpin-tw-open-braket  "\e$(G!V\e(B" "*[") ; "\e$(G!b\e(B "
+(defvar its-erpin-tw-close-braket "\e$(G!W\e(B" "*]") ; "\e$(G!c\e(B"
+
+(eval-when-compile
+  (defsubst its-defoutput* (input display)
+    (its-set-output (its-goto-state input nil t) display))
+
+  (defun its-define-erpin-qingsheng (shengmu yunmu &optional y)
+    (let ((input (concat (car shengmu) yunmu))
+         (output (concat (cdr shengmu) (if y y yunmu) "\e(0@\e(B"))
+         state)
+      (setq state (its-goto-state input nil t))
+      (its-set-output state output)
+      (its-make-next-state state -1 input              output)
+      (its-make-next-state state ?  (concat input " ") output)
+      (its-make-next-state state ?0 (concat input "0") output)
+      (its-define-otherwise state (its-make-otherwise output
+                                                     its-otherwise-back-one))
+      state))
+
+  (defmacro its-do-erpin-table (list)
+    `(progn
+       ,@(mapcar (lambda (syl)
+                  `(its-define-erpin ,(car syl) ,(cdr syl)))
+                list)))
+
+  (defmacro its-define-erpin (shengmu yunmu)
+    `(let ((y1 (nth 1 ,yunmu)) (y2 (nth 2 ,yunmu)) (y3 (nth 3 ,yunmu))
+          (y4 (nth 4 ,yunmu)) (y5 (nth 5 ,yunmu)) (y (car ,yunmu))
+          (ss (list ,@shengmu)) sa sd state)
+       (while ss
+        (setq sa (caar ss) sd (cdar ss) 
+              state (its-define-erpin-qingsheng (car ss) y y5))
+        (its-make-next-state state ?1 (concat sa y 1) (concat sd y1 "\e(0@\e(B"))
+        (its-make-next-state state ?2 (concat sa y 2) (concat sd y2 "\e(0@\e(B"))
+        (its-make-next-state state ?3 (concat sa y 3) (concat sd y3 "\e(0@\e(B"))
+        (its-make-next-state state ?4 (concat sa y 4) (concat sd y4 "\e(0@\e(B"))
+        (setq ss (cdr ss)))))
+
+  (defmacro its-define-erpin-table ()
+    '(let ((O '("o" . ""))  (B '("b" . "B")) (C '("c" . "C")) (D '("d" . "D"))
+          (F '("f" . "F")) (G '("g" . "G")) (H '("h" . "H")) (J '("j" . "J"))
+          (K '("k" . "K")) (L '("l" . "L")) (M '("m" . "M")) (N '("n" . "N"))
+          (P '("p" . "P")) (Q '("q" . "Q")) (R '("r" . "R")) (S '("s" . "S"))
+          (T '("t" . "T")) (W '("w" . "W")) (X '("x" . "X")) (Y '("y" . "Y"))
+          (Z '("z" . "Z"))
+          (I '("i" . "Ch")) (U '("u" . "Sh")) (V '("v" . "Zh"))
+
+          (a    '("a"  "\e(0!\e(B"    "\e(0"\e(B"    "\e(0#\e(B"    "\e(0$\e(B"    "a"   ))
+          (ai   '("s"  "\e(0!\e(Bi"   "\e(0"\e(Bi"   "\e(0#\e(Bi"   "\e(0$\e(Bi"   "ai"  ))
+          (an   '("f"  "\e(0!\e(Bn"   "\e(0"\e(Bn"   "\e(0#\e(Bn"   "\e(0$\e(Bn"   "an"  ))
+          (ang  '("g"  "\e(0!\e(Bng"  "\e(0"\e(Bng"  "\e(0#\e(Bng"  "\e(0$\e(Bng"  "ang" ))
+          (ao   '("d"  "\e(0!\e(Bo"   "\e(0"\e(Bo"   "\e(0#\e(Bo"   "\e(0$\e(Bo"   "ao"  ))
+          (e    '("e"  "\e(0%\e(B"    "\e(0&\e(B"    "\e(0'\e(B"    "\e(0(\e(B"    "e"   ))
+          (ei   '("w"  "\e(0%\e(Bi"   "\e(0&\e(Bi"   "\e(0'\e(Bi"   "\e(0(\e(Bi"   "ei"  ))
+          (en   '("r"  "\e(0%\e(Bn"   "\e(0&\e(Bn"   "\e(0'\e(Bn"   "\e(0(\e(Bn"   "en"  ))
+          (eng  '("t"  "\e(0%\e(Bng"  "\e(0&\e(Bng"  "\e(0'\e(Bng"  "\e(0(\e(Bng"  "eng" ))
+          (er   '("y"  "\e(0%\e(Br"   "\e(0&\e(Br"   "\e(0'\e(Br"   "\e(0(\e(Br"   "er"  ))
+          (i    '("i"  "\e(0)\e(B"    "\e(0*\e(B"    "\e(0+\e(B"    "\e(0,\e(B"    "i"   ))
+          (ia   '("p"  "i\e(0!\e(B"   "i\e(0"\e(B"   "i\e(0#\e(B"   "i\e(0$\e(B"   "ia"  ))
+          (ian  '("h"  "i\e(0!\e(Bn"  "i\e(0"\e(Bn"  "i\e(0#\e(Bn"  "i\e(0$\e(Bn"  "ian" ))
+          (iang '("j"  "i\e(0!\e(Bng" "i\e(0"\e(Bng" "i\e(0#\e(Bng" "i\e(0$\e(Bng" "iang"))
+          (iao  '("k"  "i\e(0!\e(Bo"  "i\e(0"\e(Bo"  "i\e(0#\e(Bo"  "i\e(0$\e(Bo"  "iao" ))
+          (ie   '("l"  "i\e(0%\e(B"   "i\e(0&\e(B"   "i\e(0'\e(B"   "i\e(0(\e(B"   "ie"  ))
+          (in   '("m"  "\e(0)\e(Bn"   "\e(0*\e(Bn"   "\e(0+\e(Bn"   "\e(0,\e(Bn"   "in"  ))
+          (ing  '("n"  "\e(0)\e(Bng"  "\e(0*\e(Bng"  "\e(0+\e(Bng"  "\e(0,\e(Bng"  "ing" ))
+          (iong '("b"  "i\e(0-\e(Bng" "i\e(0.\e(Bng" "i\e(0/\e(Bng" "i\e(00\e(Bng" "iong"))
+          (iu   '("y"  "i\e(01\e(B"   "i\e(02\e(B"   "i\e(03\e(B"   "i\e(04\e(B"   "iu"  ))
+          (o    '("o"  "\e(0-\e(B"    "\e(0.\e(B"    "\e(0/\e(B"    "\e(00\e(B"    "o"   ))
+          (ong  '("b"  "\e(0-\e(Bng"  "\e(0.\e(Bng"  "\e(0/\e(Bng"  "\e(00\e(Bng"  "ong" ))
+          (ou   '("q"  "\e(0-\e(Bu"   "\e(0.\e(Bu"   "\e(0/\e(Bu"   "\e(00\e(Bu"   "ou"  ))
+          (u    '("u"  "\e(01\e(B"    "\e(02\e(B"    "\e(03\e(B"    "\e(04\e(B"    "u"   ))
+          (v    '("v"  "\e(05\e(B"    "\e(06\e(B"    "\e(07\e(B"    "\e(08\e(B"    "\e(09\e(B"   ))
+          (ua   '("p"  "u\e(0!\e(B"   "u\e(0"\e(B"   "u\e(0#\e(B"   "u\e(0$\e(B"   "ua"  ))
+          (uai  '("k"  "u\e(0!\e(Bi"  "u\e(0"\e(Bi"  "u\e(0#\e(Bi"  "u\e(0$\e(Bi"  "uai" ))
+          (uan  '("x"  "u\e(0!\e(Bn"  "u\e(0"\e(Bn"  "u\e(0#\e(Bn"  "u\e(0$\e(Bn"  "uan" ))
+          (uang '("j"  "u\e(0!\e(Bng" "u\e(0"\e(Bng" "u\e(0#\e(Bng" "u\e(0$\e(Bng" "uang"))
+          (ue   '("c"  "u\e(0%\e(B"   "u\e(0&\e(B"   "u\e(0'\e(B"   "u\e(0(\e(B"   "ue"  ))
+          (ve   '("c"  "\e(09%\e(B"   "\e(09&\e(B"   "\e(09'\e(B"   "\e(09(\e(B"   "\e(09\e(Be"  ))
+          (ui   '("c"  "u\e(0)\e(B"   "u\e(0*\e(B"   "u\e(0+\e(B"   "u\e(0,\e(B"   "ui"  ))
+          (un   '("z"  "\e(01\e(Bn"   "\e(02\e(Bn"   "\e(03\e(Bn"   "\e(04\e(Bn"   "un"  ))
+          (uo   '("o"  "u\e(0-\e(B"   "u\e(0.\e(B"   "u\e(0/\e(B"   "u\e(00\e(B"   "uo"  )))
+
+       (dolist (SHENG (list B C D F G H J K L M N P Q R S T W X Y Z I U V))
+        (its-defrule (car SHENG) (cdr SHENG)))
+
+       (its-do-erpin-table
+       (((O B C D F G H   K L M N P     S T W   Y Z I U V) . a)
+        ((O B C D   G H   K L M N P     S T W     Z I U V) . ai)
+        ((O B C D F G H   K L M N P   R S T W   Y Z I U V) . an)
+        ((O B C D F G H   K L M N P   R S T W   Y Z I U V) . ang)
+        ((O B C D   G H   K L M N P   R S T     Y Z I U V) . ao)
+        ((O   C D   G H   K L M N     R S T     Y Z I U V) . e)
+        ((O B C D F G H   K L M N P       T W     Z   U V) . ei)
+        ((O B C D F G H   K   M N P   R S   W     Z I U V) . en)
+        ((O B C D F G H   K L M N P   R S T W     Z I U V) . eng)
+        ((O                                              ) . er)
+        ((  B C D       J   L M N P Q R S T   X Y Z I U V) . i)
+        ((      D       J   L       Q         X          ) . ia)
+        ((  B   D       J   L M N P Q     T   X          ) . ian)
+        ((              J   L   N   Q         X          ) . iang)
+        ((  B   D       J   L M N P Q     T   X          ) . iao)
+        ((  B   D       J   L M N P Q     T   X          ) . ie)
+        ((  B           J   L M N P Q         X Y        ) . in)
+        ((  B   D       J   L M N P Q     T   X Y        ) . ing)
+        ((              J           Q         X          ) . iong)
+        ((      D       J   L M N   Q         X          ) . iu)
+        ((O B     F           M   P         W   Y        ) . o)
+        ((    C D   G H   K L   N     R S T     Y Z I   V) . ong)
+        ((O   C D F G H   K L M N P   R S T     Y Z I U V) . ou)
+        ((  B C D F G H J K L M N P Q R S T W X Y Z I U V) . u)
+        ((                  L   N                        ) . v)
+        ((          G H   K           R             I U V) . ua)
+        ((          G H   K                         I U V) . uai)
+        ((    C D   G H J K L   N   Q R S T   X Y Z I U V) . uan)
+        ((          G H   K                         I U V) . uang)
+        ((              J           Q         X Y        ) . ue)
+        ((                  L   N                        ) . ve)
+        ((    C D   G H   K           R S T       Z I U V) . ui)
+        ((    C D   G H J K L       Q R S T   X Y Z I U V) . un)
+        ((    C D   G H   K L   N     R S T       Z I U V) . uo)
+
+        (('("" . "")) . (cons "er" (cdr er)))
+
+        ((J Q X) . (cons "a" (cdr ia  )))
+        ((J Q X) . (cons "s" (cdr ia  )))
+        ((J Q X) . (cons "f" (cdr ian )))
+        ((J Q X) . (cons "g" (cdr iang)))
+        ((J Q X) . (cons "d" (cdr iao )))
+        ((J Q X) . (cons "e" (cdr ie  )))
+        ((J Q X) . (cons "w" (cdr ie  )))
+        ((J Q X) . (cons "r" (cdr in  )))
+        ((J Q X) . (cons "t" (cdr ing )))
+        ((J Q X) . (cons "q" (cdr iu  )))))
+
+       (its-define-erpin-qingsheng     H        "m")
+       (its-define-erpin-qingsheng     H        "n"    "ng")
+       (its-define-erpin-qingsheng     O        "m")
+       (its-define-erpin-qingsheng     O        "n")
+
+       (its-defrule    "on5"   "ng\e(0@\e(B")
+       (its-defrule    "on2"   "\e(0=@\e(B")
+       (its-defrule    "on3"   "\e(0>@\e(B")
+       (its-defrule    "on4"   "\e(0?@\e(B"))))
+
+(define-its-state-machine its-erpin-cn-map
+  "erpin-cn" "\e$A6~\e(BG" "Chinese-GB"
+  "Map for Erpin input. (Chinese-GB)"
+
+  (defconst its-quanjiao-escape "Z")
+  (defconst its-banjiao-escape  "X")
+
+  (its-defrule-select-mode-temporally "B" downcase)
+  (its-defrule-select-mode-temporally "Q" quanjiao-downcase-cn)
+
+  (its-define-erpin-table)
+  (its-defoutput*      "b "    "\e$A2;\e(B")
+  (its-defoutput*      "c "    "\e$A2E\e(B")
+  (its-defoutput*      "ch "   "\e$A3v\e(B")
+  (its-defoutput*      "d "    "\e$A5D\e(B")
+  (its-defoutput*      "f "    "\e$A74\e(B")
+  (its-defoutput*      "g "    "\e$A8v\e(B")
+  (its-defoutput*      "h "    "\e$A:M\e(B")
+  (its-defoutput*      "i "    "\e$AR;\e(B")
+  (its-defoutput*      "j "    "\e$A>M\e(B")
+  (its-defoutput*      "k "    "\e$A?I\e(B")
+  (its-defoutput*      "l "    "\e$AAK\e(B")
+  (its-defoutput*      "m "    "\e$AC?\e(B")
+  (its-defoutput*      "n "    "\e$ADj\e(B")
+  (its-defoutput*      "p "    "\e$AEz\e(B")
+  (its-defoutput*      "q "    "\e$AH%\e(B")
+  (its-defoutput*      "r "    "\e$AHU\e(B")
+  (its-defoutput*      "s "    "\e$AJG\e(B")
+  (its-defoutput*      "u "    "\e$AIO\e(B")
+  (its-defoutput*      "t "    "\e$AK{\e(B")
+  (its-defoutput*      "w "    "\e$ANR\e(B")
+  (its-defoutput*      "x "    "\e$AOr\e(B")
+  (its-defoutput*      "y "    "\e$ASV\e(B")
+  (its-defoutput*      "z "    "\e$ATZ\e(B")
+  (its-defoutput*      "v "    "\e$AWE\e(B")
+
+  (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")
+                  ("4" . "\e$A#4\e(B")  ("5" . "\e$A#5\e(B")  ("6" . "\e$A#6\e(B")  ("7" . "\e$A#7\e(B")
+                  ("8" . "\e$A#8\e(B")  ("9" . "\e$A#9\e(B") 
+                  (" " . "\e$A!!\e(B")  ("!" . "\e$A#!\e(B")  ("@" . "\e$A#@\e(B")  ("#" . "\e$A##\e(B")
+                  ("$" . "\e$A!g\e(B")  ("%" . "\e$A#%\e(B")  ("^" . "\e$A#^\e(B")  ("&" . "\e$A#&\e(B")
+                  ("*" . "\e$A#*\e(B")  ("(" . "\e$A#(\e(B")  (")" . "\e$A#)\e(B")
+                  ("-" . "\e$A#-\e(B")  ("=" . "\e$A#=\e(B")  ("`" . "\e$A#`\e(B")  ("\\" . "\e$A#\\e(B")
+                  ("|" . "\e$A#|\e(B")  ("_" . "\e$A#_\e(B")  ("+" . "\e$A#+\e(B")  ("~" . "\e$A!+\e(B")
+                  ("[" . "\e$A#[\e(B")  ("]" . "\e$A#]\e(B")  ("{" . "\e$A#{\e(B")  ("}" . "\e$A#}\e(B")
+                  (":" . "\e$A#:\e(B")  (";" . "\e$A#;\e(B")  ("\"" . "\e$A#"\e(B") ("'" . "\e$A#'\e(B")
+                  ("<" . "\e$A#<\e(B")  (">" . "\e$A#>\e(B")  ("?" . "\e$A#?\e(B")  ("/" . "\e$A#/\e(B")
+                  ("," . "\e$A#,\e(B")  ("." . "\e$A#.\e(B")
+                  ("a" . "\e$A#a\e(B")  ("b" . "\e$A#b\e(B")  ("c" . "\e$A#c\e(B")  ("d" . "\e$A#d\e(B")
+                  ("e" . "\e$A#e\e(B")  ("f" . "\e$A#f\e(B")  ("g" . "\e$A#g\e(B")  ("h" . "\e$A#h\e(B")
+                  ("i" . "\e$A#i\e(B")  ("j" . "\e$A#j\e(B")  ("k" . "\e$A#k\e(B")  ("l" . "\e$A#l\e(B")
+                  ("m" . "\e$A#m\e(B")  ("n" . "\e$A#n\e(B")  ("o" . "\e$A#o\e(B")  ("p" . "\e$A#p\e(B")
+                  ("q" . "\e$A#q\e(B")  ("r" . "\e$A#r\e(B")  ("s" . "\e$A#s\e(B")  ("t" . "\e$A#t\e(B")
+                  ("u" . "\e$A#u\e(B")  ("v" . "\e$A#v\e(B")  ("w" . "\e$A#w\e(B")  ("x" . "\e$A#x\e(B")
+                  ("y" . "\e$A#y\e(B")  ("z" . "\e$A#z\e(B")
+                  ("A" . "\e$A#A\e(B")  ("B" . "\e$A#B\e(B")  ("C" . "\e$A#C\e(B")  ("D" . "\e$A#D\e(B")
+                  ("E" . "\e$A#E\e(B")  ("F" . "\e$A#F\e(B")  ("G" . "\e$A#G\e(B")  ("H" . "\e$A#H\e(B")
+                  ("I" . "\e$A#I\e(B")  ("J" . "\e$A#J\e(B")  ("K" . "\e$A#K\e(B")  ("L" . "\e$A#L\e(B")
+                  ("M" . "\e$A#M\e(B")  ("N" . "\e$A#N\e(B")  ("O" . "\e$A#O\e(B")  ("P" . "\e$A#P\e(B")
+                  ("Q" . "\e$A#Q\e(B")  ("R" . "\e$A#R\e(B")  ("S" . "\e$A#S\e(B")  ("T" . "\e$A#T\e(B")
+                  ("U" . "\e$A#U\e(B")  ("V" . "\e$A#V\e(B")  ("W" . "\e$A#W\e(B")  ("X" . "\e$A#X\e(B")
+                  ("Y" . "\e$A#Y\e(B")  ("Z" . "\e$A#Z\e(B")))
+    (let ((in (car ascii)) (out (cdr ascii)))
+      (its-defrule (concat its-banjiao-escape in) in)
+      (its-defrule (concat its-quanjiao-escape in) out)))
+
+  (its-defrule ","     "\e$A#,\e(B")
+  (its-defrule "."     "\e$A!#\e(B")
+  (its-defrule "/"     "\e$A!"\e(B")
+  (its-defrule ":"     "\e$A#:\e(B")
+  (its-defrule ";"     "\e$A#;\e(B")
+  (its-defrule "?"     "\e$A#?\e(B")
+  (its-defrule "!"     "\e$A#!\e(B"))
+
+(define-its-state-machine its-erpin-tw-map
+  "erpin-tw" "\e$(GD(\e(BC" "Chinese-CNS"
+  "Map for Erpin input."
+
+  (defconst its-quanjiao-escape "Z")
+  (defconst its-banjiao-escape  "X")
+
+  (its-defrule-select-mode-temporally "B" downcase)
+  (its-defrule-select-mode-temporally "Q" quanjiao-downcase-cn)
+
+  (its-define-erpin-table)
+  (its-defoutput*      "b "    "\e$(GDb\e(B")
+  (its-defoutput*      "c "    "\e$(GD_\e(B")
+  (its-defoutput*      "ch "   "\e$(GEx\e(B")
+  (its-defoutput*      "d "    "\e$(GN{\e(B")
+  (its-defoutput*      "f "    "\e$(GE0\e(B")
+  (its-defoutput*      "g "    "\e$(GT6\e(B")
+  (its-defoutput*      "h "    "\e$(GLO\e(B")
+  (its-defoutput*      "i "    "\e$(GD!\e(B")
+  (its-defoutput*      "j "    "\e$(G^s\e(B")
+  (its-defoutput*      "k "    "\e$(GF+\e(B")
+  (its-defoutput*      "l "    "\e$(GD'\e(B")
+  (its-defoutput*      "m "    "\e$(GJd\e(B")
+  (its-defoutput*      "n "    "\e$(GH!\e(B")
+  (its-defoutput*      "p "    "\e$(GJG\e(B")
+  (its-defoutput*      "q "    "\e$(GF*\e(B")
+  (its-defoutput*      "r "    "\e$(GEJ\e(B")
+  (its-defoutput*      "s "    "\e$(GQR\e(B")
+  (its-defoutput*      "u "    "\e$(GD8\e(B")
+  (its-defoutput*      "t "    "\e$(GEl\e(B")
+  (its-defoutput*      "w "    "\e$(GJ<\e(B")
+  (its-defoutput*      "x "    "\e$(GGW\e(B")
+  (its-defoutput*      "y "    "\e$(GD4\e(B")
+  (its-defoutput*      "z "    "\e$(GGc\e(B")
+  (its-defoutput*      "v "    "\e$(Gaa\e(B")
+
+  (dolist (ascii '(("0" . "\e$(G$!\e(B")  ("1" . "\e$(G$"\e(B")  ("2" . "\e$(G$#\e(B")  ("3" . "\e$(G$$\e(B")
+                  ("4" . "\e$(G$%\e(B")  ("5" . "\e$(G$&\e(B")  ("6" . "\e$(G$'\e(B")  ("7" . "\e$(G$(\e(B")
+                  ("8" . "\e$(G$)\e(B")  ("9" . "\e$(G$*\e(B") 
+                  (" " . "\e$(G!!\e(B")  ("!" . "\e$(G!*\e(B")  ("@" . "\e$(G"i\e(B")  ("#" . "\e$(G!l\e(B")
+                  ("$" . "\e$(G"c\e(B")  ("%" . "\e$(G"h\e(B")  ("^" . "\e$(G!T\e(B")  ("&" . "\e$(G!m\e(B")
+                  ("*" . "\e$(G!n\e(B")  ("(" . "\e$(G!>\e(B")  (")" . "\e$(G!?\e(B")
+                  ("-" . "\e$(G"1\e(B")  ("=" . "\e$(G"8\e(B")  ("`" . "\e$(G!j\e(B")  ("\\" . "\e$(G"b\e(B")
+                  ("|" . "\e$(G"^\e(B")  ("_" . "\e$(G"%\e(B")  ("+" . "\e$(G"0\e(B")  ("~" . "\e$(G"D\e(B")
+                  ("[" . "\e$(G!b\e(B")  ("]" . "\e$(G!c\e(B")  ("{" . "\e$A#{\e(B")  ("}" . "\e$(G!a\e(B")
+                  (":" . "\e$(G!(\e(B")  (";" . "\e$(G!'\e(B")  ("\"" . "\e$(G!i\e(B") ("'" . "\e$(G!k\e(B")
+                  ("<" . "\e$(G"6\e(B")  (">" . "\e$(G"7\e(B")  ("?" . "\e$(G!)\e(B")  ("/" . "\e$(G"a\e(B")
+                  ("," . "\e$(G!"\e(B")  ("." . "\e$(G!%\e(B")
+                  ("a" . "\e$(G$[\e(B")  ("b" . "\e$(G$\\e(B")  ("c" . "\e$(G$]\e(B")  ("d" . "\e$(G$^\e(B")
+                  ("e" . "\e$(G$_\e(B")  ("f" . "\e$(G$`\e(B")  ("g" . "\e$(G$a\e(B")  ("h" . "\e$(G$b\e(B")
+                  ("i" . "\e$(G$c\e(B")  ("j" . "\e$(G$d\e(B")  ("k" . "\e$(G$e\e(B")  ("l" . "\e$(G$f\e(B")
+                  ("m" . "\e$(G$g\e(B")  ("n" . "\e$(G$h\e(B")  ("o" . "\e$(G$i\e(B")  ("p" . "\e$(G$j\e(B")
+                  ("q" . "\e$(G$k\e(B")  ("r" . "\e$(G$l\e(B")  ("s" . "\e$(G$m\e(B")  ("t" . "\e$(G$n\e(B")
+                  ("u" . "\e$(G$o\e(B")  ("v" . "\e$(G$p\e(B")  ("w" . "\e$(G$q\e(B")  ("x" . "\e$(G$r\e(B")
+                  ("y" . "\e$(G$s\e(B")  ("z" . "\e$(G$t\e(B")
+                  ("A" . "\e$(G$A\e(B")  ("B" . "\e$(G$B\e(B")  ("C" . "\e$(G$C\e(B")  ("D" . "\e$(G$D\e(B")
+                  ("E" . "\e$(G$E\e(B")  ("F" . "\e$(G$F\e(B")  ("G" . "\e$(G$G\e(B")  ("H" . "\e$(G$H\e(B")
+                  ("I" . "\e$(G$I\e(B")  ("J" . "\e$(G$J\e(B")  ("K" . "\e$(G$K\e(B")  ("L" . "\e$(G$L\e(B")
+                  ("M" . "\e$(G$M\e(B")  ("N" . "\e$(G$N\e(B")  ("O" . "\e$(G$O\e(B")  ("P" . "\e$(G$P\e(B")
+                  ("Q" . "\e$(G$Q\e(B")  ("R" . "\e$(G$R\e(B")  ("S" . "\e$(G$S\e(B")  ("T" . "\e$(G$T\e(B")
+                  ("U" . "\e$(G$U\e(B")  ("V" . "\e$(G$V\e(B")  ("W" . "\e$(G$W\e(B")  ("X" . "\e$(G$X\e(B")
+                  ("Y" . "\e$(G$Y\e(B")  ("Z" . "\e$(G$Z\e(B")))
+    (let ((in (car ascii)) (out (cdr ascii)))
+      (its-defrule (concat its-banjiao-escape in) in)
+      (its-defrule (concat its-quanjiao-escape in) out)))
+
+  (its-defrule ","     "\e$(G!"\e(B")
+  (its-defrule "."     "\e$(G!$\e(B")
+  (its-defrule "/"     "\e$(G!#\e(B")
+  (its-defrule ":"     "\e$(G!(\e(B")
+  (its-defrule ";"     "\e$(G!'\e(B")
+  (its-defrule "?"     "\e$(G!)\e(B")
+  (its-defrule "!"     "\e$(G!*\e(B"))
+
+(define-its-state-machine-append its-erpin-cn-map
+  (its-defrule "[" its-erpin-cn-open-braket)
+  (its-defrule "]" its-erpin-cn-close-braket)
+
+  (if its-erpin-cn-enable-quanjioao-alphabet
+      (progn
+       (its-defrule "1"  "\e$A#1\e(B")  (its-defrule "2"  "\e$A#2\e(B")
+       (its-defrule "3"  "\e$A#3\e(B")  (its-defrule "4"  "\e$A#4\e(B")
+       (its-defrule "5"  "\e$A#5\e(B")  (its-defrule "6"  "\e$A#6\e(B")
+       (its-defrule "7"  "\e$A#7\e(B")  (its-defrule "8"  "\e$A#8\e(B")
+       (its-defrule "9"  "\e$A#9\e(B")  (its-defrule "0"  "\e$A#0\e(B")
+       (its-defrule "@"  "\e$A#@\e(B")
+       (its-defrule "#"  "\e$A##\e(B")  (its-defrule "$"  "\e$A!g\e(B")
+       (its-defrule "%"  "\e$A#%\e(B")  (its-defrule "^"  "\e$A#^\e(B")
+       (its-defrule "&"  "\e$A#&\e(B")  (its-defrule "*"  "\e$A#*\e(B")
+       (its-defrule "("  "\e$A#(\e(B")  (its-defrule ")"  "\e$A#)\e(B")
+       (its-defrule "-"  "\e$A#-\e(B")  (its-defrule "~"  "\e$A!+\e(B")
+       (its-defrule "="  "\e$A#=\e(B")  (its-defrule "`"  "\e$A#`\e(B")
+       (its-defrule "\\" "\e$A#\\e(B")  (its-defrule "|"  "\e$A#|\e(B")
+       (its-defrule "_"  "\e$A#_\e(B")  (its-defrule "+"  "\e$A#+\e(B")
+       (its-defrule "{"  "\e$A#{\e(B")  (its-defrule "}"  "\e$A#}\e(B")
+       (its-defrule "\"" "\e$A#"\e(B")  (its-defrule "'"  "\e$A#'\e(B")
+       (its-defrule "<"  "\e$A#<\e(B")  (its-defrule ">"  "\e$A#>\e(B"))
+    (progn
+      (its-defrule "1"  "1")  (its-defrule "2"  "2")
+      (its-defrule "3"  "3")  (its-defrule "4"  "4")
+      (its-defrule "5"  "5")  (its-defrule "6"  "6")
+      (its-defrule "7"  "7")  (its-defrule "8"  "8")
+      (its-defrule "9"  "9")  (its-defrule "0"  "0")
+      (its-defrule "@"  "@")
+      (its-defrule "#"  "#")  (its-defrule "$"  "$")
+      (its-defrule "%"  "%")  (its-defrule "^"  "^")
+      (its-defrule "&"  "&")  (its-defrule "*"  "*")
+      (its-defrule "("  "(")  (its-defrule ")"  ")")
+      (its-defrule "-"  "-")  (its-defrule "~"  "~")
+      (its-defrule "="  "=")  (its-defrule "`"  "`")
+      (its-defrule "\\" "\\") (its-defrule "|"  "|")
+      (its-defrule "_"  "_")  (its-defrule "+"  "+")
+      (its-defrule "{"  "{")  (its-defrule "}"  "}")
+      (its-defrule "\"" "\"") (its-defrule "'"  "'")
+      (its-defrule "<"  "<")  (its-defrule ">"  ">"))))
+
+(define-its-state-machine-append its-erpin-tw-map
+  (its-defrule "[" its-erpin-tw-open-braket)
+  (its-defrule "]" its-erpin-tw-close-braket)
+
+  (if its-erpin-tw-enable-quanjioao-alphabet
+      (progn
+       (its-defrule "1"  "\e$(G$"\e(B")  (its-defrule "2"  "\e$(G$#\e(B")
+       (its-defrule "3"  "\e$(G$$\e(B")  (its-defrule "4"  "\e$(G$%\e(B")
+       (its-defrule "5"  "\e$(G$&\e(B")  (its-defrule "6"  "\e$(G$'\e(B")
+       (its-defrule "7"  "\e$(G$(\e(B")  (its-defrule "8"  "\e$(G$)\e(B")
+       (its-defrule "9"  "\e$(G$*\e(B")  (its-defrule "0"  "\e$(G$!\e(B")
+       (its-defrule "@"  "\e$(G"i\e(B")
+       (its-defrule "#"  "\e$(G!l\e(B")  (its-defrule "$"  "\e$(G"c\e(B")
+       (its-defrule "%"  "\e$(G"h\e(B")  (its-defrule "^"  "\e$(G!T\e(B")
+       (its-defrule "&"  "\e$(G!m\e(B")  (its-defrule "*"  "\e$(G!n\e(B")
+       (its-defrule "("  "\e$(G!>\e(B")  (its-defrule ")"  "\e$(G!?\e(B")
+       (its-defrule "-"  "\e$(G"1\e(B")  (its-defrule "~"  "\e$(G"D\e(B")
+       (its-defrule "="  "\e$(G"8\e(B")  (its-defrule "`"  "\e$(G!j\e(B")
+       (its-defrule "\\" "\e$(G"b\e(B")  (its-defrule "|"  "\e$(G"^\e(B")
+       (its-defrule "_"  "\e$(G"%\e(B")  (its-defrule "+"  "\e$(G"0\e(B")
+       (its-defrule "{"  "\e$A#{\e(B")  (its-defrule "}"  "\e$(G!a\e(B")
+       (its-defrule "\"" "\e$(G!i\e(B")  (its-defrule "'"  "\e$(G!k\e(B")
+       (its-defrule "<"  "\e$(G"6\e(B")  (its-defrule ">"  "\e$(G"7\e(B"))
+    (progn
+      (its-defrule "1"  "1")  (its-defrule "2"  "2")
+      (its-defrule "3"  "3")  (its-defrule "4"  "4")
+      (its-defrule "5"  "5")  (its-defrule "6"  "6")
+      (its-defrule "7"  "7")  (its-defrule "8"  "8")
+      (its-defrule "9"  "9")  (its-defrule "0"  "0")
+      (its-defrule "@"  "@")
+      (its-defrule "#"  "#")  (its-defrule "$"  "$")
+      (its-defrule "%"  "%")  (its-defrule "^"  "^")
+      (its-defrule "&"  "&")  (its-defrule "*"  "*")
+      (its-defrule "("  "(")  (its-defrule ")"  ")")
+      (its-defrule "-"  "-")  (its-defrule "~"  "~")
+      (its-defrule "="  "=")  (its-defrule "`"  "`")
+      (its-defrule "\\" "\\") (its-defrule "|"  "|")
+      (its-defrule "_"  "_")  (its-defrule "+"  "+")
+      (its-defrule "{"  "{")  (its-defrule "}"  "}")
+      (its-defrule "\"" "\"") (its-defrule "'"  "'")
+      (its-defrule "<"  "<")  (its-defrule ">"  ">"))))
+
+(provide 'its/erpin)
index a37f32e..888c434 100644 (file)
@@ -1,15 +1,45 @@
+;;; its/hangul.el --- Hangul Input in Egg Input Method Architecture
+
+;; Copyright (C) 1997, 1998 Mule Project,
+;; Powered by Electrotechnical Laboratory, JAPAN.
+;; Project Leader: Satoru Tomura <tomura@etl.go.jp>
+
+;; Author: NIIBE Yutaka <gniibe@mri.co.jp>
+;;         KATAYAMA Yoshio <kate@pfu.co.jp>
+
+;; This file will be part of GNU Emacs (in future).
+
+;; GNU Emacs is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2, or (at your option)
+;; any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+
+;;; Code:
+
 (eval-when-compile
   (require 'its)
   (require 'cl))
 
+(defvar its-hangul-enable-jeonkak-alphabet t "*Enable Jeonkak alphabet")
+(defvar        its-hangul-period ". " "*\e$(C#.\e(B")    ; ". " "\e$(C#.\e(B"
+(defvar        its-hangul-comma  ", " "*\e$(C#,\e(B")    ; ", " "\e$(C#,\e(B"
 (defvar its-hangul-open-bracket  "\e$(C!8\e(B" "*[")  ; "\e$(C#[\e(B"
-(defvar its-hangul-close-bracket  "\e$(C!9\e(B" "*]") ; "\e$(C#]\e(B"
+(defvar its-hangul-close-bracket "\e$(C!9\e(B" "*]")  ; "\e$(C#]\e(B"
 
 (eval-when-compile
-
- (defvar its-jeonkak-escape "J")
- (defvar its-pankak-escape  "B")
-
  (defconst its-hangul-kijuhynbmlopOP
    (its-make-class+back "[kijuhynbmlopOP]" -2))
  (defconst its-hangul-kijuhynbmlopP
      (its-defrule-otherwise state output))))
 
 (define-its-state-machine its-hangul-map
-  "hangul" "\e$(CGQ\e(B" "korean"
+  "hangul" "\e$(CGQ\e(B" "Korean"
   "Map for Hangul input. (Korean)"
+
+  (defconst its-jeonkak-escape "Z")
+  (defconst its-pankak-escape  "X")
+
+  (its-defrule-select-mode-temporally "B" downcase)
+  (its-defrule-select-mode-temporally "J" jeonkak-downcase)
+
   (its-defrule-hangul  "r"     "\e$(C$!\e(B")
   (its-defrule-hangul  "s"     "\e$(C$$\e(B")
   (its-defrule-hangul  "e"     "\e$(C$'\e(B")
     (its-define-hangul "glt"   "\e$(CH}\e(B"     kijuhynbmlopOP)
     (its-define-hangul "gld"   "\e$(CH~\e(B"     kijuhynbmlopOP))
 
-  ;;; Jeonkak Symbols
-
-  (its-defrule   "1"   "\e$(C#1\e(B")
-  (its-defrule   "2"   "\e$(C#2\e(B")
-  (its-defrule   "3"   "\e$(C#3\e(B")
-  (its-defrule   "4"   "\e$(C#4\e(B")
-  (its-defrule   "5"   "\e$(C#5\e(B")
-  (its-defrule   "6"   "\e$(C#6\e(B")
-  (its-defrule   "7"   "\e$(C#7\e(B")
-  (its-defrule   "8"   "\e$(C#8\e(B")
-  (its-defrule   "9"   "\e$(C#9\e(B")
-  (its-defrule   "0"   "\e$(C#0\e(B")
-
-  ;;(its-defrule   " "   "\e$(C!!\e(B")
-  (its-defrule   "!"   "\e$(C#!\e(B")
-  (its-defrule   "@"   "\e$(C#@\e(B")
-  (its-defrule   "#"   "\e$(C##\e(B")
-  (its-defrule   "$"   "\e$(C#$\e(B")
-  (its-defrule   "%"   "\e$(C#%\e(B")
-  (its-defrule   "^"   "\e$(C#^\e(B")
-  (its-defrule   "&"   "\e$(C#&\e(B")
-  (its-defrule   "*"   "\e$(C#*\e(B")
-  (its-defrule   "("   "\e$(C#(\e(B")
-  (its-defrule   ")"   "\e$(C#)\e(B")
-  (its-defrule   "-"   "\e$(C#-\e(B")
-  (its-defrule   "="   "\e$(C#=\e(B")
-  (its-defrule   "`"   "\e$(C#`\e(B")
-  (its-defrule   "\\"  "\e$(C#\\e(B")
-  (its-defrule   "|"   "\e$(C#|\e(B")
-  (its-defrule   "_"   "\e$(C#_\e(B")
-  (its-defrule   "+"   "\e$(C#+\e(B")
-  (its-defrule   "~"   "\e$(C#~\e(B")
-  (its-defrule   "["   "\e$(C!8\e(B");;(its-defrule   "["   "\e$(C#[\e(B")
-  (its-defrule   "]"   "\e$(C!9\e(B");;(its-defrule   "]"   "\e$(C#]\e(B")
-  (its-defrule   "{"   "\e$(C#{\e(B")
-  (its-defrule   "}"   "\e$(C#}\e(B")
-  (its-defrule   ":"   "\e$(C#:\e(B")
-  (its-defrule   ";"   "\e$(C#;\e(B")
-  (its-defrule   "\""  "\e$(C#"\e(B")
-  (its-defrule   "'"   "\e$(C#'\e(B")
-  (its-defrule   "<"   "\e$(C#<\e(B")
-  (its-defrule   ">"   "\e$(C#>\e(B")
-  (its-defrule   "?"   "\e$(C#?\e(B")
-  (its-defrule   "/"   "\e$(C#/\e(B")
-  (its-defrule   ","   "\e$(C#,\e(B")
-  (its-defrule   "."   "\e$(C#.\e(B")
-
-  (its-defrule (concat its-jeonkak-escape " ") "\e$(C!!\e(B")
-  (let ((i ?!))
-    (while (<= i ?~)
-      (its-defrule (concat its-jeonkak-escape (char-to-string i))
-                  (char-to-string (+ (- ?\e$(C#!\e(B ?!) i)))
-      (setq i (1+ i))))
-
-  ;;; pankak 
-  (let ((i ?!))
-    (while (<= i ?~)
-      (its-defrule (concat its-pankak-escape (char-to-string i))
-                  (char-to-string i))
-       (setq i (1+ i)))))
+  (dolist (ascii '(("1" . "\e$(C#1\e(B")  ("2" . "\e$(C#2\e(B")  ("3" . "\e$(C#3\e(B")  ("4" . "\e$(C#4\e(B")
+                  ("5" . "\e$(C#5\e(B")  ("6" . "\e$(C#6\e(B")  ("7" . "\e$(C#7\e(B")  ("8" . "\e$(C#8\e(B")
+                  ("9" . "\e$(C#9\e(B")  ("0" . "\e$(C#0\e(B")
+                  (" " . "\e$(C!!\e(B")  ("!" . "\e$(C#!\e(B")  ("@" . "\e$(C#@\e(B")  ("#" . "\e$(C##\e(B")
+                  ("$" . "\e$(C#$\e(B")  ("%" . "\e$(C#%\e(B")  ("^" . "\e$(C#^\e(B")  ("&" . "\e$(C#&\e(B")
+                  ("*" . "\e$(C#*\e(B")  ("(" . "\e$(C#(\e(B")  (")" . "\e$(C#)\e(B")
+                  ("-" . "\e$(C#-\e(B")  ("=" . "\e$(C#=\e(B")  ("`" . "\e$(C#`\e(B")  ("\\" . "\e$(C#\\e(B")
+                  ("|" . "\e$(C#|\e(B")  ("_" . "\e$(C#_\e(B")  ("+" . "\e$(C#+\e(B")  ("~" . "\e$(C#~\e(B")
+                  ("[" . "\e$(C!8\e(B")  ("]" . "\e$(C!9\e(B")  ("{" . "\e$(C#{\e(B")  ("}" . "\e$(C#}\e(B")
+                  (":" . "\e$(C#:\e(B")  (";" . "\e$(C#;\e(B")  ("\"" . "\e$(C#"\e(B") ("'" . "\e$(C#'\e(B")
+                  ("<" . "\e$(C#<\e(B")  (">" . "\e$(C#>\e(B")  ("?" . "\e$(C#?\e(B")  ("/" . "\e$(C#/\e(B")
+                  ("," . "\e$(C#,\e(B")  ("." . "\e$(C#.\e(B")
+                  ("a" . "\e$(C#a\e(B")  ("b" . "\e$(C#b\e(B")  ("c" . "\e$(C#c\e(B")  ("d" . "\e$(C#d\e(B")
+                  ("e" . "\e$(C#e\e(B")  ("f" . "\e$(C#f\e(B")  ("g" . "\e$(C#g\e(B")  ("h" . "\e$(C#h\e(B")
+                  ("i" . "\e$(C#i\e(B")  ("j" . "\e$(C#j\e(B")  ("k" . "\e$(C#k\e(B")  ("l" . "\e$(C#l\e(B")
+                  ("m" . "\e$(C#m\e(B")  ("n" . "\e$(C#n\e(B")  ("o" . "\e$(C#o\e(B")  ("p" . "\e$(C#p\e(B")
+                  ("q" . "\e$(C#q\e(B")  ("r" . "\e$(C#r\e(B")  ("s" . "\e$(C#s\e(B")  ("t" . "\e$(C#t\e(B")
+                  ("u" . "\e$(C#u\e(B")  ("v" . "\e$(C#v\e(B")  ("w" . "\e$(C#w\e(B")  ("x" . "\e$(C#x\e(B")
+                  ("y" . "\e$(C#y\e(B")  ("z" . "\e$(C#z\e(B")
+                  ("A" . "\e$(C#A\e(B")  ("B" . "\e$(C#B\e(B")  ("C" . "\e$(C#C\e(B")  ("D" . "\e$(C#D\e(B")
+                  ("E" . "\e$(C#E\e(B")  ("F" . "\e$(C#F\e(B")  ("G" . "\e$(C#G\e(B")  ("H" . "\e$(C#H\e(B")
+                  ("I" . "\e$(C#I\e(B")  ("J" . "\e$(C#J\e(B")  ("K" . "\e$(C#K\e(B")  ("L" . "\e$(C#L\e(B")
+                  ("M" . "\e$(C#M\e(B")  ("N" . "\e$(C#N\e(B")  ("O" . "\e$(C#O\e(B")  ("P" . "\e$(C#P\e(B")
+                  ("Q" . "\e$(C#Q\e(B")  ("R" . "\e$(C#R\e(B")  ("S" . "\e$(C#S\e(B")  ("T" . "\e$(C#T\e(B")
+                  ("U" . "\e$(C#U\e(B")  ("V" . "\e$(C#V\e(B")  ("W" . "\e$(C#W\e(B")  ("X" . "\e$(C#X\e(B")
+                  ("Y" . "\e$(C#Y\e(B")  ("Z" . "\e$(C#Z\e(B")))
+    (let ((in (car ascii)) (out (cdr ascii)))
+      (its-defrule (concat its-pankak-escape in) in)
+      (its-defrule (concat its-jeonkak-escape in) out))))
 
 (define-its-state-machine-append its-hangul-map
-  (its-defrule "[" its-hangul-open-bracket  nil t)
-  (its-defrule "]" its-hangul-close-bracket nil t)
-  )
+  (its-defrule "[" its-hangul-open-bracket)
+  (its-defrule "]" its-hangul-close-bracket)
+  (its-defrule "." its-hangul-period)
+  (its-defrule "," its-hangul-comma)
+
+  (if its-hangul-enable-jeonkak-alphabet
+      (progn
+       (its-defrule   "1"   "\e$(C#1\e(B")  (its-defrule   "2"   "\e$(C#2\e(B")
+       (its-defrule   "3"   "\e$(C#3\e(B")  (its-defrule   "4"   "\e$(C#4\e(B")
+       (its-defrule   "5"   "\e$(C#5\e(B")  (its-defrule   "6"   "\e$(C#6\e(B")
+       (its-defrule   "7"   "\e$(C#7\e(B")  (its-defrule   "8"   "\e$(C#8\e(B")
+       (its-defrule   "9"   "\e$(C#9\e(B")  (its-defrule   "0"   "\e$(C#0\e(B")
+       (its-defrule   "!"   "\e$(C#!\e(B")  (its-defrule   "@"   "\e$(C#@\e(B")
+       (its-defrule   "#"   "\e$(C##\e(B")  (its-defrule   "$"   "\e$(C#$\e(B")
+       (its-defrule   "%"   "\e$(C#%\e(B")  (its-defrule   "^"   "\e$(C#^\e(B")
+       (its-defrule   "&"   "\e$(C#&\e(B")  (its-defrule   "*"   "\e$(C#*\e(B")
+       (its-defrule   "("   "\e$(C#(\e(B")  (its-defrule   ")"   "\e$(C#)\e(B")
+       (its-defrule   "-"   "\e$(C#-\e(B")  (its-defrule   "~"   "\e$(C#~\e(B")
+       (its-defrule   "="   "\e$(C#=\e(B")  (its-defrule   "`"   "\e$(C#`\e(B")
+       (its-defrule   "\\"  "\e$(C#\\e(B")  (its-defrule   "|"   "\e$(C#|\e(B")
+       (its-defrule   "_"   "\e$(C#_\e(B")  (its-defrule   "+"   "\e$(C#+\e(B")
+       (its-defrule   "{"   "\e$(C#{\e(B")  (its-defrule   "}"   "\e$(C#}\e(B")
+       (its-defrule   ":"   "\e$(C#:\e(B")  (its-defrule   ";"   "\e$(C#;\e(B")
+       (its-defrule   "\""  "\e$(C#"\e(B")  (its-defrule   "'"   "\e$(C#'\e(B")
+       (its-defrule   "<"   "\e$(C#<\e(B")  (its-defrule   ">"   "\e$(C#>\e(B")
+       (its-defrule   "?"   "\e$(C#?\e(B")  (its-defrule   "/"   "\e$(C#/\e(B"))
+    (progn
+      (its-defrule   "1"   "1")  (its-defrule   "2"   "2")
+      (its-defrule   "3"   "3")  (its-defrule   "4"   "4")
+      (its-defrule   "5"   "5")  (its-defrule   "6"   "6")
+      (its-defrule   "7"   "7")  (its-defrule   "8"   "8")
+      (its-defrule   "9"   "9")  (its-defrule   "0"   "0")
+      (its-defrule   "!"   "!")  (its-defrule   "@"   "@")
+      (its-defrule   "#"   "#")  (its-defrule   "$"   "$")
+      (its-defrule   "%"   "%")  (its-defrule   "^"   "^")
+      (its-defrule   "&"   "&")  (its-defrule   "*"   "*")
+      (its-defrule   "("   "(")  (its-defrule   ")"   ")")
+      (its-defrule   "-"   "-")  (its-defrule   "~"   "~")
+      (its-defrule   "="   "=")  (its-defrule   "`"   "`")
+      (its-defrule   "\\"  "\\") (its-defrule   "|"   "|")
+      (its-defrule   "_"   "_")  (its-defrule   "+"   "+")
+      (its-defrule   "{"   "{")  (its-defrule   "}"   "}")
+      (its-defrule   ":"   ":")  (its-defrule   ";"   ";")
+      (its-defrule   "\""  "\"") (its-defrule   "'"   "'")
+      (its-defrule   "<"   "<")  (its-defrule   ">"   ">")
+      (its-defrule   "?"   "?")  (its-defrule   "/"   "/"))))
 
 (provide 'its/hangul)
diff --git a/its/hankata.el b/its/hankata.el
new file mode 100644 (file)
index 0000000..fc51124
--- /dev/null
@@ -0,0 +1,291 @@
+;;; its/hankata.el --- Hnakaku Katakana Input in Egg Input Method Architecture
+
+;; Copyright (C) 1997, 1998 Mule Project,
+;; Powered by Electrotechnical Laboratory, JAPAN.
+;; Project Leader: Satoru Tomura <tomura@etl.go.jp>
+
+;; Author: Satoru Tomura <tomura@etl.go.jp>
+
+;; This file will be part of GNU Emacs (in future).
+
+;; GNU Emacs is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2, or (at your option)
+;; any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+;;
+;; Symbol input is desined by jiro@math.keio.ac.jp (TANAKA Jiro)
+;; This file is based on the rules of its/kata.el in Mule-2.3 distribution.
+;;
+
+;;; Code:
+
+(eval-when-compile
+  (require 'its)
+  (require 'cl))
+
+(defvar its-kata-enable-double-n nil "*Enable \"nn\" input for \"\e$B%s\e(B\" ")
+(defvar its-kata-enable-zenkaku-alphabet t "*Enable Zenkaku alphabet")
+(defvar its-kata-period "\e(I!\e(B" "*\e$B%T%j%*%I\e(B")  ; ". " "\e$B!%\e(B"
+(defvar its-kata-comma  "\e(I$\e(B" "*\e$B%3%s%^\e(B")    ; ", " "\e$B!$\e(B"
+(defvar its-kata-open-bracket  "\e(I"\e(B" "*[")  ; "\e$B!N\e(B"
+(defvar its-kata-close-bracket  "\e(I#\e(B" "*]") ; "\e$B!O\e(B"
+(defvar its-kata-horizontal  "\e(I0\e(B" "*-")    ; "\e$B!]\e(B"
+
+(define-its-state-machine its-han-kata-map
+  "roma-han-kata" "\e(I11\e(B" "Japanese" nil
+  "Map for Romaji-Hankaku-Katakana translation. (Japanese)"
+
+  (defconst its-hankaku-escape "~")  ;; Escape character to Hankaku inputs
+
+  (its-defrule-select-mode-temporally "q" downcase)
+
+;;; k      k
+;;; kk     \e$B%C\e(Bk
+;;; kka    \e$B%C%+\e(B
+;;;
+;;; kkk    \e$B%C\e(Bk DING!
+
+  (its-defrule "tch"  "\e(I/\e(B" -2)
+
+;;; \e$B!V%s!W$NF~NO\e(B
+
+  (dolist (q1 '("b" "m" "p"))
+    (its-defrule (concat "m" q1) "\e(I]\e(B" -1))
+
+  (its-defrule "N" "\e(I]\e(B")
+
+  (let ((state (its-goto-state "n" nil t)))
+    (its-make-next-state state -1 "n" "\e(I]\e(B")
+    (its-make-next-state state ?' "n" "\e(I]\e(B")
+    (its-defrule-otherwise state "\e(I]\e(B"))
+
+  (let ((small '"x" ))
+    (its-defrule (concat small "a") "\e(I'\e(B")
+    (its-defrule (concat small "i") "\e(I(\e(B")
+    (its-defrule (concat small "u") "\e(I)\e(B")
+    (its-defrule (concat small "e") "\e(I*\e(B")
+    (its-defrule (concat small "o") "\e(I+\e(B")
+    (its-defrule (concat small "ya") "\e(I,\e(B")
+    (its-defrule (concat small "yu") "\e(I-\e(B")
+    (its-defrule (concat small "yo") "\e(I.\e(B")
+    (its-defrule (concat small "tu") "\e(I/\e(B")
+    (its-defrule (concat small "tsu") "\e(I/\e(B")
+    (its-defrule (concat small "wa") "\e(I\\e(B")
+    )
+
+  (its-defrule   "a"    "\e(I1\e(B")
+  (its-defrule   "i"    "\e(I2\e(B")
+  (its-defrule   "u"    "\e(I3\e(B")
+  (its-defrule   "e"    "\e(I4\e(B")
+  (its-defrule   "o"    "\e(I5\e(B")
+
+  (dolist (k '(("ka"  "\e(I6\e(B") ("ki"  "\e(I7\e(B") ("ku"  "\e(I8\e(B") ("ke"  "\e(I9\e(B") ("ko"  "\e(I:\e(B")
+              ("kya" "\e(I7,\e(B") ("kyu"  "\e(I7-\e(B") ("kye"  "\e(I7*\e(B") ("kyo"  "\e(I7.\e(B")))
+    (its-defrule (car k) (cadr k))
+    (its-defrule (concat "k" (car k)) (concat "\e(I/\e(B" (cadr k))))
+  (its-defoutput "kk" "\e(I/\e(Bk")
+  (its-defoutput "kky" "\e(I/\e(Bky")
+
+  (dolist (s '(("sa"  "\e(I;\e(B") ("si"  "\e(I<\e(B") ("su"  "\e(I=\e(B") ("se"  "\e(I>\e(B") ("so"  "\e(I?\e(B")
+              ("sya"  "\e(I<,\e(B") ("syu"  "\e(I<-\e(B") ("sye"  "\e(I<*\e(B") ("syo"  "\e(I<.\e(B")
+              ("sha"  "\e(I<,\e(B") ("shi"  "\e(I<\e(B") ("shu"  "\e(I<-\e(B") ("she"  "\e(I<*\e(B")
+              ("sho"  "\e(I<.\e(B")))
+    (its-defrule (car s) (cadr s))
+    (its-defrule (concat "s" (car s)) (concat "\e(I/\e(B" (cadr s))))
+  (its-defoutput "ss" "\e(I/\e(Bs")
+  (its-defoutput "ssy" "\e(I/\e(Bsy")
+  (its-defoutput "ssh" "\e(I/\e(Bsh")
+
+  (dolist (T '(("ta"  "\e(I@\e(B") ("ti"  "\e(IA\e(B") ("tu"  "\e(IB\e(B") ("te"  "\e(IC\e(B") ("to"  "\e(ID\e(B")
+              ("tya"  "\e(IA,\e(B") ("tyi"  "\e(IC(\e(B") ("tyu"  "\e(IA-\e(B") ("tye"  "\e(IA*\e(B")
+              ("tyo"  "\e(IA.\e(B") ("tsu"  "\e(IB\e(B")))
+    (its-defrule (car T) (cadr T))
+    (its-defrule (concat "t" (car T)) (concat "\e(I/\e(B" (cadr T))))
+  (its-defoutput "tt" "\e(I/\e(Bt")
+  (its-defoutput "tty" "\e(I/\e(Bty")
+  (its-defoutput "tts" "\e(I/\e(Bts")
+
+  (dolist (c '(("cha"  "\e(IA,\e(B") ("chi"  "\e(IA\e(B") ("chu"  "\e(IA-\e(B")
+              ("che"  "\e(IA*\e(B") ("cho"  "\e(IA.\e(B")))
+    (its-defrule (car c) (cadr c))
+    (its-defrule (concat "c" (car c)) (concat "\e(I/\e(B" (cadr c))))
+  (its-defoutput "cc" "\e(I/\e(Bc")
+  (its-defoutput "cch" "\e(I/\e(Bch")
+
+  (dolist (h '(("ha"  "\e(IJ\e(B") ("hi"  "\e(IK\e(B") ("hu"  "\e(IL\e(B") ("he"  "\e(IM\e(B") ("ho"  "\e(IN\e(B")
+              ("hya"  "\e(IK,\e(B") ("hyu"  "\e(IK-\e(B") ("hye"  "\e(IK*\e(B") ("hyo"  "\e(IK.\e(B")))
+    (its-defrule (car h) (cadr h))
+    (its-defrule (concat "h" (car h)) (concat "\e(I/\e(B" (cadr h))))
+  (its-defoutput "hh" "\e(I/\e(Bh")
+  (its-defoutput "hhy" "\e(I/\e(Bhy")
+
+  (dolist (f '(("fa"  "\e(IL'\e(B") ("fi"  "\e(IL(\e(B") ("fu"  "\e(IL\e(B") ("fe"  "\e(IL*\e(B")
+              ("fo"  "\e(IL+\e(B")))
+    (its-defrule (car f) (cadr f))
+    (its-defrule (concat "f" (car f)) (concat "\e(I/\e(B" (cadr f))))
+  (its-defoutput "ff" "\e(I/\e(Bf")
+
+  (dolist (r '(("ra"  "\e(IW\e(B") ("ri"  "\e(IX\e(B") ("ru"  "\e(IY\e(B") ("re"  "\e(IZ\e(B") ("ro"  "\e(I[\e(B")
+              ("rya"  "\e(IX,\e(B") ("ryu"  "\e(IX-\e(B") ("rye"  "\e(IX*\e(B") ("ryo"  "\e(IX.\e(B")))
+    (its-defrule (car r) (cadr r))
+    (its-defrule (concat "r" (car r)) (concat "\e(I/\e(B" (cadr r))))
+  (its-defoutput "rr" "\e(I/\e(Br")
+  (its-defoutput "rry" "\e(I/\e(Bry")
+
+  (dolist (l '(("la"  "\e(IW\e(B") ("li"  "\e(IX\e(B") ("lu"  "\e(IY\e(B") ("le"  "\e(IZ\e(B") ("lo"  "\e(I[\e(B")
+              ("lya"  "\e(IX,\e(B") ("lyu"  "\e(IX-\e(B") ("lye"  "\e(IX*\e(B") ("lyo"  "\e(IX.\e(B")))
+    (its-defrule (car l) (cadr l))
+    (its-defrule (concat "l" (car l)) (concat "\e(I/\e(B" (cadr l))))
+  (its-defoutput "ll" "\e(I/\e(Bl")
+  (its-defoutput "lly" "\e(I/\e(Bly")
+
+  (dolist (g '(("ga"  "\e(I6^\e(B") ("gi"  "\e(I7^\e(B") ("gu"  "\e(I8^\e(B") ("ge"  "\e(I9^\e(B") ("go"  "\e(I:^\e(B")
+              ("gya"  "\e(I7^,\e(B") ("gyu"  "\e(I7^-\e(B") ("gye"  "\e(I7^*\e(B") ("gyo"  "\e(I7^.\e(B")))
+    (its-defrule (car g) (cadr g))
+    (its-defrule (concat "g" (car g)) (concat "\e(I/\e(B" (cadr g))))
+  (its-defoutput "gg" "\e(I/\e(Bg")
+  (its-defoutput "ggy" "\e(I/\e(Bgy")
+
+  (dolist (z '(("za"  "\e(I;^\e(B") ("zi"  "\e(I<^\e(B") ("zu"  "\e(I=^\e(B") ("ze"  "\e(I>^\e(B") ("zo"  "\e(I?^\e(B")
+              ("zya"  "\e(I<^,\e(B") ("zyu"  "\e(I<^-\e(B") ("zye"  "\e(I<^*\e(B") ("zyo"  "\e(I<^.\e(B")))
+    (its-defrule (car z) (cadr z))
+    (its-defrule (concat "z" (car z)) (concat "\e(I/\e(B" (cadr z))))
+  (its-defoutput "zz" "\e(I/\e(Bz")
+  (its-defoutput "zzy" "\e(I/\e(Bzy")
+
+  (dolist (j '(("ja"  "\e(I<^,\e(B") ("ji"  "\e(I<^\e(B") ("ju"  "\e(I<^-\e(B") ("je"  "\e(I<^*\e(B")
+              ("jo"  "\e(I<^.\e(B") ("jya"  "\e(I<^,\e(B") ("jyu"  "\e(I<^-\e(B") ("jye"  "\e(I<^*\e(B")
+              ("jyo"  "\e(I<^.\e(B")))
+    (its-defrule (car j) (cadr j))
+    (its-defrule (concat "j" (car j)) (concat "\e(I/\e(B" (cadr j))))
+  (its-defoutput "jj" "\e(I/\e(Bj")
+  (its-defoutput "jjy" "\e(I/\e(Bjy")
+
+  (dolist (d '(("da"  "\e(I@^\e(B") ("di"  "\e(IA^\e(B") ("du"  "\e(IB^\e(B") ("de"  "\e(IC^\e(B") ("do"  "\e(ID^\e(B")
+              ("dya"  "\e(IA^,\e(B") ("dyi"  "\e(IC^(\e(B") ("dyu"  "\e(IA^-\e(B") ("dye"  "\e(IA^*\e(B")
+              ("dyo"  "\e(IA^.\e(B")))
+    (its-defrule (car d) (cadr d))
+    (its-defrule (concat "d" (car d)) (concat "\e(I/\e(B" (cadr d))))
+  (its-defoutput "dd" "\e(I/\e(Bd")
+  (its-defoutput "ddy" "\e(I/\e(Bdy")
+
+  (dolist (b '(("ba"  "\e(IJ^\e(B") ("bi"  "\e(IK^\e(B") ("bu"  "\e(IL^\e(B") ("be"  "\e(IM^\e(B") ("bo"  "\e(IN^\e(B")
+              ("bya"  "\e(IK^,\e(B") ("byu"  "\e(IK^-\e(B") ("bye"  "\e(IK^*\e(B") ("byo"  "\e(IK^.\e(B")))
+    (its-defrule (car b) (cadr b))
+    (its-defrule (concat "b" (car b)) (concat "\e(I/\e(B" (cadr b))))
+  (its-defoutput "bb" "\e(I/\e(Bb")
+  (its-defoutput "bby" "\e(I/\e(Bby")
+
+  (dolist (p '(("pa"  "\e(IJ_\e(B") ("pi"  "\e(IK_\e(B") ("pu"  "\e(IL_\e(B") ("pe"  "\e(IM_\e(B") ("po"   "\e(IN_\e(B")
+              ("pya"  "\e(IK_,\e(B") ("pyu"  "\e(IK_-\e(B") ("pye"  "\e(IK_*\e(B") ("pyo"  "\e(IK_.\e(B")))
+    (its-defrule (car p) (cadr p))
+    (its-defrule (concat "p" (car p)) (concat "\e(I/\e(B" (cadr p))))
+  (its-defoutput "pp" "\e(I/\e(Bp")
+  (its-defoutput "ppy" "\e(I/\e(Bpy")
+
+  (dolist (v '(("va" "\e(I3^'\e(B") ("vi" "\e(I3^(\e(B") ("vu" "\e(I3^\e(B") ("ve" "\e(I3^*\e(B")
+              ("vo" "\e(I3^+\e(B")))
+    (its-defrule (car v) (cadr v))
+    (its-defrule (concat "v" (car v)) (concat "\e(I/\e(B" (cadr v))))
+  (its-defoutput "vv" "\e(I/\e(Bv")
+
+  (its-defrule   "ma"   "\e(IO\e(B")
+  (its-defrule   "mi"   "\e(IP\e(B")
+  (its-defrule   "mu"   "\e(IQ\e(B")
+  (its-defrule   "me"   "\e(IR\e(B")
+  (its-defrule   "mo"   "\e(IS\e(B")
+  (its-defrule   "mya"  "\e(IP,\e(B")
+  (its-defrule   "myu"  "\e(IP-\e(B")
+  (its-defrule   "mye"  "\e(IP*\e(B")
+  (its-defrule   "myo"  "\e(IP.\e(B")
+  (its-defrule   "ya"   "\e(IT\e(B")
+  (its-defrule   "yi"   "\e(I2\e(B")
+  (its-defrule   "yu"   "\e(IU\e(B")
+  (its-defrule   "yo"   "\e(IV\e(B")
+  (its-defrule   "ye"   "\e(I2*\e(B")
+  (its-defrule   "wa"   "\e(I\\e(B")
+  (its-defrule   "wi"   "\e(I(\e(B")
+  (its-defrule   "wu"   "\e(I3\e(B")
+  (its-defrule   "we"   "\e(I*\e(B")
+  (its-defrule   "wo"   "\e(I&\e(B")
+
+  (its-defrule   "kwa"  "\e(I8\\e(B")
+  (its-defrule   "kwi"  "\e(I8(\e(B")
+  (its-defrule   "kwu"  "\e(I8\e(B")
+  (its-defrule   "kwe"  "\e(I8*\e(B")
+  (its-defrule   "kwo"  "\e(I8+\e(B")
+  (its-defrule   "gwa"  "\e(I8^\\e(B")
+  (its-defrule   "gwi"  "\e(I8^(\e(B")
+  (its-defrule   "gwu"  "\e(I8^\e(B")
+  (its-defrule   "gwe"  "\e(I8^*\e(B")
+  (its-defrule   "gwo"  "\e(I8^+\e(B")
+  (its-defrule   "tsa"  "\e(IB'\e(B")
+  (its-defrule   "tsi"  "\e(IB(\e(B")
+  (its-defrule   "tse"  "\e(IB*\e(B")
+  (its-defrule   "tso"  "\e(IB+\e(B")
+
+  (its-defrule   "na"   "\e(IE\e(B")
+  (its-defrule   "ni"   "\e(IF\e(B")
+  (its-defrule   "nu"   "\e(IG\e(B")
+  (its-defrule   "ne"   "\e(IH\e(B")
+  (its-defrule   "no"   "\e(II\e(B")
+  (its-defrule   "nya"  "\e(IF,\e(B")
+  (its-defrule   "nyu"  "\e(IF-\e(B")
+  (its-defrule   "nye"  "\e(IF*\e(B")
+  (its-defrule   "nyo"  "\e(IF.\e(B")
+
+  (its-defrule   "xti"  "\e(IC(\e(B")
+  (its-defrule   "xdi"  "\e(IC^(\e(B")
+  (its-defrule   "xdu"  "\e(ID^)\e(B")
+  (its-defrule   "xde"  "\e(IC^*\e(B")
+  (its-defrule   "xdo"  "\e(ID^+\e(B")
+  (its-defrule   "xwi"  "\e(I3(\e(B")
+  (its-defrule   "xwe"  "\e(I3*\e(B")
+  (its-defrule   "xwo"  "\e(I3+\e(B")
+
+;;;
+;;; Symbol inputs
+;;;
+
+  (dolist (digit '( "1"  "2"  "3"  "4" "5"  "6"  "7"  "8"  "9"  "0" ))
+    (its-defrule (concat its-hankaku-escape digit)  digit))
+
+  (dolist (symbol '( " "  "!"  "@"  "#"  "$"  "%"  "^"  "&"  "*"  "("  ")"
+                    "-"  "="  "`"  "\\" "|"  "_"  "+"  "~" "["  "]"  "{"  "}"
+                    ":"  ";"  "\"" "'"  "<"  ">"  "?"  "/"  ","  "." ))
+    (its-defrule (concat its-hankaku-escape symbol) symbol))
+
+  (dolist (downcase '("a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n"
+                     "o" "p" "q" "r" "s" "t" "u" "v" "w" "x" "y" "z"))
+    (its-defrule (concat its-hankaku-escape downcase) downcase))
+
+  (dolist (upcase    '("A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N"
+                      "O" "P" "Q" "R" "S" "T" "U" "V" "W" "X" "Y" "Z"))
+    (its-defrule (concat its-hankaku-escape upcase) upcase)))
+
+(define-its-state-machine-append its-han-kata-map
+  (if its-kata-enable-double-n
+      (its-defrule "nn" "\e(I]\e(B")
+    (its-defrule "nn" "\e(I]\e(B" -1))
+
+  (its-defrule "-" its-kata-horizontal)
+  (its-defrule "[" its-kata-open-bracket)
+  (its-defrule "]" its-kata-close-bracket)
+  (its-defrule "." its-kata-period)
+  (its-defrule "," its-kata-comma)
+  )
+
+(provide 'its/hankata)
+;;; its/kata.el ends here.
index a08cec9..051dcc6 100644 (file)
 (define-its-state-machine its-hira-map
   "roma-kana" "\e$B$"\e(B" "Japanese" nil
   "Map for Romaji-Hiragana translation. (Japanese)"
+
   (defconst its-zenkaku-escape "Z")  ;; Escape character to Zenkaku inputs
   (defconst its-hankaku-escape "~")  ;; Escape character to Hankaku inputs
 
+  (its-defrule-select-mode-temporally "q" downcase)
+  (its-defrule-select-mode-temporally "Q" zenkaku-downcase)
+
 ;;; k      k
 ;;; kk     \e$B$C\e(Bk
 ;;; kka    \e$B$C$+\e(B
       (its-defrule "nn" "\e$B$s\e(B")
     (its-defrule "nn" "\e$B$s\e(B" -1))
 
-  (its-defrule "-"   its-hira-horizontal)
-  (its-defrule "["    its-hira-open-bracket)
-  (its-defrule "]"    its-hira-close-bracket)
+  (its-defrule "-" its-hira-horizontal)
+  (its-defrule "[" its-hira-open-bracket)
+  (its-defrule "]" its-hira-close-bracket)
   (its-defrule "." its-hira-period)
   (its-defrule "," its-hira-comma)
 
        (its-defrule   "="   "\e$B!a\e(B")  (its-defrule   "`"   "\e$B!.\e(B")
        (its-defrule   "\\"  "\e$B!o\e(B")  (its-defrule   "|"   "\e$B!C\e(B")
        (its-defrule   "_"   "\e$B!2\e(B")  (its-defrule   "+"   "\e$B!\\e(B")
-       (its-defrule   "~"   "\e$B!1\e(B" nil t)
-       (its-defrule   "{"   "\e$B!P\e(B")
-       (its-defrule   "}"   "\e$B!Q\e(B")  (its-defrule   ":"   "\e$B!'\e(B")
-       (its-defrule   ";"   "\e$B!(\e(B")  (its-defrule   "\""  "\e$B!I\e(B")
-       (its-defrule   "'"   "\e$B!G\e(B")  (its-defrule   "<"   "\e$B!c\e(B")
-       (its-defrule   ">"   "\e$B!d\e(B")  (its-defrule   "?"   "\e$B!)\e(B")
-       (its-defrule   "/"   "\e$B!?\e(B"))
+       (its-defrule   "{"   "\e$B!P\e(B")  (its-defrule   "}"   "\e$B!Q\e(B")
+       (its-defrule   ":"   "\e$B!'\e(B")  (its-defrule   ";"   "\e$B!(\e(B")
+       (its-defrule   "\""  "\e$B!I\e(B")  (its-defrule   "'"   "\e$B!G\e(B")
+       (its-defrule   "<"   "\e$B!c\e(B")  (its-defrule   ">"   "\e$B!d\e(B")
+       (its-defrule   "?"   "\e$B!)\e(B")  (its-defrule   "/"   "\e$B!?\e(B"))
     (progn
       (its-defrule   "1"   "1")  (its-defrule   "2"   "2")
       (its-defrule   "3"   "3")  (its-defrule   "4"   "4")
       (its-defrule   "&"   "&")  (its-defrule   "*"   "*")
       (its-defrule   "("   "(")  (its-defrule   ")"   ")")
       (its-defrule   "="   "=")  (its-defrule   "`"   "`")
-      (its-defrule   "\\"  "\\")  (its-defrule   "|"   "|")
+      (its-defrule   "\\"  "\\") (its-defrule   "|"   "|")
       (its-defrule   "_"   "_")  (its-defrule   "+"   "+")
-      (its-defrule   "~"   "~" nil t)
-      (its-defrule   "{"   "{")
-      (its-defrule   "}"   "}")  (its-defrule   ":"   ":")
-      (its-defrule   ";"   ";")  (its-defrule   "\""  "\"")
-      (its-defrule   "'"   "'")  (its-defrule   "<"   "<")
-      (its-defrule   ">"   ">")  (its-defrule   "?"   "?")
-      (its-defrule   "/"   "/")))
+      (its-defrule   "{"   "{")  (its-defrule   "}"   "}")
+      (its-defrule   ":"   ":")  (its-defrule   ";"   ";")
+      (its-defrule   "\""  "\"") (its-defrule   "'"   "'")
+      (its-defrule   "<"   "<")  (its-defrule   ">"   ">")
+      (its-defrule   "?"   "?")  (its-defrule   "/"   "/")))
   )
 
 (provide 'its/hira)
diff --git a/its/jeonkak.el b/its/jeonkak.el
new file mode 100644 (file)
index 0000000..2baedfe
--- /dev/null
@@ -0,0 +1,103 @@
+;;; its/jeonkak.el --- Jeonkak ASCII Input in Egg Input Method Architecture
+
+;; Copyright (C) 1997, 1998 Mule Project,
+;; Powered by Electrotechnical Laboratory, JAPAN.
+;; Project Leader: Satoru Tomura <tomura@etl.go.jp>
+
+;; Author: KATAYAMA Yoshio <kate@pfu.co.jp>
+
+;; This file will be part of GNU Emacs (in future).
+
+;; GNU Emacs is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2, or (at your option)
+;; any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+;;
+;; Symbol input is desined by jiro@math.keio.ac.jp (TANAKA Jiro)
+;; This file is based on the rules of its/hira.el in Mule-2.3 distribution.
+;;
+
+;;; Code:
+
+(eval-when-compile
+  (require 'its))
+
+(define-its-state-machine its-jeonkak-up-map
+  "jeonkak-upcase" "\e$(C#A\e(B" "Korean" nil
+  "Map for jeonkak-upcase input."
+
+  (dolist (ascii '(("1" . "\e$(C#1\e(B")  ("2" . "\e$(C#2\e(B")  ("3" . "\e$(C#3\e(B")  ("4" . "\e$(C#4\e(B")
+                  ("5" . "\e$(C#5\e(B")  ("6" . "\e$(C#6\e(B")  ("7" . "\e$(C#7\e(B")  ("8" . "\e$(C#8\e(B")
+                  ("9" . "\e$(C#9\e(B")  ("0" . "\e$(C#0\e(B")
+                  (" " . "\e$(C!!\e(B")  ("!" . "\e$(C#!\e(B")  ("@" . "\e$(C#@\e(B")  ("#" . "\e$(C##\e(B")
+                  ("$" . "\e$(C#$\e(B")  ("%" . "\e$(C#%\e(B")  ("^" . "\e$(C#^\e(B")  ("&" . "\e$(C#&\e(B")
+                  ("*" . "\e$(C#*\e(B")  ("(" . "\e$(C#(\e(B")  (")" . "\e$(C#)\e(B")
+                  ("-" . "\e$(C#-\e(B")  ("=" . "\e$(C#=\e(B")  ("`" . "\e$(C#`\e(B")  ("\\" . "\e$(C#\\e(B")
+                  ("|" . "\e$(C#|\e(B")  ("_" . "\e$(C#_\e(B")  ("+" . "\e$(C#+\e(B")  ("~" . "\e$(C#~\e(B")
+                  ("[" . "\e$(C!8\e(B")  ("]" . "\e$(C!9\e(B")  ("{" . "\e$(C#{\e(B")  ("}" . "\e$(C#}\e(B")
+                  (":" . "\e$(C#:\e(B")  (";" . "\e$(C#;\e(B")  ("\"" . "\e$(C#"\e(B") ("'" . "\e$(C#'\e(B")
+                  ("<" . "\e$(C#<\e(B")  (">" . "\e$(C#>\e(B")  ("?" . "\e$(C#?\e(B")  ("/" . "\e$(C#/\e(B")
+                  ("," . "\e$(C#,\e(B")  ("." . "\e$(C#.\e(B")
+                  ("a" . "\e$(C#A\e(B")  ("b" . "\e$(C#B\e(B")  ("c" . "\e$(C#C\e(B")  ("d" . "\e$(C#D\e(B")
+                  ("e" . "\e$(C#E\e(B")  ("f" . "\e$(C#F\e(B")  ("g" . "\e$(C#G\e(B")  ("h" . "\e$(C#H\e(B")
+                  ("i" . "\e$(C#I\e(B")  ("j" . "\e$(C#J\e(B")  ("k" . "\e$(C#K\e(B")  ("l" . "\e$(C#L\e(B")
+                  ("m" . "\e$(C#M\e(B")  ("n" . "\e$(C#N\e(B")  ("o" . "\e$(C#O\e(B")  ("p" . "\e$(C#P\e(B")
+                  ("q" . "\e$(C#Q\e(B")  ("r" . "\e$(C#R\e(B")  ("s" . "\e$(C#S\e(B")  ("t" . "\e$(C#T\e(B")
+                  ("u" . "\e$(C#U\e(B")  ("v" . "\e$(C#V\e(B")  ("w" . "\e$(C#W\e(B")  ("x" . "\e$(C#X\e(B")
+                  ("y" . "\e$(C#Y\e(B")  ("z" . "\e$(C#Z\e(B")
+                  ("A" . "\e$(C#A\e(B")  ("B" . "\e$(C#B\e(B")  ("C" . "\e$(C#C\e(B")  ("D" . "\e$(C#D\e(B")
+                  ("E" . "\e$(C#E\e(B")  ("F" . "\e$(C#F\e(B")  ("G" . "\e$(C#G\e(B")  ("H" . "\e$(C#H\e(B")
+                  ("I" . "\e$(C#I\e(B")  ("J" . "\e$(C#J\e(B")  ("K" . "\e$(C#K\e(B")  ("L" . "\e$(C#L\e(B")
+                  ("M" . "\e$(C#M\e(B")  ("N" . "\e$(C#N\e(B")  ("O" . "\e$(C#O\e(B")  ("P" . "\e$(C#P\e(B")
+                  ("Q" . "\e$(C#Q\e(B")  ("R" . "\e$(C#R\e(B")  ("S" . "\e$(C#S\e(B")  ("T" . "\e$(C#T\e(B")
+                  ("U" . "\e$(C#U\e(B")  ("V" . "\e$(C#V\e(B")  ("W" . "\e$(C#W\e(B")  ("X" . "\e$(C#X\e(B")
+                  ("Y" . "\e$(C#Y\e(B")  ("Z" . "\e$(C#Z\e(B")))
+    (let ((in (car ascii)) (out (cdr ascii)))
+      (its-defrule in out))))
+
+(define-its-state-machine its-jeonkak-down-map
+  "jeonkak-downcase" "\e$(C#a\e(B" "Korean" nil
+  "Map for jeonkak-downcase input."
+
+  (dolist (ascii '(("1" . "\e$(C#1\e(B")  ("2" . "\e$(C#2\e(B")  ("3" . "\e$(C#3\e(B")  ("4" . "\e$(C#4\e(B")
+                  ("5" . "\e$(C#5\e(B")  ("6" . "\e$(C#6\e(B")  ("7" . "\e$(C#7\e(B")  ("8" . "\e$(C#8\e(B")
+                  ("9" . "\e$(C#9\e(B")  ("0" . "\e$(C#0\e(B")
+                  (" " . "\e$(C!!\e(B")  ("!" . "\e$(C#!\e(B")  ("@" . "\e$(C#@\e(B")  ("#" . "\e$(C##\e(B")
+                  ("$" . "\e$(C#$\e(B")  ("%" . "\e$(C#%\e(B")  ("^" . "\e$(C#^\e(B")  ("&" . "\e$(C#&\e(B")
+                  ("*" . "\e$(C#*\e(B")  ("(" . "\e$(C#(\e(B")  (")" . "\e$(C#)\e(B")
+                  ("-" . "\e$(C#-\e(B")  ("=" . "\e$(C#=\e(B")  ("`" . "\e$(C#`\e(B")  ("\\" . "\e$(C#\\e(B")
+                  ("|" . "\e$(C#|\e(B")  ("_" . "\e$(C#_\e(B")  ("+" . "\e$(C#+\e(B")  ("~" . "\e$(C#~\e(B")
+                  ("[" . "\e$(C!8\e(B")  ("]" . "\e$(C!9\e(B")  ("{" . "\e$(C#{\e(B")  ("}" . "\e$(C#}\e(B")
+                  (":" . "\e$(C#:\e(B")  (";" . "\e$(C#;\e(B")  ("\"" . "\e$(C#"\e(B") ("'" . "\e$(C#'\e(B")
+                  ("<" . "\e$(C#<\e(B")  (">" . "\e$(C#>\e(B")  ("?" . "\e$(C#?\e(B")  ("/" . "\e$(C#/\e(B")
+                  ("," . "\e$(C#,\e(B")  ("." . "\e$(C#.\e(B")
+                  ("a" . "\e$(C#a\e(B")  ("b" . "\e$(C#b\e(B")  ("c" . "\e$(C#c\e(B")  ("d" . "\e$(C#d\e(B")
+                  ("e" . "\e$(C#e\e(B")  ("f" . "\e$(C#f\e(B")  ("g" . "\e$(C#g\e(B")  ("h" . "\e$(C#h\e(B")
+                  ("i" . "\e$(C#i\e(B")  ("j" . "\e$(C#j\e(B")  ("k" . "\e$(C#k\e(B")  ("l" . "\e$(C#l\e(B")
+                  ("m" . "\e$(C#m\e(B")  ("n" . "\e$(C#n\e(B")  ("o" . "\e$(C#o\e(B")  ("p" . "\e$(C#p\e(B")
+                  ("q" . "\e$(C#q\e(B")  ("r" . "\e$(C#r\e(B")  ("s" . "\e$(C#s\e(B")  ("t" . "\e$(C#t\e(B")
+                  ("u" . "\e$(C#u\e(B")  ("v" . "\e$(C#v\e(B")  ("w" . "\e$(C#w\e(B")  ("x" . "\e$(C#x\e(B")
+                  ("y" . "\e$(C#y\e(B")  ("z" . "\e$(C#z\e(B")
+                  ("A" . "\e$(C#A\e(B")  ("B" . "\e$(C#B\e(B")  ("C" . "\e$(C#C\e(B")  ("D" . "\e$(C#D\e(B")
+                  ("E" . "\e$(C#E\e(B")  ("F" . "\e$(C#F\e(B")  ("G" . "\e$(C#G\e(B")  ("H" . "\e$(C#H\e(B")
+                  ("I" . "\e$(C#I\e(B")  ("J" . "\e$(C#J\e(B")  ("K" . "\e$(C#K\e(B")  ("L" . "\e$(C#L\e(B")
+                  ("M" . "\e$(C#M\e(B")  ("N" . "\e$(C#N\e(B")  ("O" . "\e$(C#O\e(B")  ("P" . "\e$(C#P\e(B")
+                  ("Q" . "\e$(C#Q\e(B")  ("R" . "\e$(C#R\e(B")  ("S" . "\e$(C#S\e(B")  ("T" . "\e$(C#T\e(B")
+                  ("U" . "\e$(C#U\e(B")  ("V" . "\e$(C#V\e(B")  ("W" . "\e$(C#W\e(B")  ("X" . "\e$(C#X\e(B")
+                  ("Y" . "\e$(C#Y\e(B")  ("Z" . "\e$(C#Z\e(B")))
+    (let ((in (car ascii)) (out (cdr ascii)))
+      (its-defrule in out))))
+
+(provide 'its/jeonkak)
diff --git a/its/kata.el b/its/kata.el
new file mode 100644 (file)
index 0000000..b138b66
--- /dev/null
@@ -0,0 +1,489 @@
+;;; its/kata.el --- Katakana Input in Egg Input Method Architecture
+
+;; Copyright (C) 1997, 1998 Mule Project,
+;; Powered by Electrotechnical Laboratory, JAPAN.
+;; Project Leader: Satoru Tomura <tomura@etl.go.jp>
+
+;; Author: Satoru Tomura <tomura@etl.go.jp>
+;;         jiro@math.keio.ac.jp (TANAKA Jiro)
+
+;; This file will be part of GNU Emacs (in future).
+
+;; GNU Emacs is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2, or (at your option)
+;; any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+;;
+;; Symbol input is desined by jiro@math.keio.ac.jp (TANAKA Jiro)
+;; This file is based on the rules of its/kata.el in Mule-2.3 distribution.
+;;
+
+;;; Code:
+
+(eval-when-compile
+  (require 'its)
+  (require 'cl))
+
+(defvar its-kata-enable-double-n nil "*Enable \"nn\" input for \"\e$B%s\e(B\" ")
+(defvar its-kata-enable-zenkaku-alphabet t "*Enable Zenkaku alphabet")
+(defvar its-kata-period "\e$B!#\e(B" "*\e$B%T%j%*%I\e(B")  ; ". " "\e$B!%\e(B"
+(defvar its-kata-comma  "\e$B!"\e(B" "*\e$B%3%s%^\e(B")    ; ", " "\e$B!$\e(B"
+(defvar its-kata-open-bracket  "\e$B!V\e(B" "*[")  ; "\e$B!N\e(B"
+(defvar its-kata-close-bracket  "\e$B!W\e(B" "*]") ; "\e$B!O\e(B"
+(defvar its-kata-horizontal  "\e$B!<\e(B" "*-")    ; "\e$B!]\e(B"
+
+(define-its-state-machine its-kata-map
+  "roma-kata" "\e$B%"\e(B" "Japanese" nil
+  "Map for Romaji-Katakana translation. (Japanese)"
+
+  (defconst its-zenkaku-escape "Z")  ;; Escape character to Zenkaku inputs
+  (defconst its-hankaku-escape "~")  ;; Escape character to Hankaku inputs
+
+  (its-defrule-select-mode-temporally "q" downcase)
+  (its-defrule-select-mode-temporally "Q" zenkaku-downcase)
+
+;;; k      k
+;;; kk     \e$B%C\e(Bk
+;;; kka    \e$B%C%+\e(B
+;;;
+;;; kkk    \e$B%C\e(Bk DING!
+
+  (its-defrule "tch"  "\e$B%C\e(B" -2)
+
+;;; \e$B!V%s!W$NF~NO\e(B
+
+  (dolist (q1 '("b" "m" "p"))
+    (its-defrule (concat "m" q1) "\e$B%s\e(B" -1))
+
+  (its-defrule "N" "\e$B%s\e(B")
+
+  (let ((state (its-goto-state "n" nil t)))
+    (its-make-next-state state -1 "n" "\e$B%s\e(B")
+    (its-make-next-state state ?' "n" "\e$B%s\e(B")
+    (its-defrule-otherwise state "\e$B%s\e(B"))
+
+  (let ((small '"x" ))
+    (its-defrule (concat small "a") "\e$B%!\e(B")
+    (its-defrule (concat small "i") "\e$B%#\e(B")
+    (its-defrule (concat small "u") "\e$B%%\e(B")
+    (its-defrule (concat small "e") "\e$B%'\e(B")
+    (its-defrule (concat small "o") "\e$B%)\e(B")
+    (its-defrule (concat small "ya") "\e$B%c\e(B")
+    (its-defrule (concat small "yu") "\e$B%e\e(B")
+    (its-defrule (concat small "yo") "\e$B%g\e(B")
+    (its-defrule (concat small "tu") "\e$B%C\e(B")
+    (its-defrule (concat small "tsu") "\e$B%C\e(B")
+    (its-defrule (concat small "wa") "\e$B%n\e(B")
+    )
+
+  (its-defrule   "a"    "\e$B%"\e(B")
+  (its-defrule   "i"    "\e$B%$\e(B")
+  (its-defrule   "u"    "\e$B%&\e(B")
+  (its-defrule   "e"    "\e$B%(\e(B")
+  (its-defrule   "o"    "\e$B%*\e(B")
+
+  (dolist (k '(("ka"  "\e$B%+\e(B") ("ki"  "\e$B%-\e(B") ("ku"  "\e$B%/\e(B") ("ke"  "\e$B%1\e(B") ("ko"  "\e$B%3\e(B")
+              ("kya" "\e$B%-%c\e(B") ("kyu"  "\e$B%-%e\e(B") ("kye"  "\e$B%-%'\e(B") ("kyo"  "\e$B%-%g\e(B")))
+    (its-defrule (car k) (cadr k))
+    (its-defrule (concat "k" (car k)) (concat "\e$B%C\e(B" (cadr k))))
+  (its-defoutput "kk" "\e$B%C\e(Bk")
+  (its-defoutput "kky" "\e$B%C\e(Bky")
+
+  (dolist (s '(("sa"  "\e$B%5\e(B") ("si"  "\e$B%7\e(B") ("su"  "\e$B%9\e(B") ("se"  "\e$B%;\e(B") ("so"  "\e$B%=\e(B")
+              ("sya"  "\e$B%7%c\e(B") ("syu"  "\e$B%7%e\e(B") ("sye"  "\e$B%7%'\e(B") ("syo"  "\e$B%7%g\e(B")
+              ("sha"  "\e$B%7%c\e(B") ("shi"  "\e$B%7\e(B") ("shu"  "\e$B%7%e\e(B") ("she"  "\e$B%7%'\e(B")
+              ("sho"  "\e$B%7%g\e(B")))
+    (its-defrule (car s) (cadr s))
+    (its-defrule (concat "s" (car s)) (concat "\e$B%C\e(B" (cadr s))))
+  (its-defoutput "ss" "\e$B%C\e(Bs")
+  (its-defoutput "ssy" "\e$B%C\e(Bsy")
+  (its-defoutput "ssh" "\e$B%C\e(Bsh")
+
+  (dolist (T '(("ta"  "\e$B%?\e(B") ("ti"  "\e$B%A\e(B") ("tu"  "\e$B%D\e(B") ("te"  "\e$B%F\e(B") ("to"  "\e$B%H\e(B")
+              ("tya"  "\e$B%A%c\e(B") ("tyi"  "\e$B%F%#\e(B") ("tyu"  "\e$B%A%e\e(B") ("tye"  "\e$B%A%'\e(B")
+              ("tyo"  "\e$B%A%g\e(B") ("tsu"  "\e$B%D\e(B")))
+    (its-defrule (car T) (cadr T))
+    (its-defrule (concat "t" (car T)) (concat "\e$B%C\e(B" (cadr T))))
+  (its-defoutput "tt" "\e$B%C\e(Bt")
+  (its-defoutput "tty" "\e$B%C\e(Bty")
+  (its-defoutput "tts" "\e$B%C\e(Bts")
+
+  (dolist (c '(("cha"  "\e$B%A%c\e(B") ("chi"  "\e$B%A\e(B") ("chu"  "\e$B%A%e\e(B")
+              ("che"  "\e$B%A%'\e(B") ("cho"  "\e$B%A%g\e(B")))
+    (its-defrule (car c) (cadr c))
+    (its-defrule (concat "c" (car c)) (concat "\e$B%C\e(B" (cadr c))))
+  (its-defoutput "cc" "\e$B%C\e(Bc")
+  (its-defoutput "cch" "\e$B%C\e(Bch")
+
+  (dolist (h '(("ha"  "\e$B%O\e(B") ("hi"  "\e$B%R\e(B") ("hu"  "\e$B%U\e(B") ("he"  "\e$B%X\e(B") ("ho"  "\e$B%[\e(B")
+              ("hya"  "\e$B%R%c\e(B") ("hyu"  "\e$B%R%e\e(B") ("hye"  "\e$B%R%'\e(B") ("hyo"  "\e$B%R%g\e(B")))
+    (its-defrule (car h) (cadr h))
+    (its-defrule (concat "h" (car h)) (concat "\e$B%C\e(B" (cadr h))))
+  (its-defoutput "hh" "\e$B%C\e(Bh")
+  (its-defoutput "hhy" "\e$B%C\e(Bhy")
+
+  (dolist (f '(("fa"  "\e$B%U%!\e(B") ("fi"  "\e$B%U%#\e(B") ("fu"  "\e$B%U\e(B") ("fe"  "\e$B%U%'\e(B")
+              ("fo"  "\e$B%U%)\e(B")))
+    (its-defrule (car f) (cadr f))
+    (its-defrule (concat "f" (car f)) (concat "\e$B%C\e(B" (cadr f))))
+  (its-defoutput "ff" "\e$B%C\e(Bf")
+
+  (dolist (r '(("ra"  "\e$B%i\e(B") ("ri"  "\e$B%j\e(B") ("ru"  "\e$B%k\e(B") ("re"  "\e$B%l\e(B") ("ro"  "\e$B%m\e(B")
+              ("rya"  "\e$B%j%c\e(B") ("ryu"  "\e$B%j%e\e(B") ("rye"  "\e$B%j%'\e(B") ("ryo"  "\e$B%j%g\e(B")))
+    (its-defrule (car r) (cadr r))
+    (its-defrule (concat "r" (car r)) (concat "\e$B%C\e(B" (cadr r))))
+  (its-defoutput "rr" "\e$B%C\e(Br")
+  (its-defoutput "rry" "\e$B%C\e(Bry")
+
+  (dolist (l '(("la"  "\e$B%i\e(B") ("li"  "\e$B%j\e(B") ("lu"  "\e$B%k\e(B") ("le"  "\e$B%l\e(B") ("lo"  "\e$B%m\e(B")
+              ("lya"  "\e$B%j%c\e(B") ("lyu"  "\e$B%j%e\e(B") ("lye"  "\e$B%j%'\e(B") ("lyo"  "\e$B%j%g\e(B")))
+    (its-defrule (car l) (cadr l))
+    (its-defrule (concat "l" (car l)) (concat "\e$B%C\e(B" (cadr l))))
+  (its-defoutput "ll" "\e$B%C\e(Bl")
+  (its-defoutput "lly" "\e$B%C\e(Bly")
+
+  (dolist (g '(("ga"  "\e$B%,\e(B") ("gi"  "\e$B%.\e(B") ("gu"  "\e$B%0\e(B") ("ge"  "\e$B%2\e(B") ("go"  "\e$B%4\e(B")
+              ("gya"  "\e$B%.%c\e(B") ("gyu"  "\e$B%.%e\e(B") ("gye"  "\e$B%.%'\e(B") ("gyo"  "\e$B%.%g\e(B")))
+    (its-defrule (car g) (cadr g))
+    (its-defrule (concat "g" (car g)) (concat "\e$B%C\e(B" (cadr g))))
+  (its-defoutput "gg" "\e$B%C\e(Bg")
+  (its-defoutput "ggy" "\e$B%C\e(Bgy")
+
+  (dolist (z '(("za"  "\e$B%6\e(B") ("zi"  "\e$B%8\e(B") ("zu"  "\e$B%:\e(B") ("ze"  "\e$B%<\e(B") ("zo"  "\e$B%>\e(B")
+              ("zya"  "\e$B%8%c\e(B") ("zyu"  "\e$B%8%e\e(B") ("zye"  "\e$B%8%'\e(B") ("zyo"  "\e$B%8%g\e(B")))
+    (its-defrule (car z) (cadr z))
+    (its-defrule (concat "z" (car z)) (concat "\e$B%C\e(B" (cadr z))))
+  (its-defoutput "zz" "\e$B%C\e(Bz")
+  (its-defoutput "zzy" "\e$B%C\e(Bzy")
+
+  (dolist (j '(("ja"  "\e$B%8%c\e(B") ("ji"  "\e$B%8\e(B") ("ju"  "\e$B%8%e\e(B") ("je"  "\e$B%8%'\e(B")
+              ("jo"  "\e$B%8%g\e(B") ("jya"  "\e$B%8%c\e(B") ("jyu"  "\e$B%8%e\e(B") ("jye"  "\e$B%8%'\e(B")
+              ("jyo"  "\e$B%8%g\e(B")))
+    (its-defrule (car j) (cadr j))
+    (its-defrule (concat "j" (car j)) (concat "\e$B%C\e(B" (cadr j))))
+  (its-defoutput "jj" "\e$B%C\e(Bj")
+  (its-defoutput "jjy" "\e$B%C\e(Bjy")
+
+  (dolist (d '(("da"  "\e$B%@\e(B") ("di"  "\e$B%B\e(B") ("du"  "\e$B%E\e(B") ("de"  "\e$B%G\e(B") ("do"  "\e$B%I\e(B")
+              ("dya"  "\e$B%B%c\e(B") ("dyi"  "\e$B%G%#\e(B") ("dyu"  "\e$B%B%e\e(B") ("dye"  "\e$B%B%'\e(B")
+              ("dyo"  "\e$B%B%g\e(B")))
+    (its-defrule (car d) (cadr d))
+    (its-defrule (concat "d" (car d)) (concat "\e$B%C\e(B" (cadr d))))
+  (its-defoutput "dd" "\e$B%C\e(Bd")
+  (its-defoutput "ddy" "\e$B%C\e(Bdy")
+
+  (dolist (b '(("ba"  "\e$B%P\e(B") ("bi"  "\e$B%S\e(B") ("bu"  "\e$B%V\e(B") ("be"  "\e$B%Y\e(B") ("bo"  "\e$B%\\e(B")
+              ("bya"  "\e$B%S%c\e(B") ("byu"  "\e$B%S%e\e(B") ("bye"  "\e$B%S%'\e(B") ("byo"  "\e$B%S%g\e(B")))
+    (its-defrule (car b) (cadr b))
+    (its-defrule (concat "b" (car b)) (concat "\e$B%C\e(B" (cadr b))))
+  (its-defoutput "bb" "\e$B%C\e(Bb")
+  (its-defoutput "bby" "\e$B%C\e(Bby")
+
+  (dolist (p '(("pa"  "\e$B%Q\e(B") ("pi"  "\e$B%T\e(B") ("pu"  "\e$B%W\e(B") ("pe"  "\e$B%Z\e(B") ("po"   "\e$B%]\e(B")
+              ("pya"  "\e$B%T%c\e(B") ("pyu"  "\e$B%T%e\e(B") ("pye"  "\e$B%T%'\e(B") ("pyo"  "\e$B%T%g\e(B")))
+    (its-defrule (car p) (cadr p))
+    (its-defrule (concat "p" (car p)) (concat "\e$B%C\e(B" (cadr p))))
+  (its-defoutput "pp" "\e$B%C\e(Bp")
+  (its-defoutput "ppy" "\e$B%C\e(Bpy")
+
+  (dolist (v '(("va" "\e$B%t%!\e(B") ("vi" "\e$B%t%#\e(B") ("vu" "\e$B%t\e(B") ("ve" "\e$B%t%'\e(B")
+              ("vo" "\e$B%t%)\e(B")))
+    (its-defrule (car v) (cadr v))
+    (its-defrule (concat "v" (car v)) (concat "\e$B%C\e(B" (cadr v))))
+  (its-defoutput "vv" "\e$B%C\e(Bv")
+
+  (its-defrule   "ma"   "\e$B%^\e(B")
+  (its-defrule   "mi"   "\e$B%_\e(B")
+  (its-defrule   "mu"   "\e$B%`\e(B")
+  (its-defrule   "me"   "\e$B%a\e(B")
+  (its-defrule   "mo"   "\e$B%b\e(B")
+  (its-defrule   "mya"  "\e$B%_%c\e(B")
+  (its-defrule   "myu"  "\e$B%_%e\e(B")
+  (its-defrule   "mye"  "\e$B%_%'\e(B")
+  (its-defrule   "myo"  "\e$B%_%g\e(B")
+  (its-defrule   "ya"   "\e$B%d\e(B")
+  (its-defrule   "yi"   "\e$B%$\e(B")
+  (its-defrule   "yu"   "\e$B%f\e(B")
+  (its-defrule   "yo"   "\e$B%h\e(B")
+  (its-defrule   "ye"   "\e$B%$%'\e(B")
+  (its-defrule   "wa"   "\e$B%o\e(B")
+  (its-defrule   "wi"   "\e$B%p\e(B")
+  (its-defrule   "wu"   "\e$B%&\e(B")
+  (its-defrule   "we"   "\e$B%q\e(B")
+  (its-defrule   "wo"   "\e$B%r\e(B")
+
+  (its-defrule   "kwa"  "\e$B%/%n\e(B")
+  (its-defrule   "kwi"  "\e$B%/%#\e(B")
+  (its-defrule   "kwu"  "\e$B%/\e(B")
+  (its-defrule   "kwe"  "\e$B%/%'\e(B")
+  (its-defrule   "kwo"  "\e$B%/%)\e(B")
+  (its-defrule   "gwa"  "\e$B%0%n\e(B")
+  (its-defrule   "gwi"  "\e$B%0%#\e(B")
+  (its-defrule   "gwu"  "\e$B%0\e(B")
+  (its-defrule   "gwe"  "\e$B%0%'\e(B")
+  (its-defrule   "gwo"  "\e$B%0%)\e(B")
+  (its-defrule   "tsa"  "\e$B%D%!\e(B")
+  (its-defrule   "tsi"  "\e$B%D%#\e(B")
+  (its-defrule   "tse"  "\e$B%D%'\e(B")
+  (its-defrule   "tso"  "\e$B%D%)\e(B")
+
+  (its-defrule   "na"   "\e$B%J\e(B")
+  (its-defrule   "ni"   "\e$B%K\e(B")
+  (its-defrule   "nu"   "\e$B%L\e(B")
+  (its-defrule   "ne"   "\e$B%M\e(B")
+  (its-defrule   "no"   "\e$B%N\e(B")
+  (its-defrule   "nya"  "\e$B%K%c\e(B")
+  (its-defrule   "nyu"  "\e$B%K%e\e(B")
+  (its-defrule   "nye"  "\e$B%K%'\e(B")
+  (its-defrule   "nyo"  "\e$B%K%g\e(B")
+
+  (its-defrule   "xka"  "\e$B%u\e(B")
+  (its-defrule   "xke"  "\e$B%v\e(B")
+  (its-defrule   "xti"  "\e$B%F%#\e(B")
+  (its-defrule   "xdi"  "\e$B%G%#\e(B")
+  (its-defrule   "xdu"  "\e$B%I%%\e(B")
+  (its-defrule   "xde"  "\e$B%G%'\e(B")
+  (its-defrule   "xdo"  "\e$B%I%)\e(B")
+  (its-defrule   "xwi"  "\e$B%&%#\e(B")
+  (its-defrule   "xwe"  "\e$B%&%'\e(B")
+  (its-defrule   "xwo"  "\e$B%&%)\e(B")
+
+;;;
+;;; Zenkaku inputs
+;;;
+
+  (its-defrule (concat its-zenkaku-escape "0") "\e$B#0\e(B")
+  (its-defrule (concat its-zenkaku-escape "1") "\e$B#1\e(B")
+  (its-defrule (concat its-zenkaku-escape "2") "\e$B#2\e(B")
+  (its-defrule (concat its-zenkaku-escape "3") "\e$B#3\e(B")
+  (its-defrule (concat its-zenkaku-escape "4") "\e$B#4\e(B")
+  (its-defrule (concat its-zenkaku-escape "5") "\e$B#5\e(B")
+  (its-defrule (concat its-zenkaku-escape "6") "\e$B#6\e(B")
+  (its-defrule (concat its-zenkaku-escape "7") "\e$B#7\e(B")
+  (its-defrule (concat its-zenkaku-escape "8") "\e$B#8\e(B")
+  (its-defrule (concat its-zenkaku-escape "9") "\e$B#9\e(B")
+
+  (its-defrule (concat its-zenkaku-escape "A") "\e$B#A\e(B")
+  (its-defrule (concat its-zenkaku-escape "B") "\e$B#B\e(B")
+  (its-defrule (concat its-zenkaku-escape "C") "\e$B#C\e(B")
+  (its-defrule (concat its-zenkaku-escape "D") "\e$B#D\e(B")
+  (its-defrule (concat its-zenkaku-escape "E") "\e$B#E\e(B")
+  (its-defrule (concat its-zenkaku-escape "F") "\e$B#F\e(B")
+  (its-defrule (concat its-zenkaku-escape "G") "\e$B#G\e(B")
+  (its-defrule (concat its-zenkaku-escape "H") "\e$B#H\e(B")
+  (its-defrule (concat its-zenkaku-escape "I") "\e$B#I\e(B")
+  (its-defrule (concat its-zenkaku-escape "J") "\e$B#J\e(B")
+  (its-defrule (concat its-zenkaku-escape "K") "\e$B#K\e(B")
+  (its-defrule (concat its-zenkaku-escape "L") "\e$B#L\e(B")
+  (its-defrule (concat its-zenkaku-escape "M") "\e$B#M\e(B")
+  (its-defrule (concat its-zenkaku-escape "N") "\e$B#N\e(B")
+  (its-defrule (concat its-zenkaku-escape "O") "\e$B#O\e(B")
+  (its-defrule (concat its-zenkaku-escape "P") "\e$B#P\e(B")
+  (its-defrule (concat its-zenkaku-escape "Q") "\e$B#Q\e(B")
+  (its-defrule (concat its-zenkaku-escape "R") "\e$B#R\e(B")
+  (its-defrule (concat its-zenkaku-escape "S") "\e$B#S\e(B")
+  (its-defrule (concat its-zenkaku-escape "T") "\e$B#T\e(B")
+  (its-defrule (concat its-zenkaku-escape "U") "\e$B#U\e(B")
+  (its-defrule (concat its-zenkaku-escape "V") "\e$B#V\e(B")
+  (its-defrule (concat its-zenkaku-escape "W") "\e$B#W\e(B")
+  (its-defrule (concat its-zenkaku-escape "X") "\e$B#X\e(B")
+  (its-defrule (concat its-zenkaku-escape "Y") "\e$B#Y\e(B")
+  (its-defrule (concat its-zenkaku-escape "Z") "\e$B#Z\e(B")
+
+  (its-defrule (concat its-zenkaku-escape "a") "\e$B#a\e(B")
+  (its-defrule (concat its-zenkaku-escape "b") "\e$B#b\e(B")
+  (its-defrule (concat its-zenkaku-escape "c") "\e$B#c\e(B")
+  (its-defrule (concat its-zenkaku-escape "d") "\e$B#d\e(B")
+  (its-defrule (concat its-zenkaku-escape "e") "\e$B#e\e(B")
+  (its-defrule (concat its-zenkaku-escape "f") "\e$B#f\e(B")
+  (its-defrule (concat its-zenkaku-escape "g") "\e$B#g\e(B")
+  (its-defrule (concat its-zenkaku-escape "h") "\e$B#h\e(B")
+  (its-defrule (concat its-zenkaku-escape "i") "\e$B#i\e(B")
+  (its-defrule (concat its-zenkaku-escape "j") "\e$B#j\e(B")
+  (its-defrule (concat its-zenkaku-escape "k") "\e$B#k\e(B")
+  (its-defrule (concat its-zenkaku-escape "l") "\e$B#l\e(B")
+  (its-defrule (concat its-zenkaku-escape "m") "\e$B#m\e(B")
+  (its-defrule (concat its-zenkaku-escape "n") "\e$B#n\e(B")
+  (its-defrule (concat its-zenkaku-escape "o") "\e$B#o\e(B")
+  (its-defrule (concat its-zenkaku-escape "p") "\e$B#p\e(B")
+  (its-defrule (concat its-zenkaku-escape "q") "\e$B#q\e(B")
+  (its-defrule (concat its-zenkaku-escape "r") "\e$B#r\e(B")
+  (its-defrule (concat its-zenkaku-escape "s") "\e$B#s\e(B")
+  (its-defrule (concat its-zenkaku-escape "t") "\e$B#t\e(B")
+  (its-defrule (concat its-zenkaku-escape "u") "\e$B#u\e(B")
+  (its-defrule (concat its-zenkaku-escape "v") "\e$B#v\e(B")
+  (its-defrule (concat its-zenkaku-escape "w") "\e$B#w\e(B")
+  (its-defrule (concat its-zenkaku-escape "x") "\e$B#x\e(B")
+  (its-defrule (concat its-zenkaku-escape "y") "\e$B#y\e(B")
+  (its-defrule (concat its-zenkaku-escape "z") "\e$B#z\e(B")
+
+  (its-defrule (concat its-zenkaku-escape " ")  "\e$B!!\e(B")
+  (its-defrule (concat its-zenkaku-escape "!")  "\e$B!*\e(B")
+  (its-defrule (concat its-zenkaku-escape "@")  "\e$B!w\e(B")
+  (its-defrule (concat its-zenkaku-escape "#")  "\e$B!t\e(B")
+  (its-defrule (concat its-zenkaku-escape "$")  "\e$B!p\e(B")
+  (its-defrule (concat its-zenkaku-escape "%")  "\e$B!s\e(B")
+  (its-defrule (concat its-zenkaku-escape "^")  "\e$B!0\e(B")
+  (its-defrule (concat its-zenkaku-escape "&")  "\e$B!u\e(B")
+  (its-defrule (concat its-zenkaku-escape "*")  "\e$B!v\e(B")
+  (its-defrule (concat its-zenkaku-escape "(")  "\e$B!J\e(B")
+  (its-defrule (concat its-zenkaku-escape ")")  "\e$B!K\e(B")
+  (its-defrule (concat its-zenkaku-escape "-")  "\e$B!]\e(B")
+  (its-defrule (concat its-zenkaku-escape "=")  "\e$B!a\e(B")
+  (its-defrule (concat its-zenkaku-escape "`")  "\e$B!.\e(B")
+  (its-defrule (concat its-zenkaku-escape "\\") "\e$B!o\e(B")
+  (its-defrule (concat its-zenkaku-escape "|")  "\e$B!C\e(B")
+  (its-defrule (concat its-zenkaku-escape "_")  "\e$B!2\e(B")
+  (its-defrule (concat its-zenkaku-escape "+")  "\e$B!\\e(B")
+  (its-defrule (concat its-zenkaku-escape "~")  "\e$B!1\e(B")
+  (its-defrule (concat its-zenkaku-escape "[")  "\e$B!N\e(B")
+  (its-defrule (concat its-zenkaku-escape "]")  "\e$B!O\e(B")
+  (its-defrule (concat its-zenkaku-escape "{")  "\e$B!P\e(B")
+  (its-defrule (concat its-zenkaku-escape "}")  "\e$B!Q\e(B")
+  (its-defrule (concat its-zenkaku-escape ":")  "\e$B!'\e(B")
+  (its-defrule (concat its-zenkaku-escape ";")  "\e$B!(\e(B")
+  (its-defrule (concat its-zenkaku-escape "\"") "\e$B!I\e(B")
+  (its-defrule (concat its-zenkaku-escape "'")  "\e$B!G\e(B")
+  (its-defrule (concat its-zenkaku-escape "<")  "\e$B!c\e(B")
+  (its-defrule (concat its-zenkaku-escape ">")  "\e$B!d\e(B")
+  (its-defrule (concat its-zenkaku-escape "?")  "\e$B!)\e(B")
+  (its-defrule (concat its-zenkaku-escape "/")  "\e$B!?\e(B")
+  (its-defrule (concat its-zenkaku-escape ",")  "\e$B!$\e(B")
+  (its-defrule (concat its-zenkaku-escape ".")  "\e$B!%\e(B")
+
+;;;
+;;; Hankaku inputs
+;;;
+
+  (dolist (digit '( "1"  "2"  "3"  "4" "5"  "6"  "7"  "8"  "9"  "0" ))
+    (its-defrule (concat its-hankaku-escape digit)  digit))
+
+  (dolist (symbol '( " "  "!"  "@"  "#"  "$"  "%"  "^"  "&"  "*"  "("  ")"
+                    "-"  "="  "`"  "\\" "|"  "_"  "+"  "~" "["  "]"  "{"  "}"
+                    ":"  ";"  "\"" "'"  "<"  ">"  "?"  "/"  ","  "." ))
+    (its-defrule (concat its-hankaku-escape symbol) symbol))
+
+  (dolist (downcase '("a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n"
+                     "o" "p" "q" "r" "s" "t" "u" "v" "w" "x" "y" "z"))
+    (its-defrule (concat its-hankaku-escape downcase) downcase))
+
+  (dolist (upcase    '("A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N"
+                      "O" "P" "Q" "R" "S" "T" "U" "V" "W" "X" "Y" "Z"))
+    (its-defrule (concat its-hankaku-escape upcase) upcase))
+
+;; SYMBOL Input
+  (its-defrule   "z1"   "\e$B!{\e(B")    (its-defrule   "z!"   "\e$B!|\e(B")
+  (its-defrule   "z2"   "\e$B"&\e(B")    (its-defrule   "z@"   "\e$B"'\e(B")
+  (its-defrule   "z3"   "\e$B"$\e(B")    (its-defrule   "z#"   "\e$B"%\e(B")
+  (its-defrule   "z4"   "\e$B""\e(B")    (its-defrule   "z$"   "\e$B"#\e(B")
+  (its-defrule   "z5"   "\e$B!~\e(B")    (its-defrule   "z%"   "\e$B"!\e(B")
+  (its-defrule   "z6"   "\e$B!y\e(B")    (its-defrule   "z^"   "\e$B!z\e(B")
+  (its-defrule   "z7"   "\e$B!}\e(B")    (its-defrule   "z&"   "\e$B!r\e(B")
+  (its-defrule   "z8"   "\e$B!q\e(B")    (its-defrule   "z*"   "\e$B!_\e(B")
+  (its-defrule   "z9"   "\e$B!i\e(B")    (its-defrule   "z("   "\e$B!Z\e(B")
+  (its-defrule   "z0"   "\e$B!j\e(B")    (its-defrule   "z)"   "\e$B![\e(B")
+  (its-defrule   "z-"   "\e$B!A\e(B")    (its-defrule   "z_"   "\e$B!h\e(B")
+  (its-defrule   "z="   "\e$B!b\e(B")    (its-defrule   "z+"   "\e$B!^\e(B")
+  (its-defrule   "z\\"  "\e$B!@\e(B")    (its-defrule   "z|"   "\e$B!B\e(B")
+  (its-defrule   "z`"   "\e$B!-\e(B")    (its-defrule   "z~"   "\e$B!/\e(B")
+
+  (its-defrule   "zq"   "\e$B!T\e(B")    (its-defrule   "zQ"   "\e$B!R\e(B")
+  (its-defrule   "zw"   "\e$B!U\e(B")    (its-defrule   "zW"   "\e$B!S\e(B")
+                                       ; e
+  (its-defrule   "zr"   "\e$B!9\e(B")    (its-defrule   "zR"   "\e$B!8\e(B")
+  (its-defrule   "zt"   "\e$B!:\e(B")    (its-defrule   "zT"   "\e$B!x\e(B")
+                                       ; y u i o
+  (its-defrule   "zp"   "\e$B")\e(B")    (its-defrule   "zP"   "\e$B",\e(B")
+  (its-defrule   "z["   "\e$B!X\e(B")    (its-defrule   "z{"   "\e$B!L\e(B")
+  (its-defrule   "z]"   "\e$B!Y\e(B")    (its-defrule   "z}"   "\e$B!M\e(B")
+
+                                       ; a
+  (its-defrule   "zs"   "\e$B!3\e(B")    (its-defrule   "zS"   "\e$B!4\e(B")
+  (its-defrule   "zd"   "\e$B!5\e(B")    (its-defrule   "zD"   "\e$B!6\e(B")
+  (its-defrule   "zf"   "\e$B!7\e(B")    (its-defrule   "zF"   "\e$B"*\e(B")
+  (its-defrule   "zg"   "\e$B!>\e(B")    (its-defrule   "zG"   "\e$B!=\e(B")
+  (its-defrule   "zh"   "\e$B"+\e(B")
+  (its-defrule   "zj"   "\e$B"-\e(B")
+  (its-defrule   "zk"   "\e$B",\e(B")
+  (its-defrule   "zl"   "\e$B"*\e(B")
+  (its-defrule   "z;"   "\e$B!+\e(B")    (its-defrule   "z:"   "\e$B!,\e(B")
+  (its-defrule   "z\'"  "\e$B!F\e(B")    (its-defrule   "z\""  "\e$B!H\e(B")
+
+                                       ; z
+  (its-defrule   "zx"   ":-")  (its-defrule   "zX"   ":-)")
+  (its-defrule   "zc"   "\e$B!;\e(B")    (its-defrule   "zC"   "\e$B!n\e(B")
+  (its-defrule   "zv"   "\e$B"(\e(B")    (its-defrule   "zV"   "\e$B!`\e(B")
+  (its-defrule   "zb"   "\e$B!k\e(B")    (its-defrule   "zB"   "\e$B"+\e(B")
+  (its-defrule   "zn"   "\e$B!l\e(B")    (its-defrule   "zN"   "\e$B"-\e(B")
+  (its-defrule   "zm"   "\e$B!m\e(B")    (its-defrule   "zM"   "\e$B".\e(B")
+  (its-defrule   "z,"   "\e$B!E\e(B")    (its-defrule   "z<"   "\e$B!e\e(B")
+  (its-defrule   "z."   "\e$B!D\e(B")    (its-defrule   "z>"   "\e$B!f\e(B")
+  (its-defrule   "z/"   "\e$B!&\e(B")    (its-defrule   "z?"   "\e$B!g\e(B")
+  )
+
+(define-its-state-machine-append its-kata-map
+  (if its-kata-enable-double-n
+      (its-defrule "nn" "\e$B%s\e(B")
+    (its-defrule "nn" "\e$B%s\e(B" -1))
+
+  (its-defrule "-" its-kata-horizontal)
+  (its-defrule "[" its-kata-open-bracket)
+  (its-defrule "]" its-kata-close-bracket)
+  (its-defrule "." its-kata-period)
+  (its-defrule "," its-kata-comma)
+
+  (if its-kata-enable-zenkaku-alphabet
+      (progn
+       (its-defrule   "1"   "\e$B#1\e(B")  (its-defrule   "2"   "\e$B#2\e(B")
+       (its-defrule   "3"   "\e$B#3\e(B")  (its-defrule   "4"   "\e$B#4\e(B")
+       (its-defrule   "5"   "\e$B#5\e(B")  (its-defrule   "6"   "\e$B#6\e(B")
+       (its-defrule   "7"   "\e$B#7\e(B")  (its-defrule   "8"   "\e$B#8\e(B")
+       (its-defrule   "9"   "\e$B#9\e(B")  (its-defrule   "0"   "\e$B#0\e(B")
+       (its-defrule   "!"   "\e$B!*\e(B")  (its-defrule   "@"   "\e$B!w\e(B")
+       (its-defrule   "#"   "\e$B!t\e(B")  (its-defrule   "$"   "\e$B!p\e(B")
+       (its-defrule   "%"   "\e$B!s\e(B")  (its-defrule   "^"   "\e$B!0\e(B")
+       (its-defrule   "&"   "\e$B!u\e(B")  (its-defrule   "*"   "\e$B!v\e(B")
+       (its-defrule   "("   "\e$B!J\e(B")  (its-defrule   ")"   "\e$B!K\e(B")
+       (its-defrule   "="   "\e$B!a\e(B")  (its-defrule   "`"   "\e$B!.\e(B")
+       (its-defrule   "\\"  "\e$B!o\e(B")  (its-defrule   "|"   "\e$B!C\e(B")
+       (its-defrule   "_"   "\e$B!2\e(B")  (its-defrule   "+"   "\e$B!\\e(B")
+       (its-defrule   "{"   "\e$B!P\e(B")  (its-defrule   "}"   "\e$B!Q\e(B")
+       (its-defrule   ":"   "\e$B!'\e(B")  (its-defrule   ";"   "\e$B!(\e(B")
+       (its-defrule   "\""  "\e$B!I\e(B")  (its-defrule   "'"   "\e$B!G\e(B")
+       (its-defrule   "<"   "\e$B!c\e(B")  (its-defrule   ">"   "\e$B!d\e(B")
+       (its-defrule   "?"   "\e$B!)\e(B")  (its-defrule   "/"   "\e$B!?\e(B"))
+    (progn
+      (its-defrule   "1"   "1")  (its-defrule   "2"   "2")
+      (its-defrule   "3"   "3")  (its-defrule   "4"   "4")
+      (its-defrule   "5"   "5")  (its-defrule   "6"   "6")
+      (its-defrule   "7"   "7")  (its-defrule   "8"   "8")
+      (its-defrule   "9"   "9")  (its-defrule   "0"   "0")
+      (its-defrule   "!"   "!")  (its-defrule   "@"   "@")
+      (its-defrule   "#"   "#")  (its-defrule   "$"   "$")
+      (its-defrule   "%"   "%")  (its-defrule   "^"   "^")
+      (its-defrule   "&"   "&")  (its-defrule   "*"   "*")
+      (its-defrule   "("   "(")  (its-defrule   ")"   ")")
+      (its-defrule   "="   "=")  (its-defrule   "`"   "`")
+      (its-defrule   "\\"  "\\") (its-defrule   "|"   "|")
+      (its-defrule   "_"   "_")  (its-defrule   "+"   "+")
+      (its-defrule   "{"   "{")  (its-defrule   "}"   "}")
+      (its-defrule   ":"   ":")  (its-defrule   ";"   ";")
+      (its-defrule   "\""  "\"") (its-defrule   "'"   "'")
+      (its-defrule   "<"   "<")  (its-defrule   ">"   ">")
+      (its-defrule   "?"   "?")  (its-defrule   "/"   "/")))
+  )
+
+(provide 'its/kata)
+;;; its/kata.el ends here.
index 9d3505d..6a32775 100644 (file)
@@ -1,17 +1,46 @@
+;;; its/pinyin.el --- Pinyin Input in Egg Input Method Architecture
+
+;; Copyright (C) 1997, 1998 Mule Project,
+;; Powered by Electrotechnical Laboratory, JAPAN.
+;; Project Leader: Satoru Tomura <tomura@etl.go.jp>
+
+;; Author: KATAYAMA Yoshio <kate@pfu.co.jp>
+
+;; This file will be part of GNU Emacs (in future).
+
+;; GNU Emacs is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2, or (at your option)
+;; any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+
+;;; Code:
+
 (eval-when-compile
   (require 'its)
   (require 'cl))
 
+(defvar its-pinyin-cn-enable-quanjioao-alphabet t "*Enable Quanjiao alphabet")
 (defvar its-pinyin-cn-open-braket  "\e$A!8\e(B" "*[") ; "\e$A#[\e(B"
 (defvar its-pinyin-cn-close-braket "\e$A!9\e(B" "*]") ; "\e$A#]\e(B"
 
+(defvar its-pinyin-tw-enable-quanjioao-alphabet t "*Enable Quanjiao alphabet")
 (defvar its-pinyin-tw-open-braket  "\e$(G!V\e(B" "*[") ; "\e$(G!b\e(B "
 (defvar its-pinyin-tw-close-braket "\e$(G!W\e(B" "*]") ; "\e$(G!c\e(B"
 
 (eval-when-compile
-  (defvar its-quanjiao-escape "Z")
-  (defvar its-banjiao-escape  "X")
-
   (defconst its-pinyin-term
     (char-to-string (make-char 'chinese-sisheng ?@)))
 
       state))
 
   (defmacro its-do-sisheng-table (list)
-    `(progn ,@(mapcar (lambda (syl)
-                       `(its-define-sisheng ,(car syl) ,(cdr syl)))
-                     list)))
+    `(progn
+       ,@(mapcar (lambda (syl)
+                  `(its-define-sisheng ,@syl))
+                list)))
 
   (defmacro its-define-sisheng (shengmu yunmu)
     `(let ((qing (nth 5 ,yunmu)) (y (car ,yunmu))
           (UO   '("uo"   "u\e(0-\e(B"   "u\e(0.\e(B"   "u\e(0/\e(B"   "u\e(00\e(B"   "uo"  )))
 
        (its-do-sisheng-table
-       (((- B C D F G H   K L M N P     S T W   Y Z CH SH ZH ) . A)
-        ((- B C D   G H   K L M N P     S T W     Z CH SH ZH ) . AI)
-        ((- B C D F G H   K L M N P   R S T W   Y Z CH SH ZH ) . AN)
-        ((- B C D F G H   K L M N P   R S T W   Y Z CH SH ZH ) . ANG)
-        ((- B C D   G H   K L M N P   R S T     Y Z CH SH ZH ) . AO)
-        ((-   C D   G H   K L M N     R S T     Y Z CH SH ZH ) . E)
-        ((- B C D F G H   K L M N P       T W     Z    SH ZH ) . EI)
-        ((- B C D F G H   K   M N P   R S   W     Z CH SH ZH ) . EN)
-        ((- B C D F G H   K L M N P   R S T W     Z CH SH ZH ) . ENG)
-        ((-                                                  ) . ER)
-        ((  B C D       J   L M N P Q R S T   X Y Z CH SH ZH ) . I)
-        ((      D       J   L       Q         X              ) . IA)
-        ((  B   D       J   L M N P Q     T   X              ) . IAN)
-        ((              J   L   N   Q         X              ) . IANG)
-        ((  B   D       J   L M N P Q     T   X              ) . IAO)
-        ((  B   D       J   L M N P Q     T   X              ) . IE)
-        ((  B           J   L M N P Q         X Y            ) . IN)
-        ((  B   D       J   L M N P Q     T   X Y            ) . ING)
-        ((              J           Q         X              ) . IONG)
-        ((      D       J   L M N   Q         X              ) . IU)
-        ((- B     F         L M   P         W   Y            ) . O)
-        ((    C D   G H   K L   N     R S T     Y Z CH    ZH ) . ONG)
-        ((-   C D F G H   K L M N P   R S T     Y Z CH SH ZH ) . OU)
-        ((  B C D F G H J K L M N P Q R S T W X Y Z CH SH ZH ) . U)
-        ((                  L   N                            ) . V)
-        ((          G H   K           R             CH SH ZH ) . UA)
-        ((          G H   K                         CH SH ZH ) . UAI)
-        ((    C D   G H J K L   N   Q R S T   X Y Z CH SH ZH ) . UAN)
-        ((          G H   K                         CH SH ZH ) . UANG)
-        ((              J           Q         X Y            ) . UE)
-        ((                  L   N                            ) . VE)
-        ((    C D   G H   K           R S T       Z CH SH ZH ) . UI)
-        ((    C D   G H J K L       Q R S T   X Y Z CH SH ZH ) . UN)
-        ((    C D   G H   K L   N     R S T       Z CH SH ZH ) . UO)
-
-        ((J Q X) . (cons "a"   (cdr IA  )))
-        ((J Q X) . (cons "ai"  (cdr IA  )))
-        ((J Q X) . (cons "an"  (cdr IAN )))
-        ((J Q X) . (cons "ang" (cdr IANG)))
-        ((J Q X) . (cons "ao"  (cdr IAO )))
-        ((J Q X) . (cons "e"   (cdr IE  )))
-        ((J Q X) . (cons "ei"  (cdr IE  )))
-        ((J Q X) . (cons "en"  (cdr IN  )))
-        ((J Q X) . (cons "eng" (cdr ING )))
-        ((J Q X) . (cons "ou"  (cdr IU  )))))
+       (((- B C D F G H   K L M N P     S T W   Y Z CH SH ZH ) A)
+        ((- B C D   G H   K L M N P     S T W     Z CH SH ZH ) AI)
+        ((- B C D F G H   K L M N P   R S T W   Y Z CH SH ZH ) AN)
+        ((- B C D F G H   K L M N P   R S T W   Y Z CH SH ZH ) ANG)
+        ((- B C D   G H   K L M N P   R S T     Y Z CH SH ZH ) AO)
+        ((-   C D   G H   K L M N     R S T     Y Z CH SH ZH ) E)
+        ((- B C D F G H   K L M N P       T W     Z    SH ZH ) EI)
+        ((- B C D F G H   K   M N P   R S   W     Z CH SH ZH ) EN)
+        ((- B C D F G H   K L M N P   R S T W     Z CH SH ZH ) ENG)
+        ((-                                                  ) ER)
+        ((  B C D       J   L M N P Q R S T   X Y Z CH SH ZH ) I)
+        ((      D       J   L       Q         X              ) IA)
+        ((  B   D       J   L M N P Q     T   X              ) IAN)
+        ((              J   L   N   Q         X              ) IANG)
+        ((  B   D       J   L M N P Q     T   X              ) IAO)
+        ((  B   D       J   L M N P Q     T   X              ) IE)
+        ((  B           J   L M N P Q         X Y            ) IN)
+        ((  B   D       J   L M N P Q     T   X Y            ) ING)
+        ((              J           Q         X              ) IONG)
+        ((      D       J   L M N   Q         X              ) IU)
+        ((- B     F         L M   P         W   Y            ) O)
+        ((    C D   G H   K L   N     R S T     Y Z CH    ZH ) ONG)
+        ((-   C D F G H   K L M N P   R S T     Y Z CH SH ZH ) OU)
+        ((  B C D F G H J K L M N P Q R S T W X Y Z CH SH ZH ) U)
+        ((                  L   N                            ) V)
+        ((          G H   K           R             CH SH ZH ) UA)
+        ((          G H   K                         CH SH ZH ) UAI)
+        ((    C D   G H J K L   N   Q R S T   X Y Z CH SH ZH ) UAN)
+        ((          G H   K                         CH SH ZH ) UANG)
+        ((              J           Q         X Y            ) UE)
+        ((                  L   N                            ) VE)
+        ((    C D   G H   K           R S T       Z CH SH ZH ) UI)
+        ((    C D   G H J K L       Q R S T   X Y Z CH SH ZH ) UN)
+        ((    C D   G H   K L   N     R S T       Z CH SH ZH ) UO)
+
+        ((J Q X) (cons "a"   (cdr IA  )))
+        ((J Q X) (cons "ai"  (cdr IA  )))
+        ((J Q X) (cons "an"  (cdr IAN )))
+        ((J Q X) (cons "ang" (cdr IANG)))
+        ((J Q X) (cons "ao"  (cdr IAO )))
+        ((J Q X) (cons "e"   (cdr IE  )))
+        ((J Q X) (cons "ei"  (cdr IE  )))
+        ((J Q X) (cons "en"  (cdr IN  )))
+        ((J Q X) (cons "eng" (cdr ING )))
+        ((J Q X) (cons "ou"  (cdr IU  )))))
 
        (its-define-qingsheng   "hm"    "")
        (its-define-qingsheng   "hng"   "")
 (define-its-state-machine its-pinyin-cn-map
   "pinyin-cn" "\e$AF4\e(BG" "Chinese-GB"
   "Map for Pinyin input. (Chinese-GB)"
+
+  (defconst its-quanjiao-escape "Z")
+  (defconst its-banjiao-escape  "X")
+
+  (its-defrule-select-mode-temporally "B" downcase)
+  (its-defrule-select-mode-temporally "Q" quanjiao-downcase-cn)
+
   (its-define-pinyin-table)
   (its-defoutput*      "b "    "\e$A2;\e(B")
   (its-defoutput*      "c "    "\e$A2E\e(B")
                   ("U" . "\e$A#U\e(B")  ("V" . "\e$A#V\e(B")  ("W" . "\e$A#W\e(B")  ("X" . "\e$A#X\e(B")
                   ("Y" . "\e$A#Y\e(B")  ("Z" . "\e$A#Z\e(B")))
     (let ((in (car ascii)) (out (cdr ascii)))
-      (if (and (or (string< in "a") (string< "z" in))
-              (null (equal in " "))
-              (null (equal in its-banjiao-escape))
-              (null (equal in its-quanjiao-escape)))
-         (progn
-           (its-defrule in in)
-           (its-defrule (concat (downcase its-banjiao-escape) in) in)
-           (its-defrule (concat (downcase its-quanjiao-escape) in) out)))
       (its-defrule (concat its-banjiao-escape in) in)
       (its-defrule (concat its-quanjiao-escape in) out)))
 
-  (its-defrule ","     "\e$A#,\e(B"      nil t)
-  (its-defrule "."     "\e$A!#\e(B"      nil t)
-  (its-defrule "/"     "\e$A!"\e(B"      nil t)
-  (its-defrule ":"     "\e$A#:\e(B"      nil t)
-  (its-defrule ";"     "\e$A#;\e(B"      nil t)
-  (its-defrule "?"     "\e$A#?\e(B"      nil t)
-  (its-defrule "!"     "\e$A#!\e(B"      nil t)
-  (its-defrule "-"     "\e$A!*\e(B"      nil t))
+  (its-defrule ","     "\e$A#,\e(B")
+  (its-defrule "."     "\e$A!#\e(B")
+  (its-defrule "/"     "\e$A!"\e(B")
+  (its-defrule ":"     "\e$A#:\e(B")
+  (its-defrule ";"     "\e$A#;\e(B")
+  (its-defrule "?"     "\e$A#?\e(B")
+  (its-defrule "!"     "\e$A#!\e(B"))
 
 (define-its-state-machine its-pinyin-tw-map
   "pinyin-tw" "\e$(GQ;\e(BC" "Chinese-CNS"
   "Map for Pinyin input."
+
+  (defconst its-quanjiao-escape "Z")
+  (defconst its-banjiao-escape  "X")
+
+  (its-defrule-select-mode-temporally "B" downcase)
+  (its-defrule-select-mode-temporally "Q" quanjiao-downcase-tw)
+
   (its-define-pinyin-table)
   (its-defoutput*      "b "    "\e$(GDb\e(B")
   (its-defoutput*      "c "    "\e$(GD_\e(B")
                   ("U" . "\e$(G$U\e(B")  ("V" . "\e$(G$V\e(B")  ("W" . "\e$(G$W\e(B")  ("X" . "\e$(G$X\e(B")
                   ("Y" . "\e$(G$Y\e(B")  ("Z" . "\e$(G$Z\e(B")))
     (let ((in (car ascii)) (out (cdr ascii)))
-      (if (and (or (string< in "a") (string< "z" in))
-              (null (equal in " "))
-              (null (equal in its-banjiao-escape))
-              (null (equal in its-quanjiao-escape)))
-         (progn
-           (its-defrule in in)
-           (its-defrule (concat (downcase its-banjiao-escape) in) in)
-           (its-defrule (concat (downcase its-quanjiao-escape) in) out)))
       (its-defrule (concat its-banjiao-escape in) in)
       (its-defrule (concat its-quanjiao-escape in) out)))
 
-  (its-defrule ","     "\e$(G!"\e(B"     nil t)
-  (its-defrule "."     "\e$(G!$\e(B"     nil t)
-  (its-defrule "/"     "\e$(G!#\e(B"     nil t)
-  (its-defrule ":"     "\e$(G!(\e(B"     nil t)
-  (its-defrule ";"     "\e$(G!'\e(B"     nil t)
-  (its-defrule "?"     "\e$(G!)\e(B"     nil t)
-  (its-defrule "!"     "\e$(G!*\e(B"     nil t)
-  (its-defrule "-"     "\e$(G"1\e(B"     nil t)
-  (its-defrule "["     "\e$(G!V\e(B"     nil t)
-  (its-defrule "]"     "\e$(G!W\e(B"     nil t))
+  (its-defrule ","     "\e$(G!"\e(B")
+  (its-defrule "."     "\e$(G!$\e(B")
+  (its-defrule "/"     "\e$(G!#\e(B")
+  (its-defrule ":"     "\e$(G!(\e(B")
+  (its-defrule ";"     "\e$(G!'\e(B")
+  (its-defrule "?"     "\e$(G!)\e(B")
+  (its-defrule "!"     "\e$(G!*\e(B"))
 
 (define-its-state-machine-append its-pinyin-cn-map
-  (its-defrule "[" its-pinyin-cn-open-braket  nil t)
-  (its-defrule "]" its-pinyin-cn-close-braket nil t))
+  (its-defrule "[" its-pinyin-cn-open-braket)
+  (its-defrule "]" its-pinyin-cn-close-braket)
+
+  (if its-pinyin-cn-enable-quanjioao-alphabet
+      (progn
+       (its-defrule "1"  "\e$A#1\e(B")  (its-defrule "2"  "\e$A#2\e(B")
+       (its-defrule "3"  "\e$A#3\e(B")  (its-defrule "4"  "\e$A#4\e(B")
+       (its-defrule "5"  "\e$A#5\e(B")  (its-defrule "6"  "\e$A#6\e(B")
+       (its-defrule "7"  "\e$A#7\e(B")  (its-defrule "8"  "\e$A#8\e(B")
+       (its-defrule "9"  "\e$A#9\e(B")  (its-defrule "0"  "\e$A#0\e(B")
+       (its-defrule "@"  "\e$A#@\e(B")
+       (its-defrule "#"  "\e$A##\e(B")  (its-defrule "$"  "\e$A!g\e(B")
+       (its-defrule "%"  "\e$A#%\e(B")  (its-defrule "^"  "\e$A#^\e(B")
+       (its-defrule "&"  "\e$A#&\e(B")  (its-defrule "*"  "\e$A#*\e(B")
+       (its-defrule "("  "\e$A#(\e(B")  (its-defrule ")"  "\e$A#)\e(B")
+       (its-defrule "-"  "\e$A#-\e(B")  (its-defrule "~"  "\e$A!+\e(B")
+       (its-defrule "="  "\e$A#=\e(B")  (its-defrule "`"  "\e$A#`\e(B")
+       (its-defrule "\\" "\e$A#\\e(B")  (its-defrule "|"  "\e$A#|\e(B")
+       (its-defrule "_"  "\e$A#_\e(B")  (its-defrule "+"  "\e$A#+\e(B")
+       (its-defrule "{"  "\e$A#{\e(B")  (its-defrule "}"  "\e$A#}\e(B")
+       (its-defrule "\"" "\e$A#"\e(B")  (its-defrule "'"  "\e$A#'\e(B")
+       (its-defrule "<"  "\e$A#<\e(B")  (its-defrule ">"  "\e$A#>\e(B"))
+    (progn
+      (its-defrule "1"  "1")  (its-defrule "2"  "2")
+      (its-defrule "3"  "3")  (its-defrule "4"  "4")
+      (its-defrule "5"  "5")  (its-defrule "6"  "6")
+      (its-defrule "7"  "7")  (its-defrule "8"  "8")
+      (its-defrule "9"  "9")  (its-defrule "0"  "0")
+      (its-defrule "@"  "@")
+      (its-defrule "#"  "#")  (its-defrule "$"  "$")
+      (its-defrule "%"  "%")  (its-defrule "^"  "^")
+      (its-defrule "&"  "&")  (its-defrule "*"  "*")
+      (its-defrule "("  "(")  (its-defrule ")"  ")")
+      (its-defrule "-"  "-")  (its-defrule "~"  "~")
+      (its-defrule "="  "=")  (its-defrule "`"  "`")
+      (its-defrule "\\" "\\") (its-defrule "|"  "|")
+      (its-defrule "_"  "_")  (its-defrule "+"  "+")
+      (its-defrule "{"  "{")  (its-defrule "}"  "}")
+      (its-defrule "\"" "\"") (its-defrule "'"  "'")
+      (its-defrule "<"  "<")  (its-defrule ">"  ">"))))
 
 (define-its-state-machine-append its-pinyin-tw-map
-  (its-defrule "[" its-pinyin-tw-open-braket  nil t)
-  (its-defrule "]" its-pinyin-tw-close-braket nil t))
+  (its-defrule "[" its-pinyin-tw-open-braket)
+  (its-defrule "]" its-pinyin-tw-close-braket)
+
+  (if its-pinyin-tw-enable-quanjioao-alphabet
+      (progn
+       (its-defrule "1"  "\e$(G$"\e(B")  (its-defrule "2"  "\e$(G$#\e(B")
+       (its-defrule "3"  "\e$(G$$\e(B")  (its-defrule "4"  "\e$(G$%\e(B")
+       (its-defrule "5"  "\e$(G$&\e(B")  (its-defrule "6"  "\e$(G$'\e(B")
+       (its-defrule "7"  "\e$(G$(\e(B")  (its-defrule "8"  "\e$(G$)\e(B")
+       (its-defrule "9"  "\e$(G$*\e(B")  (its-defrule "0"  "\e$(G$!\e(B")
+       (its-defrule "@"  "\e$(G"i\e(B")
+       (its-defrule "#"  "\e$(G!l\e(B")  (its-defrule "$"  "\e$(G"c\e(B")
+       (its-defrule "%"  "\e$(G"h\e(B")  (its-defrule "^"  "\e$(G!T\e(B")
+       (its-defrule "&"  "\e$(G!m\e(B")  (its-defrule "*"  "\e$(G!n\e(B")
+       (its-defrule "("  "\e$(G!>\e(B")  (its-defrule ")"  "\e$(G!?\e(B")
+       (its-defrule "-"  "\e$(G"1\e(B")  (its-defrule "~"  "\e$(G"D\e(B")
+       (its-defrule "="  "\e$(G"8\e(B")  (its-defrule "`"  "\e$(G!j\e(B")
+       (its-defrule "\\" "\e$(G"b\e(B")  (its-defrule "|"  "\e$(G"^\e(B")
+       (its-defrule "_"  "\e$(G"%\e(B")  (its-defrule "+"  "\e$(G"0\e(B")
+       (its-defrule "{"  "\e$A#{\e(B")  (its-defrule "}"  "\e$(G!a\e(B")
+       (its-defrule "\"" "\e$(G!i\e(B")  (its-defrule "'"  "\e$(G!k\e(B")
+       (its-defrule "<"  "\e$(G"6\e(B")  (its-defrule ">"  "\e$(G"7\e(B"))
+    (progn
+      (its-defrule "1"  "1")  (its-defrule "2"  "2")
+      (its-defrule "3"  "3")  (its-defrule "4"  "4")
+      (its-defrule "5"  "5")  (its-defrule "6"  "6")
+      (its-defrule "7"  "7")  (its-defrule "8"  "8")
+      (its-defrule "9"  "9")  (its-defrule "0"  "0")
+      (its-defrule "@"  "@")
+      (its-defrule "#"  "#")  (its-defrule "$"  "$")
+      (its-defrule "%"  "%")  (its-defrule "^"  "^")
+      (its-defrule "&"  "&")  (its-defrule "*"  "*")
+      (its-defrule "("  "(")  (its-defrule ")"  ")")
+      (its-defrule "-"  "-")  (its-defrule "~"  "~")
+      (its-defrule "="  "=")  (its-defrule "`"  "`")
+      (its-defrule "\\" "\\") (its-defrule "|"  "|")
+      (its-defrule "_"  "_")  (its-defrule "+"  "+")
+      (its-defrule "{"  "{")  (its-defrule "}"  "}")
+      (its-defrule "\"" "\"") (its-defrule "'"  "'")
+      (its-defrule "<"  "<")  (its-defrule ">"  ">"))))
 
 (provide 'its/pinyin)
diff --git a/its/quanjiao.el b/its/quanjiao.el
new file mode 100644 (file)
index 0000000..d33205d
--- /dev/null
@@ -0,0 +1,169 @@
+;;; its/quanjiao.el --- Quanjiao ASCII Input in Egg Input Method Architecture
+
+;; Copyright (C) 1997, 1998 Mule Project,
+;; Powered by Electrotechnical Laboratory, JAPAN.
+;; Project Leader: Satoru Tomura <tomura@etl.go.jp>
+
+;; Author: KATAYAMA Yoshio <kate@pfu.co.jp>
+
+;; This file will be part of GNU Emacs (in future).
+
+;; GNU Emacs is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2, or (at your option)
+;; any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+;;
+;; Symbol input is desined by jiro@math.keio.ac.jp (TANAKA Jiro)
+;; This file is based on the rules of its/hira.el in Mule-2.3 distribution.
+;;
+
+;;; Code:
+
+(eval-when-compile
+  (require 'its))
+
+(define-its-state-machine its-quanjiao-up-cn-map
+  "quanjiao-upcase-cn" "\e$A#A\e(B" "Chinese-GB" nil
+  "Map for quanjiao-upcase input. (Chinese-GB)"
+
+  (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")
+                  ("4" . "\e$A#4\e(B")  ("5" . "\e$A#5\e(B")  ("6" . "\e$A#6\e(B")  ("7" . "\e$A#7\e(B")
+                  ("8" . "\e$A#8\e(B")  ("9" . "\e$A#9\e(B") 
+                  (" " . "\e$A!!\e(B")  ("!" . "\e$A#!\e(B")  ("@" . "\e$A#@\e(B")  ("#" . "\e$A##\e(B")
+                  ("$" . "\e$A!g\e(B")  ("%" . "\e$A#%\e(B")  ("^" . "\e$A#^\e(B")  ("&" . "\e$A#&\e(B")
+                  ("*" . "\e$A#*\e(B")  ("(" . "\e$A#(\e(B")  (")" . "\e$A#)\e(B")
+                  ("-" . "\e$A#-\e(B")  ("=" . "\e$A#=\e(B")  ("`" . "\e$A#`\e(B")  ("\\" . "\e$A#\\e(B")
+                  ("|" . "\e$A#|\e(B")  ("_" . "\e$A#_\e(B")  ("+" . "\e$A#+\e(B")  ("~" . "\e$A!+\e(B")
+                  ("[" . "\e$A#[\e(B")  ("]" . "\e$A#]\e(B")  ("{" . "\e$A#{\e(B")  ("}" . "\e$A#}\e(B")
+                  (":" . "\e$A#:\e(B")  (";" . "\e$A#;\e(B")  ("\"" . "\e$A#"\e(B") ("'" . "\e$A#'\e(B")
+                  ("<" . "\e$A#<\e(B")  (">" . "\e$A#>\e(B")  ("?" . "\e$A#?\e(B")  ("/" . "\e$A#/\e(B")
+                  ("," . "\e$A#,\e(B")  ("." . "\e$A#.\e(B")
+                  ("a" . "\e$A#A\e(B")  ("b" . "\e$A#B\e(B")  ("c" . "\e$A#C\e(B")  ("d" . "\e$A#D\e(B")
+                  ("e" . "\e$A#E\e(B")  ("f" . "\e$A#F\e(B")  ("g" . "\e$A#G\e(B")  ("h" . "\e$A#H\e(B")
+                  ("i" . "\e$A#I\e(B")  ("j" . "\e$A#J\e(B")  ("k" . "\e$A#K\e(B")  ("l" . "\e$A#L\e(B")
+                  ("m" . "\e$A#M\e(B")  ("n" . "\e$A#N\e(B")  ("o" . "\e$A#O\e(B")  ("p" . "\e$A#P\e(B")
+                  ("q" . "\e$A#Q\e(B")  ("r" . "\e$A#R\e(B")  ("s" . "\e$A#S\e(B")  ("t" . "\e$A#T\e(B")
+                  ("u" . "\e$A#U\e(B")  ("v" . "\e$A#V\e(B")  ("w" . "\e$A#W\e(B")  ("x" . "\e$A#X\e(B")
+                  ("y" . "\e$A#Y\e(B")  ("z" . "\e$A#Z\e(B")
+                  ("A" . "\e$A#A\e(B")  ("B" . "\e$A#B\e(B")  ("C" . "\e$A#C\e(B")  ("D" . "\e$A#D\e(B")
+                  ("E" . "\e$A#E\e(B")  ("F" . "\e$A#F\e(B")  ("G" . "\e$A#G\e(B")  ("H" . "\e$A#H\e(B")
+                  ("I" . "\e$A#I\e(B")  ("J" . "\e$A#J\e(B")  ("K" . "\e$A#K\e(B")  ("L" . "\e$A#L\e(B")
+                  ("M" . "\e$A#M\e(B")  ("N" . "\e$A#N\e(B")  ("O" . "\e$A#O\e(B")  ("P" . "\e$A#P\e(B")
+                  ("Q" . "\e$A#Q\e(B")  ("R" . "\e$A#R\e(B")  ("S" . "\e$A#S\e(B")  ("T" . "\e$A#T\e(B")
+                  ("U" . "\e$A#U\e(B")  ("V" . "\e$A#V\e(B")  ("W" . "\e$A#W\e(B")  ("X" . "\e$A#X\e(B")
+                  ("Y" . "\e$A#Y\e(B")  ("Z" . "\e$A#Z\e(B")))
+    (let ((in (car ascii)) (out (cdr ascii)))
+      (its-defrule in out))))
+
+(define-its-state-machine its-quanjiao-down-cn-map
+  "quanjiao-downcase-cn" "\e$A#a\e(B" "Chinese-GB" nil
+  "Map for quanjiao-downcase input. (Chinese-GB)"
+
+  (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")
+                  ("4" . "\e$A#4\e(B")  ("5" . "\e$A#5\e(B")  ("6" . "\e$A#6\e(B")  ("7" . "\e$A#7\e(B")
+                  ("8" . "\e$A#8\e(B")  ("9" . "\e$A#9\e(B") 
+                  (" " . "\e$A!!\e(B")  ("!" . "\e$A#!\e(B")  ("@" . "\e$A#@\e(B")  ("#" . "\e$A##\e(B")
+                  ("$" . "\e$A!g\e(B")  ("%" . "\e$A#%\e(B")  ("^" . "\e$A#^\e(B")  ("&" . "\e$A#&\e(B")
+                  ("*" . "\e$A#*\e(B")  ("(" . "\e$A#(\e(B")  (")" . "\e$A#)\e(B")
+                  ("-" . "\e$A#-\e(B")  ("=" . "\e$A#=\e(B")  ("`" . "\e$A#`\e(B")  ("\\" . "\e$A#\\e(B")
+                  ("|" . "\e$A#|\e(B")  ("_" . "\e$A#_\e(B")  ("+" . "\e$A#+\e(B")  ("~" . "\e$A!+\e(B")
+                  ("[" . "\e$A#[\e(B")  ("]" . "\e$A#]\e(B")  ("{" . "\e$A#{\e(B")  ("}" . "\e$A#}\e(B")
+                  (":" . "\e$A#:\e(B")  (";" . "\e$A#;\e(B")  ("\"" . "\e$A#"\e(B") ("'" . "\e$A#'\e(B")
+                  ("<" . "\e$A#<\e(B")  (">" . "\e$A#>\e(B")  ("?" . "\e$A#?\e(B")  ("/" . "\e$A#/\e(B")
+                  ("," . "\e$A#,\e(B")  ("." . "\e$A#.\e(B")
+                  ("a" . "\e$A#a\e(B")  ("b" . "\e$A#b\e(B")  ("c" . "\e$A#c\e(B")  ("d" . "\e$A#d\e(B")
+                  ("e" . "\e$A#e\e(B")  ("f" . "\e$A#f\e(B")  ("g" . "\e$A#g\e(B")  ("h" . "\e$A#h\e(B")
+                  ("i" . "\e$A#i\e(B")  ("j" . "\e$A#j\e(B")  ("k" . "\e$A#k\e(B")  ("l" . "\e$A#l\e(B")
+                  ("m" . "\e$A#m\e(B")  ("n" . "\e$A#n\e(B")  ("o" . "\e$A#o\e(B")  ("p" . "\e$A#p\e(B")
+                  ("q" . "\e$A#q\e(B")  ("r" . "\e$A#r\e(B")  ("s" . "\e$A#s\e(B")  ("t" . "\e$A#t\e(B")
+                  ("u" . "\e$A#u\e(B")  ("v" . "\e$A#v\e(B")  ("w" . "\e$A#w\e(B")  ("x" . "\e$A#x\e(B")
+                  ("y" . "\e$A#y\e(B")  ("z" . "\e$A#z\e(B")
+                  ("A" . "\e$A#A\e(B")  ("B" . "\e$A#B\e(B")  ("C" . "\e$A#C\e(B")  ("D" . "\e$A#D\e(B")
+                  ("E" . "\e$A#E\e(B")  ("F" . "\e$A#F\e(B")  ("G" . "\e$A#G\e(B")  ("H" . "\e$A#H\e(B")
+                  ("I" . "\e$A#I\e(B")  ("J" . "\e$A#J\e(B")  ("K" . "\e$A#K\e(B")  ("L" . "\e$A#L\e(B")
+                  ("M" . "\e$A#M\e(B")  ("N" . "\e$A#N\e(B")  ("O" . "\e$A#O\e(B")  ("P" . "\e$A#P\e(B")
+                  ("Q" . "\e$A#Q\e(B")  ("R" . "\e$A#R\e(B")  ("S" . "\e$A#S\e(B")  ("T" . "\e$A#T\e(B")
+                  ("U" . "\e$A#U\e(B")  ("V" . "\e$A#V\e(B")  ("W" . "\e$A#W\e(B")  ("X" . "\e$A#X\e(B")
+                  ("Y" . "\e$A#Y\e(B")  ("Z" . "\e$A#Z\e(B")))
+    (let ((in (car ascii)) (out (cdr ascii)))
+      (its-defrule in out))))
+
+(define-its-state-machine its-quanjiao-up-tw-map
+  "quanjiao-upcase-tw" "\e$(G$A\e(B" "Chinese-CNS" nil
+  "Map for quanjiao-upcase input. (Chinese-CNS)"
+
+  (dolist (ascii '(("0" . "\e$(G$!\e(B")  ("1" . "\e$(G$"\e(B")  ("2" . "\e$(G$#\e(B")  ("3" . "\e$(G$$\e(B")
+                  ("4" . "\e$(G$%\e(B")  ("5" . "\e$(G$&\e(B")  ("6" . "\e$(G$'\e(B")  ("7" . "\e$(G$(\e(B")
+                  ("8" . "\e$(G$)\e(B")  ("9" . "\e$(G$*\e(B") 
+                  (" " . "\e$(G!!\e(B")  ("!" . "\e$(G!*\e(B")  ("@" . "\e$(G"i\e(B")  ("#" . "\e$(G!l\e(B")
+                  ("$" . "\e$(G"c\e(B")  ("%" . "\e$(G"h\e(B")  ("^" . "\e$(G!T\e(B")  ("&" . "\e$(G!m\e(B")
+                  ("*" . "\e$(G!n\e(B")  ("(" . "\e$(G!>\e(B")  (")" . "\e$(G!?\e(B")
+                  ("-" . "\e$(G"1\e(B")  ("=" . "\e$(G"8\e(B")  ("`" . "\e$(G!j\e(B")  ("\\" . "\e$(G"b\e(B")
+                  ("|" . "\e$(G"^\e(B")  ("_" . "\e$(G"%\e(B")  ("+" . "\e$(G"0\e(B")  ("~" . "\e$(G"D\e(B")
+                  ("[" . "\e$(G!b\e(B")  ("]" . "\e$(G!c\e(B")  ("{" . "\e$A#{\e(B")  ("}" . "\e$(G!a\e(B")
+                  (":" . "\e$(G!(\e(B")  (";" . "\e$(G!'\e(B")  ("\"" . "\e$(G!i\e(B") ("'" . "\e$(G!k\e(B")
+                  ("<" . "\e$(G"6\e(B")  (">" . "\e$(G"7\e(B")  ("?" . "\e$(G!)\e(B")  ("/" . "\e$(G"a\e(B")
+                  ("," . "\e$(G!"\e(B")  ("." . "\e$(G!%\e(B")
+                  ("a" . "\e$(G$A\e(B")  ("b" . "\e$(G$B\e(B")  ("c" . "\e$(G$C\e(B")  ("d" . "\e$(G$D\e(B")
+                  ("e" . "\e$(G$E\e(B")  ("f" . "\e$(G$F\e(B")  ("g" . "\e$(G$G\e(B")  ("h" . "\e$(G$H\e(B")
+                  ("i" . "\e$(G$I\e(B")  ("j" . "\e$(G$J\e(B")  ("k" . "\e$(G$K\e(B")  ("l" . "\e$(G$L\e(B")
+                  ("m" . "\e$(G$M\e(B")  ("n" . "\e$(G$N\e(B")  ("o" . "\e$(G$O\e(B")  ("p" . "\e$(G$P\e(B")
+                  ("q" . "\e$(G$Q\e(B")  ("r" . "\e$(G$R\e(B")  ("s" . "\e$(G$S\e(B")  ("t" . "\e$(G$T\e(B")
+                  ("u" . "\e$(G$U\e(B")  ("v" . "\e$(G$V\e(B")  ("w" . "\e$(G$W\e(B")  ("x" . "\e$(G$X\e(B")
+                  ("y" . "\e$(G$Y\e(B")  ("z" . "\e$(G$Z\e(B")
+                  ("A" . "\e$(G$A\e(B")  ("B" . "\e$(G$B\e(B")  ("C" . "\e$(G$C\e(B")  ("D" . "\e$(G$D\e(B")
+                  ("E" . "\e$(G$E\e(B")  ("F" . "\e$(G$F\e(B")  ("G" . "\e$(G$G\e(B")  ("H" . "\e$(G$H\e(B")
+                  ("I" . "\e$(G$I\e(B")  ("J" . "\e$(G$J\e(B")  ("K" . "\e$(G$K\e(B")  ("L" . "\e$(G$L\e(B")
+                  ("M" . "\e$(G$M\e(B")  ("N" . "\e$(G$N\e(B")  ("O" . "\e$(G$O\e(B")  ("P" . "\e$(G$P\e(B")
+                  ("Q" . "\e$(G$Q\e(B")  ("R" . "\e$(G$R\e(B")  ("S" . "\e$(G$S\e(B")  ("T" . "\e$(G$T\e(B")
+                  ("U" . "\e$(G$U\e(B")  ("V" . "\e$(G$V\e(B")  ("W" . "\e$(G$W\e(B")  ("X" . "\e$(G$X\e(B")
+                  ("Y" . "\e$(G$Y\e(B")  ("Z" . "\e$(G$Z\e(B")))
+    (let ((in (car ascii)) (out (cdr ascii)))
+      (its-defrule in out))))
+
+(define-its-state-machine its-quanjiao-down-tw-map
+  "quanjiao-downcase-tw" "\e$(G$[\e(B" "Chinese-CNS" nil
+  "Map for quanjiao-downcase input. (Chinese-CNS)"
+
+  (dolist (ascii '(("0" . "\e$(G$!\e(B")  ("1" . "\e$(G$"\e(B")  ("2" . "\e$(G$#\e(B")  ("3" . "\e$(G$$\e(B")
+                  ("4" . "\e$(G$%\e(B")  ("5" . "\e$(G$&\e(B")  ("6" . "\e$(G$'\e(B")  ("7" . "\e$(G$(\e(B")
+                  ("8" . "\e$(G$)\e(B")  ("9" . "\e$(G$*\e(B") 
+                  (" " . "\e$(G!!\e(B")  ("!" . "\e$(G!*\e(B")  ("@" . "\e$(G"i\e(B")  ("#" . "\e$(G!l\e(B")
+                  ("$" . "\e$(G"c\e(B")  ("%" . "\e$(G"h\e(B")  ("^" . "\e$(G!T\e(B")  ("&" . "\e$(G!m\e(B")
+                  ("*" . "\e$(G!n\e(B")  ("(" . "\e$(G!>\e(B")  (")" . "\e$(G!?\e(B")
+                  ("-" . "\e$(G"1\e(B")  ("=" . "\e$(G"8\e(B")  ("`" . "\e$(G!j\e(B")  ("\\" . "\e$(G"b\e(B")
+                  ("|" . "\e$(G"^\e(B")  ("_" . "\e$(G"%\e(B")  ("+" . "\e$(G"0\e(B")  ("~" . "\e$(G"D\e(B")
+                  ("[" . "\e$(G!b\e(B")  ("]" . "\e$(G!c\e(B")  ("{" . "\e$A#{\e(B")  ("}" . "\e$(G!a\e(B")
+                  (":" . "\e$(G!(\e(B")  (";" . "\e$(G!'\e(B")  ("\"" . "\e$(G!i\e(B") ("'" . "\e$(G!k\e(B")
+                  ("<" . "\e$(G"6\e(B")  (">" . "\e$(G"7\e(B")  ("?" . "\e$(G!)\e(B")  ("/" . "\e$(G"a\e(B")
+                  ("," . "\e$(G!"\e(B")  ("." . "\e$(G!%\e(B")
+                  ("a" . "\e$(G$[\e(B")  ("b" . "\e$(G$\\e(B")  ("c" . "\e$(G$]\e(B")  ("d" . "\e$(G$^\e(B")
+                  ("e" . "\e$(G$_\e(B")  ("f" . "\e$(G$`\e(B")  ("g" . "\e$(G$a\e(B")  ("h" . "\e$(G$b\e(B")
+                  ("i" . "\e$(G$c\e(B")  ("j" . "\e$(G$d\e(B")  ("k" . "\e$(G$e\e(B")  ("l" . "\e$(G$f\e(B")
+                  ("m" . "\e$(G$g\e(B")  ("n" . "\e$(G$h\e(B")  ("o" . "\e$(G$i\e(B")  ("p" . "\e$(G$j\e(B")
+                  ("q" . "\e$(G$k\e(B")  ("r" . "\e$(G$l\e(B")  ("s" . "\e$(G$m\e(B")  ("t" . "\e$(G$n\e(B")
+                  ("u" . "\e$(G$o\e(B")  ("v" . "\e$(G$p\e(B")  ("w" . "\e$(G$q\e(B")  ("x" . "\e$(G$r\e(B")
+                  ("y" . "\e$(G$s\e(B")  ("z" . "\e$(G$t\e(B")
+                  ("A" . "\e$(G$A\e(B")  ("B" . "\e$(G$B\e(B")  ("C" . "\e$(G$C\e(B")  ("D" . "\e$(G$D\e(B")
+                  ("E" . "\e$(G$E\e(B")  ("F" . "\e$(G$F\e(B")  ("G" . "\e$(G$G\e(B")  ("H" . "\e$(G$H\e(B")
+                  ("I" . "\e$(G$I\e(B")  ("J" . "\e$(G$J\e(B")  ("K" . "\e$(G$K\e(B")  ("L" . "\e$(G$L\e(B")
+                  ("M" . "\e$(G$M\e(B")  ("N" . "\e$(G$N\e(B")  ("O" . "\e$(G$O\e(B")  ("P" . "\e$(G$P\e(B")
+                  ("Q" . "\e$(G$Q\e(B")  ("R" . "\e$(G$R\e(B")  ("S" . "\e$(G$S\e(B")  ("T" . "\e$(G$T\e(B")
+                  ("U" . "\e$(G$U\e(B")  ("V" . "\e$(G$V\e(B")  ("W" . "\e$(G$W\e(B")  ("X" . "\e$(G$X\e(B")
+                  ("Y" . "\e$(G$Y\e(B")  ("Z" . "\e$(G$Z\e(B")))
+    (let ((in (car ascii)) (out (cdr ascii)))
+      (its-defrule in out))))
+
+(provide 'its/quanjiao)
diff --git a/its/zenkaku.el b/its/zenkaku.el
new file mode 100644 (file)
index 0000000..d56c1bb
--- /dev/null
@@ -0,0 +1,103 @@
+;;; its/zenkau.el --- Zenkaku ASCII Input in Egg Input Method Architecture
+
+;; Copyright (C) 1997, 1998 Mule Project,
+;; Powered by Electrotechnical Laboratory, JAPAN.
+;; Project Leader: Satoru Tomura <tomura@etl.go.jp>
+
+;; Author: KATAYAMA Yoshio <kate@pfu.co.jp>
+
+;; This file will be part of GNU Emacs (in future).
+
+;; GNU Emacs is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2, or (at your option)
+;; any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+;;
+;; Symbol input is desined by jiro@math.keio.ac.jp (TANAKA Jiro)
+;; This file is based on the rules of its/hira.el in Mule-2.3 distribution.
+;;
+
+;;; Code:
+
+(eval-when-compile
+  (require 'its))
+
+(define-its-state-machine its-zenkaku-up-map
+  "zenkaku-upcase" "\e$B#A\e(B" "Japanese" nil
+  "Map for zenkaku-upcase input."
+
+  (dolist (ascii '(("0" . "\e$B#0\e(B")  ("1" . "\e$B#1\e(B")  ("2" . "\e$B#2\e(B")  ("3" . "\e$B#3\e(B")
+                  ("4" . "\e$B#4\e(B")  ("5" . "\e$B#5\e(B")  ("6" . "\e$B#6\e(B")  ("7" . "\e$B#7\e(B")
+                  ("8" . "\e$B#8\e(B")  ("9" . "\e$B#9\e(B") 
+                  (" " . "\e$B!!\e(B")  ("!" . "\e$B!*\e(B")  ("@" . "\e$B!w\e(B")  ("#" . "\e$B!t\e(B")
+                  ("$" . "\e$B!p\e(B")  ("%" . "\e$B!s\e(B")  ("^" . "\e$B!0\e(B")  ("&" . "\e$B!u\e(B")
+                  ("*" . "\e$B!v\e(B")  ("(" . "\e$B!J\e(B")  (")" . "\e$B!K\e(B")
+                  ("-" . "\e$B!]\e(B")  ("=" . "\e$B!a\e(B")  ("`" . "\e$B!.\e(B")  ("\\" . "\e$B!@\e(B")
+                  ("|" . "\e$B!C\e(B")  ("_" . "\e$B!2\e(B")  ("+" . "\e$B!\\e(B")  ("~" . "\e$B!A\e(B")
+                  ("[" . "\e$B!N\e(B")  ("]" . "\e$B!O\e(B")  ("{" . "\e$B!P\e(B")  ("}" . "\e$B!Q\e(B")
+                  (":" . "\e$B!'\e(B")  (";" . "\e$B!(\e(B")  ("\"" . "\e$B!I\e(B") ("'" . "\e$B!-\e(B")
+                  ("<" . "\e$B!c\e(B")  (">" . "\e$B!d\e(B")  ("?" . "\e$B!)\e(B")  ("/" . "\e$B!?\e(B")
+                  ("," . "\e$B!$\e(B")  ("." . "\e$B!%\e(B")
+                  ("a" . "\e$B#A\e(B")  ("b" . "\e$B#B\e(B")  ("c" . "\e$B#C\e(B")  ("d" . "\e$B#D\e(B")
+                  ("e" . "\e$B#E\e(B")  ("f" . "\e$B#F\e(B")  ("g" . "\e$B#G\e(B")  ("h" . "\e$B#H\e(B")
+                  ("i" . "\e$B#I\e(B")  ("j" . "\e$B#J\e(B")  ("k" . "\e$B#K\e(B")  ("l" . "\e$B#L\e(B")
+                  ("m" . "\e$B#M\e(B")  ("n" . "\e$B#N\e(B")  ("o" . "\e$B#O\e(B")  ("p" . "\e$B#P\e(B")
+                  ("q" . "\e$B#Q\e(B")  ("r" . "\e$B#R\e(B")  ("s" . "\e$B#S\e(B")  ("t" . "\e$B#T\e(B")
+                  ("u" . "\e$B#U\e(B")  ("v" . "\e$B#V\e(B")  ("w" . "\e$B#W\e(B")  ("x" . "\e$B#X\e(B")
+                  ("y" . "\e$B#Y\e(B")  ("z" . "\e$B#Z\e(B")
+                  ("A" . "\e$B#A\e(B")  ("B" . "\e$B#B\e(B")  ("C" . "\e$B#C\e(B")  ("D" . "\e$B#D\e(B")
+                  ("E" . "\e$B#E\e(B")  ("F" . "\e$B#F\e(B")  ("G" . "\e$B#G\e(B")  ("H" . "\e$B#H\e(B")
+                  ("I" . "\e$B#I\e(B")  ("J" . "\e$B#J\e(B")  ("K" . "\e$B#K\e(B")  ("L" . "\e$B#L\e(B")
+                  ("M" . "\e$B#M\e(B")  ("N" . "\e$B#N\e(B")  ("O" . "\e$B#O\e(B")  ("P" . "\e$B#P\e(B")
+                  ("Q" . "\e$B#Q\e(B")  ("R" . "\e$B#R\e(B")  ("S" . "\e$B#S\e(B")  ("T" . "\e$B#T\e(B")
+                  ("U" . "\e$B#U\e(B")  ("V" . "\e$B#V\e(B")  ("W" . "\e$B#W\e(B")  ("X" . "\e$B#X\e(B")
+                  ("Y" . "\e$B#Y\e(B")  ("Z" . "\e$B#Z\e(B")))
+    (let ((in (car ascii)) (out (cdr ascii)))
+      (its-defrule in out))))
+
+(define-its-state-machine its-zenkaku-down-map
+  "zenkaku-downcase" "\e$B#a\e(B" "Japanese" nil
+  "Map for zenkaku-downcase input."
+
+  (dolist (ascii '(("0" . "\e$B#0\e(B")  ("1" . "\e$B#1\e(B")  ("2" . "\e$B#2\e(B")  ("3" . "\e$B#3\e(B")
+                  ("4" . "\e$B#4\e(B")  ("5" . "\e$B#5\e(B")  ("6" . "\e$B#6\e(B")  ("7" . "\e$B#7\e(B")
+                  ("8" . "\e$B#8\e(B")  ("9" . "\e$B#9\e(B") 
+                  (" " . "\e$B!!\e(B")  ("!" . "\e$B!*\e(B")  ("@" . "\e$B!w\e(B")  ("#" . "\e$B!t\e(B")
+                  ("$" . "\e$B!p\e(B")  ("%" . "\e$B!s\e(B")  ("^" . "\e$B!0\e(B")  ("&" . "\e$B!u\e(B")
+                  ("*" . "\e$B!v\e(B")  ("(" . "\e$B!J\e(B")  (")" . "\e$B!K\e(B")
+                  ("-" . "\e$B!]\e(B")  ("=" . "\e$B!a\e(B")  ("`" . "\e$B!.\e(B")  ("\\" . "\e$B!@\e(B")
+                  ("|" . "\e$B!C\e(B")  ("_" . "\e$B!2\e(B")  ("+" . "\e$B!\\e(B")  ("~" . "\e$B!A\e(B")
+                  ("[" . "\e$B!N\e(B")  ("]" . "\e$B!O\e(B")  ("{" . "\e$B!P\e(B")  ("}" . "\e$B!Q\e(B")
+                  (":" . "\e$B!'\e(B")  (";" . "\e$B!(\e(B")  ("\"" . "\e$B!I\e(B") ("'" . "\e$B!-\e(B")
+                  ("<" . "\e$B!c\e(B")  (">" . "\e$B!d\e(B")  ("?" . "\e$B!)\e(B")  ("/" . "\e$B!?\e(B")
+                  ("," . "\e$B!$\e(B")  ("." . "\e$B!%\e(B")
+                  ("a" . "\e$B#a\e(B")  ("b" . "\e$B#b\e(B")  ("c" . "\e$B#c\e(B")  ("d" . "\e$B#d\e(B")
+                  ("e" . "\e$B#e\e(B")  ("f" . "\e$B#f\e(B")  ("g" . "\e$B#g\e(B")  ("h" . "\e$B#h\e(B")
+                  ("i" . "\e$B#i\e(B")  ("j" . "\e$B#j\e(B")  ("k" . "\e$B#k\e(B")  ("l" . "\e$B#l\e(B")
+                  ("m" . "\e$B#m\e(B")  ("n" . "\e$B#n\e(B")  ("o" . "\e$B#o\e(B")  ("p" . "\e$B#p\e(B")
+                  ("q" . "\e$B#q\e(B")  ("r" . "\e$B#r\e(B")  ("s" . "\e$B#s\e(B")  ("t" . "\e$B#t\e(B")
+                  ("u" . "\e$B#u\e(B")  ("v" . "\e$B#v\e(B")  ("w" . "\e$B#w\e(B")  ("x" . "\e$B#x\e(B")
+                  ("y" . "\e$B#y\e(B")  ("z" . "\e$B#z\e(B")
+                  ("A" . "\e$B#A\e(B")  ("B" . "\e$B#B\e(B")  ("C" . "\e$B#C\e(B")  ("D" . "\e$B#D\e(B")
+                  ("E" . "\e$B#E\e(B")  ("F" . "\e$B#F\e(B")  ("G" . "\e$B#G\e(B")  ("H" . "\e$B#H\e(B")
+                  ("I" . "\e$B#I\e(B")  ("J" . "\e$B#J\e(B")  ("K" . "\e$B#K\e(B")  ("L" . "\e$B#L\e(B")
+                  ("M" . "\e$B#M\e(B")  ("N" . "\e$B#N\e(B")  ("O" . "\e$B#O\e(B")  ("P" . "\e$B#P\e(B")
+                  ("Q" . "\e$B#Q\e(B")  ("R" . "\e$B#R\e(B")  ("S" . "\e$B#S\e(B")  ("T" . "\e$B#T\e(B")
+                  ("U" . "\e$B#U\e(B")  ("V" . "\e$B#V\e(B")  ("W" . "\e$B#W\e(B")  ("X" . "\e$B#X\e(B")
+                  ("Y" . "\e$B#Y\e(B")  ("Z" . "\e$B#Z\e(B")))
+    (let ((in (car ascii)) (out (cdr ascii)))
+      (its-defrule in out))))
+
+(provide 'its/zenkaku)
diff --git a/its/zhuyin.el b/its/zhuyin.el
new file mode 100644 (file)
index 0000000..442834b
--- /dev/null
@@ -0,0 +1,288 @@
+;;; its/zhuyin.el --- Zhuyin Input in Egg Input Method Architecture
+
+;; Copyright (C) 1997, 1998 Mule Project,
+;; Powered by Electrotechnical Laboratory, JAPAN.
+;; Project Leader: Satoru Tomura <tomura@etl.go.jp>
+
+;; Author: KATAYAMA Yoshio <kate@pfu.co.jp>
+
+;; This file will be part of GNU Emacs (in future).
+
+;; GNU Emacs is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2, or (at your option)
+;; any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+
+;;; Code:
+
+(eval-when-compile
+  (require 'its)
+  (require 'cl))
+
+(defvar its-zhuyin-cn-enable-quanjioao-alphabet t "*Enable Quanjiao alphabet")
+(defvar its-zhuyin-cn-open-braket  "\e$A!8\e(B" "*[") ; "\e$A#[\e(B"
+(defvar its-zhuyin-cn-close-braket "\e$A!9\e(B" "*]") ; "\e$A#]\e(B"
+
+(defvar its-zhuyin-tw-enable-quanjioao-alphabet t "*Enable Quanjiao alphabet")
+(defvar its-zhuyin-tw-open-braket  "\e$(G!V\e(B" "*[") ; "\e$(G!b\e(B "
+(defvar its-zhuyin-tw-close-braket "\e$(G!W\e(B" "*]") ; "\e$(G!c\e(B"
+
+(eval-when-compile
+  (defmacro its-do-zhuyin-table (list)
+    `(progn
+       ,@(mapcar (lambda (syl) `(its-define-zhuyin ,@syl))
+                list)))
+
+  (defmacro its-define-zhuyin (shengmu yunmu1 &optional yunmu2 qing-only)
+    `(let ((s (list ,@shengmu))
+          (yi (concat (car ,yunmu1) (car ,yunmu2)))
+          (yo (concat (nth 1 ,yunmu1) (nth 1 ,yunmu2)))
+          (tone (if ,qing-only "\e(0A\e(B" "\e(0@\e(B"))
+          in out out1 state)
+       (while s
+        (setq in (concat (car (car s)) yi)
+              out (concat (nth 1 (car s)) yo)
+              out1 (concat out tone)
+              state (its-goto-state in nil t))
+        (if (and ,qing-only (its-get-kst/t state))
+            (its-set-output state out)
+          (its-set-output state out1))
+        (its-make-next-state state -1 in out1)
+        (its-make-next-state state ?  (concat in " ") out1)
+        (its-define-otherwise state (its-make-otherwise
+                                     out1
+                                     its-otherwise-back-one))
+        ,(if qing-only
+             nil
+           '(progn
+              (its-make-next-state state ?1 (concat in 1) (concat out "\e(0A\e(B"))
+              (its-make-next-state state ?2 (concat in 2) (concat out "\e(0B\e(B"))
+              (its-make-next-state state ?3 (concat in 3) (concat out "\e(0C\e(B"))
+              (its-make-next-state state ?4 (concat in 4) (concat out "\e(0D\e(B"))))
+        (setq s (cdr s)))))
+
+  (defmacro its-define-zhuyin-table ()
+    '(let ((-  '(""  ""))
+          (B  '("b" "\e(0E\e(B")) (P  '("p" "\e(0F\e(B")) (M  '("m" "\e(0G\e(B")) (F '("f" "\e(0H\e(B"))
+          (D  '("d" "\e(0I\e(B")) (T  '("t" "\e(0J\e(B")) (N  '("n" "\e(0K\e(B")) (L '("l" "\e(0L\e(B"))
+          (G  '("v" "\e(0M\e(B")) (K  '("k" "\e(0N\e(B")) (H  '("h" "\e(0O\e(B"))
+          (J  '("g" "\e(0P\e(B")) (Q  '("7" "\e(0Q\e(B")) (X  '("c" "\e(0R\e(B"))
+          (ZH '("," "\e(0S\e(B")) (CH '("." "\e(0T\e(B")) (SH '("/" "\e(0U\e(B")) (R '("j"  "\e(0V\e(B"))
+          (Z  '(";" "\e(0W\e(B")) (C  '(":" "\e(0X\e(B")) (S  '("s" "\e(0Y\e(B"))
+
+          (A   '("a" "\e(0Z\e(B")) (O   '("o" "\e(0[\e(B")) (e   '("r" "\e(0\\e(B")) (E   '("w" "\e(0]\e(B"))
+          (AI  '("i" "\e(0^\e(B")) (EI  '("q" "\e(0_\e(B")) (AO  '("z" "\e(0`\e(B")) 
+          (AN  '("8" "\e(0b\e(B")) (EN  '("9" "\e(0c\e(B")) (ANG '("0" "\e(0d\e(B")) (ENG '("-" "\e(0e\e(B"))
+          (ER  '("^" "\e(0f\e(B")) (OU  '("y" "\e(0a\e(B"))
+          (I   '("e" "\e(0g\e(B")) (U   '("x" "\e(0h\e(B")) (V   '("u" "\e(0i\e(B")))
+
+       (mapcar (lambda (s) (its-defrule (car s) (nth 1 s)))
+              (list B P M F D T N L G K H J Q X))
+
+       (its-do-zhuyin-table
+       (((- B P M F D T N L G K H       ZH CH SH   Z C S ) A)
+        ((- B P M F       L                              ) O)
+        ((-     M   D T N L G K H       ZH CH SH R Z C S ) e)
+        ((- B P M   D T N L G K H       ZH CH SH   Z C S ) AI)
+        ((- B P M F D T N L G K H       ZH    SH   Z C   ) EI)
+        ((- B P M   D T N L G K H       ZH CH SH R Z C S ) AO)
+        ((- B P M F D T N L G K H       ZH CH SH R Z C S ) AN)
+        ((- B P M F D   N   G K H       ZH CH SH R Z C S ) EN)
+        ((- B P M F D T N L G K H       ZH CH SH R Z C S ) ANG)
+        ((- B P M F D T N L G K H       ZH CH SH R Z C S ) ENG)
+        ((-                                              ) ER)
+        ((-   P M F D T N L G K H       ZH CH SH R Z C S ) OU)
+        ((                              ZH CH SH R Z C S ) -)
+        ((- B P M   D T N L       J Q X                  ) I)
+        ((-         D     L       J Q X                  ) I A)
+        ((-                                              ) I O)
+        ((- B P M   D T N L       J Q X                  ) I E)
+        ((- B P M   D T N L       J Q X                  ) I AO)
+        ((-     M   D   N L       J Q X                  ) I OU)
+        ((- B P M   D T N L       J Q X                  ) I AN)
+        ((- B P M       N L       J Q X                  ) I EN)
+        ((-             N L       J Q X                  ) I ANG)
+        ((- B P M   D T N L       J Q X                  ) I ENG)
+        ((- B P M F D T N L G K H       ZH CH SH R Z C S ) U)
+        ((-                 G K H       ZH CH SH R       ) U A)
+        ((-         D T N L G K H       ZH CH SH R Z C S ) U O)
+        ((-                 G K H       ZH CH SH         ) U AI)
+        ((-         D T     G K H       ZH CH SH R Z C S ) U EI)
+        ((-         D T N L G K H       ZH CH SH R Z C S ) U AN)
+        ((-         D T   L G K H       ZH CH SH R Z C S ) U EN)
+        ((-                 G K H       ZH CH SH         ) U ANG)
+        ((-         D T N L G K H       ZH CH    R Z C S ) U ENG)
+        ((-             N L       J Q X                  ) V)
+        ((-             N L       J Q X                  ) V E)
+        ((-                       J Q X                  ) V AN)
+        ((-                       J Q X                  ) V EN)
+        ((-                       J Q X                  ) V ENG)
+
+        ((- H) M nil t)
+        ((- H) '("@" "@") nil t)
+        ((-  ) N nil t)))
+
+       (its-defrule (concat (car N) 2) (concat (nth 1 N) "\e(0B\e(B"))
+       (its-defrule (concat (car N) 3) (concat (nth 1 N) "\e(0C\e(B"))
+       (its-defrule (concat (car N) 4) (concat (nth 1 N) "\e(0D\e(B")))))
+
+(define-its-state-machine its-zhuyin-cn-map
+  "zhuyin-cn" "\e$AW"\e(BG" "Chinese-GB"
+  "Map for Zhuyin input. (Chinese-GB)"
+
+  (defconst its-quanjiao-escape "Z")
+  (defconst its-banjiao-escape  "X")
+
+  (its-defrule-select-mode-temporally "B" downcase)
+  (its-defrule-select-mode-temporally "Q" quanjiao-downcase-cn)
+
+  (its-define-zhuyin-table)
+  (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")
+                  ("4" . "\e$A#4\e(B")  ("5" . "\e$A#5\e(B")  ("6" . "\e$A#6\e(B")  ("7" . "\e$A#7\e(B")
+                  ("8" . "\e$A#8\e(B")  ("9" . "\e$A#9\e(B") 
+                  (" " . "\e$A!!\e(B")  ("!" . "\e$A#!\e(B")  ("@" . "\e$A#@\e(B")  ("#" . "\e$A##\e(B")
+                  ("$" . "\e$A!g\e(B")  ("%" . "\e$A#%\e(B")  ("^" . "\e$A#^\e(B")  ("&" . "\e$A#&\e(B")
+                  ("*" . "\e$A#*\e(B")  ("(" . "\e$A#(\e(B")  (")" . "\e$A#)\e(B")
+                  ("-" . "\e$A#-\e(B")  ("=" . "\e$A#=\e(B")  ("`" . "\e$A#`\e(B")  ("\\" . "\e$A#\\e(B")
+                  ("|" . "\e$A#|\e(B")  ("_" . "\e$A#_\e(B")  ("+" . "\e$A#+\e(B")  ("~" . "\e$A!+\e(B")
+                  ("[" . "\e$A#[\e(B")  ("]" . "\e$A#]\e(B")  ("{" . "\e$A#{\e(B")  ("}" . "\e$A#}\e(B")
+                  (":" . "\e$A#:\e(B")  (";" . "\e$A#;\e(B")  ("\"" . "\e$A#"\e(B") ("'" . "\e$A#'\e(B")
+                  ("<" . "\e$A#<\e(B")  (">" . "\e$A#>\e(B")  ("?" . "\e$A#?\e(B")  ("/" . "\e$A#/\e(B")
+                  ("," . "\e$A#,\e(B")  ("." . "\e$A#.\e(B")
+                  ("a" . "\e$A#a\e(B")  ("b" . "\e$A#b\e(B")  ("c" . "\e$A#c\e(B")  ("d" . "\e$A#d\e(B")
+                  ("e" . "\e$A#e\e(B")  ("f" . "\e$A#f\e(B")  ("g" . "\e$A#g\e(B")  ("h" . "\e$A#h\e(B")
+                  ("i" . "\e$A#i\e(B")  ("j" . "\e$A#j\e(B")  ("k" . "\e$A#k\e(B")  ("l" . "\e$A#l\e(B")
+                  ("m" . "\e$A#m\e(B")  ("n" . "\e$A#n\e(B")  ("o" . "\e$A#o\e(B")  ("p" . "\e$A#p\e(B")
+                  ("q" . "\e$A#q\e(B")  ("r" . "\e$A#r\e(B")  ("s" . "\e$A#s\e(B")  ("t" . "\e$A#t\e(B")
+                  ("u" . "\e$A#u\e(B")  ("v" . "\e$A#v\e(B")  ("w" . "\e$A#w\e(B")  ("x" . "\e$A#x\e(B")
+                  ("y" . "\e$A#y\e(B")  ("z" . "\e$A#z\e(B")
+                  ("A" . "\e$A#A\e(B")  ("B" . "\e$A#B\e(B")  ("C" . "\e$A#C\e(B")  ("D" . "\e$A#D\e(B")
+                  ("E" . "\e$A#E\e(B")  ("F" . "\e$A#F\e(B")  ("G" . "\e$A#G\e(B")  ("H" . "\e$A#H\e(B")
+                  ("I" . "\e$A#I\e(B")  ("J" . "\e$A#J\e(B")  ("K" . "\e$A#K\e(B")  ("L" . "\e$A#L\e(B")
+                  ("M" . "\e$A#M\e(B")  ("N" . "\e$A#N\e(B")  ("O" . "\e$A#O\e(B")  ("P" . "\e$A#P\e(B")
+                  ("Q" . "\e$A#Q\e(B")  ("R" . "\e$A#R\e(B")  ("S" . "\e$A#S\e(B")  ("T" . "\e$A#T\e(B")
+                  ("U" . "\e$A#U\e(B")  ("V" . "\e$A#V\e(B")  ("W" . "\e$A#W\e(B")  ("X" . "\e$A#X\e(B")
+                  ("Y" . "\e$A#Y\e(B")  ("Z" . "\e$A#Z\e(B")))
+    (let ((in (car ascii)) (out (cdr ascii)))
+      (its-defrule (concat its-banjiao-escape in) in)
+      (its-defrule (concat its-quanjiao-escape in) out)))
+
+    (its-defrule "<" "\e$A#,\e(B")
+    (its-defrule ">" "\e$A!#\e(B")
+    (its-defrule "?" "\e$A!"\e(B"))
+
+(define-its-state-machine its-zhuyin-tw-map
+  "zhuyin-tw" "\e$(GNC\e(BC" "Chinese-CNS"
+  "Map for Zhuyin input."
+
+  (defconst its-quanjiao-escape "Z")
+  (defconst its-banjiao-escape  "X")
+
+  (its-defrule-select-mode-temporally "B" downcase)
+  (its-defrule-select-mode-temporally "Q" quanjiao-downcase-tw)
+
+  (its-define-zhuyin-table)
+  (dolist (ascii '(("0" . "\e$(G$!\e(B")  ("1" . "\e$(G$"\e(B")  ("2" . "\e$(G$#\e(B")  ("3" . "\e$(G$$\e(B")
+                  ("4" . "\e$(G$%\e(B")  ("5" . "\e$(G$&\e(B")  ("6" . "\e$(G$'\e(B")  ("7" . "\e$(G$(\e(B")
+                  ("8" . "\e$(G$)\e(B")  ("9" . "\e$(G$*\e(B") 
+                  (" " . "\e$(G!!\e(B")  ("!" . "\e$(G!*\e(B")  ("@" . "\e$(G"i\e(B")  ("#" . "\e$(G!l\e(B")
+                  ("$" . "\e$(G"c\e(B")  ("%" . "\e$(G"h\e(B")  ("^" . "\e$(G!T\e(B")  ("&" . "\e$(G!m\e(B")
+                  ("*" . "\e$(G!n\e(B")  ("(" . "\e$(G!>\e(B")  (")" . "\e$(G!?\e(B")
+                  ("-" . "\e$(G"1\e(B")  ("=" . "\e$(G"8\e(B")  ("`" . "\e$(G!j\e(B")  ("\\" . "\e$(G"b\e(B")
+                  ("|" . "\e$(G"^\e(B")  ("_" . "\e$(G"%\e(B")  ("+" . "\e$(G"0\e(B")  ("~" . "\e$(G"D\e(B")
+                  ("[" . "\e$(G!b\e(B")  ("]" . "\e$(G!c\e(B")  ("{" . "\e$A#{\e(B")  ("}" . "\e$(G!a\e(B")
+                  (":" . "\e$(G!(\e(B")  (";" . "\e$(G!'\e(B")  ("\"" . "\e$(G!i\e(B") ("'" . "\e$(G!k\e(B")
+                  ("<" . "\e$(G"6\e(B")  (">" . "\e$(G"7\e(B")  ("?" . "\e$(G!)\e(B")  ("/" . "\e$(G"a\e(B")
+                  ("," . "\e$(G!"\e(B")  ("." . "\e$(G!%\e(B")
+                  ("a" . "\e$(G$[\e(B")  ("b" . "\e$(G$\\e(B")  ("c" . "\e$(G$]\e(B")  ("d" . "\e$(G$^\e(B")
+                  ("e" . "\e$(G$_\e(B")  ("f" . "\e$(G$`\e(B")  ("g" . "\e$(G$a\e(B")  ("h" . "\e$(G$b\e(B")
+                  ("i" . "\e$(G$c\e(B")  ("j" . "\e$(G$d\e(B")  ("k" . "\e$(G$e\e(B")  ("l" . "\e$(G$f\e(B")
+                  ("m" . "\e$(G$g\e(B")  ("n" . "\e$(G$h\e(B")  ("o" . "\e$(G$i\e(B")  ("p" . "\e$(G$j\e(B")
+                  ("q" . "\e$(G$k\e(B")  ("r" . "\e$(G$l\e(B")  ("s" . "\e$(G$m\e(B")  ("t" . "\e$(G$n\e(B")
+                  ("u" . "\e$(G$o\e(B")  ("v" . "\e$(G$p\e(B")  ("w" . "\e$(G$q\e(B")  ("x" . "\e$(G$r\e(B")
+                  ("y" . "\e$(G$s\e(B")  ("z" . "\e$(G$t\e(B")
+                  ("A" . "\e$(G$A\e(B")  ("B" . "\e$(G$B\e(B")  ("C" . "\e$(G$C\e(B")  ("D" . "\e$(G$D\e(B")
+                  ("E" . "\e$(G$E\e(B")  ("F" . "\e$(G$F\e(B")  ("G" . "\e$(G$G\e(B")  ("H" . "\e$(G$H\e(B")
+                  ("I" . "\e$(G$I\e(B")  ("J" . "\e$(G$J\e(B")  ("K" . "\e$(G$K\e(B")  ("L" . "\e$(G$L\e(B")
+                  ("M" . "\e$(G$M\e(B")  ("N" . "\e$(G$N\e(B")  ("O" . "\e$(G$O\e(B")  ("P" . "\e$(G$P\e(B")
+                  ("Q" . "\e$(G$Q\e(B")  ("R" . "\e$(G$R\e(B")  ("S" . "\e$(G$S\e(B")  ("T" . "\e$(G$T\e(B")
+                  ("U" . "\e$(G$U\e(B")  ("V" . "\e$(G$V\e(B")  ("W" . "\e$(G$W\e(B")  ("X" . "\e$(G$X\e(B")
+                  ("Y" . "\e$(G$Y\e(B")  ("Z" . "\e$(G$Z\e(B")))
+    (let ((in (car ascii)) (out (cdr ascii)))
+      (its-defrule (concat its-banjiao-escape in) in)
+      (its-defrule (concat its-quanjiao-escape in) out)))
+
+    (its-defrule "<" "\e$(G!"\e(B")
+    (its-defrule ">" "\e$(G!$\e(B")
+    (its-defrule "?" "\e$(G!#\e(B"))
+
+(define-its-state-machine-append its-zhuyin-cn-map
+  (its-defrule "[" its-zhuyin-cn-open-braket nil t)
+  (its-defrule "]" its-zhuyin-cn-close-braket nil t)
+
+(if its-zhuyin-cn-enable-quanjioao-alphabet
+      (progn
+       (its-defrule "#"  "\e$A##\e(B")  (its-defrule "$"  "\e$A!g\e(B")
+       (its-defrule "%"  "\e$A#%\e(B")
+       (its-defrule "&"  "\e$A#&\e(B")  (its-defrule "*"  "\e$A#*\e(B")
+       (its-defrule "("  "\e$A#(\e(B")  (its-defrule ")"  "\e$A#)\e(B")
+       (its-defrule "~"  "\e$A!+\e(B")
+       (its-defrule "="  "\e$A#=\e(B")  (its-defrule "`"  "\e$A#`\e(B")
+       (its-defrule "\\" "\e$A#\\e(B")  (its-defrule "|"  "\e$A#|\e(B")
+       (its-defrule "_"  "\e$A#_\e(B")  (its-defrule "+"  "\e$A#+\e(B")
+       (its-defrule "{"  "\e$A#{\e(B")  (its-defrule "}"  "\e$A#}\e(B")
+       (its-defrule "\"" "\e$A#"\e(B")  (its-defrule "'"  "\e$A#'\e(B"))
+    (progn
+      (its-defrule "#"  "#")  (its-defrule "$"  "$")
+      (its-defrule "%"  "%")
+      (its-defrule "&"  "&")  (its-defrule "*"  "*")
+      (its-defrule "("  "(")  (its-defrule ")"  ")")
+      (its-defrule "~"  "~")
+      (its-defrule "="  "=")  (its-defrule "`"  "`")
+      (its-defrule "\\" "\\") (its-defrule "|"  "|")
+      (its-defrule "_"  "_")  (its-defrule "+"  "+")
+      (its-defrule "{"  "{")  (its-defrule "}"  "}")
+      (its-defrule "\"" "\"") (its-defrule "'"  "'"))))
+
+(define-its-state-machine-append its-zhuyin-tw-map
+  (its-defrule "[" its-zhuyin-tw-open-braket nil t)
+  (its-defrule "]" its-zhuyin-tw-close-braket nil t)
+
+  (if its-zhuyin-tw-enable-quanjioao-alphabet
+      (progn
+       (its-defrule "#"  "\e$(G!l\e(B")  (its-defrule "$"  "\e$(G"c\e(B")
+       (its-defrule "%"  "\e$(G"h\e(B")
+       (its-defrule "&"  "\e$(G!m\e(B")  (its-defrule "*"  "\e$(G!n\e(B")
+       (its-defrule "("  "\e$(G!>\e(B")  (its-defrule ")"  "\e$(G!?\e(B")
+       (its-defrule "~"  "\e$(G"D\e(B")
+       (its-defrule "="  "\e$(G"8\e(B")  (its-defrule "`"  "\e$(G!j\e(B")
+       (its-defrule "\\" "\e$(G"b\e(B")  (its-defrule "|"  "\e$(G"^\e(B")
+       (its-defrule "_"  "\e$(G"%\e(B")  (its-defrule "+"  "\e$(G"0\e(B")
+       (its-defrule "{"  "\e$A#{\e(B")  (its-defrule "}"  "\e$(G!a\e(B")
+       (its-defrule "\"" "\e$(G!i\e(B")  (its-defrule "'"  "\e$(G!k\e(B"))
+    (progn
+      (its-defrule "#"  "#")  (its-defrule "$"  "$")
+      (its-defrule "%"  "%")
+      (its-defrule "&"  "&")  (its-defrule "*"  "*")
+      (its-defrule "("  "(")  (its-defrule ")"  ")")
+      (its-defrule "~"  "~")
+      (its-defrule "="  "=")  (its-defrule "`"  "`")
+      (its-defrule "\\" "\\") (its-defrule "|"  "|")
+      (its-defrule "_"  "_")  (its-defrule "+"  "+")
+      (its-defrule "{"  "{")  (its-defrule "}"  "}")
+      (its-defrule "\"" "\"") (its-defrule "'"  "'"))))
+
+(provide 'its/zhuyin)