marathi-transliterate 1.6.0 → 1.7.1

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.6.0",
3
+ "version": "1.7.1",
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
@@ -1359,6 +1359,284 @@ export const MARATHI_DICTIONARY = {
1359
1359
  "vati": "वाटी",
1360
1360
  "vatya": "वाट्या",
1361
1361
  "watti": "वाटी",
1362
- "wattya": "वाट्या"
1362
+ "wattya": "वाट्या",
1363
1363
 
1364
+ // Anand & names
1365
+ "anand": "आनंद",
1366
+ "aanand": "आनंद",
1367
+
1368
+ // Common customer honorifics, titles, relations and grocery staples
1369
+ "bhaiyya": "भैय्या",
1370
+ "bhaiya": "भैया",
1371
+ "bhayya": "भय्या",
1372
+ "bhaiyys": "भैय्या",
1373
+ "bhaiyas": "भैया",
1374
+ "bhai": "भाई",
1375
+ "bhau": "भाऊ",
1376
+ "mama": "मामा",
1377
+ "kaka": "काका",
1378
+ "nana": "नाना",
1379
+ "bapu": "बापू",
1380
+ "babu": "बाबू",
1381
+ "tai": "ताई",
1382
+ "aai": "आई",
1383
+ "didi": "दीदी",
1384
+ "aaba": "आबा",
1385
+ "aba": "आबा",
1386
+ "saheb": "साहेब",
1387
+ "sahab": "साहेब",
1388
+ "sheth": "शेठ",
1389
+ "seth": "शेठ",
1390
+ "shethji": "शेठजी",
1391
+ "anna": "अण्णा",
1392
+ "appa": "आप्पा",
1393
+ "rao": "राव",
1394
+ "chaha": "चहा",
1395
+ "bhaji": "भाजी",
1396
+ "poha": "पोहे",
1397
+ "pohe": "पोहे",
1398
+ "khari": "खारी",
1399
+ "toast": "टोस्ट",
1400
+
1401
+ // Fast typing & plural slips (ending in s / ys)
1402
+ "bhais": "भाई",
1403
+ "bhaus": "भाऊ",
1404
+ "bhaiyyas": "भैय्या",
1405
+ "bhaiyas": "भैया",
1406
+ "bhayyas": "भय्या",
1407
+ "kakas": "काका",
1408
+ "kakis": "काकी",
1409
+ "mamas": "मामा",
1410
+ "mamis": "मामी",
1411
+ "dadas": "दादा",
1412
+ "nanas": "नाना",
1413
+ "nanis": "नानी",
1414
+ "tais": "ताई",
1415
+ "taais": "ताई",
1416
+ "didis": "दीदी",
1417
+ "sahebs": "साहेब",
1418
+ "sheths": "शेठ",
1419
+ "seths": "शेठ",
1420
+ "annas": "अण्णा",
1421
+ "appas": "आप्पा",
1422
+ "patils": "पाटील",
1423
+ "deshmukhs": "देशमुख",
1424
+ "pawars": "पवार",
1425
+ "shindes": "शिंदे",
1426
+ "jadhavs": "जाधव",
1427
+
1428
+ // Family & Kinship terms
1429
+ "taai": "ताई",
1430
+ "kaki": "काकी",
1431
+ "mami": "मामी",
1432
+ "nani": "नानी",
1433
+ "aaji": "आजी",
1434
+ "aji": "आजी",
1435
+ "aajoba": "आजोबा",
1436
+ "ajoba": "आजोबा",
1437
+ "mavshi": "मावशी",
1438
+ "maushi": "मावशी",
1439
+ "moushi": "मावशी",
1440
+ "vahini": "वहिनी",
1441
+ "wahini": "वहिनी",
1442
+ "bhavji": "भावजी",
1443
+ "bhaoji": "भावजी",
1444
+ "aatya": "आत्या",
1445
+ "atya": "आत्या",
1446
+ "sasre": "सासरे",
1447
+ "sasu": "सासू",
1448
+ "sasubai": "सासूबाई",
1449
+ "javai": "जावई",
1450
+ "dir": "दीर",
1451
+ "tatya": "तात्या",
1452
+ "tatyas": "तात्या",
1453
+ "pant": "पंत",
1454
+ "chota": "छोटा",
1455
+ "chhota": "छोटा",
1456
+ "motha": "मोठा",
1457
+
1458
+ // Titles, prefixes & respectful forms
1459
+ "sau": "सौ.",
1460
+ "smt": "श्रीमती",
1461
+ "shri": "श्री",
1462
+ "shree": "श्री",
1463
+ "chiranjiv": "चिरंजीव",
1464
+ "chi": "चि.",
1465
+ "kumari": "कुमारी",
1466
+ "ku": "कु.",
1467
+ "sir": "सर",
1468
+ "madam": "मॅडम",
1469
+ "sethji": "शेठजी",
1470
+ "bapuji": "बापूजी",
1471
+ "babuji": "बाबूजी",
1472
+
1473
+ // Compound -saheb names
1474
+ "bhausaheb": "भाऊसाहेब",
1475
+ "bhausahebs": "भाऊसाहेब",
1476
+ "dadasaheb": "दादासाहेब",
1477
+ "dadasahebs": "दादासाहेब",
1478
+ "kakasaheb": "काकासाहेब",
1479
+ "kakasahebs": "काकासाहेब",
1480
+ "mamasaheb": "मामासाहेब",
1481
+ "mamasahebs": "मामासाहेब",
1482
+ "nanasaheb": "नानासाहेब",
1483
+ "nanasahebs": "नानासाहेब",
1484
+ "appasaheb": "आप्पासाहेब",
1485
+ "appasahebs": "आप्पासाहेब",
1486
+ "annasaheb": "अण्णासाहेब",
1487
+ "annasahebs": "अण्णासाहेब",
1488
+ "babasaheb": "बाबासाहेब",
1489
+ "babasahebs": "बाबासाहेब",
1490
+ "balasaheb": "बाळासाहेब",
1491
+ "tatyasaheb": "तात्यासाहेब",
1492
+ "patilsaheb": "पाटीलसाहेब",
1493
+ "shethsaheb": "शेठसाहेब",
1494
+ "doctorsaheb": "डॉक्टरसाहेब",
1495
+
1496
+ // Compound -rao names
1497
+ "baburao": "बाबूराव",
1498
+ "anandrao": "आनंदराव",
1499
+ "anandarao": "आनंदराव",
1500
+ "shankarrao": "शंकरराव",
1501
+ "govindrao": "गोविंदराव",
1502
+ "ganpatrao": "गणपतराव",
1503
+ "subhashrao": "सुभाषराव",
1504
+ "madhavrao": "माधवराव",
1505
+ "yashwantrao": "यशवंतराव",
1506
+ "vilasrao": "विलासराव",
1507
+ "chandrakantrao": "चंद्रकांतराव",
1508
+ "ashokrao": "अशोकराव",
1509
+ "rameshrao": "रमेशराव",
1510
+ "sureshrao": "सुरेशराव",
1511
+ "diliprao": "दिलीपराव",
1512
+ "dadarao": "दादाराव",
1513
+ "patilrao": "पाटीलराव",
1514
+ "shinderao": "शिंदेराव",
1515
+ "deshmukhrao": "देशमुखराव",
1516
+
1517
+ // Common Maharashtra Surnames
1518
+ "patil": "पाटील",
1519
+ "deshmukh": "देशमुख",
1520
+ "pawar": "पवार",
1521
+ "shinde": "शिंदे",
1522
+ "jadhav": "जाधव",
1523
+ "jadhao": "जाधव",
1524
+ "more": "मोरे",
1525
+ "kadam": "कदम",
1526
+ "chavan": "चव्हाण",
1527
+ "gaikwad": "गायकवाड",
1528
+ "joshi": "जोशी",
1529
+ "kulkarni": "कुलकर्णी",
1530
+ "ghadge": "घाडगे",
1531
+ "bhosale": "भोसले",
1532
+ "bhosle": "भोसले",
1533
+ "raut": "राऊत",
1534
+ "kale": "काळे",
1535
+ "salunkhe": "साळुंखे",
1536
+ "thakur": "ठाकूर",
1537
+ "sawant": "सावंत",
1538
+ "mane": "माने",
1539
+ "shelke": "शेळके",
1540
+ "jagtap": "जगताप",
1541
+ "wagh": "वाघ",
1542
+ "shete": "शेटे",
1543
+ "khot": "खोत",
1544
+ "nikam": "निकम",
1545
+ "koli": "कोळी",
1546
+ "sonawane": "सोनवणे",
1547
+ "tamboli": "तांबोळी",
1548
+ "magar": "मगर",
1549
+ "ghorpade": "घोरपडे",
1550
+ "darekar": "दरेकर",
1551
+ "gavande": "गवंडे",
1552
+ "gawande": "गवंडे",
1553
+ "katore": "कटोरे",
1554
+ "borade": "बोराडे",
1555
+ "ghule": "घुले",
1556
+ "landge": "लांडगे",
1557
+ "khule": "खुळे",
1558
+ "bidkar": "बीडकर",
1559
+ "sharma": "शर्मा",
1560
+ "verma": "वर्मा",
1561
+ "gupta": "गुप्ता",
1562
+ "shah": "शाह",
1563
+ "jain": "जैन",
1564
+ "agarwal": "अगरवाल",
1565
+ "singh": "सिंग",
1566
+
1567
+ // Common Given Names
1568
+ "sachin": "सचिन",
1569
+ "rahul": "राहुल",
1570
+ "amit": "अमित",
1571
+ "amol": "अमोल",
1572
+ "atul": "अतुल",
1573
+ "ajay": "अजय",
1574
+ "vijay": "विजय",
1575
+ "sanjay": "संजय",
1576
+ "sunil": "सुनील",
1577
+ "anil": "अनिल",
1578
+ "ramesh": "रमेश",
1579
+ "suresh": "सुरेश",
1580
+ "ganesh": "गणेश",
1581
+ "mahesh": "महेश",
1582
+ "dinesh": "दिनेश",
1583
+ "santosh": "संतोष",
1584
+ "vikas": "विकास",
1585
+ "prakash": "प्रकाश",
1586
+ "pradeep": "प्रदीप",
1587
+ "pradip": "प्रदीप",
1588
+ "sandip": "संदीप",
1589
+ "sandeep": "संदीप",
1590
+ "deepak": "दीपक",
1591
+ "dipak": "दीपक",
1592
+ "rohit": "रोहित",
1593
+ "nitin": "नितीन",
1594
+ "kiran": "किरण",
1595
+ "ashok": "अशोक",
1596
+ "swapnil": "स्वप्निल",
1597
+ "mangesh": "मंगेश",
1598
+ "yogesh": "योगेश",
1599
+ "nilesh": "निलेश",
1600
+ "pravin": "प्रवीण",
1601
+ "prashant": "प्रशांत",
1602
+ "sudhir": "सुधीर",
1603
+ "subhash": "सुभाष",
1604
+ "bhagwan": "भगवान",
1605
+ "vishnu": "विष्णू",
1606
+ "pandurang": "पांडुरंग",
1607
+ "tukaram": "तुकाराम",
1608
+ "dnyaneshwar": "ज्ञानेश्वर",
1609
+ "namdev": "नामदेव",
1610
+ "eknath": "एकनाथ",
1611
+ "maruti": "मारुती",
1612
+ "mahadev": "महादेव",
1613
+ "khandu": "खंडू",
1614
+ "chhabu": "छाबू",
1615
+
1616
+ // Dairy & Grocery Staples
1617
+ "doodh": "दूध",
1618
+ "dudh": "दूध",
1619
+ "toop": "तूप",
1620
+ "tup": "तूप",
1621
+ "taak": "ताक",
1622
+ "tak": "ताक",
1623
+ "dahi": "दही",
1624
+ "lonche": "लोणचे",
1625
+ "loncha": "लोणचे",
1626
+ "papad": "पापड",
1627
+ "kurdaya": "कुरडया",
1628
+ "kurdai": "कुरडई",
1629
+ "sandge": "सांडगे",
1630
+ "shev": "शेव",
1631
+ "farsan": "फरसाण",
1632
+ "chivda": "चिवडा",
1633
+ "ladu": "लाडू",
1634
+ "ladoo": "लाडू",
1635
+ "pedha": "पेढा",
1636
+ "peda": "पेढा",
1637
+ "barfi": "बर्फी",
1638
+ "jalebi": "जिलेबी",
1639
+ "gulabjamun": "गुलाबजाम",
1640
+ "biscuit": "बिस्कीट",
1364
1641
  };
