This commit was manufactured by cvs2svn to create branch 'xemacs'.
[elisp/tamago.git] / egg / sj3.el
index 37b5a42..61d7249 100644 (file)
 (require 'egg-edep)
 
 (defgroup sj3 nil
-  "SJ3 interface for Tamago 4"
+  "SJ3 interface for Tamago 4."
   :group 'egg)
 
-(defcustom  sj3-hostname "localhost"
-  "*Hostname of SJ3 server"
+(defcustom sj3-hostname "localhost"
+  "Hostname of SJ3 server"
   :group 'sj3 :type 'string)
 
-(defcustom  sj3-server-port 3086 
-  "*Port number of SJ3 server"
+(defcustom sj3-server-port 3086
+  "Port number of SJ3 server"
   :group 'sj3 :type 'integer)
 
-(defcustom sj3-server-version 2
-  "Major version number of SJ3 server."
-  :group 'sj3
-  :type '(choice (const 1) (const 2)))
-
-(defcustom sj3-server-coding-system-list '(shift_jis euc-japan)
-  "List of coding systems for SJ3 server v1 and v2."
-  :group 'sj3
-  :type '(list (symbol :tag "v1") (symbol :tag "v2")))
-
 
 (eval-when-compile
   (defmacro SJ3-const (c)
     (cond ((eq c 'FileNotExist) 35)
          )))
 
+(egg-add-message
+ '((Japanese
+    (sj3-register-1 "\e$BEPO?<-=qL>\e(B:")
+    (sj3-register-2 "\e$BIJ;lL>\e(B"))))
+
+(defvar sj3-hinshi-menu
+  '(("\e$BL>;l\e(B"      .
+     (menu "\e$BIJ;l\e(B:\e$BL>;l\e(B:"
+          (("\e$BL>;l\e(B"               . 1)
+           ("\e$BL>;l\e(B(\e$B$*!D\e(B)"   . 2)
+           ("\e$BL>;l\e(B(\e$B$4!D\e(B)"   . 3)
+           ("\e$BL>;l\e(B(\e$B!DE*\e(B/\e$B2=\e(B)"  . 4)
+           ("\e$BL>;l\e(B(\e$B$*!D$9$k\e(B)"       . 5)
+           ("\e$BL>;l\e(B(\e$B!D$9$k\e(B)" . 6)
+           ("\e$BL>;l\e(B(\e$B$4!D$9$k\e(B)"       . 7)
+           ("\e$BL>;l\e(B(\e$B!D$J\e(B/\e$B$K\e(B)"  . 8)
+           ("\e$BL>;l\e(B(\e$B$*!D$J\e(B/\e$B$K\e(B)"        . 9)
+           ("\e$BL>;l\e(B(\e$B$4!D$J\e(B/\e$B$K\e(B)"        . 10)
+           ("\e$BL>;l\e(B(\e$BI{;l\e(B)"   . 11))))
+    ("\e$BBeL>;l\e(B"    . 12)
+    ("\e$BID;z\e(B"      . 21)
+    ("\e$BL>A0\e(B"      . 22)
+    ("\e$BCOL>\e(B"      . 24)
+    ("\e$B8)\e(B/\e$B6hL>\e(B"     . 25)
+    ("\e$BF0;l\e(B"      .
+     (menu "\e$BIJ;l\e(B:\e$BF0;l\e(B:"
+          (("\e$B%5JQ8l44\e(B"           . 80)
+           ("\e$B%6JQ8l44\e(B"           . 81)
+           ("\e$B0lCJITJQ2=It\e(B"       . 90)
+           ("\e$B%+9T8^CJ8l44\e(B"       . 91)
+           ("\e$B%,9T8^CJ8l44\e(B"       . 92)
+           ("\e$B%59T8^CJ8l44\e(B"       . 93)
+           ("\e$B%?9T8^CJ8l44\e(B"       . 94)
+           ("\e$B%J9T8^CJ8l44\e(B"       . 95)
+           ("\e$B%P9T8^CJ8l44\e(B"       . 96)
+           ("\e$B%^9T8^CJ8l44\e(B"       . 97)
+           ("\e$B%i9T8^CJ8l44\e(B"       . 98)
+           ("\e$B%o9T8^CJ8l44\e(B"       . 99))))
+    ("\e$BO"BN;l\e(B"            . 26)
+    ("\e$B@\B3;l\e(B"            . 27)
+    ("\e$B=u?t;l\e(B"            . 29)
+    ("\e$B?t;l\e(B"              . 30)
+    ("\e$B@\F,8l\e(B"            . 31)
+    ("\e$B@\Hx8l\e(B"            . 36)
+    ("\e$BI{;l\e(B"              . 45)
+    ("\e$BI{;l\e(B2"             . 46)
+    ("\e$B7AMF;l8l44\e(B"        . 60)
+    ("\e$B7AMFF0;l8l44\e(B"      . 71)
+    ("\e$BC14A;z\e(B"            . 189))
+  "Menu data for a hinshi (a part of speech) selection.")
+
+(defun sj3-hinshi-name (id &optional menu alist)
+  "Return a hinshi (a part of speech) name corresponding to ID.
+If ID is nil, return a flattened alist from `sj3-hinshi-menu'.
+Don't specify the optional arguments in normal use."
+  (let ((menu (or menu sj3-hinshi-menu)))
+    (if (consp menu)
+       (if (consp (cdr menu))
+           (mapcar (lambda (elem)
+                     (setq alist (sj3-hinshi-name nil elem alist)))
+                   menu)
+         (setq alist (nconc alist (list (cons (cdr menu) (car menu)))))))
+    (if id
+       (cdr (assq id alist))
+      alist)))
+
 (setplist 'sj3-conversion-backend
          '(egg-start-conversion          sj3-start-conversion
            egg-get-bunsetsu-source       sj3-get-bunsetsu-source
            egg-list-candidates           sj3-list-candidates
            egg-decide-candidate          sj3-decide-candidate
            egg-change-bunsetsu-length    sj3-change-bunsetsu-length
-           egg-end-conversion            sj3-end-conversion))
+           egg-end-conversion            sj3-end-conversion
+           egg-word-registration         sj3-word-registration))
 
 (defconst sj3-backend-alist '((Japanese ((sj3-conversion-backend)))))
 
@@ -353,7 +410,7 @@ Return the list of bunsetsu."
     (list (list candidate))))
 
 (defun sj3-change-bunsetsu-length (bunsetsu prev-b next-b len major)
-  (let ((yomi (apply 'concat (mapcar 'sj3bunsetsu-get-source bunsetsu)))
+  (let ((yomi (mapconcat 'sj3bunsetsu-get-source bunsetsu nil))
        (env (sj3bunsetsu-get-env (car bunsetsu)))
        (old (car bunsetsu))
        new yomi1 yomi2)
@@ -361,7 +418,7 @@ Return the list of bunsetsu."
          yomi2 (substring yomi len))
     (setq new (sj3rpc-tanbunsetsu-conversion env yomi1))
     ;; Only set once (memory original length of the bunsetsu).
-    (sj3bunsetsu-set-kugiri-changed new 
+    (sj3bunsetsu-set-kugiri-changed new
                                    (or (sj3bunsetsu-get-kugiri-changed old)
                                        (length (sj3bunsetsu-get-source old))))
     (if (> (length yomi2) 0)
@@ -381,6 +438,37 @@ Return the list of bunsetsu."
        (sj3rpc-close proc)
        (setq sj3-environment nil))))
 
+;;; word registration
+
+(defun sj3-dictionary-select ()
+  (menudiag-select (list 'menu
+                        (egg-get-message 'sj3-register-1)
+                        (aref (nth 2 sj3-dictionary-specification) 0))))
+
+(defun sj3-hinshi-select ()
+  (menudiag-select (list 'menu
+                        (egg-get-message 'sj3-register-2)
+                        sj3-hinshi-menu)))
+
+(defun sj3-word-registration (backend kanji yomi)
+  "Register a word KANJI with a pronunciation YOMI."
+  (if (or (null (eq (egg-get-language 0 kanji)
+                   (sj3-get-converted-language backend)))
+         (next-single-property-change 0 'egg-lang kanji)
+         (null (eq (egg-get-language 0 yomi)
+                   (sj3-get-source-language backend)))
+         (next-single-property-change 0 'egg-lang yomi))
+      (egg-error "word registration: invalid character")
+    (let* ((env (sj3-get-environment))
+          (dic (sj3-dictionary-select))
+          (hinshi-id (sj3-hinshi-select))
+          (result (sj3rpc-add-word env
+                                   (car (aref env 1))
+                                   yomi kanji hinshi-id)))
+      (if (>= result 0)
+         (list (sj3-hinshi-name hinshi-id) dic)
+       (egg-error (sj3rpc-get-error-message (- result)))))))
+
 ;;; setup
 
 (load "egg/sj3rpc")
@@ -388,7 +476,7 @@ Return the list of bunsetsu."
 
 ;;;###autoload
 (defun egg-activate-sj3 (&rest arg)
-  "Activate SJ3 backend of Tamagotchy."
+  "Activate SJ3 backend of Tamago 4."
   (apply 'egg-mode (append arg sj3-backend-alist)))
 
 ;;; egg/sj3.el ends here.