]> git.eshelyaron.com Git - emacs.git/commitdiff
Initial revision
authorKenichi Handa <handa@m17n.org>
Sat, 5 Apr 1997 02:44:02 +0000 (02:44 +0000)
committerKenichi Handa <handa@m17n.org>
Sat, 5 Apr 1997 02:44:02 +0000 (02:44 +0000)
lisp/language/english.el [new file with mode: 0644]
lisp/language/tibet-util.el [new file with mode: 0644]
lisp/language/tibetan.el [new file with mode: 0644]

diff --git a/lisp/language/english.el b/lisp/language/english.el
new file mode 100644 (file)
index 0000000..e4ff068
--- /dev/null
@@ -0,0 +1,74 @@
+;;; english.el --- English support
+
+;; Copyright (C) 1997 Free Software Foundation, Inc.
+;; Copyright (C) 1997 Electrotechnical Laboratory, JAPAN.
+
+;; Keywords: multibyte character, character set, syntax, category
+
+;; This file is part of GNU Emacs.
+
+;; 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:
+
+;; We need nothing special to support English on Emacs.  Selecting
+;; English as a language environment is one of the ways to reset
+;; various multilingual environment to the original settting.
+
+;;; Code
+
+(defun setup-english-environment ()
+  "Reset MULE (multilingual environment) to the default status."
+  (interactive)
+  (setq-default enable-multibyte-characters t)
+  (if (local-variable-p 'enable-multibyte-characters)
+      (setq enable-multibyte-characters t))
+
+  (setq coding-category-internal       'internal
+       coding-category-iso-7           'iso-2022-7
+       coding-category-iso-8-1         'iso-8859-1
+       coding-category-iso-8-2         'iso-8859-1
+       coding-category-iso-else        'iso-8859-1
+       coding-category-sjis            'sjis
+       coding-category-big5            'big5
+       coding-category-binary          'no-conversion)
+
+  (set-coding-priority
+   '(coding-category-iso-7
+     coding-category-iso-8-2
+     coding-category-iso-8-1
+     coding-category-iso-else
+     coding-category-internal 
+     coding-category-binary
+     coding-category-sjis
+     coding-category-big5))
+
+  (setq-default buffer-file-coding-system 'iso-8859-1)
+  (set-terminal-coding-system 'iso-8859-1)
+  (set-keyboard-coding-system 'iso-8859-1)
+  )
+
+(set-language-info-alist
+ "English" '((setup-function . setup-english-environment)
+            (tutorial . "TUTORIAL")
+            (charset . (ascii))
+            (documentation . t)
+            (sample-text . "Hello!, Hi!, How are you?")))
+
+(register-input-method "English"
+                      '("quail-dvorak" quail-use-package "quail/latin"))
+
+;;; english.el ends here
diff --git a/lisp/language/tibet-util.el b/lisp/language/tibet-util.el
new file mode 100644 (file)
index 0000000..cc4624e
--- /dev/null
@@ -0,0 +1,453 @@
+;;; language/tibet-util.el -- Support for inputting Tibetan characters
+
+;; Copyright (C) 1995 Free Software Foundation, Inc.
+;; Copyright (C) 1995 Electrotechnical Laboratory, JAPAN.
+
+;; Keywords: multilingual, Tibetan
+
+;; This file is part of GNU Emacs.
+
+;; 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.
+
+;; Author: Toru TOMABECHI, <Toru.Tomabechi@orient.unil.ch>
+
+;; Created: Feb. 17. 1997
+
+;; History:
+;; 1997.03.13 Modification in treatment of text properties;
+;;            Support for some special signs and punctuations.
+
+;;; Code:
+
+;;; This function makes a transcription string for
+;;; re-composing a character.
+
+;;;###autoload
+(defun tibetan-tibetan-to-transcription (ch)
+  "Return a transcription string of Tibetan character CH"
+  (let ((char ch)
+       (l (append tibetan-consonant-transcription-alist
+                  tibetan-vowel-transcription-alist
+                  tibetan-precomposed-transcription-alist
+                  tibetan-subjoined-transcription-alist)) 
+       decomp-l t-char trans str result)
+    (if (eq (char-charset char) 'composition)
+       (setq decomp-l (decompose-composite-char char 'list nil))
+      (setq decomp-l (cons char nil)))
+    (setq str "")
+    (while decomp-l
+      (setq t-char (char-to-string (car decomp-l)))
+      (setq trans (car (rassoc t-char l)))
+      (setq str (concat str trans))
+      (setq decomp-l (cdr decomp-l)))
+    (setq result str)))
+
+;;; This function translates transcription string into a string of
+;;; Tibetan characters.
+
+;;;###autoload
+(defun tibetan-transcription-to-tibetan (transcription)
+  "Translate Roman transcription into a sequence of Tibetan components."
+  (let ((trans transcription)
+       (lp tibetan-precomposed-transcription-alist)
+       (l (append tibetan-consonant-transcription-alist
+                  tibetan-vowel-transcription-alist
+                  tibetan-subjoined-transcription-alist))
+       (case-fold-search nil)
+       substr t-char p-str t-str result)
+    (setq substr "")
+    (setq p-str "")
+    (setq t-str "")
+    (cond ((string-match tibetan-precomposed-regexp trans)
+          (setq substr (substring trans (match-beginning 0) (match-end 0)))
+          (setq trans (substring trans (match-end 0)))
+          (setq t-char (cdr (assoc substr lp)))
+          (setq p-str t-char)))
+    (while (string-match tibetan-regexp trans)
+      (setq substr (substring trans (match-beginning 0) (match-end 0)))
+      (setq trans (substring trans 0 (match-beginning 0)))
+      (setq t-char
+           (cdr (assoc substr l)))
+      (setq t-str (concat t-char t-str)))
+    (setq result (concat p-str t-str))))
+
+
+;;;
+;;; Functions for composing Tibetan character.
+;;;
+;;; A Tibetan syllable is typically structured as follows:
+;;;
+;;;      [Prefix] C [C+] V [M] [Suffix [Post suffix]]
+;;;
+;;; where C's are all vertically stacked, V appears below or above
+;;; consonant cluster and M is always put above the C[C+]V combination.
+;;; (Sanskrit visarga, though it is a vowel modifier, is considered
+;;;  to be a punctuation.)
+;;;
+;;; Here are examples of the words "bsgrubs" and "h'uM"
+;;;
+;;;            \e$(7"7\e2%q`"U\e1"7"G\e(B         \e2\e$(7"H`#A`"U0"_\e1\e(B        
+;;;
+;;;                             M
+;;;             b s b s         h
+;;;               g             '
+;;;               r             u
+;;;               u
+;;;
+;;; Consonants ''', 'w', 'y', 'r' take special forms when they are used
+;;; as subjoined consonant. Consonant 'r' takes another special form
+;;; when used as superjoined as in "rka", and so on, while it does not
+;;; change its form when conjoined with subjoined ''', 'w' or 'y'
+;;; as in "rwa", "rya".
+;;;
+;;;
+;;; As a Tibetan input method should avoid using conversion key,
+;;; we use a "Tibetan glyph -> transcription -> Tibetan glyph"
+;;; translation at each key input.
+;;;
+;;; 1st stage -  Check the preceding char.
+;;;              If the preceding char is Tibetan and composable, then
+;;;
+;;; 2nd stage -  Translate the preceding char into transcription
+;;;
+;;; 3rd stage -  Concatenate the transcription of preceding char
+;;;              and the current input key.
+;;;
+;;; 4th stage -  Re-translate the concatenated transcription into
+;;;              a sequence of Tibetan letters.
+;;;
+;;; 5th stage -  Convert leading consonants into one single precomposed char
+;;;              if possible.
+;;;
+;;; 6th stage -  Compose the consonants into one composite glyph.
+;;;
+;;; (If the current input is a vowel sign or a vowel modifier,
+;;;  then it is composed with preceding char without checking
+;;;  except when the preceding char is a punctuation or a digit.)
+;;;
+;;;
+
+;;; This function is used to avoid composition
+;;;      between Tibetan and non-Tibetan chars.
+
+;;;###autoload
+(defun tibetan-char-examin (ch)
+  "Check if char CH is Tibetan character.
+Returns non-nil if CH is Tibetan. Otherwise, returns nil."
+  (let ((chr ch))
+    (if (eq (char-charset chr) 'composition)
+       (string-match "\\cq+" (decompose-composite-char chr))
+      (string-match "\\cq" (char-to-string chr)))))
+
+;;; This is used to avoid composition between digits, signs, punctuations
+;;; and word constituents.
+
+;;;###autoload
+(defun tibetan-composable-examin (ch)
+  "Check if Tibetan char CH is composable.
+Returns t if CH is a composable char \(i.e. neither punctuation nor digit)."
+  (let ((chr ch)
+       chstr)
+    (if (eq (char-charset chr) 'composition)
+       (setq chstr (decompose-composite-char chr))
+      (setq chstr (char-to-string chr)))
+    (not (string-match "[\e$(7!1\e(B-\e$(7!o"f\e$(8!;!=!?!@!A!D"`\e(B]" chstr))))
+
+
+;;; This checks if a character to be composed contains already
+;;; one or more vowels / vowel modifiers. If the character contains
+;;; them, then no more consonant should be added.
+
+;;;###autoload
+(defun tibetan-complete-char-examin (ch)
+  "Check if composite char CH contains one or more vowel/vowel modifiers.
+Returns non-nil, if CH contains vowel/vowel modifiers."
+  (let ((chr ch)
+       chstr)
+    (if (eq (char-charset chr) 'composition)
+       (setq chstr (decompose-composite-char chr))
+      (setq chstr (char-to-string chr)))
+    (string-match "[\e$(7!g!e"Q\e(B-\e$(7"^"_\e(B-\e$(7"l\e(B]" chstr)))
+
+;;; This function makes a composite character consisting of two characters
+;;; vertically stacked.
+
+;;;###autoload
+(defun tibetan-vertical-stacking (first second upward)
+  "Return a vertically stacked composite char consisting of FIRST and SECOND.
+If UPWARD is non-nil, then SECOND is put above FIRST."
+  (if upward
+      (compose-chars first '(tc . bc) second)
+    (compose-chars first '(bc . tc) second)))
+
+;;; This function makes a composite char from a string.
+;;; Note that this function returns a string, not a char.
+
+;;;###autoload
+(defun tibetan-compose-string (str)
+  "Compose a sequence of Tibetan character components into a composite character.
+Returns a string containing a composite character."
+  (let ((t-str str)
+       f-str s-str f-ch s-ch rest composed result)
+    ;;Make sure no redundant vowel sign is present.  
+    (if (string-match
+        "^\\(.+\\)\\(\e$(7"Q\e(B\\)\\([\e$(7!I!g!e"Q\e(B-\e$(7"^"_\e(B-\e$(7"l\e(B]\\)" t-str)
+       (setq t-str (concat
+                    (match-string 1 t-str)
+                    (match-string 3 t-str))))
+    (if (string-match
+        "^\\(.+\\)\\([\e$(7!I!g!e"Q\e(B-\e$(7"^"_\e(B-\e$(7"l\e(B]\\)\\(\e$(7"Q\e(B\\)" t-str)
+       (setq t-str (concat
+                    (match-string 1 t-str)
+                    (match-string 2 t-str))))
+    ;;Start conversion.
+    (setq result "")
+    ;; Consecutive base/precomposed consonants are reduced to the last one.
+    (while (string-match "^\\([\e$(7"!\e(B-\e$(7"J$!\e(B-\e$(7%u\e(B]\\)\\([\e$(7"!\e(B-\e$(7"@"B\e(B-\e$(7"J$!\e(B-\e$(7%u\e(B].*\\)" t-str)
+      (setq result (concat result (match-string 1 t-str)))
+      (setq t-str (match-string 2 t-str)))
+    ;; Vowel/vowel modifier, subjoined consonants are added one by one
+    ;; to the preceding element.
+    (while
+       (string-match "^\\(.\\)\\([\e$(7"A#!\e(B-\e$(7#J!I!g!e"Q\e(B-\e$(7"^"_\e(B-\e$(7"l\e(B]\\)\\(.*\\)" t-str)
+      (setq f-str (match-string 1 t-str))
+      (setq f-ch (string-to-char f-str))
+      (setq s-str (match-string 2 t-str))
+      ;;Special treatment for 'a chung.
+      ;;If 'a follows a consonant, then turned into its subjoined form.
+      (if (and (string-match "\e$(7"A\e(B" s-str)
+              (not (tibetan-complete-char-examin f-ch)))
+         (setq s-str "\e$(7#A\e(B"))
+      (setq s-ch (string-to-char s-str))
+      (setq rest (match-string 3 t-str))
+      (cond ((string-match "\\c2" s-str);; upper vowel sign
+            (setq composed
+                  (tibetan-vertical-stacking f-ch s-ch t)))
+           ((string-match "\\c3" s-str);; lower vowel sign
+            (setq composed
+                  (tibetan-vertical-stacking f-ch s-ch nil)))
+           ;;Automatic conversion of ra-mgo (superscribed r).
+           ;;'r' is converted if followed by a subjoined consonant
+           ;;other than w, ', y, r.
+           ((and (string-match "\e$(7"C\e(B" f-str)
+                 (not (string-match "[\e$(7#>#A#B#C\e(B]" s-str)))
+            (setq f-ch ?\e$(7#P\e(B)
+            (setq composed
+                  (tibetan-vertical-stacking f-ch s-ch nil)))
+           ((not (tibetan-complete-char-examin f-ch))
+            ;;Initial base consonant is tranformed, if followed by
+            ;;a subjoined consonant, except when it is followed
+            ;;by a subscribed 'a.
+            (if (and (string-match "[\e$(7"!\e(B-\e$(7"="?"@"D\e(B-\e$(7"J\e(B]" f-str)
+                     (not (string-match "\e$(7#A\e(B" s-str)))
+                (setq f-ch
+                      (string-to-char
+                       (cdr (assoc f-str tibetan-base-to-subjoined-alist)))))
+            (setq composed
+                  (tibetan-vertical-stacking f-ch s-ch nil)))
+           (t
+            (setq composed s-str)
+            (setq result (concat result f-str))))
+      (setq t-str (concat composed rest)))
+    (setq result (concat result t-str))))
+
+;;; quail <-> conversion interface.
+
+(defun tibetan-composition (pc key)
+  "Interface to quail input method.
+Takes two arguments: char PC and string KEY, where PC is the preceding
+character to be composed with current input KEY.
+Returns a string which is the result of composition."
+  (let (trans cur-ch t-str result)
+    ;; Make a tibetan character corresponding to current input key.
+    (setq cur-ch (tibetan-transcription-to-tibetan key))
+    ;; Check if the preceding character is Tibetan and composable.
+    (cond ((and (tibetan-char-examin pc)
+               (tibetan-composable-examin pc))
+          ;;If Tibetan char corresponding to the current input key exists,
+          (cond (cur-ch
+                 ;; Then,
+                 ;; Convert the preceding character into transcription,
+                 ;; and concatenate it with the current input key,
+                 (setq trans (tibetan-tibetan-to-transcription pc))
+                 (setq trans (concat trans key))
+                 ;; Concatenated transcription is converted to
+                 ;; a sequence of Tibetan characters,
+                 (setq t-str (tibetan-transcription-to-tibetan trans))
+                 ;; And it is composed into a composite character.
+                 (setq result (tibetan-compose-string t-str)))
+                ;; Else,
+                (t
+                 ;; Simply concatenate the preceding character and
+                 ;; the current input key.
+                 (setq result (char-to-string pc))
+                 (setq result (concat result key)))))
+         ;; If the preceding char is not Tibetan or not composable,
+         (t
+          ;; pc = 0 means the point is at the beginning of buffer.
+          (if (not (eq pc 0))
+              (setq result (char-to-string pc)))
+          (if cur-ch
+              (setq result (concat result cur-ch))
+            (setq result (concat result key))))
+         )))
+
+
+;;;###autoload
+(defun tibetan-decompose-region (beg end)
+  "Decompose Tibetan characters in the region BEG END into their components.
+Components are: base and subjoined consonants, vowel signs, vowel modifiers.
+One column punctuations are converted to their 2 column equivalents."
+  (interactive "r")
+  (let (ch-str ch-beg ch-end)
+    (save-excursion
+      (save-restriction
+       (narrow-to-region beg end)
+       (goto-char (point-min))
+       ;; \\cq = Tibetan character
+       (while (re-search-forward "\\cq" nil t)
+         (setq ch-str (buffer-substring-no-properties
+                       (match-beginning 0) (match-end 0)))
+         ;; Save the points. Maybe, using save-match-data is preferable.
+         ;; But in order not to lose the trace(because the body is too long),
+         ;; we save the points in variables.
+         (setq ch-beg (match-beginning 0))
+         (setq ch-end (match-end 0))
+         ;; Here starts the decomposition.
+         (cond
+          ;; 1 column punctuations -> 2 column equivalent
+          ((string-match "[\e$(8!D!;!=!?!@!A"`\e(B]" ch-str)
+           (setq ch-str
+                 (car (rassoc ch-str tibetan-precomposition-rule-alist))))
+          ;; Decomposition of composite character.
+          ((eq (char-charset (string-to-char ch-str)) 'composition)
+           ;; Make a string which consists of a sequence of
+           ;; components.
+           (setq ch-str (decompose-composite-char (string-to-char ch-str)))
+           ;; Converts nyi zla into base elements.
+           (cond ((string= ch-str "\e$(7#R#S#S#S\e(B")
+                  (setq ch-str "\e$(7!4!5!5\e(B"))
+                 ((string= ch-str "\e$(7#R#S#S\e(B")
+                  (setq ch-str "\e$(7!4!5\e(B"))
+                 ((string= ch-str "\e$(7#R#S!I\e(B")
+                  (setq ch-str "\e$(7!6\e(B"))
+                 ((string= ch-str "\e$(7#R#S\e(B")
+                  (setq ch-str "\e$(7!4\e(B")))))
+         ;; If the sequence of components starts with a subjoined consonants,
+         (if (string-match "^\\([\e$(7#!\e(B-\e$(7#J\e(B]\\)\\(.*\\)$" ch-str)
+             ;; then the first components is converted to its base form.
+             (setq ch-str
+                   (concat (car (rassoc (match-string 1 ch-str)
+                                        tibetan-base-to-subjoined-alist))
+                           (match-string 2 ch-str))))
+         ;; If the sequence of components starts with a precomposed character,
+         (if (string-match "^\\([\e$(7$!\e(B-\e$(7%u\e(B]\\)\\(.*\\)$" ch-str)
+             ;; then it is converted into a sequence of components.
+             (setq ch-str
+                   (concat (car (rassoc (match-string 1 ch-str)
+                                        tibetan-precomposition-rule-alist))
+                           (match-string 2 ch-str))))
+         ;; Special treatment for superscribed r.
+         (if (string-match "^\e$(7#P\e(B\\(.*\\)$" ch-str)
+             (setq ch-str (concat "\e$(7"C\e(B" (match-string 1 ch-str))))
+         ;; Finally, the result of decomposition is inserted, and
+         ;; the composite character is deleted.
+         (insert-and-inherit ch-str)
+         (delete-region ch-beg ch-end))))))
+
+;;;###autoload
+(defun tibetan-compose-region (beg end)
+  "Make composite chars from Tibetan character components in the region BEG END.
+Two column punctuations are converted to their 1 column equivalents."
+  (interactive "r")
+  (let (str result)
+    (save-excursion
+      (save-restriction
+       (narrow-to-region beg end)
+       (goto-char (point-min))
+       ;; First, sequence of components which has a precomposed equivalent
+       ;; is converted.
+       (while (re-search-forward
+               tibetan-precomposition-rule-regexp nil t)
+         (setq str (buffer-substring-no-properties
+                    (match-beginning 0) (match-end 0)))
+         (save-match-data
+           (insert-and-inherit
+            (cdr (assoc str tibetan-precomposition-rule-alist))))
+         (delete-region (match-beginning 0) (match-end 0)))
+       (goto-char (point-min))
+       ;; Then, composable elements are put into a composite character. 
+       (while (re-search-forward
+               "[\e$(7"!\e(B-\e$(7"J$!\e(B-\e$(7%u\e(B]+[\e$(7#!\e(B-\e$(7#J!I!g!e"Q\e(B-\e$(7"^"_\e(B-\e$(7"l\e(B]+"
+               nil t)
+         (setq str (buffer-substring-no-properties
+                    (match-beginning 0) (match-end 0)))
+         (save-match-data
+           (setq result (tibetan-compose-string str))
+           (insert-and-inherit result))
+         (delete-region (match-beginning 0) (match-end 0)))))))
+
+;;;
+;;; This variable is used to avoid repeated decomposition.
+;;;
+(setq-default tibetan-decomposed nil)
+
+;;;###autoload
+(defun tibetan-decompose-buffer ()
+  "Decomposes Tibetan characters in the buffer into their components.
+See also docstring of the function tibetan-decompose-region."
+  (interactive)
+  (make-local-variable 'tibetan-decomposed)
+  (cond ((not tibetan-decomposed)
+        (tibetan-decompose-region (point-min) (point-max))
+        (setq tibetan-decomposed t))))
+
+;;;###autoload
+(defun tibetan-compose-buffer ()
+  "Composes Tibetan character components in the buffer.
+See also docstring of the function tibetan-compose-region."
+  (interactive)
+  (make-local-variable 'tibetan-decomposed)
+  (tibetan-compose-region (point-min) (point-max))
+  (setq tibetan-decomposed nil))
+
+;;;###autoload
+(defun tibetan-post-read-conversion (len)
+  (save-excursion
+    (save-restriction
+      (let ((buffer-modified-p (buffer-modified-p)))
+       (narrow-to-region (point) (+ (point) len))
+       (tibetan-compose-region (point-min) (point-max))
+       (set-buffer-modified-p buffer-modified-p)
+       (point-max))))
+  (make-local-variable 'tibetan-decomposed)
+  (setq tibetan-decomposed nil))
+
+
+;;;###autoload
+(defun tibetan-pre-write-conversion (from to)
+  (setq tibetan-decomposed-temp tibetan-decomposed)
+  (let ((old-buf (current-buffer))
+       (work-buf (get-buffer-create " *tibetan-work*")))
+    (set-buffer work-buf)
+    (erase-buffer)
+    (insert-buffer-substring old-buf from to)
+    (if (not tibetan-decomposed-temp)
+       (tibetan-decompose-region (point-min) (point-max)))))
+
+(provide 'language/tibet-util)
+
+;;; language/tibet-util.el ends here.
diff --git a/lisp/language/tibetan.el b/lisp/language/tibetan.el
new file mode 100644 (file)
index 0000000..d546891
--- /dev/null
@@ -0,0 +1,620 @@
+;;; tibetan.el --- Support for Tibetan language
+
+;; Copyright (C) 1997 Free Software Foundation, Inc.
+;; Copyright (C) 1997 Electrotechnical Laboratory, JAPAN.
+
+;; Keywords: multilingual, Tibetan
+
+;; This file is part of GNU Emacs.
+
+;; 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.
+
+;; Author: Toru TOMABECHI, <Toru.Tomabechi@orient.unil.ch>
+
+;; Created: Feb. 17. 1997
+
+;; History:
+;; 1997.03.13 Modification for special signs and punctuations. 
+
+;;; Code:
+
+(define-category ?q "Tibetan")
+(modify-category-entry (make-char 'tibetan) ?q)
+(modify-category-entry (make-char 'tibetan-1-column) ?q)
+
+(let ((row 33))
+  (while (< row 38)
+    (modify-category-entry (make-char 'tibetan row) ?q)
+    (setq row (1+ row))))
+
+(modify-category-entry (make-char 'tibetan-1-column 33) ?q)
+
+(let ((deflist '(;; chars             syntax category
+                 ("\e$(7"!\e(B-\e$(7"J\e(B"                "w"     ?0) ; consonant
+                 ("\e$(7#!\e(B-\e$(7#J#P#Q\e(B"          "w"     ?0) ;
+                 ("\e$(7$!\e(B-\e$(7$e\e(B"              "w"     ?0) ;
+                 ("\e$(7%!\e(B-\e$(7%u\e(B"              "w"     ?0) ;
+                 ("\e$(7"S"["\"]"^"a\e(B"       "w"      ?2) ; upper vowel
+                 ("\e$(7"_"c"d"g"h"i"j"k"l\e(B" "w"      ?2) ; upper modifier
+                 ("\e$(7!I"Q"U"e!e!g\e(B"       "w"      ?3) ; lowel vowel/modifier
+                 ("\e$(7!P\e(B-\e$(7!Y!Z\e(B-\e$(7!c\e(B"            "w"     ?6) ; digit
+                 ("\e$(7!;!=\e(B-\e$(7!B!D"`\e(B"        "."     ?|) ; line-break char
+                 ("\e$(8!;!=!?!@!A!D"`\e(B"            "."     ?|) ;
+                 ("\e$(7!8!;!=\e(B-\e$(7!B!D"`!m!d\e(B"  "."     ?>) ; prohibition
+                 ("\e$(8!;!=!?!@!A!D"`\e(B"            "."     ?>) ;
+                 ("\e$(7!0\e(B-\e$(7!:!l#R#S"f\e(B"      "."     ?<) ; prohibition
+                 ("\e$(7!C!E\e(B-\e$(7!H!J\e(B-\e$(7!O!f!h\e(B-\e$(7!k!n!o\e(B" "." ?q) ; others
+                 ))
+      elm chars len syntax category to ch i)
+  (while deflist
+    (setq elm (car deflist))
+    (setq chars (car elm)
+         len (length chars)
+         syntax (nth 1 elm)
+         category (nth 2 elm)
+         i 0)
+    (while (< i len)
+      (if (= (aref chars i) ?-)
+         (setq i (1+ i)
+               to (sref chars i))
+       (setq ch (sref chars i)
+             to ch))
+      (while (<= ch to)
+       (modify-syntax-entry ch syntax)
+       (modify-category-entry ch category)
+       (setq ch (1+ ch)))
+      (setq i (+ i (char-bytes to))))
+    (setq deflist (cdr deflist))))
+
+
+;;; Tibetan Character set.
+;;; \x2130 -- \x234a is a subset of Unicode v.2 \x0f00 - \x0fb9
+;;; with a slight modification. And there are some subjoined
+;;; consonants which are not specified in Unicode.
+;;; I hope I can add missing characters later.
+;;;
+;;;     00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
+;;;2120 // \e$(7!!\e(B \e$(7!"\e(B \e$(7!#\e(B \e$(7!$\e(B \e$(7!%\e(B \e$(7!&\e(B \e$(7!'\e(B \e$(7!(\e(B \e$(7!)\e(B \e$(7!*\e(B \e$(7!+\e(B \e$(7!,\e(B \e$(7!-\e(B \e$(7!.\e(B \e$(7!/\e(B ;
+;;;2130 \e$(7!0\e(B \e$(7!1\e(B \e$(7!2\e(B \e$(7!3\e(B \e$(7!4\e(B \e$(7!5\e(B \e$(7!6\e(B \e$(7!7\e(B \e$(7!8\e(B \e$(7!9\e(B \e$(7!:\e(B \e$(7!;\e(B \e$(7!<\e(B \e$(7!=\e(B \e$(7!>\e(B \e$(7!?\e(B ; Punctuations,
+;;;2140 \e$(7!@\e(B \e$(7!A\e(B \e$(7!B\e(B \e$(7!C\e(B \e$(7!D\e(B \e$(7!E\e(B \e$(7!F\e(B \e$(7!G\e(B \e$(7!H\e(B \e$(7!I\e(B \e$(7!J\e(B \e$(7!K\e(B \e$(7!L\e(B \e$(7!M\e(B \e$(7!N\e(B \e$(7!O\e(B ; Digits and
+;;;2150 \e$(7!P\e(B \e$(7!Q\e(B \e$(7!R\e(B \e$(7!S\e(B \e$(7!T\e(B \e$(7!U\e(B \e$(7!V\e(B \e$(7!W\e(B \e$(7!X\e(B \e$(7!Y\e(B \e$(7!Z\e(B \e$(7![\e(B \e$(7!\\e(B \e$(7!]\e(B \e$(7!^\e(B \e$(7!_\e(B ; Special signs.
+;;;2160 \e$(7!`\e(B \e$(7!a\e(B \e$(7!b\e(B \e$(7!c\e(B \e$(7!d\e(B \e$(7!e\e(B \e$(7!f\e(B \e$(7!g\e(B \e$(7!h\e(B \e$(7!i\e(B \e$(7!j\e(B \e$(7!k\e(B \e$(7!l\e(B \e$(7!m\e(B \e$(7!n\e(B \e$(7!o\e(B ;
+;;;2170 \e$(7!p\e(B \e$(7!q\e(B \e$(7!r\e(B \e$(7!s\e(B \e$(7!t\e(B \e$(7!u\e(B \e$(7!v\e(B \e$(7!w\e(B \e$(7!x\e(B \e$(7!y\e(B \e$(7!z\e(B \e$(7!{\e(B \e$(7!|\e(B \e$(7!}\e(B \e$(7!~\e(B // ;
+;;;
+;;;     00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
+;;;2220 // \e$(7"!\e(B \e$(7""\e(B \e$(7"#\e(B \e$(7"$\e(B \e$(7"%\e(B \e$(7"&\e(B \e$(7"'\e(B \e$(7"(\e(B \e$(7")\e(B \e$(7"*\e(B \e$(7"+\e(B \e$(7",\e(B \e$(7"-\e(B \e$(7".\e(B \e$(7"/\e(B ; Base consonants
+;;;2230 \e$(7"0\e(B \e$(7"1\e(B \e$(7"2\e(B \e$(7"3\e(B \e$(7"4\e(B \e$(7"5\e(B \e$(7"6\e(B \e$(7"7\e(B \e$(7"8\e(B \e$(7"9\e(B \e$(7":\e(B \e$(7";\e(B \e$(7"<\e(B \e$(7"=\e(B \e$(7">\e(B \e$(7"?\e(B ; and
+;;;2240 \e$(7"@\e(B \e$(7"A\e(B \e$(7"B\e(B \e$(7"C\e(B \e$(7"D\e(B \e$(7"E\e(B \e$(7"F\e(B \e$(7"G\e(B \e$(7"H\e(B \e$(7"I\e(B \e$(7"J\e(B \e$(7"K\e(B \e$(7"L\e(B \e$(7"M\e(B \e$(7"N\e(B \e$(7"O\e(B ; Vowel signs.
+;;;2250 \e$(7"P\e(B \e$(7"Q\e(B \e$(7"R\e(B \e$(7"S\e(B \e$(7"T\e(B \e$(7"U\e(B \e$(7"V\e(B \e$(7"W\e(B \e$(7"X\e(B \e$(7"Y\e(B \e$(7"Z\e(B \e$(7"[\e(B \e$(7"\\e(B \e$(7"]\e(B \e$(7"^\e(B \e$(7"_\e(B ; (\x2251 = vowel a)
+;;;2260 \e$(7"`\e(B \e$(7"a\e(B \e$(7"b\e(B \e$(7"c\e(B \e$(7"d\e(B \e$(7"e\e(B \e$(7"f\e(B \e$(7"g\e(B \e$(7"h\e(B \e$(7"i\e(B \e$(7"j\e(B \e$(7"k\e(B \e$(7"l\e(B \e$(7"m\e(B \e$(7"n\e(B \e$(7"o\e(B ; Long vowels and
+;;;2270 \e$(7"p\e(B \e$(7"q\e(B \e$(7"r\e(B \e$(7"s\e(B \e$(7"t\e(B \e$(7"u\e(B \e$(7"v\e(B \e$(7"w\e(B \e$(7"x\e(B \e$(7"y\e(B \e$(7"z\e(B \e$(7"{\e(B \e$(7"|\e(B \e$(7"}\e(B \e$(7"~\e(B // ; vocalic r, l are
+;;;                                                     ; not atomically
+;;;                                                     ; encoded. 
+;;;     00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
+;;;2320 // \e$(7#!\e(B \e$(7#"\e(B \e$(7##\e(B \e$(7#$\e(B \e$(7#%\e(B \e$(7#&\e(B \e$(7#'\e(B \e$(7#(\e(B \e$(7#)\e(B \e$(7#*\e(B \e$(7#+\e(B \e$(7#,\e(B \e$(7#-\e(B \e$(7#.\e(B \e$(7#/\e(B ; Subjoined consonants
+;;;2330 \e$(7#0\e(B \e$(7#1\e(B \e$(7#2\e(B \e$(7#3\e(B \e$(7#4\e(B \e$(7#5\e(B \e$(7#6\e(B \e$(7#7\e(B \e$(7#8\e(B \e$(7#9\e(B \e$(7#:\e(B \e$(7#;\e(B \e$(7#<\e(B \e$(7#=\e(B \e$(7#>\e(B \e$(7#?\e(B ;
+;;;2340 \e$(7#@\e(B \e$(7#A\e(B \e$(7#B\e(B \e$(7#C\e(B \e$(7#D\e(B \e$(7#E\e(B \e$(7#F\e(B \e$(7#G\e(B \e$(7#H\e(B \e$(7#I\e(B \e$(7#J\e(B \e$(7#K\e(B \e$(7#L\e(B \e$(7#M\e(B \e$(7#N\e(B \e$(7#O\e(B ; 'a chung (\x2341)is
+;;;                                                     ; here,
+;;;                                                     ; while in Unicode
+;;;                                                     ; it is classified
+;;;                                                     ; as a vowel sign
+;;;                                                     ; (\x0f71).
+;;;
+;;;2350 \e$(7#P\e(B \e$(7#Q\e(B \e$(7#R\e(B \e$(7#S\e(B \e$(7#T\e(B \e$(7#U\e(B \e$(7#V\e(B \e$(7#W\e(B \e$(7#X\e(B \e$(7#Y\e(B \e$(7#Z\e(B \e$(7#[\e(B \e$(7#\\e(B \e$(7#]\e(B \e$(7#^\e(B \e$(7#_\e(B ; Hereafter, the chars
+;;;2360 \e$(7#`\e(B \e$(7#a\e(B \e$(7#b\e(B \e$(7#c\e(B \e$(7#d\e(B \e$(7#e\e(B \e$(7#f\e(B \e$(7#g\e(B \e$(7#h\e(B \e$(7#i\e(B \e$(7#j\e(B \e$(7#k\e(B \e$(7#l\e(B \e$(7#m\e(B \e$(7#n\e(B \e$(7#o\e(B ; are not specified
+;;;2370 \e$(7#p\e(B \e$(7#q\e(B \e$(7#r\e(B \e$(7#s\e(B \e$(7#t\e(B \e$(7#u\e(B \e$(7#v\e(B \e$(7#w\e(B \e$(7#x\e(B \e$(7#y\e(B \e$(7#z\e(B \e$(7#{\e(B \e$(7#|\e(B \e$(7#}\e(B \e$(7#~\e(B // ; in Unicode.
+;;;                                                     ; The character \x2351
+;;;                                                     ; is not used in our
+;;;                                                     ; implementation.
+;;;     00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
+;;;2420 // \e$(7$!\e(B \e$(7$"\e(B \e$(7$#\e(B \e$(7$$\e(B \e$(7$%\e(B \e$(7$&\e(B \e$(7$'\e(B \e$(7$(\e(B \e$(7$)\e(B \e$(7$*\e(B \e$(7$+\e(B \e$(7$,\e(B \e$(7$-\e(B \e$(7$.\e(B \e$(7$/\e(B ; Precomposed
+;;;2430 \e$(7$0\e(B \e$(7$1\e(B \e$(7$2\e(B \e$(7$3\e(B \e$(7$4\e(B \e$(7$5\e(B \e$(7$6\e(B \e$(7$7\e(B \e$(7$8\e(B \e$(7$9\e(B \e$(7$:\e(B \e$(7$;\e(B \e$(7$<\e(B \e$(7$=\e(B \e$(7$>\e(B \e$(7$?\e(B ; consonants for
+;;;2440 \e$(7$@\e(B \e$(7$A\e(B \e$(7$B\e(B \e$(7$C\e(B \e$(7$D\e(B \e$(7$E\e(B \e$(7$F\e(B \e$(7$G\e(B \e$(7$H\e(B \e$(7$I\e(B \e$(7$J\e(B \e$(7$K\e(B \e$(7$L\e(B \e$(7$M\e(B \e$(7$N\e(B \e$(7$O\e(B ; ordinary Tibetan.
+;;;2450 \e$(7$P\e(B \e$(7$Q\e(B \e$(7$R\e(B \e$(7$S\e(B \e$(7$T\e(B \e$(7$U\e(B \e$(7$V\e(B \e$(7$W\e(B \e$(7$X\e(B \e$(7$Y\e(B \e$(7$Z\e(B \e$(7$[\e(B \e$(7$\\e(B \e$(7$]\e(B \e$(7$^\e(B \e$(7$_\e(B ; They are decomposed
+;;;2460 \e$(7$`\e(B \e$(7$a\e(B \e$(7$b\e(B \e$(7$c\e(B \e$(7$d\e(B \e$(7$e\e(B \e$(7$f\e(B \e$(7$g\e(B \e$(7$h\e(B \e$(7$i\e(B \e$(7$j\e(B \e$(7$k\e(B \e$(7$l\e(B \e$(7$m\e(B \e$(7$n\e(B \e$(7$o\e(B ; into base and 
+;;;2470 \e$(7$p\e(B \e$(7$q\e(B \e$(7$r\e(B \e$(7$s\e(B \e$(7$t\e(B \e$(7$u\e(B \e$(7$v\e(B \e$(7$w\e(B \e$(7$x\e(B \e$(7$y\e(B \e$(7$z\e(B \e$(7${\e(B \e$(7$|\e(B \e$(7$}\e(B \e$(7$~\e(B // ; subjoined consonants
+;;;                                                     ; when written on a
+;;;     00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F ; file in Tibetan
+;;;2520 // \e$(7%!\e(B \e$(7%"\e(B \e$(7%#\e(B \e$(7%$\e(B \e$(7%%\e(B \e$(7%&\e(B \e$(7%'\e(B \e$(7%(\e(B \e$(7%)\e(B \e$(7%*\e(B \e$(7%+\e(B \e$(7%,\e(B \e$(7%-\e(B \e$(7%.\e(B \e$(7%/\e(B ; coding system.
+;;;2530 \e$(7%0\e(B \e$(7%1\e(B \e$(7%2\e(B \e$(7%3\e(B \e$(7%4\e(B \e$(7%5\e(B \e$(7%6\e(B \e$(7%7\e(B \e$(7%8\e(B \e$(7%9\e(B \e$(7%:\e(B \e$(7%;\e(B \e$(7%<\e(B \e$(7%=\e(B \e$(7%>\e(B \e$(7%?\e(B ;
+;;;2540 \e$(7%@\e(B \e$(7%A\e(B \e$(7%B\e(B \e$(7%C\e(B \e$(7%D\e(B \e$(7%E\e(B \e$(7%F\e(B \e$(7%G\e(B \e$(7%H\e(B \e$(7%I\e(B \e$(7%J\e(B \e$(7%K\e(B \e$(7%L\e(B \e$(7%M\e(B \e$(7%N\e(B \e$(7%O\e(B ;
+;;;2550 \e$(7%P\e(B \e$(7%Q\e(B \e$(7%R\e(B \e$(7%S\e(B \e$(7%T\e(B \e$(7%U\e(B \e$(7%V\e(B \e$(7%W\e(B \e$(7%X\e(B \e$(7%Y\e(B \e$(7%Z\e(B \e$(7%[\e(B \e$(7%\\e(B \e$(7%]\e(B \e$(7%^\e(B \e$(7%_\e(B ;
+;;;2560 \e$(7%`\e(B \e$(7%a\e(B \e$(7%b\e(B \e$(7%c\e(B \e$(7%d\e(B \e$(7%e\e(B \e$(7%f\e(B \e$(7%g\e(B \e$(7%h\e(B \e$(7%i\e(B \e$(7%j\e(B \e$(7%k\e(B \e$(7%l\e(B \e$(7%m\e(B \e$(7%n\e(B \e$(7%o\e(B ;
+;;;2570 \e$(7%p\e(B \e$(7%q\e(B \e$(7%r\e(B \e$(7%s\e(B \e$(7%t\e(B \e$(7%u\e(B \e$(7%v\e(B \e$(7%w\e(B \e$(7%x\e(B \e$(7%y\e(B \e$(7%z\e(B \e$(7%{\e(B \e$(7%|\e(B \e$(7%}\e(B \e$(7%~\e(B // ;
+;;;
+
+
+(make-coding-system
+ 'tibetan 2 ?Q
+ "Coding-system used for ASCII(MSB=0) & TIBETAN(MSB=1)."
+ '((ascii t) (tibetan t) nil nil
+   nil ascii-eol))
+
+(put 'tibetan 'post-read-conversion 'tibetan-post-read-conversion)
+(put 'tibetan 'pre-write-conversion 'tibetan-pre-write-conversion)
+
+(register-input-method
+ "Tibetan" '("quail-tibetan-wylie" quail-use-package "quail/tibetan"))
+(register-input-method
+ "Tibetan" '("quail-tibetan-tibkey" quail-use-package "quail/tibetan"))
+
+(defun setup-tibetan-environment ()
+  (setq coding-category-iso-7 'tibetan)
+
+  (set-coding-priority
+   '(coding-category-iso-7
+     coding-category-iso-8-1))
+
+  (setq-default buffer-file-coding-system 'iso-2022-7)
+
+  (setq default-input-method '("Tibetan" . "quail-tibetan-wylie")))
+
+(set-language-info-alist
+ "Tibetan" '((setup-function . setup-tibetan-environment)
+            (charset . (tibetan tibetan-1-column))
+            (coding-system . (tibetan))
+            (documentation . t)
+            (sample-text .
+"Tibetan (\e2\e$(7"70"]\e1"2\e$(8!;\e2\e$(7%P`"Q\e1"2\e$(8!;\e(B) \e2\e$(7#RP#SP#S\e1!>"7\e2$P`"Q\e1\e$(8!;\e2\e$(7"E0"S\e1"G\e$(8!;\e$(7"7\e2"20"[\e1\e$(8!;\e2\e$(7"D0"[\e1"#"G!>\e2"I0"]0"_\e1\e$(8!;\e2\e$(7"9`"Q\e1\e$(8!;\e2\e$(7"/0"S\e1\e$(8!;\e2\e$(7"5`"Q\e1\e2#2`#90"[\e1\e$(8!;\e2\e$(7"H`#A`"U0"c\e1!>\e(B")))
+
+
+;;;
+;;; Definitions of conversion data.
+;;;
+
+
+;;; alists for tibetan char <-> transcription conversion
+;;; longer transcription should come first
+(defconst tibetan-consonant-transcription-alist
+  '(("tsh" . "\e$(7";\e(B")
+    ("dzh" . "\e$(7"=\e(B")
+    ("kSH" . "\e$(7"J\e(B")
+    ("kh" . "\e$(7""\e(B")
+    ("gh" . "\e$(7"$\e(B")
+    ("ng" . "\e$(7"%\e(B")
+    ("ch" . "\e$(7"'\e(B")
+    ("ny" . "\e$(7"*\e(B")
+    ("TH" . "\e$(7",\e(B")
+    ("DH" . "\e$(7".\e(B")
+    ("th" . "\e$(7"1\e(B")
+    ("dh" . "\e$(7"3\e(B")
+    ("ph" . "\e$(7"6\e(B")
+    ("bh" . "\e$(7"8\e(B")
+    ("ts" . "\e$(7":\e(B")
+    ("dz" . "\e$(7"<\e(B")
+    ("zh" . "\e$(7"?\e(B")
+    ("sh" . "\e$(7"E\e(B")
+    ("SH" . "\e$(7"F\e(B")
+    ("k" . "\e$(7"!\e(B")
+    ("g" . "\e$(7"#\e(B")
+    ("c" . "\e$(7"&\e(B")
+    ("j" . "\e$(7"(\e(B")
+    ("T" . "\e$(7"+\e(B")
+    ("D" . "\e$(7"-\e(B")
+    ("N" . "\e$(7"/\e(B")
+    ("t" . "\e$(7"0\e(B")
+    ("d" . "\e$(7"2\e(B")
+    ("n" . "\e$(7"4\e(B")
+    ("p" . "\e$(7"5\e(B")
+    ("b" . "\e$(7"7\e(B")
+    ("m" . "\e$(7"9\e(B")
+    ("w" . "\e$(7">\e(B")
+    ("z" . "\e$(7"@\e(B")
+    ("'" . "\e$(7"A\e(B")
+    ("y" . "\e$(7"B\e(B")
+    ("r" . "\e$(7"C\e(B")
+    ("l" . "\e$(7"D\e(B")
+    ("s" . "\e$(7"G\e(B")
+    ("h" . "\e$(7"H\e(B")
+    ("H" . "\e$(7"H\e(B")
+    ("A" . "\e$(7"I\e(B")))
+
+
+(defconst tibetan-vowel-transcription-alist
+  '(("ai" . "\e$(7"\\e(B")
+    ("au" . "\e$(7"^\e(B")
+    ("ee" . "\e$(7"\\e(B")
+    ("oo" . "\e$(7"^\e(B")
+    ("a" . "\e$(7"Q\e(B")                        ; invisible vowel sign (\x2251)
+    ("i" . "\e$(7"S\e(B")
+    ("u" . "\e$(7"U\e(B")
+    ("e" . "\e$(7"[\e(B")
+    ("o" . "\e$(7"]\e(B")
+    ("E" . "\e$(7"\\e(B")
+    ("O" . "\e$(7"^\e(B")
+    ("I" . "\e$(7"a\e(B")
+    ("M" . "\e$(7"_\e(B")
+    ("~" . "\e$(7"c\e(B")                        ; not specified in Ext.wylie
+    ("`" . "\e$(7"d\e(B")                        ; idem.
+    ("," . "\e$(7"e\e(B")                        ; idem.
+    ("v" . "\e$(7"g\e(B")                        ; idem.
+    ("V" . "\e$(7"h\e(B")                        ; idem.
+    ("x" . "\e$(7"i\e(B")                        ; idem.
+    ("X" . "\e$(7"j\e(B")                        ; idem.
+    ("q" . "\e$(7"k\e(B")                        ; idem.
+    ("Q" . "\e$(7"l\e(B")                        ; idem.
+    ("_o" . "\e$(7!g\e(B")                       ; idem.
+    ("_O" . "\e$(7!e\e(B")                       ; idem.
+    ("_/" . "\e$(7!I\e(B")                       ; idem.
+    ))
+
+(defconst tibetan-precomposed-transcription-alist
+  '(("phyw" . "\e$(7$G\e(B")
+    ("tshw" . "\e$(7$)\e(B")
+    ("rtsw" . "\e$(7%.\e(B")
+    ("khw" . "\e$(7$"\e(B")
+    ("nyw" . "\e$(7$%\e(B")
+    ("tsw" . "\e$(7$(\e(B")
+    ("zhw" . "\e$(7$*\e(B")
+    ("shw" . "\e$(7$.\e(B")
+    ("khy" . "\e$(7$A\e(B")
+    ("phy" . "\e$(7$D\e(B")
+    ("khr" . "\e$(7$Q\e(B")
+    ("thr" . "\e$(7$T\e(B")
+    ("phr" . "\e$(7$W\e(B")
+    ("shr" . "\e$(7$Z\e(B")
+    ("dzr" . "\e$(7$^\e(B")
+    ("grw" . "\e$(7$_\e(B")
+    ("rng" . "\e$(7%#\e(B")
+    ("rny" . "\e$(7%%\e(B")
+    ("rts" . "\e$(7%+\e(B")
+    ("rdz" . "\e$(7%,\e(B")
+    ("rgw" . "\e$(7%-\e(B")
+    ("rky" . "\e$(7%0\e(B")
+    ("rgy" . "\e$(7%1\e(B")
+    ("rmy" . "\e$(7%2\e(B")
+    ("lng" . "\e$(7%B\e(B")
+    ("sng" . "\e$(7%R\e(B")
+    ("sny" . "\e$(7%S\e(B")
+    ("sts" . "\e$(7%Z\e(B")
+    ("sky" . "\e$(7%`\e(B")
+    ("sgy" . "\e$(7%a\e(B")
+    ("spy" . "\e$(7%b\e(B")
+    ("sby" . "\e$(7%c\e(B")
+    ("smy" . "\e$(7%d\e(B")
+    ("skr" . "\e$(7%p\e(B")
+    ("sgr" . "\e$(7%q\e(B")
+    ("snr" . "\e$(7%r\e(B")
+    ("spr" . "\e$(7%s\e(B")
+    ("sbr" . "\e$(7%t\e(B")
+    ("smr" . "\e$(7%u\e(B")
+    ("kw" . "\e$(7$!\e(B")
+    ("gw" . "\e$(7$#\e(B")
+    ("cw" . "\e$(7$$\e(B")
+    ("tw" . "\e$(7$&\e(B")
+    ("dw" . "\e$(7$'\e(B")
+    ("zw" . "\e$(7$+\e(B")
+    ("rw" . "\e$(7$,\e(B")
+    ("lw" . "\e$(7$-\e(B")
+    ("sw" . "\e$(7$/\e(B")
+    ("hw" . "\e$(7$0\e(B")
+    ("ky" . "\e$(7$@\e(B")
+    ("gy" . "\e$(7$B\e(B")
+    ("py" . "\e$(7$C\e(B")
+    ("by" . "\e$(7$E\e(B")
+    ("my" . "\e$(7$F\e(B")
+    ("kr" . "\e$(7$P\e(B")
+    ("gr" . "\e$(7$R\e(B")
+    ("tr" . "\e$(7$S\e(B")
+    ("dr" . "\e$(7$U\e(B")
+    ("pr" . "\e$(7$V\e(B")
+    ("brk" . "\e$(7"7%!\e(B")
+    ("brg" . "\e$(7"7%"\e(B")
+    ("brng" . "\e$(7"7%#\e(B")
+    ("brj" . "\e$(7"7%$\e(B")
+    ("brny" . "\e$(7"7%%\e(B")
+    ("brt" . "\e$(7"7%&\e(B")
+    ("brd" . "\e$(7"7%'\e(B")
+    ("brn" . "\e$(7"7%(\e(B")
+    ("brts" . "\e$(7"7%+\e(B")
+    ("brdz" . "\e$(7"7%,\e(B")
+    ("brl" . "\e$(7"7$d\e(B")
+    ("br" . "\e$(7$X\e(B")
+    ("mr" . "\e$(7$Y\e(B")
+    ("sr" . "\e$(7$[\e(B")
+    ("hr" . "\e$(7$\\e(B")
+    ("jr" . "\e$(7$]\e(B")
+    ("kl" . "\e$(7$`\e(B")
+    ("gl" . "\e$(7$a\e(B")
+    ("blt" . "\e$(7"7%E\e(B")
+    ("bld" . "\e$(7"7%F\e(B")
+    ("bl" . "\e$(7$b\e(B")
+    ("zl" . "\e$(7$c\e(B")
+    ("rl" . "\e$(7$d\e(B")
+    ("sl" . "\e$(7$e\e(B")
+    ("rk" . "\e$(7%!\e(B")
+    ("rg" . "\e$(7%"\e(B")
+    ("rj" . "\e$(7%$\e(B")
+    ("rt" . "\e$(7%&\e(B")
+    ("rd" . "\e$(7%'\e(B")
+    ("rn" . "\e$(7%(\e(B")
+    ("rb" . "\e$(7%)\e(B")
+    ("rm" . "\e$(7%*\e(B")
+    ("lk" . "\e$(7%@\e(B")
+    ("lg" . "\e$(7%A\e(B")
+    ("lc" . "\e$(7%C\e(B")
+    ("lj" . "\e$(7%D\e(B")
+    ("lt" . "\e$(7%E\e(B")
+    ("ld" . "\e$(7%F\e(B")
+    ("ln" . "\e$(7!!\e(B")                       ; dummy \x2121
+    ("lp" . "\e$(7%G\e(B")
+    ("lb" . "\e$(7%H\e(B")
+    ("lh" . "\e$(7%I\e(B")
+    ("sk" . "\e$(7%P\e(B")
+    ("sg" . "\e$(7%Q\e(B")
+    ("st" . "\e$(7%T\e(B")
+    ("sd" . "\e$(7%U\e(B")
+    ("sn" . "\e$(7%V\e(B")
+    ("sp" . "\e$(7%W\e(B")
+    ("sb" . "\e$(7%X\e(B")
+    ("sm" . "\e$(7%Y\e(B")))
+
+(defconst tibetan-subjoined-transcription-alist
+  '(("+k"  . "\e$(7#!\e(B")
+    ("+kh" . "\e$(7#"\e(B")
+    ("+g"  . "\e$(7##\e(B")
+    ("+gh" . "\e$(7#$\e(B")
+    ("+ng" . "\e$(7#%\e(B")
+    ("+c"  . "\e$(7#&\e(B")
+    ("+ch" . "\e$(7#'\e(B")
+    ("+j"  . "\e$(7#(\e(B")
+    ("+ny"  . "\e$(7#*\e(B")
+    ("+T"  . "\e$(7#+\e(B")
+    ("+TH" . "\e$(7#,\e(B")
+    ("+D"  . "\e$(7#-\e(B")
+    ("+DH" . "\e$(7#.\e(B")
+    ("+N"  . "\e$(7#/\e(B")
+    ("+t"  . "\e$(7#0\e(B")
+    ("+th" . "\e$(7#1\e(B")
+    ("+d"  . "\e$(7#2\e(B")
+    ("+dh" . "\e$(7#3\e(B")
+    ("+n"  . "\e$(7#4\e(B")
+    ("+p"  . "\e$(7#5\e(B")
+    ("+ph" . "\e$(7#6\e(B")
+    ("+b"  . "\e$(7#7\e(B")
+    ("+bh" . "\e$(7#8\e(B")
+    ("+m"  . "\e$(7#9\e(B")
+    ("+ts" . "\e$(7#:\e(B")
+    ("+tsh" . "\e$(7#;\e(B")
+    ("+dz" . "\e$(7#<\e(B")
+    ("+dzh" . "\e$(7#=\e(B")
+    ("+w"  . "\e$(7#>\e(B")
+    ("+zh" . "\e$(7#?\e(B")
+    ("+z"  . "\e$(7#@\e(B")
+    ("+'"  . "\e$(7#A\e(B")
+    ("+y"  . "\e$(7#B\e(B")
+    ("+r"  . "\e$(7#C\e(B")
+    ("+l"  . "\e$(7#D\e(B")
+    ("+sh" . "\e$(7#E\e(B")
+    ("+SH" . "\e$(7#F\e(B")
+    ("+s"  . "\e$(7#G\e(B")
+    ("+h"  . "\e$(7#H\e(B")
+    ("+A"  . "\e$(7#I\e(B")
+    ("+kSH" . "\e$(7#J\e(B")
+    ("R"   . "\e$(7#P\e(B")))
+
+;;;
+;;; alist for Tibetan base consonant <-> subjoined consonant conversion.
+;;;
+(defconst tibetan-base-to-subjoined-alist
+  '(("\e$(7"!\e(B" . "\e$(7#!\e(B")
+    ("\e$(7""\e(B" . "\e$(7#"\e(B")
+    ("\e$(7"#\e(B" . "\e$(7##\e(B")
+    ("\e$(7"$\e(B" . "\e$(7#$\e(B")
+    ("\e$(7"%\e(B" . "\e$(7#%\e(B")
+    ("\e$(7"&\e(B" . "\e$(7#&\e(B")
+    ("\e$(7"'\e(B" . "\e$(7#'\e(B")
+    ("\e$(7"(\e(B" . "\e$(7#(\e(B")
+    ("\e$(7"*\e(B" . "\e$(7#*\e(B")
+    ("\e$(7"+\e(B" . "\e$(7#+\e(B")
+    ("\e$(7",\e(B" . "\e$(7#,\e(B")
+    ("\e$(7"-\e(B" . "\e$(7#-\e(B")
+    ("\e$(7".\e(B" . "\e$(7#.\e(B")
+    ("\e$(7"/\e(B" . "\e$(7#/\e(B")
+    ("\e$(7"0\e(B" . "\e$(7#0\e(B")
+    ("\e$(7"1\e(B" . "\e$(7#1\e(B")
+    ("\e$(7"2\e(B" . "\e$(7#2\e(B")
+    ("\e$(7"3\e(B" . "\e$(7#3\e(B")
+    ("\e$(7"4\e(B" . "\e$(7#4\e(B")
+    ("\e$(7"5\e(B" . "\e$(7#5\e(B")
+    ("\e$(7"6\e(B" . "\e$(7#6\e(B")
+    ("\e$(7"7\e(B" . "\e$(7#7\e(B")
+    ("\e$(7"8\e(B" . "\e$(7#8\e(B")
+    ("\e$(7"9\e(B" . "\e$(7#9\e(B")
+    ("\e$(7":\e(B" . "\e$(7#:\e(B")
+    ("\e$(7";\e(B" . "\e$(7#;\e(B")
+    ("\e$(7"<\e(B" . "\e$(7#<\e(B")
+    ("\e$(7"=\e(B" . "\e$(7#=\e(B")
+    ("\e$(7">\e(B" . "\e$(7#>\e(B")
+    ("\e$(7"?\e(B" . "\e$(7#?\e(B")
+    ("\e$(7"@\e(B" . "\e$(7#@\e(B")
+    ("\e$(7"A\e(B" . "\e$(7#A\e(B")
+    ("\e$(7"B\e(B" . "\e$(7#B\e(B")
+    ("\e$(7"C\e(B" . "\e$(7#C\e(B")
+    ("\e$(7"D\e(B" . "\e$(7#D\e(B")
+    ("\e$(7"E\e(B" . "\e$(7#E\e(B")
+    ("\e$(7"F\e(B" . "\e$(7#F\e(B")
+    ("\e$(7"G\e(B" . "\e$(7#G\e(B")
+    ("\e$(7"H\e(B" . "\e$(7#H\e(B")
+    ("\e$(7"I\e(B" . "\e$(7#I\e(B")
+    ("\e$(7"J\e(B" . "\e$(7#J\e(B")))
+
+;;;
+;;; alist for Tibetan consonantic components <-> precomposed glyph conversion.
+;;; (includes some punctuation conversion rules)
+;;;
+(defconst tibetan-precomposition-rule-alist
+  '(("\e$(7"6#B#>\e(B" . "\e$(7$G\e(B")
+    ("\e$(7"##C#>\e(B" . "\e$(7$_\e(B")
+    ("\e$(7";#>\e(B" . "\e$(7$)\e(B")
+    ("\e$(7"C#:#>\e(B" . "\e$(7%.\e(B")
+    ("\e$(7"C###>\e(B" . "\e$(7%-\e(B")
+    ("\e$(7"C#!#B\e(B" . "\e$(7%0\e(B")
+    ("\e$(7"C###B\e(B" . "\e$(7%1\e(B")
+    ("\e$(7"C#9#B\e(B" . "\e$(7%2\e(B")
+    ("\e$(7"G#!#B\e(B" . "\e$(7%`\e(B")
+    ("\e$(7"G###B\e(B" . "\e$(7%a\e(B")
+    ("\e$(7"G#5#B\e(B" . "\e$(7%b\e(B")
+    ("\e$(7"G#7#B\e(B" . "\e$(7%c\e(B")
+    ("\e$(7"G#9#B\e(B" . "\e$(7%d\e(B")
+    ("\e$(7"G#!#C\e(B" . "\e$(7%p\e(B")
+    ("\e$(7"G###C\e(B" . "\e$(7%q\e(B")
+    ("\e$(7"G#4#C\e(B" . "\e$(7%r\e(B")
+    ("\e$(7"G#5#C\e(B" . "\e$(7%s\e(B")
+    ("\e$(7"G#7#C\e(B" . "\e$(7%t\e(B")
+    ("\e$(7"G#9#C\e(B" . "\e$(7%u\e(B")
+    ("\e$(7""#>\e(B" . "\e$(7$"\e(B")
+    ("\e$(7"*#>\e(B" . "\e$(7$%\e(B")
+    ("\e$(7":#>\e(B" . "\e$(7$(\e(B")
+    ("\e$(7"?#>\e(B" . "\e$(7$*\e(B")
+    ("\e$(7"E#>\e(B" . "\e$(7$.\e(B")
+    ("\e$(7""#B\e(B" . "\e$(7$A\e(B")
+    ("\e$(7"6#B\e(B" . "\e$(7$D\e(B")
+    ("\e$(7""#C\e(B" . "\e$(7$Q\e(B")
+    ("\e$(7"1#C\e(B" . "\e$(7$T\e(B")
+    ("\e$(7"6#C\e(B" . "\e$(7$W\e(B")
+    ("\e$(7"E#C\e(B" . "\e$(7$Z\e(B")
+    ("\e$(7"<#C\e(B" . "\e$(7$^\e(B")
+    ("\e$(7"C#%\e(B" . "\e$(7%#\e(B")
+    ("\e$(7"C#*\e(B" . "\e$(7%%\e(B")
+    ("\e$(7"C#:\e(B" . "\e$(7%+\e(B")
+    ("\e$(7"C#<\e(B" . "\e$(7%,\e(B")
+    ("\e$(7"D#%\e(B" . "\e$(7%B\e(B")
+    ("\e$(7"G#%\e(B" . "\e$(7%R\e(B")
+    ("\e$(7"G#*\e(B" . "\e$(7%S\e(B")
+    ("\e$(7"G#:\e(B" . "\e$(7%Z\e(B")
+    ("\e$(7"!#>\e(B" . "\e$(7$!\e(B")
+    ("\e$(7"##>\e(B" . "\e$(7$#\e(B")
+    ("\e$(7"&#>\e(B" . "\e$(7$$\e(B")
+    ("\e$(7"0#>\e(B" . "\e$(7$&\e(B")
+    ("\e$(7"2#>\e(B" . "\e$(7$'\e(B")
+    ("\e$(7"@#>\e(B" . "\e$(7$+\e(B")
+    ("\e$(7"C#>\e(B" . "\e$(7$,\e(B")
+    ("\e$(7"D#>\e(B" . "\e$(7$-\e(B")
+    ("\e$(7"G#>\e(B" . "\e$(7$/\e(B")
+    ("\e$(7"H#>\e(B" . "\e$(7$0\e(B")
+    ("\e$(7"!#B\e(B" . "\e$(7$@\e(B")
+    ("\e$(7"##B\e(B" . "\e$(7$B\e(B")
+    ("\e$(7"5#B\e(B" . "\e$(7$C\e(B")
+    ("\e$(7"7#B\e(B" . "\e$(7$E\e(B")
+    ("\e$(7"9#B\e(B" . "\e$(7$F\e(B")
+    ("\e$(7"!#C\e(B" . "\e$(7$P\e(B")
+    ("\e$(7"##C\e(B" . "\e$(7$R\e(B")
+    ("\e$(7"0#C\e(B" . "\e$(7$S\e(B")
+    ("\e$(7"2#C\e(B" . "\e$(7$U\e(B")
+    ("\e$(7"5#C\e(B" . "\e$(7$V\e(B")
+    ("\e$(7"7#C\e(B" . "\e$(7$X\e(B")
+    ("\e$(7"9#C\e(B" . "\e$(7$Y\e(B")
+    ("\e$(7"G#C\e(B" . "\e$(7$[\e(B")
+    ("\e$(7"H#C\e(B" . "\e$(7$\\e(B")
+    ("\e$(7"(#C\e(B" . "\e$(7$]\e(B")
+    ("\e$(7"!#D\e(B" . "\e$(7$`\e(B")
+    ("\e$(7"##D\e(B" . "\e$(7$a\e(B")
+    ("\e$(7"7#D\e(B" . "\e$(7$b\e(B")
+    ("\e$(7"@#D\e(B" . "\e$(7$c\e(B")
+    ("\e$(7"C#D\e(B" . "\e$(7$d\e(B")
+    ("\e$(7"G#D\e(B" . "\e$(7$e\e(B")
+    ("\e$(7"C#!\e(B" . "\e$(7%!\e(B")
+    ("\e$(7"C##\e(B" . "\e$(7%"\e(B")
+    ("\e$(7"C#(\e(B" . "\e$(7%$\e(B")
+    ("\e$(7"C#0\e(B" . "\e$(7%&\e(B")
+    ("\e$(7"C#2\e(B" . "\e$(7%'\e(B")
+    ("\e$(7"C#4\e(B" . "\e$(7%(\e(B")
+    ("\e$(7"C#7\e(B" . "\e$(7%)\e(B")
+    ("\e$(7"C#9\e(B" . "\e$(7%*\e(B")
+    ("\e$(7"D#!\e(B" . "\e$(7%@\e(B")
+    ("\e$(7"D##\e(B" . "\e$(7%A\e(B")
+    ("\e$(7"D#&\e(B" . "\e$(7%C\e(B")
+    ("\e$(7"D#(\e(B" . "\e$(7%D\e(B")
+    ("\e$(7"D#0\e(B" . "\e$(7%E\e(B")
+    ("\e$(7"D#2\e(B" . "\e$(7%F\e(B")
+    ("\e$(7"D#5\e(B" . "\e$(7%G\e(B")
+    ("\e$(7"D#7\e(B" . "\e$(7%H\e(B")
+    ("\e$(7"D#H\e(B" . "\e$(7%I\e(B")
+    ("\e$(7"G#!\e(B" . "\e$(7%P\e(B")
+    ("\e$(7"G##\e(B" . "\e$(7%Q\e(B")
+    ("\e$(7"G#0\e(B" . "\e$(7%T\e(B")
+    ("\e$(7"G#2\e(B" . "\e$(7%U\e(B")
+    ("\e$(7"G#4\e(B" . "\e$(7%V\e(B")
+    ("\e$(7"G#5\e(B" . "\e$(7%W\e(B")
+    ("\e$(7"G#7\e(B" . "\e$(7%X\e(B")
+    ("\e$(7"G#9\e(B" . "\e$(7%Y\e(B")
+    ("\e$(7!=\e(B" . "\e$(8!=\e(B")                        ; 2 col <-> 1 col
+    ("\e$(7!?\e(B" . "\e$(8!?\e(B")
+    ("\e$(7!@\e(B" . "\e$(8!@\e(B")
+    ("\e$(7!A\e(B" . "\e$(8!A\e(B")
+    ("\e$(7"`\e(B" . "\e$(8"`\e(B")
+    ("\e$(7!;\e(B" . "\e$(8!;\e(B")
+    ("\e$(7!D\e(B" . "\e$(8!D\e(B")
+    ("\e$(7!>\e(B \e$(7!>\e(B" . "\e2\e$(7!>P\e(B P\e$(7!>\e1\e(B")                      ; Yes this is dirty. But ...
+    ("\e$(7!4!5!5\e(B" . "\e2\e$(7#RP#SP#SP#S\e1\e(B")
+    ("\e$(7!4!5\e(B" . "\e2\e$(7#RP#SP#S\e1\e(B")
+    ("\e$(7!6\e(B" . "\e2\e$(7#RP#S_!I\e1\e(B")
+    ("\e$(7!4\e(B"   . "\e2\e$(7#RP#S\e1\e(B")))
+
+(defvar tibetan-regexp
+  (let ((l (append tibetan-consonant-transcription-alist
+                  tibetan-vowel-transcription-alist
+                  tibetan-subjoined-transcription-alist))
+       temp)
+    (setq temp "\\(")
+    (setq temp (concat temp (car (car l))))
+    (setq l (cdr l))
+    (while l
+      (setq temp (concat temp "\\|" (car (car l))))
+      (setq l (cdr l)))
+    (concat temp "\\)$"))
+  "Regexp string to match a romanized Tibetan character component, i.e.,
+base and subjoined consonant, vowel and vowel modifier. The result of matching
+is to be used for indexing alists at conversion from a roman transcription to
+the corresponding Tibetan character.")
+
+(defvar tibetan-precomposed-regexp
+  (let ((l tibetan-precomposed-transcription-alist)
+       temp)
+    (setq temp "^\\(")
+    (setq temp
+         (concat temp (car (car l))))
+    (setq l (cdr l))
+    (while l
+      (setq temp
+           (concat temp "\\|" (car (car l))))
+      (setq l (cdr l)))
+    (concat temp "\\)"))
+  "Regexp string to match a romanized Tibetan complex consonant.
+The result of matching is to be used for indexing alists when the input key
+from an input method is converted to the corresponding precomposed glyph.")
+
+(defvar tibetan-precomposition-rule-regexp
+  (let ((l tibetan-precomposition-rule-alist)
+       temp)
+    (setq temp "\\(")
+    (setq temp (concat temp (car (car l))))
+    (setq l (cdr l))
+    (while l
+      (setq temp (concat temp "\\|" (car (car l))))
+      (setq l (cdr l)))
+    (concat temp "\\)"))
+  "Regexp string to match a sequence of Tibetan consonantic components, i.e.,
+one base consonant and one or more subjoined consonants.
+The result of matching is to be used for indexing alist when the component
+sequence is converted to the corresponding precomposed glyph.
+This also matches some punctuation characters which need conversion.")
+
+(defvar tibetan-decomposed nil)
+(defvar tibetan-decomposed-temp nil)
+
+;;; language/tibetan.el ends here