1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2026-01-30 04:10:54 -08:00

Add new customizable phonetic Tamil input method

* lisp/language/indian.el ("Tamil"): Change the default input method
of the Tamil language environment to the new input method.

* lisp/leim/quail/indian.el
(quail-tamil-itrans-compute-syllable-table): New function extracted
from...
(quail-tamil-itrans-syllable-table): ... here.  Use the above
function.
(quail-tamil-itrans--consonant-order): Auxiliary variable for the
above function.
(quail-tamil-itrans-compute-signs-table): Add new VARIOUS argument.
(quail-tamil-itrans-various-signs-and-digits-table)
(quail-tamil-itrans-various-signs-table): Adjust call to the above
function.

("tamil-phonetic"): Add new input method.
(tamil-input): New group for the input method.
(tamil-translation-rules): New defcustom for the input method to
change the translation rules.

(tamil--syllable-table, tamil--signs-table, tamil--hashtables)
(tamil--vowel-signs): Internal variables used by the input method.
(tamil--setter, tamil--make-tables)
(tamil--update-quail-rules): Internal functions for the input method.
(bug#56323)

* etc/NEWS: Announce the new input method.
This commit is contained in:
Visuwesh 2022-07-10 08:59:40 +05:30 committed by Eli Zaretskii
parent d37ba6f259
commit f6679ccceb
3 changed files with 247 additions and 68 deletions

View file

@ -1047,6 +1047,13 @@ supported.
Type 'C-u C-h t' to select it in case your language setup does not do
so automatically.
---
*** New default phonetic input method for the Tamil language environment.
The default input method for the Tamil language environment is now
"tamil-phonetic" which is a customizable phonetic input method. To
change the input method's translation rules, customize the user option
'tamil-translation-rules'.
* Changes in Specialized Modes and Packages in Emacs 29.1

View file

@ -109,7 +109,7 @@ are supported in this language environment."))
"Tamil" '((charset unicode)
(coding-system utf-8)
(coding-priority utf-8)
(input-method . "tamil-itrans")
(input-method . "tamil-phonetic")
(sample-text . "Tamil (தமிழ்) வணக்கம்")
(documentation . "\
South Indian Language Tamil is supported in this language environment."))

View file

