Mercurial > emacs
diff lisp/language/ind-util.el @ 41470:a43bf477cba7
New file.
author | Richard M. Stallman <rms@gnu.org> |
---|---|
date | Sun, 25 Nov 2001 02:41:14 +0000 |
parents | |
children | 6ef6e34cdba4 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/language/ind-util.el Sun Nov 25 02:41:14 2001 +0000 @@ -0,0 +1,997 @@ +;;; ind-util.el --- Transliteration and Misc. Tools for Indian Languages -*- coding: iso-2022-7bit; -*- + +;; Copyright (C) 2001 Free Software Foundation, Inc. + +;; Maintainer: KAWABATA, Taichi <batta@beige.ocn.ne.jp> +;; Keywords: multilingual, Indian, Devanagari + +;; 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: + +;; This file provides conversion between UCS and various +;; transliteration schemes, such as ITRANS, kyoto-harvard and aiba +;; methods. It also provides conversion between IS 13194 and UCS. +;; Finally, this program provides the compatibility support with +;; old implementation of Devanagari script. + +;;; Code: + +;;; Transliteration + +;; The followings provide the various transliteration schemes (such as +;; ITRANS, kyoto-harvard, and Aiba) of Indian scripts. They are also +;; used in quail/indian.el for typing Indian script in Emacs. + +(eval-and-compile +(require 'cl) + +(defun range (from to) + "Make the list of the integers of range FROM to TO." + (let (result) + (while (<= from to) (setq result (cons to result) to (1- to))) result)) + +(defun regexp-of-hashtbl-keys (hashtbl) + "Returns the regular expression of hashtable keys." + (let ((max-specpdl-size 1000)) + (regexp-opt + (sort + (let (dummy) + (maphash (function (lambda (key val) (setq dummy (cons key dummy)))) hashtbl) + dummy) + (function (lambda (x y) (> (length x) (length y)))))))) + +(defvar indian-dev-base-table + '( + (;; VOWELS (18) + (?$,15E(B nil) (?$,15F(B ?$,15~(B) (?$,15G(B ?$,15(B) (?$,15H(B ?$,16 (B) (?$,15I(B ?$,16!(B) (?$,15J(B ?$,16"(B) + (?$,15K(B ?$,16#(B) (?$,15L(B ?$,16$(B) (?$,15M(B ?$,16%(B) (?$,15N(B ?$,16&(B) (?$,15O(B ?$,16'(B) (?$,15P(B ?$,16((B) + (?$,15Q(B ?$,16)(B) (?$,15R(B ?$,16*(B) (?$,15S(B ?$,16+(B) (?$,15T(B ?$,16,(B) (?$,16@(B ?$,16B(B) (?$,16A(B ?$,16C(B)) + (;; CONSONANTS (currently 42, including special cases) + ?$,15U(B ?$,15V(B ?$,15W(B ?$,15X(B ?$,15Y(B ;; GUTTRULS + ?$,15Z(B ?$,15[(B ?$,15\(B ?$,15](B ?$,15^(B ;; PALATALS + ?$,15_(B ?$,15`(B ?$,15a(B ?$,15b(B ?$,15c(B ;; CEREBRALS + ?$,15d(B ?$,15e(B ?$,15f(B ?$,15g(B ?$,15h(B ?$,15i(B ;; DENTALS + ?$,15j(B ?$,15k(B ?$,15l(B ?$,15m(B ?$,15n(B ;; LABIALS + ?$,15o(B ?$,15p(B ?$,15q(B ?$,15r(B ?$,15s(B ?$,15t(B ?$,15u(B ;; SEMIVOWELS + ?$,15v(B ?$,15w(B ?$,15x(B ?$,15y(B ;; SIBILANTS + ?$,168(B ?$,169(B ?$,16:(B ?$,16;(B ?$,16<(B ?$,16=(B ?$,16>(B ?$,16?(B ;; NUKTAS + "$,15\6-5^(B" "$,15U6-5w(B") + (;; Misc Symbols (7) + ?$,15A(B ?$,15B(B ?$,15C(B ?$,15}(B ?$,16-(B ?$,160(B ?$,16D(B) + (;; Digits (10) + ?$,16F(B ?$,16G(B ?$,16H(B ?$,16I(B ?$,16J(B ?$,16K(B ?$,16L(B ?$,16M(B ?$,16N(B ?$,16O(B) + (;; Inscript-extra (4) (#, $, ^, *, ]) + "$,16-5p(B" "$,15p6-(B" "$,15d6-5p(B" "$,15v6-5p(B" "$,15|(B"))) + +(defvar indian-pnj-base-table nil) +(defvar indian-ori-base-table nil) +(defvar indian-bng-base-table nil) +(defvar indian-asm-base-table nil) +(defvar indian-tlg-base-table nil) +(defvar indian-knd-base-table nil) +(defvar indian-mlm-base-table nil) +(defvar indian-tml-base-table nil) + +(defvar indian-base-table-to-language-alist + '((indian-dev-base-table . "Devanagari") + (indian-pnj-base-table . "Punjabi") + (indian-ori-base-table . "Oriya") + (indian-bng-base-table . "Bengali") + (indian-asm-base-table . "Assamese") + (indian-tlg-base-table . "Telugu") + (indian-knd-base-table . "Kannada") + (indian-mlm-base-table . "Malayalam") + (indian-tml-base-table . "Tamil"))) + +(defvar indian-itrans-v5-table + '(;; for encode/decode + (;; vowels -- 18 + "a" ("aa" "A") "i" ("ii" "I") "u" ("uu" "U") + ("RRi" "R^i") ("LLi" "L^i") (".c" "e.c") nil "e" "ai" + "o.c" nil "o" "au" ("RRI" "R^I") ("LLI" "L^I")) + (;; consonants -- 40 + "k" "kh" "g" "gh" ("~N" "N^") + "ch" ("Ch" "chh") "j" "jh" ("~n" "JN") + "T" "Th" "D" "Dh" "N" + "t" "th" "d" "dh" "n" "nh" + "p" "ph" "b" "bh" "m" + "y" "r" "rh" "l" ("L" "ld") nil ("v" "w") + "sh" ("Sh" "shh") "s" "h" + "q" "K" "G" ("J" "z") ".D" ".Dh" "f" ("Y" "yh") + ("GY" "dny") "x") + (;; misc -- 7 + ".N" (".n" "M") "H" ".a" ".h" ("AUM" "OM") ".."))) + +(defvar indian-kyoto-harvard-table + '(;; for encode/decode + (;; vowel + "a" ("A" "aa") "i" ("I" "ii") "u" ("U" "uu") + "R" ("L" "lR") nil nil "e" "ai" + nil nil "o" "au" ("q" "RR" "Q") ("E" "LL" "lRR")) + (;; consonant + "k" "kh" "g" "gh" "G" + "c" "ch" "j" "jh" "J" + "T" "Th" "D" "Dh" "N" + "t" "th" "d" "dh" "n" nil + "p" "ph" "b" "bh" "m" + "y" "r" nil "l" "L" nil "v" + ("z" "Z") "S" "s" "h" + nil nil nil nil nil nil nil nil + nil nil) + (;; misc + nil "M" "H" "'" nil "." nil))) + +(defvar indian-harvard-table + '(;; for encode/decode + (;; vowel + "a" ("A" "aa") "i" ("I" "ii") "u" ("U" "uu") + "R" ("L" "lR") nil nil "e" "ai" + nil nil "o" "au" ("RR" "q" "Q") ("LL" "E" "lRR")) + (;; consonant + "k" "kh" "g" "gh" "G" + "c" "ch" "j" "jh" "J" + "T" "Th" "D" "Dh" "N" + "t" "th" "d" "dh" "n" nil + "p" "ph" "b" "bh" "m" + "y" "r" nil "l" "L" nil "v" + ("z" "Z") "S" "s" "h" + nil nil nil nil nil nil nil nil + nil nil) + (;; misc + nil "M" "H" "'" nil "." nil))) + +(defvar indian-tokyo-table + '(;; for encode/decode + (;; vowel + "a" ("A" "aa") "i" ("I" "ii") "u" ("U" "uu") + "R" ("L" "lR") nil nil "e" "ai" + nil nil "o" "au" ("Q" "RR" "q") ("E" "LL" "lRR")) + (;; consonant + "k" "kh" "g" "gh" "G" + "c" "ch" "j" "jh" "J" + "T" "Th" "D" "Dh" "N" + "t" "th" "d" "dh" "n" nil + "p" "ph" "b" "bh" "m" + "y" "r" nil "l" "L" nil "v" + ("Z" "z") "S" "s" "h" + nil nil nil nil nil nil nil nil + nil nil) + (;; misc + nil "M" "H" "'" nil "." nil))) + +(defvar indian-aiba-table + '(;; for encode/decode + (;; vowel + "a" "aa" "i" "ii" "u" "uu" + ".r" ".l" nil nil "e" "ai" + nil nil "o" "au" "~r" "~l") + (;; consonant + "k" "kh" "g" "gh" "^n" + "c" "ch" "j" "jh" "~n" + ".t" ".th" ".d" ".dh" ".n" + "t" "th" "d" "dh" "n" nil + "p" "ph" "b" "bh" "m" + "y" "r" nil "l" nil nil "v" + "^s" ".s" "s" "h" + nil nil nil nil nil nil nil nil + nil nil) + (;; misc + nil ".m" ".h" "'" nil "." nil))) + +(defun mapthread (function seq1 &rest seqrest) + "Apply FUNCTION to each element of SEQ1 and return result list. +If there are several SEQRESTs, FUNCTION is called with that many +arguments, with all possible combinations of these multiple SEQUENCES. +Thus, if SEQ1 contains 3 elements and SEQ2 contains 5 elements, then +FUNCTION will be called 15 times." + (if seqrest + (mapcar + (lambda (x) + (apply + 'mapthread + `(lambda (&rest y) (apply (quote ,function) ,x y)) + seqrest)) + seq1) + (mapcar function seq1))) + +(defun indian--puthash-char (char trans-char hashtbls) + (let ((encode-hash (car hashtbls)) ;; char -> trans + (decode-hash (cdr hashtbls)) ;; trans -> char + ) + ;; char -- nil / char / string (/ list of vowel & matra) + ;; trans-char -- nil / string / list of strings + (when (and char trans-char) + (if (stringp trans-char) (setq trans-char (list trans-char))) + (if (char-valid-p char) (setq char (char-to-string char))) + (puthash char (car trans-char) encode-hash) + (mapc + '(lambda (trans) + (puthash trans char decode-hash)) + trans-char)))) + +(defun indian--puthash-v (v trans-v hashtbls) + (mapcar* + '(lambda (v trans-v) + (indian--puthash-char (car v) trans-v hashtbls)) + v trans-v)) + +(defun indian--puthash-c (c trans-c halant hashtbls) + (mapcar* + '(lambda (c trans-c) + (if (char-valid-p c) (setq c (char-to-string c))) + (indian--puthash-char (concat c halant) trans-c hashtbls)) + c trans-c)) + +(defun indian--puthash-m (m trans-m hashtbls) + (mapcar* + '(lambda (m trans-m) + (indian--puthash-char m trans-m hashtbls)) + m trans-m)) + +(defun indian--puthash-cv (c trans-c v trans-v hashtbls) + (mapcar* + '(lambda (c trans-c) + (mapcar* + (lambda (v trans-v) + (when (and c trans-c v trans-v) + (if (char-valid-p c) (setq c (char-to-string c))) + (setq v (if (char-valid-p (cadr v)) (char-to-string (cadr v)) "")) + (if (stringp trans-c) (setq trans-c (list trans-c))) + (if (stringp trans-v) (setq trans-v (list trans-v))) + (indian--puthash-char + (concat c v) + (apply 'append + (mapthread 'concat trans-c trans-v)) + hashtbls))) + v trans-v)) + c trans-c)) + +(defun indian-make-hash (table trans-table) + "Indian Transliteration Hash for decode/encode" + (let* ((encode-hash (makehash 'equal)) + (decode-hash (makehash 'equal)) + (hashtbls (cons encode-hash decode-hash)) + (vowels (elt table 0)) + (consonants (elt table 1)) + (misc (elt table 2)) + (digits (elt table 3)) + (halant (char-to-string (elt misc 4))) + (trans-vowels (elt trans-table 0)) + (trans-consonants (elt trans-table 1)) + (trans-misc (elt trans-table 2)) + (trans-digits '("0" "1" "2" "3" "4" "5" "6" "7" "8" "9"))) + (indian--puthash-v vowels trans-vowels hashtbls) + (indian--puthash-c consonants trans-consonants halant hashtbls) + (indian--puthash-cv consonants trans-consonants + vowels trans-vowels hashtbls) + (indian--puthash-m misc trans-misc hashtbls) + (indian--puthash-m digits trans-digits hashtbls) + hashtbls)) + +(defvar indian-dev-itrans-v5-hash + (indian-make-hash indian-dev-base-table + indian-itrans-v5-table)) +(defvar indian-dev-kyoto-harvard-hash + (indian-make-hash indian-dev-base-table + indian-kyoto-harvard-table)) +(defvar indian-dev-aiba-hash + (indian-make-hash indian-dev-base-table + indian-aiba-table)) + +) + +(defmacro indian-translate-region (from to hashtable encode-p) + `(save-excursion + (save-restriction + (let ((regexp ,(regexp-of-hashtbl-keys + (if encode-p (car (eval hashtable)) + (cdr (eval hashtable)))))) + (narrow-to-region from to) + (goto-char (point-min)) + (while (re-search-forward regexp nil t) + (let ((matchstr (gethash (match-string 0) + (if ,encode-p (car ,hashtable) (cdr ,hashtable))))) + (if matchstr (replace-match matchstr)))))))) + +;;; + +(defun indian-dev-itrans-v5-encode-region (from to) + (interactive "r") + (indian-translate-region + from to indian-dev-itrans-v5-hash t)) + +(defun indian-dev-itrans-v5-decode-region (from to) + (interactive "r") + (indian-translate-region + from to indian-dev-itrans-v5-hash nil)) + +(defun indian-dev-kyoto-harvard-encode-region (from to) + (interactive "r") + (indian-translate-region + from to indian-dev-kyoto-harvard-hash t)) + +(defun indian-dev-kyoto-harvard-decode-region (from to) + (interactive "r") + (indian-translate-region + from to indian-dev-kyoto-harvard-hash nil)) + +(defun indian-dev-aiba-encode-region (from to) + (interactive "r") + (indian-translate-region + from to indian-dev-aiba-hash t)) + +(defun indian-dev-aiba-decode-region (from to) + (interactive "r") + (indian-translate-region + from to indian-dev-aiba-hash nil)) + + + + +;;; IS 13194 utilities + +;; The followings provide conversion between IS 13194 (ISCII) and UCS. + +(defvar ucs-devanagari-to-is13194-alist + '(;;Unicode vs IS13194 ;; only Devanagari is supported now. + (?\x0900 . "[U+0900]") + (?\x0901 . "(5!(B") + (?\x0902 . "(5"(B") + (?\x0903 . "(5#(B") + (?\x0904 . "[U+0904]") + (?\x0905 . "(5$(B") + (?\x0906 . "(5%(B") + (?\x0907 . "(5&(B") + (?\x0908 . "(5'(B") + (?\x0909 . "(5((B") + (?\x090a . "(5)(B") + (?\x090b . "(5*(B") + (?\x090c . "(5&i(B") + (?\x090d . "(5.(B") + (?\x090e . "(5+(B") + (?\x090f . "(5,(B") + (?\x0910 . "(5-(B") + (?\x0911 . "(52(B") + (?\x0912 . "(5/(B") + (?\x0913 . "(50(B") + (?\x0914 . "(51(B") + (?\x0915 . "(53(B") + (?\x0916 . "(54(B") + (?\x0917 . "(55(B") + (?\x0918 . "(56(B") + (?\x0919 . "(57(B") + (?\x091a . "(58(B") + (?\x091b . "(59(B") + (?\x091c . "(5:(B") + (?\x091d . "(5;(B") + (?\x091e . "(5<(B") + (?\x091f . "(5=(B") + (?\x0920 . "(5>(B") + (?\x0921 . "(5?(B") + (?\x0922 . "(5@(B") + (?\x0923 . "(5A(B") + (?\x0924 . "(5B(B") + (?\x0925 . "(5C(B") + (?\x0926 . "(5D(B") + (?\x0927 . "(5E(B") + (?\x0928 . "(5F(B") + (?\x0929 . "(5G(B") + (?\x092a . "(5H(B") + (?\x092b . "(5I(B") + (?\x092c . "(5J(B") + (?\x092d . "(5K(B") + (?\x092e . "(5L(B") + (?\x092f . "(5M(B") + (?\x0930 . "(5O(B") + (?\x0931 . "(5P(B") + (?\x0932 . "(5Q(B") + (?\x0933 . "(5R(B") + (?\x0934 . "(5S(B") + (?\x0935 . "(5T(B") + (?\x0936 . "(5U(B") + (?\x0937 . "(5V(B") + (?\x0938 . "(5W(B") + (?\x0939 . "(5X(B") + (?\x093a . "[U+093a]") + (?\x093b . "[U+093b]") + (?\x093c . "(5i(B") + (?\x093d . "(5ji(B") + (?\x093e . "(5Z(B") + (?\x093f . "(5[(B") + (?\x0940 . "(5\(B") + (?\x0941 . "(5](B") + (?\x0942 . "(5^(B") + (?\x0943 . "(5_(B") + (?\x0944 . "(5_i(B") + (?\x0945 . "(5c(B") + (?\x0946 . "(5`(B") + (?\x0947 . "(5a(B") + (?\x0948 . "(5b(B") + (?\x0949 . "(5g(B") + (?\x094a . "(5d(B") + (?\x094b . "(5e(B") + (?\x094c . "(5f(B") + (?\x094d . "(5h(B") + (?\x094e . "[U+094e]") + (?\x094f . "[U+094f]") + (?\x0950 . "(5!i(B") + (?\x0951 . "(5p5(B") + (?\x0952 . "(5p8(B") + (?\x0953 . "[DEVANAGARI GRAVE ACCENT]") + (?\x0954 . "[DEVANAGARI ACUTE ACCENT]") + (?\x0955 . "[U+0955]") + (?\x0956 . "[U+0956]") + (?\x0957 . "[U+0957]") + (?\x0958 . "(53i(B") + (?\x0959 . "(54i(B") + (?\x095a . "(55i(B") + (?\x095b . "(5:i(B") + (?\x095c . "(5?i(B") + (?\x095d . "(5@i(B") + (?\x095e . "(5Ii(B") + (?\x095f . "(5N(B") + (?\x0960 . "(5*i(B") + (?\x0961 . "(5'i(B") + (?\x0962 . "(5[i(B") + (?\x0963 . "(5ei(B") + (?\x0964 . "(5j(B") + (?\x0965 . "(5jj(B") + (?\x0966 . "(5q(B") + (?\x0967 . "(5r(B") + (?\x0968 . "(5s(B") + (?\x0969 . "(5t(B") + (?\x096a . "(5u(B") + (?\x096b . "(5v(B") + (?\x096c . "(5w(B") + (?\x096d . "(5x(B") + (?\x096e . "(5y(B") + (?\x096f . "(5z(B") + (?\x0970 . "[U+0970]") + (?\x0971 . "[U+0971]") + (?\x0972 . "[U+0972]") + (?\x0973 . "[U+0973]") + (?\x0974 . "[U+0974]") + (?\x0975 . "[U+0975]") + (?\x0976 . "[U+0976]") + (?\x0977 . "[U+0977]") + (?\x0978 . "[U+0978]") + (?\x0979 . "[U+0979]") + (?\x097a . "[U+097a]") + (?\x097b . "[U+097b]") + (?\x097c . "[U+097c]") + (?\x097d . "[U+097d]") + (?\x097e . "[U+097e]") + (?\x097f . "[U+097f]"))) + +(defvar ucs-bengali-to-is13194-alist nil) +(defvar ucs-assamese-to-is13194-alist nil) +(defvar ucs-gurmukhi-to-is13194-alist nil) +(defvar ucs-gujarati-to-is13194-alist nil) +(defvar ucs-oriya-to-is13194-alist nil) +(defvar ucs-tamil-to-is13194-alist nil) +(defvar ucs-telugu-to-is13194-alist nil) +(defvar ucs-malayalam-to-is13194-alist nil) + +(defvar is13194-default-repartory 'devanagari) + +(defvar is13194-repertory-to-ucs-script + `((DEF ?\x40 ,is13194-default-repartory) + (RMN ?\x41 ,is13194-default-repartory) + (DEV ?\x42 devanagari) + (BNG ?\x43 bengali) + (TML ?\x44 tamil) + (TLG ?\x45 telugu) + (ASM ?\x46 bengali) + (ORI ?\x47 oriya) + (KND ?\x48 kannada) + (MLM ?\x49 malayalam) + (GJR ?\x4a gujarati) + (PNJ ?\x4b gurmukhi))) + +;; for guiding find-variable function. +(defvar is13194-to-ucs-devanagari-hashtbl nil) +(defvar is13194-to-ucs-devanagari-regexp nil) +(defvar is13194-to-ucs-bengali-hashtbl nil) +(defvar is13194-to-ucs-bengali-regexp nil) +(defvar is13194-to-ucs-assamese-hashtbl nil) +(defvar is13194-to-ucs-assamese-regexp nil) +(defvar is13194-to-ucs-gurmukhi-hashtbl nil) +(defvar is13194-to-ucs-gurmukhi-regexp nil) +(defvar is13194-to-ucs-gujarati-hashtbl nil) +(defvar is13194-to-ucs-gujarati-regexp nil) +(defvar is13194-to-ucs-oriya-hashtbl nil) +(defvar is13194-to-ucs-oriya-regexp nil) +(defvar is13194-to-ucs-tamil-hashtbl nil) +(defvar is13194-to-ucs-tamil-regexp nil) +(defvar is13194-to-ucs-telugu-hashtbl nil) +(defvar is13194-to-ucs-telugu-regexp nil) +(defvar is13194-to-ucs-malayalam-hashtbl nil) +(defvar is13194-to-ucs-malayalam-regexp nil) + +(mapc + (function (lambda (script) + (let ((hashtable (intern (concat "is13194-to-ucs-" + (symbol-name script) "-hashtbl" ))) + (regexp (intern (concat "is13194-to-ucs-" + (symbol-name script) "-regexp")))) + (set hashtable (make-hash-table :test 'equal :size 128)) + (mapc + (function (lambda (x) + (put-char-code-property (decode-char 'ucs (car x)) + 'script script) + (put-char-code-property (decode-char 'ucs (car x)) + 'iscii (cdr x)) + (puthash (cdr x) (char-to-string (decode-char 'ucs (car x))) + (eval hashtable)))) + (eval (intern (concat "ucs-" (symbol-name script) + "-to-is13194-alist")))) + (set regexp (regexp-of-hashtbl-keys (eval hashtable)))))) + '(devanagari bengali assamese gurmukhi gujarati + oriya tamil telugu malayalam)) + +(defvar ucs-to-is13194-regexp + ;; only Devanagari is supported now. + (concat "[" (char-to-string (decode-char 'ucs #x0900)) + "-" (char-to-string (decode-char 'ucs #x097f)) "]") + "Regexp that matches to conversion") + +(defun ucs-to-iscii-region (from to) + "Converts the indian UCS characters in the region to ISCII. +Returns new end position." + (interactive "r") + ;; only Devanagari is supported now. + (save-excursion + (save-restriction + (narrow-to-region from to) + (goto-char (point-min)) + (let* ((current-repertory is13194-default-repartory)) + (while (re-search-forward ucs-to-is13194-regexp nil t) + (replace-match + (get-char-code-property (string-to-char (match-string 0)) + 'iscii)))) + (point-max)))) + +(defun iscii-to-ucs-region (from to) + "Converts the ISCII characters in the region to UCS. +Returns new end position." + (interactive "r") + ;; only Devanagari is supported now. + (save-excursion + (save-restriction + (narrow-to-region from to) + (goto-char (point-min)) + (let* ((current-repertory is13194-default-repartory) + (current-hashtable + (intern (concat "is13194-to-ucs-" + (symbol-name current-repertory) "-hashtbl"))) + (current-regexp + (intern (concat "is13194-to-ucs-" + (symbol-name current-repertory) "-regexp")))) + (while (re-search-forward (eval current-regexp) nil t) + (replace-match + (gethash (match-string 0) (eval current-hashtable) "")))) + (point-max)))) + +;;;###autoload +(defun indian-compose-region (from to) + "Compose the region according to `composition-function-table'. " + (interactive "r") + (save-excursion + (save-restriction + (let ((pos from) chars (max to)) + (narrow-to-region from to) + (while (< pos max) + (setq chars (compose-chars-after pos)) + (if chars (setq pos (+ pos chars)) (setq pos (1+ pos)))))))) + +;;;###autoload +(defun indian-compose-string (string) + (with-temp-buffer + (insert string) + (indian-compose-region (point-min) (point-max)) + (buffer-string))) + +;;;###autoload +(defun in-is13194-post-read-conversion (len) + (let ((pos (point)) endpos) + (setq endpos (iscii-to-ucs-region pos (+ pos len))) + (indian-compose-region pos endpos) + (- endpos pos))) + +;;;###autoload +(defun in-is13194-pre-write-conversion (from to) + (let ((buf (current-buffer))) + (set-buffer (generate-new-buffer " *temp*")) + (if (stringp from) + (insert from) + (insert-buffer-substring buf from to)) + (ucs-to-iscii-region (point-min) (point-max)) + nil)) + + + + +;;; Backward Compatibility support programs + +;; The followings provides the conversion from old-implementation of +;; Emacs Devanagari script to UCS. + +(defconst indian-2-colum-to-ucs + '( + ;; 0 1 2 3 4 5 6 7 8 9 a b c d e f + ;;2120 $(5!!!"!#!$!%!&!'!(!)!*!+!,!-!.!/(B + ("$(5!!(B" . "$,15A(B") + ("$(5!"(B" . "$,15B(B") + ("$(5!#(B" . "$,15C(B") + ("$(5!$(B" . "$,15E(B") + ("$(5!%(B" . "$,15F(B") + ("$(5!&(B" . "$,15G(B") + ("$(5!'(B" . "$,15H(B") + ("$(5!((B" . "$,15I(B") + ("$(5!)(B" . "$,15J(B") + ("$(5!*(B" . "$,15K(B") + ("$(5!*"p(B" . "$,15p6#(B") + ("$(5!+(B" . "$,15N(B") + ("$(5!,(B" . "$,15O(B") + ("$(5!-(B" . "$,15P(B") + ("$(5!.(B" . "$,15M(B") + ("$(5!/(B" . "$,15R(B") + ;; 0 1 2 3 4 5 6 7 8 9 a b c d e f + ;;2130 $(5!0!1!2!3!4!5!6!7!8!9!:!;!<!=!>!?(B + ("$(5!0(B" . "$,15S(B") + ("$(5!1(B" . "$,15T(B") + ("$(5!2(B" . "$,15Q(B") + ("$(5!3(B" . "$,15U(B") + ("$(5!4(B" . "$,15V(B") + ("$(5!5(B" . "$,15W(B") + ("$(5!6(B" . "$,15X(B") + ("$(5!7(B" . "$,15Y(B") + ("$(5!8(B" . "$,15Z(B") + ("$(5!9(B" . "$,15[(B") + ("$(5!:(B" . "$,15\(B") + ("$(5!;(B" . "$,15](B") + ("$(5!<(B" . "$,15^(B") + ("$(5!=(B" . "$,15_(B") + ("$(5!>(B" . "$,15`(B") + ("$(5!?(B" . "$,15a(B") + ;; 0 1 2 3 4 5 6 7 8 9 a b c d e f + ;;2140 $(5!@!A!B!C!D!E!F!G!H!I!J!K!L!M!N!O(B + ("$(5!@(B" . "$,15b(B") + ("$(5!A(B" . "$,15c(B") + ("$(5!B(B" . "$,15d(B") + ("$(5!C(B" . "$,15e(B") + ("$(5!D(B" . "$,15f(B") + ("$(5!E(B" . "$,15g(B") + ("$(5!F(B" . "$,15h(B") + ("$(5!G(B" . "$,15i(B") + ("$(5!H(B" . "$,15j(B") + ("$(5!I(B" . "$,15k(B") + ("$(5!J(B" . "$,15l(B") + ("$(5!K(B" . "$,15m(B") + ("$(5!L(B" . "$,15n(B") + ("$(5!M(B" . "$,15o(B") + ("$(5!N(B" . "$,16?(B") + ("$(5!O(B" . "$,15p(B") + ;; 0 1 2 3 4 5 6 7 8 9 a b c d e f + ;;2150 $(5!P!Q!R!S!T!U!V!W!X!Y!Z![!\!]!^!_(B + ("$(5!P(B" . "$,15q(B") + ("$(5!Q(B" . "$,15r(B") + ("$(5!R(B" . "$,15s(B") + ("$(5!S(B" . "$,15t(B") + ("$(5!T(B" . "$,15u(B") + ("$(5!U(B" . "$,15v(B") + ("$(5!V(B" . "$,15w(B") + ("$(5!W(B" . "$,15x(B") + ("$(5!X(B" . "$,15y(B") + ("$(5!Z(B" . "$,15~(B") + ("$(5![(B" . "$,15(B") + ("$(5!\(B" . "$,16 (B") + ("$(5!](B" . "$,16!(B") + ("$(5!^(B" . "$,16"(B") + ("$(5!_(B" . "$,16#(B") + ;; 0 1 2 3 4 5 6 7 8 9 a b c d e f + ;;2160 $(5!`!a!b!c!d!e!f!g!h!i!j!k!l!m!n!o(B + ("$(5!`(B" . "$,16&(B") + ("$(5!a(B" . "$,16'(B") + ("$(5!b(B" . "$,16((B") + ("$(5!c(B" . "$,16%(B") + ("$(5!d(B" . "$,16*(B") + ("$(5!e(B" . "$,16+(B") + ("$(5!f(B" . "$,16,(B") + ("$(5!g(B" . "$,16)(B") + ("$(5!h(B" . "$,16-(B") + ("$(5!i(B" . "$,15|(B") + ("$(5!j(B" . "$,16D(B") + ("$(5!j!j(B" . "$,16E(B") + ;; 0 1 2 3 4 5 6 7 8 9 a b c d e f + ;;2170 $(5!p!q!r!s!t!u!v!w!x!y!z!{!|!}!~(B + ("$(5!q(B" . "$,16F(B") + ("$(5!r(B" . "$,16G(B") + ("$(5!s(B" . "$,16H(B") + ("$(5!t(B" . "$,16I(B") + ("$(5!u(B" . "$,16J(B") + ("$(5!v(B" . "$,16K(B") + ("$(5!w(B" . "$,16L(B") + ("$(5!x(B" . "$,16M(B") + ("$(5!y(B" . "$,16N(B") + ("$(5!z(B" . "$,16O(B") + ;; 0 1 2 3 4 5 6 7 8 9 a b c d e f + ;;2220 $(5"!"""#"$"%"&"'"(")"*"+","-"."/(B + ("$(5"!(B" . "$,16;6-5p(B") + ("$(5""(B" . "$,16>6-5p(B") + ("$(5"#(B" . "$,15U6-5p(B") + ("$(5"$(B" . "$,15W6-5p(B") + ("$(5"%(B" . "$,15d6-5p(B") + ("$(5"&(B" . "$,15j6-5p(B") + ("$(5"'(B" . "$,15k6-5p(B") + ("$(5")(B" . "$,15v6-5p(B") + ("$(5",(B" . "$,15p6!(B") + ("$(5"-(B" . "$,15p6"(B") + ("$(5".(B" . "$,15q6!(B") + ("$(5"/(B" . "$,15q6"(B") + ;; 0 1 2 3 4 5 6 7 8 9 a b c d e f + ;;2230 $(5"0"1"2"3"4"5"6"7"8"9":";"<"=">"?(B + ("$(5"3(B" . "$,15U6-(B") + ("$(5"4(B" . "$,15V6-(B") + ("$(5"5(B" . "$,15W6-(B") + ("$(5"6(B" . "$,15X6-(B") + ("$(5"8(B" . "$,15Z6-(B") + ("$(5"8"q(B" . "$,15Z6-5p6-(B") + ("$(5":(B" . "$,15\6-(B") + ("$(5";(B" . "$,15]6-(B") + ("$(5"<(B" . "$,15^6-(B") + ("$(5"<(B" . "$,15^6-(B") + ;; 0 1 2 3 4 5 6 7 8 9 a b c d e f + ;;2240 $(5"@"A"B"C"D"E"F"G"H"I"J"K"L"M"N"O(B + ("$(5"A(B" . "$,15c6-(B") + ("$(5"B(B" . "$,15d6-(B") + ("$(5"C(B" . "$,15e6-(B") + ("$(5"E(B" . "$,15g6-(B") + ("$(5"F(B" . "$,15h6-(B") + ("$(5"G(B" . "$,15i6-(B") + ("$(5"H(B" . "$,15j6-(B") + ("$(5"I(B" . "$,15k6-(B") + ("$(5"J(B" . "$,15l6-(B") + ("$(5"J(B" . "$,15l6-(B") + ("$(5"K(B" . "$,15m6-(B") + ("$(5"L(B" . "$,15n6-(B") + ("$(5"M(B" . "$,15o6-(B") + ("$(5"N(B" . "$,16?6-(B") + ;; 0 1 2 3 4 5 6 7 8 9 a b c d e f + ;;2250 $(5"P"Q"R"S"T"U"V"W"X"Y"Z"["\"]"^"_(B + ("$(5"Q(B" . "$,15r6-(B") + ("$(5"R(B" . "$,15s6-(B") + ("$(5"S(B" . "$,15t6-(B") + ("$(5"T(B" . "$,15u6-(B") + ("$(5"U(B" . "$,15v6-(B") + ("$(5"V(B" . "$,15w6-(B") + ("$(5"W(B" . "$,15x6-(B") + ("$(5"](B" . "$,16-5o(B") + ;; 0 1 2 3 4 5 6 7 8 9 a b c d e f + ;;2260 $(5"`"a"b"c"d"e"f"g"h"i"j"k"l"m"n"o(B + ("$(5"`(B" . "$,15W6-5p6-(B") + ("$(5"a(B" . "$,15X6-5h6-(B") + ("$(5"c(B" . "$,15d6-5d6-(B") + ("$(5"d(B" . "$,15d6-5p6-(B") + ("$(5"e(B" . "$,15g6-5h6-(B") + ("$(5"f(B" . "$,15g6-5p6-(B") + ("$(5"g(B" . "$,15j6-5d6-(B") + ("$(5"h(B" . "$,15v6-5Z6-(B") + ("$(5"i(B" . "$,15v6-5p6-(B") + ("$(5"j(B" . "$,15v6-5u6-(B") + ("$(5"k(B" . "$,15h6-5h6-(B") + ("$(5"l(B" . "$,15U6-5w6-(B") + ("$(5"m(B" . "$,15\6-5^6-(B") + ;; 0 1 2 3 4 5 6 7 8 9 a b c d e f + ;;2270 $(5"p"q"r"s"t"u"v"w"x"y"z"{"|"}"~(B + ("$(5"p(B" . "$,15p6-(B") + ("$(5"q(B" . "$,16-5p(B") + ("$(5"r(B" . "$,16-5p(B") + ("$(5"s(B" . "$,1686-(B") + ("$(5"t(B" . "$,1696-(B") + ("$(5"u(B" . "$,16:6-(B") + ("$(5"y(B" . "$,16>6-(B") + ("$(5"z(B" . "$,16;6-(B") + ;; 0 1 2 3 4 5 6 7 8 9 a b c d e f + ;;2320 $(5#!#"###$#%#&#'#(#)#*#+#,#-#.#/(B + ("$(5#!(B" . "$,160(B") + ("$(5#&(B" . "$,15L(B") + ("$(5#&"p(B" . "$,15p6$(B") + ("$(5#'(B" . "$,16A(B") + ("$(5#'"p(B" . "$,15p6C(B") + ("$(5#*(B" . "$,16@(B") + ("$(5#*"p(B" . "$,15p6B(B") + ;; 0 1 2 3 4 5 6 7 8 9 a b c d e f + ;;2330 $(5#0#1#2#3#4#5#6#7#8#9#:#;#<#=#>#?(B + ("$(5#3(B" . "$,168(B") + ("$(5#4(B" . "$,169(B") + ("$(5#5(B" . "$,16:(B") + ("$(5#:(B" . "$,16;(B") + ("$(5#?(B" . "$,16<(B") + ;; 0 1 2 3 4 5 6 7 8 9 a b c d e f + ;;2340 $(5#@#A#B#C#D#E#F#G#H#I#J#K#L#M#N#O(B + ("$(5#@(B" . "$,16=(B") + ("$(5#I(B" . "$,16>(B") + ("$(5#J(B" . "$,15}(B") + ("$(5#K(B" . "$,16$(B") + ("$(5#L(B" . "$,16B(B") + ("$(5#M(B" . "$,16C(B") + ;; 0 1 2 3 4 5 6 7 8 9 a b c d e f + ;;2350 $(5#P#Q#R#S#T#U#V#W#X#Y#Z#[#\#]#^#_(B + ("$(5#P(B" . "$,15n6-5h(B") + ("$(5#Q(B" . "$,15n6-5r(B") + ("$(5#R(B" . "$,15y6#(B") + ;; 0 1 2 3 4 5 6 7 8 9 a b c d e f + ;;2360 $(5#`#a#b#c#d#e#f#g#h#i#j#k#l#m#n#o(B + ("$(5#`(B" . "$,15r6-5r(B") + ("$(5#a(B" . "$,15u6-5h(B") + ("$(5#b(B" . "$,15u6-5u(B") + ("$(5#c(B" . "$,15v6-5Z(B") + ("$(5#d(B" . "$,15v6-5h(B") + ("$(5#e(B" . "$,15v6-5l(B") + ("$(5#f(B" . "$,15v6-5r(B") + ("$(5#g(B" . "$,15v6-5u(B") + ("$(5#h(B" . "$,15w6-5_6-5p6-5o(B") + ("$(5#i(B" . "$,15w6-5_6-5o(B") + ("$(5#j(B" . "$,15w6-5_6-5u(B") + ("$(5#k(B" . "$,15w6-5_(B") + ("$(5#l(B" . "$,15w6-5`(B") + ("$(5#m(B" . "$,15x6-5h(B") + ("$(5#n(B" . "$,15x6-5p(B") + ;; 0 1 2 3 4 5 6 7 8 9 a b c d e f + ;;2370 $(5#p#q#r#s#t#u#v#w#x#y#z#{#|#}#~(B + ("$(5#p(B" . "$,15y6-5c(B") + ("$(5#q(B" . "$,15y6-5h(B") + ("$(5#r(B" . "$,15y6-5n(B") + ("$(5#s(B" . "$,15y6-5o(B") + ("$(5#t(B" . "$,15y6-5p(B") + ("$(5#u(B" . "$,15y6-5r(B") + ("$(5#v(B" . "$,15y6-5u(B") + ;; 0 1 2 3 4 5 6 7 8 9 a b c d e f + ;;2420 $(5$!$"$#$$$%$&$'$($)$*$+$,$-$.$/(B + ("$(5$!(B" . "$,15U6-5d6-5p6-5o(B") + ("$(5$"(B" . "$,15U6-5d6-5u(B") + ("$(5$#(B" . "$,15U6-5d6-5o(B") + ("$(5$$(B" . "$,15U6-5h6-5o(B") + ("$(5$%(B" . "$,15U6-5p6-5o(B") + ("$(5$&(B" . "$,15U6-5u6-5o(B") + ("$(5$'(B" . "$,15U6-5U(B") + ("$(5$((B" . "$,15U6-5d(B") + ("$(5$)(B" . "$,15U6-5h(B") + ("$(5$*(B" . "$,15U6-5n(B") + ("$(5$+(B" . "$,15U6-5o(B") + ("$(5$,(B" . "$,15U6-5r(B") + ("$(5$-(B" . "$,15U6-5u(B") + ("$(5$.(B" . "$,15U6-5w(B") + ("$(5$/(B" . "$,15X6-5h(B") + ;; 0 1 2 3 4 5 6 7 8 9 a b c d e f + ;;2430 $(5$0$1$2$3$4$5$6$7$8$9$:$;$<$=$>$?(B + ("$(5$0(B" . "$,15Y6-5U6-5d6-5o(B") + ("$(5$1(B" . "$,15Y6-5U6-5w6-5u(B") + ("$(5$2(B" . "$,15Y6-5U6-5d(B") + ("$(5$3(B" . "$,15Y6-5U6-5w(B") + ("$(5$4(B" . "$,15Y6-5X6-5p(B") + ("$(5$5(B" . "$,15Y6-5U6-5o(B") + ("$(5$6(B" . "$,15Y6-5V6-5o(B") + ("$(5$7(B" . "$,15Y6-5W6-5o(B") + ("$(5$8(B" . "$,15Y6-5X6-5o(B") + ("$(5$9(B" . "$,15Y6-5U(B") + ("$(5$:(B" . "$,15Y6-5V(B") + ("$(5$;(B" . "$,15Y6-5W(B") + ("$(5$<(B" . "$,15Y6-5X(B") + ("$(5$=(B" . "$,15Y6-5Y(B") + ("$(5$>(B" . "$,15Y6-5h(B") + ("$(5$?(B" . "$,15Y6-5n(B") + ;; 0 1 2 3 4 5 6 7 8 9 a b c d e f + ;;2440 $(5$@$A$B$C$D$E$F$G$H$I$J$K$L$M$N$O(B + ("$(5$@(B" . "$,15Y6-5o(B") + ("$(5$A(B" . "$,15Z6-5Z(B") + ("$(5$B(B" . "$,15Z6-5^(B") + ("$(5$C(B" . "$,15[6-5o(B") + ("$(5$D(B" . "$,15\6-5p(B") + ("$(5$E(B" . "$,15\6-5^(B") + ("$(5$F(B" . "$,15^6-5Z(B") + ("$(5$G(B" . "$,15^6-5\(B") + ("$(5$H(B" . "$,15_6-5U(B") + ("$(5$I(B" . "$,15_6-5_(B") + ("$(5$J(B" . "$,15_6-5`(B") + ("$(5$K(B" . "$,15_6-5o(B") + ("$(5$L(B" . "$,15`6-5o(B") + ("$(5$M(B" . "$,15a6-5W6-5o(B") + ("$(5$N(B" . "$,15a6-5X6-5p(B") + ("$(5$O(B" . "$,15a6-5p6-5o(B") + ;; 0 1 2 3 4 5 6 7 8 9 a b c d e f + ;;2450 $(5$P$Q$R$S$T$U$V$W$X$Y$Z$[$\$]$^$_(B + ("$(5$P(B" . "$,15a6-5W(B") + ("$(5$Q(B" . "$,15a6-5X(B") + ("$(5$R(B" . "$,15a6-5a(B") + ("$(5$S(B" . "$,15a6-5n(B") + ("$(5$T(B" . "$,15a6-5o(B") + ;; 0 1 2 3 4 5 6 7 8 9 a b c d e f + ;;2460 $(5$`$a$b$c$d$e$f$g$h$i$j$k$l$m$n$o(B + ("$(5$`(B" . "$,15b6-5o(B") + ("$(5$a(B" . "$,15d6-5d(B") + ("$(5$b(B" . "$,15d6-5h(B") + ("$(5$c(B" . "$,15f6-5f6-5o(B") + ("$(5$d(B" . "$,15f6-5g6-5o(B") + ("$(5$e(B" . "$,15f6-5m6-5o(B") + ("$(5$f(B" . "$,15f6-5p6-5o(B") + ("$(5$g(B" . "$,15f6-5u6-5o(B") + ("$(5$h(B" . "$,15f6-5W6-5p(B") + ("$(5$i(B" . "$,15f6-5X6-5p(B") + ("$(5$j(B" . "$,15f6-5f6-5u(B") + ("$(5$k(B" . "$,15f6-5g6-5u(B") + ("$(5$l(B" . "$,15f6-5W(B") + ("$(5$m(B" . "$,15f6-5X(B") + ("$(5$n(B" . "$,15f6-5f(B") + ("$(5$o(B" . "$,15f6-5g(B") + ;; 0 1 2 3 4 5 6 7 8 9 a b c d e f + ;;2470 $(5$p$q$r$s$t$u$v$w$x$y$z${$|$}$~(B + ("$(5$p(B" . "$,15f6-5h(B") + ("$(5$q(B" . "$,15f6-5l(B") + ("$(5$r(B" . "$,15f6-5m(B") + ("$(5$s(B" . "$,15f6-5n(B") + ("$(5$t(B" . "$,15f6-5o(B") + ("$(5$u(B" . "$,15f6-5u(B") + ("$(5$v(B" . "$,15g6-5h(B") + ("$(5$w(B" . "$,15h6-5h(B") + ("$(5$x(B" . "$,15j6-5d(B") + ("$(5$y(B" . "$,15j6-5h(B") + ("$(5$z(B" . "$,15j6-5r(B") + ("$(5${(B" . "$,15l6-5h(B") + ("$(5$|(B" . "$,15l6-5l(B") + ("$(5$}(B" . "$,15l6-5u(B") + ("$(5$~(B" . "$,15m6-5h(B"))) + +(defconst indian-2-column-to-ucs-regexp + "$(5!j!j(B\\|$(5"8"q(B\\|[$(5#&#'!*#*(B]$(5"p(B\\|[$(5!!(B-$(5$~(B]") + +(put 'indian-2-column-to-ucs-chartable 'char-table-extra-slots 1) +(defconst indian-2-column-to-ucs-chartable + (let ((table (make-char-table 'indian-2-column-to-ucs-chartable)) + (alist nil)) + (dolist (elt indian-2-colum-to-ucs) + (if (= (length (car elt)) 1) + (aset table (aref (car elt) 0) (cdr elt)) + (setq alist (cons elt alist)))) + (set-char-table-extra-slot table 0 alist) + table)) + +(defun indian-2-column-to-ucs-region (from to) + "Convert old Emacs Devanagari characters to UCS." + (interactive "r") + (save-excursion + (save-restriction + (let ((pos from) + (alist (char-table-extra-slot indian-2-column-to-ucs-chartable 0))) + (narrow-to-region from to) + (decompose-region from to) + (goto-char (point-min)) + (while (re-search-forward indian-2-column-to-ucs-regexp nil t) + (let ((len (- (match-end 0) (match-beginning 0))) + subst) + (if (= len 1) + (setq subst (aref indian-2-column-to-ucs-chartable (char-after (match-beginning 0)))) + (setq subst (assoc (match-string 0) alist))) + (replace-match (if subst subst "?")))) + (indian-compose-region (point-min) (point-max)))))) + +(provide 'ind-util) + +;;; ind-util.el ends here