Subject: Re: bug#55370: [PATCH] Add support for the Syloti Nagri script

From: समीर सिंह Sameer Singh<[email-masked]>
Date: Sun, 15 May 2022 05:17:07 +0530

I have updated the patch.

1. Wherever the nasal signs are not in range, I have not included them in a
composition rule if they appear alone with a character and left them up to
composite.el.
For eg in Kaithi

- ;; Nasal vowels
- (concat independent-vowel nasal "?")
+ ;; Vowel based syllables
+ (concat independent-vowel nukta "?" virama "?" vowel "?")

2. I have also written composition rules for independent vowels with nukta,
virama, vowel signs etc, so that Emacs does not hang when they are typed
together.

Please review the patch.

On Thu, May 12, 2022 at 10:58 PM समीर सिंह Sameer Singh <
[email-masked]> wrote:

> Ok I will do that, thanks!
>
> On Thu, May 12, 2022 at 10:55 PM Eli Zaretskii <[email-masked]> wrote:
>
>> > From: समीर सिंह Sameer Singh <[email-masked]>
>> > Date: Thu, 12 May 2022 22:40:02 +0530
>> > Cc: [email-masked]
>> >
>> > Yes it was not correct, this seems more appropriate.
>> >
>> > ;; Syloti Nagri composition rules
>> > (let ((consonant            "[\xA807-\xA80A\xA80C-\xA822]")
>> >       (independent-vowel    "[\xA800\xA801\xA803-\xA805]")
>> >       (vowel                "[\xA802\xA823-\xA827]")
>> >       (nasal                "[\xA80B]")
>> >       (virama               "[\xA806\xA82C]"))
>> >   (set-char-table-range composition-function-table
>> >                         '(#xA802 . #xA82C)
>> >                         (list (vector
>> >                                ;; Consonant conjunct based syllables
>> >                                (concat independent-vowel "?" consonant
>> "\\(?:" virama consonant "\\)+"
>> >                                        vowel "?" nasal "?")
>> >                                1 'font-shape-gstring))))
>> >
>> > btw this range does not cause emacs to slow down, right?
>>
>> It might, because the range is very large, and so any character in the
>> range #xA802..#xA82C will cause Emacs to try to match the regexp.
>>
>> So if there's a way of having the rules on fewer characters, that
>> would be better, even if there will be more rules.
>>
>> > also should I send separate patches for the syloti nagri, and the fix
>> for previous scripts, or combine them into
>> > one?
>>
>> You can combine them into a single patch, just make sure the log
>> message mentions all the changes.
>>
>> Thanks.
>>
>
From 231a113b721e92a62ce171b98c3461c255429862 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E0=A4=B8=E0=A4=AE=E0=A5=80=E0=A4=B0=20=E0=A4=B8=E0=A4=BF?=
 =?UTF-8?q?=E0=A4=82=E0=A4=B9=20Sameer=20Singh?= <[email-masked]>
Date: Sun, 15 May 2022 05:09:15 +0530
Subject: [PATCH] Add support for the Syloti Nagri script

* lisp/language/indian.el ("Syloti Nagri"): New language environment.
Add composition rules for Syloti Nagri.  Add sample text and input
method.
Improve composition rules for Kaithi, Tirhuta, Sharada and Siddham.
* lisp/international/fontset.el (script-representative-chars)
(setup-default-fontset): Support Syloti Nagri.
* lisp/leim/quail/indian.el ("syloti-nagri"): New input method.

* etc/HELLO: Add two Syloti Nagri greetings.
* etc/NEWS: Announce the new language environment and its
input method.
---
 etc/HELLO                     |  1 +
 etc/NEWS                      |  5 +++
 lisp/international/fontset.el |  2 +
 lisp/language/indian.el       | 79 ++++++++++++++++++++++++++--------
 lisp/leim/quail/indian.el     | 81 +++++++++++++++++++++++++++++++++++
 5 files changed, 151 insertions(+), 17 deletions(-)

diff --git a/etc/HELLO b/etc/HELLO
index b14fa0e861..16a38b59d3 100644
--- a/etc/HELLO
+++ b/etc/HELLO
@@ -82,6 +82,7 @@ Slovak (slovenčina)	Dobrý deň
 Slovenian (slovenščina)	Pozdravljeni!
 Spanish (español)	¡Hola!
 Swedish (svenska)	Hej / Goddag / Hallå
+Syloti Nagri (ꠍꠤꠟꠐꠤ ꠘꠣꠉꠞꠤ)	ꠀꠌ꠆ꠍꠣꠟꠣꠝꠥ ꠀꠟꠣꠁꠇꠥꠝ / ꠘꠝꠡ꠆ꠇꠣꠞ
 Tamil (தமிழ்)	வணக்கம்
 Telugu (తెలుగు)	నమస్కారం
 TaiViet (ꪁꪫꪱꪣ ꪼꪕ)	ꪅꪰꪙꫂ ꪨꪮꫂ ꪁꪫꪱ / ꪅꪽ ꪨꪷ ꪁꪫꪱ
diff --git a/etc/NEWS b/etc/NEWS
index d93a79ed36..2962a50d99 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -791,6 +791,11 @@ language.  Nowadays it is mostly used by the Buddhist monks in Japan for
 religious writings.  A new input method, 'siddham', is provided to type
 text in this script.
 
+*** New language environment "Syloti Nagri"
+This language environment supports the Syloti Nagri script for the Sylheti
+language, which is spoke in parts of Bangladesh, Assam and Tripura.  A new
+input method, 'syloti-nagri', is provided to type text in this script.
+
 ---
 *** New Greek translation of the Emacs tutorial.
 Type 'C-u C-h t' to select it in case your language setup does not do
diff --git a/lisp/international/fontset.el b/lisp/international/fontset.el
index 144c3761a0..2579b839dd 100644
--- a/lisp/international/fontset.el
+++ b/lisp/international/fontset.el
@@ -194,6 +194,7 @@ font-encoding-charset-alist
 	(kanbun #x319D)
 	(han #x5B57)
 	(yi #xA288)
+        (syloti-nagri #xA807 #xA823 #xA82C)
 	(javanese #xA980)
 	(cham #xAA00)
 	(tai-viet #xAA80)
@@ -748,6 +749,7 @@ setup-default-fontset
 		    symbol
 		    braille
 		    yi
+                    syloti-nagri
                     javanese
 		    tai-viet
 		    aegean-number
diff --git a/lisp/language/indian.el b/lisp/language/indian.el
index b399756bbe..559239b491 100644
--- a/lisp/language/indian.el
+++ b/lisp/language/indian.el
@@ -180,6 +180,17 @@ 'devanagari
 in this language environment."))
  '("Indian"))
 
+(set-language-info-alist
+ "Syloti Nagri" '((charset unicode)
+                  (coding-system utf-8)
+                  (coding-priority utf-8)
+                  (input-method . "syloti-nagri")
+                  (sample-text . "Syloti Nagri (ꠍꠤꠟꠐꠤ ꠘꠣꠉꠞꠤ)        ꠀꠌ꠆ꠍꠣꠟꠣꠝꠥ ꠀꠟꠣꠁꠇꠥꠝ")
+                  (documentation . "\
+Sylheti language and its script Syloti Nagri is supported
+in this language environment."))
+ '("Indian"))
+
 
 ;; Replace mnemonic characters in REGEXP according to TABLE.  TABLE is
 ;; an alist of (MNEMONIC-STRING . REPLACEMENT-STRING).
@@ -485,12 +496,13 @@ malayalam-composable-pattern
                         '(#x110B0 . #x110BA)
                         (list (vector
                                ;; Consonant based syllables
-                               (concat consonant nukta "?\\(?:" virama zwj "?" consonant nukta "?\\)*\\(?:"
-                                       virama zwj "?\\|" vowel "*" nukta "?" nasal "?\\)")
+                               (concat consonant nukta "?\\(?:" virama zwj "?" consonant
+                                       nukta "?\\)*\\(?:" virama zwj "?\\|" vowel "*" nukta
+                                       "?" nasal "?\\)")
                                1 'font-shape-gstring)
                               (vector
-                               ;; Nasal vowels
-                               (concat independent-vowel nasal "?")
+                               ;; Vowel based syllables
+                               (concat independent-vowel nukta "?" virama "?" vowel "?")
                                1 'font-shape-gstring)))
   (set-char-table-range composition-function-table
                         '(#x110BD . #x110BD)
@@ -516,12 +528,13 @@ malayalam-composable-pattern
                         '(#x114B0 . #x114C3)
                         (list (vector
                                ;; Consonant based syllables
-                               (concat consonant nukta "?\\(?:" virama consonant nukta "?\\)*\\(?:"
-                                       virama "\\|" vowel "*" nukta "?" nasal "?\\)")
+                               (concat consonant nukta "?\\(?:" virama consonant nukta
+                                       "?\\)*\\(?:" virama "\\|" vowel "*" nukta "?"
+                                       nasal "?\\)")
                                1 'font-shape-gstring)
                               (vector
-                               ;; Nasal vowels
-                               (concat independent-vowel nasal "?")
+                               ;; Vowel based syllables
+                               (concat independent-vowel nukta "?" virama "?" vowel "?" nasal "?")
                                1 'font-shape-gstring))))
 
 ;; Sharada composition rules
@@ -535,19 +548,21 @@ malayalam-composable-pattern
       (virama                 "\x111C0")
       (fricatives             "[\x111C2\x111C3]")
       (sandhi-mark            "\x111C9")
-      (misc                   "[^\x11180-\x111C0\x111C2\x111C3\x111C9-\x111CC\x111CE-\x111CF]"))
+      (misc                   "[\x111C4-\x111C8\x111CD]"))
   (set-char-table-range composition-function-table
-                        '(#x111B3 . #x111CF)
+                        '(#x111B3 . #x111CE)
                         (list (vector
                                ;; Consonant based syllables
                                (concat consonant nukta "?" vowel-modifier "?\\(?:" virama
                                        consonant nukta "?" vowel-modifier "?\\)*\\(?:" virama
                                        "\\|" vowel "*" nukta "?" nasal "?" extra-short-vowel-mark
-                                       "?" vowel-modifier "?" sandhi-mark "?+" misc "?\\)")
+                                        "?" vowel-modifier "?" sandhi-mark "?+" misc "?\\)")
                                1 'font-shape-gstring)
                               (vector
-                               ;; Nasal vowels
-                               (concat independent-vowel nasal "?")
+                               ;; Vowel based syllables
+                               (concat independent-vowel nukta "?" vowel-modifier "?" virama "?"
+                                       vowel "?" extra-short-vowel-mark "?" sandhi-mark "?"
+                                       fricatives "?" misc "?")
                                1 'font-shape-gstring)
                               (vector
                                ;; Fricatives with Consonants
@@ -560,17 +575,47 @@ malayalam-composable-pattern
       (independent-vowel    "[\x11580-\x1158D\x115D8-\x115DB]")
       (vowel                "[\x115AF-\x115BB\x115DC\x115DD]")
       (nasal                "[\x115BC\x115BD]")
+      (visarga              "\x115BE")
       (virama               "\x115BF"))
   (set-char-table-range composition-function-table
                         '(#x115AF . #x115C0)
                         (list (vector
                                ;; Consonant based syllables
-                               (concat consonant nukta "?\\(?:" virama consonant nukta "?\\)*\\(?:"
-                                       virama "\\|" vowel "*" nukta "?" nasal "?\\)")
+                               (concat consonant nukta "?" "\\(?:" virama consonant nukta
+                                       "?\\)*\\(?:" virama "\\|" vowel "*" nukta "?" nasal
+                                       "?" visarga "?\\)")
                                1 'font-shape-gstring)
                               (vector
-                               ;; Nasal vowels
-                               (concat independent-vowel nasal "?")
+                               ;; Vowels based syllables
+                               (concat independent-vowel nukta "?" virama "?" vowel "?"
+                                       nasal "?" visarga "?")
+                               1 'font-shape-gstring))))
+
+;; Syloti Nagri composition rules
+(let ((consonant            "[\xA807-\xA80A\xA80C-\xA822]")
+      (vowel                "[\xA802\xA823-\xA827]")
+      (nasal                "[\xA80B]")
+      (virama               "\xA806")
+      (alternate-virama     "\xA82C"))
+  (set-char-table-range composition-function-table
+                        '(#xA806 . #xA806)
+                        (list (vector
+                               ;; Consonant conjunct based syllables
+                               (concat consonant "\\(?:" virama consonant "\\)+"
+                                       vowel "?" nasal "?")
+                               1 'font-shape-gstring)))
+  (set-char-table-range composition-function-table
+                        '(#xA823 . #xA827)
+                        (list (vector
+                               ;; Non Consonant conjunct based syllables
+                               (concat consonant vowel nasal "?")
+                               1 'font-shape-gstring)))
+    (set-char-table-range composition-function-table
+                        '(#xA82C . #xA82C)
+                        (list (vector
+                               ;; Consonant with the alternate virama
+                               (concat consonant "\\(?:" alternate-virama consonant "\\)+"
+                                       vowel "?" nasal "?")
                                1 'font-shape-gstring))))
 
 (provide 'indian)
diff --git a/lisp/leim/quail/indian.el b/lisp/leim/quail/indian.el
index 6c58fdd40b..eb9d1183e5 100644
--- a/lisp/leim/quail/indian.el
+++ b/lisp/leim/quail/indian.el
@@ -1267,4 +1267,85 @@ "||"
 ("`m" ?𑖼)
 )
 
+
+(quail-define-package
+ "syloti-nagri" "Syloti Nagri" "ꠍꠤ" t "Syloti Nagri phonetic input method.
+
+ `\\=`' is used to switch levels instead of Alt-Gr.
+" nil t t t t nil nil nil nil nil t)
+
+(quail-define-rules
+("``" ?₹)
+("`~" ?৳)
+("1"  ?১)
+("`1" ?1)
+("2"  ?২)
+("`2" ?2)
+("3"  ?৩)
+("`3" ?3)
+("4"  ?৪)
+("`4" ?4)
+("5"  ?৫)
+("`5" ?5)
+("6"  ?৬)
+("`6" ?6)
+("7"  ?৭)
+("`7" ?7)
+("8"  ?৮)
+("`8" ?8)
+("9"  ?৯)
+("`9" ?9)
+("0"  ?০)
+("`0" ?0)
+("`\\" ?𑇅)
+("`|" ?𑇆)
+("`"  ?ꠐ)
+("q"  ?ꠐ)
+("Q"  ?ꠑ)
+("`q" ?꠨)
+("`Q" ?꠩)
+("w"  ?ꠒ)
+("W"  ?ꠓ)
+("`w" ?꠪)
+("`W" ?꠫)
+("e"  ?ꠦ)
+("E"  ?ꠄ)
+("r"  ?ꠞ)
+("R"  ?ꠠ)
+("t"  ?ꠔ)
+("T"  ?ꠕ)
+("y"  ?ꠂ)
+("u"  ?ꠥ)
+("U"  ?ꠃ)
+("i"  ?ꠤ)
+("I"  ?ꠁ)
+("o"  ?ꠧ)
+("O"  ?ꠅ)
+("p"  ?ꠙ)
+("P"  ?ꠚ)
+("a"  ?ꠣ)
+("A"  ?ꠀ)
+("s"  ?ꠡ)
+("d"  ?ꠖ)
+("D"  ?ꠗ)
+("f"  ?꠆)
+("F" ?꠬)
+("g"  ?ꠉ)
+("G"  ?ꠊ)
+("h"  ?ꠢ)
+("j"  ?ꠎ)
+("J"  ?ꠏ)
+("k"  ?ꠇ)
+("K"  ?ꠈ)
+("l"  ?ꠟ)
+("c"  ?ꠌ)
+("C"  ?ꠍ)
+("`c" #x200C)  ; ZWNJ
+("b"  ?ꠛ)
+("B"  ?ꠜ)
+("n"  ?ꠘ)
+("m"  ?ꠝ)
+("M"  ?ꠋ)
+)
+
 ;;; indian.el ends here
-- 
2.36.1