marathi-transliterate 1.6.0 → 1.7.2

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.2",
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
@@ -1351,14 +1351,380 @@ export const MARATHI_DICTIONARY = {
1351
1351
  "board": "बोर्ड",
1352
1352
  "extensionboard": "एक्स्टेंशन बोर्ड",
1353
1353
 
1354
- // Common Marathi vocabulary & items
1354
+ // Common Marathi vocabulary & items - Shanti & Shant Family
1355
1355
  "shanti": "शांती",
1356
1356
  "shaanti": "शांती",
1357
1357
  "shantee": "शांती",
1358
+ "shanta": "शांता",
1359
+ "shaanta": "शांता",
1360
+ "shantata": "शांतता",
1361
+ "shaantata": "शांतता",
1362
+ "shantanu": "शांतनु",
1363
+ "shantiniketan": "शांतीनिकेतन",
1364
+ "sushant": "सुशांत",
1365
+ "nishant": "निशांत",
1366
+ "ashant": "अशांत",
1367
+ "ashanti": "अशांती",
1368
+
1369
+ // Similar Kana + Anusvara (ां) words (-anti, -andhi, -andi, -ande)
1358
1370
  "kanti": "कांती",
1371
+ "kaanti": "कांती",
1372
+ "bhranti": "भ्रांती",
1373
+ "danti": "दांती",
1374
+ "chandi": "चांदी",
1375
+ "chaandi": "चांदी",
1376
+ "gandhi": "गांधी",
1377
+ "gaandhi": "गांधी",
1378
+ "bhande": "भांडे",
1379
+ "bhandi": "भांडी",
1380
+ "bhandya": "भांडी",
1381
+ "bhandeghasni": "भांडेघासणी",
1382
+ "tanda": "तांडा",
1383
+ "taanda": "तांडा",
1384
+ "sandhi": "संधी",
1385
+ "sandhya": "संध्या",
1386
+ "jayanti": "जयंती",
1387
+ "damayanti": "दमयंती",
1388
+ "vasanti": "वसंती",
1389
+ "shrimanti": "श्रीमंती",
1390
+ "dhanwantari": "धन्वंतरी",
1391
+ "dhanvantari": "धन्वंतरी",
1392
+
1393
+ // Marathi Shuddhalekhan Dirgha End-Vowel words (-ti / -ti virtues, names & grocery staples)
1394
+ "shakti": "शक्ती",
1395
+ "shaakti": "शक्ती",
1396
+ "bhakti": "भक्ती",
1397
+ "bhaakti": "भक्ती",
1398
+ "mukti": "मुक्ती",
1399
+ "yukti": "युक्ती",
1400
+ "vyakti": "व्यक्ती",
1401
+ "priti": "प्रीती",
1402
+ "preeti": "प्रीती",
1403
+ "kirti": "कीर्ती",
1404
+ "keerti": "कीर्ती",
1405
+ "niti": "नीती",
1406
+ "neeti": "नीती",
1407
+ "riti": "रीती",
1408
+ "reeti": "रीती",
1409
+ "smruti": "स्मृती",
1410
+ "smriti": "स्मृती",
1411
+ "jyoti": "ज्योती",
1412
+ "aarti": "आरती",
1413
+ "arati": "आरती",
1414
+ "murti": "मूर्ती",
1415
+ "moorti": "मूर्ती",
1416
+ "sphurti": "स्फूर्ती",
1417
+ "pankti": "पंक्ती",
1418
+ "sampatti": "संपत्ती",
1419
+ "vibhuti": "विभूती",
1420
+ "vibhooti": "विभूती",
1421
+ "khyati": "ख्याती",
1422
+ "jati": "जाती",
1423
+ "nati": "नाती",
1424
+ "mati": "मती",
1425
+ "sthiti": "स्थिती",
1426
+ "utpatti": "उत्पत्ती",
1427
+ "prakruti": "प्रकृती",
1428
+ "prakriti": "प्रकृती",
1429
+ "sanskruti": "संस्कृती",
1430
+ "sanskriti": "संस्कृती",
1431
+ "vikruti": "विकृती",
1432
+ "vikriti": "विकृती",
1433
+ "jagruti": "जागृती",
1434
+ "jagriti": "जागृती",
1435
+ "trupti": "तृप्ती",
1436
+ "dipti": "दीप्ती",
1437
+ "deepti": "दीप्ती",
1438
+ "dharti": "धरती",
1439
+ "dharati": "धरती",
1440
+ "bhumi": "भूमी",
1441
+ "bhoomi": "भूमी",
1442
+ "srushti": "सृष्टी",
1443
+ "shrushti": "सृष्टी",
1444
+ "drishti": "दृष्टी",
1445
+ "drushti": "दृष्टी",
1446
+
1359
1447
  "vati": "वाटी",
1360
1448
  "vatya": "वाट्या",
1361
1449
  "watti": "वाटी",
1362
- "wattya": "वाट्या"
1450
+ "wattya": "वाट्या",
1451
+
1452
+ // Anand & names
1453
+ "anand": "आनंद",
1454
+ "aanand": "आनंद",
1455
+
1456
+ // Common customer honorifics, titles, relations and grocery staples
1457
+ "bhaiyya": "भैय्या",
1458
+ "bhaiya": "भैया",
1459
+ "bhayya": "भय्या",
1460
+ "bhaiyys": "भैय्या",
1461
+ "bhaiyas": "भैया",
1462
+ "bhai": "भाई",
1463
+ "bhau": "भाऊ",
1464
+ "mama": "मामा",
1465
+ "kaka": "काका",
1466
+ "nana": "नाना",
1467
+ "bapu": "बापू",
1468
+ "babu": "बाबू",
1469
+ "tai": "ताई",
1470
+ "aai": "आई",
1471
+ "didi": "दीदी",
1472
+ "aaba": "आबा",
1473
+ "aba": "आबा",
1474
+ "saheb": "साहेब",
1475
+ "sahab": "साहेब",
1476
+ "sheth": "शेठ",
1477
+ "seth": "शेठ",
1478
+ "shethji": "शेठजी",
1479
+ "anna": "अण्णा",
1480
+ "appa": "आप्पा",
1481
+ "rao": "राव",
1482
+ "chaha": "चहा",
1483
+ "bhaji": "भाजी",
1484
+ "poha": "पोहे",
1485
+ "pohe": "पोहे",
1486
+ "khari": "खारी",
1487
+ "toast": "टोस्ट",
1488
+
1489
+ // Fast typing & plural slips (ending in s / ys)
1490
+ "bhais": "भाई",
1491
+ "bhaus": "भाऊ",
1492
+ "bhaiyyas": "भैय्या",
1493
+ "bhaiyas": "भैया",
1494
+ "bhayyas": "भय्या",
1495
+ "kakas": "काका",
1496
+ "kakis": "काकी",
1497
+ "mamas": "मामा",
1498
+ "mamis": "मामी",
1499
+ "dadas": "दादा",
1500
+ "nanas": "नाना",
1501
+ "nanis": "नानी",
1502
+ "tais": "ताई",
1503
+ "taais": "ताई",
1504
+ "didis": "दीदी",
1505
+ "sahebs": "साहेब",
1506
+ "sheths": "शेठ",
1507
+ "seths": "शेठ",
1508
+ "annas": "अण्णा",
1509
+ "appas": "आप्पा",
1510
+ "patils": "पाटील",
1511
+ "deshmukhs": "देशमुख",
1512
+ "pawars": "पवार",
1513
+ "shindes": "शिंदे",
1514
+ "jadhavs": "जाधव",
1515
+
1516
+ // Family & Kinship terms
1517
+ "taai": "ताई",
1518
+ "kaki": "काकी",
1519
+ "mami": "मामी",
1520
+ "nani": "नानी",
1521
+ "aaji": "आजी",
1522
+ "aji": "आजी",
1523
+ "aajoba": "आजोबा",
1524
+ "ajoba": "आजोबा",
1525
+ "mavshi": "मावशी",
1526
+ "maushi": "मावशी",
1527
+ "moushi": "मावशी",
1528
+ "vahini": "वहिनी",
1529
+ "wahini": "वहिनी",
1530
+ "bhavji": "भावजी",
1531
+ "bhaoji": "भावजी",
1532
+ "aatya": "आत्या",
1533
+ "atya": "आत्या",
1534
+ "sasre": "सासरे",
1535
+ "sasu": "सासू",
1536
+ "sasubai": "सासूबाई",
1537
+ "javai": "जावई",
1538
+ "dir": "दीर",
1539
+ "tatya": "तात्या",
1540
+ "tatyas": "तात्या",
1541
+ "pant": "पंत",
1542
+ "chota": "छोटा",
1543
+ "chhota": "छोटा",
1544
+ "motha": "मोठा",
1545
+
1546
+ // Titles, prefixes & respectful forms
1547
+ "sau": "सौ.",
1548
+ "smt": "श्रीमती",
1549
+ "shri": "श्री",
1550
+ "shree": "श्री",
1551
+ "chiranjiv": "चिरंजीव",
1552
+ "chi": "चि.",
1553
+ "kumari": "कुमारी",
1554
+ "ku": "कु.",
1555
+ "sir": "सर",
1556
+ "madam": "मॅडम",
1557
+ "sethji": "शेठजी",
1558
+ "bapuji": "बापूजी",
1559
+ "babuji": "बाबूजी",
1560
+
1561
+ // Compound -saheb names
1562
+ "bhausaheb": "भाऊसाहेब",
1563
+ "bhausahebs": "भाऊसाहेब",
1564
+ "dadasaheb": "दादासाहेब",
1565
+ "dadasahebs": "दादासाहेब",
1566
+ "kakasaheb": "काकासाहेब",
1567
+ "kakasahebs": "काकासाहेब",
1568
+ "mamasaheb": "मामासाहेब",
1569
+ "mamasahebs": "मामासाहेब",
1570
+ "nanasaheb": "नानासाहेब",
1571
+ "nanasahebs": "नानासाहेब",
1572
+ "appasaheb": "आप्पासाहेब",
1573
+ "appasahebs": "आप्पासाहेब",
1574
+ "annasaheb": "अण्णासाहेब",
1575
+ "annasahebs": "अण्णासाहेब",
1576
+ "babasaheb": "बाबासाहेब",
1577
+ "babasahebs": "बाबासाहेब",
1578
+ "balasaheb": "बाळासाहेब",
1579
+ "tatyasaheb": "तात्यासाहेब",
1580
+ "patilsaheb": "पाटीलसाहेब",
1581
+ "shethsaheb": "शेठसाहेब",
1582
+ "doctorsaheb": "डॉक्टरसाहेब",
1583
+
1584
+ // Compound -rao names
1585
+ "baburao": "बाबूराव",
1586
+ "anandrao": "आनंदराव",
1587
+ "anandarao": "आनंदराव",
1588
+ "shankarrao": "शंकरराव",
1589
+ "govindrao": "गोविंदराव",
1590
+ "ganpatrao": "गणपतराव",
1591
+ "subhashrao": "सुभाषराव",
1592
+ "madhavrao": "माधवराव",
1593
+ "yashwantrao": "यशवंतराव",
1594
+ "vilasrao": "विलासराव",
1595
+ "chandrakantrao": "चंद्रकांतराव",
1596
+ "ashokrao": "अशोकराव",
1597
+ "rameshrao": "रमेशराव",
1598
+ "sureshrao": "सुरेशराव",
1599
+ "diliprao": "दिलीपराव",
1600
+ "dadarao": "दादाराव",
1601
+ "patilrao": "पाटीलराव",
1602
+ "shinderao": "शिंदेराव",
1603
+ "deshmukhrao": "देशमुखराव",
1363
1604
 
1605
+ // Common Maharashtra Surnames
1606
+ "patil": "पाटील",
1607
+ "deshmukh": "देशमुख",
1608
+ "pawar": "पवार",
1609
+ "shinde": "शिंदे",
1610
+ "jadhav": "जाधव",
1611
+ "jadhao": "जाधव",
1612
+ "more": "मोरे",
1613
+ "kadam": "कदम",
1614
+ "chavan": "चव्हाण",
1615
+ "gaikwad": "गायकवाड",
1616
+ "joshi": "जोशी",
1617
+ "kulkarni": "कुलकर्णी",
1618
+ "ghadge": "घाडगे",
1619
+ "bhosale": "भोसले",
1620
+ "bhosle": "भोसले",
1621
+ "raut": "राऊत",
1622
+ "kale": "काळे",
1623
+ "salunkhe": "साळुंखे",
1624
+ "thakur": "ठाकूर",
1625
+ "sawant": "सावंत",
1626
+ "mane": "माने",
1627
+ "shelke": "शेळके",
1628
+ "jagtap": "जगताप",
1629
+ "wagh": "वाघ",
1630
+ "shete": "शेटे",
1631
+ "khot": "खोत",
1632
+ "nikam": "निकम",
1633
+ "koli": "कोळी",
1634
+ "sonawane": "सोनवणे",
1635
+ "tamboli": "तांबोळी",
1636
+ "magar": "मगर",
1637
+ "ghorpade": "घोरपडे",
1638
+ "darekar": "दरेकर",
1639
+ "gavande": "गवंडे",
1640
+ "gawande": "गवंडे",
1641
+ "katore": "कटोरे",
1642
+ "borade": "बोराडे",
1643
+ "ghule": "घुले",
1644
+ "landge": "लांडगे",
1645
+ "khule": "खुळे",
1646
+ "bidkar": "बीडकर",
1647
+ "sharma": "शर्मा",
1648
+ "verma": "वर्मा",
1649
+ "gupta": "गुप्ता",
1650
+ "shah": "शाह",
1651
+ "jain": "जैन",
1652
+ "agarwal": "अगरवाल",
1653
+ "singh": "सिंग",
1654
+
1655
+ // Common Given Names
1656
+ "sachin": "सचिन",
1657
+ "rahul": "राहुल",
1658
+ "amit": "अमित",
1659
+ "amol": "अमोल",
1660
+ "atul": "अतुल",
1661
+ "ajay": "अजय",
1662
+ "vijay": "विजय",
1663
+ "sanjay": "संजय",
1664
+ "sunil": "सुनील",
1665
+ "anil": "अनिल",
1666
+ "ramesh": "रमेश",
1667
+ "suresh": "सुरेश",
1668
+ "ganesh": "गणेश",
1669
+ "mahesh": "महेश",
1670
+ "dinesh": "दिनेश",
1671
+ "santosh": "संतोष",
1672
+ "vikas": "विकास",
1673
+ "prakash": "प्रकाश",
1674
+ "pradeep": "प्रदीप",
1675
+ "pradip": "प्रदीप",
1676
+ "sandip": "संदीप",
1677
+ "sandeep": "संदीप",
1678
+ "deepak": "दीपक",
1679
+ "dipak": "दीपक",
1680
+ "rohit": "रोहित",
1681
+ "nitin": "नितीन",
1682
+ "kiran": "किरण",
1683
+ "ashok": "अशोक",
1684
+ "swapnil": "स्वप्निल",
1685
+ "mangesh": "मंगेश",
1686
+ "yogesh": "योगेश",
1687
+ "nilesh": "निलेश",
1688
+ "pravin": "प्रवीण",
1689
+ "prashant": "प्रशांत",
1690
+ "sudhir": "सुधीर",
1691
+ "subhash": "सुभाष",
1692
+ "bhagwan": "भगवान",
1693
+ "vishnu": "विष्णू",
1694
+ "pandurang": "पांडुरंग",
1695
+ "tukaram": "तुकाराम",
1696
+ "dnyaneshwar": "ज्ञानेश्वर",
1697
+ "namdev": "नामदेव",
1698
+ "eknath": "एकनाथ",
1699
+ "maruti": "मारुती",
1700
+ "mahadev": "महादेव",
1701
+ "khandu": "खंडू",
1702
+ "chhabu": "छाबू",
1703
+
1704
+ // Dairy & Grocery Staples
1705
+ "doodh": "दूध",
1706
+ "dudh": "दूध",
1707
+ "toop": "तूप",
1708
+ "tup": "तूप",
1709
+ "taak": "ताक",
1710
+ "tak": "ताक",
1711
+ "dahi": "दही",
1712
+ "lonche": "लोणचे",
1713
+ "loncha": "लोणचे",
1714
+ "papad": "पापड",
1715
+ "kurdaya": "कुरडया",
1716
+ "kurdai": "कुरडई",
1717
+ "sandge": "सांडगे",
1718
+ "shev": "शेव",
1719
+ "farsan": "फरसाण",
1720
+ "chivda": "चिवडा",
1721
+ "ladu": "लाडू",
1722
+ "ladoo": "लाडू",
1723
+ "pedha": "पेढा",
1724
+ "peda": "पेढा",
1725
+ "barfi": "बर्फी",
1726
+ "jalebi": "जिलेबी",
1727
+ "gulabjamun": "गुलाबजाम",
1728
+ "biscuit": "बिस्कीट",
1364
1729
  };
1730
+
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;