--- /dev/null
+;;; 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.
--- /dev/null
+;;; 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