(defvar indian-itrans-consonant-alist
'(
("k" . "(53(B")
("kh" . "(54(B")
("g" . "(55(B")
("gh" . "(56(B")
("N^" . "(57(B")
("ch" . "(58(B")
("chh" . "(59(B")
("j" . "(5:(B")
("jh" . "(5;(B")
("JN" . "(5<(B")
("T" . "(5=(B")
("Th" . "(5>(B")
("D" . "(5?(B")
("Dh" . "(5@(B")
("N" . "(5A(B")
("t" . "(5B(B")
("th" . "(5C(B")
("d" . "(5D(B")
("dh" . "(5E(B")
("n" . "(5F(B")
("nh" . "(5G(B") ("p" . "(5H(B")
("ph" . "(5I(B")
("b" . "(5J(B")
("bh" . "(5K(B")
("m" . "(5L(B")
("y" . "(5M(B")
("yh" . "(5N(B") ("r" . "(5O(B")
("rh" . "(5P(B") ("l" . "(5Q(B")
("v" . "(5T(B")
("sh" . "(5U(B")
("shh" . "(5V(B")
("s" . "(5W(B")
("h" . "(5X(B")
("ld" . "(5R(B")
("L" . "(5R(B")
("ksh" . "$(5!3!h!V(B")
("GY" . "***GY***") ("q" . "(53i(B")
("K" . "(54i(B")
("G" . "(55i(B")
("z" . "(5:i(B")
("f" . "(5Ii(B")
(".D" . "(5?i(B")
(".Dh" . "(5@i(B")
))
(defvar indian-itrans-vowel-sign-alist
'(
("" . "(5h(B")
("a" . "")
("aa" . "(5Z(B")
("A" . "(5Z(B")
("i" . "(5[(B")
("ii" . "(5\(B")
("I" . "(5\(B")
("u" . "(5](B")
("uu" . "(5^(B")
("U" . "(5^(B")
("R^i" . "(5_(B") ("R^I" . "(5_i(B")
("L^i" . "(5[i(B")
("L^I" . "(5\i(B")
("E" . "(5`(B") ("e" . "(5a(B")
("ai" . "(5b(B")
("O" . "(5d(B") ("o" . "(5e(B")
("au" . "(5f(B")
))
(defvar indian-itrans-other-letters-alist
'(
("a" . "(5$(B")
("aa" . "(5%(B")
("A" . "(5%(B")
("i" . "(5&(B")
("ii" . "(5'(B")
("I" . "(5'(B")
("u" . "(5((B")
("uu" . "(5)(B")
("U" . "(5)(B")
("R^i" . "(5*(B")
("R^I" . "(5*i(B")
("L^i" . "(5&i(B")
("L^I" . "(5'i(B")
("E" . "(5+(B") ("e" . "(5,(B")
("ai" . "(5-(B")
("O" . "(5/(B") ("o" . "(50(B")
("au" . "(51(B")
("M" . "(5$(B")
("H" . "(5#(B")
("AUM" . "(5!i(B")
("OM" . "(5!i(B")
(".r" . "(5Oh(B")
(".n" . "(5"(B")
(".N" . "(5!(B")
(".h" . "(5h(B") ; Halant
(".." . "(5j(B")
(".a" . "(5ji(B") ; Avagrah
("0" . "(5q(B")
("1" . "(5r(B")
("2" . "(5s(B")
("3" . "(5t(B")
("4" . "(5u(B")
("5" . "(5v(B")
("6" . "(5w(B")
("7" . "(5x(B")
("8" . "(5y(B")
("9" . "(5z(B")
))
;; Regular expression matching single Indian character represented
;; by ITRANS.
(defvar indian-itrans-regexp
(let ((consonant "\\([cs]hh?\\)\\|[kgjTDnpbyr]h?\\|\\(N\\^?\\)\\|\\(jN\\)\\|[mvqKGzfs]\\|\\(ld?\\)\\|\\(ksh\\)\\|\\(GY\\)\\|\\(\\.Dh?\\)")
(vowel "\\(a[aiu]\\)\\|\\(ii\\)\\|\\(uu\\)\\|\\([RL]\\^[iI]\\)\\|[AIEOeoaiu]")
(misc "[MH0-9]\\|\\(AUM\\)\\|\\(OM\\)\\|\\(\\.[rnNh\\.a]\\)")
(lpre "\\(") (rpre "\\)") (orre "\\|"))
(concat lpre misc rpre orre
lpre lpre consonant rpre "?" lpre vowel rpre rpre orre
lpre consonant rpre )))
;;
;; Regular expression matching single ITRANS unit for IS 13194 characters.
;;
(defvar itrans-indian-regexp
(let ((vowel "[(5$(B-(52(B]")
(consonant "[(53(B-(5X(B]")
(matra "[(5Z(B-(5g(B]")
(misc "[(5q(B-(5z(B]")
(lpre "\\(") (rpre "\\)") (orre "\\|"))
(concat misc orre
lpre consonant matra "?" rpre orre
vowel)))
;;
;; IS13194 - ITRANS conversion table for string matching above regexp.
;;
(defvar indian-itrans-alist
(let ((cl indian-itrans-consonant-alist)
(ml indian-itrans-other-letters-alist) rules)
(while cl
(let ((vl indian-itrans-vowel-sign-alist))
(while vl
(setq rules
(cons (cons (concat (car (car cl)) (car (car vl)))
(concat (cdr (car cl)) (cdr (car vl))))
rules))
(setq vl (cdr vl))))
(setq cl (cdr cl)))
(while ml
(setq rules (cons (cons (car (car ml))
(cdr (car ml)))
rules))
(setq ml (cdr ml)))
rules))
;;
;; Utility program to convert from ITRANS to IS 13194 in specified region.
;;
(defun indian-decode-itrans-region (from to)
"Convert `ITRANS' mnemonics of the current region to Indian characters.
When called from a program, expects two arguments,
positions (integers or markers) specifying the stretch of the region."
(interactive "r")
(save-restriction
(narrow-to-region from to)
(goto-char (point-min))
(while (re-search-forward indian-itrans-regexp nil t)
(let* ((itrans (buffer-substring (match-beginning 0) (match-end 0)))
(ch (cdr (assoc itrans indian-itrans-alist))))
(if ch
(progn
(delete-region (match-beginning 0) (match-end 0))
(insert ch)))))
(goto-char (point-min))
(while (re-search-forward "\\((5h(B\\)[^\\c0]" nil t)
(delete-region (match-beginning 1) (match-end 1)))))
;;
;; Utility program to convert from IS 13194 to ITRANS in specified region.
;;
(defun indian-encode-itrans-region (from to)
"Convert indian region to ITRANS mnemonics."
(interactive "r")
(save-restriction
(narrow-to-region from to)
(goto-char (point-min))
(while (re-search-forward itrans-indian-regexp nil t)
(let* ((indian (buffer-substring (match-beginning 0) (match-end 0)))
(ch (car (rassoc indian indian-itrans-alist))))
(if ch
(progn
(delete-region (match-beginning 0) (match-end 0))
(insert ch)))))
(goto-char (point-min))))
(provide 'indian)
;;; indian.el ends here