1 ;; Utility for HankakuKana (jisx0201)
3 ;; This file is part of Egg on Mule (Japanese Environment)
5 ;; Egg is distributed in the forms of patches to GNU
6 ;; Emacs under the terms of the GNU EMACS GENERAL PUBLIC
7 ;; LICENSE which is distributed along with GNU Emacs by the
8 ;; Free Software Foundation.
10 ;; Egg is distributed in the hope that it will be useful,
11 ;; but WITHOUT ANY WARRANTY; without even the implied
12 ;; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
13 ;; PURPOSE. See the GNU EMACS GENERAL PUBLIC LICENSE for
16 ;; You should have received a copy of the GNU EMACS GENERAL
17 ;; PUBLIC LICENSE along with Nemacs; see the file COPYING.
18 ;; If not, write to the Free Software Foundation, 675 Mass
19 ;; Ave, Cambridge, MA 02139, USA.
21 ;;; 92.9.24 created for Mule Ver.0.9.6 by K.Shibata <shibata@sgi.co.jp>
22 ;;; 93.8.3 modified for Mule Ver.1.1 by K.Handa <handa@etl.go.jp>
23 ;;; Not to define regexp of Japanese word in this file.
26 (provide 'egg-jisx0201)
28 (defvar *katakana-alist*
29 '(( 161 . "
\e(I'
\e(B" )
40 ( 172 . "
\e(I6^
\e(B" )
42 ( 174 . "
\e(I7^
\e(B" )
44 ( 176 . "
\e(I8^
\e(B" )
46 ( 178 . "
\e(I9^
\e(B" )
48 ( 180 . "
\e(I:^
\e(B" )
50 ( 182 . "
\e(I;^
\e(B" )
52 ( 184 . "
\e(I<^
\e(B" )
54 ( 186 . "
\e(I=^
\e(B" )
56 ( 188 . "
\e(I>^
\e(B" )
58 ( 190 . "
\e(I?^
\e(B" )
60 ( 192 . "
\e(I@^
\e(B" )
62 ( 194 . "
\e(IA^
\e(B" )
65 ( 197 . "
\e(IB^
\e(B" )
67 ( 199 . "
\e(IC^
\e(B" )
69 ( 201 . "
\e(ID^
\e(B" )
76 ( 208 . "
\e(IJ^
\e(B" )
77 ( 209 . "
\e(IJ_
\e(B" )
79 ( 211 . "
\e(IK^
\e(B" )
80 ( 212 . "
\e(IK_
\e(B" )
82 ( 214 . "
\e(IL^
\e(B" )
83 ( 215 . "
\e(IL_
\e(B" )
85 ( 217 . "
\e(IM^
\e(B" )
86 ( 218 . "
\e(IM_
\e(B" )
88 ( 220 . "
\e(IN^
\e(B" )
89 ( 221 . "
\e(IN_
\e(B" )
100 ( 232 . "
\e(IV
\e(B" )
101 ( 233 . "
\e(IW
\e(B" )
102 ( 234 . "
\e(IX
\e(B" )
103 ( 235 . "
\e(IY
\e(B" )
104 ( 236 . "
\e(IZ
\e(B" )
105 ( 237 . "
\e(I[
\e(B" )
106 ( 239 . "
\e(I\
\e(B" ) ;
\e(I\
\e(B ->
\e$B%o
\e(B
\e$B$KJQ49$9$k$h$&$K
\e(B
107 ( 238 . "
\e(I\
\e(B" ) ;
\e$B%o$H%n$N=gHV$,8r49$7$F$"$k!#
\e(B
108 ( 240 . "
\e(I(
\e(B" )
109 ( 241 . "
\e(I*
\e(B" )
110 ( 242 . "
\e(I&
\e(B" )
111 ( 243 . "
\e(I]
\e(B" )
112 ( 244 . "
\e(I3^
\e(B" )
113 ( 245 . "
\e(I6
\e(B" )
114 ( 246 . "
\e(I9
\e(B" )))
116 (defvar *katakana-kigou-alist*
117 '(( 162 . "
\e(I$
\e(B" )
118 ( 163 . "
\e(I!
\e(B" )
119 ( 166 . "
\e(I%
\e(B" )
120 ( 171 . "
\e(I^
\e(B" )
121 ( 172 . "
\e(I_
\e(B" )
122 ( 188 . "
\e(I0
\e(B" )
123 ( 214 . "
\e(I"
\e(B" )
124 ( 215 . "
\e(I#
\e(B" )))
126 (defvar *dakuon-list*
127 '( ?
\e$B%+
\e(B ?
\e$B%-
\e(B ?
\e$B%/
\e(B ?
\e$B%1
\e(B ?
\e$B%3
\e(B
128 ?
\e$B%5
\e(B ?
\e$B%7
\e(B ?
\e$B%9
\e(B ?
\e$B%;
\e(B ?
\e$B%=
\e(B
129 ?
\e$B%?
\e(B ?
\e$B%A
\e(B ?
\e$B%D
\e(B ?
\e$B%F
\e(B ?
\e$B%H
\e(B
130 ?
\e$B%O
\e(B ?
\e$B%R
\e(B ?
\e$B%U
\e(B ?
\e$B%X
\e(B ?
\e$B%[
\e(B))
132 (defvar *handakuon-list* (memq ?
\e$B%O
\e(B *dakuon-list*))
138 (defun hankaku-katakana-region (start end &optional arg)
141 (narrow-to-region start end)
142 (goto-char (point-min))
143 (let ((regexp (if arg "\\cS\\|\\cK\\|\\cH" "\\cS\\|\\cK")))
144 (while (re-search-forward regexp (point-max) (point-max))
145 (let* ((ch (char-to-int (char-before)))
149 (let ((val (cdr (assq ch2 *katakana-kigou-alist*))))
153 ((or (= 209 ch1) (= 215 ch1))
156 (let ((val (cdr (assq ch2 *katakana-alist*))))
159 (insert val)))))))))))
161 (defun hankaku-katakana-paragraph ()
162 "hankaku-katakana paragraph at or after point."
168 (hankaku-katakana-region (point) end ))))
170 (defun hankaku-katakana-sentence ()
171 "hankaku-katanaka sentence at or after point."
177 (hankaku-katakana-region (point) end ))))
179 (defun hankaku-katakana-word (arg)
181 (let ((start (point)))
183 (hankaku-katakana-region start (point))))
188 (defun search-henkan-alist (ch list)
192 (if (string= ch (cdr (car ptr)))
194 (setq result (car (car ptr)))
196 (setq ptr (cdr ptr))))
199 (defun zenkaku-katakana-region (start end)
202 (narrow-to-region start end)
203 (goto-char (point-min))
204 (while (re-search-forward "\\ck" (point-max) (point-max))
205 (let ((ch (preceding-char))
211 (setq wk (preceding-char)))
212 (cond ((= wk ?
\e$B%&
\e(B)
214 (insert "
\e$B%t
\e(B"))
215 ((setq wk (memq wk *dakuon-list*))
217 (insert (1+ (car wk))))
220 (insert "
\e$B!+
\e(B"))))
224 (setq wk (preceding-char)))
225 (if (setq wk (memq wk *handakuon-list*))
228 (insert (+ 2 (car wk))))
231 (insert "
\e$B!,
\e(B"))))
232 ((setq wk (search-henkan-alist
233 (char-to-string ch) *katakana-alist*))
236 (insert (make-char 'japanese-jisx0208 37 (- wk 128)))))
237 ((setq wk (search-henkan-alist
238 (char-to-string ch) *katakana-kigou-alist*))
241 (insert (make-char 'japanese-jisx0208 33 (- wk 128))))))))))
243 (defun zenkaku-katakana-paragraph ()
244 "zenkaku-katakana paragraph at or after point."
250 (zenkaku-katakana-region (point) end ))))
252 (defun zenkaku-katakana-sentence ()
253 "zenkaku-katakana sentence at or after point."
259 (zenkaku-katakana-region (point) end ))))
261 (defun zenkaku-katakana-word (arg)
263 (let ((start (point)))
265 (zenkaku-katakana-region start (point))))
268 ;;; JISX 0201 fence mode
271 (defun fence-hankaku-katakana ()
273 (hankaku-katakana-region egg:*region-start* egg:*region-end* t))
275 (defun fence-katakana ()
277 (zenkaku-katakana-region egg:*region-start* egg:*region-end* )
278 (japanese-katakana-region egg:*region-start* egg:*region-end*))
280 (defun fence-hiragana ()
282 (zenkaku-katakana-region egg:*region-start* egg:*region-end*)
283 (japanese-hiragana-region egg:*region-start* egg:*region-end*))
285 (define-key fence-mode-map "\ex" 'fence-hankaku-katakana)