1642
+
package/src/index.js CHANGED
@@ -53,6 +53,37 @@ export function transliterateWord(word) {
53
53
  return MARATHI_DICTIONARY[clean];
54
54
  }
55
55
 
56
+ // 1b. Check trailing "s" fast-typing slip (e.g. bhais -> भाई, bhaus -> भाऊ, kakas -> काका)
57
+ if (clean.endsWith("s") && clean.length > 2) {
58
+ const base = clean.replace(/s+$/, "");
59
+ if (MARATHI_DICTIONARY[base]) {
60
+ return MARATHI_DICTIONARY[base];
61
+ }
62
+ }
63
+
64
+ // 1c. Check compound honorific suffixes (-saheb, -sahab, -rao, -sheth, -seth, -ji, -bai)
65
+ if (clean.endsWith("saheb") && clean.length > 5) {
66
+ return transliterateWord(clean.slice(0, -5)) + "साहेब";
67
+ }
68
+ if (clean.endsWith("sahab") && clean.length > 5) {
69
+ return transliterateWord(clean.slice(0, -5)) + "साहेब";
70
+ }
71
+ if (clean.endsWith("rao") && clean.length > 3) {
72
+ return transliterateWord(clean.slice(0, -3)) + "राव";
73
+ }
74
+ if (clean.endsWith("sheth") && clean.length > 5) {
75
+ return transliterateWord(clean.slice(0, -5)) + "शेठ";
76
+ }
77
+ if (clean.endsWith("seth") && clean.length > 4) {
78
+ return transliterateWord(clean.slice(0, -4)) + "शेठ";
79
+ }
80
+ if (clean.endsWith("ji") && clean.length > 3) {
81
+ return transliterateWord(clean.slice(0, -2)) + "जी";
82
+ }
83
+ if (clean.endsWith("bai") && clean.length > 4) {
84
+ return transliterateWord(clean.slice(0, -3)) + "बाई";
85
+ }
86
+
56
87
  // 2. Check local/memory cache
