marathi-transliterate 1.3.0 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "marathi-transliterate",
3
- "version": "1.3.0",
3
+ "version": "1.4.0",
4
4
  "description": "Zero-dependency, offline-first Marathi / Devanagari phonetic transliteration library. Converts English typing to Marathi (e.g. sakhar -> साखर) seamlessly in plain JS, Node.js, and frontend frameworks.",
5
5
  "type": "module",
6
6
  "main": "src/index.js",
package/src/dictionary.js CHANGED
@@ -3,6 +3,276 @@
3
3
  * Kirana/grocery items, customer names, units, and shop terms.
4
4
  */
5
5
  export const MARATHI_DICTIONARY = {
6
+ // --- Popular Marathi Kirana Brands, Masale & Staples with Anusvara ---
7
+ 'rambandhu': 'रामबंधू',
8
+ 'rambandhoo': 'रामबंधू',
9
+ 'rambandhuu': 'रामबंधू',
10
+ 'bandhu': 'बंधू',
11
+ 'bandhuu': 'बंधू',
12
+ 'bandhoo': 'बंधू',
13
+ 'pravin': 'प्रवीण',
14
+ 'suhana': 'सुहाना',
15
+ 'everest': 'एव्हरेस्ट',
16
+ 'badshah': 'बादशाह',
17
+ 'rambandhupapad': 'रामबंधू पापड',
18
+ 'shingada': 'शिंगाडा',
19
+ 'bhendi': 'भेंडी',
20
+ 'bundi': 'बुंदी',
21
+ 'tambaku': 'तंबाखू',
22
+ 'gulabjam': 'गुलाबजाम',
23
+ 'gulabjamun': 'गुलाबजामून',
24
+
25
+ // --- Comprehensive Maharashtrian FMCG, Brands & Staples ---
26
+ 'everestmasale': 'एव्हरेस्ट मसाले',
27
+ 'tikhalal': 'तिखाललाल',
28
+ 'badshahmasala': 'बादशाह मसाला',
29
+ 'suhanamasale': 'सुहाना मसाले',
30
+ 'pravinmasale': 'प्रवीण मसाले',
31
+ 'bedekar': 'बेडेकर',
32
+ 'bedekarmasale': 'बेडेकर मसाले',
33
+ 'katdare': 'काटदरे',
34
+ 'kpra': 'के-प्र',
35
+ 'suruchi': 'सुरुची',
36
+ 'khamkar': 'खामकर',
37
+ 'mdh': 'एमडीएच',
38
+ 'mdhmasala': 'एमडीएच मसाला',
39
+ 'catch': 'कॅच',
40
+ 'catchmasala': 'कॅच मसाला',
41
+ 'goldie': 'गोल्डी',
42
+ 'chitalebandhu': 'चितळे बंधू',
43
+ 'gokul': 'गोकुळ',
44
+ 'warana': 'वारणा',
45
+ 'katraj': 'कात्रज',
46
+ 'amul': 'अमुल',
47
+ 'amuldudh': 'अमुल दूध',
48
+ 'amulbutter': 'अमुल बटर',
49
+ 'amulghee': 'अमुल तूप',
50
+ 'gowardhan': 'गोवर्धन',
51
+ 'gowardhanghee': 'गोवर्धन तूप',
52
+ 'motherdairy': 'मदर डेअरी',
53
+ 'patanjali': 'पतंजली',
54
+ 'haldiram': 'हल्दीराम',
55
+ 'balajiwafers': 'बालाजी वेफर्स',
56
+ 'lijjat': 'लिज्जत',
57
+ 'lijjatpapad': 'लिज्जत पापड',
58
+ 'tata': 'टाटा',
59
+ 'tatatea': 'टाटा चहा',
60
+ 'tatapremium': 'टाटा प्रीमियम',
61
+ 'tatagold': 'टाटा गोल्ड',
62
+ 'tatani': 'टाटा मीठ',
63
+ 'tatamith': 'टाटा मीठ',
64
+ 'tatansalt': 'टाटा सॉल्ट',
65
+ 'redlabel': 'रेड लेबल',
66
+ 'tajmahal': 'ताजमहाल',
67
+ 'waghbakri': 'वाघ बकरी',
68
+ 'society': 'सोसायटी',
69
+ 'societytea': 'सोसायटी चहा',
70
+ 'girnar': 'गिरनार',
71
+ 'gemini': 'जेमिनी',
72
+ 'geminioil': 'जेमिनी तेल',
73
+ 'fortune': 'फॉर्च्युन',
74
+ 'fortuneoil': 'फॉर्च्युन तेल',
75
+ 'saffola': 'सॅफोला',
76
+ 'saffolaoil': 'सॅफोला तेल',
77
+ 'dhara': 'धारा',
78
+ 'dharaoil': 'धारा तेल',
79
+ 'aashirvaad': 'आशीर्वाद',
80
+ 'aashirvaadatta': 'आशीर्वाद आटा',
81
+ 'pillsbury': 'पिल्सबरी',
82
+ 'surfexcel': 'सर्फ एक्सेल',
83
+ 'vimbar': 'विम बार',
84
+ 'vimliquid': 'विम लिक्विड',
85
+ 'pril': 'प्रिल',
86
+ 'lifebuoy': 'लाइफबॉय',
87
+ 'lux': 'लक्स',
88
+ 'santoor': 'संतूर',
89
+ 'medimix': 'मेडिमिक्स',
90
+ 'godrejno1': 'गोदरेज नं. १',
91
+ 'cinthol': 'सिंथॉल',
92
+ 'pears': 'पिअर्स',
93
+ 'dove': 'डव्ह',
94
+ 'vicco': 'व्हिको',
95
+ 'viccovajradanti': 'व्हिको वज्रदंती',
96
+ 'goodknight': 'गुड नाइट',
97
+ 'allout': 'ऑल आउट',
98
+ 'mortein': 'मॉर्टिन',
99
+ 'hit': 'हिट',
100
+ 'parleg': 'पारले-जी',
101
+ 'monaco': 'मोनाको',
102
+ 'krackjack': 'क्रॅकजॅक',
103
+ 'yippee': 'यिप्पी',
104
+ 'cadbury': 'कॅडबरी',
105
+ 'dairymilk': 'डेअरी मिल्क',
106
+ 'bournvita': 'बोर्नव्हिटा',
107
+ 'horlicks': 'हॉर्लिक्स',
108
+ 'boost': 'बूस्ट',
109
+ 'complan': 'कॉम्प्लॅन',
110
+ 'nescafe': 'नेस्कॅफे',
111
+ 'bru': 'ब्रू कॉफी',
112
+ 'godamasala': 'गोडा मसाला',
113
+ 'kandalasun': 'कांदा लसूण',
114
+ 'kandalasunmasala': 'कांदा लसूण मसाला',
115
+ 'misalmasala': 'मिसळ मसाला',
116
+ 'pavbhaji': 'पाव भाजी',
117
+ 'pavbhajimasala': 'पाव भाजी मसाला',
118
+ 'garammasala': 'गरम मसाला',
119
+ 'chanamasala': 'चना मसाला',
120
+ 'cholemasala': 'छोले मसाला',
121
+ 'chaatmasala': 'चाट मसाला',
122
+ 'sambharmasala': 'सांभार मसाला',
123
+ 'rasammasala': 'रसम मसाला',
124
+ 'biryanimasala': 'बिर्याणी मसाला',
125
+ 'pulaomasala': 'पुलाव मसाला',
126
+ 'chickenmasala': 'चिकन मसाला',
127
+ 'muttonmasala': 'मटन मसाला',
128
+ 'fishmasala': 'फिश मसाला',
129
+ 'kitchenking': 'किचन किंग',
130
+ 'maggimasala': 'मॅगी मसाला',
131
+ 'panipuri': 'पाणीपुरी',
132
+ 'panipurimasala': 'पाणीपुरी मसाला',
133
+ 'jaljira': 'जलजिरा',
134
+ 'dhanapowder': 'धने पावडर',
135
+ 'jeerapowder': 'जिरे पावडर',
136
+ 'haldipowder': 'हळद पावडर',
137
+ 'mirchipowder': 'मिरची पावडर',
138
+ 'kashmirimirchi': 'काश्मिरी मिरची',
139
+ 'chakrifool': 'चक्रीफूल',
140
+ 'shahjeera': 'शहाजिरे',
141
+ 'jaiphal': 'जायफळ',
142
+ 'jaipatri': 'जायपत्री',
143
+ 'kasurimethi': 'कसुरी मेथी',
144
+ 'methidana': 'मेथी दाणा',
145
+ 'ajwain': 'ओवा',
146
+ 'ova': 'ओवा',
147
+ 'khadamasala': 'खडा मसाला',
148
+ 'kalimirch': 'काळी मिरी',
149
+ 'mira': 'मिरे',
150
+ 'varai': 'वरई',
151
+ 'rajgiraatta': 'राजगिरा पीठ',
152
+ 'rajgiraladu': 'राजगिरा लाडू',
153
+ 'upwasbhajani': 'उपवास भाजणी',
154
+ 'thalipeeth': 'थालिपीठ',
155
+ 'thalipeethbhajani': 'थालिपीठ भाजणी',
156
+ 'batatakees': 'बटाटा कीस',
157
+ 'upwaspapad': 'उपवास पापड',
158
+ 'sendhanamak': 'सेंधव मीठ',
159
+ 'saindhav': 'सैंधव मीठ',
160
+ 'singhadapith': 'शिंगाडा पीठ',
161
+ 'moongdal': 'मूग डाळ',
162
+ 'chanadal': 'चना डाळ',
163
+ 'uraddal': 'उडीद डाळ',
164
+ 'masoordal': 'मसूर डाळ',
165
+ 'kabulichana': 'काबुली चना',
166
+ 'kalachana': 'काळा चना',
167
+ 'harbara': 'हरभरा',
168
+ 'harbaradal': 'हरभरा डाळ',
169
+ 'safedvatana': 'पांढरा वटाणा',
170
+ 'hirvavatana': 'हिरवा वटाणा',
171
+ 'chawli': 'चवळी',
172
+ 'singdana': 'शेंगदाणा',
173
+ 'singdane': 'शेंगदाणे',
174
+ 'soyabean': 'सोयाबीन',
175
+ 'wheatflour': 'गहू पीठ',
176
+ 'jowarflour': 'ज्वारी पीठ',
177
+ 'bajraflour': 'बाजरी पीठ',
178
+ 'nachaniflour': 'नाचणी पीठ',
179
+ 'riceflour': 'तांदूळ पीठ',
180
+ 'wadakolam': 'वाडा कोलम',
181
+ 'sonamasoori': 'सोना मसुरी',
182
+ 'indrayani': 'इंद्रायणी',
183
+ 'tukda': 'तुकडा बासमती',
184
+ 'jadapohe': 'जाड पोहे',
185
+ 'patalpohe': 'पातळ पोहे',
186
+ 'makkapoha': 'मका पोहे',
187
+ 'kurmure': 'कुरमुरे',
188
+ 'chirmure': 'चिरमुरे',
189
+ 'sandge': 'सांडगे',
190
+ 'sandage': 'सांडगे',
191
+ 'batatapapad': 'बटाटा पापड',
192
+ 'pohapapad': 'पोहे पापड',
193
+ 'udadpapad': 'उडीद पापड',
194
+ 'moongpapad': 'मूग पापड',
195
+ 'ambalonche': 'आंबा लोणचे',
196
+ 'limbulonche': 'लिंबू लोणचे',
197
+ 'mirchilonche': 'मिरची लोणचे',
198
+ 'mixlonche': 'मिक्स्ड लोणचे',
199
+ 'kolhapurigul': 'कोल्हापुरी गूळ',
200
+ 'organicgul': 'सेंद्रिय गूळ',
201
+ 'khadisakhar': 'खडीसाखर',
202
+ 'shengdanatel': 'शेंगदाणा तेल',
203
+ 'groundnutoil': 'शेंगदाणा तेल',
204
+ 'soyabeanoil': 'सोयाबीन तेल',
205
+ 'sunfloweroil': 'सूर्यफूल तेल',
206
+ 'tiltel': 'तीळ तेल',
207
+ 'khobrel': 'खोबरेल तेल',
208
+ 'coconutoil': 'खोबरेल तेल',
209
+ 'sarson': 'मोहरी तेल',
210
+ 'mustardoil': 'मोहरी तेल',
211
+ 'gaayghee': 'गाय तूप',
212
+ 'mhaisghee': 'म्हैस तूप',
213
+ 'vanaspati': 'वनस्पती तूप',
214
+ 'dalda': 'डालडा',
215
+ 'khoya': 'खोया',
216
+ 'mawa': 'मावा',
217
+ 'kande': 'कांदे',
218
+ 'tomato': 'टोमॅटो',
219
+ 'tamatar': 'टोमॅटो',
220
+ 'aalelasun': 'आले लसूण पेस्ट',
221
+ 'gingergarlic': 'आले लसूण पेस्ट',
222
+ 'pudina': 'पुदिना',
223
+ 'karipatta': 'कढीपत्ता',
224
+ 'kadipatta': 'कढीपत्ता',
225
+ 'hirvimirchi': 'हिरवी मिरची',
226
+ 'lalmirchi': 'लाल मिरची',
227
+ 'shevga': 'शेवगा शेंगा',
228
+ 'shevgasheng': 'शेवगा शेंग',
229
+ 'vangi': 'वांगी',
230
+ 'dudhi': 'दुधी भोपळा',
231
+ 'lalbhopla': 'लाल भोपळा',
232
+ 'gavar': 'गवार',
233
+ 'tondli': 'तोंडली',
234
+ 'ghosale': 'घोसाळे',
235
+ 'flower': 'फ्लॉवर',
236
+ 'cabbage': 'कोबी',
237
+ 'kobi': 'कोबी',
238
+ 'shimlamirchi': 'शिमला मिरची',
239
+ 'gajar': 'गाजर',
240
+ 'beet': 'बीट',
241
+ 'kakdi': 'काकडी',
242
+ 'palak': 'पालक',
243
+ 'shepu': 'शेपू',
244
+ 'amba': 'आंबा',
245
+ 'aamba': 'आंबा',
246
+ 'kairi': 'कैरी',
247
+ 'safarchand': 'सफरचंद',
248
+ 'draksha': 'द्राक्षे',
249
+ 'santre': 'संत्री',
250
+ 'mosambi': 'मोसंबी',
251
+ 'dalimb': 'डाळिंब',
252
+ 'chikoo': 'चिकू',
253
+ 'peru': 'पेरू',
254
+ 'ananas': 'अननस',
255
+ 'papayi': 'पपई',
256
+ 'kalingad': 'कलिंगड',
257
+ 'kharbuj': 'खरबूज',
258
+ 'sitaphal': 'सीताफळ',
259
+ 'ramphal': 'रामफळ',
260
+ 'jambhul': 'जांभूळ',
261
+ 'dhoopbatti': 'धूप बत्ती',
262
+ 'bhimsenikapoor': 'भीमसेनी कापूर',
263
+ 'kunku': 'कुंकू',
264
+ 'chandan': 'चंदन',
265
+ 'chandantika': 'चंदन टिका',
266
+ 'poojasupari': 'पूजा सुपारी',
267
+ 'olanaral': 'ओला नारळ',
268
+ 'sukhanaral': 'सुका नारळ',
269
+ 'sukhekhobre': 'सुके खोबरे',
270
+ 'kaapsachivat': 'कापसाची वात',
271
+ 'golvat': 'गोल वात',
272
+ 'laambvat': 'लांब वात',
273
+ 'samaitel': 'सई तेल',
274
+ 'poojatel': 'पूजा तेल',
275
+
6
276
  // --- Grocery & Kirana Staples ---
7
277
  'sakhar': 'साखर',
8
278
  'saakhar': 'साखर',
package/src/index.js CHANGED
@@ -207,6 +207,19 @@ export function getSuggestions(word, options = {}) {
207
207
  if (clean.endsWith("a") && s.endsWith("ा")) {
208
208
  add(s.slice(0, -1));
209
209
  }
210
+
211
+ // 4k. Smart Anusvara (टिंब) variants expansion (मराठी शुद्धलेखन)
212
+ // Automatically generates standard Marathi Anusvara spellings for conjunct nasals
213
+ // e.g. "बन्धु" -> "बंधू" / "बंधु", "सम्पत" -> "संपत", "आनन्द" -> "आनंद"
214
+ const anusvarRegex = /(?:न्|म्|ङ्|ञ्|ण्)(?=[क-ह])/g;
215
+ if (anusvarRegex.test(s)) {
216
+ const withAnusvar = s.replace(anusvarRegex, "ं");
217
+ add(withAnusvar);
218
+ if (withAnusvar.endsWith("ु")) add(withAnusvar.slice(0, -1) + "ू");
219
+ if (withAnusvar.endsWith("ू")) add(withAnusvar.slice(0, -1) + "ु");
220
+ if (withAnusvar.endsWith("ि")) add(withAnusvar.slice(0, -1) + "ी");
221
+ if (withAnusvar.endsWith("ी")) add(withAnusvar.slice(0, -1) + "ि");
222
+ }
210
223
  }
211
224
 
212
225
  // 5. Prefix matches from dictionary (if clean.length >= 3)
package/src/phonetics.js CHANGED
@@ -29,7 +29,8 @@ const CONSONANTS = [
29
29
  { en: "SH", mr: "ष", caseSensitive: true },
30
30
  { en: "sh", mr: "श" },
31
31
  { en: "ck", mr: "क" },
32
- { en: "ng", mr: "ङ" },
32
+ { en: "NG", mr: "ङ", caseSensitive: true },
33
+ { en: "ng", mr: "ंग" },
33
34
  { en: "c", mr: "क" },
34
35
 
35
36
  // Single consonants - case-sensitive retroflex & special Marathi sounds FIRST
@@ -131,6 +132,16 @@ export function phoneticTransliterateWord(text) {
131
132
  // Check independent vowel at the beginning of a word or after non-alpha
132
133
  let matchedVowel = false;
133
134
  if (i === 0 || !/[a-zA-Z]/.test(clean[i - 1])) {
135
+ const initialNasal = clean.substring(i, i + 2).toLowerCase();
136
+ if (initialNasal === 'am' || initialNasal === 'an') {
137
+ const charAfter = clean[i + 2];
138
+ const isFollowedByVowel = charAfter && /[aeiouA]/i.test(charAfter);
139
+ if (!isFollowedByVowel) {
140
+ res += 'अं';
141
+ i += 2;
142
+ matchedVowel = true;
143
+ }
144
+ }
134
145
  for (const v of INDEPENDENT_VOWELS) {
135
146
  const sub = clean.substring(i, i + v.en.length);
136
147
  const isMatch = v.caseSensitive ? sub === v.en : sub.toLowerCase() === v.en.toLowerCase();
@@ -157,7 +168,23 @@ export function phoneticTransliterateWord(text) {
157
168
 
158
169
  // Check for attached vowel matra
159
170
  let matchedMatra = false;
160
- for (const m of MATRAS) {
171
+
172
+ // Check 2-letter nasal matras (am, an) representing Marathi Anusvara (ं)
173
+ // when followed by a consonant or at end of word.
174
+ // e.g. 'bandhu' -> 'ब' + 'ं' + 'धु' = 'बंधु', 'sampat' -> 'संपत', 'pankaj' -> 'पंकज'
175
+ const nextTwo = clean.substring(i, i + 2).toLowerCase();
176
+ if (nextTwo === 'am' || nextTwo === 'an') {
177
+ const charAfter = clean[i + 2];
178
+ const isFollowedByVowel = charAfter && /[aeiouA]/i.test(charAfter);
179
+ if (!isFollowedByVowel) {
180
+ res += 'ं';
181
+ i += 2;
182
+ matchedMatra = true;
183
+ }
184
+ }
185
+
186
+ if (!matchedMatra) {
187
+ for (const m of MATRAS) {
161
188
  const nextSub = clean.substring(i, i + m.en.length);
162
189
  const mCaseSensitive = m.caseSensitive || m.en === "A";
163
190
  const mMatch = mCaseSensitive ? nextSub === m.en : nextSub.toLowerCase() === m.en.toLowerCase();
@@ -175,6 +202,7 @@ export function phoneticTransliterateWord(text) {
175
202
  break;
176
203
  }
177
204
  }
205
+ }
178
206
 
179
207
  // If no vowel followed and next character is also a consonant, apply halant (virama ्)
180
208
  // In Marathi/Hindi phonetics, word-final consonants do NOT get halant
@@ -195,5 +223,8 @@ export function phoneticTransliterateWord(text) {
195
223
  }
196
224
  }
197
225
 
226
+ // Standard Marathi Shuddhalekhan Rule: nasal conjuncts before consonants become Anusvara
227
+ res = res.replace(/(?:न्|म्|ङ्|ञ्|ण्)(?=[क-ह])/g, "ं");
228
+
198
229
  return res;
199
230
  }