1 ;;; ideo-trans.el --- Translation utility for Ideographic Strings
3 ;; Copyright (C) 2003,2004,2005,2008 MORIOKA Tomohiko
5 ;; Author: MORIOKA Tomohiko <tomo@kanji.zinbun.kyoto-u.ac.jp>
6 ;; Keywords: Ideographs, Character Database, Chaon, CHISE
8 ;; This file is a part of tomoyo-tools.
10 ;; This program is free software; you can redistribute it and/or
11 ;; modify it under the terms of the GNU General Public License as
12 ;; published by the Free Software Foundation; either version 2, or (at
13 ;; your option) any later version.
15 ;; This program is distributed in the hope that it will be useful, but
16 ;; WITHOUT ANY WARRANTY; without even the implied warranty of
17 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 ;; General Public License for more details.
20 ;; You should have received a copy of the GNU General Public License
21 ;; along with this program; see the file COPYING. If not, write to
22 ;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
23 ;; Boston, MA 02111-1307, USA.
27 (defun char-cns11643-p (char &optional defined-only)
30 (intern (format "=cns11643-%d" n))
34 (defun char-ks-x1001-p (char &optional defined-only)
35 (encode-char char 'korean-ksc5601 defined-only))
37 (defun find-char-variant (char predicate)
38 (if (funcall predicate char)
40 (let ((ucs (char-ucs char))
44 (char-variants (decode-char 'ucs ucs))))
46 (setq char (car variants))
47 (not (funcall predicate char)))
48 (setq variants (cdr variants))))
52 (defun char-representative-of-ucs (char)
53 "Convert CHAR into representative character of UCS."
55 (if (setq ret (char-ucs char))
56 (decode-char '=ucs ret)
60 (defun char-representative-of-domain (char domain)
61 "Convert CHAR into representative character of DOMAIN."
63 (cond ((eq domain 'daikanwa)
64 (char-representative-of-daikanwa char))
66 (char-representative-of-ucs char))
68 (if (setq ret (char-feature char '=>ucs@cns))
69 (decode-char '=ucs@cns ret)
70 (find-char-variant char 'char-cns11643-p)))
72 (if (setq ret (char-feature char '=>ucs@ks))
73 (decode-char '=ucs@ks ret)
74 (find-char-variant char 'char-ks-x1001-p)))
76 (or (char-feature char
77 (intern (format "=>ucs@%s" domain)))
79 (decode-char (intern (format "=ucs@%s" domain)) ret))
83 (defun ideo-translate-string-into-ucs (string)
84 "Convert characters in STRING into UCS-representative characters."
85 (mapconcat (lambda (char)
86 (char-to-string (char-representative-of-ucs char)))
90 (defun chinese-simplify-string (string)
91 "Simplify Chinese traditional characters in STRING."
96 (cond ((setq ret (char-feature chr '=>ucs@gb))
97 (setq chr (decode-char '=ucs@gb ret)))
98 ((setq ret (char-ucs chr))
99 (setq chr (decode-char '=ucs@gb ret))
100 (if (setq ret (char-feature chr '=>ucs*))
101 (setq chr (decode-char '=ucs@gb ret))
105 (if (setq ret (encode-char uchr 'chinese-gb12345))
106 (decode-char 'chinese-gb2312 ret)
111 (define-obsolete-function-alias
112 'ideo-translate-string-into-simplified-chinese
113 'chinese-simplify-string)
116 (define-obsolete-function-alias 'ideo-trans-simplify-chinese-string
117 'chinese-simplify-string)
120 (defun japanese-simplify-string (string)
121 "Simplify traditional Kanji characters in STRING."
126 (cond ((setq ret (char-feature chr '=>ucs@jis))
127 (setq chr (decode-char '=ucs@jis ret)))
128 ((setq ret (char-ucs chr))
129 (setq chr (decode-char '=ucs@jis ret))
130 (if (setq ret (char-feature chr '=>ucs*))
131 (setq chr (decode-char '=ucs@jis ret))
134 (setq ret (or (char-feature chr '->simplified@JP/Jouyou)
135 (char-feature chr '->simplified@JP)
136 (char-feature chr '->simplified)))
139 ((setq ret (char-feature chr '=>ucs@jis))
140 (decode-char '=ucs@jis ret))
141 ((setq ret (char-ucs chr))
142 (decode-char '=ucs@JP ret))
147 (define-obsolete-function-alias
148 'ideo-translate-string-into-simplified-japanese
149 'japanese-simplify-string)
152 (defun ideo-trans-select-char (chars &optional prefix)
158 (mapconcat (lambda (cell)
160 (format "%d. %c" i cell))
163 (while (and (setq ret (string-to-int (read-string prompt)))
165 (<= ret (length chars))))))
166 (nth (1- ret) chars)))
169 (defun chinese-traditionalize-string (string &optional selector)
170 "Convert simplified Chinese characters in STRING to traditional characters."
174 (ideo-trans-select-char chars (format "%c => " chr)))))
179 (cond ((car (char-feature chr '<-simplified))
181 (funcall selector ret)
185 (cond ((setq ret (char-feature chr '=>ucs@gb))
186 (decode-char '=ucs@gb ret))
187 ((setq ret (char-ucs chr))
188 (decode-char '=ucs@gb ret))
190 (if (setq ret (encode-char ret 'chinese-gb2312))
191 (setq ret (decode-char 'chinese-gb12345 ret))))
197 (define-obsolete-function-alias
198 'ideo-translate-chinese-string-into-traditional
199 'chinese-traditionalize-string)
202 (defun japanese-traditionalize-string (string &optional selector)
203 "Convert simplified Kanji in STRING into traditional characters."
207 (ideo-trans-select-char chars (format "%c => " chr)))))
212 (cond ((setq ret (or (char-feature chr '<-simplified@JP/Jouyou)
213 (char-feature chr '<-simplified@JP)
214 (char-feature chr '<-simplified)))
216 (funcall selector ret)
220 (cond ((setq ret (char-feature chr '=>ucs@jis))
221 (decode-char '=ucs@jis ret))
222 ((setq ret (char-ucs chr))
223 (decode-char '=ucs@JP ret))
225 (setq ret (or (char-feature ret '<-simplified@JP/Jouyou)
226 (char-feature ret '<-simplified@JP))))
228 (ideo-trans-select-char ret (format "%c => " chr))
230 ((setq ret (char-feature chr '=>ucs@jis))
231 (decode-char '=ucs@jis ret))
232 ((setq ret (char-ucs chr))
233 (decode-char '=ucs@JP ret))
238 (define-obsolete-function-alias
239 'ideo-translate-japanese-string-into-traditional
240 'japanese-traditionalize-string)
243 (defun japanese-traditionalize-region (start end)
247 (narrow-to-region start end)
250 (while (and (skip-chars-forward "\x00-\xFF")
252 (setq chr (char-after))
253 (if (setq ret (or (char-feature chr '<-simplified@JP/Jouyou)
254 (char-feature chr '<-simplified@jp-jouyou)
255 (char-feature chr '<-simplified@JP)
256 (char-feature chr '<-simplified@jp)
257 (char-feature chr '<-jp-simplified)
258 (char-feature chr '<-simplified)))
262 (setq rret (ideo-trans-select-char ret))
268 (forward-char))))))))
271 (defun japanese-simplify-region (start end)
275 (narrow-to-region start end)
278 (while (and (skip-chars-forward "\x00-\xFF")
280 (setq chr (char-after))
281 (if (setq ret (or (char-feature chr '->simplified@JP/Jouyou)
282 (char-feature chr '->simplified@jp-jouyou)
283 (char-feature chr '->simplified@JP)
284 (char-feature chr '->simplified@jp)
285 (char-feature chr '->jp-simplified)
286 (char-feature chr '->simplified)))
290 (setq rret (ideo-trans-select-char ret))
296 (forward-char))))))))
299 (define-obsolete-function-alias
300 'ideo-translate-japanese-region-into-traditional
301 'japanese-traditionalize-region)
304 (define-obsolete-function-alias
305 'ideo-translate-region-into-traditional
306 'japanese-traditionalize-region)
312 (provide 'ideo-trans)
314 ;;; ideo-trans.el ends here