57
88
  const cached = getCachedWord(clean);
58
89
  if (cached && cached.length > 0) {
@@ -100,6 +131,12 @@ export const toDevanagari = transliterate;
100
131
  * @param {boolean} [options.includeOriginal=true]
101
132
  * @returns {string[]}
102
133
  */
134
+ function transiterateCompound(prefix, suffix) {
135
+ if (!prefix) return suffix;
136
+ const p = MARATHI_DICTIONARY[prefix] || phoneticTransliterateWord(prefix);
137
+ return p + suffix;
138
+ }
139
+
103
140
  export function getSuggestions(word, options = {}) {
104
141
  if (!word || !word.trim()) return [];
105
142
  const clean = word.toLowerCase().trim();
@@ -268,6 +305,33 @@ export function getSuggestions(word, options = {}) {
268
305
  if (withKanaAnusvar.endsWith("ी")) add(withKanaAnusvar.slice(0, -1) + "ि");
269
306
  }
270
307
  }
308
+
309
+ // 4q. Customer honorifics & bhai/bhau expansions
310
+ if (clean.startsWith("bhai") || clean.startsWith("bhay")) {
311
+ add("भैय्या");
312
+ add("भैया");
313
+ add("भय्या");
314
+ add("भाई");
315
+ }
316
+ if (clean.startsWith("bhau")) {
317
+ add("भाऊ");
318
+ }
319
+ if (clean.endsWith("s") && clean.length > 2) {
320
+ const base = clean.replace(/s+$/, "");
321
+ if (MARATHI_DICTIONARY[base]) {
322
+ add(MARATHI_DICTIONARY[base]);
323
+ }
324
+ }
325
+ if (clean.endsWith("saheb") && clean.length > 5) {
326
+ add(transiterateCompound(clean.slice(0, -5), "साहेब"));
327
+ }
328
+ if (clean.endsWith("rao") && clean.length > 3) {
329
+ add(transiterateCompound(clean.slice(0, -3), "राव"));
330
+ }
331
+ if (clean.endsWith("sheth") && clean.length > 5) {
332
+ add(transiterateCompound(clean.slice(0, -5), "शेठ"));
333
+ }
334
+
271
335
  }
