Modified Files:
[elisp/tamago.git] / egg / wnn.el
index c2cb2c0..0f2a5ea 100644 (file)
@@ -36,7 +36,7 @@
 (require 'egg-edep)
 
 (defgroup wnn nil
-  "Wnn interface for Tamagotchy"
+  "Wnn interface for Tamago 4."
   :group 'egg)
 
 (defcustom wnn-auto-save-dictionaries 0
@@ -114,6 +114,7 @@ by ':' and digit N."
      egg-major-bunsetsu-continue-p wnn-major-bunsetsu-continue-p
      egg-list-candidates           wnn-list-candidates
      egg-decide-candidate          wnn-decide-candidate
+     egg-special-candidate         wnn-special-candidate
      egg-change-bunsetsu-length    wnn-change-bunsetsu-length
      egg-bunsetsu-combinable-p     wnn-bunsetsu-combinable-p
      egg-end-conversion            wnn-end-conversion
@@ -389,13 +390,12 @@ by ':' and digit N."
 
 ;; <wnn-bunsetsu> ::= [ <env>
 ;;                      <jirilen> <dic-no> <entry> <freq> <right-now> <hinshi>
-;;                             <status> <status-backward> <kangovect> <evaluation>
-;;                             <converted> <yomi> <fuzokugo>
-;;                             <dai-evaluation> <dai-continue> <change-top>
-;;                             <zenkouho-info> <freq-down> <fi-rel> <context> ]
+;;                      <status> <status-backward> <kangovect> <evaluation>
+;;                      <converted> <yomi> <fuzokugo>
+;;                      <dai-evaluation> <dai-continue> <change-top>
+;;                      <zenkouho-info> <freq-down> <fi-rel> <context> ]
 ;;
 ;; <zenkouho-info> ::= [ <pos> <list> <converted> <dai> <prev-b> <nxet-b> ]
-;;                    
 
 (defsubst wnn-bunsetsu-create (env jirilen dic-no entry freq right-now hinshi
                               status status-backward kangovect evaluation)
@@ -556,7 +556,7 @@ by ':' and digit N."
                                 (copy-sequence (egg-bunsetsu-get-info b))))
          bunsetsu))
 \f
