(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)))))
(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)
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)
(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")
;;;###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.