1 | ;;; pdicv-search.el --- upper layer |
---|
2 | ;; |
---|
3 | ;; Copyright (C) 2005-2009 naoya_t. All Rights Reserved. |
---|
4 | ;; |
---|
5 | ;; Author: naoya_t <naoya.t@aqua.plala.or.jp> |
---|
6 | ;; Maintainer: naoya_t <naoya.t@aqua.plala.or.jp> |
---|
7 | ;; Primary distribution site: |
---|
8 | ;; http://lambdarepos.svnrepository.com/svn/share/lang/elisp/pdicv-mode/trunk |
---|
9 | ;; |
---|
10 | ;; Created: 06 Feb 2005 |
---|
11 | ;; Last modified: 23 Dec 2005 |
---|
12 | ;; Version: 0.9.2 |
---|
13 | ;; Keywords: read-from-file |
---|
14 | |
---|
15 | (provide 'pdicv-search) |
---|
16 | |
---|
17 | ;;; Copmmentary: |
---|
18 | ;; |
---|
19 | ; (pdicv-init) |
---|
20 | ; - ����������å�����߹�������� |
---|
21 | ; |
---|
22 | ; (pdicv-search-regexp DICNAME REGEXP-TO-SEARCH [FIELD-TO-SEARCH]) |
---|
23 | ; - ���ɽ������(pdicv-search-just DICNAME WORD-TO-SEARCH [FIELD-TO-SEARCH]) |
---|
24 | ; - exact����(pdicv-search DICNAME WORD-TO-SEARCH [JUST-P REGEXP-P FILED-TO-SEARCH]) |
---|
25 | ; - ����; (pdicv-search-interactive) |
---|
26 | ; - <interactive> �ߥ˥Хåե����������ñ������(pdicv-search-region FROM TO) |
---|
27 | ; - <interactive> ��ꤷ����Ϥ��������(pdicv-set-target-dictionary) |
---|
28 | ; - <interactive> ����ݼ����� (pdicv-search-current-word) |
---|
29 | ; - <interactive> ����������ˤ���������(pdicv-search-next-word) |
---|
30 | ; - <interactive> ���ĸ�ñ������(pdicv-search-previous-word) |
---|
31 | ; - <interactive> �������������� |
---|
32 | ;;; Code: |
---|
33 | (require 'nt-macros) |
---|
34 | (require 'nt-bocu) |
---|
35 | (require 'nt-english) |
---|
36 | (require 'pdicv-core) |
---|
37 | |
---|
38 | (defvar pdicv-dictionary-list ()) |
---|
39 | (defvar pdicv-index-table-list ()) |
---|
40 | |
---|
41 | (defvar pdicv-target-dictionary nil) |
---|
42 | (defvar pdicv-inited-p nil) |
---|
43 | |
---|
44 | (defun pdicv-init () |
---|
45 | "preload index-tables" |
---|
46 | (catch 'pdicv-init |
---|
47 | (if pdicv-inited-p (throw 'pdicv-init nil)) |
---|
48 | (setq pdicv-index-table-list '()) |
---|
49 | (garbage-collect) |
---|
50 | (let ((diclist pdicv-dictionary-list)) |
---|
51 | (while diclist |
---|
52 | (let* ((dicinfo (car diclist)) |
---|
53 | (dicname (car dicinfo)) |
---|
54 | (path (nth 1 dicinfo)) |
---|
55 | (encoding-list (nth 2 dicinfo)) |
---|
56 | (word-encoding (if (atom encoding-list) encoding-list (car encoding-list))) |
---|
57 | (index-table nil)) |
---|
58 | (if (atom path) |
---|
59 | (progn |
---|
60 | (message "Loading index-table for %s (\"%s\")..." dicname path) |
---|
61 | (setq index-table (pdicv-get-index-list path word-encoding)) |
---|
62 | (push (cons dicname index-table) pdicv-index-table-list)) )) |
---|
63 | (setq diclist (cdr diclist))) |
---|
64 | (setq pdicv-inited-p t) |
---|
65 | (message "Done.") ))) |
---|
66 | |
---|
67 | (defun pdicv-search-regexp (dicname regexp-to-search &optional field-to-search) |
---|
68 | "" |
---|
69 | ; (pdicv-search dicname nil regexp-to-search t field-to-search) |
---|
70 | (pdicv-search dicname regexp-to-search nil t field-to-search)) |
---|
71 | |
---|
72 | (defun pdicv-search-just (dicname word-to-search &optional field-to-search) |
---|
73 | "" |
---|
74 | (pdicv-search dicname word-to-search t nil field-to-search)) |
---|
75 | |
---|
76 | (defun pdicv-search (dicname word-to-search &optional just-p regexp-p field-to-search) |
---|
77 | "" |
---|
78 | (if (null just-p) (setq just-p nil)) |
---|
79 | (if (null regexp-p) (setq regexp-p nil)) |
---|
80 | (if (null field-to-search) (setq field-to-search 'e)) |
---|
81 | |
---|
82 | (catch 'pdicv-search |
---|
83 | (let ((candidates |
---|
84 | (if just-p (cons (downcase word-to-search) (nt:english-guess-original-form word-to-search)) |
---|
85 | (list word-to-search) |
---|
86 | )) |
---|
87 | (candidate word-to-search) |
---|
88 | (first-round-p t) |
---|
89 | (dicinfo (assoc dicname pdicv-dictionary-list))) |
---|
90 | ;;(debug candidates);(nt:english-guess-original-form word-to-search)) |
---|
91 | (if (null dicinfo) (throw 'pdicv-search 'dictionary-not-found)) |
---|
92 | |
---|
93 | ; (push (downcase word-to-search) candidates) |
---|
94 | (if (not (string= (downcase word-to-search) word-to-search)) |
---|
95 | (push word-to-search candidates)) |
---|
96 | |
---|
97 | (while (setq candidate (pop candidates)) |
---|
98 | ;path |
---|
99 | (if (listp (cadr dicinfo)) |
---|
100 | (let ((dicname-list (cadr dicinfo))) |
---|
101 | (while dicname-list |
---|
102 | (pdicv-search (car dicname-list) candidate just-p regexp-p field-to-search) |
---|
103 | (setq dicname-list (cdr dicname-list)))) |
---|
104 | ;;else... |
---|
105 | (let* ((encoding-list (nth 2 dicinfo)) |
---|
106 | (word-encoding (if (listp encoding-list) (car encoding-list) encoding-list)) |
---|
107 | (word-in-dic-encoding (cond |
---|
108 | ((eq word-encoding 'bocu) |
---|
109 | (nt:bocu-encode candidate)) |
---|
110 | ((eq word-encoding 'sjis) |
---|
111 | (encode-coding-string candidate 'japanese-shift-jis-dos)) |
---|
112 | ((eq word-encoding 'latin1) |
---|
113 | (encode-coding-string candidate 'iso-latin-1-dos)) |
---|
114 | (word-encoding |
---|
115 | (encode-coding-string candidate word-encoding)) |
---|
116 | (t candidate))) |
---|
117 | (needle1 word-in-dic-encoding) |
---|
118 | (needle1-len (length needle1)) |
---|
119 | (needle2 (concat (substring needle1 0 -1) |
---|
120 | (string (1+ (aref needle1 (1- needle1-len)))))) |
---|
121 | (simple-mode-p just-p) |
---|
122 | |
---|
123 | (criteria |
---|
124 | (if regexp-p (list |
---|
125 | (concat "/" candidate "/") |
---|
126 | (if (string-match "^^[^[]" candidate) ; optimizable |
---|
127 | (cons (substring candidate 1 2) |
---|
128 | (string (1+ (aref candidate 1)))) |
---|
129 | nil) |
---|
130 | ; '(lambda (ix) (let ((word (cadr (car ix)))) |
---|
131 | ; (string-match needle1 word))) |
---|
132 | ; ) |
---|
133 | `(lambda (e_ e p j x) (string-match ,needle1 ,field-to-search)) |
---|
134 | );list |
---|
135 | (list |
---|
136 | candidate ; �����������ɽ���ˤ���������ʤ��� (cons needle1 needle2) ; index�����nil�ʤ�ʸ���� ; '(lambda (ix) (let ((word (cadr (car ix)))) |
---|
137 | ; (and (not (string< word needle1)) |
---|
138 | ; (string< word needle2)))) |
---|
139 | (if just-p |
---|
140 | `(lambda (e_ e p j x) (zerop (nt:strcmp ,field-to-search ,needle1))) |
---|
141 | `(lambda (e_ e p j x) (and (not (string< ,field-to-search ,needle1)) |
---|
142 | (string< ,field-to-search ,needle2))) ; �ǡ����֥�������� |
---|
143 | ))))) |
---|
144 | ; (insert (format "%s" criteria)) |
---|
145 | (pdicv-core-search dicinfo criteria simple-mode-p (not first-round-p)) ; clear only at the first time |
---|
146 | )) |
---|
147 | (setq first-round-p nil))))) |
---|
148 | |
---|
149 | (defun pdicv-search-interactive () |
---|
150 | (interactive) |
---|
151 | (catch 'block |
---|
152 | (let ((dicname (completing-read "Target dictionary: " pdicv-dictionary-list nil t "")) |
---|
153 | (word-to-search nil)) |
---|
154 | ; (completing-read "Target dictionary:" (mapcar 'car pdicv-dictionary-list) nil t "")) |
---|
155 | (if (null dicname) (throw 'block nil)) |
---|
156 | |
---|
157 | (setq word-to-search |
---|
158 | (read-from-minibuffer "Word to search: ")) |
---|
159 | (if (> (length word-to-search) 0) |
---|
160 | (pdicv-search (intern dicname) word-to-search)) ))) |
---|
161 | |
---|
162 | (defun pdicv-search-region (from to) |
---|
163 | "" |
---|
164 | (interactive "r") |
---|
165 | (let ((dicname (completing-read "Target dictionary: " pdicv-dictionary-list nil t ""))) |
---|
166 | (if dicname (pdicv-search (intern dicname) (buffer-substring from to))) )) |
---|
167 | |
---|
168 | (defun pdicv-set-target-dictionary () |
---|
169 | "" |
---|
170 | (interactive) |
---|
171 | (let ((dicname (completing-read "Target dictionary: " pdicv-dictionary-list nil t ""))) |
---|
172 | (if dicname (setq pdicv-target-dictionary (intern dicname))) )) |
---|
173 | |
---|
174 | (defun pdicv-search-current-word () |
---|
175 | "" |
---|
176 | (interactive) |
---|
177 | (if (null pdicv-target-dictionary) (pdicv-set-target-dictionary)) |
---|
178 | |
---|
179 | (let ((word (thing-at-point 'word))) |
---|
180 | (if word;(and word (not (nt:skipit-p word-to-search))) |
---|
181 | (pdicv-search-just pdicv-target-dictionary word) |
---|
182 | (message "no word at cursor")) )) |
---|
183 | |
---|
184 | (defun pdicv-search-next-word () |
---|
185 | "" |
---|
186 | (interactive) |
---|
187 | (if (null pdicv-target-dictionary) (pdicv-set-target-dictionary)) |
---|
188 | |
---|
189 | (forward-word 1) (forward-char) |
---|
190 | ; (pdicv-search-current-word) |
---|
191 | |
---|
192 | (let ((word (thing-at-point 'word))) |
---|
193 | (if (and word (not (nt:skipit-p word))) |
---|
194 | (pdicv-search-just pdicv-target-dictionary word) |
---|
195 | (progn |
---|
196 | (forward-word 1) (forward-char) |
---|
197 | (setq word (thing-at-point 'word)) |
---|
198 | (if (and word (not (nt:skipit-p word))) |
---|
199 | (pdicv-search-just pdicv-target-dictionary word) |
---|
200 | (message "no word at cursor")) )))) |
---|
201 | |
---|
202 | (defun pdicv-search-previous-word () |
---|
203 | "" |
---|
204 | (interactive) |
---|
205 | (forward-word -1) ; (backward-word 1) |
---|
206 | (pdicv-search-current-word)) |
---|
207 | |
---|
208 | ;;; pdicv-search.el ends here |
---|