-(defconst wnn-server-info-list
+(defvar wnn-server-info-list
   ;; language    server  port      hostname    proc   coding-system
   '((Japanese    jserver wnn-jport wnn-jserver "Wnn"  (fixed-euc-jp    fixed-euc-jp))
     (Chinese-GB  cserver wnn-cport wnn-cserver "cWnn" (fixed-euc-py-cn fixed-euc-zy-cn))
@@ -657,20 +657,28 @@ Return the list of bunsetsu."
 (defun wnn-major-bunsetsu-continue-p (bunsetsu)
   (wnn-bunsetsu-get-dai-continue bunsetsu))
 
+(defmacro wnn-uniq-hash-string (uniq-level)
+  `(mapconcat
+    (lambda (b)
+      (concat ,@(cond ((eq uniq-level 'wnn-uniq)
+                      '((number-to-string (wnn-bunsetsu-get-hinshi b))))
+                     ((eq uniq-level 'wnn-uniq-entry)
+                      '((number-to-string (wnn-bunsetsu-get-dic-no b))
+                        "+"
+                        (number-to-string (wnn-bunsetsu-get-entry b)))))
+             "\0"
+             (wnn-bunsetsu-get-converted b)
+             "\0"
+             (wnn-bunsetsu-get-fuzokugo b)))
+    bunsetsu "\0"))
+
 (defun wnn-uniq-hash (bunsetsu hash-table)
-  (intern (mapconcat (lambda (b)
-                      (concat (cond
-                               ((eq wnn-uniq-level 'wnn-uniq) 
-                                (wnn-bunsetsu-get-hinshi b))
-                               ((eq wnn-uniq-level 'wnn-uniq-entry)
-                                (concat (wnn-bunsetsu-get-dic-no b)
-                                        "+"
-                                        (wnn-bunsetsu-get-entry b))))
-                              (concat "\0"
-                                      (wnn-bunsetsu-get-converted b)
-                                      "\0"
-                                      (wnn-bunsetsu-get-fuzokugo b))))
-                    bunsetsu "\0")
+  (intern (cond ((eq wnn-uniq-level 'wnn-uniq)
+                (wnn-uniq-hash-string wnn-uniq))
+               ((eq wnn-uniq-level 'wnn-uniq-entry)
+                (wnn-uniq-hash-string wnn-uniq-entry))
+               (t
+                (wnn-uniq-hash-string nil)))
          hash-table))
 
 (defun wnn-uniq-candidates (candidates)
@@ -786,6 +794,68 @@ Return the list of bunsetsu."
        (setq next-b (list (car next-b))))
     (list cand prev-b next-b)))
 
+(defun wnn-special-candidate (bunsetsu prev-b next-b major type)
+  (let* ((backend (egg-bunsetsu-get-backend (car bunsetsu)))
+        (lang (get backend 'language))
+        pos cand)
+    (when (and (eq lang (get backend 'source-language))
+              (eq lang (get backend 'converted-language)))
+      (setq pos (and (eq lang (get backend 'source-language))
+                    (eq lang (get backend 'converted-language))
+                    (cond ((eq lang 'Japanese)
+                           (cond ((eq type 'egg-hiragana) -1)
+                                 ((eq type 'egg-katakana) -2)))
+                          ((or (eq lang 'Chinese-GB) (eq lang 'Chinese-CNS))
+                           (cond ((eq type 'egg-pinyin) -1)
+                                 ((eq type 'egg-zhuyin) -1)))
+                          ((eq lang 'Korean)
+                           (cond ((eq type 'egg-hangul) -1))))))
+      (when pos
+       (setq cand (cdr (wnn-list-candidates bunsetsu prev-b next-b major))
+             pos (+ pos (length cand)))
+       (when (and (or (eq lang 'Chinese-GB) (eq lang 'Chinese-CNS)))
+         (let ((converted (nth pos cand)))
+           (cond ((egg-pinyin-syllable converted)
+                  (cond ((eq type 'egg-pinyin)) ; OK
+                        ((eq type 'egg-zhuyin)
+                         (wnn-pinyin-zhuyin-bunsetsu bunsetsu pos lang type))
+                        (t (setq pos nil))))
+                 ((egg-zhuyin-syllable converted)
+                  (cond ((eq type 'egg-pinyin)
+                         (wnn-pinyin-zhuyin-bunsetsu bunsetsu pos lang type))
+                        ((eq type 'egg-zhuyin)) ; OK
+                        (t (setq pos nil))))
+                 (t (setq pos nil))))))
+      (when pos
+       (wnn-decide-candidate bunsetsu pos prev-b next-b)))))
+
+(defun wnn-pinyin-zhuyin-bunsetsu (bunsetsu pos lang type)
+  (let ((b (nth pos (wnn-bunsetsu-get-zenkouho-list (car bunsetsu))))
+       (encoding (if (eq lang 'Chinese-GB)
+                     (if (eq type 'egg-pinyin)
+                         'fixed-euc-py-cn 'fixed-euc-zy-cn)
+                   (if (eq type 'egg-pinyin)
+                       'fixed-euc-py-tw 'fixed-euc-zy-tw)))
+       (converted (wnn-bunsetsu-get-zenkouho-converted (car bunsetsu)))
+       str)
+    (setcar (nthcdr pos converted)
+           (wnn-pinyin-zhuyin-string (nth pos converted) encoding))
+    (while b
+      (setq str (wnn-bunsetsu-get-converted (car b)))
+      (when str
+       (wnn-bunsetsu-set-converted
+        (car b)
+        (wnn-pinyin-zhuyin-string str encoding)))
+      (setq str (wnn-bunsetsu-get-fuzokugo (car b)))
+      (when str
+       (wnn-bunsetsu-set-fuzokugo
+        (car b)
+        (wnn-pinyin-zhuyin-string str encoding)))
+      (setq b (cdr b)))))
+
+(defun wnn-pinyin-zhuyin-string (str encoding)
+  (decode-coding-string (encode-coding-string str encoding) encoding))
+
 (defun wnn-change-bunsetsu-length (bunsetsu prev-b next-b len major)
   (let ((backend (egg-bunsetsu-get-backend (car bunsetsu)))
        (env (wnn-bunsetsu-get-env (car bunsetsu)))
@@ -918,7 +988,7 @@ Return the list of bunsetsu."
                                              (wnn-bunsetsu-get-right-now b)
                                              (wnn-bunsetsu-get-freq b))
                          context))
-      (wnnrpc-set-frequency env dic-no entry 
+      (wnnrpc-set-frequency env dic-no entry
                            (WNN-const IMA_ON) (WNN-const HINDO_INC)))
     (list (car context) (nth 1 context))))
 
@@ -1139,7 +1209,7 @@ Return the list of bunsetsu."
        (proc-name (wnn-server-proc-name server-info))
        (msg-form "Wnn: connecting to %S at %s...")
        (user-name (user-login-name))
-       buf hostname myname port-off proc result msg)
+       buf hostname myname port-off proc result msg)
     (unwind-protect
        (progn
          (setq buf (generate-new-buffer (wnn-server-buffer-name server-info)))
@@ -1175,7 +1245,7 @@ Return the list of bunsetsu."
                ((error quit))))
            (when proc
              (process-kill-without-query proc)
-             (set-process-coding-system proc 'no-conversion 'no-conversion)
+             (set-process-coding-system proc 'binary 'binary)
              (set-process-sentinel proc 'wnn-comm-sentinel)
              (set-marker-insertion-type (process-mark proc) t)
              (setq result (wnnrpc-open proc myname user-name))
@@ -1276,7 +1346,7 @@ is non-NIL."
   (setq env-name (if reverse (concat env-name "R") env-name)
        wnn-current-envspec (wnn-envspec-create env-name tankan stickey)
        wnn-current-envspec-reverse reverse
-       wnn-envspec-list (nconc wnn-envspec-list 
+       wnn-envspec-list (nconc wnn-envspec-list
                                (list wnn-current-envspec))))
 
 (defun wnn-set-fuzokugo (filename)
@@ -1359,7 +1429,7 @@ is non-NIL."
                               dict freq nil dict-rw freq-rw
                               dict-passwd freq-passwd nil))
 
-(defun wnn-add-notrans-dict (dict priority dict-rw 
+(defun wnn-add-notrans-dict (dict priority dict-rw
                             &optional dict-passwd &rest reverse)
   (wnn-wnn6-env-func wnn-add-notrans-dict)
   (wnn-add-dict-param-check wnn-add-notrans-dict
@@ -1705,7 +1775,7 @@ On failure, return negative error code."
             (wnn-create-frequency env fi did fname "" fpass))
        (message (egg-get-message 'wnn-re-create-freq) fname)
        (and (>= (setq fid (wnn-open-file env fname)) 0)
-            (>= (wnnrpc-set-dictionary env 
+            (>= (wnnrpc-set-dictionary env
                                        did fid prior drw frw
                                        dpass fpass rev)
                 0))))))))
@@ -2090,7 +2160,7 @@ environment."
 
 ;;;###autoload
 (defun egg-activate-wnn (&rest arg)
-  "Activate Wnn backend of Tamagotchy."
+  "Activate Wnn backend of Tamago 4."
   (apply 'egg-mode (append arg wnn-backend-alist)))
 
 ;;; egg/wnn.el ends here.