# HG changeset patch # User Kenichi Handa # Date 967171031 0 # Node ID 654d260e80bd9d679309eb3074e69c2afb497f31 # Parent 6c51a4e8bf882bfdb7079d22fac56f2566c8949a *** empty log message *** diff -r 6c51a4e8bf88 -r 654d260e80bd ChangeLog --- a/ChangeLog Fri Aug 25 01:58:44 2000 +0000 +++ b/ChangeLog Fri Aug 25 02:37:11 2000 +0000 @@ -1,6 +1,6 @@ 2000-08-25 Kenichi Handa - * leim-Makefile.in: Rename skkdic to ja-dic through out the file. + * leim-Makefile.in: Rename skkdic to ja-dic throughout the file. 2000-08-24 Gerd Moellmann diff -r 6c51a4e8bf88 -r 654d260e80bd leim/ChangeLog --- a/leim/ChangeLog Fri Aug 25 01:58:44 2000 +0000 +++ b/leim/ChangeLog Fri Aug 25 02:37:11 2000 +0000 @@ -2,7 +2,7 @@ * ja-dic: Directory name changed from skkdic. - * ja-dic/ja-dic.el[c]: Renamed from skkdic.el[c]. + * ja-dic/ja-dic.el[c]: Re-generated by the new ja-dic-cnv.el. * README: Rename skkdic to ja-dic throughout the file. diff -r 6c51a4e8bf88 -r 654d260e80bd leim/ja-dic/ja-dic.el --- a/leim/ja-dic/ja-dic.el Fri Aug 25 01:58:44 2000 +0000 +++ b/leim/ja-dic/ja-dic.el Fri Aug 25 02:37:11 2000 +0000 @@ -1,6 +1,6 @@ -;; skkdic.el -- dictionary for Japanese input method +;; ja-dic.el -- dictionary for Japanese input method ;; Generated by the command `skkdic-convert' -;; Date: Fri Aug 25 09:40:31 2000 +;; Date: Fri Aug 25 11:06:13 2000 ;; Original SKK dictionary file: SKK-JISYO.L ;;; Comment: @@ -38,7 +38,7 @@ ;;; Code: -(eval-when-compile (require 'skkdic-cnv)) +(eval-when-compile (require 'ja-dic-cnv)) ;; Setting okuri-ari entries. (skkdic-set-okuri-ari @@ -54597,6 +54597,6 @@ ) ;; -(provide 'skkdic) +(provide 'ja-dic) -;; skkdic.el ends here +;; ja-dic.el ends here diff -r 6c51a4e8bf88 -r 654d260e80bd leim/ja-dic/ja-dic.elc Binary file leim/ja-dic/ja-dic.elc has changed diff -r 6c51a4e8bf88 -r 654d260e80bd lisp/ChangeLog --- a/lisp/ChangeLog Fri Aug 25 01:58:44 2000 +0000 +++ b/lisp/ChangeLog Fri Aug 25 02:37:11 2000 +0000 @@ -1,3 +1,22 @@ +2000-08-25 Kenichi Handa + + * international/kkc.el: Remove SKK from Keywords. Require + ja-dic-utl instead of skkdic-utl. + + * international/ja-dic-cnv.el: Renamed from skkdic-cnv.el. + Provide ja-dic-cnv instead of skkdic-cnv. + (ja-dic-filename): Renamed from skkdic-filename. Referers changed + (iso-2022-7bit-short): Add safe-charsets property. + (skkdic-convert-postfix): Search Japanese chou-on character in + addition to Hiragana character. + (skkdic-convert-prefix, skkdic-collect-okuri-nasi): Likewise. + (skkdic-convert): Change file names from skkdic.el to ja-dic.el + (batch-skkdic-convert): Likewise. + + * international/ja-dic-utl.el: Renamed from skkdic-utl.el. + Provide ja-dic-utl instead of skkdic-utl. + (skkdic-lookup-key): Load ja-dic/ja-dic, not skkdic/skkdic. + 2000-08-24 Dave Love * disp-table.el (standard-display-default): Make the test of `l' diff -r 6c51a4e8bf88 -r 654d260e80bd lisp/international/skkdic-cnv.el --- a/lisp/international/skkdic-cnv.el Fri Aug 25 01:58:44 2000 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,560 +0,0 @@ -;;; skkdic-cnv.el --- Convert a SKK dictionary for `skkdic-utl' - -;; Copyright (C) 1995 Electrotechnical Laboratory, JAPAN. -;; Licensed to the Free Software Foundation. - -;; Keywords: mule, multilingual, Japanese, SKK - -;; This file is part of GNU Emacs. - -;; GNU Emacs is free software; you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 2, or (at your option) -;; any later version. - -;; GNU Emacs is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;; SKK is a Japanese input method running on Mule created by Masahiko -;; Sato . Here we provide utilities -;; to handle a dictionary distributed with SKK so that a different -;; input method (e.g. quail-japanese) can utilize the dictionary. - -;; The format of SKK dictionary is quite simple. Each line has the -;; form "KANASTRING /CONV1/CONV2/.../" which means KANASTRING (仮名文 -;; 字列) can be converted to one of CONVi. CONVi is a Kanji (漢字) -;; and Kana (仮名) mixed string. -;; -;; KANASTRING may have a trailing ASCII letter for Okurigana (送り仮名) -;; information. For instance, the trailing letter `k' means that one -;; of the following Okurigana is allowed: かきくけこ. So, in that -;; case, the string "KANASTRINGく" can be converted to one of "CONV1く", -;; CONV2く, ... - -;;; Code: - -;; Name of a file to generate from SKK dictionary. -(defvar skkdic-filename "skkdic.el") - -;; To make a generated skkdic.el smaller. -(make-coding-system - 'iso-2022-7bit-short - 2 ?J - "Like `iso-2022-7bit' but no ASCII designation before SPC." - '(ascii nil nil nil t t nil t)) - -(defun skkdic-convert-okuri-ari (skkbuf buf) - (message "Processing OKURI-ARI entries ...") - (goto-char (point-min)) - (save-excursion - (set-buffer buf) - (insert ";; Setting okuri-ari entries.\n" - "(skkdic-set-okuri-ari\n")) - (while (not (eobp)) - (let ((from (point)) - to) - (end-of-line) - (setq to (point)) - - (save-excursion - (set-buffer buf) - (insert-buffer-substring skkbuf from to) - (beginning-of-line) - (insert "\"") - (search-forward " ") - (delete-char 1) ; delete the first '/' - (let ((p (point))) - (end-of-line) - (delete-char -1) ; delete the last '/' - (subst-char-in-region p (point) ?/ ? 'noundo)) - (insert "\"\n")) - - (forward-line 1))) - (save-excursion - (set-buffer buf) - (insert ")\n\n"))) - -(defconst skkdic-postfix-list '(skkdic-postfix-list)) - -(defconst skkdic-postfix-data - '(("いき" "行") - ("がかり" "係") - ("がく" "学") - ("がわ" "川") - ("しゃ" "社") - ("しゅう" "集") - ("しょう" "賞" "城") - ("じょう" "城") - ("せん" "線") - ("だけ" "岳") - ("ちゃく" "着") - ("てん" "店") - ("とうげ" "峠") - ("どおり" "通り") - ("やま" "山") - ("ばし" "橋") - ("はつ" "発") - ("もく" "目") - ("ゆき" "行"))) - -(defun skkdic-convert-postfix (skkbuf buf) - (message "Processing POSTFIX entries ...") - (goto-char (point-min)) - (save-excursion - (set-buffer buf) - (insert ";; Setting postfix entries.\n" - "(skkdic-set-postfix\n")) - - ;; Initialize SKKDIC-POSTFIX-LIST by predefined data - ;; SKKDIC-POSTFIX-DATA. - (save-excursion - (set-buffer buf) - (let ((l skkdic-postfix-data) - kana candidates entry) - (while l - (setq kana (car (car l)) candidates (cdr (car l))) - (insert "\"" kana) - (while candidates - (insert " " (car candidates)) - (setq entry (lookup-nested-alist (car candidates) - skkdic-postfix-list nil nil t)) - (if (consp (car entry)) - (setcar entry (cons kana (car entry))) - (set-nested-alist (car candidates) (list kana) - skkdic-postfix-list)) - (setq candidates (cdr candidates))) - (insert "\"\n") - (setq l (cdr l))))) - - ;; Search postfix entries. - (while (re-search-forward "^[#<>?]\\(\\cH+\\) " nil t) - (let ((kana (match-string 1)) - str candidates) - (while (looking-at "/[#0-9 ]*\\([^/\n]*\\)/") - (setq str (match-string 1)) - (if (not (member str candidates)) - (setq candidates (cons str candidates))) - (goto-char (match-end 1))) - (save-excursion - (set-buffer buf) - (insert "\"" kana) - (while candidates - (insert " " (car candidates)) - (let ((entry (lookup-nested-alist (car candidates) - skkdic-postfix-list nil nil t))) - (if (consp (car entry)) - (if (not (member kana (car entry))) - (setcar entry (cons kana (car entry)))) - (set-nested-alist (car candidates) (list kana) - skkdic-postfix-list))) - (setq candidates (cdr candidates))) - (insert "\"\n")))) - (save-excursion - (set-buffer buf) - (insert ")\n\n"))) - -(defconst skkdic-prefix-list '(skkdic-prefix-list)) - -(defun skkdic-convert-prefix (skkbuf buf) - (message "Processing PREFIX entries ...") - (goto-char (point-min)) - (save-excursion - (set-buffer buf) - (insert ";; Setting prefix entries.\n" - "(skkdic-set-prefix\n")) - (save-excursion - (while (re-search-forward "^\\(\\cH+\\)[<>?] " nil t) - (let ((kana (match-string 1)) - str candidates) - (while (looking-at "/\\([^/\n]+\\)/") - (setq str (match-string 1)) - (if (not (member str candidates)) - (setq candidates (cons str candidates))) - (goto-char (match-end 1))) - (save-excursion - (set-buffer buf) - (insert "\"" kana) - (while candidates - (insert " " (car candidates)) - (set-nested-alist (car candidates) kana skkdic-prefix-list) - (setq candidates (cdr candidates))) - (insert "\"\n"))))) - (save-excursion - (set-buffer buf) - (insert ")\n\n"))) - -;; FROM and TO point the head and tail of "/J../J../.../". -(defun skkdic-get-candidate-list (from to) - (let (candidates) - (goto-char from) - (while (re-search-forward "/\\cj+" to t) - (setq candidates (cons (buffer-substring (1+ (match-beginning 0)) - (match-end 0)) - candidates))) - candidates)) - -;; Return entry for STR from nested alist ALIST. -(defsubst skkdic-get-entry (str alist) - (car (lookup-nested-alist str alist nil nil t))) - - -(defconst skkdic-word-list '(skkdic-word-list)) - -;; Return t if substring of STR (between FROM and TO) can be broken up -;; to chunks all of which can be derived from another entry in SKK -;; dictionary. SKKBUF is the buffer where the original SKK dictionary -;; is visited, KANA is the current entry for STR. FIRST is t iff this -;; is called at top level. - -(defun skkdic-breakup-string (skkbuf kana str from to &optional first) - (let ((len (- to from))) - (or (and (>= len 2) - (let ((min-idx (+ from 2)) - (idx (if first (1- to ) to)) - (found nil)) - (while (and (not found) (>= idx min-idx)) - (let ((kana2-list (skkdic-get-entry - (substring str from idx) - skkdic-word-list))) - (if (or (and (consp kana2-list) - (let ((kana-len (length kana)) - kana2) - (catch 'skkdic-tag - (while kana2-list - (setq kana2 (car kana2-list)) - (if (string-match kana2 kana) - (throw 'skkdic-tag t)) - (setq kana2-list (cdr kana2-list))))) - (or (= idx to) - (skkdic-breakup-string skkbuf kana str - idx to))) - (and (stringp kana2-list) - (string-match kana2-list kana))) - (setq found t) - (setq idx (1- idx))))) - found)) - (and first - (> len 2) - (let ((kana2 (skkdic-get-entry - (substring str from (1+ from)) - skkdic-prefix-list))) - (and (stringp kana2) - (eq (string-match kana2 kana) 0))) - (skkdic-breakup-string skkbuf kana str (1+ from) to)) - (and (not first) - (>= len 1) - (let ((kana2-list (skkdic-get-entry - (substring str from to) - skkdic-postfix-list))) - (and (consp kana2-list) - (let (kana2) - (catch 'skkdic-tag - (while kana2-list - (setq kana2 (car kana2-list)) - (if (string= kana2 - (substring kana (- (length kana2)))) - (throw 'skkdic-tag t)) - (setq kana2-list (cdr kana2-list))))))))))) - -;; Return list of candidates which excludes some from CANDIDATES. -;; Excluded candidates can be derived from another entry. - -(defun skkdic-reduced-candidates (skkbuf kana candidates) - (let (elt l) - (while candidates - (setq elt (car candidates)) - (if (or (= (length elt) 1) - (and (string-match "^\\cj" elt) - (not (skkdic-breakup-string skkbuf kana elt 0 (length elt) - 'first)))) - (setq l (cons elt l))) - (setq candidates (cdr candidates))) - (nreverse l))) - -(defconst skkdic-okuri-nasi-entries (list nil)) -(defconst skkdic-okuri-nasi-entries-count 0) - -(defun skkdic-collect-okuri-nasi () - (message "Collecting OKURI-NASI entries ...") - (save-excursion - (let ((prev-ratio 0) - ratio) - (while (re-search-forward "^\\(\\cH+\\) \\(/\\cj.*\\)/$" nil t) - (let ((kana (match-string 1)) - (candidates (skkdic-get-candidate-list (match-beginning 2) - (match-end 2)))) - (setq skkdic-okuri-nasi-entries - (cons (cons kana candidates) skkdic-okuri-nasi-entries) - skkdic-okuri-nasi-entries-count - (1+ skkdic-okuri-nasi-entries-count)) - (setq ratio (floor (/ (* (point) 100.0) (point-max)))) - (if (/= ratio prev-ratio) - (progn - (message "collected %2d%% %s ..." ratio kana) - (setq prev-ratio ratio))) - (while candidates - (let ((entry (lookup-nested-alist (car candidates) - skkdic-word-list nil nil t))) - (if (consp (car entry)) - (setcar entry (cons kana (car entry))) - (set-nested-alist (car candidates) (list kana) - skkdic-word-list))) - (setq candidates (cdr candidates)))))))) - -(defun skkdic-convert-okuri-nasi (skkbuf buf) - (message "Processing OKURI-NASI entries ...") - (save-excursion - (set-buffer buf) - (insert ";; Setting okuri-nasi entries.\n" - "(skkdic-set-okuri-nasi\n") - (let ((l (nreverse skkdic-okuri-nasi-entries)) - (count 0) - (prev-ratio 0) - ratio) - (while l - (let ((kana (car (car l))) - (candidates (cdr (car l)))) - (setq ratio (/ (* count 1000) skkdic-okuri-nasi-entries-count) - count (1+ count)) - (if (/= prev-ratio (/ ratio 10)) - (progn - (message "processed %2d%% %s ..." (/ ratio 10) kana) - (setq prev-ratio (/ ratio 10)))) - (if (setq candidates - (skkdic-reduced-candidates skkbuf kana candidates)) - (progn - (insert "\"" kana) - (while candidates - (insert " " (car candidates)) - (setq candidates (cdr candidates))) - (insert "\"\n")))) - (setq l (cdr l)))) - (insert ")\n\n"))) - -(defun skkdic-convert (filename &optional dirname) - "Convert SKK dictionary of FILENAME into the file \"skkdic.el\". -Optional argument DIRNAME if specified is the directory name under which -the generated \"skkdic.el\" is saved." - (interactive "FSKK dictionary file: ") - (message "Reading file \"%s\" ..." filename) - (let ((skkbuf(find-file-noselect (expand-file-name filename))) - (buf (get-buffer-create "*skkdic-work*"))) - (save-excursion - ;; Setup and generate the header part of working buffer. - (set-buffer buf) - (erase-buffer) - (buffer-disable-undo) - (insert ";; skkdic.el -- dictionary for Japanese input method\n" - ";;\tGenerated by the command `skkdic-convert'\n" - ";;\tDate: " (current-time-string) "\n" - ";;\tOriginal SKK dictionary file: " - (file-name-nondirectory filename) - "\n\n" - ";;; Comment:\n\n" - ";; Do byte-compile this file again after any modification.\n\n" - ";;; Start of the header of the original SKK dictionary.\n\n") - (set-buffer skkbuf) - (widen) - (goto-char 1) - (let (pos) - (search-forward ";; okuri-ari") - (forward-line 1) - (setq pos (point)) - (set-buffer buf) - (insert-buffer-substring skkbuf 1 pos)) - (insert "\n" - ";;; Code:\n\n(eval-when-compile (require 'skkdic-cnv))\n\n") - - ;; Generate the body part of working buffer. - (set-buffer skkbuf) - (let ((from (point)) - to) - ;; Convert okuri-ari entries. - (search-forward ";; okuri-nasi") - (beginning-of-line) - (setq to (point)) - (narrow-to-region from to) - (skkdic-convert-okuri-ari skkbuf buf) - (widen) - - ;; Convert okuri-nasi postfix entries. - (goto-char to) - (forward-line 1) - (setq from (point)) - (re-search-forward "^\\cH") - (setq to (match-beginning 0)) - (narrow-to-region from to) - (skkdic-convert-postfix skkbuf buf) - (widen) - - ;; Convert okuri-nasi prefix entries. - (goto-char to) - (skkdic-convert-prefix skkbuf buf) - - ;; - (skkdic-collect-okuri-nasi) - - ;; Convert okuri-nasi general entries. - (skkdic-convert-okuri-nasi skkbuf buf) - - ;; Postfix - (save-excursion - (set-buffer buf) - (goto-char (point-max)) - (insert ";;\n(provide 'skkdic)\n\n;; skkdic.el ends here\n"))) - - ;; Save the working buffer. - (set-buffer buf) - (set-visited-file-name (expand-file-name skkdic-filename dirname) t) - (set-buffer-file-coding-system 'iso-2022-7bit-short) - (save-buffer 0)) - (kill-buffer skkbuf) - (switch-to-buffer buf))) - -(defun batch-skkdic-convert () - "Run `skkdic-convert' on the files remaining on the command line. -Use this from the command line, with `-batch'; -it won't work in an interactive Emacs. -For example, invoke: - % emacs -batch -l skkdic-cnv -f batch-skkdic-convert SKK-JISYO.L -to generate \"skkdic.el\" from SKK dictionary file \"SKK-JISYO.L\". -To get complete usage, invoke: - % emacs -batch -l skkdic-cnv -f batch-skkdic-convert -h" - (defvar command-line-args-left) ; Avoid compiler warning. - (if (not noninteractive) - (error "`batch-skkdic-convert' should be used only with -batch")) - (if (string= (car command-line-args-left) "-h") - (progn - (message "To convert SKK-JISYO.L into skkdic.el:") - (message " %% emacs -batch -l skkdic-conv -f batch-skkdic-convert SKK-JISYO.L") - (message "To convert SKK-JISYO.L into DIR/skkdic.el:") - (message " %% emacs -batch -l skkdic-conv -f batch-skkdic-convert -dir DIR SKK-JISYO.L")) - (let (targetdir filename) - (if (string= (car command-line-args-left) "-dir") - (progn - (setq command-line-args-left (cdr command-line-args-left)) - (setq targetdir (expand-file-name (car command-line-args-left))) - (setq command-line-args-left (cdr command-line-args-left)))) - (setq filename (expand-file-name (car command-line-args-left))) - (message "Converting %s to skkdic.el ..." filename) - (message "It takes around 10 minutes even on Sun SS20.") - (skkdic-convert filename targetdir) - (message "Do byte-compile the created file by:") - (message " %% emacs -batch -f batch-byte-compile skkdic.el") - )) - (kill-emacs 0)) - - -;; The following macros are expanded at byte-compiling time so that -;; compiled code can be loaded quickly. - -(defun skkdic-get-kana-compact-codes (kana) - (let* ((len (length kana)) - (vec (make-vector len 0)) - (i 0) - ch) - (while (< i len) - (setq ch (aref kana i)) - (aset vec i - (if (< ch 128) ; CH is an ASCII letter for OKURIGANA, - (- ch) ; represented by a negative code. - (if (= ch ?ー) ; `ー' is represented by 0. - 0 - (- (nth 2 (split-char ch)) 32)))) - (setq i (1+ i))) - vec)) - -(defun skkdic-extract-conversion-data (entry) - (string-match "^\\cj+[a-z]* " entry) - (let ((kana (substring entry (match-beginning 0) (1- (match-end 0)))) - (i (match-end 0)) - candidates) - (while (string-match "[^ ]+" entry i) - (setq candidates (cons (match-string 0 entry) candidates)) - (setq i (match-end 0))) - (cons (skkdic-get-kana-compact-codes kana) candidates))) - -(defmacro skkdic-set-okuri-ari (&rest entries) - `(defconst skkdic-okuri-ari - ',(let ((l entries) - (map '(skkdic-okuri-ari)) - entry) - (while l - (setq entry (skkdic-extract-conversion-data (car l))) - (set-nested-alist (car entry) (cdr entry) map) - (setq l (cdr l))) - map))) - -(defmacro skkdic-set-postfix (&rest entries) - `(defconst skkdic-postfix - ',(let ((l entries) - (map '(nil)) - (longest 1) - len entry) - (while l - (setq entry (skkdic-extract-conversion-data (car l))) - (setq len (length (car entry))) - (if (> len longest) - (setq longest len)) - (let ((entry2 (lookup-nested-alist (car entry) map nil nil t))) - (if (consp (car entry2)) - (let ((conversions (cdr entry))) - (while conversions - (if (not (member (car conversions) (car entry2))) - (setcar entry2 (cons (car conversions) (car entry2)))) - (setq conversions (cdr conversions)))) - (set-nested-alist (car entry) (cdr entry) map))) - (setq l (cdr l))) - (setcar map longest) - map))) - -(defmacro skkdic-set-prefix (&rest entries) - `(defconst skkdic-prefix - ',(let ((l entries) - (map '(nil)) - (longest 1) - len entry) - (while l - (setq entry (skkdic-extract-conversion-data (car l))) - (setq len (length (car entry))) - (if (> len longest) - (setq longest len)) - (let ((entry2 (lookup-nested-alist (car entry) map len nil t))) - (if (consp (car entry2)) - (let ((conversions (cdr entry))) - (while conversions - (if (not (member (car conversions) (car entry2))) - (setcar entry2 (cons (car conversions) (car entry2)))) - (setq conversions (cdr conversions)))) - (set-nested-alist (car entry) (cdr entry) map len))) - (setq l (cdr l))) - (setcar map longest) - map))) - -(defmacro skkdic-set-okuri-nasi (&rest entries) - `(defconst skkdic-okuri-nasi - ',(let ((l entries) - (map '(skdic-okuri-nasi)) - (count 0) - entry) - (while l - (setq count (1+ count)) - (if (= (% count 10) 0) - (message (format "%d entries" count))) - (setq entry (skkdic-extract-conversion-data (car l))) - (set-nested-alist (car entry) (cdr entry) map) - (setq l (cdr l))) - map))) - -(provide 'skkdic-cnv) - -;; skkdic-cnv.el ends here diff -r 6c51a4e8bf88 -r 654d260e80bd lisp/international/skkdic-utl.el --- a/lisp/international/skkdic-utl.el Fri Aug 25 01:58:44 2000 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,214 +0,0 @@ -;;; skkdic-utl.el --- Utility functions for handling SKK dictionary - -;; Copyright (C) 1995 Electrotechnical Laboratory, JAPAN. -;; Licensed to the Free Software Foundation. - -;; Keywords: mule, multilingual, Japanese, SKK - -;; This file is part of GNU Emacs. - -;; GNU Emacs is free software; you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 2, or (at your option) -;; any later version. - -;; GNU Emacs is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;; SKK is a free Japanese input method running on Mule created by -;; Masahiko Sato . The Emacs Lisp -;; library kkc.el provides a facility to convert a Japanese kana -;; string to a kanji-kana-mixed string by using a SKK dictionary. -;; -;; This file provides a generic function to look up a SKK dictionary. -;; -;; The original SKK dictionary SKK-JISYO.L is converted to skkdic.el. -;; We get entries of the dictionary in four variables (listed below) -;; by loadig this file (or byte-compiled version skkdic.elc). - -;;; Code: - -;; The following four variables are set by loading skkdic.el[c]. -(defvar skkdic-okuri-ari nil - "Nested alist for OKURI-ARI entries of SKK dictionary.") - -(defvar skkdic-postfix nil - "Nested alist for SETSUBIJI (postfix) entries of SKK dictionary.") - -(defvar skkdic-prefix nil - "Nested alist SETTOUJI (prefix) entries of SKK dictionary.") - -(defvar skkdic-okuri-nasi nil - "Nested alist for OKURI-NASI entries of SKK dictionary.") - -(defconst skkdic-okurigana-table - '((?ぁ . ?a) (?あ . ?a) (?ぃ . ?i) (?い . ?i) (?ぅ . ?u) - (?う . ?u) (?ぇ . ?e) (?え . ?e) (?ぉ . ?o) (?お . ?o) - (?か . ?k) (?が . ?g) (?き . ?k) (?ぎ . ?g) (?く . ?k) - (?ぐ . ?g) (?け . ?k) (?げ . ?g) (?こ . ?k) (?ご . ?g) - (?さ . ?s) (?ざ . ?z) (?し . ?s) (?じ . ?j) (?す . ?s) - (?ず . ?z) (?せ . ?s) (?ぜ . ?z) (?そ . ?s) (?ぞ . ?z) - (?た . ?t) (?だ . ?d) (?ち . ?t) (?ぢ . ?d) (?っ . ?t) - (?つ . ?t) (?づ . ?d) (?て . ?t) (?で . ?d) (?と . ?t) (?ど . ?d) - (?な . ?n) (?に . ?n) (?ぬ . ?n) (?ね . ?n) (?の . ?n) - (?は . ?h) (?ば . ?b) (?ぱ . ?p) (?ひ . ?h) (?び . ?b) - (?ぴ . ?p) (?ふ . ?h) (?ぶ . ?b) (?ぷ . ?p) (?へ . ?h) - (?べ . ?b) (?ぺ . ?p) (?ほ . ?h) (?ぼ . ?b) (?ぽ . ?p) - (?ま . ?m) (?み . ?m) (?む . ?m) (?め . ?m) (?も . ?m) - (?ゃ . ?y) (?や . ?y) (?ゅ . ?y) (?ゆ . ?y) (?ょ . ?y) (?よ . ?y) - (?ら . ?r) (?り . ?r) (?る . ?r) (?れ . ?r) (?ろ . ?r) - (?わ . ?w) (?ゐ . ?w) (?ゑ . ?w) (?を . ?w) - (?ん . ?n) - ) - "Alist of Okuriganas vs trailing ASCII letters in OKURI-ARI entry.") - -(defun skkdic-merge-head-and-tail (heads tails postfix) - (let ((min-len 2) - l) - (while heads - (if (or (not postfix) - (>= (length (car heads)) min-len)) - (let ((tail tails)) - (while tail - (if (or postfix - (>= (length (car tail)) min-len)) - (setq l (cons (concat (car heads) (car tail)) l))) - (setq tail (cdr tail))))) - (setq heads (cdr heads))) - l)) - -(defconst skkdic-jisx0208-hiragana-block (nth 1 (split-char ?あ))) - -(defun skkdic-lookup-key (seq len &optional postfix prefer-noun) - "Return a list of conversion string for sequence SEQ of length LEN. - -SEQ is a vector of Kana characters to be converted by SKK dictionary. -If LEN is shorter than the length of KEYSEQ, the first LEN keys in SEQ -are took into account. - -Optional 3rd arg POSTFIX non-nil means SETSUBIJI (postfix) are also -considered to find conversion strings. - -Optional 4th arg PREFER-NOUN non-nil means that the conversions -without okurigana are placed at the head of the returned list." - (or skkdic-okuri-nasi - (condition-case err - (load-library "skk/skkdic") - (error (ding) - (with-output-to-temp-buffer "*Help*" - (princ "The library `skkdic' can't be loaded. - -The most common case is that you have not yet installed the library -included in LEIM (Libraries of Emacs Input Method) which is -distributed separately from Emacs. - -LEIM is available from the same ftp directory as Emacs.")) - (signal (car err) (cdr err))))) - - (let ((vec (make-vector len 0)) - (i 0) - entry) - ;; At first, generate vector VEC from SEQ for looking up SKK - ;; alists. Nth element in VEC corresponds to Nth element in SEQ. - ;; The values are decided as follows. - ;; If SEQ[N] is `ー', VEC[N] is 0, - ;; else if SEQ[N] is a Hiragana character, VEC[N] is: - ;; ((The 2nd position code of SEQ[N]) - 32), - ;; else VEC[N] is 128. - (while (< i len) - (let ((ch (aref seq i)) - elts) - (if (= ch ?ー) - (aset vec i 0) - (setq elts (split-char ch)) - (if (and (eq (car elts) 'japanese-jisx0208) - (= (nth 1 elts) skkdic-jisx0208-hiragana-block)) - (aset vec i (- (nth 2 elts) 32)) - (aset vec i 128)))) - (setq i (1+ i))) - - ;; Search OKURI-NASI entries. - (setq entry (lookup-nested-alist vec skkdic-okuri-nasi len 0 t)) - (if (consp (car entry)) - (setq entry (copy-sequence (car entry))) - (setq entry nil)) - - (if postfix - ;; Search OKURI-NASI entries with postfixes. - (let ((break (max (- len (car skkdic-postfix)) 1)) - entry-head entry-postfix entry2) - (while (< break len) - (if (and (setq entry-head - (lookup-nested-alist vec skkdic-okuri-nasi - break 0 t)) - (consp (car entry-head)) - (setq entry-postfix - (lookup-nested-alist vec skkdic-postfix - len break t)) - (consp (car entry-postfix)) - (setq entry2 (skkdic-merge-head-and-tail - (car entry-head) (car entry-postfix) t))) - (if entry - (nconc entry entry2) - (setq entry entry2))) - (setq break (1+ break))))) - - ;; Search OKURI-NASI entries with prefixes. - (let ((break (min (car skkdic-prefix) (- len 2))) - entry-prefix entry-tail entry2) - (while (> break 0) - (if (and (setq entry-prefix - (lookup-nested-alist vec skkdic-prefix break 0 t)) - (consp (car entry-prefix)) - (setq entry-tail - (lookup-nested-alist vec skkdic-okuri-nasi len break t)) - (consp (car entry-tail)) - (setq entry2 (skkdic-merge-head-and-tail - (car entry-prefix) (car entry-tail) nil))) - (progn - (if entry - (nconc entry entry2) - (setq entry entry2)))) - (setq break (1- break)))) - - ;; Search OKURI-ARI entries. - (let ((okurigana (assq (aref seq (1- len)) skkdic-okurigana-table)) - orig-element entry2) - (if okurigana - (progn - (setq orig-element (aref vec (1- len))) - (aset vec (1- len) (- (cdr okurigana))) - (if (and (setq entry2 (lookup-nested-alist vec skkdic-okuri-ari - len 0 t)) - (consp (car entry2))) - (progn - (setq entry2 (copy-sequence (car entry2))) - (let ((l entry2) - (okuri (char-to-string (aref seq (1- len))))) - (while l - (setcar l (concat (car l) okuri)) - (setq l (cdr l))) - (if entry - (if prefer-noun - (nconc entry entry2) - (setq entry2 (nreverse entry2)) - (nconc entry2 entry) - (setq entry entry2)) - (setq entry (nreverse entry2)))))) - (aset vec (1- len) orig-element)))) - - entry)) - -;; -(provide 'skkdic-utl) - -;; skkdic-utl.el ends here