egg-980315.
[elisp/egg.git] / its / hangul.el
index a37f32e..888c434 100644 (file)
@@ -1,15 +1,45 @@
+;;; its/hangul.el --- Hangul Input in Egg Input Method Architecture
+
+;; Copyright (C) 1997, 1998 Mule Project,
+;; Powered by Electrotechnical Laboratory, JAPAN.
+;; Project Leader: Satoru Tomura <tomura@etl.go.jp>
+
+;; Author: NIIBE Yutaka <gniibe@mri.co.jp>
+;;         KATAYAMA Yoshio <kate@pfu.co.jp>
+
+;; This file will be part of GNU Emacs (in future).
+
+;; GNU Emacs is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2, or (at your option)
+;; any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+
+;;; Code:
+
 (eval-when-compile
   (require 'its)
   (require 'cl))
 
+(defvar its-hangul-enable-jeonkak-alphabet t "*Enable Jeonkak alphabet")
+(defvar        its-hangul-period ". " "*\e$(C#.\e(B")    ; ". " "\e$(C#.\e(B"
+(defvar        its-hangul-comma  ", " "*\e$(C#,\e(B")    ; ", " "\e$(C#,\e(B"
 (defvar its-hangul-open-bracket  "\e$(C!8\e(B" "*[")  ; "\e$(C#[\e(B"
-(defvar its-hangul-close-bracket  "\e$(C!9\e(B" "*]") ; "\e$(C#]\e(B"
+(defvar its-hangul-close-bracket "\e$(C!9\e(B" "*]")  ; "\e$(C#]\e(B"
 
 (eval-when-compile
-
- (defvar its-jeonkak-escape "J")
- (defvar its-pankak-escape  "B")
-
  (defconst its-hangul-kijuhynbmlopOP
    (its-make-class+back "[kijuhynbmlopOP]" -2))
  (defconst its-hangul-kijuhynbmlopP
      (its-defrule-otherwise state output))))
 
 (define-its-state-machine its-hangul-map
-  "hangul" "\e$(CGQ\e(B" "korean"
+  "hangul" "\e$(CGQ\e(B" "Korean"
   "Map for Hangul input. (Korean)"
+
+  (defconst its-jeonkak-escape "Z")
+  (defconst its-pankak-escape  "X")
+
+  (its-defrule-select-mode-temporally "B" downcase)
+  (its-defrule-select-mode-temporally "J" jeonkak-downcase)
+
   (its-defrule-hangul  "r"     "\e$(C$!\e(B")
   (its-defrule-hangul  "s"     "\e$(C$$\e(B")
   (its-defrule-hangul  "e"     "\e$(C$'\e(B")
     (its-define-hangul "glt"   "\e$(CH}\e(B"     kijuhynbmlopOP)
     (its-define-hangul "gld"   "\e$(CH~\e(B"     kijuhynbmlopOP))
 
-  ;;; Jeonkak Symbols
-
-  (its-defrule   "1"   "\e$(C#1\e(B")
-  (its-defrule   "2"   "\e$(C#2\e(B")
-  (its-defrule   "3"   "\e$(C#3\e(B")
-  (its-defrule   "4"   "\e$(C#4\e(B")
-  (its-defrule   "5"   "\e$(C#5\e(B")
-  (its-defrule   "6"   "\e$(C#6\e(B")
-  (its-defrule   "7"   "\e$(C#7\e(B")
-  (its-defrule   "8"   "\e$(C#8\e(B")
-  (its-defrule   "9"   "\e$(C#9\e(B")
-  (its-defrule   "0"   "\e$(C#0\e(B")
-
-  ;;(its-defrule   " "   "\e$(C!!\e(B")
-  (its-defrule   "!"   "\e$(C#!\e(B")
-  (its-defrule   "@"   "\e$(C#@\e(B")
-  (its-defrule   "#"   "\e$(C##\e(B")
-  (its-defrule   "$"   "\e$(C#$\e(B")
-  (its-defrule   "%"   "\e$(C#%\e(B")
-  (its-defrule   "^"   "\e$(C#^\e(B")
-  (its-defrule   "&"   "\e$(C#&\e(B")
-  (its-defrule   "*"   "\e$(C#*\e(B")
-  (its-defrule   "("   "\e$(C#(\e(B")
-  (its-defrule   ")"   "\e$(C#)\e(B")
-  (its-defrule   "-"   "\e$(C#-\e(B")
-  (its-defrule   "="   "\e$(C#=\e(B")
-  (its-defrule   "`"   "\e$(C#`\e(B")
-  (its-defrule   "\\"  "\e$(C#\\e(B")
-  (its-defrule   "|"   "\e$(C#|\e(B")
-  (its-defrule   "_"   "\e$(C#_\e(B")
-  (its-defrule   "+"   "\e$(C#+\e(B")
-  (its-defrule   "~"   "\e$(C#~\e(B")
-  (its-defrule   "["   "\e$(C!8\e(B");;(its-defrule   "["   "\e$(C#[\e(B")
-  (its-defrule   "]"   "\e$(C!9\e(B");;(its-defrule   "]"   "\e$(C#]\e(B")
-  (its-defrule   "{"   "\e$(C#{\e(B")
-  (its-defrule   "}"   "\e$(C#}\e(B")
-  (its-defrule   ":"   "\e$(C#:\e(B")
-  (its-defrule   ";"   "\e$(C#;\e(B")
-  (its-defrule   "\""  "\e$(C#"\e(B")
-  (its-defrule   "'"   "\e$(C#'\e(B")
-  (its-defrule   "<"   "\e$(C#<\e(B")
-  (its-defrule   ">"   "\e$(C#>\e(B")
-  (its-defrule   "?"   "\e$(C#?\e(B")
-  (its-defrule   "/"   "\e$(C#/\e(B")
-  (its-defrule   ","   "\e$(C#,\e(B")
-  (its-defrule   "."   "\e$(C#.\e(B")
-
-  (its-defrule (concat its-jeonkak-escape " ") "\e$(C!!\e(B")
-  (let ((i ?!))
-    (while (<= i ?~)
-      (its-defrule (concat its-jeonkak-escape (char-to-string i))
-                  (char-to-string (+ (- ?\e$(C#!\e(B ?!) i)))
-      (setq i (1+ i))))
-
-  ;;; pankak 
-  (let ((i ?!))
-    (while (<= i ?~)
-      (its-defrule (concat its-pankak-escape (char-to-string i))
-                  (char-to-string i))
-       (setq i (1+ i)))))
+  (dolist (ascii '(("1" . "\e$(C#1\e(B")  ("2" . "\e$(C#2\e(B")  ("3" . "\e$(C#3\e(B")  ("4" . "\e$(C#4\e(B")
+                  ("5" . "\e$(C#5\e(B")  ("6" . "\e$(C#6\e(B")  ("7" . "\e$(C#7\e(B")  ("8" . "\e$(C#8\e(B")
+                  ("9" . "\e$(C#9\e(B")  ("0" . "\e$(C#0\e(B")
+                  (" " . "\e$(C!!\e(B")  ("!" . "\e$(C#!\e(B")  ("@" . "\e$(C#@\e(B")  ("#" . "\e$(C##\e(B")
+                  ("$" . "\e$(C#$\e(B")  ("%" . "\e$(C#%\e(B")  ("^" . "\e$(C#^\e(B")  ("&" . "\e$(C#&\e(B")
+                  ("*" . "\e$(C#*\e(B")  ("(" . "\e$(C#(\e(B")  (")" . "\e$(C#)\e(B")
+                  ("-" . "\e$(C#-\e(B")  ("=" . "\e$(C#=\e(B")  ("`" . "\e$(C#`\e(B")  ("\\" . "\e$(C#\\e(B")
+                  ("|" . "\e$(C#|\e(B")  ("_" . "\e$(C#_\e(B")  ("+" . "\e$(C#+\e(B")  ("~" . "\e$(C#~\e(B")
+                  ("[" . "\e$(C!8\e(B")  ("]" . "\e$(C!9\e(B")  ("{" . "\e$(C#{\e(B")  ("}" . "\e$(C#}\e(B")
+                  (":" . "\e$(C#:\e(B")  (";" . "\e$(C#;\e(B")  ("\"" . "\e$(C#"\e(B") ("'" . "\e$(C#'\e(B")
+                  ("<" . "\e$(C#<\e(B")  (">" . "\e$(C#>\e(B")  ("?" . "\e$(C#?\e(B")  ("/" . "\e$(C#/\e(B")
+                  ("," . "\e$(C#,\e(B")  ("." . "\e$(C#.\e(B")
+                  ("a" . "\e$(C#a\e(B")  ("b" . "\e$(C#b\e(B")  ("c" . "\e$(C#c\e(B")  ("d" . "\e$(C#d\e(B")
+                  ("e" . "\e$(C#e\e(B")  ("f" . "\e$(C#f\e(B")  ("g" . "\e$(C#g\e(B")  ("h" . "\e$(C#h\e(B")
+                  ("i" . "\e$(C#i\e(B")  ("j" . "\e$(C#j\e(B")  ("k" . "\e$(C#k\e(B")  ("l" . "\e$(C#l\e(B")
+                  ("m" . "\e$(C#m\e(B")  ("n" . "\e$(C#n\e(B")  ("o" . "\e$(C#o\e(B")  ("p" . "\e$(C#p\e(B")
+                  ("q" . "\e$(C#q\e(B")  ("r" . "\e$(C#r\e(B")  ("s" . "\e$(C#s\e(B")  ("t" . "\e$(C#t\e(B")
+                  ("u" . "\e$(C#u\e(B")  ("v" . "\e$(C#v\e(B")  ("w" . "\e$(C#w\e(B")  ("x" . "\e$(C#x\e(B")
+                  ("y" . "\e$(C#y\e(B")  ("z" . "\e$(C#z\e(B")
+                  ("A" . "\e$(C#A\e(B")  ("B" . "\e$(C#B\e(B")  ("C" . "\e$(C#C\e(B")  ("D" . "\e$(C#D\e(B")
+                  ("E" . "\e$(C#E\e(B")  ("F" . "\e$(C#F\e(B")  ("G" . "\e$(C#G\e(B")  ("H" . "\e$(C#H\e(B")
+                  ("I" . "\e$(C#I\e(B")  ("J" . "\e$(C#J\e(B")  ("K" . "\e$(C#K\e(B")  ("L" . "\e$(C#L\e(B")
+                  ("M" . "\e$(C#M\e(B")  ("N" . "\e$(C#N\e(B")  ("O" . "\e$(C#O\e(B")  ("P" . "\e$(C#P\e(B")
+                  ("Q" . "\e$(C#Q\e(B")  ("R" . "\e$(C#R\e(B")  ("S" . "\e$(C#S\e(B")  ("T" . "\e$(C#T\e(B")
+                  ("U" . "\e$(C#U\e(B")  ("V" . "\e$(C#V\e(B")  ("W" . "\e$(C#W\e(B")  ("X" . "\e$(C#X\e(B")
+                  ("Y" . "\e$(C#Y\e(B")  ("Z" . "\e$(C#Z\e(B")))
+    (let ((in (car ascii)) (out (cdr ascii)))
+      (its-defrule (concat its-pankak-escape in) in)
+      (its-defrule (concat its-jeonkak-escape in) out))))
 
 (define-its-state-machine-append its-hangul-map
-  (its-defrule "[" its-hangul-open-bracket  nil t)
-  (its-defrule "]" its-hangul-close-bracket nil t)
-  )
+  (its-defrule "[" its-hangul-open-bracket)
+  (its-defrule "]" its-hangul-close-bracket)
+  (its-defrule "." its-hangul-period)
+  (its-defrule "," its-hangul-comma)
+
+  (if its-hangul-enable-jeonkak-alphabet
+      (progn
+       (its-defrule   "1"   "\e$(C#1\e(B")  (its-defrule   "2"   "\e$(C#2\e(B")
+       (its-defrule   "3"   "\e$(C#3\e(B")  (its-defrule   "4"   "\e$(C#4\e(B")
+       (its-defrule   "5"   "\e$(C#5\e(B")  (its-defrule   "6"   "\e$(C#6\e(B")
+       (its-defrule   "7"   "\e$(C#7\e(B")  (its-defrule   "8"   "\e$(C#8\e(B")
+       (its-defrule   "9"   "\e$(C#9\e(B")  (its-defrule   "0"   "\e$(C#0\e(B")
+       (its-defrule   "!"   "\e$(C#!\e(B")  (its-defrule   "@"   "\e$(C#@\e(B")
+       (its-defrule   "#"   "\e$(C##\e(B")  (its-defrule   "$"   "\e$(C#$\e(B")
+       (its-defrule   "%"   "\e$(C#%\e(B")  (its-defrule   "^"   "\e$(C#^\e(B")
+       (its-defrule   "&"   "\e$(C#&\e(B")  (its-defrule   "*"   "\e$(C#*\e(B")
+       (its-defrule   "("   "\e$(C#(\e(B")  (its-defrule   ")"   "\e$(C#)\e(B")
+       (its-defrule   "-"   "\e$(C#-\e(B")  (its-defrule   "~"   "\e$(C#~\e(B")
+       (its-defrule   "="   "\e$(C#=\e(B")  (its-defrule   "`"   "\e$(C#`\e(B")
+       (its-defrule   "\\"  "\e$(C#\\e(B")  (its-defrule   "|"   "\e$(C#|\e(B")
+       (its-defrule   "_"   "\e$(C#_\e(B")  (its-defrule   "+"   "\e$(C#+\e(B")
+       (its-defrule   "{"   "\e$(C#{\e(B")  (its-defrule   "}"   "\e$(C#}\e(B")
+       (its-defrule   ":"   "\e$(C#:\e(B")  (its-defrule   ";"   "\e$(C#;\e(B")
+       (its-defrule   "\""  "\e$(C#"\e(B")  (its-defrule   "'"   "\e$(C#'\e(B")
+       (its-defrule   "<"   "\e$(C#<\e(B")  (its-defrule   ">"   "\e$(C#>\e(B")
+       (its-defrule   "?"   "\e$(C#?\e(B")  (its-defrule   "/"   "\e$(C#/\e(B"))
+    (progn
+      (its-defrule   "1"   "1")  (its-defrule   "2"   "2")
+      (its-defrule   "3"   "3")  (its-defrule   "4"   "4")
+      (its-defrule   "5"   "5")  (its-defrule   "6"   "6")
+      (its-defrule   "7"   "7")  (its-defrule   "8"   "8")
+      (its-defrule   "9"   "9")  (its-defrule   "0"   "0")
+      (its-defrule   "!"   "!")  (its-defrule   "@"   "@")
+      (its-defrule   "#"   "#")  (its-defrule   "$"   "$")
+      (its-defrule   "%"   "%")  (its-defrule   "^"   "^")
+      (its-defrule   "&"   "&")  (its-defrule   "*"   "*")
+      (its-defrule   "("   "(")  (its-defrule   ")"   ")")
+      (its-defrule   "-"   "-")  (its-defrule   "~"   "~")
+      (its-defrule   "="   "=")  (its-defrule   "`"   "`")
+      (its-defrule   "\\"  "\\") (its-defrule   "|"   "|")
+      (its-defrule   "_"   "_")  (its-defrule   "+"   "+")
+      (its-defrule   "{"   "{")  (its-defrule   "}"   "}")
+      (its-defrule   ":"   ":")  (its-defrule   ";"   ";")
+      (its-defrule   "\""  "\"") (its-defrule   "'"   "'")
+      (its-defrule   "<"   "<")  (its-defrule   ">"   ">")
+      (its-defrule   "?"   "?")  (its-defrule   "/"   "/"))))
 
 (provide 'its/hangul)