272
336
 
273
337
  // Background fetch to enrich cache if online (non-blocking)
package/src/phonetics.js CHANGED
@@ -63,7 +63,12 @@ const CONSONANTS = [
63
63
 
64
64
  const INDEPENDENT_VOWELS = [
65
65
  { en: "aa", mr: "आ" },
66
- { en: "A", mr: "आ" },
66
+ { en: "A", mr: "आ", caseSensitive: true },
67
+ { en: "ai", mr: "ऐ" },
68
+ { en: "ay", mr: "ऐ" },
69
+ { en: "au", mr: "औ" },
70
+ { en: "ou", mr: "औ" },
71
+ { en: "ow", mr: "औ" },
67
72
  { en: "a", mr: "अ" },
68
73
  { en: "ee", mr: "ई" },
69
74
  { en: "ii", mr: "ई" },
@@ -71,11 +76,6 @@ const INDEPENDENT_VOWELS = [
71
76
  { en: "oo", mr: "ऊ" },
72
77
  { en: "uu", mr: "ऊ" },
73
78
  { en: "u", mr: "उ" },
74
- { en: "ai", mr: "ऐ" },
75
- { en: "ay", mr: "ऐ" },
76
- { en: "au", mr: "औ" },
77
- { en: "ou", mr: "औ" },
78
- { en: "ow", mr: "औ" },
79
79
  { en: "e", mr: "ए" },
80
80
  { en: "o", mr: "ओ" },
81
81
  { en: "am", mr: "अं" },
@@ -86,8 +86,14 @@ const INDEPENDENT_VOWELS = [
86
86
  ];
87
87
 
88
88
  const MATRAS = [
89
+ { en: "ao", mr: "ाव" },
89
90
  { en: "aa", mr: "ा" },
90
- { en: "A", mr: "ा" },
91
+ { en: "A", mr: "ा", caseSensitive: true },
92
+ { en: "ai", mr: "ै" },
93
+ { en: "ay", mr: "ै" },
94
+ { en: "au", mr: "ौ" },
95
+ { en: "ou", mr: "ौ" },
96
+ { en: "ow", mr: "ौ" },
91
97
  { en: "a", mr: "" }, // Inherent vowel: cancels halant; at word end becomes kana
92
98
  { en: "ee", mr: "ी" },
93
99
  { en: "ii", mr: "ी" },
@@ -95,11 +101,6 @@ const MATRAS = [
95
101
  { en: "oo", mr: "ू" },
96
102
  { en: "uu", mr: "ू" },
97
103
  { en: "u", mr: "ु" },
98
- { en: "ai", mr: "ै" },
99
- { en: "ay", mr: "ै" },
100
- { en: "au", mr: "ौ" },
101
- { en: "ou", mr: "ौ" },
102
- { en: "ow", mr: "ौ" },
103
104
  { en: "e", mr: "े" },
104
105
  { en: "o", mr: "ो" },
105
106
  { en: "am", mr: "ं" },
@@ -153,6 +154,10 @@ export function phoneticTransliterateWord(text) {
153
154
  res += "ऊ";
154
155
  i += 1;
155
156
  matchedVowel = true;
157
+ } else if (clean[i].toLowerCase() === "o" && prevChar.toLowerCase() === "a") {
158
+ res += "व";
159
+ i += 1;
160
+ matchedVowel = true;
156
161
  } else if (clean[i].toLowerCase() === "a") {
157
162
  i += 1;
158
163
  matchedVowel = true;