@ -127,47 +127,34 @@
indian-mlm-itrans-v5-hash "malayalam-itrans" "Malayalam" "MlmIT"
"Malayalam transliteration by ITRANS method.")
(defvar quail-tamil-itrans-syllable-table
(let ((vowels
'(("" nil "a")
("" "" "A")
("" "ி" "i")
("" "" "I")
("" "" "u")
("" "" "U")
("" "" "e")
("" "" "E")
("" "" "ai")
("" "" "o")
("" "" "O")
("" "" "au")))
(consonants
'(("" "k") ; U+0B95
("" "N^") ; U+0B99
("" "ch") ; U+0B9A
("" "JN") ; U+0B9E
("" "T") ; U+0B9F
("" "N") ; U+0BA3
("" "t") ; U+0BA4
("" "n") ; U+0BA8
("" "p") ; U+0BAA
("" "m") ; U+0BAE
("" "y") ; U+0BAF
("" "r") ; U+0BB0
("" "l") ; U+0BB2
("" "v") ; U+0BB5
("" "z") ; U+0BB4
("" "L") ; U+0BB3
("" "rh") ; U+0BB1
("" "nh") ; U+0BA9
("" "j") ; U+0B9C
("" nil) ; U+0BB6
("" "Sh") ; U+0BB7
("" "s") ; U+0BB8
("" "h") ; U+0BB9
("க்ஷ" "x" ) ; U+0B95
))
(virama #x0BCD)
;; This is needed since the Unicode codepoint order does not reflect
;; the actual order in the Tamil language.
(defvar quail-tamil-itrans--consonant-order
'("" "" "" "" "" ""
"" "" "" "" "" ""
"" "" "" "" "" ""
"" "" "" "" "க்ஷ"
"க்‌ஷ" ""))
(defun quail-tamil-itrans-compute-syllable-table (vowels consonants)
"Return the syllable table for the input method as a string.
VOWELS is a list of (VOWEL SIGN INPUT-SEQ) where VOWEL is the
Tamil vowel character, SIGN is the vowel sign corresponding to
that vowel character or nil for none, and INPUT-SEQ is the input
sequence to insert VOWEL.
CONSONANTS is a list of (CONSONANT INPUT-SEQ...) where CONSONANT
is the Tamil consonant character, and INPUT-SEQ is one or more
strings that describe how to insert CONSONANT."
(setq vowels (sort vowels
(lambda (x y)
(string-lessp (car x) (car y)))))
(setq consonants
(sort consonants
(lambda (x y)
(or (seq-position (car x) quail-tamil-itrans--consonant-order) 1000)
(or (seq-position (car y) quail-tamil-itrans--consonant-order) 1000))))
(let ((virama #x0BCD)
clm)
(with-temp-buffer
(insert "\n")
@ -197,21 +184,45 @@
(insert (propertize "\t" 'display (list 'space :align-to clm))
(car c) (or (nth 1 v) ""))
(setq clm (+ clm 6)))
(insert "\n" (or (nth 1 c) "")
(propertize "\t" 'display '(space :align-to 4))
"|")
(setq clm 6)
(dolist (v vowels)
(apply #'insert (propertize "\t" 'display (list 'space :align-to clm))
(if (nth 1 c) (list (nth 1 c) (nth 2 v)) (list "")))
(setq clm (+ clm 6))))
(dolist (ct (cdr c))
(insert "\n" (or ct "")
(propertize "\t" 'display '(space :align-to 4))
"|")
(setq clm 6)
(dolist (v vowels)
(apply #'insert (propertize "\t" 'display (list 'space :align-to clm))
(if ct (list ct (nth 2 v)) (list "")))
(setq clm (+ clm 6)))))
(insert "\n")
(insert "----+")
(insert-char ?- 74)
(insert "\n")
(buffer-string))))
(defvar quail-tamil-itrans-syllable-table
(quail-tamil-itrans-compute-syllable-table
(let ((vowels (car indian-tml-base-table))
trans v ret)
(dotimes (i (length vowels))
(when (setq v (nth i vowels))
(when (characterp (car v))
(setcar v (string (car v))))
(setq trans (nth i (car indian-itrans-v5-table-for-tamil)))
(push (append v (list (if (listp trans) (car trans) trans)))
ret)))
ret)
(let ((consonants (cadr indian-tml-base-table))
trans c ret)
(dotimes (i (length consonants))
(when (setq c (nth i consonants))
(when (characterp c)
(setq c (string c)))
(setq trans (nth i (cadr indian-itrans-v5-table-for-tamil)))
(push (cons c (if (listp trans) trans (list trans)))
ret)))
(setq ret (nreverse ret))
ret)))
(defvar quail-tamil-itrans-numerics-and-symbols-table
(let ((numerics '((?௰ "பத்து") (?௱ "நூறு") (?௲ "ஆயிரம்")))
(symbols '((?௳ "நாள்") (?௴ "மாதம்") (?௵ "வருடம்")
@ -244,25 +255,28 @@
(insert "\n")
(buffer-string))))
(defun quail-tamil-itrans-compute-signs-table (digitp)
(defun quail-tamil-itrans-compute-signs-table (digitp various)
"Compute the signs table for the tamil-itrans input method.
If DIGITP is non-nil, include the digits translation as well."
(let ((various '((?ஃ . "H") ("ஸ்ரீ" . "srii") (?ௐ)))
(digits "௦௧௨௩௪௫௬௭௮௯")
If DIGITP is non-nil, include the digits translation as well.
If VARIOUS is non-nil, then it should a list of (CHAR TRANS)
where CHAR is the character/string to translate and TRANS is
CHAR's translation."
(let ((digits "௦௧௨௩௪௫௬௭௮௯")
(width 6) clm)
(with-temp-buffer
(insert "\n" (make-string 18 ?-) "+")
(when digitp (insert (make-string 60 ?-)))
(insert "\n" (make-string 18 ?-))
(when digitp
(insert "+" (make-string 60 ?-)))
(insert "\n")
(insert
(propertize "\t" 'display '(space :align-to 5)) "various"
(propertize "\t" 'display '(space :align-to 18)) "|")
(propertize "\t" 'display '(space :align-to 18)))
(when digitp
(insert
(propertize "\t" 'display '(space :align-to 45)) "digits"))
(insert "\n" (make-string 18 ?-) "+")
"|" (propertize "\t" 'display '(space :align-to 45)) "digits"))
(insert "\n" (make-string 18 ?-))
(when digitp
(insert (make-string 60 ?-)))
(insert "+" (make-string 60 ?-)))
(insert "\n")
(setq clm 0)
@ -270,7 +284,8 @@ If DIGITP is non-nil, include the digits translation as well."
(insert (propertize "\t" 'display (list 'space :align-to clm))
(car (nth i various)))
(setq clm (+ clm width)))
(insert (propertize "\t" 'display '(space :align-to 18)) "|")
(when digitp
(insert (propertize "\t" 'display '(space :align-to 18)) "|"))
(setq clm 20)
(when digitp
(dotimes (i 10)
@ -281,25 +296,28 @@ If DIGITP is non-nil, include the digits translation as well."
(setq clm 0)
(dotimes (i (length various))
(insert (propertize "\t" 'display (list 'space :align-to clm))
(or (cdr (nth i various)) ""))
(or (cadr (nth i various)) ""))
(setq clm (+ clm width)))
(insert (propertize "\t" 'display '(space :align-to 18)) "|")
(when digitp
(insert (propertize "\t" 'display '(space :align-to 18)) "|"))
(setq clm 20)
(when digitp
(dotimes (i 10)
(insert (propertize "\t" 'display (list 'space :align-to clm))
(format "%d" i))
(setq clm (+ clm width))))
(insert "\n" (make-string 18 ?-) "+")
(insert "\n" (make-string 18 ?-))
(when digitp
(insert (make-string 60 ?-) "\n"))
(insert "+" (make-string 60 ?-) "\n"))
(buffer-string))))
(defvar quail-tamil-itrans-various-signs-and-digits-table
(quail-tamil-itrans-compute-signs-table t))
(quail-tamil-itrans-compute-signs-table
t '((?ஃ "H") ("ஸ்ரீ" "srii") (?ௐ "OM"))))
(defvar quail-tamil-itrans-various-signs-table
(quail-tamil-itrans-compute-signs-table nil))
(quail-tamil-itrans-compute-signs-table
nil '((?ஃ "H") ("ஸ்ரீ" "srii") (?ௐ "OM"))))
(if nil
(quail-define-package "tamil-itrans" "Tamil" "TmlIT" t "Tamil ITRANS"))
@ -347,6 +365,160 @@ Their descriptions are included for easy reference.
Full key sequences are listed below:")
;;;
;;; Tamil phonetic input method
;;;
;; Define the input method straightaway.
(quail-define-package "tamil-phonetic" "Tamil" "" t
"Customisable Tamil phonetic input method.
To change the translation rules of the input method, customize
`tamil-translation-rules'.
To use native Tamil digits, customize `tamil-translation-rules'
accordingly.
To end the current translation process, say \\<quail-translation-keymap>\\[quail-select-current] (defined in
`quail-translation-keymap'). This is useful when there's a
conflict between two possible translation.
The current input scheme is:
### Basic syllables (உயிர்மய் எழத்தக்கள்) ###
\\=\\<tamil--syllable-table>
### Miscellaneous ####
\\=\\<tamil--signs-table>
The following characters have NO input sequence associated with
them by default. Their descriptions are included for easy
reference.
\\=\\<quail-tamil-itrans-numerics-and-symbols-table>
Full key sequences are listed below:"
nil nil nil nil nil nil t)
(defvar tamil--syllable-table nil)
(defvar tamil--signs-table nil)
(defvar tamil--hashtables
(cons (make-hash-table :test #'equal)
(make-hash-table :test #'equal)))
(defvar tamil--vowel-signs
'(("" . t) ("" . ?ா) ("" . ?ி) ("" . ?ீ)
("" . ?ு) ("" . ?ூ) ("" . ?ெ) ("" . ?ே)
("" . ?ை) ("" . ?ொ) ("" . ?ோ) ("" . ?ௌ)))
(defun tamil--setter (sym val)
(set-default sym val)
(tamil--update-quail-rules val))
(defun tamil--make-tables (rules)
(let (v v-table v-trans
c-table c-trans
m-table m-trans)
(dolist (ch rules)
(cond
;; Vowel.
((setq v (assoc-default (car ch) tamil--vowel-signs))
(push (list (car ch) (and (characterp v) v)) v-table)
(push (cdr ch) v-trans))
;; Consonant. It needs to end with pulli.
((string-suffix-p "" (car ch))
;; Strip the pulli now.
(push (substring (car ch) 0 -1) c-table)
(push (cdr ch) c-trans))
;; If nothing else, then consider it a misc character.
(t (push (car ch) m-table)
(push (cdr ch) m-trans))))
(list v-table v-trans c-table c-trans m-table m-trans)))
(defun tamil--update-quail-rules (rules &optional name)
;; This function does pretty much what `indian-make-hash' does
;; except that we don't try to copy the structure of
;; `indian-tml-base-table' which leads to less code hassle.
(let* ((quail-current-package (assoc (or name "tamil-phonetic") quail-package-alist))
(tables (tamil--make-tables rules))
(v (nth 0 tables))
(v-trans (nth 1 tables))
(c (nth 2 tables))
(c-trans (nth 3 tables))
(m (nth 4 tables))
(m-trans (nth 5 tables))
(pulli (string #x0BCD)))
(clrhash (car tamil--hashtables))
(clrhash (cdr tamil--hashtables))
(indian--puthash-v v v-trans tamil--hashtables)
(indian--puthash-c c c-trans pulli tamil--hashtables)
(indian--puthash-cv c c-trans v v-trans tamil--hashtables)
(indian--puthash-m m m-trans tamil--hashtables)
;; Now override the current translation rules.
;; Empty quail map is '(list nil)'.
(setf (nth 2 quail-current-package) '(nil))
(maphash (lambda (k v)
(quail-defrule k (if (length= v 1)
(string-to-char v)
(vector v))))
(cdr tamil--hashtables))
(setq tamil--syllable-table
(quail-tamil-itrans-compute-syllable-table
(mapcar (lambda (ch) (append ch (pop v-trans))) v)
(mapcar (lambda (ch) (cons ch (pop c-trans))) c))
tamil--signs-table
(quail-tamil-itrans-compute-signs-table
nil
(append (mapcar (lambda (ch) (cons ch (pop m-trans))) m)
(and (gethash "ஸ்" (car tamil--hashtables))
`(("ஸ்ரீ" ,(concat (gethash "ஸ்" (car tamil--hashtables))
(gethash "ரீ" (car tamil--hashtables)))))))))))
(defgroup tamil-input nil
"Translation rules for the Tamil input method."
:prefix "tamil-"
:group 'leim)
(defcustom tamil-translation-rules
;; Vowels.
'(("" "a") ("" "aa") ("" "i") ("" "ii")
("" "u") ("" "uu") ("" "e") ("" "ee")
("" "ai") ("" "o") ("" "oo") ("" "au" "ow")
;; Consonants.
("க்" "k" "g") ("ங்" "ng") ("ச்" "ch" "s") ("ஞ்" "nj") ("ட்" "t" "d")
("ண்" "N") ("த்" "th" "dh") ("ந்" "nh") ("ப்" "p" "b") ("ம்" "m")
("ய்" "y") ("ர்" "r") ("ல்" "l") ("வ்" "v") ("ழ்" "z" "zh")
("ள்" "L") ("ற்" "rh") ("ன்" "n")
;; Sanskrit.
("ஜ்" "j") ("ஸ்" "S") ("ஷ்" "sh") ("ஹ்" "h")
("க்‌ஷ்" "ksh") ("க்ஷ்" "ksH") ("ஶ்" "Z")
;; Misc. ஃ is neither a consonant nor a vowel.
("" "F" "q")
("" "OM"))
"List of input sequences to translate to Tamil characters.
Each element should be (CHARACTER INPUT-SEQUENCES...) where
CHARACTER is the Tamil character, and INPUT-SEQUENCES is a list
of input sequences which produce that character.
CHARACTER is considered as a consonant (ய் எழத்த) if it ends
with a pulli (virama).
CHARACTER that is neither a vowel nor a consonant are inserted as
is."
:group 'tamil-input
:type '(alist :key-type string :value-type (repeat string))
:set #'tamil--setter
:version "29.1"
:options
(delq nil
(append (mapcar #'car tamil--vowel-signs)
(mapcar (lambda (x) (if (characterp x)
(string x #x0BCD)
(and x (concat x ""))))
(nth 1 indian-tml-base-table))
'("" "")
;; Digits.
(mapcar #'string (nth 3 indian-tml-base-digits-table)))))
;;;
;;; Input by Inscript
;;;