]> git.eshelyaron.com Git - emacs.git/commitdiff
Introduce new character code property
authorKenichi Handa <handa@m17n.org>
Tue, 23 Jun 1998 00:30:05 +0000 (00:30 +0000)
committerKenichi Handa <handa@m17n.org>
Tue, 23 Jun 1998 00:30:05 +0000 (00:30 +0000)
`composition'.  Add property `jisx0208' to Japanese hankaku
characters.
(japanese-kana-table): Add more data.
(japanese-symbol-table): Change the order of elements.
(japanese-katakana-region): Adjusted for the above changes.  Check
character code properties directly here.
(japanese-hiragana-region): Likewise.
(japanese-hankaku-region): Likewise.
(japanese-zenkaku-region): Likewise.

lisp/language/japan-util.el

index 275084fbf45c042fce929175a6e30f800b33516f..16790ed7da82457b29b2e60231e708e01f686e79 100644 (file)
@@ -52,7 +52,7 @@
     (?\e$B$^\e(B ?\e$B%^\e(B ?\e(IO\e(B) (?\e$B$_\e(B ?\e$B%_\e(B ?\e(IP\e(B) (?\e$B$`\e(B ?\e$B%`\e(B ?\e(IQ\e(B) (?\e$B$a\e(B ?\e$B%a\e(B ?\e(IR\e(B) (?\e$B$b\e(B ?\e$B%b\e(B ?\e(IS\e(B)
     (?\e$B$d\e(B ?\e$B%d\e(B ?\e(IT\e(B) (?\e$B$f\e(B ?\e$B%f\e(B ?\e(IU\e(B) (?\e$B$h\e(B ?\e$B%h\e(B ?\e(IV\e(B)
     (?\e$B$i\e(B ?\e$B%i\e(B ?\e(IW\e(B) (?\e$B$j\e(B ?\e$B%j\e(B ?\e(IX\e(B) (?\e$B$k\e(B ?\e$B%k\e(B ?\e(IY\e(B) (?\e$B$l\e(B ?\e$B%l\e(B ?\e(IZ\e(B) (?\e$B$m\e(B ?\e$B%m\e(B ?\e(I[\e(B)
-    (?\e$B$o\e(B ?\e$B%o\e(B ?\e(I\\e(B) (?\e$B$p\e(B ?\e$B%p\e(B nil) (?\e$B$q\e(B ?\e$B%q\e(B nil) (?\e$B$r\e(B ?\e$B%r\e(B ?\e(I&\e(B)
+    (?\e$B$o\e(B ?\e$B%o\e(B ?\e(I\\e(B) (?\e$B$p\e(B ?\e$B%p\e(B "\e(I2\e(B") (?\e$B$q\e(B ?\e$B%q\e(B "\e(I4\e(B") (?\e$B$r\e(B ?\e$B%r\e(B ?\e(I&\e(B)
     (?\e$B$s\e(B ?\e$B%s\e(B ?\e(I]\e(B)
     (?\e$B$,\e(B ?\e$B%,\e(B "\e(I6^\e(B") (?\e$B$.\e(B ?\e$B%.\e(B "\e(I7^\e(B") (?\e$B$0\e(B ?\e$B%0\e(B "\e(I8^\e(B") (?\e$B$2\e(B ?\e$B%2\e(B "\e(I9^\e(B") (?\e$B$4\e(B ?\e$B%4\e(B "\e(I:^\e(B")
     (?\e$B$6\e(B ?\e$B%6\e(B "\e(I;^\e(B") (?\e$B$8\e(B ?\e$B%8\e(B "\e(I<^\e(B") (?\e$B$:\e(B ?\e$B%:\e(B "\e(I=^\e(B") (?\e$B$<\e(B ?\e$B%<\e(B "\e(I>^\e(B") (?\e$B$>\e(B ?\e$B%>\e(B "\e(I?^\e(B")
@@ -62,8 +62,8 @@
     (?\e$B$!\e(B ?\e$B%!\e(B ?\e(I'\e(B) (?\e$B$#\e(B ?\e$B%#\e(B ?\e(I(\e(B) (?\e$B$%\e(B ?\e$B%%\e(B ?\e(I)\e(B) (?\e$B$'\e(B ?\e$B%'\e(B ?\e(I*\e(B) (?\e$B$)\e(B ?\e$B%)\e(B ?\e(I+\e(B)
     (?\e$B$C\e(B ?\e$B%C\e(B ?\e(I/\e(B)
     (?\e$B$c\e(B ?\e$B%c\e(B ?\e(I,\e(B) (?\e$B$e\e(B ?\e$B%e\e(B ?\e(I-\e(B) (?\e$B$g\e(B ?\e$B%g\e(B ?\e(I.\e(B)
-    (?\e$B$n\e(B ?\e$B%n\e(B nil)
-    (nil ?\e$B%t\e(B "\e(I3^\e(B") (nil ?\e$B%u\e(B nil) (nil ?\e$B%v\e(B nil))
+    (?\e$B$n\e(B ?\e$B%n\e(B "\e(I\\e(B")
+    ("\e$B$&!+\e(B" ?\e$B%t\e(B "\e(I3^\e(B") (nil ?\e$B%u\e(B "\e(I6\e(B") (nil ?\e$B%v\e(B "\e(I9\e(B"))
   "Japanese JISX0208 Kana character table.
 Each element is of the form (HIRAGANA KATAKANA HANKAKU-KATAKANA), where
 HIRAGANA and KATAKANA belong to `japanese-jisx0208',
@@ -78,22 +78,32 @@ HANKAKU-KATAKANA belongs to `japanese-jisx0201-kana'.")
          hiragana (car slot) katakana (nth 1 slot) jisx0201 (nth 2 slot)
          l (cdr l))
     (if hiragana
-       (progn
+       (if (stringp hiragana)
+           (if (> (length hiragana) 1)
+               (let ((hira (aref hiragana 0)))
+                 (put-char-code-property
+                  hira 'composition
+                  (cons (cons (aref hiragana 1) katakana)
+                        (get-char-code-property hira 'composition)))))
          (put-char-code-property hiragana 'katakana katakana)
-         (put-char-code-property katakana 'hiragana hiragana)
-         (if jisx0201
-             (progn
-               (put-char-code-property hiragana 'jisx0201 jisx0201)
-               (if (integerp jisx0201)
-                   (put-char-code-property jisx0201 'hiragana hiragana))))))
+         (put-char-code-property hiragana 'jisx0201 jisx0201)))
+    (when (integerp katakana)
+      (put-char-code-property katakana 'hiragana hiragana)
+      (put-char-code-property katakana 'jisx0201 jisx0201))
     (if jisx0201
-       (progn
-         (put-char-code-property katakana 'jisx0201 jisx0201)
-         (if (integerp jisx0201)
-             (put-char-code-property jisx0201 'katakana katakana))))))
+       (if (stringp jisx0201)
+           (if (> (length jisx0201) 1)
+               (let ((kana (aref jisx0201 0)))
+                 (put-char-code-property
+                  kana 'composition
+                  (cons (cons (aref jisx0201 1) katakana)
+                        (get-char-code-property kana 'composition)))))
+         (put-char-code-property jisx0201 'hiragana hiragana)
+         (put-char-code-property jisx0201 'katakana katakana)
+         (put-char-code-property jisx0201 'jisx0208 katakana)))))
 
 (defconst japanese-symbol-table
-  '((?\\e$B!!\e(B ?\ ) (?\e$B!"\e(B ?, ?\e(I$\e(B) (?\e$B!#\e(B ?. ?\e(I!\e(B) (?\e$B!$\e(B ?, ?\e(I$\e(B) (?\e$B!%\e(B ?. ?\e(I!\e(B) (?\e$B!&\e(B nil ?\e(I%\e(B)
+  '((?\\e$B!!\e(B ?\ ) (?\e$B!$\e(B ?, ?\e(I$\e(B) (?\e$B!%\e(B ?. ?\e(I!\e(B) (?\e$B!"\e(B ?, ?\e(I$\e(B) (?\e$B!#\e(B ?. ?\e(I!\e(B) (?\e$B!&\e(B nil ?\e(I%\e(B)
     (?\e$B!'\e(B ?:) (?\e$B!(\e(B ?\;) (?\e$B!)\e(B ??) (?\e$B!*\e(B ?!) (?\e$B!+\e(B nil ?\e(I^\e(B) (?\e$B!,\e(B nil ?\e(I_\e(B)
     (?\e$B!-\e(B ?') (?\e$B!.\e(B ?`) (?\e$B!0\e(B ?^) (?\e$B!2\e(B ?_) (?\e$B!<\e(B ?-) (?\e$B!=\e(B ?-) (?\e$B!>\e(B ?-)
     (?\e$B!?\e(B ?/) (?\e$B!@\e(B ?\\) (?\e$B!A\e(B ?~)  (?\e$B!C\e(B ?|) (?\e$B!F\e(B ?`) (?\e$B!G\e(B ?') (?\e$B!H\e(B ?\") (?\e$B!I\e(B ?\")
@@ -218,27 +228,40 @@ of which charset is `japanese-jisx0201-kana'."
     (narrow-to-region from to)
     (goto-char (point-min))
     (while (re-search-forward "\\cH\\|\\cK" nil t)
-      (let* ((hira (preceding-char))
-            (kata (japanese-katakana hira hankaku)))
-       (if kata
+      (let* ((kana (preceding-char))
+            (composition (get-char-code-property kana 'composition))
+            next slot)
+       (if (and composition (setq slot (assq (following-char) composition)))
            (progn
-             (delete-region (match-beginning 0) (match-end 0))
-             (insert kata)))))))
+             (delete-region (match-beginning 0) (1+ (point)))
+             (insert (cdr slot)))
+         (let ((kata (get-char-code-property
+                      kana (if hankaku 'jisx0201 'katakana))))
+           (if kata
+               (progn
+                 (delete-region (match-beginning 0) (match-end 0))
+                 (insert kata)))))))))
 
 ;;;###autoload
 (defun japanese-hiragana-region (from to)
-  "Convert Japanese `katakana' chars in the region to `hiragana'  chars."
+  "Convert Japanese `katakana' chars in the region to `hiragana' chars."
   (interactive "r")
   (save-restriction
     (narrow-to-region from to)
     (goto-char (point-min))
     (while (re-search-forward "\\cK\\|\\ck" nil t)
       (let* ((kata (preceding-char))
-            (hira (japanese-hiragana kata)))
-       (if hira
+            (composition (get-char-code-property kata 'composition))
+            next slot)
+       (if (and composition (setq slot (assq (following-char) composition)))
            (progn
-             (delete-region (match-beginning 0) (match-end 0))
-             (insert hira)))))))
+             (delete-region (match-beginning 0) (1+ (point)))
+             (insert (get-char-code-property (cdr slot) 'hiragana)))
+         (let ((hira (get-char-code-property kata 'hiragana)))
+           (if hira
+               (progn
+                 (delete-region (match-beginning 0) (match-end 0))
+                 (insert hira)))))))))
 
 ;;;###autoload
 (defun japanese-hankaku-region (from to &optional ascii-only)
@@ -252,7 +275,9 @@ Optional argument ASCII-ONLY non-nil means to convert only to ASCII char."
     (goto-char (point-min))
     (while (re-search-forward "\\cj" nil t)
       (let* ((zenkaku (preceding-char))
-            (hankaku (japanese-hankaku zenkaku ascii-only)))
+            (hankaku (or (get-char-code-property zenkaku 'ascii)
+                         (and (not ascii-only)
+                              (get-char-code-property zenkaku 'jisx0201)))))
        (if hankaku
            (progn
              (delete-region (match-beginning 0) (match-end 0))
@@ -269,11 +294,17 @@ Optional argument ASCII-ONLY non-nil means to convert only to ASCII char."
     (goto-char (point-min))
     (while (re-search-forward "\\ca\\|\\ck" nil t)
       (let* ((hankaku (preceding-char))
-            (zenkaku (japanese-zenkaku hankaku)))
-       (if zenkaku
+            (composition (get-char-code-property hankaku 'composition))
+            next slot)
+       (if (and composition (setq slot (assq (following-char) composition)))
            (progn
-             (delete-region (match-beginning 0) (match-end 0))
-             (insert zenkaku)))))))
+             (delete-region (match-beginning 0) (1+ (point)))
+             (insert (cdr slot)))
+         (let ((zenkaku (japanese-zenkaku hankaku)))
+           (if zenkaku
+               (progn
+                 (delete-region (match-beginning 0) (match-end 0))
+                 (insert zenkaku)))))))))
 
 ;;;###autoload
 (defun read-hiragana-string (prompt &optional initial-input)