Initial Commit
[packages] / mule-packages / skk / skk-kakasi.el
1 ;;; skk-kakasi.el --- KAKASI \e$B4XO"%W%m%0%i%`\e(B
2 ;; Copyright (C) 1996, 1998, 1999 Mikio Nakajima <minakaji@osaka.email.ne.jp>
3
4 ;; Author: Mikio Nakajima <minakaji@osaka.email.ne.jp>
5 ;; Version: $Id: skk-kakasi.el,v 1.3 2000-11-08 01:51:44 youngs Exp $
6 ;; Keywords: japanese
7 ;; Last Modified: $Date: 2000-11-08 01:51:44 $
8
9 ;; This file is not part of SKK yet.
10
11 ;; SKK is free software; you can redistribute it and/or modify
12 ;; it under the terms of the GNU General Public License as published by
13 ;; the Free Software Foundation; either versions 2, or (at your option)
14 ;; any later version.
15
16 ;; SKK is distributed in the hope that it will be useful
17 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
18 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19 ;; GNU General Public License for more details.
20
21 ;; You should have received a copy of the GNU General Public License
22 ;; along with SKK, see the file COPYING.  If not, write to the Free
23 ;; Software Foundation Inc., 59 Temple Place - Suite 330, Boston,
24 ;; MA 02111-1307, USA.
25
26 ;;; Commentary:
27
28 ;; skk-kakasi.el \e$B$O\e(B KAKASI \e$B$r\e(B SKK \e$B$NCf$+$i;H$&%$%s%?!<%U%'%$%9$G$9!#\e(BKAKASI \e$B$O!"\e(B
29 ;; \e$B9b66M5?.$5$s\e(B <takahasi@tiny.or.jp> \e$B$K$h$k!"!V4A;z$+$J$^$8$jJ8$r$R$i$,$JJ8$d\e(B
30 ;; \e$B%m!<%^;zJ8$KJQ49$9$k$3$H$rL\E*$H$7$F:n@.$7$?%W%m%0%i%`$H<-=q$NAm>N!W$G$9!#\e(B
31 ;; \e$B;d<+?H$,%K%e!<%9$d%a!<%k$rFI$s$G$$$F!"F|>oFI$_$,J,$i$J$/$FCQ$:$+$7$$;W$$$r\e(B
32 ;; \e$B$9$k$3$H$,B?$$$N$G!"5U0z$-$r$7$?$/$F:n$j$^$7$?!#\e(B
33 ;;
34 ;; KAKASI \e$B$O!"\e(B1996 \e$BG/\e(B 4 \e$B7n\e(B 25 \e$BF|8=:_!"\e(B
35 ;; sunsite.sut.ac.jp:/pub/asia-info/japanese-src/packages/kakasi-2.2.5.tar.gz
36 ;; sunsite.sut.ac.jp:/pub/asia-info/japanese-src/packages/kakasidict.940620.gz
37 ;; \e$B$K$"$j\e(B anonymous ftp \e$B$GF~<j$G$-$^$9!#\e(B
38 ;;
39 ;; \e$BAG@2$7$$%W%m%0%i%`\e(B KAKASI \e$B$r$*:n$j$K$J$C$?9b66$5$s$H!"\e(BKAKASI \e$B$r\e(B anonymous
40 ;; ftp \e$B$GF~<j2DG=$H$7$F$$$k\e(B sunsite.sut.ac.jp \e$B$K46<U$$$?$7$^$9!#\e(B
41
42 ;;; Code:
43 (require 'skk)
44 (require 'skk-foreword)
45 ;; APEL
46 (require 'path-util)
47
48 ;;;###autoload
49 (defgroup skk-kakasi nil "SKK kakasi related customization."
50   :prefix "skk-"
51   :group 'skk )
52
53 ;;;;  VARIABLES
54
55 ;; --- user variable
56
57 (defcustom skk-use-kakasi (exec-installed-p "kakasi")
58   "*Non-nil \e$B$G$"$l$P\e(B KAKASI \e$B$r;H$C$?JQ49$r9T$J$&!#\e(B" 
59   :type 'boolean
60   :group 'skk-kakasi )
61
62 (defcustom skk-kakasi-command (exec-installed-p "kakasi")
63   "*KAKASI \e$B%3%^%s%IK\BN!#\e(B"
64   :type 'file
65   :group 'skk-kakasi )
66
67 (defcustom skk-romaji-*-by-hepburn t
68   "*Non-nil \e$B$G$"$l$P\e(B KAKASI \e$B$r;H$C$?%m!<%^;z$X$NJQ49MM<0$K%X%\%s<0$rMQ$$$k!#\e(B
69 \e$BNc$($P!"\e(B
70   \"\e$B$7\e(B\" -> \"shi\"
71
72 nil \e$B$G$"$l$P!"71Na<0\e(B \"(\e$B!VF|K\<0!W$H$b8@$&$h$&$@\e(B)\" \e$B$rMQ$$$k!#\e(B
73 \e$BNc$($P!"\e(B
74    \"\e$B$7\e(B\" -> \"si\"
75
76 \e$B><OB\e(B 29 \e$BG/\e(B 12 \e$B7n\e(B 9 \e$BF|IUFb3U9p<(Bh0l9f$K$h$l$P!"86B'E*$K71Na<0\e(B \"(\e$BF|K\<0\e(B)\" \e$B$r\e(B
77 \e$BMQ$$$k$+$N$h$&$K5-:\$5$l$F$$$k$,!":#F|0lHLE*$J5-:\J}K!$O!"$`$7$m!"%X%\%s<0$G$"\e(B
78 \e$B$k$h$&$K;W$&!#\e(B"
79   :type 'boolean
80   :group 'skk-kakasi )
81
82 (defcustom skk-kakasi-load-hook nil
83   "*skk-kakasi.el \e$B$,%m!<%I$5$l$?$H$-$N%U%C%/!#\e(B"
84   :type 'hook
85   :group 'skk-kakasi )
86
87 (if (fboundp 'modify-coding-system-alist)
88     (let ((euc (cdr (assoc "euc" skk-coding-system-alist))))
89       (modify-coding-system-alist 'process "kakasi" (cons euc euc)) ))
90
91 ;;;; FUNCTIONS
92 ;;;###autoload
93 (defun skk-gyakubiki-region (start end &optional all)
94   "\e$B%j!<%8%g%s$N4A;z!"Aw$j2>L>$rA4$F$R$i$,$J$KJQ49$9$k!#\e(B
95 \e$B%*%W%7%g%J%k0z?t$N\e(B ALL \e$B$,\e(B non-nil \e$B$J$i$P!"J#?t$N8uJd$,$"$k>l9g$O!"\e(B\"{}\" \e$B$G$/\e(B
96 \e$B$/$C$FI=<($9$k!#\e(B
97 \e$BNc$($P!"\e(B
98     \e$BCfEg\e(B -> {\e$B$J$+$7$^\e(B|\e$B$J$+$8$^\e(B}"
99   (interactive "*r\nP")
100   (let ((str (skk-gyakubiki-1 start end all)))
101     (delete-region start end)
102     (goto-char start)
103     (insert-and-inherit str) )
104   (and (featurep 'skk-cursor)
105    (skk-set-cursor-properly)) )
106
107 ;;;###autoload
108 (defun skk-gyakubiki-message (start end &optional all)
109   "\e$B%j!<%8%g%s$N4A;z!"Aw$j2>L>$rA4$F$R$i$,$J$KJQ498e!"%(%3!<$9$k!#\e(B
110 \e$B%*%W%7%g%J%k0z?t$N\e(B ALL \e$B$,\e(B non-nil \e$B$J$i$P!"J#?t$N8uJd$,$"$k>l9g$O!"\e(B\"{}\" \e$B$G$/\e(B
111 \e$B$/$C$FI=<($9$k!#\e(B
112 \e$BNc$($P!"\e(B
113     \e$BCfEg\e(B -> {\e$B$J$+$7$^\e(B|\e$B$J$+$8$^\e(B}"
114   (interactive "r\nP")
115   (let ((str (skk-gyakubiki-1 start end all)))
116     (save-match-data
117       (if (string-match "^[ \e$B!!\e(B\t]+" str)
118           ;; \e$B@hF,$N6uGr$r<h$j=|$/!#\e(B
119           (setq str (substring str (match-end 0))) ))
120     (message "%s" str)
121     (and (featurep 'skk-cursor)
122      (skk-set-cursor-properly)) ))
123
124
125 ;;;###autoload
126 (defun skk-gyakubiki-katakana-region (start end &optional all)
127   "\e$B%j!<%8%g%s$N4A;z!"Aw$j2>L>$rA4$F%+%?%+%J$KJQ49$9$k!#\e(B
128 \e$B%*%W%7%g%J%k0z?t$N\e(B ALL \e$B$,\e(B non-nil \e$B$J$i$P!"J#?t$N8uJd$,$"$k>l9g$O!"\e(B\"{}\" \e$B$G$/\e(B
129 \e$B$/$C$FI=<($9$k!#\e(B
130 \e$BNc$($P!"\e(B
131     \e$BCfEg\e(B -> {\e$B%J%+%7%^\e(B|\e$B%J%+%8%^\e(B}"
132   (interactive "*r\P")
133   (let ((str (skk-gyakubiki-1 start end all 'katakana)))
134     (delete-region start end)
135     (goto-char start)
136     (insert-and-inherit str) )
137   (and (featurep 'skk-cursor)
138    (skk-set-cursor-properly)) )
139
140 ;;;###autoload
141 (defun skk-gyakubiki-katakana-message (start end &optional all)
142   "\e$B%j!<%8%g%s$N4A;z!"Aw$j2>L>$rA4$F%+%?%+%J$KJQ498e!"%(%3!<$9$k!#\e(B
143 \e$B%*%W%7%g%J%k0z?t$N\e(B ALL \e$B$,\e(B non-nil \e$B$J$i$P!"J#?t$N8uJd$,$"$k>l9g$O!"\e(B\"{}\" \e$B$G$/\e(B
144 \e$B$/$C$FI=<($9$k!#\e(B
145 \e$BNc$($P!"\e(B
146     \e$BCfEg\e(B -> {\e$B%J%+%7%^\e(B|\e$B%J%+%8%^\e(B}"
147   (interactive "r\nP")
148   (let ((str (skk-gyakubiki-1 start end all 'katakana)))
149     (save-match-data
150       (if (string-match "^[ \e$B!!\e(B\t]+" str)
151           ;; \e$B@hF,$N6uGr$r<h$j=|$/!#\e(B
152           (setq str (substring str (match-end 0))) ))
153     (message "%s" str)
154     (and (featurep 'skk-cursor)
155      (skk-set-cursor-properly)) ))
156
157 (defun skk-gyakubiki-1 (start end all &optional katakana)
158   ;; skk-gyakubiki-* \e$B$N%5%V%k!<%A%s!#\e(B
159   ;; \e$B%*%W%7%g%J%k0z?t$N\e(B KATAKANA \e$B$,\e(B non-nil \e$B$G$"$l$P!"%+%?%+%J$XJQ49$9$k!#\e(B
160   (let ((arg (if katakana '("-JK") '("-JH"))))
161     (if skk-allow-spaces-newlines-and-tabs
162         (setq arg (cons "-c" arg)) )
163     (if all
164         (setq arg (cons "-p" arg)) )
165     (skk-kakasi-region start end arg)) )
166
167 ;;;###autoload
168 (defun skk-hurigana-region (start end &optional all)
169   "\e$B%j!<%8%g%s$N4A;z$KA4$F$U$j$,$J$rIU$1$k!#\e(B
170 \e$BNc$($P!"\e(B
171    \"\e$BJQ49A0$N4A;z$NOF$K\e(B\" -> \"\e$BJQ49A0\e(B[\e$B$X$s$+$s$^$(\e(B]\e$B$N4A;z\e(B[\e$B$+$s$8\e(B]\e$B$NOF\e(B[\e$B$o$-\e(B]\e$B$K\e(B\"
172
173 \e$B%*%W%7%g%J%k0z?t$N\e(B ALL \e$B$,\e(B non-nil \e$B$J$i$P!"J#?t$N8uJd$,$"$k>l9g$O!"\e(B\"{}\" \e$B$G$/\e(B
174 \e$B$/$C$FI=<($9$k!#\e(B
175 \e$BNc$($P!"\e(B
176     \e$BCfEg\e(B -> {\e$B$J$+$7$^\e(B|\e$B$J$+$8$^\e(B}"
177   (interactive "*r\nP")
178   (let ((str (skk-hurigana-1 start end all)))
179     (delete-region start end)
180     (goto-char start)
181     (insert-and-inherit str) )
182   (and (featurep 'skk-cursor)
183    (skk-set-cursor-properly)) )
184
185 ;;;###autoload
186 (defun skk-hurigana-message (start end &optional all)
187   "\e$B%j!<%8%g%s$N4A;z$KA4$F$U$j$,$J$rIU$1!"%(%3!<$9$k!#\e(B
188 \e$BNc$($P!"\e(B
189    \"\e$BJQ49A0$N4A;z$NOF$K\e(B\" -> \"\e$BJQ49A0\e(B[\e$B$X$s$+$s$^$(\e(B]\e$B$N4A;z\e(B[\e$B$+$s$8\e(B]\e$B$NOF\e(B[\e$B$o$-\e(B]\e$B$K\e(B\"
190
191 \e$B%*%W%7%g%J%k0z?t$N\e(B ALL \e$B$,\e(B non-nil \e$B$J$i$P!"J#?t$N8uJd$,$"$k>l9g$O!"\e(B\"{}\" \e$B$G$/\e(B
192 \e$B$/$C$FI=<($9$k!#\e(B
193 \e$BNc$($P!"\e(B
194     \e$BCfEg\e(B -> {\e$B$J$+$7$^\e(B|\e$B$J$+$8$^\e(B}"
195   (interactive "r\nP")
196   (message "%s" (skk-hurigana-1 start end all))
197   (and (featurep 'skk-cursor)
198    (skk-set-cursor-properly)) )
199
200 ;;;###autoload
201 (defun skk-hurigana-katakana-region (start end &optional all)
202   "\e$B%j!<%8%g%s$N4A;z$KA4$F%U%j%,%J$rIU$1$k!#\e(B
203 \e$BNc$($P!"\e(B
204    \"\e$BJQ49A0$N4A;z$NOF$K\e(B\" -> \"\e$BJQ49A0\e(B[\e$B%X%s%+%s%^%(\e(B]\e$B$N4A;z\e(B[\e$B%+%s%8\e(B]\e$B$NOF\e(B[\e$B%o%-\e(B]\e$B$K\e(B\"
205
206 \e$B%*%W%7%g%J%k0z?t$N\e(B ALL \e$B$,\e(B non-nil \e$B$J$i$P!"J#?t$N8uJd$,$"$k>l9g$O!"\e(B\"{}\" \e$B$G$/\e(B
207 \e$B$/$C$FI=<($9$k!#\e(B
208 \e$BNc$($P!"\e(B
209     \e$BCfEg\e(B -> {\e$B%J%+%7%^\e(B|\e$B%J%+%8%^\e(B}"
210   (interactive "*r\nP")
211   (let ((str (skk-hurigana-1 start end all 'katakana)))
212     (delete-region start end)
213     (goto-char start)
214     (insert-and-inherit str) )
215   (and (featurep 'skk-cursor)
216    (skk-set-cursor-properly)) )
217
218 ;;;###autoload
219 (defun skk-hurigana-katakana-message (start end &optional all)
220   "\e$B%j!<%8%g%s$N4A;z$KA4$F%U%j%,%J$rIU$1!"%(%3!<$9$k!#\e(B
221 \e$BNc$($P!"\e(B
222    \"\e$BJQ49A0$N4A;z$NOF$K\e(B\" -> \"\e$BJQ49A0\e(B[\e$B%X%s%+%s%^%(\e(B]\e$B$N4A;z\e(B[\e$B%+%s%8\e(B]\e$B$NOF\e(B[\e$B%o%-\e(B]\e$B$K\e(B\"
223
224 \e$B%*%W%7%g%J%k0z?t$N\e(B ALL \e$B$,\e(B non-nil \e$B$J$i$P!"J#?t$N8uJd$,$"$k>l9g$O!"\e(B\"{}\" \e$B$G$/\e(B
225 \e$B$/$C$FI=<($9$k!#\e(B
226 \e$BNc$($P!"\e(B
227     \e$BCfEg\e(B -> {\e$B%J%+%7%^\e(B|\e$B%J%+%8%^\e(B}"
228   (interactive "r\nP")
229   (message "%s" (skk-hurigana-1 start end all 'katakana))
230   (and (featurep 'skk-cursor)
231    (skk-set-cursor-properly)) )
232
233 (defun skk-hurigana-1 (start end all &optional katakana)
234   ;; skk-hurigana-* \e$B$N%5%V%k!<%A%s!#\e(B
235   ;; \e$B%*%W%7%g%J%k0z?t$N\e(B KATAKANA \e$B$,\e(B non-nil \e$B$G$"$l$P!"%+%?%+%J$XJQ49$9$k!#\e(B
236   (let ((arg (if katakana '("-JK" "-f") '("-JH" "-f"))))
237     (if skk-allow-spaces-newlines-and-tabs
238         (setq arg (cons "-c" arg)) )
239     (if all
240         (setq arg (cons "-p" arg)) )
241     (skk-kakasi-region start end arg)) )
242
243 ;;;###autoload
244 (defun skk-romaji-region (start end)
245   "\e$B%j!<%8%g%s$N4A;z!"$R$i$,$J!"%+%?%+%J!"A41QJ8;z$rA4$F%m!<%^;z$KJQ49$9$k!#\e(B
246 \e$BJQ49$K$O!"%X%\%s<0$rMQ$$$k!#\e(B
247 \e$BNc$($P!"\e(B
248    \"\e$B4A;z$+$J:.$8$jJ8$r%m!<%^;z$KJQ49\e(B\"
249     -> \"  kan'zi  kana  ma  ziri  bun'  woro-ma  zi ni hen'kan' \"
250
251 skk-romaji-*-by-hepburn \e$B$,\e(B nil \e$B$G$"$l$P!"%m!<%^;z$X$NJQ49MM<0$r71Na<0$KJQ99$9\e(B
252 \e$B$k!#Nc$($P!"\e(B\"\e$B$7\e(B\" \e$B$O%X%\%s<0$G$O\e(B \"shi\" \e$B$@$,!"71Na<0$G$O\e(B \"si\" \e$B$H$J$k!#\e(B"
253   (interactive "*r")
254   (let ((arg '("-Ha" "-Ka" "-Ja" "-Ea" "-ka" "-s"))
255         str )
256     (if skk-allow-spaces-newlines-and-tabs
257         (setq arg (cons "-c" arg)) )
258     (if (not skk-romaji-*-by-hepburn)
259         (setq arg (cons "-rk" arg)) )
260     (setq str (skk-kakasi-region start end arg))
261     (delete-region start end)
262     (goto-char start)
263     (insert-and-inherit str) )
264   (and (featurep 'skk-cursor)
265    (skk-set-cursor-properly)) )
266
267 ;;;###autoload
268 (defun skk-romaji-message (start end)
269   "\e$B%j!<%8%g%s$N4A;z!"$R$i$,$J!"%+%?%+%J!"A41QJ8;z$rA4$F%m!<%^;z$KJQ49$7!"%(%3!<$9$k!#\e(B
270 \e$BJQ49$K$O!"%X%\%s<0$rMQ$$$k!#\e(B
271 \e$BNc$($P!"\e(B
272    \"\e$B4A;z$+$J:.$8$jJ8$r%m!<%^;z$KJQ49\e(B\"
273     -> \"  kan'zi  kana  ma  ziri  bun'  woro-ma  zi ni hen'kan' \"
274
275 skk-romaji-*-by-hepburn \e$B$,\e(B nil \e$B$G$"$l$P!"%m!<%^;z$X$NJQ49MM<0$r71Na<0$KJQ99$9\e(B
276 \e$B$k!#Nc$($P!"\e(B\"\e$B$7\e(B\" \e$B$O%X%\%s<0$G$O\e(B \"shi\" \e$B$@$,!"71Na<0$G$O\e(B \"si\" \e$B$H$J$k!#\e(B"
277   (interactive "r")
278   (let ((arg '("-Ha" "-Ka" "-Ja" "-Ea" "-ka" "-s")))
279     (if skk-allow-spaces-newlines-and-tabs
280         (setq arg (cons "-c" arg)) )
281     (if (not skk-romaji-*-by-hepburn)
282         (setq arg (cons "-rk" arg)) )
283     (message "%s" (skk-kakasi-region start end arg))
284     (and (featurep 'skk-cursor)
285      (skk-set-cursor-properly)) ))
286
287 (defun skk-kakasi-region (start end arglist)
288   ;; START \e$B$H\e(B END \e$B4V$N%j!<%8%g%s$KBP$7\e(B kakasi \e$B%3%^%s%I$rE,MQ$9$k!#\e(BARGLIST \e$B$r\e(B
289   ;; kakasi \e$B$N0z?t$H$7$FEO$9!#\e(Bkakasi \e$B$N=PNO$rJV$9!#\e(B
290   (or skk-use-kakasi skk-kakasi-command
291       (skk-error "KAKASI \e$B$,%$%s%9%H!<%k$5$l$F$$$J$$$+!";HMQ$7$J$$@_Dj$K$J$C$F$$$^$9!#\e(B"
292                  "KAKASI was not installed, or skk-use-kakasi is nil" ) )
293   (let ((str (buffer-substring-no-properties start end)))
294         ;; \e$BIQEY>pJs$r;H$C$F2?$+$*$b$7$m$$;H$$J}$,$G$-$k$+$J!)\e(B  \e$B8=>u$G$O;H$C$F\e(B
295         ;; \e$B$$$J$$!#\e(B
296         ;;(hindo-file (skk-make-temp-file "skkKKS"))
297     (with-temp-buffer
298       ;; current buffer \e$B$,\e(B read-only \e$B$N$H$-$K\e(B current buffer \e$B$G\e(B call-process
299       ;; \e$B$r8F$V$H\e(B destination buffer \e$B$rJL$K;XDj$7$F$$$F$b%(%i!<$K$J$k$N$G!"%j!<\e(B
300       ;; \e$B%8%g%s$NJ8;zNs$r%o!<%/%P%C%U%!$KB`Hr$9$k!#\e(B
301       (insert str)
302       (if (and (eq (apply 'call-process-region (point-min) (point)
303                           skk-kakasi-command
304                           ;; kakasi-2.2.5.hindo.diff \e$B$,Ev$C$F$$$k$HI8=`%(%i!<\e(B
305                           ;; \e$B=PNO$KIQEY>pJs$,=PNO$5$l$k!#\e(B
306                           'delete-original-text
307                           ;;(list t hindo-file)
308                           '(t nil)
309                           nil arglist )
310                    0 )
311                (> (buffer-size) 0) )
312           (buffer-string)
313         (skk-error "\e$BJQ49$G$-$^$;$s\e(B" "Cannot convert!") ))))
314
315 (run-hooks 'skk-kakasi-load-hook)
316 (provide 'skk-kakasi)
317 ;;; skk-kakasi.el ends here