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