diff options
author | Kenichi Handa <handa@m17n.org> | 2007-06-16 01:58:08 +0000 |
---|---|---|
committer | Kenichi Handa <handa@m17n.org> | 2007-06-16 01:58:08 +0000 |
commit | ee4f828424c4eeb6d421fec41ab3d34a66c719b1 (patch) | |
tree | f45ed5e433fe71a77f76ba04295947931b8f08e1 /lisp/language | |
parent | b878f5f15ab1c6074c6f839c08700185e6eb300b (diff) | |
download | emacs-ee4f828424c4eeb6d421fec41ab3d34a66c719b1.tar.gz |
New file.
Diffstat (limited to 'lisp/language')
-rw-r--r-- | lisp/language/tai-viet.el | 66 | ||||
-rw-r--r-- | lisp/language/tv-util.el | 145 |
2 files changed, 211 insertions, 0 deletions
diff --git a/lisp/language/tai-viet.el b/lisp/language/tai-viet.el new file mode 100644 index 00000000000..a262d5738ec --- /dev/null +++ b/lisp/language/tai-viet.el @@ -0,0 +1,66 @@ +;;; tai-viet.el --- support for Tai Viet -*- coding: utf-8; no-byte-compile: t -*- + +;; Copyright (C) 2007 +;; National Institute of Advanced Industrial Science and Technology (AIST) +;; Registration Number H13PRO009 +;; Copyright (C) 2007 Free Software Foundation, Inc. + +;; Keywords: multilingual, Tai Viet, i18n + +;; 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., 51 Franklin Street, Fifth Floor, +;; Boston, MA 02110-1301, USA. + +;;; Commentary: + +;; Tai Viet is being included in the Unicode at the range U+AA80..U+AADF. + +;;; Code: + +(set-char-table-range composition-function-table + '(#xAA80 . #xAADF) + 'tai-viet-composition-function) + +(set-language-info-alist + "TaiViet" '((charset unicode) + (coding-system utf-8) + (coding-priority utf-8) + (input-method . "tai-sonla") + (sample-text + "TaiViet (ꪁꪫꪱꪣ ꪽꪕ)\t\tꪅꪰꪙ ꪨꪮ ꪁꪫꪱ / ꪅꪾ ꪨ� ꪁꪫꪱ") + (documentation . "\ +TaiViet refers to the Tai language used by Tai people in +Vietnam, and also refers to the script used for this language. +Both the script and language have the same origin as that of Thai +language/script used in Thailand, but now they differ from each +other in a significant way (especially the scripts are). + +The language name is spelled as \"ꪁꪫꪱꪣ ꪽꪕ\", and the script name is +spelled as \"ꪎ� ꪽꪕ\" in the modern form, \"ꪎꪴ ꪽꪕ\" in the traditional +from. + +As the proposal for TaiViet script to the Unicode is still on +the progress, we use the Private Use Area for TaiViet +characters (U+F000..U+F07E). A TaiViet font encoded accordingly +is available at this web page: + http://www.m17n.org/TaiViet/ +"))) + +(provide 'tai-viet) + +;; Local Variables: +;; coding: utf-8 +;; End: diff --git a/lisp/language/tv-util.el b/lisp/language/tv-util.el new file mode 100644 index 00000000000..9407379e098 --- /dev/null +++ b/lisp/language/tv-util.el @@ -0,0 +1,145 @@ +;;; tv-util.el --- support for Tai Viet -*- coding: utf-8 -*- + +;; Copyright (C) 2007 +;; National Institute of Advanced Industrial Science and Technology (AIST) +;; Registration Number H13PRO009 + +;; Keywords: multilingual, Tai Viet, i18n + +;; 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., 51 Franklin Street, Fifth Floor, +;; Boston, MA 02110-1301, USA. + +;;; Code + +;; Regexp matching with a sequence of Tai Viet characters. +(defconst tai-viet-re + (format "[\xaa80-\xaac2\xaadb-\xaadf]+")) + +;; Char-table of information about glyph type of Tai Viet characters. +(defconst tai-viet-glyph-info + (let ((table (make-char-table nil)) + (specials '((right-overhang . "ꪊꪋꪌꪍꪏꪓꪖꪜꪞꪡꪤꪨ") + (left-overhang . "ꫂ") + (combining-vowel . "ꪴꪰꪲꪳꪷꪸꪾ") + (combining-tone . "꪿꫁")))) + ;; Set all TaiViet characters to `t'. + (set-char-table-range table (cons #xaa80 #xaac2) t) + (set-char-table-range table (cons #xaadb #xaadf) t) + ;; Overwrite it for special characters. + (dolist (elt specials) + (let ((category (car elt)) + (chars (cdr elt))) + (dotimes (i (length chars)) + (aset table (aref chars i) category)))) + table)) + +(defun tai-viet-compose-string (from to string) + "Compose Tai Viet characters in STRING between indices FROM and TO." + (let* ((ch (aref string from)) + (info (aref tai-viet-glyph-info ch)) + prev-info) + (if (eq info 'non-spacing) + (compose-string string from (1+ from) (string ch ?\t))) + (setq from (1+ from) prev-info info) + (while (and (< from to) + (tai-viet-char-p (setq ch (aref string from)))) + (setq info (aref tai-viet-glyph-info ch)) + (if (and (eq info 'non-spacing) + (eq prev-info 'non-spacing)) + (compose-string from (1+ from) (string ?\t ch))) + (setq from (1+ from) prev-info info)) + (if (eq info 'right-overhang) + (compose-string string (1- from) from (string ch ?\t))) + from)) + +(defun tai-viet-compose-region (from to) + "Compose Tai Viet characters in the region between FROM and TO." + (decompose-region from to) + (let ((normal-rule '(Br . Bl)) + (tone-rule '(tr . bl)) + (prev-viet nil) + ch info pos components overhang) + (while (< from to) + (or ch + (setq ch (char-after from) + info (aref tai-viet-glyph-info ch))) + (setq from (1+ from)) + (if (not info) + (setq prev-viet nil + ch nil) + (if (memq info '(combining-vowel combining-tone)) + (progn + ;; Display this as a spacing glyph. + (compose-region (1- from) from (string ?\t ch)) + (setq prev-viet t + ch nil)) + (setq pos (1- from) + components ch + overhang (if (eq info 'right-overhang) + 'right-overhang + (if (and (not prev-viet) (eq info 'left-overhang)) + 'left-overhang)) + prev-viet t + ch nil) + (if (and (< from to) + (setq ch (char-after from) + info (aref tai-viet-glyph-info ch))) + (if (memq info '(combining-vowel combining-tone)) + (progn + (setq components + (list components normal-rule ch) + from (1+ from) + ch nil) + (if (and (< from to) + (setq ch (char-after from) + info (aref tai-viet-glyph-info ch)) + (eq info 'combining-tone)) + (setq components (nconc components + (list tone-rule ch)) + from (1+ from))) + (if (eq overhang 'left-overhang) + (setq components (cons ?\t + (cons normal-rule components))) + (if (and (eq overhang 'right-overhang) + (>= from to)) + (setq components (nconc components + (list normal-rule ?\t))))) + (compose-region pos from components)) + (if (eq overhang 'left-overhang) + (compose-region pos from (string ?\t components)))) + (if (eq overhang 'left-overhang) + (compose-region pos from (string ?\t components)) + (if (and (eq overhang 'right-overhang) (>= from to)) + (compose-region pos from (string components ?\t)))))))) + from)) + + +;;;###autoload +(defun tai-viet-composition-function (pos &optional string) + (let (to) + (if string + (progn + (if (string-match tai-viet-re string pos) + (tai-viet-compose-string pos (match-end 0) string) + (1+ pos))) + (goto-char pos) + (if (looking-at tai-viet-re) + (tai-viet-compose-region pos (match-end 0)) + (1+ pos))))) + +;; +(provide 'tai-viet-util) |