Sync up with egg-980712.
[elisp/egg.git] / its / pinyin.el
index 887f7ca..c6ae5f6 100644 (file)
 (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-enable-quanjioao-alphabet
+  (if (boundp 'its-enable-fullwidth-alphabet)
+      its-enable-fullwidth-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
-  (defconst its-pinyin-term
-    (char-to-string (make-char 'chinese-sisheng ?@)))
-
-  (defsubst its-defoutput* (input display)
-    (its-set-output (its-goto-state input nil t) display))
-
-  (defun its-prev-terminal-state (input)
-    (let ((len (length input))
-         (state (its-get-start-state (symbol-value its-current-map)))
-         (i 0) (ret nil) kst ks)
-      (while (and (< i len)
-                 (setq state (its-get-next-state state (aref input i))))
-       (if (or (null (its-kst-p (setq kst (its-get-kst/t state))))
-               (mapcan (lambda (eob) (if (eq (its-eob-back eob) -1) (list t)))
-                       (cdr kst))
-               (and (setq ks (assq -1 (car kst)))
-                    (null (its-get-kst/t (cdr ks)))))
-           (setq ret state))
-       (setq i (1+ i)))
-      ret))
+  (defun its-prev-terminal-state (state-list)
+    (while (and state-list
+               (null (its-get-next-state (car state-list) -1)))
+      (setq state-list (cdr state-list)))
+    (car state-list))
 
   (defun its-define-qingsheng (shengmu yunmu &optional s y)
     (let ((input (concat shengmu yunmu))
-         (output (concat (if s s (capitalize shengmu))
-                         (if y y yunmu)
-                         its-pinyin-term))
-         state term kst i len c+b)
-      (setq state (its-goto-state input nil t))
-      (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))
-      (setq term (its-prev-terminal-state (substring input 0 -1)))
-      (if term
-         (progn
-           (setq len (length (its-get-keyseq term))
-                 i len
-                 output (car (rassoc '(nil . -1) (cdr (its-get-kst/t term)))))
-           (while (null
-                   (eq (setq term (its-get-next-state term (aref input i)))
-                       state))
-             (setq i (1+ i) kst (its-get-kst/t term))
-             (if (null (assq -1 (car kst)))
-                 (its-make-next-state term -1
-                                      (its-get-keyseq term) output (- len i)))
-             (setq c+b (its-make-class+back nil (1- (- len i))))
-             (if (null (rassoc c+b (cdr kst)))
-                 (its-define-otherwise term
-                                       (its-make-otherwise output c+b))))))
+         (output (concat (if s s (capitalize shengmu)) (if y y yunmu) "\e(0@\e(B"))
+         state term-state)
+      (setq state (its-defrule* input output))
+      (its-make-next-state state ?  output)
+      (its-make-next-state state ?0 output)
+      (setq term-state (its-prev-terminal-state its-parent-states))
+      (if term-state
+         (let ((back (- (length (its-get-keyseq term-state)) (length input)))
+               (output (its-get-output (its-get-next-state term-state -1)))
+               (parents its-parent-states))
+           (while (null (eq (car parents) term-state))
+             (its-make-next-state (car parents) -1 output (1+ back))
+             (its-defrule-otherwise (car parents) output nil back)
+             (setq back (1+ back)
+                   parents (cdr parents)))))
       state))
 
   (defmacro its-do-sisheng-table (list)
           (ss (list ,@shengmu)) s cs state i)
        (while ss
         (setq s (car ss)
+              ss (cdr ss)
               cs (capitalize s)
               state (its-define-qingsheng s y cs qing))
-        (setq i 1)
-        (while (<= i 4)
-          (its-make-next-state state (+ ?0 i)
-                               (concat s y i)
-                               (concat cs (nth i ,yunmu) its-pinyin-term))
-          (setq i (1+ i)))
-        (setq ss (cdr ss)))))
+        (its-make-next-state state ?1 (concat cs (nth 1 ,yunmu) "\e(0@\e(B"))
+        (its-make-next-state state ?2 (concat cs (nth 2 ,yunmu) "\e(0@\e(B"))
+        (its-make-next-state state ?3 (concat cs (nth 3 ,yunmu) "\e(0@\e(B"))
+        (its-make-next-state state ?4 (concat cs (nth 4 ,yunmu) "\e(0@\e(B")))))
 
   (defmacro its-define-pinyin-table ()
     '(let ((- "")  (B "b") (C "c") (D "d") (F "f") (G "g") (H "h")
           (UN   '("un"   "\e(01\e(Bn"   "\e(02\e(Bn"   "\e(03\e(Bn"   "\e(04\e(Bn"   "un"  ))
           (UO   '("uo"   "u\e(0-\e(B"   "u\e(0.\e(B"   "u\e(0/\e(B"   "u\e(00\e(B"   "uo"  )))
 
+       (its-define-qingsheng   "hm"    "")
+       (its-define-qingsheng   "hng"   "")
+       (its-defrule*           "m"     "m\e(0@\e(B")
+       (its-defrule            "m0"    "m\e(0@\e(B")
+       (its-defrule*           "n"     "n\e(0@\e(B")
+       (its-defrule            "n0"    "n\e(0@\e(B")
+       (its-defrule            "n2"    "\e(0=@\e(B")
+       (its-defrule            "n3"    "\e(0>@\e(B")
+       (its-defrule            "n4"    "\e(0?@\e(B")
+       (its-define-qingsheng   ""      "ng")
+
        (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)
         ((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"   "")
-       (its-define-qingsheng   ""      "ng")
-
-       (its-define-qingsheng   ""      "m")
-       (its-define-qingsheng   ""      "n")
-       (its-defrule    "n2"    "\e(0=@\e(B")
-       (its-defrule    "n3"    "\e(0>@\e(B")
-       (its-defrule    "n4"    "\e(0?@\e(B"))))
+        ((J Q X) (cons "ou"  (cdr IU  ))))))))
 
 (define-its-state-machine its-pinyin-cn-map
-  "pinyin-cn" "\e$AF4\e(BG" 'Chinese-GB
+  "pinyin-cn" "\e$AF4\e(BG" Chinese-GB
   "Map for Pinyin input. (Chinese-GB)"
 
   (defconst its-quanjiao-escape "Z")
   (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")
-  (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*      "sh "   "\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*      "zh "   "\e$AWE\e(B")
+  (its-defrule "b "    "\e$A2;\e(B")
+  (its-defrule "c "    "\e$A2E\e(B")
+  (its-defrule "ch "   "\e$A3v\e(B")
+  (its-defrule "d "    "\e$A5D\e(B")
+  (its-defrule "f "    "\e$A74\e(B")
+  (its-defrule "g "    "\e$A8v\e(B")
+  (its-defrule "h "    "\e$A:M\e(B")
+  (its-defrule "i "    "\e$AR;\e(B")
+  (its-defrule "j "    "\e$A>M\e(B")
+  (its-defrule "k "    "\e$A?I\e(B")
+  (its-defrule "l "    "\e$AAK\e(B")
+  (its-defrule "m "    "\e$AC?\e(B")
+  (its-defrule "n "    "\e$ADj\e(B")
+  (its-defrule "p "    "\e$AEz\e(B")
+  (its-defrule "q "    "\e$AH%\e(B")
+  (its-defrule "r "    "\e$AHU\e(B")
+  (its-defrule "s "    "\e$AJG\e(B")
+  (its-defrule "sh "   "\e$AIO\e(B")
+  (its-defrule "t "    "\e$AK{\e(B")
+  (its-defrule "w "    "\e$ANR\e(B")
+  (its-defrule "x "    "\e$AOr\e(B")
+  (its-defrule "y "    "\e$ASV\e(B")
+  (its-defrule "z "    "\e$ATZ\e(B")
+  (its-defrule "zh "   "\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")
   (its-defrule "!"     "\e$A#!\e(B"))
 
 (define-its-state-machine its-pinyin-tw-map
-  "pinyin-tw" "\e$(GQ;\e(BC" 'Chinese-CNS
+  "pinyin-tw" "\e$(GQ;\e(BC" Chinese-CNS
   "Map for Pinyin input."
 
   (defconst its-quanjiao-escape "Z")
   (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")
-  (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*      "sh "   "\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*      "zh "   "\e$(Gaa\e(B")
+  (its-defrule "b "    "\e$(GDb\e(B")
+  (its-defrule "c "    "\e$(GD_\e(B")
+  (its-defrule "ch "   "\e$(GEx\e(B")
+  (its-defrule "d "    "\e$(GN{\e(B")
+  (its-defrule "f "    "\e$(GE0\e(B")
+  (its-defrule "g "    "\e$(GT6\e(B")
+  (its-defrule "h "    "\e$(GLO\e(B")
+  (its-defrule "i "    "\e$(GD!\e(B")
+  (its-defrule "j "    "\e$(G^s\e(B")
+  (its-defrule "k "    "\e$(GF+\e(B")
+  (its-defrule "l "    "\e$(GD'\e(B")
+  (its-defrule "m "    "\e$(GJd\e(B")
+  (its-defrule "n "    "\e$(GH!\e(B")
+  (its-defrule "p "    "\e$(GJG\e(B")
+  (its-defrule "q "    "\e$(GF*\e(B")
+  (its-defrule "r "    "\e$(GEJ\e(B")
+  (its-defrule "s "    "\e$(GQR\e(B")
+  (its-defrule "sh "   "\e$(GD8\e(B")
+  (its-defrule "t "    "\e$(GEl\e(B")
+  (its-defrule "w "    "\e$(GJ<\e(B")
+  (its-defrule "x "    "\e$(GGW\e(B")
+  (its-defrule "y "    "\e$(GD4\e(B")
+  (its-defrule "z "    "\e$(GGc\e(B")
+  (its-defrule "zh "   "\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")
        (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$(G!B\e(B")  (its-defrule "}"  "\e$(G!C\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 "="  "\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!B\e(B")  (its-defrule "}"  "\e$(G!C\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