1 ;;; egg/sj3.el --- SJ3 Support (high level interface) in Egg
2 ;;; Input Method Architecture
4 ;; Copyright (C) 1997 Mule Project, Powered by Electrotechnical
6 ;; Project Leader: Satoru Tomura <tomura@etl.go.jp>
8 ;; Author: NIIBE Yutaka <gniibe@mri.co.jp>
9 ;; Maintainer: NIIBE Yutaka <gniibe@mri.co.jp>
11 ;; This file will be part of GNU Emacs (in future).
13 ;; EGG is free software; you can redistribute it and/or modify
14 ;; it under the terms of the GNU General Public License as published by
15 ;; the Free Software Foundation; either version 2, or (at your option)
18 ;; EGG is distributed in the hope that it will be useful,
19 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
20 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 ;; GNU General Public License for more details.
23 ;; You should have received a copy of the GNU General Public License
24 ;; along with GNU Emacs; see the file COPYING. If not, write to the
25 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
26 ;; Boston, MA 02111-1307, USA.
32 (defconst sj3-support-languages '("Japanese"))
34 (defconst sj3-conversion-backend
38 sj3-get-bunsetsu-converted
39 sj3-get-bunsetsu-source
41 sj3-get-number-of-candidates
42 sj3-get-current-candidate-number
43 sj3-get-all-candidates
45 sj3-change-bunsetsu-length
51 (defconst sj3-server-port 3000 "Port number of SJ3 server")
52 (defvar sj3-stdy-size 0 "STDYSIZE of SJ3 server")
53 (defvar sj3-hostname "localhost"
54 "Hostname of SJ3 server")
56 (defun sj3-open (hostname)
57 "Establish the connection to SJ3 server. Return process object."
58 (let* ((buf (generate-new-buffer " *SJ3*"))
59 (proc (open-network-stream "SJ3" buf hostname sj3-server-port))
61 (process-kill-without-query proc)
62 (set-process-coding-system proc 'no-conversion 'no-conversion)
63 (set-marker-insertion-type (process-mark proc) t)
68 (setq enable-multibyte-characters nil))
69 ;; Initialize dictionaries
70 (setq sj3-sys-dict-list nil)
71 (setq sj3-user-dict-list nil)
72 (setq result (sj3rpc-open proc (system-name) (user-login-name)))
74 (let ((msg (sj3rpc-get-error-message (- result))))
77 (error "Can't open SJ3 session (%s): %s" hostname msg)))
78 (setq result (sj3rpc-get-stdy-size proc))
80 (let ((msg (sj3rpc-get-error-message (- result))))
83 (error "Can't get SJ3 STDYSIZE: %s"msg)))
84 (setq sj3-stdy-size result)
87 ;; <env> ::= [ <proc> <dictionary-list> ]
88 (defvar sj3-environment nil
89 "Environment for SJ3 kana-kanji conversion")
91 (defsubst sj3env-get-proc (env)
93 (defsubst sj3env-get-dictionary-list (env)
97 ;; [ <env> <source> <converted> <rest>
98 ;; <stdy> <zenkouho> <zenkouho-pos> <stdy-down> ]
99 (defsubst sj3-make-bunsetsu (env source converted rest stdy)
100 (vector env source converted rest stdy nil nil nil))
102 (defsubst sj3bunsetsu-get-env (b)
104 (defsubst sj3bunsetsu-get-source (b)
106 (defsubst sj3bunsetsu-get-converted (b)
108 (defsubst sj3bunsetsu-get-rest (b)
110 (defsubst sj3bunsetsu-get-stdy (b)
112 (defsubst sj3bunsetsu-get-zenkouho (b)
114 (defsubst sj3bunsetsu-set-zenkouho (b z)
116 (defsubst sj3bunsetsu-get-zenkouho-pos (b)
118 (defsubst sj3bunsetsu-set-zenkouho-pos (b p)
120 (defsubst sj3bunsetsu-get-stdydown (b)
122 (defsubst sj3bunsetsu-set-stdydown (b s)
125 (defun sj3-get-bunsetsu-source (b)
126 (sj3bunsetsu-get-source b))
127 (defun sj3-get-bunsetsu-converted (b)
128 (concat (sj3bunsetsu-get-converted b)
129 (sj3bunsetsu-get-rest b)))
130 (defun sj3-get-bunsetsu-stdy (b)
131 (sj3bunsetsu-get-stdy b))
133 (defvar sj3-dictionary-specification
136 [("private.dic") ""])
137 "Dictionary specification of SJ3.")
139 (defvar sj3-usr-dic-dir (concat "user/" (user-login-name))
140 "*Directory of user dictionary for SJ3.")
142 (defun sj3-filename (p)
144 (cond ((consp p) (concat sj3-usr-dic-dir "/" (car p)))
147 (defun sj3-get-environment ()
150 (let* ((proc (sj3-open sj3-hostname))
151 (stdy (sj3-filename (car sj3-dictionary-specification)))
152 (l (cdr sj3-dictionary-specification))
154 (if (/= (sj3rpc-open-stdy proc stdy) 0)
155 (error "Dame1") ; XXX
160 (sj3rpc-open-dictionary proc (sj3-filename (aref dic 0))
163 (error "Dame2") ; XXX
164 (setq dict-list (cons dic-id dict-list)
166 (setq sj3-environment (vector proc dict-list)))))
171 (defun sj3-start-conversion (yomi lang)
172 "Convert YOMI string to kanji, and enter conversion mode.
173 Return the list of bunsetsu."
174 (let ((env (sj3-get-environment)))
175 (sj3rpc-begin env yomi)))
177 ;; XXX: not implemented yet
178 (defun sj3-end-conversion (bunsetsu-list)
181 (defun sj3-list-candidates (bunsetsu prev-bunsetsu)
182 (let* ((env (sj3bunsetsu-get-env bunsetsu))
183 (yomi (sj3bunsetsu-get-source bunsetsu))
184 (z (sj3rpc-get-bunsetsu-candidates env yomi)))
185 (sj3bunsetsu-set-zenkouho bunsetsu z)
186 (sj3bunsetsu-set-zenkouho-pos bunsetsu 0)
189 (defun sj3-get-number-of-candidates (bunsetsu)
190 (let ((l (sj3bunsetsu-get-zenkouho bunsetsu)))
195 (defun sj3-decide-candidate (bunsetsu candidate-pos)
196 (let* ((candidate-list (sj3bunsetsu-get-zenkouho bunsetsu))
197 (candidate (nth candidate-pos candidate-list)))
198 (sj3bunsetsu-set-zenkouho candidate candidate-list)
199 (sj3bunsetsu-set-zenkouho-pos candidate candidate-pos)
202 (defun sj3-get-current-candidate-number (bunsetsu)
203 (sj3bunsetsu-get-zenkouho-pos bunsetsu))
205 (defun sj3-get-all-candidates (bunsetsu)
206 (let* ((l (sj3bunsetsu-get-zenkouho bunsetsu))
207 (result (cons nil nil))
211 (let ((candidate (car l)))
212 (setcar r (sj3bunsetsu-get-converted candidate))
213 (if (null (setq l (cdr l)))
215 (setq r (setcdr r (cons nil nil)))))))
218 (defun sj3-change-bunsetsu-length (b0 b1 b2 len)
220 (sj3bunsetsu-get-source b1)
221 (if b2 (sj3bunsetsu-get-source b2))))
222 (env (sj3bunsetsu-get-env b1))
225 (setq yomi1 (substring yomi 0 len)
226 yomi2 (substring yomi len))
228 (sj3rpc-tanbunsetsu-conversion env yomi1))
230 (sj3bunsetsu-set-stdydown bunsetsu1
231 (or (sj3bunsetsu-get-stdydown b1)
235 (if (< 0 (length yomi2))
236 (setq bunsetsu2 (sj3rpc-tanbunsetsu-conversion env yomi2))
237 (setq bunsetsu2 nil))
239 (list bunsetsu1 bunsetsu2)
242 ;; XXX: Not implemented yet
243 (defun sj3-fini (lang)
252 (defun egg-activate-sj3 (&rest arg)
253 "Activate SJ3 backend of Tamagotchy."
254 (egg-set-support-languages sj3-support-languages)
255 (egg-set-conversion-backend sj3-conversion-backend
256 sj3-support-languages
258 (apply 'egg-mode arg))
260 ;;; egg/sj3.el ends here.