From: morioka Date: Sun, 30 Aug 1998 09:57:31 +0000 (+0000) Subject: egg-980315. X-Git-Tag: egg-980315~1 X-Git-Url: http://git.chise.org/gitweb/?a=commitdiff_plain;h=d0114d80c7a6a1a573bb3adc0fd4a3b25fa1e27e;p=elisp%2Fegg.git egg-980315. --- diff --git a/ChangeLog b/ChangeLog index aa2f6ca..e0b6d47 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,182 @@ +1998-03-15 NIIBE Yutaka + + * Makefile: Add dependencies for its-keydef.elc. + * egg/sj3rpc.el (sj3-open): Don't support list of hosts. + * its.el (its-exit-mode, its-kick-convert-region): Bug fix. Call + its-input-end and its-put-cursor. + (its-exit-mode-off-input-method): Removed. + +1998-03-14 KATAYAMA Yoshio + + * docomp.el (its-keydef): Undo the changes of 03-09. its.el + is fixed. + + * egg-cnv.el (egg-current-language): New valiable. + (egg-bunsetsu-info): Separate bunsetsu-info and lunguage. + (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 + egg-fini-other-languages): New valiable and functions for + handling unknown language. + (egg-set-current-backend): Set egg-conversion-backend-other-languages + when backend for specified language isn't found. + (egg-start-reverse-conversion): New function for reverse conversion. + (egg-set-conversion-backend-internal): Removed. + (egg-set-conversion-backend): Args are changed. + (egg-get-conversion-face): New function for different face for + every language. + (egg-convert-region): Make converting text read-only. Handle + unknown laguages and backend opening error. Rename its-lang to + egg-lang. + (egg-separate-languages): Argument use-context is added to + utilize context when called by its-yank. Rename its-lang to + egg-lang Improve speed. + (egg-charset-to-language): Renamed from egg-char-to-language. + (egg-next-part-lang egg-next-chinese-lang): Rename its-lang to + egg-lang. + (egg-conversion-map): Unbind C-\ and /. Bind C-X RET XXX to + its-select-XXX. + (egg-insert-bunsetsu): Make conversion text read-only. Separate + bunsetsu-info and conversion-backend. + (egg-insert-bunsetsu-list): Remove redundant variables. + (egg-beginning-of-conversion-buffer): New function. + (egg-end-of-conversion-buffer): New function. + (egg-enlarge-bunsetsu): Handle read-only text. + (egg-next-candidate): Handle read-only text. Bug on no candidate + bunsetsu is fiexed. + (egg-reconvert-bunsetsu-internal egg-reverse-convert-bunsetu + egg-reconvert-bunsetsu): New functions for reverse conversion and + re-conversion. + (egg-decide-before-point egg-abort-conversion): Handle read-only + text. Bug on pinyin and zhuyin mixed conversion is fixed. Allow + long fence. + (egg-select-candidate): Handle read-only text. Bug on no candidate + bunsetsu is fiexed. + + * egg-com.el: Change coding-system from internal to iso-2022-7bit. + + * egg-mlh.el (mlh-space-bar-backward-henkan): Disable temporally + mode selection. + + * egg.el (egg-mode): Set cureent lang to conversion backend. + (egg-set-mode-line-title): Renamed to its-set-mode-line-title + and moved to its.el. + (egg-check-language): Removed. + + * egg/sj3.el (sj3-server-port): Change from defconst to defver for + user customization. + (sj3-open sj3-get-environment): Try opening alternate servers. + (sj3-start-conversion): Make second argument LANGUAGE optional. + (egg-activate-sj3): Parameters of egg-set-conversion-backend is + changed. + + * egg/sj3rpc.el (sj3rpc-error-message): New constant (Not yet + completed). + (sj3rpc-get-error-message): Check range of errno to avoid + args-out-ou-range error. + + * egg/wnn.el (wnn-jport wnn-cport wnn-tport wnn-kport): New + variables for user customization. + (wnn-server-info-list wnn-server-port): Type of fourth element + is changed from integer to symbol. + (wnn-start-reverse-conversion): New function. + (wnn-open wnn-get-environment): Try opening alternate servers. + (egg-activate-wnn): Parameters of egg-set-conversion-backend is + changed. + + * its-keydef.el (its-current-language): Moved to its.el. + (its-make-select-func): Remove language check (egg-check-language). + Add temporally mode selection. + (its-do-list-make-select-func): Binding of zhuyin-tw is changed to + `C' because conflicting zenkaku-upcase. + + * its.el (its-current-select-func its-previous-select-func): New + variables for temporally mode selection. + (its-keydef requiring): Use eval-when to avoid error on using + compiled file. + (its-get-fence-face): New function for different face for + every language. + (its-put-cursor its-setup-fence-mode): Make fence read-only. + (its-start): Remove force-mode-line-update calling. + (its-restart): Add optional argument set-prop. + (its-self-insert-char its-backward-SYL its-forward-SYL + its-delete-SYL its-delete-backward-SYL its-exit-mode + its-delete-backward-SYL-by-keystroke its-transpose-chars + its-kick-convert-region its-end-of-input-buffer): Handle read-only + fence. + (its-state-machine): Accept special actions to handle temporally + mode selection. + (its-buffer-ins/del-SYL its-ins/del-SYL-batch): Handle read-only + fence. Property its-lang is renamed to egg-lang. + (its-get-next-state its-make-next-state): Add type check to avoid + wrong-type-argument error. + (its-keyseq-acceptable-p): Save informations of its-map to avoid + confusing on temporally mode selection. + (its-defrule-select-mode-temporally): New macro. + (its-kill-line its-cancel-input): New function. + (its-delete-backward-within-SYL): Bind its-current-language to + avoid confusing when undo is done beyond language change. + (its-yank its-yank-pop its-setup-yanked-portion): New functions. + (its-exit-mode-internal): Reset temporally selected mode. Allow + long fence. + (its-kick-convert-region-or-self-insert): New function. + (its-translate-region): Remove text properties completly. + (its-set-mode-line-title): Moved from egg.el and renamed. + (its-select-mode-temporally its-select-previous-mode): New functions + for temporally mode selection. + + * leim-list-egg.el: Secondary argument for egg-activate-sj3/wnn + is no longer needed. + + * its/hira.el: Remove the rule for "~" which destroies the rules + with its-hankaku-escape. + + * its/pinyin.el: Implement its-pinyin-cn-enable-quanjioao-alphabet + and its-pinyin-tw-enable-quanjioao-alphabet. + + * its/hangul.el: Implement its-hangul-enable-quanjioao-alphabet. + + * its/ascii.el: New file. + * its/erpin.el: New file. + * its/hankata.el: New file. + * its/jeonkak.el: New file. + * its/kata.el: New file. + * its/quanjiao.el: New file. + * its/zenkaku.el: New file. + * its/zhuyin.el: New file. + +1998-03-14 NIIBE Yutaka + + * egg/sj3rpc.el (sj3rpc-close): New function. + + * egg/sj3.el (sj3bunsetsu-[sg]et-kugiri-changed): Rename from + sj3bunsetsu-get-stdy-down. + (sj3-end-conversion): Implement CLSTDY. + (sj3-fini): Implemented. + +1998-03-10 NIIBE Yutaka + + * egg/sj3.el (sj3-end-conversion): Implement bunsetsu study. + CLSTDY not yet. + + * egg/sj3rpc.el (sj3rpc-get-bunsetsu-candidates-sub): Bug fix. + Always add hiragana and katakana candidates. + (sj3-const: CLSTDY, CLSTDY_EUC): Renamed from END and END_EUC + according to "sj3cmd.h" of SJ3 distribution. + (sj3rpc-bunsetsu-stdy, sj3rpc-kugiri-stdy): New functions. + + * egg-com.el (comm-format-u8-vector): New substitution. + (comm-format): New format 'v'. + 1998-03-09 NIIBE Yutaka * docomp.el (its-keydef): Require its-keydef when compile. diff --git a/Egg.prj b/Egg.prj new file mode 100644 index 0000000..11fa7a1 --- /dev/null +++ b/Egg.prj @@ -0,0 +1,163 @@ +;; -*- Lisp -*- +(Created-By-Prcs-Version 1 2 1) +(Project-Description "") +(Project-Version Egg 0 14) +(Parent-Version Egg 0 13) +(Version-Log "") +(New-Version-Log "") +(Checkin-Time "Sun, 15 Mar 1998 17:30:48 +0900") +(Checkin-Login gniibe) +(Populate-Ignore ("^.*/RCS/.*$" "^RCS/.*$" "^\\.elc$")) +(Project-Keywords) +(Files +;; Files added by populate at Wed, 18 Feb 1998 10:12:48 +0900: + (wnn/zy_table.c (Egg/0_zy_table.c 1.1 644)) + (wnn/zh_msg (Egg/1_zh_msg 1.1 644)) + (wnn/yincoding.c (Egg/2_yincoding. 1.1 644)) + (wnn/xutoj.c (Egg/3_xutoj.c 1.1 644)) + (wnn/wnnerror.h (Egg/4_wnnerror.h 1.1 644)) + (wnn/wnnerrmsg.c (Egg/5_wnnerrmsg. 1.1 644)) + (wnn/wnn_string.h (Egg/6_wnn_string 1.1 644)) + (wnn/wnn_os.h (Egg/7_wnn_os.h 1.1 644)) + (wnn/wnn_malloc.h (Egg/8_wnn_malloc 1.1 644)) + (wnn/structure (Egg/9_structure 1.1 644)) + (wnn/strings.c.orig (Egg/10_strings.c. 1.1 644)) + (wnn/strings.c (Egg/11_strings.c 1.1 644)) + (wnn/sstrings.c (Egg/12_sstrings.c 1.1 644)) + (wnn/server_env.c (Egg/13_server_env 1.1 644)) + (wnn/rk_spclval.h (Egg/14_rk_spclval 1.1 644)) + (wnn/revdic.c (Egg/15_revdic.c 1.1 644)) + (wnn/py_table.c (Egg/16_py_table.c 1.1 644)) + (wnn/pwd.c (Egg/17_pwd.c 1.1 644)) + (wnn/msg.h (Egg/18_msg.h 1.1 644)) + (wnn/msg.c.orig (Egg/19_msg.c.orig 1.1 644)) + (wnn/msg.c (Egg/20_msg.c 1.1 644)) + (wnn/kr_msg (Egg/21_kr_msg 1.1 644)) + (wnn/kankana.c (Egg/22_kankana.c 1.1 644)) + (wnn/jslib.h (Egg/23_jslib.h 1.1 644)) + (wnn/js.c.orig (Egg/24_js.c.orig 1.1 644)) + (wnn/js.c (Egg/25_js.c 1.1 644)) + (wnn/jp_msg (Egg/26_jp_msg 1.1 644)) + (wnn/jllib.h (Egg/27_jllib.h 1.1 644)) + (wnn/jlib.h (Egg/28_jlib.h 1.1 644)) + (wnn/jl.c (Egg/29_jl.c 1.1 644)) + (wnn/jh.h (Egg/30_jh.h 1.1 644)) + (wnn/jdata.h (Egg/31_jdata.h 1.1 644)) + (wnn/jd_sock.h (Egg/32_jd_sock.h 1.1 644)) + (wnn/hinsi_file.h (Egg/33_hinsi_file 1.1 644)) + (wnn/hinsi.h (Egg/34_hinsi.h 1.1 644)) + (wnn/hindo.c (Egg/35_hindo.c 1.1 644)) + (wnn/getopt.c (Egg/36_getopt.c 1.1 644)) + (wnn/gethinsi.c (Egg/37_gethinsi.c 1.1 644)) + (wnn/dic_atojis.c (Egg/38_dic_atojis 1.1 644)) + (wnn/demcom.h (Egg/39_demcom.h 1.1 644)) + (wnn/cplib.h (Egg/40_cplib.h 1.1 644)) + (wnn/copyright.h (Egg/41_copyright. 1.1 644)) + (wnn/config.h (Egg/42_config.h 1.1 644)) + (wnn/commonhd.h (Egg/43_commonhd.h 1.1 644)) + (wnn/bdic.c (Egg/44_bdic.c 1.1 644)) + (wnn/bcopy.c (Egg/45_bcopy.c 1.1 644)) + (obsolete/w-wnnfns/wnnfns.c (Egg/46_wnnfns.c 1.1 644)) + (obsolete/w-wnnfns/init-with-wnnfns.el (Egg/47_init-with- 1.1 644)) + (obsolete/w-wnnfns/Makefile (Egg/48_Makefile 1.1 644)) + (obsolete/its/zhuyin.el (Egg/49_zhuyin.el 1.1 644)) + (obsolete/its/zenkaku.el (Egg/50_zenkaku.el 1.1 644)) + (obsolete/its/pinyin.el (Egg/51_pinyin.el 1.1 644)) + (obsolete/its/kata.el (Egg/b/0_kata.el 1.1 644)) + (obsolete/its/kanainput.el (Egg/b/1_kanainput. 1.1 644)) + (obsolete/its/hira.el (Egg/b/2_hira.el 1.1 644)) + (obsolete/its/hankaku.el (Egg/b/3_hankaku.el 1.1 644)) + (obsolete/its/hangul.el (Egg/b/4_hangul.el 1.1 644)) + (obsolete/its/han-kata.el (Egg/b/5_han-kata.e 1.1 644)) + (obsolete/wnnfns.h (Egg/b/6_wnnfns.h 1.1 644)) + (obsolete/wnn6fns.c (Egg/b/7_wnn6fns.c 1.1 644)) + (obsolete/wnn6.el (Egg/b/8_wnn6.el 1.1 644)) + (obsolete/wnn-egg.el (Egg/b/9_wnn-egg.el 1.1 644)) + (obsolete/wnn-egg-msg.el (Egg/b/10_wnn-egg-ms 1.1 644)) + (obsolete/wnn-egg-misc.el (Egg/b/11_wnn-egg-mi 1.1 644)) + (obsolete/wnn-egg-dict.el (Egg/b/12_wnn-egg-di 1.1 644)) + (obsolete/modeline.el (Egg/b/13_modeline.e 1.1 644)) + (obsolete/mlh-nihongo.el (Egg/b/14_mlh-nihong 1.1 644)) + (obsolete/init.el (Egg/b/15_init.el 1.1 644)) + (obsolete/eggrc-wnn6 (Egg/b/16_eggrc-wnn6 1.1 644)) + (obsolete/eggrc-wnn (Egg/b/17_eggrc-wnn 1.1 644)) + (obsolete/egg.el (Egg/b/18_egg.el 1.1 644)) + (obsolete/egg-misc.el (Egg/b/19_egg-misc.e 1.1 644)) + (obsolete/egg-jsymbol.el (Egg/b/20_egg-jsymbo 1.1 644)) + (obsolete/egg-henkan.el (Egg/b/21_egg-henkan 1.1 644)) + (obsolete/egg-fence.el (Egg/b/22_egg-fence. 1.1 644)) + (obsolete/MEMO (Egg/b/23_MEMO 1.1 644)) + (obsolete/HISTORY (Egg/b/24_HISTORY 1.1 644)) + (obsolete/ChangeLog (Egg/b/25_ChangeLog 1.1 644)) + (its/zhuyin.el (Egg/b/26_zhuyin.el 1.2 644)) + (its/pinyin.el (Egg/b/27_pinyin.el 1.3 644)) + (its/kana.el (Egg/b/28_kana.el 1.1 644)) + (its/hira.el (Egg/b/29_hira.el 1.3 644)) + (its/hangul.el (Egg/b/30_hangul.el 1.3 644)) + (its/erpin.el (Egg/b/31_erpin.el 1.2 644)) + (incoming/utils.el (Egg/b/32_utils.el 1.1 644)) + (incoming/tamago-cnv.el.diff (Egg/b/33_tamago-cnv 1.1 644)) + (incoming/jis-input.el (Egg/b/34_jis-input. 1.1 644)) + (incoming/its-util.el (Egg/b/35_its-util.e 1.1 644)) + (incoming/its-hangul-test.el (Egg/b/36_its-hangul 1.1 644)) + (incoming/its-hangul-2.el (Egg/b/37_its-hangul 1.1 644)) + (incoming/hangul-structure.el (Egg/b/38_hangul-str 1.1 644)) + (incoming/emacs-bug (Egg/b/39_emacs-bug 1.1 644)) + (incoming/ccl (Egg/b/40_ccl 1.1 644)) + (incoming/bushu.el (Egg/b/41_bushu.el 1.1 644)) + (egg/wnnrpc.el (Egg/b/42_wnnrpc.el 1.2 644)) + (egg/wnn.el (Egg/b/43_wnn.el 1.4 644)) + (egg/sj3rpc.el (Egg/b/44_sj3rpc.el 1.4 644)) + (egg/sj3.el (Egg/b/45_sj3.el 1.5 644)) + (menudiag.el (Egg/b/46_menudiag.e 1.2 644)) + (leim-list-egg.el (Egg/b/47_leim-list- 1.5 644)) + (its.el (Egg/b/48_its.el 1.9 644)) +; (euc-china.el (Egg/b/49_euc-cn.el 1.2 644)) + (egg.el (Egg/b/50_egg.el 1.5 644)) + (egg-mlh.el (Egg/b/51_egg-mlh.el 1.5 644)) + (egg-com.el (Egg/c/0_egg-com.el 1.5 644)) + (egg-cnv.el (Egg/c/1_egg-cnv.el 1.6 644)) + (docomp.el (Egg/c/2_docomp.el 1.3 644)) + (TODO (Egg/c/3_TODO 1.1 644)) + (README (Egg/c/4_README 1.1 644)) + (PROBLEMS (Egg/c/5_PROBLEMS 1.1 644)) + (Makefile (Egg/c/6_Makefile 1.6 644)) + (ChangeLog (Egg/c/7_ChangeLog 1.13 644)) + (AUTHORS (Egg/c/8_AUTHORS 1.2 644)) +; (obsolete/its/RCS () :directory) +; (obsolete/RCS/wnnfns.h,v ()) +; (obsolete/RCS/wnnfns.c,v ()) +; (obsolete/RCS/wnn6fns.c,v ()) +; (obsolete/RCS/wnn-egg.el,v ()) +; (obsolete/RCS/wnn-egg-msg.el,v ()) +; (obsolete/RCS/wnn-egg-misc.el,v ()) +; (obsolete/RCS/wnn-egg-dict.el,v ()) +; (obsolete/RCS/modeline.el,v ()) +; (obsolete/RCS/eggrc-wnn,v ()) +; (obsolete/RCS/eggrc-sj3,v ()) +; (obsolete/RCS/egg-misc.el,v ()) +; (obsolete/RCS/egg-keymap.el,v ()) +; (obsolete/RCS/egg-jsymbol.el,v ()) +; (obsolete/RCS/egg-henkan.el,v ()) +; (obsolete/RCS/egg-fence.el,v ()) +; (obsolete/RCS/diced.el,v ()) +; (RCS/utils.el,v ()) +; (RCS/mlh.el,v ()) +; (RCS/menu.el,v ()) +; (RCS/jis-input.el,v ()) +; (RCS/its.el,v ()) +; (RCS/egg.el,v ()) +; (RCS/busyu.el,v ()) + (its-keydef.el (Egg/c/9_its-keydef 1.5 644)) + (incoming/kawabata (Egg/c/10_kawabata 1.1 644)) +;; Files added by populate at Sun, 15 Mar 1998 15:40:35 +0900: + (egg-hilit.el (Egg/c/11_egg-hilit. 1.1 644)) + (its/zenkaku.el (Egg/c/12_zenkaku.el 1.1 644)) + (its/quanjiao.el (Egg/c/13_quanjiao.e 1.1 644)) + (its/kata.el (Egg/c/14_kata.el 1.1 644)) + (its/jeonkak.el (Egg/c/15_jeonkak.el 1.1 644)) + (its/hankata.el (Egg/c/16_hankata.el 1.1 644)) + (its/ascii.el (Egg/c/17_ascii.el 1.1 644)) +) +(Merge-Parents) +(New-Merge-Parents) diff --git a/Makefile b/Makefile index 3215a4b..3f655f1 100644 --- a/Makefile +++ b/Makefile @@ -17,12 +17,21 @@ EMACS = emacs .SUFFIXES: .el .elc -ETCS = Makefile leim-list-egg.el AUTHORS ChangeLog README TODO docomp.el +ETCS = Makefile leim-list-egg.el AUTHORS ChangeLog README TODO docomp.el \ + Egg.prj PROBLEMS SRCS = menudiag.el its.el egg.el \ + its/ascii.el \ + its/erpin.el \ + its/hankata.el \ its/hira.el \ + its/jeonkak.el \ its/pinyin.el \ its/hangul.el \ + its/kata.el \ + its/quanjiao.el \ + its/zenkaku.el \ + its/zhuyin.el \ its-keydef.el \ egg-mlh.el egg-cnv.el egg-com.el \ egg/sj3.el egg/sj3rpc.el \ @@ -67,9 +76,15 @@ install: all dotemacs leim-list.el install-dirs for x in ${SRCS} ${ELCS}; do $(INSTALL) -m 644 $$x ${SITEDIR}/`dirname $$x`; done $(INSTALL) -m 644 leim-list.el ${SITEDIR} +# DEPENDENCIES egg/sj3rpc.elc: egg-com.elc egg/sj3.elc egg/wnnrpc.elc: egg-com.elc egg/wnn.elc +egg.elc its/ascii.elc its/erpin.elc its/hankata.elc \ + its/hira.elc its/jeonkak.elc its/pinyin.elc \ + its/hangul.elc its/kata.elc its/quanjiao.elc \ + its/zenkaku.elc its/zhuyin.elc: its-keydef.elc + distclean: rm -f ${ELCS} leim-list.el *~ diff --git a/PROBLEMS b/PROBLEMS new file mode 100644 index 0000000..fc620bb --- /dev/null +++ b/PROBLEMS @@ -0,0 +1,6 @@ +* describe-bindings + +* C-k (egg-decide-before-point) + +* HIRAGANA & KATAKANA candidates + diff --git a/docomp.el b/docomp.el index fa3c211..49058f2 100644 --- a/docomp.el +++ b/docomp.el @@ -10,4 +10,3 @@ ) (require 'cl) -(require 'its-keydef) diff --git a/egg-cnv.el b/egg-cnv.el index 267213b..b85cd04 100644 --- a/egg-cnv.el +++ b/egg-cnv.el @@ -31,16 +31,68 @@ ;;; 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) @@ -49,10 +101,10 @@ (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) @@ -79,6 +131,11 @@ (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)) @@ -86,97 +143,136 @@ (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))))) -(defvar egg-conversion-open "|") -(defvar egg-conversion-close "|") +(defvar egg-conversion-open "|" "*$B%U%'%s%9$N;OE@$r<($9J8;zNs(B (1 $BJ8;z0J>e(B)") +(defvar egg-conversion-close "|" "*$B%U%'%s%9$N=*E@$r<($9J8;zNs(B (1 $BJ8;z0J>e(B)") +(defvar egg-conversion-face nil "*$B%U%'%s%9I=<($KMQ$$$k(B face $B$^$?$O(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 @@ -188,20 +284,19 @@ (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 @@ -212,8 +307,8 @@ (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))) @@ -227,7 +322,8 @@ egg-default-language) (t "Chinese-GB")))) -(defvar egg-conversion-face nil) +(require 'its-keydef) + (defvar egg-conversion-map (let ((map (make-sparse-keymap)) (i 33)) @@ -249,13 +345,14 @@ (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.") @@ -266,26 +363,46 @@ (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) @@ -331,7 +448,8 @@ (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)) @@ -370,7 +488,8 @@ (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)) @@ -383,17 +502,19 @@ (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)))) @@ -401,50 +522,83 @@ (interactive "p") (egg-next-candidate (- n))) +(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) @@ -453,13 +607,20 @@ (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) @@ -469,20 +630,27 @@ (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 "$B8uJd(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 "$B8uJd(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 "$B8uJd(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. diff --git a/egg-com.el b/egg-com.el index a15ba79..a45871f 100644 --- a/egg-com.el +++ b/egg-com.el @@ -149,45 +149,45 @@ ("X" . 20) ("Y" . 21) ("Z" . 22) ("Zh" . 23))) (defconst yincode-pinyin-yunmu - '(("š À" 0 0) ("š À" 0 1) ("š À" 0 3) ("š À" 0 5) ("š À" 0 7) - ("aš À" 1 0) ("š ¡š À" 1 1) ("š ¢š À" 1 3) ("š £š À" 1 5) ("š ¤š À" 1 7) - ("aiš À" 2 0) ("š ¡iš À" 2 1) ("š ¢iš À" 2 3) ("š £iš À" 2 5) ("š ¤iš À" 2 7) - ("anš À" 3 0) ("š ¡nš À" 3 1) ("š ¢nš À" 3 3) ("š £nš À" 3 5) ("š ¤nš À" 3 7) - ("angš À" 4 0) ("š ¡ngš À" 4 1) ("š ¢ngš À" 4 3) ("š £ngš À" 4 5) ("š ¤ngš À" 4 7) - ("aoš À" 5 0) ("š ¡oš À" 5 1) ("š ¢oš À" 5 3) ("š £oš À" 5 5) ("š ¤oš À" 5 7) - ("eš À" 6 0) ("š ¥š À" 6 1) ("š ¦š À" 6 3) ("š §š À" 6 5) ("š ¨š À" 6 7) - ("eiš À" 7 0) ("š ¥iš À" 7 1) ("š ¦iš À" 7 3) ("š §iš À" 7 5) ("š ¨iš À" 7 7) - ("enš À" 8 0) ("š ¥nš À" 8 1) ("š ¦nš À" 8 3) ("š §nš À" 8 5) ("š ¨nš À" 8 7) - ("engš À" 9 0) ("š ¥ngš À" 9 1) ("š ¦ngš À" 9 3) ("š §ngš À" 9 5) ("š ¨ngš À" 9 7) - ("erš À" 10 0) ("š ¥rš À" 10 1) ("š ¦rš À" 10 3) ("š §rš À" 10 5) ("š ¨rš À" 10 7) - ("iš À" 11 0) ("š ©š À" 11 1) ("š ªš À" 11 3) ("š «š À" 11 5) ("š ¬š À" 11 7) - ("iaš À" 12 0) ("iš ¡š À" 12 1) ("iš ¢š À" 12 3) ("iš £š À" 12 5) ("iš ¤š À" 12 7) - ("ianš À" 13 0) ("iš ¡nš À" 13 1) ("iš ¢nš À" 13 3) ("iš £nš À" 13 5) ("iš ¤nš À" 13 7) - ("iangš À" 14 0) ("iš ¡ngš À" 14 1) ("iš ¢ngš À" 14 3) ("iš £ngš À" 14 5) ("iš ¤ngš À" 14 7) - ("iaoš À" 15 0) ("iš ¡oš À" 15 1) ("iš ¢oš À" 15 3) ("iš £oš À" 15 5) ("iš ¤oš À" 15 7) - ("ieš À" 16 0) ("iš ¥š À" 16 1) ("iš ¦š À" 16 3) ("iš §š À" 16 5) ("iš ¨š À" 16 7) - ("inš À" 17 0) ("š ©nš À" 17 1) ("š ªnš À" 17 3) ("š «nš À" 17 5) ("š ¬nš À" 17 7) - ("ingš À" 18 0) ("š ©ngš À" 18 1) ("š ªngš À" 18 3) ("š «ngš À" 18 5) ("š ¬ngš À" 18 7) - ("iongš À" 19 0) ("iš ­ngš À" 19 1) ("iš ®ngš À" 19 3) ("iš ¯ngš À" 19 5) ("iš °ngš À" 19 7) - ("iuš À" 20 0) ("iš ±š À" 20 1) ("iš ²š À" 20 3) ("iš ³š À" 20 5) ("iš ´š À" 20 7) - ("mš À" 21 0) ("mš À" 21 1) ("mš À" 21 3) ("mš À" 21 5) ("mš À" 21 7) - ("nš À" 22 0) ("nš À" 22 1) ("š ½š À" 22 3) ("š ¾š À" 22 5) ("š ¿š À" 22 7) - ("ngš À" 23 0) ("ngš À" 23 1) ("ngš À" 23 3) ("ngš À" 23 5) ("ngš À" 23 7) - ("oš À" 24 0) ("š ­š À" 24 1) ("š ®š À" 24 3) ("š ¯š À" 24 5) ("š °š À" 24 7) - ("ongš À" 25 0) ("š ­ngš À" 25 1) ("š ®ngš À" 25 3) ("š ¯ngš À" 25 5) ("š °ngš À" 25 7) - ("ouš À" 26 0) ("š ­uš À" 26 1) ("š ®uš À" 26 3) ("š ¯uš À" 26 5) ("š °uš À" 26 7) - ("uš À" 27 0) ("š ±š À" 27 1) ("š ²š À" 27 3) ("š ³š À" 27 5) ("š ´š À" 27 7) - ("uaš À" 28 0) ("uš ¡š À" 28 1) ("uš ¢š À" 28 3) ("uš £š À" 28 5) ("uš ¤š À" 28 7) - ("uaiš À" 29 0) ("uš ¡iš À" 29 1) ("uš ¢iš À" 29 3) ("uš £iš À" 29 5) ("uš ¤iš À" 29 7) - ("uanš À" 30 0) ("uš ¡nš À" 30 1) ("uš ¢nš À" 30 3) ("uš £nš À" 30 5) ("uš ¤nš À" 30 7) - ("uangš À" 31 0) ("uš ¡ngš À" 31 1) ("uš ¢ngš À" 31 3) ("uš £ngš À" 31 5) ("uš ¤ngš À" 31 7) - ("ueš À" 32 0) ("uš ¥š À" 32 1) ("uš ¦š À" 32 3) ("uš §š À" 32 5) ("uš ¨š À" 32 7) - ("uiš À" 33 0) ("uš ©š À" 33 1) ("uš ªš À" 33 3) ("uš «š À" 33 5) ("uš ¬š À" 33 7) - ("unš À" 34 0) ("š ±nš À" 34 1) ("š ²nš À" 34 3) ("š ³nš À" 34 5) ("š ´nš À" 34 7) - ("uoš À" 35 0) ("uš ­š À" 35 1) ("uš ®š À" 35 3) ("uš ¯š À" 35 5) ("uš °š À" 35 7) - ("š ¹š À" 36 0) ("š µš À" 36 1) ("š ¶š À" 36 3) ("š ·š À" 36 5) ("š ¸š À" 36 7) - ("š ¹eš À" 37 0) ("š ¹š ¥š À" 37 1) ("š ¹š ¦š À" 37 3) ("š ¹š §š À" 37 5) ("š ¹š ¨š À" 37 7) - ("0š À" 38 0) ("1š À" 38 1) ("2š À" 38 3) ("3š À" 38 5) ("4š À" 38 7))) + '(("(0@(B" 0 0) ("(0@(B" 0 1) ("(0@(B" 0 3) ("(0@(B" 0 5) ("(0@(B" 0 7) + ("a(0@(B" 1 0) ("(0!@(B" 1 1) ("(0"@(B" 1 3) ("(0#@(B" 1 5) ("(0$@(B" 1 7) + ("ai(0@(B" 2 0) ("(0!(Bi(0@(B" 2 1) ("(0"(Bi(0@(B" 2 3) ("(0#(Bi(0@(B" 2 5) ("(0$(Bi(0@(B" 2 7) + ("an(0@(B" 3 0) ("(0!(Bn(0@(B" 3 1) ("(0"(Bn(0@(B" 3 3) ("(0#(Bn(0@(B" 3 5) ("(0$(Bn(0@(B" 3 7) + ("ang(0@(B" 4 0) ("(0!(Bng(0@(B" 4 1) ("(0"(Bng(0@(B" 4 3) ("(0#(Bng(0@(B" 4 5) ("(0$(Bng(0@(B" 4 7) + ("ao(0@(B" 5 0) ("(0!(Bo(0@(B" 5 1) ("(0"(Bo(0@(B" 5 3) ("(0#(Bo(0@(B" 5 5) ("(0$(Bo(0@(B" 5 7) + ("e(0@(B" 6 0) ("(0%@(B" 6 1) ("(0&@(B" 6 3) ("(0'@(B" 6 5) ("(0(@(B" 6 7) + ("ei(0@(B" 7 0) ("(0%(Bi(0@(B" 7 1) ("(0&(Bi(0@(B" 7 3) ("(0'(Bi(0@(B" 7 5) ("(0((Bi(0@(B" 7 7) + ("en(0@(B" 8 0) ("(0%(Bn(0@(B" 8 1) ("(0&(Bn(0@(B" 8 3) ("(0'(Bn(0@(B" 8 5) ("(0((Bn(0@(B" 8 7) + ("eng(0@(B" 9 0) ("(0%(Bng(0@(B" 9 1) ("(0&(Bng(0@(B" 9 3) ("(0'(Bng(0@(B" 9 5) ("(0((Bng(0@(B" 9 7) + ("er(0@(B" 10 0) ("(0%(Br(0@(B" 10 1) ("(0&(Br(0@(B" 10 3) ("(0'(Br(0@(B" 10 5) ("(0((Br(0@(B" 10 7) + ("i(0@(B" 11 0) ("(0)@(B" 11 1) ("(0*@(B" 11 3) ("(0+@(B" 11 5) ("(0,@(B" 11 7) + ("ia(0@(B" 12 0) ("i(0!@(B" 12 1) ("i(0"@(B" 12 3) ("i(0#@(B" 12 5) ("i(0$@(B" 12 7) + ("ian(0@(B" 13 0) ("i(0!(Bn(0@(B" 13 1) ("i(0"(Bn(0@(B" 13 3) ("i(0#(Bn(0@(B" 13 5) ("i(0$(Bn(0@(B" 13 7) + ("iang(0@(B" 14 0) ("i(0!(Bng(0@(B" 14 1) ("i(0"(Bng(0@(B" 14 3) ("i(0#(Bng(0@(B" 14 5) ("i(0$(Bng(0@(B" 14 7) + ("iao(0@(B" 15 0) ("i(0!(Bo(0@(B" 15 1) ("i(0"(Bo(0@(B" 15 3) ("i(0#(Bo(0@(B" 15 5) ("i(0$(Bo(0@(B" 15 7) + ("ie(0@(B" 16 0) ("i(0%@(B" 16 1) ("i(0&@(B" 16 3) ("i(0'@(B" 16 5) ("i(0(@(B" 16 7) + ("in(0@(B" 17 0) ("(0)(Bn(0@(B" 17 1) ("(0*(Bn(0@(B" 17 3) ("(0+(Bn(0@(B" 17 5) ("(0,(Bn(0@(B" 17 7) + ("ing(0@(B" 18 0) ("(0)(Bng(0@(B" 18 1) ("(0*(Bng(0@(B" 18 3) ("(0+(Bng(0@(B" 18 5) ("(0,(Bng(0@(B" 18 7) + ("iong(0@(B" 19 0) ("i(0-(Bng(0@(B" 19 1) ("i(0.(Bng(0@(B" 19 3) ("i(0/(Bng(0@(B" 19 5) ("i(00(Bng(0@(B" 19 7) + ("iu(0@(B" 20 0) ("i(01@(B" 20 1) ("i(02@(B" 20 3) ("i(03@(B" 20 5) ("i(04@(B" 20 7) + ("m(0@(B" 21 0) ("m(0@(B" 21 1) ("m(0@(B" 21 3) ("m(0@(B" 21 5) ("m(0@(B" 21 7) + ("n(0@(B" 22 0) ("n(0@(B" 22 1) ("(0=@(B" 22 3) ("(0>@(B" 22 5) ("(0?@(B" 22 7) + ("ng(0@(B" 23 0) ("ng(0@(B" 23 1) ("ng(0@(B" 23 3) ("ng(0@(B" 23 5) ("ng(0@(B" 23 7) + ("o(0@(B" 24 0) ("(0-@(B" 24 1) ("(0.@(B" 24 3) ("(0/@(B" 24 5) ("(00@(B" 24 7) + ("ong(0@(B" 25 0) ("(0-(Bng(0@(B" 25 1) ("(0.(Bng(0@(B" 25 3) ("(0/(Bng(0@(B" 25 5) ("(00(Bng(0@(B" 25 7) + ("ou(0@(B" 26 0) ("(0-(Bu(0@(B" 26 1) ("(0.(Bu(0@(B" 26 3) ("(0/(Bu(0@(B" 26 5) ("(00(Bu(0@(B" 26 7) + ("u(0@(B" 27 0) ("(01@(B" 27 1) ("(02@(B" 27 3) ("(03@(B" 27 5) ("(04@(B" 27 7) + ("ua(0@(B" 28 0) ("u(0!@(B" 28 1) ("u(0"@(B" 28 3) ("u(0#@(B" 28 5) ("u(0$@(B" 28 7) + ("uai(0@(B" 29 0) ("u(0!(Bi(0@(B" 29 1) ("u(0"(Bi(0@(B" 29 3) ("u(0#(Bi(0@(B" 29 5) ("u(0$(Bi(0@(B" 29 7) + ("uan(0@(B" 30 0) ("u(0!(Bn(0@(B" 30 1) ("u(0"(Bn(0@(B" 30 3) ("u(0#(Bn(0@(B" 30 5) ("u(0$(Bn(0@(B" 30 7) + ("uang(0@(B" 31 0) ("u(0!(Bng(0@(B" 31 1) ("u(0"(Bng(0@(B" 31 3) ("u(0#(Bng(0@(B" 31 5) ("u(0$(Bng(0@(B" 31 7) + ("ue(0@(B" 32 0) ("u(0%@(B" 32 1) ("u(0&@(B" 32 3) ("u(0'@(B" 32 5) ("u(0(@(B" 32 7) + ("ui(0@(B" 33 0) ("u(0)@(B" 33 1) ("u(0*@(B" 33 3) ("u(0+@(B" 33 5) ("u(0,@(B" 33 7) + ("un(0@(B" 34 0) ("(01(Bn(0@(B" 34 1) ("(02(Bn(0@(B" 34 3) ("(03(Bn(0@(B" 34 5) ("(04(Bn(0@(B" 34 7) + ("uo(0@(B" 35 0) ("u(0-@(B" 35 1) ("u(0.@(B" 35 3) ("u(0/@(B" 35 5) ("u(00@(B" 35 7) + ("(09@(B" 36 0) ("(05@(B" 36 1) ("(06@(B" 36 3) ("(07@(B" 36 5) ("(08@(B" 36 7) + ("(09(Be(0@(B" 37 0) ("(09%@(B" 37 1) ("(09&@(B" 37 3) ("(09'@(B" 37 5) ("(09(@(B" 37 7) + ("0(0@(B" 38 0) ("1(0@(B" 38 1) ("2(0@(B" 38 3) ("3(0@(B" 38 5) ("4(0@(B" 38 7))) (defconst yincode-pinyin-table [ @@ -218,54 +218,54 @@ ]) (defconst yincode-zhuyin-shengmu - '(("" . 0) ("š Å" . 1) ("š Ø" . 2) ("š Ô" . 3) ("š É" . 4) - ("š È" . 5) ("š Í" . 6) ("š Ï" . 7) ("š Ð" . 8) ("š Î" . 9) - ("š Ì" . 10) ("š Ç" . 11) ("š Ë" . 12) ("š Æ" . 13) ("š Ñ" . 14) - ("š Ö" . 15) ("š Ù" . 16) ("š Õ" . 17) ("š Ê" . 18) ("š è" . 19) - ("š Ò" . 20) ("š ç" . 21) ("š ×" . 22) ("š Ó" . 23))) + '(("" . 0) ("(0E(B" . 1) ("(0X(B" . 2) ("(0T(B" . 3) ("(0I(B" . 4) + ("(0H(B" . 5) ("(0M(B" . 6) ("(0O(B" . 7) ("(0P(B" . 8) ("(0N(B" . 9) + ("(0L(B" . 10) ("(0G(B" . 11) ("(0K(B" . 12) ("(0F(B" . 13) ("(0Q(B" . 14) + ("(0V(B" . 15) ("(0Y(B" . 16) ("(0U(B" . 17) ("(0J(B" . 18) ("(0h(B" . 19) + ("(0R(B" . 20) ("(0g(B" . 21) ("(0W(B" . 22) ("(0S(B" . 23))) (defconst yincode-zhuyin-yunmu - '(("š À" 0 0) ("š Á" 0 1) ("š Â" 0 3) ("š Ã" 0 5) ("š Ä" 0 7) ; i - ("š Úš À" 1 0) ("š Úš Á" 1 1) ("š Úš Â" 1 3) ("š Úš Ã" 1 5) ("š Úš Ä" 1 7) ; a - ("š Þš À" 2 0) ("š Þš Á" 2 1) ("š Þš Â" 2 3) ("š Þš Ã" 2 5) ("š Þš Ä" 2 7) ; ai - ("š âš À" 3 0) ("š âš Á" 3 1) ("š âš Â" 3 3) ("š âš Ã" 3 5) ("š âš Ä" 3 7) ; an - ("š äš À" 4 0) ("š äš Á" 4 1) ("š äš Â" 4 3) ("š äš Ã" 4 5) ("š äš Ä" 4 7) ; ang - ("š àš À" 5 0) ("š àš Á" 5 1) ("š àš Â" 5 3) ("š àš Ã" 5 5) ("š àš Ä" 5 7) ; ao - ("š Üš À" 6 0) ("š Üš Á" 6 1) ("š Üš Â" 6 3) ("š Üš Ã" 6 5) ("š Üš Ä" 6 7) ; e - ("š ßš À" 7 0) ("š ßš Á" 7 1) ("š ßš Â" 7 3) ("š ßš Ã" 7 5) ("š ßš Ä" 7 7) ; ei - ("š ãš À" 8 0) ("š ãš Á" 8 1) ("š ãš Â" 8 3) ("š ãš Ã" 8 5) ("š ãš Ä" 8 7) ; en - ("š åš À" 9 0) ("š åš Á" 9 1) ("š åš Â" 9 3) ("š åš Ã" 9 5) ("š åš Ä" 9 7) ; eng - ("š æš À" 10 0) ("š æš Á" 10 1) ("š æš Â" 10 3) ("š æš Ã" 10 5) ("š æš Ä" 10 7) ; er - ("š çš À" 11 0) ("š çš Á" 11 1) ("š çš Â" 11 3) ("š çš Ã" 11 5) ("š çš Ä" 11 7) ; i - ("š çš Úš À" 12 0) ("š çš Úš Á" 12 1) ("š çš Úš Â" 12 3) ("š çš Úš Ã" 12 5) ("š çš Úš Ä" 12 7) ; ia - ("š çš âš À" 13 0) ("š çš âš Á" 13 1) ("š çš âš Â" 13 3) ("š çš âš Ã" 13 5) ("š çš âš Ä" 13 7) ; ian - ("š çš äš À" 14 0) ("š çš äš Á" 14 1) ("š çš äš Â" 14 3) ("š çš äš Ã" 14 5) ("š çš äš Ä" 14 7) ; iang - ("š çš àš À" 15 0) ("š çš àš Á" 15 1) ("š çš àš Â" 15 3) ("š çš àš Ã" 15 5) ("š çš àš Ä" 15 7) ; iao - ("š çš Ýš À" 16 0) ("š çš Ýš Á" 16 1) ("š çš Ýš Â" 16 3) ("š çš Ýš Ã" 16 5) ("š çš Ýš Ä" 16 7) ; ie - ("š çš ãš À" 17 0) ("š çš ãš Á" 17 1) ("š çš ãš Â" 17 3) ("š çš ãš Ã" 17 5) ("š çš ãš Ä" 17 7) ; in - ("š çš åš À" 18 0) ("š çš åš Á" 18 1) ("š çš åš Â" 18 3) ("š çš åš Ã" 18 5) ("š çš åš Ä" 18 7) ; ing - ("š éš åš À" 19 0) ("š éš åš Á" 19 1) ("š éš åš Â" 19 3) ("š éš åš Ã" 19 5) ("š éš åš Ä" 19 7) ; iong - ("š çš áš À" 20 0) ("š çš áš Á" 20 1) ("š çš áš Â" 20 3) ("š çš áš Ã" 20 5) ("š çš áš Ä" 20 7) ; iu - ("š Çš À" 21 0) ("š Çš Á" 21 1) ("š Çš Â" 21 3) ("š Çš Ã" 21 5) ("š Çš Ä" 21 7) ; m - ("š Ëš À" 22 0) ("š Ëš Á" 22 1) ("š Ëš Â" 22 3) ("š Ëš Ã" 22 5) ("š Ëš Ä" 22 7) ; n - ("@š À" 23 0) ("@š Á" 23 1) ("@š Â" 23 3) ("@š Ã" 23 5) ("@š Ä" 23 7) ; ng - ("š Ûš À" 24 0) ("š Ûš Á" 24 1) ("š Ûš Â" 24 3) ("š Ûš Ã" 24 5) ("š Ûš Ä" 24 7) ; o - ("š èš åš À" 25 0) ("š èš åš Á" 25 1) ("š èš åš Â" 25 3) ("š èš åš Ã" 25 5) ("š èš åš Ä" 25 7) ; ong - ("š áš À" 26 0) ("š áš Á" 26 1) ("š áš Â" 26 3) ("š áš Ã" 26 5) ("š áš Ä" 26 7) ; ou - ("š èš À" 27 0) ("š èš Á" 27 1) ("š èš Â" 27 3) ("š èš Ã" 27 5) ("š èš Ä" 27 7) ; u - ("š èš Úš À" 28 0) ("š èš Úš Á" 28 1) ("š èš Úš Â" 28 3) ("š èš Úš Ã" 28 5) ("š èš Úš Ä" 28 7) ; ua - ("š èš Þš À" 29 0) ("š èš Þš Á" 29 1) ("š èš Þš Â" 29 3) ("š èš Þš Ã" 29 5) ("š èš Þš Ä" 29 7) ; uai - ("š èš âš À" 30 0) ("š èš âš Á" 30 1) ("š èš âš Â" 30 3) ("š èš âš Ã" 30 5) ("š èš âš Ä" 30 7) ; uan - ("š èš äš À" 31 0) ("š èš äš Á" 31 1) ("š èš äš Â" 31 3) ("š èš äš Ã" 31 5) ("š èš äš Ä" 31 7) ; uang - ("š éš Ýš À" 37 0) ("š éš Ýš Á" 37 1) ("š éš Ýš Â" 37 3) ("š éš Ýš Ã" 37 5) ("š éš Ýš Ä" 37 7) ; ue - ("š èš ßš À" 33 0) ("š èš ßš Á" 33 1) ("š èš ßš Â" 33 3) ("š èš ßš Ã" 33 5) ("š èš ßš Ä" 33 7) ; ui - ("š èš ãš À" 34 0) ("š èš ãš Á" 34 1) ("š èš ãš Â" 34 3) ("š èš ãš Ã" 34 5) ("š èš ãš Ä" 34 7) ; un - ("š èš Ûš À" 35 0) ("š èš Ûš Á" 35 1) ("š èš Ûš Â" 35 3) ("š èš Ûš Ã" 35 5) ("š èš Ûš Ä" 35 7) ; uo - ("š éš À" 36 0) ("š éš Á" 36 1) ("š éš Â" 36 3) ("š éš Ã" 36 5) ("š éš Ä" 36 7) ; š ¹ - ("š éš Ýš À" 37 0) ("š éš Ýš Á" 37 1) ("š éš Ýš Â" 37 3) ("š éš Ýš Ã" 37 5) ("š éš Ýš Ä" 37 7) ; š ¹e - ("0š À" 38 0) ("1š Á" 38 1) ("2š Â" 38 3) ("3š Ã" 38 5) ("4š Ä" 38 7) ; undefined - ("š éš âš À" 39 0) ("š éš âš Á" 39 1) ("š éš âš Â" 39 3) ("š éš âš Ã" 39 5) ("š éš âš Ä" 39 7) ; š ¹an - ("š éš ãš À" 40 0) ("š éš ãš Á" 40 1) ("š éš ãš Â" 40 3) ("š éš ãš Ã" 40 5) ("š éš ãš Ä" 40 7) ; š ¹n + '(("(0@(B" 0 0) ("(0A(B" 0 1) ("(0B(B" 0 3) ("(0C(B" 0 5) ("(0D(B" 0 7) ; i + ("(0Z@(B" 1 0) ("(0ZA(B" 1 1) ("(0ZB(B" 1 3) ("(0ZC(B" 1 5) ("(0ZD(B" 1 7) ; a + ("(0^@(B" 2 0) ("(0^A(B" 2 1) ("(0^B(B" 2 3) ("(0^C(B" 2 5) ("(0^D(B" 2 7) ; ai + ("(0b@(B" 3 0) ("(0bA(B" 3 1) ("(0bB(B" 3 3) ("(0bC(B" 3 5) ("(0bD(B" 3 7) ; an + ("(0d@(B" 4 0) ("(0dA(B" 4 1) ("(0dB(B" 4 3) ("(0dC(B" 4 5) ("(0dD(B" 4 7) ; ang + ("(0`@(B" 5 0) ("(0`A(B" 5 1) ("(0`B(B" 5 3) ("(0`C(B" 5 5) ("(0`D(B" 5 7) ; ao + ("(0\@(B" 6 0) ("(0\A(B" 6 1) ("(0\B(B" 6 3) ("(0\C(B" 6 5) ("(0\D(B" 6 7) ; e + ("(0_@(B" 7 0) ("(0_A(B" 7 1) ("(0_B(B" 7 3) ("(0_C(B" 7 5) ("(0_D(B" 7 7) ; ei + ("(0c@(B" 8 0) ("(0cA(B" 8 1) ("(0cB(B" 8 3) ("(0cC(B" 8 5) ("(0cD(B" 8 7) ; en + ("(0e@(B" 9 0) ("(0eA(B" 9 1) ("(0eB(B" 9 3) ("(0eC(B" 9 5) ("(0eD(B" 9 7) ; eng + ("(0f@(B" 10 0) ("(0fA(B" 10 1) ("(0fB(B" 10 3) ("(0fC(B" 10 5) ("(0fD(B" 10 7) ; er + ("(0g@(B" 11 0) ("(0gA(B" 11 1) ("(0gB(B" 11 3) ("(0gC(B" 11 5) ("(0gD(B" 11 7) ; i + ("(0gZ@(B" 12 0) ("(0gZA(B" 12 1) ("(0gZB(B" 12 3) ("(0gZC(B" 12 5) ("(0gZD(B" 12 7) ; ia + ("(0gb@(B" 13 0) ("(0gbA(B" 13 1) ("(0gbB(B" 13 3) ("(0gbC(B" 13 5) ("(0gbD(B" 13 7) ; ian + ("(0gd@(B" 14 0) ("(0gdA(B" 14 1) ("(0gdB(B" 14 3) ("(0gdC(B" 14 5) ("(0gdD(B" 14 7) ; iang + ("(0g`@(B" 15 0) ("(0g`A(B" 15 1) ("(0g`B(B" 15 3) ("(0g`C(B" 15 5) ("(0g`D(B" 15 7) ; iao + ("(0g]@(B" 16 0) ("(0g]A(B" 16 1) ("(0g]B(B" 16 3) ("(0g]C(B" 16 5) ("(0g]D(B" 16 7) ; ie + ("(0gc@(B" 17 0) ("(0gcA(B" 17 1) ("(0gcB(B" 17 3) ("(0gcC(B" 17 5) ("(0gcD(B" 17 7) ; in + ("(0ge@(B" 18 0) ("(0geA(B" 18 1) ("(0geB(B" 18 3) ("(0geC(B" 18 5) ("(0geD(B" 18 7) ; ing + ("(0ie@(B" 19 0) ("(0ieA(B" 19 1) ("(0ieB(B" 19 3) ("(0ieC(B" 19 5) ("(0ieD(B" 19 7) ; iong + ("(0ga@(B" 20 0) ("(0gaA(B" 20 1) ("(0gaB(B" 20 3) ("(0gaC(B" 20 5) ("(0gaD(B" 20 7) ; iu + ("(0G@(B" 21 0) ("(0GA(B" 21 1) ("(0GB(B" 21 3) ("(0GC(B" 21 5) ("(0GD(B" 21 7) ; m + ("(0K@(B" 22 0) ("(0KA(B" 22 1) ("(0KB(B" 22 3) ("(0KC(B" 22 5) ("(0KD(B" 22 7) ; n + ("@(0@(B" 23 0) ("@(0A(B" 23 1) ("@(0B(B" 23 3) ("@(0C(B" 23 5) ("@(0D(B" 23 7) ; ng + ("(0[@(B" 24 0) ("(0[A(B" 24 1) ("(0[B(B" 24 3) ("(0[C(B" 24 5) ("(0[D(B" 24 7) ; o + ("(0he@(B" 25 0) ("(0heA(B" 25 1) ("(0heB(B" 25 3) ("(0heC(B" 25 5) ("(0heD(B" 25 7) ; ong + ("(0a@(B" 26 0) ("(0aA(B" 26 1) ("(0aB(B" 26 3) ("(0aC(B" 26 5) ("(0aD(B" 26 7) ; ou + ("(0h@(B" 27 0) ("(0hA(B" 27 1) ("(0hB(B" 27 3) ("(0hC(B" 27 5) ("(0hD(B" 27 7) ; u + ("(0hZ@(B" 28 0) ("(0hZA(B" 28 1) ("(0hZB(B" 28 3) ("(0hZC(B" 28 5) ("(0hZD(B" 28 7) ; ua + ("(0h^@(B" 29 0) ("(0h^A(B" 29 1) ("(0h^B(B" 29 3) ("(0h^C(B" 29 5) ("(0h^D(B" 29 7) ; uai + ("(0hb@(B" 30 0) ("(0hbA(B" 30 1) ("(0hbB(B" 30 3) ("(0hbC(B" 30 5) ("(0hbD(B" 30 7) ; uan + ("(0hd@(B" 31 0) ("(0hdA(B" 31 1) ("(0hdB(B" 31 3) ("(0hdC(B" 31 5) ("(0hdD(B" 31 7) ; uang + ("(0i]@(B" 37 0) ("(0i]A(B" 37 1) ("(0i]B(B" 37 3) ("(0i]C(B" 37 5) ("(0i]D(B" 37 7) ; ue + ("(0h_@(B" 33 0) ("(0h_A(B" 33 1) ("(0h_B(B" 33 3) ("(0h_C(B" 33 5) ("(0h_D(B" 33 7) ; ui + ("(0hc@(B" 34 0) ("(0hcA(B" 34 1) ("(0hcB(B" 34 3) ("(0hcC(B" 34 5) ("(0hcD(B" 34 7) ; un + ("(0h[@(B" 35 0) ("(0h[A(B" 35 1) ("(0h[B(B" 35 3) ("(0h[C(B" 35 5) ("(0h[D(B" 35 7) ; uo + ("(0i@(B" 36 0) ("(0iA(B" 36 1) ("(0iB(B" 36 3) ("(0iC(B" 36 5) ("(0iD(B" 36 7) ; (09(B + ("(0i]@(B" 37 0) ("(0i]A(B" 37 1) ("(0i]B(B" 37 3) ("(0i]C(B" 37 5) ("(0i]D(B" 37 7) ; (09(Be + ("0(0@(B" 38 0) ("1(0A(B" 38 1) ("2(0B(B" 38 3) ("3(0C(B" 38 5) ("4(0D(B" 38 7) ; undefined + ("(0ib@(B" 39 0) ("(0ibA(B" 39 1) ("(0ibB(B" 39 3) ("(0ibC(B" 39 5) ("(0ibD(B" 39 7) ; (09(Ban + ("(0ic@(B" 40 0) ("(0icA(B" 40 1) ("(0icB(B" 40 3) ("(0icC(B" 40 5) ("(0icD(B" 40 7) ; (09(Bn )) (defconst yincode-zhuyin-table @@ -429,7 +429,7 @@ (defun egg-pinyin-syllable (str) (let (s y end) - (if (string-match "^[A-Za-zš ¡-š ¿]+š À" str) + (if (string-match "^[A-Za-z(0!(B-(0?(B]+(0@(B" str) (progn (setq end (match-end 0)) (cond @@ -445,7 +445,7 @@ (defun egg-zhuyin-syllable (str) (let (end s y c z (zhuyin-len (charset-bytes 'chinese-sisheng))) - (if (string-match "^[š Å-š é@0-4]+[š Àš Áš Âš Ãš Ä]" str) + (if (string-match "^[(0E(B-(0i(B@0-4]+[(0@ABCD(B]" str) (progn (setq end (match-end 0) c (substring str 0 zhuyin-len) @@ -465,7 +465,7 @@ (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š ¡ngš À") (length "š Óš èš äš Á")))) + (let (s syl c cset (maxlen (max (length "Zhu(0!(Bng(0@(B") (length "(0ShdA(B")))) (save-excursion (save-restriction (narrow-to-region beg end) @@ -649,6 +649,9 @@ Return the length of resulting text." (insert s) (insert-char 0 1)) +(defsubst comm-format-u8-vector (s) + (insert (concat s))) + (defsubst comm-format-bytes (s) (insert s) (insert-char 255 1)) @@ -661,7 +664,8 @@ w means unsigned 16-bit in big endian. b means unsigned 8-bit. S means 16-bit(big endian) wide-character string (0x0000 terminated). E means multibyte string (0x00 terminated). -s means 8-bit string (0x00 terminated)." +s means 8-bit string (0x00 terminated). +v means 8-bit vector." (let ((p args) result arg f) (while format (setq arg (car p)) @@ -672,6 +676,7 @@ s means 8-bit string (0x00 terminated)." (cond ((eq f 'U) (list 'comm-format-u32c arg)) ((eq f 'u) (list 'comm-format-u32 arg)) ((eq f 'i) (list 'comm-format-i32 arg)) + ((eq f 'v) (list 'comm-format-u8-vector arg)) ((eq f 'w) (list 'comm-format-u16 arg)) ((eq f 'b) (list 'comm-format-u8 arg)) ((eq f 'S) (list 'comm-format-u16-string arg)) diff --git a/egg-mlh.el b/egg-mlh.el index 9331575..a520acf 100644 --- a/egg-mlh.el +++ b/egg-mlh.el @@ -39,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 --- 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 @@ -65,15 +66,7 @@ (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." diff --git a/egg/sj3.el b/egg/sj3.el index 6f059a7..bfa5222 100644 --- a/egg/sj3.el +++ b/egg/sj3.el @@ -1,14 +1,14 @@ ;;; egg/sj3.el --- SJ3 Support (high level interface) in Egg ;;; Input Method Architecture -;; Copyright (C) 1997 Mule Project, Powered by Electrotechnical -;; Laboratory, JAPAN. +;; Copyright (C) 1997, 1998 Mule Project, +;; Powered by Electrotechnical Laboratory, JAPAN. ;; Project Leader: Satoru Tomura ;; Author: NIIBE Yutaka ;; Maintainer: NIIBE Yutaka -;; This file will be part of GNU Emacs (in future). +;; This file will be part of EGG. ;; EGG is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by @@ -31,6 +31,11 @@ (defconst sj3-support-languages '("Japanese")) +(eval-when-compile + (defmacro SJ3-const (c) + (cond ((eq c 'FileNotExist) 35) + ))) + (defconst sj3-conversion-backend [ sj3-init @@ -44,15 +49,18 @@ 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") +(defvar sj3-open-message) + (defun sj3-open (hostname) "Establish the connection to SJ3 server. Return process object." (let* ((buf (generate-new-buffer " *SJ3*")) @@ -84,6 +92,59 @@ (setq sj3-stdy-size result) proc)) +;; (defun sj3-open (hostname-list) +;; "Establish the connection to SJ3 server. Return process object." +;; (let* ((buf (generate-new-buffer " *SJ3*")) +;; (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)) +;; (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"))))) + ;; ::= [ ] (defvar sj3-environment nil "Environment for SJ3 kana-kanji conversion") @@ -95,7 +156,7 @@ ;; ::= ;; [ -;; ] +;; ] (defsubst sj3-make-bunsetsu (env source converted rest stdy) (vector env source converted rest stdy nil nil nil)) @@ -117,9 +178,9 @@ (aref b 6)) (defsubst sj3bunsetsu-set-zenkouho-pos (b p) (aset b 6 p)) -(defsubst sj3bunsetsu-get-stdydown (b) +(defsubst sj3bunsetsu-get-kugiri-changed (b) (aref b 7)) -(defsubst sj3bunsetsu-set-stdydown (b s) +(defsubst sj3bunsetsu-set-kugiri-changed (b s) (aset b 7 s)) (defun sj3-get-bunsetsu-source (b) @@ -145,38 +206,90 @@ (t p))) (defun sj3-get-environment () + "Return the backend of SJ3 environment." (if sj3-environment sj3-environment (let* ((proc (sj3-open sj3-hostname)) - (stdy (sj3-filename (car sj3-dictionary-specification))) + (freq-info-name (sj3-filename (car sj3-dictionary-specification))) (l (cdr sj3-dictionary-specification)) dict-list) - (if (/= (sj3rpc-open-stdy proc stdy) 0) - (error "Dame1") ; XXX - (while l - (let ((dic (car l)) - dic-id) - (setq dic-id - (sj3rpc-open-dictionary proc (sj3-filename (aref dic 0)) - (aref dic 1))) - (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))))) + (sj3-open-freq-info proc freq-info-name) + (while l + (let ((dic (car l)) + dic-id) + (setq dic-id + (sj3-open-dictionary proc (sj3-filename (aref dic 0)) + (aref dic 1))) + (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))))) + +(defun sj3-open-freq-info (proc name) + (let ((trying t) + ret) + (while trying + (setq ret (sj3rpc-open-stdy proc name)) + (if (= ret 0) + (setq trying nil) + (message "’³Ø’½¬’¥Õ’¥¡’¥¤’¥ë(%s)’¤¬’¤¢’¤ê’¤Þ’¤»’¤ó" name) + (if (/= ret (SJ3-const FileNotExist)) + (error "Fatal1") ; XXX + (if (and (y-or-n-p + (format "’³Ø’½¬’¥Õ’¥¡’¥¤’¥ë(%s)’¤¬’¤¢’¤ê’¤Þ’¤»’¤ó’¡£’ºî’¤ê’¤Þ’¤¹’¤«? " + name)) + (sj3rpc-make-directory proc + (file-name-directory name)) + ;; ignore error + (= (sj3rpc-make-stdy proc name) 0)) + (message "’³Ø’½¬’¥Õ’¥¡’¥¤’¥ë(%s)’¤ò’ºî’¤ê’¤Þ’¤·’¤¿" name) + (error "Fatal2"))))))) ; XXX + +(defun sj3-open-dictionary (proc name passwd) + (let ((trying t) + ret) + (while trying + (setq ret (sj3rpc-open-dictionary proc name passwd)) + (if (>= ret 0) + (setq trying nil) + (message "’¼­’½ñ’¥Õ’¥¡’¥¤’¥ë(%s)’¤¬’¤¢’¤ê’¤Þ’¤»’¤ó" name) + (setq ret (- ret)) ; Get error code. + (if (/= ret (SJ3-const FileNotExist)) + (error "Fatal3 %d" ret) ; XXX + (if (and (y-or-n-p + (format "’¼­’½ñ’¥Õ’¥¡’¥¤’¥ë(%s)’¤¬’¤¢’¤ê’¤Þ’¤»’¤ó’¡£’ºî’¤ê’¤Þ’¤¹’¤«? " + name)) + (= (sj3rpc-make-dictionary proc name) 0)) + (message "’¼­’½ñ’¥Õ’¥¡’¥¤’¥ë(%s)’¤ò’ºî’¤ê’¤Þ’¤·’¤¿" name) + (error "Fatal4"))))) ; XXX + ret)) (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))) (sj3rpc-begin env yomi))) -;; XXX: not implemented yet (defun sj3-end-conversion (bunsetsu-list) - ) + (let ((env (sj3bunsetsu-get-env (car bunsetsu-list))) + (l bunsetsu-list) + bunsetsu stdy kugiri-changed) + (while l + (setq bunsetsu (car l)) + (setq l (cdr l)) + (setq stdy (sj3bunsetsu-get-stdy bunsetsu)) + (if stdy + (sj3rpc-bunsetsu-stdy env stdy)) + (if (setq kugiri-changed (sj3bunsetsu-get-kugiri-changed bunsetsu)) + (let ((yomi1 (sj3bunsetsu-get-source bunsetsu)) + (yomi2 (sj3bunsetsu-get-source (car l)))) + (if (/= kugiri-changed (length yomi1)) + (sj3rpc-kugiri-stdy env yomi1 yomi2 + (sj3bunsetsu-get-stdy (car l))))))))) (defun sj3-list-candidates (bunsetsu prev-bunsetsu) (let* ((env (sj3bunsetsu-get-env bunsetsu)) @@ -226,12 +339,10 @@ Return the list of bunsetsu." yomi2 (substring yomi len)) (setq bunsetsu1 (sj3rpc-tanbunsetsu-conversion env yomi1)) - ;; Only set once. - (sj3bunsetsu-set-stdydown bunsetsu1 - (or (sj3bunsetsu-get-stdydown b1) - (if b2 - (list b1 b2) - (list b1)))) + ;; Only set once (memory original length of the bunsetsu). + (sj3bunsetsu-set-kugiri-changed bunsetsu1 + (or (sj3bunsetsu-get-kugiri-changed b1) + (length (sj3bunsetsu-get-source b1)))) (if (< 0 (length yomi2)) (setq bunsetsu2 (sj3rpc-tanbunsetsu-conversion env yomi2)) (setq bunsetsu2 nil)) @@ -239,9 +350,17 @@ Return the list of bunsetsu." (list bunsetsu1 bunsetsu2) (list bunsetsu1)))) -;; XXX: Not implemented yet (defun sj3-fini (lang) - ) + (let ((proc (sj3env-get-proc sj3-environment)) + (dict-list (sj3env-get-dictionary-list sj3-environment)) + dict) + (while dict-list + (setq dict (car dict-list)) + (setq dict-list (cdr dict-list)) + (sj3rpc-close-dictionary proc dict)) ; XXX: check error + (sj3rpc-close-stdy proc) + (sj3rpc-close proc)) + (setq sj3-environment nil)) ;;; setup @@ -253,8 +372,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. diff --git a/egg/sj3rpc.el b/egg/sj3rpc.el index c92dbb7..9520e53 100644 --- a/egg/sj3rpc.el +++ b/egg/sj3rpc.el @@ -1,14 +1,14 @@ -;;; egg/sj3.el --- SJ3 Support (low level interface) in Egg -;;; Input Method Architecture +;;; egg/sj3rpc.el --- SJ3 Support (low level interface) in Egg +;;; Input Method Architecture -;; Copyright (C) 1997 Mule Project, Powered by Electrotechnical -;; Laboratory, JAPAN. +;; Copyright (C) 1997, 1998 Mule Project, +;; Powered by Electrotechnical Laboratory, JAPAN. ;; Project Leader: Satoru Tomura ;; Author: NIIBE Yutaka ;; Maintainer: NIIBE Yutaka -;; This file will be part of GNU Emacs (in future). +;; This file will be part of EGG. ;; EGG is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by @@ -53,8 +53,8 @@ ((eq c 'KOUHOSU) 55) ((eq c 'KOUHOSU_EUC) 116) ((eq c 'STDY) 61) - ((eq c 'END) 62) - ((eq c 'END_EUC) 117) + ((eq c 'CLSTDY) 62) + ((eq c 'CLSTDY_EUC) 117) ((eq c 'WREG) 71) ((eq c 'WREG_EUC) 118) ((eq c 'WDEL) 72) @@ -70,8 +70,14 @@ ((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 @@ -100,6 +106,12 @@ 0 result))) +(defun sj3rpc-close (proc) + (comm-call-with-proc proc (result) + (comm-format (u) (sj3-const CLOSE)) + (comm-unpack (u) result) + result)) + (defun sj3rpc-get-stdy-size (proc) "Return STDYSIZE of SJ3 server. On failure, return error code." (comm-call-with-proc proc (result) @@ -167,8 +179,9 @@ 2048 ; Index length 2048 ; Length 256 ; Number + ) (comm-unpack (u) result) - result))) + result)) (defun sj3rpc-open-stdy (proc stdy-name) (comm-call-with-proc proc (result) @@ -184,10 +197,17 @@ (defun sj3rpc-make-stdy (proc stdy-name) (comm-call-with-proc proc (result) - (comm-format (u) (sj3-const MKSTDY) stdy-name "") + (comm-format (u s u u u) (sj3-const MKSTDY) stdy-name 2048 ; Number 1 ; Step 2048 ; Length + ) + (comm-unpack (u) result) + result)) + +(defun sj3rpc-make-directory (proc name) + (comm-call-with-proc proc (result) + (comm-format (u s) (sj3-const MKDIR) name) (comm-unpack (u) result) result)) @@ -210,6 +230,11 @@ (setq bl (setcdr bl (cons bunsetsu nil))) (setq bunsetsu-list (setq bl (cons bunsetsu nil)))) (setq i (1+ i))) + (setq bunsetsu (sj3-make-bunsetsu env yomi yomi nil nil)) + (setq bl (setcdr bl (cons bunsetsu nil))) + (setq bunsetsu + (sj3-make-bunsetsu env yomi (japanese-katakana yomi) nil nil)) + (setq bl (setcdr bl (cons bunsetsu nil))) bunsetsu-list)))) (defun sj3rpc-get-bunsetsu-candidates (env yomi) @@ -241,4 +266,22 @@ (substring yomi-ext cylen) 'euc-japan)) (setq bunsetsu (sj3-make-bunsetsu env yomi converted rest stdy)))))) +(defun sj3rpc-bunsetsu-stdy (env stdy) + (sj3rpc-call-with-environment env (result) + (comm-format (u v) (sj3-const STDY) stdy) + (comm-unpack (u) result) + (if (/= result 0) + (- result) + 0))) + +(defun sj3rpc-kugiri-stdy (env yomi1 yomi2 stdy) + (let* ((yomi1-ext (encode-coding-string yomi1 'euc-japan)) + (yomi2-ext (encode-coding-string yomi2 'euc-japan))) + (sj3rpc-call-with-environment env (result) + (comm-format (u s s v) (sj3-const CLSTDY_EUC) yomi1-ext yomi2-ext stdy) + (comm-unpack (u) result) + (if (/= result 0) + (- result) + 0)))) + ;;; egg/sj3rpc.el ends here. diff --git a/egg/wnn.el b/egg/wnn.el index a07977e..22822b3 100644 --- a/egg/wnn.el +++ b/egg/wnn.el @@ -60,6 +60,7 @@ wnn-decide-candidate wnn-change-bunsetsu-length wnn-end-conversion + wnn-start-reverse-conversion wnn-fini ]) @@ -153,18 +154,23 @@ (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) @@ -180,7 +186,7 @@ (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)) diff --git a/its-keydef.el b/its-keydef.el index e85ee3f..9372491 100644 --- a/its-keydef.el +++ b/its-keydef.el @@ -1,39 +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) (eval-when (eval compile) -(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))) -) + (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) @@ -49,25 +50,25 @@ ,@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 071ace8..89c5bd2 100644 --- a/its.el +++ b/its.el @@ -32,8 +32,21 @@ (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) ;; Data structure in ITS ;; (1) SYL and CURSOR @@ -174,16 +187,19 @@ ;; ;; -(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) @@ -191,17 +207,19 @@ (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) @@ -214,18 +232,25 @@ map) "Keymap for ITS mode.") -(defvar its-fence-open "|" "*$B%U%'%s%9$N;OE@$r<($9J8;zNs(B (1 $BJ8;z(B)") -(defvar its-fence-close "|" "*$B%U%'%s%9$N=*E@$r<($9J8;zNs(B (1 $BJ8;z(B)") -(defvar its-fence-face nil "*$B%U%'%s%9I=<($KMQ$$$k(B face $B$^$?$O(B nil") +(defvar its-fence-open "|" "*$B%U%'%s%9$N;OE@$r<($9J8;zNs(B (1 $BJ8;z0J>e(B)") +(defvar its-fence-close "|" "*$B%U%'%s%9$N=*E@$r<($9J8;zNs(B (1 $BJ8;z0J>e(B)") +(defvar its-fence-face nil "*$B%U%'%s%9I=<($KMQ$$$k(B face $B$^$?$O(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)) @@ -248,33 +273,38 @@ ;; (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) (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 @@ -287,10 +317,6 @@ (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)) @@ -339,17 +365,26 @@ ;;; 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)) @@ -360,8 +395,8 @@ (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)))) @@ -423,18 +458,20 @@ (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)))) @@ -442,7 +479,8 @@ (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) @@ -470,6 +508,11 @@ (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 syl (its-initial-ISYL))) @@ -483,7 +526,7 @@ (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)))) @@ -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)) ;;; (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,50 @@ Return last state." (defun its-exit-mode () "Exit ITS mode." (interactive) - (its-input-end) - (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-input-end) + (its-put-cursor t) + (its-exit-mode-internal))) ;; 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-input-end) + (its-put-cursor 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 +1015,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 +1044,28 @@ Return last state." (delete-region start end) (insert its-translation-result))) +(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/hangul.el b/its/hangul.el index a37f32e..888c434 100644 --- a/its/hangul.el +++ b/its/hangul.el @@ -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 + +;; Author: NIIBE Yutaka +;; KATAYAMA Yoshio + +;; 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 ". " "*$(C#.(B") ; ". " "$(C#.(B" +(defvar its-hangul-comma ", " "*$(C#,(B") ; ", " "$(C#,(B" (defvar its-hangul-open-bracket "$(C!8(B" "*[") ; "$(C#[(B" -(defvar its-hangul-close-bracket "$(C!9(B" "*]") ; "$(C#](B" +(defvar its-hangul-close-bracket "$(C!9(B" "*]") ; "$(C#](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 @@ -51,8 +81,15 @@ (its-defrule-otherwise state output)))) (define-its-state-machine its-hangul-map - "hangul" "$(CGQ(B" "korean" + "hangul" "$(CGQ(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" "$(C$!(B") (its-defrule-hangul "s" "$(C$$(B") (its-defrule-hangul "e" "$(C$'(B") @@ -2795,70 +2832,82 @@ (its-define-hangul "glt" "$(CH}(B" kijuhynbmlopOP) (its-define-hangul "gld" "$(CH~(B" kijuhynbmlopOP)) - ;;; Jeonkak Symbols - - (its-defrule "1" "$(C#1(B") - (its-defrule "2" "$(C#2(B") - (its-defrule "3" "$(C#3(B") - (its-defrule "4" "$(C#4(B") - (its-defrule "5" "$(C#5(B") - (its-defrule "6" "$(C#6(B") - (its-defrule "7" "$(C#7(B") - (its-defrule "8" "$(C#8(B") - (its-defrule "9" "$(C#9(B") - (its-defrule "0" "$(C#0(B") - - ;;(its-defrule " " "$(C!!(B") - (its-defrule "!" "$(C#!(B") - (its-defrule "@" "$(C#@(B") - (its-defrule "#" "$(C##(B") - (its-defrule "$" "$(C#$(B") - (its-defrule "%" "$(C#%(B") - (its-defrule "^" "$(C#^(B") - (its-defrule "&" "$(C#&(B") - (its-defrule "*" "$(C#*(B") - (its-defrule "(" "$(C#((B") - (its-defrule ")" "$(C#)(B") - (its-defrule "-" "$(C#-(B") - (its-defrule "=" "$(C#=(B") - (its-defrule "`" "$(C#`(B") - (its-defrule "\\" "$(C#\(B") - (its-defrule "|" "$(C#|(B") - (its-defrule "_" "$(C#_(B") - (its-defrule "+" "$(C#+(B") - (its-defrule "~" "$(C#~(B") - (its-defrule "[" "$(C!8(B");;(its-defrule "[" "$(C#[(B") - (its-defrule "]" "$(C!9(B");;(its-defrule "]" "$(C#](B") - (its-defrule "{" "$(C#{(B") - (its-defrule "}" "$(C#}(B") - (its-defrule ":" "$(C#:(B") - (its-defrule ";" "$(C#;(B") - (its-defrule "\"" "$(C#"(B") - (its-defrule "'" "$(C#'(B") - (its-defrule "<" "$(C#<(B") - (its-defrule ">" "$(C#>(B") - (its-defrule "?" "$(C#?(B") - (its-defrule "/" "$(C#/(B") - (its-defrule "," "$(C#,(B") - (its-defrule "." "$(C#.(B") - - (its-defrule (concat its-jeonkak-escape " ") "$(C!!(B") - (let ((i ?!)) - (while (<= i ?~) - (its-defrule (concat its-jeonkak-escape (char-to-string i)) - (char-to-string (+ (- ?$(C#!(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" . "$(C#1(B") ("2" . "$(C#2(B") ("3" . "$(C#3(B") ("4" . "$(C#4(B") + ("5" . "$(C#5(B") ("6" . "$(C#6(B") ("7" . "$(C#7(B") ("8" . "$(C#8(B") + ("9" . "$(C#9(B") ("0" . "$(C#0(B") + (" " . "$(C!!(B") ("!" . "$(C#!(B") ("@" . "$(C#@(B") ("#" . "$(C##(B") + ("$" . "$(C#$(B") ("%" . "$(C#%(B") ("^" . "$(C#^(B") ("&" . "$(C#&(B") + ("*" . "$(C#*(B") ("(" . "$(C#((B") (")" . "$(C#)(B") + ("-" . "$(C#-(B") ("=" . "$(C#=(B") ("`" . "$(C#`(B") ("\\" . "$(C#\(B") + ("|" . "$(C#|(B") ("_" . "$(C#_(B") ("+" . "$(C#+(B") ("~" . "$(C#~(B") + ("[" . "$(C!8(B") ("]" . "$(C!9(B") ("{" . "$(C#{(B") ("}" . "$(C#}(B") + (":" . "$(C#:(B") (";" . "$(C#;(B") ("\"" . "$(C#"(B") ("'" . "$(C#'(B") + ("<" . "$(C#<(B") (">" . "$(C#>(B") ("?" . "$(C#?(B") ("/" . "$(C#/(B") + ("," . "$(C#,(B") ("." . "$(C#.(B") + ("a" . "$(C#a(B") ("b" . "$(C#b(B") ("c" . "$(C#c(B") ("d" . "$(C#d(B") + ("e" . "$(C#e(B") ("f" . "$(C#f(B") ("g" . "$(C#g(B") ("h" . "$(C#h(B") + ("i" . "$(C#i(B") ("j" . "$(C#j(B") ("k" . "$(C#k(B") ("l" . "$(C#l(B") + ("m" . "$(C#m(B") ("n" . "$(C#n(B") ("o" . "$(C#o(B") ("p" . "$(C#p(B") + ("q" . "$(C#q(B") ("r" . "$(C#r(B") ("s" . "$(C#s(B") ("t" . "$(C#t(B") + ("u" . "$(C#u(B") ("v" . "$(C#v(B") ("w" . "$(C#w(B") ("x" . "$(C#x(B") + ("y" . "$(C#y(B") ("z" . "$(C#z(B") + ("A" . "$(C#A(B") ("B" . "$(C#B(B") ("C" . "$(C#C(B") ("D" . "$(C#D(B") + ("E" . "$(C#E(B") ("F" . "$(C#F(B") ("G" . "$(C#G(B") ("H" . "$(C#H(B") + ("I" . "$(C#I(B") ("J" . "$(C#J(B") ("K" . "$(C#K(B") ("L" . "$(C#L(B") + ("M" . "$(C#M(B") ("N" . "$(C#N(B") ("O" . "$(C#O(B") ("P" . "$(C#P(B") + ("Q" . "$(C#Q(B") ("R" . "$(C#R(B") ("S" . "$(C#S(B") ("T" . "$(C#T(B") + ("U" . "$(C#U(B") ("V" . "$(C#V(B") ("W" . "$(C#W(B") ("X" . "$(C#X(B") + ("Y" . "$(C#Y(B") ("Z" . "$(C#Z(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" "$(C#1(B") (its-defrule "2" "$(C#2(B") + (its-defrule "3" "$(C#3(B") (its-defrule "4" "$(C#4(B") + (its-defrule "5" "$(C#5(B") (its-defrule "6" "$(C#6(B") + (its-defrule "7" "$(C#7(B") (its-defrule "8" "$(C#8(B") + (its-defrule "9" "$(C#9(B") (its-defrule "0" "$(C#0(B") + (its-defrule "!" "$(C#!(B") (its-defrule "@" "$(C#@(B") + (its-defrule "#" "$(C##(B") (its-defrule "$" "$(C#$(B") + (its-defrule "%" "$(C#%(B") (its-defrule "^" "$(C#^(B") + (its-defrule "&" "$(C#&(B") (its-defrule "*" "$(C#*(B") + (its-defrule "(" "$(C#((B") (its-defrule ")" "$(C#)(B") + (its-defrule "-" "$(C#-(B") (its-defrule "~" "$(C#~(B") + (its-defrule "=" "$(C#=(B") (its-defrule "`" "$(C#`(B") + (its-defrule "\\" "$(C#\(B") (its-defrule "|" "$(C#|(B") + (its-defrule "_" "$(C#_(B") (its-defrule "+" "$(C#+(B") + (its-defrule "{" "$(C#{(B") (its-defrule "}" "$(C#}(B") + (its-defrule ":" "$(C#:(B") (its-defrule ";" "$(C#;(B") + (its-defrule "\"" "$(C#"(B") (its-defrule "'" "$(C#'(B") + (its-defrule "<" "$(C#<(B") (its-defrule ">" "$(C#>(B") + (its-defrule "?" "$(C#?(B") (its-defrule "/" "$(C#/(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/hira.el b/its/hira.el index a08cec9..051dcc6 100644 --- a/its/hira.el +++ b/its/hira.el @@ -47,9 +47,13 @@ (define-its-state-machine its-hira-map "roma-kana" "$B$"(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 $B$C(Bk ;;; kka $B$C$+(B @@ -434,9 +438,9 @@ (its-defrule "nn" "$B$s(B") (its-defrule "nn" "$B$s(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) @@ -455,13 +459,11 @@ (its-defrule "=" "$B!a(B") (its-defrule "`" "$B!.(B") (its-defrule "\\" "$B!o(B") (its-defrule "|" "$B!C(B") (its-defrule "_" "$B!2(B") (its-defrule "+" "$B!\(B") - (its-defrule "~" "$B!1(B" nil t) - (its-defrule "{" "$B!P(B") - (its-defrule "}" "$B!Q(B") (its-defrule ":" "$B!'(B") - (its-defrule ";" "$B!((B") (its-defrule "\"" "$B!I(B") - (its-defrule "'" "$B!G(B") (its-defrule "<" "$B!c(B") - (its-defrule ">" "$B!d(B") (its-defrule "?" "$B!)(B") - (its-defrule "/" "$B!?(B")) + (its-defrule "{" "$B!P(B") (its-defrule "}" "$B!Q(B") + (its-defrule ":" "$B!'(B") (its-defrule ";" "$B!((B") + (its-defrule "\"" "$B!I(B") (its-defrule "'" "$B!G(B") + (its-defrule "<" "$B!c(B") (its-defrule ">" "$B!d(B") + (its-defrule "?" "$B!)(B") (its-defrule "/" "$B!?(B")) (progn (its-defrule "1" "1") (its-defrule "2" "2") (its-defrule "3" "3") (its-defrule "4" "4") @@ -474,15 +476,13 @@ (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/pinyin.el b/its/pinyin.el index 9d3505d..6a32775 100644 --- a/its/pinyin.el +++ b/its/pinyin.el @@ -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 + +;; Author: KATAYAMA Yoshio + +;; 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 "$A!8(B" "*[") ; "$A#[(B" (defvar its-pinyin-cn-close-braket "$A!9(B" "*]") ; "$A#](B" +(defvar its-pinyin-tw-enable-quanjioao-alphabet t "*Enable Quanjiao alphabet") (defvar its-pinyin-tw-open-braket "$(G!V(B" "*[") ; "$(G!b(B " (defvar its-pinyin-tw-close-braket "$(G!W(B" "*]") ; "$(G!c(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 ?@))) @@ -65,9 +94,10 @@ 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)) @@ -126,51 +156,51 @@ (UO '("uo" "u(0-(B" "u(0.(B" "u(0/(B" "u(00(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" "") @@ -185,6 +215,13 @@ (define-its-state-machine its-pinyin-cn-map "pinyin-cn" "$AF4(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 " "$A2;(B") (its-defoutput* "c " "$A2E(B") @@ -238,29 +275,27 @@ ("U" . "$A#U(B") ("V" . "$A#V(B") ("W" . "$A#W(B") ("X" . "$A#X(B") ("Y" . "$A#Y(B") ("Z" . "$A#Z(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 "," "$A#,(B" nil t) - (its-defrule "." "$A!#(B" nil t) - (its-defrule "/" "$A!"(B" nil t) - (its-defrule ":" "$A#:(B" nil t) - (its-defrule ";" "$A#;(B" nil t) - (its-defrule "?" "$A#?(B" nil t) - (its-defrule "!" "$A#!(B" nil t) - (its-defrule "-" "$A!*(B" nil t)) + (its-defrule "," "$A#,(B") + (its-defrule "." "$A!#(B") + (its-defrule "/" "$A!"(B") + (its-defrule ":" "$A#:(B") + (its-defrule ";" "$A#;(B") + (its-defrule "?" "$A#?(B") + (its-defrule "!" "$A#!(B")) (define-its-state-machine its-pinyin-tw-map "pinyin-tw" "$(GQ;(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 " "$(GDb(B") (its-defoutput* "c " "$(GD_(B") @@ -314,34 +349,99 @@ ("U" . "$(G$U(B") ("V" . "$(G$V(B") ("W" . "$(G$W(B") ("X" . "$(G$X(B") ("Y" . "$(G$Y(B") ("Z" . "$(G$Z(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 "," "$(G!"(B" nil t) - (its-defrule "." "$(G!$(B" nil t) - (its-defrule "/" "$(G!#(B" nil t) - (its-defrule ":" "$(G!((B" nil t) - (its-defrule ";" "$(G!'(B" nil t) - (its-defrule "?" "$(G!)(B" nil t) - (its-defrule "!" "$(G!*(B" nil t) - (its-defrule "-" "$(G"1(B" nil t) - (its-defrule "[" "$(G!V(B" nil t) - (its-defrule "]" "$(G!W(B" nil t)) + (its-defrule "," "$(G!"(B") + (its-defrule "." "$(G!$(B") + (its-defrule "/" "$(G!#(B") + (its-defrule ":" "$(G!((B") + (its-defrule ";" "$(G!'(B") + (its-defrule "?" "$(G!)(B") + (its-defrule "!" "$(G!*(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" "$A#1(B") (its-defrule "2" "$A#2(B") + (its-defrule "3" "$A#3(B") (its-defrule "4" "$A#4(B") + (its-defrule "5" "$A#5(B") (its-defrule "6" "$A#6(B") + (its-defrule "7" "$A#7(B") (its-defrule "8" "$A#8(B") + (its-defrule "9" "$A#9(B") (its-defrule "0" "$A#0(B") + (its-defrule "@" "$A#@(B") + (its-defrule "#" "$A##(B") (its-defrule "$" "$A!g(B") + (its-defrule "%" "$A#%(B") (its-defrule "^" "$A#^(B") + (its-defrule "&" "$A#&(B") (its-defrule "*" "$A#*(B") + (its-defrule "(" "$A#((B") (its-defrule ")" "$A#)(B") + (its-defrule "-" "$A#-(B") (its-defrule "~" "$A!+(B") + (its-defrule "=" "$A#=(B") (its-defrule "`" "$A#`(B") + (its-defrule "\\" "$A#\(B") (its-defrule "|" "$A#|(B") + (its-defrule "_" "$A#_(B") (its-defrule "+" "$A#+(B") + (its-defrule "{" "$A#{(B") (its-defrule "}" "$A#}(B") + (its-defrule "\"" "$A#"(B") (its-defrule "'" "$A#'(B") + (its-defrule "<" "$A#<(B") (its-defrule ">" "$A#>(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" "$(G$"(B") (its-defrule "2" "$(G$#(B") + (its-defrule "3" "$(G$$(B") (its-defrule "4" "$(G$%(B") + (its-defrule "5" "$(G$&(B") (its-defrule "6" "$(G$'(B") + (its-defrule "7" "$(G$((B") (its-defrule "8" "$(G$)(B") + (its-defrule "9" "$(G$*(B") (its-defrule "0" "$(G$!(B") + (its-defrule "@" "$(G"i(B") + (its-defrule "#" "$(G!l(B") (its-defrule "$" "$(G"c(B") + (its-defrule "%" "$(G"h(B") (its-defrule "^" "$(G!T(B") + (its-defrule "&" "$(G!m(B") (its-defrule "*" "$(G!n(B") + (its-defrule "(" "$(G!>(B") (its-defrule ")" "$(G!?(B") + (its-defrule "-" "$(G"1(B") (its-defrule "~" "$(G"D(B") + (its-defrule "=" "$(G"8(B") (its-defrule "`" "$(G!j(B") + (its-defrule "\\" "$(G"b(B") (its-defrule "|" "$(G"^(B") + (its-defrule "_" "$(G"%(B") (its-defrule "+" "$(G"0(B") + (its-defrule "{" "$A#{(B") (its-defrule "}" "$(G!a(B") + (its-defrule "\"" "$(G!i(B") (its-defrule "'" "$(G!k(B") + (its-defrule "<" "$(G"6(B") (its-defrule ">" "$(G"7(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/leim-list-egg.el b/leim-list-egg.el index 00d80fa..215b9a0 100644 --- a/leim-list-egg.el +++ b/leim-list-egg.el @@ -6,36 +6,36 @@ (register-input-method "japanese-egg-wnn" "Japanese" 'egg-activate-wnn "" "Romaji -> Hiragana -> Kanji&Kana" - 'its-select-hiragana "Japanese") + 'its-select-hiragana) (register-input-method "japanese-egg-sj3" "Japanese" 'egg-activate-sj3 "" "Romaji -> Hiragana -> Kanji&Kana" - 'its-select-hiragana "Japanese") + 'its-select-hiragana) (register-input-method "chinese-gb-egg-wnn-py" "Chinese-GB" 'egg-activate-wnn "" "Pinyin -> Simplified Hanzi" - 'its-select-pinyin-cn "Chinese-GB") + 'its-select-pinyin-cn) (register-input-method "chinese-gb-egg-wnn-zy" "Chinese-GB" 'egg-activate-wnn "" "Zhunyin -> Simplified Hanzi" - 'its-select-zhuyin-cn "Chinese-GB") + 'its-select-zhuyin-cn) (register-input-method "chinese-cns-egg-wnn-py" "Chinese-CNS" 'egg-activate-wnn "" "Pinyin -> Traditional Hanzi" - 'its-select-pinyin-tw "Chinese-CNS") + 'its-select-pinyin-tw) (register-input-method "chinese-cns-egg-wnn-zy" "Chinese-CNS" 'egg-activate-wnn "" "Zhunyin -> Traditional Hanzi" - 'its-select-zhuyin-tw "Chinese-CNS") + 'its-select-zhuyin-tw) (register-input-method "korean-egg-wnn" "Korean" 'egg-activate-wnn "" "Hangul -> Hanja" - 'its-select-hangul "Korean") + 'its-select-hangul) (autoload 'egg-mode "egg" "Toggle EGG mode." t)