urdu-text-utils 0.2.0 → 0.2.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/dist/index.js CHANGED
@@ -13,60 +13,74 @@ var ASCII_DIGITS = "0123456789";
13
13
  var ANY_DIGIT_RE_G = new RegExp(`[${ASCII_DIGITS}${URDU_DIGITS}${ARABIC_INDIC_DIGITS}]`, "gu");
14
14
  var SENTENCE_SPLIT_RE = /[۔؟?!.…]+/u;
15
15
  var WORD_SPLIT_RE = /[\s،؛؟۔٫٬…!-\/:-@\[-`{-~‐-‧«»‘’“”]+/u;
16
+ var URDU_LETTERS = [
17
+ { ch: "\u0627", roman: "a", vowel: true, aliases: ["\u0623", "\u0625", "\u0671", "\u0672", "\u0673"] },
18
+ // alef + hamza/wasla forms
19
+ { ch: "\u0622", roman: "aa", vowel: true },
20
+ // alef madda — a real Urdu letter
21
+ { ch: "\u0628", roman: "b" },
22
+ { ch: "\u067E", roman: "p" },
23
+ { ch: "\u062A", roman: "t" },
24
+ { ch: "\u0679", roman: "t" },
25
+ { ch: "\u062B", roman: "s" },
26
+ { ch: "\u062C", roman: "j" },
27
+ { ch: "\u0686", roman: "ch" },
28
+ { ch: "\u062D", roman: "h" },
29
+ { ch: "\u062E", roman: "kh" },
30
+ { ch: "\u062F", roman: "d" },
31
+ { ch: "\u0688", roman: "d" },
32
+ { ch: "\u0630", roman: "z" },
33
+ { ch: "\u0631", roman: "r" },
34
+ { ch: "\u0691", roman: "r" },
35
+ { ch: "\u0632", roman: "z" },
36
+ { ch: "\u0698", roman: "zh" },
37
+ { ch: "\u0633", roman: "s" },
38
+ { ch: "\u0634", roman: "sh" },
39
+ { ch: "\u0635", roman: "s" },
40
+ { ch: "\u0636", roman: "z" },
41
+ { ch: "\u0637", roman: "t" },
42
+ { ch: "\u0638", roman: "z" },
43
+ { ch: "\u0639", roman: "a", vowel: true },
44
+ { ch: "\u063A", roman: "gh" },
45
+ { ch: "\u0641", roman: "f" },
46
+ { ch: "\u0642", roman: "q" },
47
+ { ch: "\u06A9", roman: "k", aliases: ["\u0643", "\u06AA"] },
48
+ // arabic kaf, swash kaf
49
+ { ch: "\u06AF", roman: "g" },
50
+ { ch: "\u0644", roman: "l" },
51
+ { ch: "\u0645", roman: "m" },
52
+ { ch: "\u0646", roman: "n" },
53
+ { ch: "\u06BA", roman: "n" },
54
+ // noon ghunna
55
+ { ch: "\u0648", roman: "o", vowel: true, aliases: ["\u06CB", "\u06C6", "\u06C7"] },
56
+ // ve, oe, u
57
+ { ch: "\u0624", roman: "o", vowel: true, variantOf: "\u0648" },
58
+ // waw with hamza — kept, hamza is meaningful
59
+ { ch: "\u06C1", roman: "h", aliases: ["\u0647", "\u06C0", "\u0629", "\u06C3", "\u06D5"] },
60
+ // arabic heh, heh-yeh-above, teh marbuta, ae
61
+ { ch: "\u06C2", roman: "h", vowel: true, variantOf: "\u06C1" },
62
+ // heh goal with hamza above
63
+ { ch: "\u06BE", roman: "h" },
64
+ // do-chashmi heh — distinct letter, aspirates the consonant before it
65
+ { ch: "\u0621", roman: "" },
66
+ // hamza
67
+ { ch: "\u06CC", roman: "i", vowel: true, aliases: ["\u064A", "\u0649", "\u06CD", "\u06D0", "\u0620"] },
68
+ // arabic yeh, alef maksura, yeh-with-tail, pashto e, kashmiri yeh
69
+ { ch: "\u0626", roman: "i", vowel: true, variantOf: "\u06CC" },
70
+ // yeh with hamza above
71
+ { ch: "\u06D2", roman: "e", vowel: true },
72
+ // bari ye — distinct letter
73
+ { ch: "\u06D3", roman: "e", vowel: true, variantOf: "\u06D2" }
74
+ // bari ye with hamza
75
+ ];
16
76
 
17
77
  // src/normalize.ts
18
- var URDU_YEH = "\u06CC";
19
- var URDU_KEHEH = "\u06A9";
20
- var URDU_HEH_GOAL = "\u06C1";
21
- var ALEF = "\u0627";
22
- var WAW = "\u0648";
23
- var LETTER_MAP = {
24
- // yeh family -> ی. Note ے (U+06D2 bari ye) is a distinct letter and is preserved.
25
- "\u064A": URDU_YEH,
26
- // ي arabic yeh
27
- "\u0649": URDU_YEH,
28
- // ى alef maksura
29
- "\u06CD": URDU_YEH,
30
- // ۍ yeh with tail
31
- "\u06D0": URDU_YEH,
32
- // ې pashto e
33
- "\u0620": URDU_YEH,
34
- // ؠ kashmiri yeh
35
- // kaf family -> ک
36
- "\u0643": URDU_KEHEH,
37
- // ك arabic kaf
38
- "\u06AA": URDU_KEHEH,
39
- // ڪ swash kaf
40
- // heh family -> ہ. ھ (U+06BE do-chashmi heh) is a distinct letter and is preserved.
41
- "\u0647": URDU_HEH_GOAL,
42
- // ه arabic heh
43
- "\u06C0": URDU_HEH_GOAL,
44
- // ۀ heh with yeh above
45
- "\u0629": URDU_HEH_GOAL,
46
- // ة teh marbuta
47
- "\u06C3": URDU_HEH_GOAL,
48
- // ۃ teh marbuta goal
49
- "\u06D5": URDU_HEH_GOAL,
50
- // ە ae
51
- // alef family -> ا. آ (U+0622 alef madda) is a real Urdu letter and is preserved.
52
- "\u0623": ALEF,
53
- // أ alef with hamza above
54
- "\u0625": ALEF,
55
- // إ alef with hamza below
56
- "\u0671": ALEF,
57
- // ٱ alef wasla
58
- "\u0672": ALEF,
59
- // ٲ alef with wavy hamza above
60
- "\u0673": ALEF,
61
- // ٳ alef with wavy hamza below
62
- // waw family -> و. ؤ (U+0624) is preserved: it carries hamza meaningfully in Urdu.
63
- "\u06CB": WAW,
64
- // ۋ ve
65
- "\u06C6": WAW,
66
- // ۆ oe
67
- "\u06C7": WAW
68
- // ۇ u
69
- };
78
+ var LETTER_MAP = {};
79
+ for (const { ch, aliases } of URDU_LETTERS) {
80
+ for (const alias of aliases ?? []) {
81
+ LETTER_MAP[alias] = ch;
82
+ }
83
+ }
70
84
  var digitTargets = {
71
85
  urdu: URDU_DIGITS,
72
86
  english: ASCII_DIGITS,
@@ -624,65 +638,15 @@ function removeStopWords(text, customStopWords) {
624
638
  }
625
639
 
626
640
  // src/collate.ts
627
- var ALPHABET = [
628
- "\u0627",
629
- "\u0622",
630
- "\u0628",
631
- "\u067E",
632
- "\u062A",
633
- "\u0679",
634
- "\u062B",
635
- "\u062C",
636
- "\u0686",
637
- "\u062D",
638
- "\u062E",
639
- "\u062F",
640
- "\u0688",
641
- "\u0630",
642
- "\u0631",
643
- "\u0691",
644
- "\u0632",
645
- "\u0698",
646
- "\u0633",
647
- "\u0634",
648
- "\u0635",
649
- "\u0636",
650
- "\u0637",
651
- "\u0638",
652
- "\u0639",
653
- "\u063A",
654
- "\u0641",
655
- "\u0642",
656
- "\u06A9",
657
- "\u06AF",
658
- "\u0644",
659
- "\u0645",
660
- "\u0646",
661
- "\u06BA",
662
- "\u0648",
663
- "\u06C1",
664
- "\u06BE",
665
- "\u0621",
666
- "\u06CC",
667
- "\u06D2"
668
- ];
669
- var VARIANTS = {
670
- "\u0624": ["\u0648", 1],
671
- // ؤ waw with hamza
672
- "\u0626": ["\u06CC", 1],
673
- // ئ yeh with hamza
674
- "\u06C2": ["\u06C1", 1],
675
- // ۂ heh goal with hamza
676
- "\u06D3": ["\u06D2", 1]
677
- // ۓ bari ye with hamza
678
- };
641
+ var PRIMARY_LETTERS = URDU_LETTERS.filter((letter) => letter.variantOf === void 0);
679
642
  var WEIGHTS = /* @__PURE__ */ new Map();
680
- ALPHABET.forEach((ch, index) => WEIGHTS.set(ch, [(index + 1) * 10, 0]));
681
- for (const [ch, [base, secondary]] of Object.entries(VARIANTS)) {
682
- const baseWeight = WEIGHTS.get(base);
683
- if (baseWeight) WEIGHTS.set(ch, [baseWeight[0], secondary]);
643
+ PRIMARY_LETTERS.forEach((letter, index) => WEIGHTS.set(letter.ch, [(index + 1) * 10, 0]));
644
+ for (const letter of URDU_LETTERS) {
645
+ if (letter.variantOf === void 0) continue;
646
+ const baseWeight = WEIGHTS.get(letter.variantOf);
647
+ if (baseWeight) WEIGHTS.set(letter.ch, [baseWeight[0], 1]);
684
648
  }
685
- var NON_LETTER_BASE = (ALPHABET.length + 1) * 10;
649
+ var NON_LETTER_BASE = (PRIMARY_LETTERS.length + 1) * 10;
686
650
  function weightsOf(text) {
687
651
  const out = [];
688
652
  for (const ch of text) {
@@ -852,7 +816,7 @@ var WORD_DICTIONARY = {
852
816
  "\u062C\u0646\u06C1\u0648\u06BA": "jinhon",
853
817
  "\u0627\u0646\u06C1\u0648\u06BA": "unhon",
854
818
  "\u0627\u067E\u0646\u0627": "apna",
855
- "\u0905\u092A\u0928\u0940": "apni",
819
+ "\u0627\u067E\u0646\u06CC": "apni",
856
820
  "\u0627\u067E\u0646\u06D2": "apnay",
857
821
  "\u062E\u0648\u062F": "khud",
858
822
  "\u06A9\u0648\u0646": "kaun",
@@ -3757,53 +3721,12 @@ var DIGRAPHS = {
3757
3721
  "\u0646\u06BE": "nh",
3758
3722
  "\u0631\u06BE": "rh"
3759
3723
  };
3760
- var LETTERS = {
3761
- "\u0627": "a",
3762
- "\u0622": "aa",
3763
- "\u0628": "b",
3764
- "\u067E": "p",
3765
- "\u062A": "t",
3766
- "\u0679": "t",
3767
- "\u062B": "s",
3768
- "\u062C": "j",
3769
- "\u0686": "ch",
3770
- "\u062D": "h",
3771
- "\u062E": "kh",
3772
- "\u062F": "d",
3773
- "\u0688": "d",
3774
- "\u0630": "z",
3775
- "\u0631": "r",
3776
- "\u0691": "r",
3777
- "\u0632": "z",
3778
- "\u0698": "zh",
3779
- "\u0633": "s",
3780
- "\u0634": "sh",
3781
- "\u0635": "s",
3782
- "\u0636": "z",
3783
- "\u0637": "t",
3784
- "\u0638": "z",
3785
- "\u0639": "a",
3786
- "\u063A": "gh",
3787
- "\u0641": "f",
3788
- "\u0642": "q",
3789
- "\u06A9": "k",
3790
- "\u06AF": "g",
3791
- "\u0644": "l",
3792
- "\u0645": "m",
3793
- "\u0646": "n",
3794
- "\u06BA": "n",
3795
- "\u0648": "o",
3796
- "\u06C1": "h",
3797
- "\u06BE": "h",
3798
- "\u0621": "",
3799
- "\u06CC": "i",
3800
- "\u0626": "i",
3801
- "\u06D2": "e",
3802
- "\u06D3": "e",
3803
- "\u0624": "o",
3804
- "\u06C2": "h"
3805
- };
3806
- var VOWEL_LETTERS = /* @__PURE__ */ new Set(["\u0627", "\u0622", "\u0648", "\u06CC", "\u06D2", "\u0624", "\u0626", "\u06D3", "\u06C2", "\u0639"]);
3724
+ var LETTERS = {};
3725
+ var VOWEL_LETTERS = /* @__PURE__ */ new Set();
3726
+ for (const { ch, roman, vowel } of URDU_LETTERS) {
3727
+ LETTERS[ch] = roman;
3728
+ if (vowel) VOWEL_LETTERS.add(ch);
3729
+ }
3807
3730
  function romanizeWord(word) {
3808
3731
  const dictionary = WORD_DICTIONARY[word];
3809
3732
  if (dictionary) return dictionary;
@@ -4392,6 +4315,401 @@ function stemUrduText(text, options = {}) {
4392
4315
  }).join("");
4393
4316
  }
4394
4317
 
4395
- export { URDU_MONTHS_GREGORIAN, URDU_MONTHS_HIJRI, URDU_PREFIXES, URDU_STOP_WORDS, URDU_SUFFIXES, URDU_WEEKDAYS, analyzeUrdu, compareUrdu, convertNumbers, countSentences, countWords, editDistance, filterStopWords, foldUrdu, formatUrduDate, getAffixes, getUrduMonthName, getUrduWeekdayName, hasUrduSpecificLetters, highlightUrdu, isStopWord, isUrdu, normalizeUrdu, numberToUrduWords, parseUrduNumber, removeDiacritics, removeStopWords, romanToUrdu, romanize, searchUrdu, searchUrduRanked, sortUrdu, splitSentences, splitWords, stemUrdu, stemUrduText, timeAgoUrdu, toArabicIndicDigits, toEnglishDigits, toUrduDigits, urduRatio, urduSlug };
4318
+ // src/names.ts
4319
+ var URDU_FIRST_NAMES = {
4320
+ // Male names
4321
+ "\u0645\u062D\u0645\u062F": "Muhammad",
4322
+ "\u0627\u062D\u0645\u062F": "Ahmed",
4323
+ "\u0639\u0644\u06CC": "Ali",
4324
+ "\u0639\u0645\u0631": "Umar",
4325
+ "\u0639\u062B\u0645\u0627\u0646": "Usman",
4326
+ "\u0627\u0628\u0648\u0628\u06A9\u0631": "Abubakar",
4327
+ "\u06CC\u0648\u0633\u0641": "Yusuf",
4328
+ "\u06CC\u0639\u0642\u0648\u0628": "Yaquob",
4329
+ "\u0627\u0633\u0645\u0627\u0639\u06CC\u0644": "Ismail",
4330
+ "\u0627\u0628\u0631\u0627\u06C1\u06CC\u0645": "Ibrahim",
4331
+ "\u0627\u0633\u062D\u0627\u0642": "Ishaq",
4332
+ "\u062D\u0633\u06CC\u0646": "Hussain",
4333
+ "\u062D\u0633\u0646": "Hasan",
4334
+ "\u0632\u06CC\u062F": "Zaid",
4335
+ "\u062D\u0645\u0632\u06C1": "Hamza",
4336
+ "\u0633\u0644\u0645\u0627\u0646": "Salman",
4337
+ "\u0641\u0631\u062D\u0627\u0646": "Farhan",
4338
+ "\u0627\u062F\u0646\u0627\u0646": "Adnan",
4339
+ "\u0628\u0644\u0627\u0644": "Bilal",
4340
+ "\u0637\u0627\u0631\u0642": "Tariq",
4341
+ "\u062C\u0627\u0648\u06CC\u062F": "Javed",
4342
+ "\u0639\u0631\u0641\u0627\u0646": "Irfan",
4343
+ "\u06A9\u0627\u0634\u0641": "Kashif",
4344
+ "\u0646\u062F\u06CC\u0645": "Nadeem",
4345
+ "\u06CC\u0627\u0633\u0631": "Yasir",
4346
+ "\u0631\u0636\u0648\u0627\u0646": "Rizwan",
4347
+ "\u0641\u06CC\u0635\u0644": "Faisal",
4348
+ "\u062E\u0627\u0644\u062F": "Khalid",
4349
+ "\u0631\u0627\u0634\u062F": "Rashid",
4350
+ "\u0634\u0627\u06C1\u062F": "Shahid",
4351
+ "\u0633\u0639\u06CC\u062F": "Saeed",
4352
+ "\u0646\u0639\u06CC\u0645": "Naeem",
4353
+ "\u0648\u0633\u06CC\u0645": "Waseem",
4354
+ "\u0631\u0641\u06CC\u0642": "Rafiq",
4355
+ "\u062C\u0645\u06CC\u0644": "Jamil",
4356
+ "\u0632\u0628\u06CC\u0631": "Zubair",
4357
+ "\u0637\u0627\u06C1\u0631": "Tahir",
4358
+ "\u0639\u0627\u0631\u0641": "Arif",
4359
+ "\u0646\u0639\u0645\u0627\u0646": "Noman",
4360
+ "\u062B\u0627\u0642\u0628": "Saqib",
4361
+ "\u0639\u062F\u06CC\u0644": "Adeel",
4362
+ "\u0639\u0645\u0631\u0627\u0646": "Imran",
4363
+ "\u0641\u0648\u0627\u062F": "Fawad",
4364
+ "\u0622\u0635\u0641": "Asif",
4365
+ "\u0634\u0639\u06CC\u0628": "Shoaib",
4366
+ "\u0632\u0627\u06C1\u062F": "Zahid",
4367
+ "\u0639\u0627\u0645\u0631": "Amer",
4368
+ "\u0645\u062C\u06CC\u062F": "Majid",
4369
+ "\u0633\u0631\u0641\u0631\u0627\u0632": "Sarfraz",
4370
+ "\u062D\u0645\u06CC\u062F": "Hamid",
4371
+ "\u0646\u0638\u06CC\u0631": "Nazir",
4372
+ "\u0642\u06CC\u0635\u0631": "Qaiser",
4373
+ "\u0644\u0637\u06CC\u0641": "Latif",
4374
+ "\u062A\u0646\u0648\u06CC\u0631": "Tanveer",
4375
+ "\u0633\u0644\u06CC\u0645\u0627\u0646": "Suleman",
4376
+ "\u0627\u0641\u062A\u062E\u0627\u0631": "Iftikhar",
4377
+ "\u0634\u0628\u06CC\u0631": "Shabbir",
4378
+ "\u0633\u0627\u062C\u062F": "Sajid",
4379
+ "\u0645\u0646\u0635\u0648\u0631": "Mansoor",
4380
+ "\u0633\u0644\u0637\u0627\u0646": "Sultan",
4381
+ "\u0646\u0635\u06CC\u0631": "Nasir",
4382
+ "\u062D\u0628\u06CC\u0628": "Habib",
4383
+ "\u0645\u0642\u0635\u0648\u062F": "Maqsood",
4384
+ "\u0645\u0633\u0639\u0648\u062F": "Masood",
4385
+ "\u0633\u06C1\u06CC\u0644": "Sohail",
4386
+ "\u0627\u0634\u0631\u0641": "Ashraf",
4387
+ "\u0645\u0628\u0627\u0631\u06A9": "Mubarak",
4388
+ "\u0641\u06C1\u062F": "Fahad",
4389
+ "\u0627\u0638\u06C1\u0631": "Azhar",
4390
+ "\u0648\u06A9\u06CC\u0644": "Wakeel",
4391
+ "\u0631\u0624\u0641": "Rauf",
4392
+ "\u062F\u0627\u0646\u06CC\u0627\u0644": "Daniyal",
4393
+ "\u0630\u06CC\u0634\u0627\u0646": "Zeeshan",
4394
+ "\u0645\u0635\u0637\u0641\u06CC": "Mustafa",
4395
+ // Female names
4396
+ "\u0641\u0627\u0637\u0645\u06C1": "Fatima",
4397
+ "\u0639\u0627\u0626\u0634\u06C1": "Ayesha",
4398
+ "\u062E\u062F\u06CC\u062C\u06C1": "Khadija",
4399
+ "\u062D\u0633\u0646\u0627": "Husna",
4400
+ "\u0632\u06CC\u0646\u0628": "Zainab",
4401
+ "\u0622\u0645\u0646\u06C1": "Amina",
4402
+ "\u0633\u0627\u0631\u0627": "Sara",
4403
+ "\u0627\u062F\u06CC\u06C1": "Adia",
4404
+ "\u0646\u0648\u0631": "Noor",
4405
+ "\u062D\u0631\u0627": "Hira",
4406
+ "\u0627\u0642\u0635\u06CC": "Aqsa",
4407
+ "\u0645\u0627\u06C1\u0645": "Maham",
4408
+ "\u0627\u06CC\u0645\u0627\u0646": "Iman",
4409
+ "\u0644\u0627\u0626\u0628\u06C1": "Laiba",
4410
+ "\u06C1\u0627\u0646\u06CC\u06C1": "Hania",
4411
+ "\u0631\u0645\u0634\u06C1": "Rimsha",
4412
+ "\u0645\u06CC\u0645\u0648\u0646\u06C1": "Memoona",
4413
+ "\u062B\u0646\u0627": "Sana",
4414
+ "\u062D\u0646\u0627": "Hina",
4415
+ "\u0627\u0642\u0631\u0627": "Iqra",
4416
+ "\u0641\u06CC\u0632\u0627": "Fiza",
4417
+ "\u0641\u0636\u06C1": "Fizza",
4418
+ "\u0633\u062F\u0631\u06C1": "Sidra",
4419
+ "\u0631\u062F\u0627": "Rida",
4420
+ "\u0646\u062F\u0627": "Nida",
4421
+ "\u0645\u0648\u0645\u06CC\u0646\u06C1": "Momina",
4422
+ "\u062B\u0648\u0628\u06CC\u06C1": "Sobia",
4423
+ "\u0646\u0627\u0626\u0644\u06C1": "Naila",
4424
+ "\u0628\u0634\u0631\u06CC": "Bushra",
4425
+ "\u0631\u062E\u0633\u0627\u0646\u06C1": "Rukhsana",
4426
+ "\u0634\u0627\u0632\u06CC\u06C1": "Shazia",
4427
+ "\u0646\u0627\u06C1\u06CC\u062F": "Naheed",
4428
+ "\u067E\u0631\u0648\u06CC\u0646": "Parveen",
4429
+ "\u0641\u0631\u0632\u0627\u0646\u06C1": "Farzana",
4430
+ "\u0646\u0627\u0632\u06CC\u06C1": "Nazia",
4431
+ "\u0635\u0628\u06CC\u062D\u06C1": "Sabiha",
4432
+ "\u0631\u0628\u0627\u0628": "Rubab",
4433
+ "\u0635\u0627\u0626\u0645\u06C1": "Saima",
4434
+ "\u0645\u06C1\u0631\u06CC\u0646": "Mehreen",
4435
+ "\u0639\u0646\u0628\u0631\u06CC\u0646": "Ambreen",
4436
+ "\u06A9\u0627\u0626\u0646\u0627\u062A": "Kainat",
4437
+ "\u0637\u0627\u06C1\u0631\u06C1": "Tahira",
4438
+ "\u0633\u0645\u06CC\u0639\u06C1": "Samia",
4439
+ "\u0633\u0627\u0645\u06CC\u06C1": "Samiya",
4440
+ "\u0633\u0644\u0645\u06CC": "Salma",
4441
+ "\u0631\u0648\u0632\u06CC\u0646\u06C1": "Rozina",
4442
+ "\u0645\u0631\u06CC\u0645": "Maryam",
4443
+ "\u0631\u0627\u0628\u0639\u06C1": "Rabia",
4444
+ "\u062A\u0633\u0644\u06CC\u0645": "Tasleem",
4445
+ "\u0627\u0633\u0645\u0627\u0621": "Asma",
4446
+ "\u0627\u0631\u0645": "Iram",
4447
+ "\u0646\u0627\u0632": "Naaz",
4448
+ "\u0641\u0631\u062D": "Farah",
4449
+ "\u0646\u0627\u062F\u06CC\u06C1": "Nadia",
4450
+ "\u0633\u06CC\u0645\u0627": "Seema",
4451
+ "\u06C1\u0645\u0627": "Huma",
4452
+ "\u0646\u0632\u06C1\u062A": "Nuzhat",
4453
+ "\u0639\u0638\u0645\u06CC": "Uzma",
4454
+ "\u06A9\u0631\u0646": "Kiran",
4455
+ "\u0633\u0645\u06CC\u0631\u0627": "Sumaira",
4456
+ "\u0641\u0631\u062E\u0646\u062F\u06C1": "Farkhanda",
4457
+ "\u062A\u0633\u0646\u06CC\u0645": "Tasneem",
4458
+ "\u0632\u0628\u06CC\u062F\u06C1": "Zubaida",
4459
+ "\u062C\u0648\u06CC\u0631\u06CC\u06C1": "Javeria",
4460
+ "\u0645\u06C1\u0648\u0634": "Mehwish",
4461
+ "\u0639\u0627\u0644\u06CC\u06C1": "Alia"
4462
+ };
4463
+ var URDU_FAMILY_NAMES = {
4464
+ "\u062E\u0627\u0646": "Khan",
4465
+ "\u0634\u0627\u06C1": "Shah",
4466
+ "\u0686\u0648\u06C1\u062F\u0631\u06CC": "Chaudhry",
4467
+ "\u0645\u0644\u06A9": "Malik",
4468
+ "\u0634\u06CC\u062E": "Sheikh",
4469
+ "\u0642\u0631\u06CC\u0634\u06CC": "Qureshi",
4470
+ "\u0633\u06CC\u062F": "Syed",
4471
+ "\u0646\u06CC\u0627\u0632\u06CC": "Niazi",
4472
+ "\u062C\u062F\u0648\u0646": "Jadoon",
4473
+ "\u0633\u0648\u0627\u062A\u06CC": "Swati",
4474
+ "\u06A9\u06BE\u0679\u06A9": "Khattak",
4475
+ "\u06CC\u0648\u0633\u0641\u0632\u0626\u06CC": "Yusufzai",
4476
+ "\u06A9\u06BE\u0648\u0633\u06C1": "Khosa",
4477
+ "\u062A\u0627\u0644\u067E\u0648\u0631": "Talpur",
4478
+ "\u062C\u0648\u0646\u06CC\u062C\u0648": "Junejo",
4479
+ "\u0628\u06BE\u0679\u06CC": "Bhatti",
4480
+ "\u0631\u0627\u062C\u067E\u0648\u062A": "Rajput",
4481
+ "\u0633\u0648\u0645\u0631\u0648": "Soomro",
4482
+ "\u062F\u06C1\u0627\u0631": "Dahar",
4483
+ "\u06AF\u06CC\u0644\u0627\u0646\u06CC": "Gillani",
4484
+ "\u0679\u0648\u0627\u0646\u0627\u0633": "Tiwanas",
4485
+ "\u0679\u0648\u0627\u0646\u06C1": "Tiwana",
4486
+ "\u062F\u0648\u0644\u062A\u0627\u0646\u06CC": "Doltani",
4487
+ "\u062F\u0627\u0644\u062A\u0627\u0646\u06CC": "Daltani",
4488
+ "\u06AF\u0648\u0631\u0686\u0627\u0646\u06CC": "Gurchani",
4489
+ "\u0631\u0646\u062F": "Rind",
4490
+ "\u0628\u06AF\u0679\u06CC": "Bugti",
4491
+ "\u0645\u0631\u06CC": "Marri",
4492
+ "\u0628\u0632\u06CC\u0646\u062C\u0648": "Bizenjo",
4493
+ "\u0645\u06CC\u0646\u06AF\u0644": "Mengal",
4494
+ "\u0632\u0631\u062F\u0627\u0631\u06CC": "Zardari",
4495
+ "\u0628\u06BE\u0679\u0648": "Bhutto",
4496
+ "\u0634\u0631\u06CC\u0641": "Sharif"
4497
+ };
4498
+ var HONORIFICS = {
4499
+ "\u062C\u0646\u0627\u0628": "Janab",
4500
+ "\u0635\u0627\u062D\u0628": "Sahib",
4501
+ "\u0627\u0633\u062A\u0627\u062F": "Ustad",
4502
+ "\u062D\u06A9\u06CC\u0645": "Hakim",
4503
+ "\u0688\u0627\u06A9\u0679\u0631": "Dr.",
4504
+ "\u067E\u0631\u0648\u0641\u06CC\u0633\u0631": "Prof.",
4505
+ "\u0627\u0646\u062C\u06CC\u0646\u0626\u0631": "Eng.",
4506
+ "\u0627\u06CC\u0688\u0648\u0648\u06A9\u06CC\u0679": "Adv.",
4507
+ "\u0631\u06CC\u0679\u0627\u0626\u0631\u0688": "Retd.",
4508
+ "\u0634\u06C1\u06CC\u062F": "Shaheed"
4509
+ };
4510
+ var NAME_PREFIXES = {
4511
+ "\u0633\u06CC\u062F": "Syed",
4512
+ "\u0634\u06CC\u062E": "Sheikh",
4513
+ "\u0686\u0648\u06C1\u062F\u0631\u06CC": "Chowdhury",
4514
+ "\u0645\u0644\u06A9": "Malik",
4515
+ "\u0645\u06CC\u0627\u06BA": "Mian",
4516
+ "\u062E\u0627\u0646": "Khan",
4517
+ "\u0628\u06CC\u06AF\u0645": "Begum",
4518
+ "\u0635\u0627\u062D\u0628": "Sahib"
4519
+ };
4520
+ var ENGLISH_TO_URDU = /* @__PURE__ */ new Map();
4521
+ for (const table of [HONORIFICS, URDU_FIRST_NAMES, URDU_FAMILY_NAMES, NAME_PREFIXES]) {
4522
+ for (const [urduWord, englishWord] of Object.entries(table)) {
4523
+ ENGLISH_TO_URDU.set(englishWord.toLowerCase(), urduWord);
4524
+ }
4525
+ }
4526
+ var ENGLISH_NAME_ALIASES = {
4527
+ hassan: "\u062D\u0633\u0646",
4528
+ // vs. canonical Hasan
4529
+ omar: "\u0639\u0645\u0631",
4530
+ // vs. canonical Umar
4531
+ omer: "\u0639\u0645\u0631",
4532
+ // vs. canonical Umar
4533
+ yaqoob: "\u06CC\u0639\u0642\u0648\u0628",
4534
+ // vs. canonical Yaquob
4535
+ jameel: "\u062C\u0645\u06CC\u0644",
4536
+ // vs. canonical Jamil
4537
+ majeed: "\u0645\u062C\u06CC\u062F",
4538
+ // vs. canonical Majid
4539
+ amna: "\u0622\u0645\u0646\u06C1",
4540
+ // vs. canonical Amina
4541
+ gilani: "\u06AF\u06CC\u0644\u0627\u0646\u06CC",
4542
+ // vs. canonical Gillani
4543
+ sahab: "\u0635\u0627\u062D\u0628",
4544
+ // vs. canonical Sahib
4545
+ doctor: "\u0688\u0627\u06A9\u0679\u0631",
4546
+ // vs. canonical Dr.
4547
+ professor: "\u067E\u0631\u0648\u0641\u06CC\u0633\u0631",
4548
+ // vs. canonical Prof.
4549
+ engineer: "\u0627\u0646\u062C\u06CC\u0646\u0626\u0631",
4550
+ // vs. canonical Eng.
4551
+ advocate: "\u0627\u06CC\u0688\u0648\u0648\u06A9\u06CC\u0679",
4552
+ // vs. canonical Adv.
4553
+ retd: "\u0631\u06CC\u0679\u0627\u0626\u0631\u0688"
4554
+ // vs. canonical Retd.
4555
+ };
4556
+ function transliterateSingleName(urduName) {
4557
+ const normalized = removeDiacritics(normalizeUrdu(urduName));
4558
+ const words = normalized.split(/\s+/).filter((w) => w.length > 0);
4559
+ const result = [];
4560
+ for (const word of words) {
4561
+ const honorific = HONORIFICS[word];
4562
+ if (honorific) {
4563
+ result.push(honorific);
4564
+ continue;
4565
+ }
4566
+ const firstName = URDU_FIRST_NAMES[word];
4567
+ if (firstName) {
4568
+ result.push(firstName);
4569
+ continue;
4570
+ }
4571
+ const familyName = URDU_FAMILY_NAMES[word];
4572
+ if (familyName) {
4573
+ result.push(familyName);
4574
+ continue;
4575
+ }
4576
+ const prefix = NAME_PREFIXES[word];
4577
+ if (prefix) {
4578
+ result.push(prefix);
4579
+ continue;
4580
+ }
4581
+ result.push(transliterateNameWord(word));
4582
+ }
4583
+ return result.join(" ");
4584
+ }
4585
+ function transliterateNameWord(word) {
4586
+ if (!word) return "";
4587
+ const consonants = {
4588
+ "\u0628": "b",
4589
+ "\u067E": "p",
4590
+ "\u062A": "t",
4591
+ "\u0679": "t",
4592
+ "\u062C": "j",
4593
+ "\u0686": "ch",
4594
+ "\u062D": "h",
4595
+ "\u062E": "kh",
4596
+ "\u062F": "d",
4597
+ "\u0688": "d",
4598
+ "\u0631": "r",
4599
+ "\u0691": "r",
4600
+ "\u0632": "z",
4601
+ "\u0633": "s",
4602
+ "\u0634": "sh",
4603
+ "\u0635": "s",
4604
+ "\u0636": "z",
4605
+ "\u0637": "t",
4606
+ "\u0638": "z",
4607
+ "\u0639": "a",
4608
+ "\u063A": "gh",
4609
+ "\u0641": "f",
4610
+ "\u0642": "q",
4611
+ "\u06A9": "k",
4612
+ "\u06AF": "g",
4613
+ "\u0644": "l",
4614
+ "\u0645": "m",
4615
+ "\u0646": "n",
4616
+ "\u0648": "w",
4617
+ "\u06C1": "h",
4618
+ "\u06BE": "h",
4619
+ "\u06CC": "y"
4620
+ };
4621
+ let result = "";
4622
+ const chars = [...word];
4623
+ for (let i = 0; i < chars.length; i++) {
4624
+ const ch = chars[i];
4625
+ const next = chars[i + 1];
4626
+ if (next === "\u06BE" && consonants[ch]) {
4627
+ const base = consonants[ch];
4628
+ result += base + "h";
4629
+ i++;
4630
+ continue;
4631
+ }
4632
+ if (ch === "\u0622") {
4633
+ result += "Aa";
4634
+ continue;
4635
+ }
4636
+ if (ch === "\u0627" && i === 0) {
4637
+ result += "A";
4638
+ continue;
4639
+ }
4640
+ if (ch === "\u0627") {
4641
+ result += "a";
4642
+ continue;
4643
+ }
4644
+ if (ch === "\u06CC" && i === chars.length - 1) {
4645
+ result += "i";
4646
+ continue;
4647
+ }
4648
+ if (ch === "\u06CC" && next === "\u06BA") {
4649
+ result += "ain";
4650
+ i++;
4651
+ continue;
4652
+ }
4653
+ if (ch === "\u0648" && i === 0) {
4654
+ result += "W";
4655
+ continue;
4656
+ }
4657
+ if (ch === "\u0648") {
4658
+ result += "o";
4659
+ continue;
4660
+ }
4661
+ if (consonants[ch]) {
4662
+ result += consonants[ch];
4663
+ continue;
4664
+ }
4665
+ result += ch;
4666
+ }
4667
+ return result.charAt(0).toUpperCase() + result.slice(1);
4668
+ }
4669
+ function transliterateNameToEnglish(urduName, options = {}) {
4670
+ if (!urduName) return "";
4671
+ const { preserveCase = true, includeHonorifics = true } = options;
4672
+ const result = transliterateSingleName(urduName);
4673
+ if (!includeHonorifics) {
4674
+ return result.split(/\s+/).filter((word) => !Object.values(HONORIFICS).includes(word)).join(" ");
4675
+ }
4676
+ return preserveCase ? result : result.toLowerCase();
4677
+ }
4678
+ function transliterateNameToUrdu(englishName) {
4679
+ if (!englishName) return "";
4680
+ const words = englishName.split(/\s+/).filter((w) => w.length > 0);
4681
+ return words.map((word) => reverseTransliterateName(word)).join(" ");
4682
+ }
4683
+ function reverseTransliterateName(englishName) {
4684
+ const lower = englishName.toLowerCase();
4685
+ return ENGLISH_TO_URDU.get(lower) ?? ENGLISH_NAME_ALIASES[lower] ?? englishName;
4686
+ }
4687
+ function extractNameParts(fullName) {
4688
+ const normalized = removeDiacritics(normalizeUrdu(fullName));
4689
+ const words = normalized.split(/\s+/).filter((w) => w.length > 0);
4690
+ const honorifics = Object.keys(HONORIFICS);
4691
+ const suffixes = ["sahib", "sahab", "\u0628\u06CC\u06AF\u0645", "begum"];
4692
+ let honorific;
4693
+ let suffix;
4694
+ const nameWords = [];
4695
+ for (const word of words) {
4696
+ if (honorifics.includes(word)) {
4697
+ if (!honorific) {
4698
+ honorific = word;
4699
+ } else {
4700
+ suffix = word;
4701
+ }
4702
+ } else if (suffixes.includes(word)) {
4703
+ suffix = word;
4704
+ } else {
4705
+ nameWords.push(word);
4706
+ }
4707
+ }
4708
+ const familyName = nameWords.length > 1 ? nameWords[nameWords.length - 1] : void 0;
4709
+ const firstName = nameWords.length > 1 ? nameWords.slice(0, -1).join(" ") : nameWords[0] || "";
4710
+ return { honorific, firstName, familyName, suffix };
4711
+ }
4712
+
4713
+ export { URDU_MONTHS_GREGORIAN, URDU_MONTHS_HIJRI, URDU_PREFIXES, URDU_STOP_WORDS, URDU_SUFFIXES, URDU_WEEKDAYS, analyzeUrdu, compareUrdu, convertNumbers, countSentences, countWords, editDistance, extractNameParts, filterStopWords, foldUrdu, formatUrduDate, getAffixes, getUrduMonthName, getUrduWeekdayName, hasUrduSpecificLetters, highlightUrdu, isStopWord, isUrdu, normalizeUrdu, numberToUrduWords, parseUrduNumber, removeDiacritics, removeStopWords, romanToUrdu, romanize, searchUrdu, searchUrduRanked, sortUrdu, splitSentences, splitWords, stemUrdu, stemUrduText, timeAgoUrdu, toArabicIndicDigits, toEnglishDigits, toUrduDigits, transliterateNameToEnglish, transliterateNameToUrdu, urduRatio, urduSlug };
4396
4714
  //# sourceMappingURL=index.js.map
4397
4715
  //# sourceMappingURL=index.js.map