Mercurial > emacs
changeset 90938:ab2b53b01252
New file.
author | Kenichi Handa <handa@m17n.org> |
---|---|
date | Sat, 16 Jun 2007 01:57:15 +0000 |
parents | 96de5ecac1f2 |
children | 7166fd1f20fa |
files | lisp/language/tv-util.el |
diffstat | 1 files changed, 145 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/language/tv-util.el Sat Jun 16 01:57:15 2007 +0000 @@ -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)