1 ;;; egg/wnn.el --- WNN Support (high level interface) in Egg
2 ;;; Input Method Architecture
4 ;; Copyright (C) 1997, 1998 Mule Project, Powered by Electrotechnical
6 ;; Project Leader: Satoru Tomura <tomura@etl.go.jp>
8 ;; Author: NIIBE Yutaka <gniibe@mri.co.jp>
9 ;; KATAYAMA Yoshio <kate@pfu.co.jp> ; Korean, Chinese support.
11 ;; Maintainer: NIIBE Yutaka <gniibe@mri.co.jp>
13 ;; This file is part of EGG.
15 ;; EGG is free software; you can redistribute it and/or modify
16 ;; it under the terms of the GNU General Public License as published by
17 ;; the Free Software Foundation; either version 2, or (at your option)
20 ;; EGG is distributed in the hope that it will be useful,
21 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
22 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23 ;; GNU General Public License for more details.
25 ;; You should have received a copy of the GNU General Public License
26 ;; along with GNU Emacs; see the file COPYING. If not, write to the
27 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
28 ;; Boston, MA 02111-1307, USA.
34 "Wnn interface for Tamagotchy"
37 (defconst wnn-support-languages
38 '("Japanese" "Chinese-GB" "Chinese-CNS" "Korean"))
41 (defmacro WNN-const (c)
42 (cond ((eq c 'BUN_SENTOU) -1)
47 ((eq c 'HINDO_NOP) -2)
48 ((eq c 'HINDO_INC) -3))))
50 (defconst wnn-conversion-backend
54 wnn-get-bunsetsu-converted
55 wnn-get-bunsetsu-source
57 wnn-get-number-of-candidates
58 wnn-get-current-candidate-number
59 wnn-get-all-candidates
61 wnn-change-bunsetsu-length
63 wnn-start-reverse-conversion
68 ;; <env> ::= [ <proc> <env-id> <server-type> <dic-set> <rev-flag>
69 ;; <daibunsetsu-info> ]
71 (defsubst wnnenv-create (proc env-id server-type dic-set rev-flag)
72 (vector proc env-id server-type dic-set rev-flag nil))
74 (defsubst wnnenv-get-proc (env)
77 (defsubst wnnenv-get-env-id (env)
80 (defsubst wnnenv-get-server-type (env)
83 (defsubst wnnenv-get-dictionary-set (env)
86 (defsubst wnnenv-get-reverse-flag (env)
89 (defsubst wnnenv-get-daibunsetsu-info (env)
91 (defsubst wnnenv-set-daibunsetsu-info (env d)
94 ;; <bunsetsu> ::= [ <env> <end> <start> <jiritsugo-end> <dic-no>
95 ;; <entry> <freq> <right-now> <hinshi> <status>
96 ;; <status-backward> <kangovect> <evaluation>
98 ;; <converted> <yomi> <fuzokugo>
99 ;; <zenkouho> <freq-down>
102 (defsubst wnn-bunsetsu-create (e end start jiritsugo-end dic-no entry freq
103 right-now hinshi status status-backward
104 kangovect evaluation)
105 (vector e end start jiritsugo-end dic-no entry freq right-now
106 hinshi status status-backward kangovect evaluation
107 nil nil nil nil nil nil))
109 (defsubst wnn-bunsetsu-get-env (bunsetsu)
112 (defsubst wnn-bunsetsu-get-converted (bunsetsu)
114 (defsubst wnn-bunsetsu-set-converted (bunsetsu converted)
115 (aset bunsetsu 13 converted))
117 (defsubst wnn-bunsetsu-get-hinshi (bunsetsu)
120 (defsubst wnn-bunsetsu-get-dic-no (bunsetsu)
123 (defsubst wnn-bunsetsu-get-entry (bunsetsu)
126 (defsubst wnn-bunsetsu-get-right-now (bunsetsu)
129 (defsubst wnn-bunsetsu-get-yomi (bunsetsu)
131 (defsubst wnn-bunsetsu-set-yomi (bunsetsu yomi)
132 (aset bunsetsu 14 yomi))
134 (defsubst wnn-bunsetsu-get-fuzokugo (bunsetsu)
136 (defsubst wnn-bunsetsu-set-fuzokugo (bunsetsu fuzokugo)
137 (aset bunsetsu 15 fuzokugo))
139 (defsubst wnn-bunsetsu-get-zenkouho (bunsetsu)
141 (defsubst wnn-bunsetsu-set-zenkouho (bunsetsu z)
142 (aset bunsetsu 16 z))
144 (defsubst wnn-bunsetsu-get-freq-down (bunsetsu)
146 (defsubst wnn-bunsetsu-set-freq-down (bunsetsu d)
147 (aset bunsetsu 17 d))
149 (defsubst wnn-bunsetsu-get-zenkouho-pos (bunsetsu)
151 (defsubst wnn-bunsetsu-set-zenkouho-pos (bunsetsu zp)
152 (aset bunsetsu 18 zp))
154 (defvar wnn-environments nil
155 "Environment for WNN kana-kanji conversion")
157 (defcustom wnn-jserver nil "jserver host list" :group 'wnn :type 'string)
158 (defcustom wnn-cserver nil "cserver host list" :group 'wnn :type 'string)
159 (defcustom wnn-tserver nil "tserver host list" :group 'wnn :type 'string)
160 (defcustom wnn-kserver nil "kserver host list" :group 'wnn :type 'string)
162 (defcustom wnn-jport 22273 "jserver port number" :group 'wnn :type 'integer)
163 (defcustom wnn-cport 22289 "cserver port number" :group 'wnn :type 'integer)
164 (defcustom wnn-tport 22321 "tserver port number" :group 'wnn :type 'integer)
165 (defcustom wnn-kport 22305 "kserver port number" :group 'wnn :type 'integer)
167 ;; The port number should be initialized from $WNNLIB/serverdefs by wnn-init
168 (defconst wnn-server-info-list
169 ;; language locale server port stream coding-system hostname
170 '(("Japanese" "ja_JP" jserver wnn-jport "Wnn" fixed-euc-jp wnn-jserver)
171 ("Chinese-GB" "zh_CN" cserver wnn-cport "cWnn" fixed-euc-cn wnn-cserver)
172 ("Chinese-CNS" "zh_TW" tserver wnn-tport "tWnn" fixed-euc-tw wnn-tserver)
173 ("Korean" "ko_KR" kserver wnn-kport "kWnn" fixed-euc-kr wnn-kserver)))
175 (defun wnn-get-server-info (lang)
178 (setq lang its-current-language))
179 (if (setq info (assoc lang wnn-server-info-list)) info
180 (assoc "Japanese" wnn-server-info-list))))
182 (defsubst wnn-server-locale (info)
185 (defsubst wnn-server-type (info)
188 (defsubst wnn-server-port (info)
189 (symbol-value (nth 3 info)))
191 (defsubst wnn-server-stream-name (info)
194 (defsubst wnn-server-buffer-name (info)
195 (concat " *" (wnn-server-stream-name info) "*"))
197 (defsubst wnn-server-coding-system (info)
200 (defsubst wnn-server-hostname (info)
201 (symbol-value (nth 6 info)))
206 (defun wnn-start-conversion (yomi &optional language dic-set reverse)
207 "Convert YOMI string to kanji, and enter conversion mode.
208 Return the list of bunsetsu."
209 (let* ((server-info (wnn-get-server-info language))
210 (env (wnn-get-environment server-info dic-set reverse))
211 (result (wnnrpc-renbunsetsu-conversion env yomi
212 (WNN-const BUN_SENTOU) "")))
213 (wnnenv-set-daibunsetsu-info env (car result))
216 (defun wnn-start-reverse-conversion (yomi &optional language dic-set)
217 (wnn-start-conversion yomi language dic-set t))
219 (defun wnn-get-bunsetsu-converted (bunsetsu)
220 (concat (wnn-bunsetsu-get-converted bunsetsu)
221 (wnn-bunsetsu-get-fuzokugo bunsetsu)))
223 ;; WNN-UNIQ-CANDIDATES
225 ;; Here, IMNSHO, WNN is broken.
226 ;; WNN must/should return unique one. The word is representative
227 ;; among possible words with same string literal.
229 ;; With no bunsetsu information to users, users have to chose
230 ;; the word based on the string literal only.
231 ;; How we could update frequency?
233 ;; We'll modify WNN in future.
236 (defun wnn-uniq-candidates (bunsetsu bunsetsu-list)
237 (let ((hash-table (make-vector 31 0)) ; XXX why 31?
240 (n 0) sym0 result p b sym)
241 (setq sym0 (intern (wnn-get-bunsetsu-converted bunsetsu) hash-table))
245 sym (intern (wnn-get-bunsetsu-converted b) hash-table))
246 (if (null (boundp sym)) ; new one
247 (let ((bl (cons b nil)))
250 (wnn-bunsetsu-set-zenkouho-pos bunsetsu (setq n i)))
252 (setq p (setcdr p bl))
253 (setq result (setq p bl)))
255 (wnn-bunsetsu-set-zenkouho bunsetsu result)
258 (defun wnn-list-candidates (bunsetsu prev-bunsetsu)
259 (let* ((candidates (wnn-bunsetsu-get-zenkouho bunsetsu))
260 (yomi (concat (wnn-bunsetsu-get-yomi bunsetsu)
261 (wnn-bunsetsu-get-fuzokugo bunsetsu)))
262 (converted (concat (wnn-bunsetsu-get-converted bunsetsu)
263 (wnn-bunsetsu-get-fuzokugo bunsetsu)))
264 (env (wnn-bunsetsu-get-env bunsetsu))
268 ;; We have the candidates already. Return the current position.
269 (wnn-bunsetsu-get-zenkouho-pos bunsetsu)
270 (if (null prev-bunsetsu)
273 (setq prev-hinshi (wnn-bunsetsu-get-hinshi prev-bunsetsu)
274 prev-fuzokugo (wnn-bunsetsu-get-fuzokugo prev-bunsetsu)))
276 (wnnrpc-get-bunsetsu-candidates env yomi
277 prev-hinshi prev-fuzokugo))
278 (wnn-uniq-candidates bunsetsu candidates))))
280 (defun wnn-get-number-of-candidates (bunsetsu)
281 (let ((l (wnn-bunsetsu-get-zenkouho bunsetsu)))
286 (defun wnn-get-current-candidate-number (bunsetsu)
287 (wnn-bunsetsu-get-zenkouho-pos bunsetsu))
289 (defun wnn-get-all-candidates (bunsetsu)
290 (let* ((l (wnn-bunsetsu-get-zenkouho bunsetsu))
291 (result (cons nil nil))
295 (let ((candidate (car l)))
296 (setcar r (concat (wnn-bunsetsu-get-converted candidate)
297 (wnn-bunsetsu-get-fuzokugo candidate)))
298 (if (null (setq l (cdr l)))
300 (setq r (setcdr r (cons nil nil)))))))
303 (defun wnn-decide-candidate (bunsetsu candidate-pos)
304 (let* ((candidate-list (wnn-bunsetsu-get-zenkouho bunsetsu))
305 (candidate (nth candidate-pos candidate-list)))
306 (wnn-bunsetsu-set-zenkouho candidate candidate-list)
307 (wnn-bunsetsu-set-zenkouho-pos candidate candidate-pos)
312 (defun wnn-change-bunsetsu-length (b0 b1 b2 len)
314 (wnn-get-bunsetsu-source b1)
315 (if b2 (wnn-get-bunsetsu-source b2))))
316 (env (wnn-bunsetsu-get-env b1))
317 yomi1 yomi2 prev-hinshi prev-fuzokugo
322 (setq prev-hinshi (wnn-bunsetsu-get-hinshi b0)
323 prev-fuzokugo (wnn-bunsetsu-get-fuzokugo b0)))
324 (setq yomi1 (substring yomi 0 len)
325 yomi2 (substring yomi len))
327 (car (wnnrpc-tanbunsetsu-conversion env yomi1
328 prev-hinshi prev-fuzokugo)))
330 (wnn-bunsetsu-set-freq-down bunsetsu1
331 (or (wnn-bunsetsu-get-freq-down b1)
335 (if (< 0 (length yomi2))
337 (cdr (wnnrpc-renbunsetsu-conversion
339 (wnn-bunsetsu-get-hinshi bunsetsu1)
340 (wnn-bunsetsu-get-fuzokugo bunsetsu1))))
341 (setq bunsetsu2 nil))
343 (append (list bunsetsu1) bunsetsu2)
347 (defun wnn-get-bunsetsu-source (bunsetsu)
348 (concat (wnn-bunsetsu-get-yomi bunsetsu)
349 (wnn-bunsetsu-get-fuzokugo bunsetsu)))
351 (defun wnn-end-conversion (bunsetsu-info-list abort)
354 (let ((env (wnn-bunsetsu-get-env (car bunsetsu-info-list))))
355 (wnn-update-frequency env bunsetsu-info-list)
356 (wnnenv-set-daibunsetsu-info env nil))))
358 (defvar wnn-sticky-environment-flag nil
359 "*Flag which specifies sticky environment.")
361 (defun wnn-fini (lang) ; XXX
362 ; tamago-971009 version
363 ; argument LANG is still dummy
365 (let ((l wnn-environments))
369 (if wnn-sticky-environment-flag
370 (wnnrpc-make-env-sticky env)
371 (wnnrpc-make-env-unsticky env))
372 (wnnrpc-disconnect env)
375 (setq l wnn-environments)
377 (let ((proc (wnnenv-get-proc (car l))))
378 (if (eq (process-status proc) 'open)
381 (kill-buffer (process-buffer proc)))
383 (setq wnn-environments nil))))
386 (defun wnn-comm-sentinel (proc reason) ; assume it is close
387 ; tamago-971009 version
388 (let ((l wnn-environments)
390 (kill-buffer (process-buffer proc))
391 ;; delete env from the list.
394 (if (eq proc (wnnenv-get-proc env))
398 (setq wnn-environments (cdr l)))
404 (defvar wnn-open-message)
406 (defun wnn-open (server-info)
407 "Establish the connection to WNN server. Return process object."
408 ;; Open the session to WNN server,
409 (let ((buf (generate-new-buffer (wnn-server-buffer-name server-info)))
410 (server-type (wnn-server-type server-info))
411 (hostname-list (wnn-server-hostname server-info))
412 (msg-form "WNN: connecting to %S at %s...")
413 hostname proc result msg)
417 (buffer-disable-undo)
418 (setq egg-fixed-euc (wnn-server-coding-system server-info))
419 (set-buffer-multibyte nil))
421 ((null hostname-list)
422 (setq hostname-list '("localhost")))
423 ((null (listp hostname-list))
424 (setq hostname-list (list hostname-list))))
425 (while (and hostname-list (null proc))
426 (setq hostname (car hostname-list)
427 hostname-list (cdr hostname-list))
428 (message msg-form server-type hostname)
430 (condition-case result
431 (setq proc (open-network-stream (wnn-server-stream-name server-info)
434 (wnn-server-port server-info)))
438 (process-kill-without-query proc)
439 (set-process-coding-system proc 'no-conversion 'no-conversion)
440 (set-process-sentinel proc 'wnn-comm-sentinel)
441 (set-marker-insertion-type (process-mark proc) t)
442 (setq result (wnnrpc-open proc
443 (if (equal hostname "localhost")
449 (delete-process proc)
451 msg (format "Can't open WNN session (%s %S): %s"
453 (wnn-server-type server-info)
457 (setq wnn-open-message (format (concat msg-form "done")
462 (error "%s" (or msg (format "no %S available" server-type))))))
464 (defvar wnn-dictionary-specification-list
467 [2 10 2 45 100 200 5 1 40 -100 200 -100 200 80 200 200 200]
469 ["pubdic/kihon.dic" ("kihon.h") 5 nil t]
470 ["pubdic/setsuji.dic" ("setsuji.h") 5 nil t]
471 ["pubdic/koyuu.dic" ("koyuu.h") 1 nil t]
472 ["pubdic/chimei.dic" ("chimei.h") 1 nil t]
473 ["pubdic/jinmei.dic" ("jinmei.h") 1 nil t]
474 ["pubdic/special.dic" ("special.h") 5 nil t]
475 ["pubdic/computer.dic" ("computer.h") 5 nil t]
476 ["pubdic/symbol.dic" ("symbol.h") 1 nil t]
477 ["pubdic/tankan.dic" nil 1 nil nil]
478 ["pubdic/bio.dic" ("bio.h") 1 nil t]
479 ["gerodic/g-jinmei.dic" ("g-jinmei.h") 1 nil t]
480 ["wnncons/tankan2.dic" nil 1 nil nil]
481 ["wnncons/tankan3.dic" nil 1 nil nil]
484 [2 10 2 45 1 80 5 1 50 -20 400 -10 100 -100 200 0 200]
486 ["pubdic/kihon.dic" ("kihon.h") 5 nil t]
487 ["pubdic/setsuji.dic" ("setsuji.h") 5 nil t]
488 ["pubdic/koyuu.dic" ("koyuu.h") 1 nil t]
489 ["pubdic/chimei.dic" ("chimei.h") 1 nil t]
490 ["pubdic/jinmei.dic" ("jinmei.h") 1 nil t]
491 ["pubdic/special.dic" ("special.h") 5 nil t]
492 ["pubdic/computer.dic" ("computer.h") 5 nil t]
493 ["pubdic/symbol.dic" ("symbol.h") 1 nil t]
494 ["pubdic/tankan.dic" nil 1 nil nil]
495 ["pubdic/bio.dic" ("bio.h") 1 nil t]
496 ["gerodic/g-jinmei.dic" ("g-jinmei.h") 1 nil t]
497 ["wnncons/tankan2.dic" nil 1 nil nil]
498 ["wnncons/tankan3.dic" nil 1 nil nil]
504 ["sys/QianMa.dic" nil 1 nil nil])
508 ["sys/WuBi.dic" nil 1 nil nil])
510 [1 5 2 750 10 80 10 5 1000 50 0 -200 0 0 0 16 0]
512 ["sys/level_1.dic" ("level_1.h") 4 nil t]
513 ["sys/level_2.dic" ("level_2.h") 1 nil t]
514 ["sys/basic.dic" ("basic.h") 7 nil t]
515 ["sys/computer.dic" ("computer.h") 4 nil t]
516 ["sys/cwnn.dic" ("cwnn.h") 4 nil t]
521 ["sys/QianMa.dic" nil 1 nil nil])
525 ["sys/WuBi.dic" nil 1 nil nil])
527 [1 5 2 750 10 80 10 5 1000 50 0 -200 0 0 0 16 0]
529 ["sys/level_1.dic" ("level_1.h") 4 nil t]
530 ["sys/level_2.dic" ("level_2.h") 1 nil t]
531 ["sys/basic.dic" ("basic.h") 7 nil t]
532 ["sys/computer.dic" ("computer.h") 4 nil t]
533 ["sys/cwnn.dic" ("cwnn.h") 4 nil t]
537 [1 5 2 750 10 80 10 5 1000 50 0 -200 0 0 0 16 0]
539 ["sys/cns_ch.dic" ("cns_ch.h") 4 nil t]
540 ["sys/cns_wd.dic" ("cns_wd.h") 1 nil t]
543 [1 5 2 750 10 80 10 5 1000 50 0 -200 0 0 0 16 0]
545 ["sys/cns_ch.dic" ("cns_ch.h") 4 nil t]
546 ["sys/cns_wd.dic" ("cns_wd.h") 1 nil t]
550 [2 5 2 45 200 80 5 1 40 0 400 -100 400 80 200 2 200]
552 ["sys/hword.dic" ("hword.h") 5 nil t]
553 ["sys/single.dic" ("single.h") 1 nil t]
556 [2 10 2 45 1 80 5 1 50 -20 400 -10 100 -100 200 0 200]
558 ["sys/hword.dic" ("hword.h") 5 nil t]
559 ["sys/single.dic" ("single.h") 1 nil t]
560 [("ud") nil 2 t t]))))
562 (defsubst wnn-get-dic-spec (server)
563 (cdr (assoc server wnn-dictionary-specification-list)))
565 (defsubst wnn-dic-spec-dic-set (spec)
568 (defsubst wnn-dic-spec-reverse (spec)
571 (defsubst wnn-dic-spec-name (spec)
574 (defsubst wnn-dic-spec-param (spec)
577 (defsubst wnn-dic-spec-fuzokugo (spec)
580 (defsubst wnn-dic-spec-dic-list (spec)
584 (defcustom wnn-usr-dic-dir (concat "usr/" (user-login-name))
585 "*Directory of user dictionary for Wnn."
589 (defun wnn-filename (p)
591 (cond ((consp p) (concat wnn-usr-dic-dir "/" (car p)))
594 (defun wnn-open-file (proc env-id filename)
595 "Open the file FILENAME on the environment ENV-ID on server process PROC.
596 Return file descripter. NIL means NO-file.
597 On failure, return negate-encoded error code."
599 (wnnrpc-open-file proc env-id filename)
602 (defun wnn-create-directory (proc env-id path)
603 "Create directory to the path."
604 (let ((dir (directory-file-name path))
606 (while (and dir (/= (wnnrpc-access proc env-id 0 dir) 0))
607 (setq create-list (cons dir create-list)
608 dir (file-name-directory dir))
610 (setq dir (directory-file-name dir))))
611 (if (null create-list)
614 (if (y-or-n-p (format "
\e$B%G%#%l%/%H%j
\e(B(%s)
\e$B$,M-$j$^$;$s!#:n$j$^$9$+
\e(B? " path))
617 (let* ((dir (car create-list))
618 (ret (wnnrpc-mkdir proc env-id dir)))
621 (message "
\e$B%G%#%l%/%H%j
\e(B(%s)
\e$B$N:n@.$K<:GT$7$^$7$?
\e(B" dir)
622 (throw 'return nil))))
623 (setq create-list (cdr create-list)))
625 (message "
\e$B%G%#%l%/%H%j
\e(B(%s)
\e$B$r:n$j$^$7$?
\e(B" path)
630 (defun wnn-open-dictionary (proc env-id dicname mode)
631 (let ((dictionary (wnn-open-file proc env-id dicname)))
632 (if (null dictionary)
633 (throw 'wnn-set-dictionary-tag nil)
634 (while (< dictionary 0)
635 (let ((err-code (- dictionary)))
636 (if (or (null mode) (/= err-code (WNN-const NO_EXIST)))
637 (let ((msg (wnnrpc-get-error-message err-code)))
638 (message "
\e$B<-=q%U%!%$%k
\e(B(%s)
\e$B$,$"$j$^$;$s
\e(B: %s" dicname msg)
639 (throw 'wnn-set-dictionary-tag nil)) ; Failure
640 ;; Try to create new one
642 (format "
\e$B<-=q%U%!%$%k
\e(B(%s)
\e$B$,$"$j$^$;$s!#:n$j$^$9$+
\e(B? "
644 (wnn-create-directory proc env-id
645 (file-name-directory dicname))
646 (= (wnnrpc-create-dictionary proc env-id dicname) 0))
648 (message "
\e$B<-=q%U%!%$%k
\e(B(%s)
\e$B$r:n$j$^$7$?
\e(B" dicname)
650 (wnnrpc-open-file proc env-id dicname)))
651 (throw 'wnn-set-dictionary-tag nil)))))
654 (defun wnn-open-frequency (proc env-id freqname mode dic)
655 (let ((frequency (wnn-open-file proc env-id freqname)))
658 (while (< frequency 0)
659 (let ((err-code (- frequency)))
660 (if (or (null mode) (/= err-code (WNN-const NO_EXIST)))
661 (let ((msg (wnnrpc-get-error-message err-code)))
662 (message "
\e$BIQEY%U%!%$%k
\e(B(%s)
\e$B$,$"$j$^$;$s
\e(B: %s" freqname msg)
663 (throw 'wnn-set-dictionary-tag nil)) ; Failure
664 ;; Try to create new one
666 (format "
\e$BIQEY%U%!%$%k
\e(B(%s)
\e$B$,$"$j$^$;$s!#:n$j$^$9$+
\e(B? "
668 (wnn-create-directory proc env-id
669 (file-name-directory freqname))
670 (= (wnnrpc-create-frequency proc env-id freqname dic) 0))
672 (message "
\e$BIQEY%U%!%$%k
\e(B(%s)
\e$B$r:n$j$^$7$?
\e(B" freqname)
674 (wnnrpc-open-file proc env-id freqname)))
675 (throw 'wnn-set-dictionary-tag nil))))))
678 ;; Using local file (uploading/downloading) is not supported yet.
679 ;; Password is not supported (Password is questionable feature, anyway)
680 (defun wnn-set-dictionary (proc env-id reverse-flag dic-spec)
682 (catch 'wnn-set-dictionary-tag
683 (let ((dicname (wnn-filename (aref dic-spec 0)))
684 (freqname (wnn-filename (aref dic-spec 1)))
685 (priority (aref dic-spec 2))
686 (dic-mode (aref dic-spec 3))
687 (freq-mode (aref dic-spec 4))
688 dictionary frequency)
689 (setq dictionary (wnn-open-dictionary proc env-id dicname dic-mode))
691 (wnn-open-frequency proc env-id freqname freq-mode dictionary))
692 (wnn-set-dictionary-sub proc env-id reverse-flag
693 dictionary frequency priority dic-mode
694 freq-mode dicname freqname))))
696 (defun wnn-set-dictionary-sub (proc env-id reverse-flag
697 dictionary frequency priority dic-mode
698 freq-mode dicname freqname)
701 (let ((ret (wnnrpc-set-dictionary proc env-id reverse-flag
703 priority dic-mode freq-mode)))
705 (let ((err-code (- ret)))
706 (if (or (null freq-mode) (/= err-code (WNN-const NO_MATCH)))
707 (let ((msg (wnnrpc-get-error-message (- ret))))
708 (message "WNN: Error on setting dictionary (%s, %s): %s"
709 dicname freqname msg)
710 (setq trying nil)) ; done
711 ;; No-match: Create new frequency and try it again
712 (wnnrpc-discard-file proc env-id frequency) ; XXX: error?
714 (wnn-query-del/create-frequency proc env-id freqname
717 (setq trying nil))))))
719 (defun wnn-query-del/create-frequency (proc env-id freqname dictionary)
721 (format "
\e$B<-=q$HIQEY
\e(B(%s)
\e$B$N@09g@-$,$"$j$^$;$s!#:n$jD>$7$^$9$+
\e(B? "
724 (wnnrpc-remove-file proc freqname) ; XXX: error?
725 (wnnrpc-create-frequency proc env-id freqname dictionary) ; XXX: error?
726 (message "
\e$BIQEY%U%!%$%k
\e(B(%s)
\e$B$r:n$j$^$7$?
\e(B" freqname)
727 (wnnrpc-open-file proc env-id freqname)) ; XXX: error?
730 (defun wnn-get-environment (server-info &optional dic-set reverse)
731 "Return WNN Environemt for the conversion server specified
732 by SERVER-INFO. If none, create new environment. Optional
733 argument DIC-SET specifies dictionary set. Optional argument
734 REVERSE specifies reverse conversion, if non nil."
735 (let ((server-type (wnn-server-type server-info))
736 (env wnn-environments)
738 (setq reverse (null (null reverse)))
742 (if (and (eq (wnnenv-get-server-type e) server-type)
743 (eq (wnnenv-get-dictionary-set e) dic-set)
744 (eq (wnnenv-get-reverse-flag e) reverse))
746 (setq env (cdr env))))
748 (setq proc (wnn-open server-info)
749 spec (wnn-get-dic-spec server-type))
752 e (wnn-create-environment proc server-type s)
753 wnn-environments (cons e wnn-environments))
754 (if (and (eq (wnn-dic-spec-dic-set s) dic-set)
755 (eq (wnn-dic-spec-reverse s) reverse))
757 (setq spec (cdr spec)))
759 (error "WNN: environment for %S%s (%s) not found"
761 (if dic-set (format "(%S)" dic-set) "")
762 (if reverse 'reverse 'normal)))
763 (message "%s" wnn-open-message)
766 (defun wnn-create-environment (proc server-type spec)
768 ;; Create new data structure: something like wnn_buf
769 ;; Process, Environment-ID and Daibunsetsu-info.
770 (let (env-id parameters filename fuzokugo-fid ret dic-set reverse)
771 (setq env-id (wnnrpc-connect proc (wnn-make-env-name spec)))
773 (error "Can't connect new WNN environment: %s"
774 (wnnrpc-get-error-message (- env-id))))
775 (setq dic-set (wnn-dic-spec-dic-set spec)
776 reverse (wnn-dic-spec-reverse spec)
777 parameters (wnn-dic-spec-param spec)
778 filename (wnn-filename (wnn-dic-spec-fuzokugo spec))
779 fuzokugo-fid (wnn-open-file proc env-id filename))
780 (if (null fuzokugo-fid)
781 (setq fuzokugo-fid -1)
782 (if (< fuzokugo-fid 0)
784 (message "WNN: Can't open fuzokugo file (%s): %s"
786 (wnnrpc-get-error-message (- fuzokugo-fid)))
787 (setq fuzokugo-fid -1))))
788 (setq ret (wnnrpc-set-fuzokugo-file proc env-id fuzokugo-fid))
790 (let ((msg (wnnrpc-get-error-message (- ret))))
791 (message "WNN: Error on setting fuzokugo (%s): %s" filename msg)))
792 (setq spec (wnn-dic-spec-dic-list spec))
794 (wnn-set-dictionary proc env-id reverse (car spec))
795 (setq spec (cdr spec)))
797 (wnnrpc-set-conversion-parameters proc env-id parameters))
798 (wnnenv-create proc env-id server-type dic-set reverse)))
800 (defvar wnn-user-name nil)
802 (defun wnn-make-env-name (spec)
804 (setq wnn-user-name (getenv "WNNUSER"))
805 (setq wnn-user-name (user-login-name)))
806 (concat wnn-user-name (wnn-dic-spec-name spec)))
808 (defun wnn-update-frequency (env bunsetsu-info-list)
809 (let ((l bunsetsu-info-list))
812 (fd (wnn-bunsetsu-get-freq-down b))
813 (z (wnn-bunsetsu-get-zenkouho b)))
815 (let* ((fdb (car fd))
816 (dic-no (wnn-bunsetsu-get-dic-no fdb))
817 (entry (wnn-bunsetsu-get-entry fdb)))
818 (wnnrpc-set-frequency env dic-no entry
819 (WNN-const IMA_OFF) (WNN-const HINDO_NOP))
823 (right-now (wnn-bunsetsu-get-right-now zb))
824 (dic-no (wnn-bunsetsu-get-dic-no zb))
825 (entry (wnn-bunsetsu-get-entry zb)))
826 (if (and (/= right-now 0) (/= dic-no -1))
827 (wnnrpc-set-frequency env dic-no entry (WNN-const IMA_OFF)
828 (WNN-const HINDO_NOP)))
830 (let ((dic-no (wnn-bunsetsu-get-dic-no b))
831 (entry (wnn-bunsetsu-get-entry b)))
833 (wnnrpc-set-frequency env dic-no entry
835 (WNN-const HINDO_INC))))
838 ;;; XXX Need alternative implementation
839 ;(defun wnn-set-conversion-mode ()
840 ; (jl-set-environment))
842 (defun wnn-save-dictionaries ()
843 (for-each-environment
851 (defun wnn-version (proc)
852 "Return version number string of WNN server."
853 (format "%x" (wnnrpc-version proc)))
855 (defun wnn-dai-bunsetsu-p ()
858 (defun wnn-next-dai-bunsetsu-pos ()
861 ;;; not implemented yet (NIY)
862 (defun wnn-delete-dictionary ()
865 ;;; NIY, might never be implemented
866 (defun wnn-server-inspect ())
869 (defun wnn-list-dictionaries ()
873 (defun wnn-get-conversion-parameters ()
876 ;;; Dictionary management (word registration) is not implemented yet.
878 ;; XXX: local file loaded into the server: Not supported yet
879 ;(defun wnn-list-dictionaries (env)
880 ; (wnnrpc-get-dictionary-list-with-environment env))
882 (defun wnn-find-dictionary-by-id (id dic-list)
885 (let ((dic (car dic-list)))
886 (if (= (wnndic-get-id dic) id)
888 (setq dic-list (cdr dic-list)))))))
890 (defun wnn-dict-name (dic)
891 (let ((name (wnndic-get-comment dic)))
892 (if (string= name "")
893 (file-name-nondirectory (wnndic-get-dictname dic))
896 (defun wnn-list-writable-dictionaries-byname (env)
897 (let ((dic-list (wnnrpc-get-dictionary-list-with-environment env))
898 (w-id-list (wnnrpc-get-writable-dictionary-id-list env)))
899 (mapcar (function (lambda (id)
900 (let ((dic (wnn-find-dictionary-by-id id dic-list)))
901 (cons (wnn-dict-name dic) dic))))
904 (defun wnn-hinshi-list (env dic name)
905 (let ((dic-number (wnndic-get-id dic)))
906 (wnnrpc-get-hinshi-list env dic-number name)))
908 (defun wnn-hinshi-number (env hinshi-name)
909 (wnnrpc-hinshi-number (wnnenv-get-proc env) hinshi-name))
911 (defun wnn-add-word (env dic yomi kanji comment hinshi-id initial-freq)
912 (let ((dic-number (wnndic-get-id dic)))
913 (wnnrpc-add-word env dic-number yomi kanji comment
914 hinshi-id initial-freq)))
922 (defun egg-activate-wnn (&rest arg)
923 "Activate Wnn backend of Tamagotchy."
924 (egg-set-support-languages wnn-support-languages)
925 (egg-set-conversion-backend wnn-conversion-backend
926 wnn-support-languages)
927 (apply 'egg-mode arg))
929 ;;; egg/wnn.el ends here.