--- /dev/null
+;;; 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)