urdu-text-utils 0.1.7 → 0.1.9

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
@@ -3701,6 +3701,244 @@ function timeAgoUrdu(date, relativeTo = /* @__PURE__ */ new Date(), options = {}
3701
3701
  return isPast ? `${count} \u0633\u0627\u0644 \u067E\u06C1\u0644\u06D2` : `${count} \u0633\u0627\u0644 \u0628\u0639\u062F`;
3702
3702
  }
3703
3703
 
3704
- export { URDU_MONTHS_GREGORIAN, URDU_MONTHS_HIJRI, URDU_STOP_WORDS, URDU_WEEKDAYS, analyzeUrdu, compareUrdu, convertNumbers, countSentences, countWords, editDistance, filterStopWords, foldUrdu, formatUrduDate, getUrduMonthName, getUrduWeekdayName, hasUrduSpecificLetters, highlightUrdu, isStopWord, isUrdu, normalizeUrdu, numberToUrduWords, parseUrduNumber, removeDiacritics, removeStopWords, romanToUrdu, romanize, searchUrdu, searchUrduRanked, sortUrdu, splitSentences, splitWords, timeAgoUrdu, toArabicIndicDigits, toEnglishDigits, toUrduDigits, urduRatio, urduSlug };
3704
+ // src/stemmer.ts
3705
+ var URDU_PREFIXES = [
3706
+ "\u063A\u06CC\u0631",
3707
+ "\u062E\u0648\u062F",
3708
+ "\u0627\u06C1\u0644",
3709
+ "\u0628\u06D2",
3710
+ "\u0646\u0627",
3711
+ "\u0644\u0627",
3712
+ "\u0628\u062F",
3713
+ "\u06A9\u0645",
3714
+ "\u0627\u0646",
3715
+ "\u06C1\u0645",
3716
+ "\u0628\u0627",
3717
+ "\u067E\u064F\u0631"
3718
+ ];
3719
+ var URDU_SUFFIXES = [
3720
+ // Compound / multi-syllable suffixes
3721
+ "\u06CC\u06BA\u06AF\u06D2",
3722
+ "\u06CC\u0646\u06AF\u06D2",
3723
+ "\u06D2\u06AF\u0627",
3724
+ "\u06D2\u06AF\u06CC",
3725
+ "\u06CC\u0646\u06AF\u06CC",
3726
+ "\u062F\u0627\u0631\u06CC",
3727
+ "\u06AF\u0627\u0631\u06CC",
3728
+ "\u06A9\u0627\u0631\u06CC",
3729
+ "\u0633\u0627\u0632\u06CC",
3730
+ "\u0628\u0627\u0632\u06CC",
3731
+ "\u0645\u0646\u062F\u06CC",
3732
+ "\u062A\u0631\u06CC\u0646",
3733
+ "\u0633\u062A\u0627\u0646",
3734
+ "\u062E\u0627\u0646\u06C1",
3735
+ "\u0646\u0627\u0645\u06C1",
3736
+ "\u062C\u0627\u062A",
3737
+ "\u06AF\u0627\u0646",
3738
+ // Adjectival / nominal / agentive suffixes
3739
+ "\u062F\u0627\u0631",
3740
+ "\u06AF\u0627\u0631",
3741
+ "\u06A9\u0627\u0631",
3742
+ "\u0633\u0627\u0632",
3743
+ "\u0628\u0627\u0632",
3744
+ "\u0645\u0646\u062F",
3745
+ "\u0646\u0627\u06A9",
3746
+ "\u0648\u0627\u0631",
3747
+ "\u062F\u0627\u0646",
3748
+ "\u0632\u0627\u0631",
3749
+ "\u06CC\u062A",
3750
+ "\u067E\u0646",
3751
+ "\u0627\u0626\u06CC",
3752
+ "\u062A\u0631",
3753
+ // Plural & verbal inflections
3754
+ "\u06CC\u0627\u06BA",
3755
+ "\u0626\u06CC\u06BA",
3756
+ "\u0624\u06BA",
3757
+ "\u06CC\u0648\u06BA",
3758
+ "\u0648\u06BA",
3759
+ "\u06CC\u06BA",
3760
+ "\u0627\u062A",
3761
+ "\u06C1\u0627",
3762
+ "\u06CC\u0646",
3763
+ "\u062A\u06CC\u06BA",
3764
+ "\u062A\u0627",
3765
+ "\u062A\u06CC",
3766
+ "\u062A\u06D2",
3767
+ "\u0646\u0627"
3768
+ ];
3769
+ var PROTECTED_WORDS = /* @__PURE__ */ new Set([
3770
+ "\u06C1\u0645",
3771
+ "\u0646\u0627",
3772
+ "\u0644\u0627",
3773
+ "\u0628\u06D2",
3774
+ "\u06CC\u0627",
3775
+ "\u062A\u0648",
3776
+ "\u067E\u0631",
3777
+ "\u0633\u06D2",
3778
+ "\u06A9\u0648",
3779
+ "\u06A9\u0627",
3780
+ "\u06A9\u06CC",
3781
+ "\u06A9\u06D2",
3782
+ "\u0645\u06CC\u06BA",
3783
+ "\u0646\u06D2",
3784
+ "\u06C1\u06D2",
3785
+ "\u06C1\u06CC\u06BA",
3786
+ "\u06C1\u0648",
3787
+ "\u062A\u06BE\u0627",
3788
+ "\u062A\u06BE\u06CC",
3789
+ "\u062A\u06BE\u06D2",
3790
+ "\u062A\u06BE\u06CC\u06BA",
3791
+ "\u0628\u0627\u063A",
3792
+ "\u0646\u0627\u0645",
3793
+ "\u0633\u0641\u0631",
3794
+ "\u06C1\u0648\u0627",
3795
+ "\u062F\u0644",
3796
+ "\u0633\u0631",
3797
+ "\u0644\u0628",
3798
+ "\u062F\u0633\u062A",
3799
+ "\u06A9\u0627\u0631",
3800
+ "\u0628\u0627\u0631",
3801
+ "\u0628\u0627\u0644",
3802
+ "\u0628\u0627\u0646",
3803
+ "\u0634\u0627\u0645",
3804
+ "\u06A9\u0627\u0645",
3805
+ "\u062F\u0627\u0645",
3806
+ "\u062C\u0627\u0645",
3807
+ "\u0639\u0627\u0645",
3808
+ "\u0631\u0627\u0645",
3809
+ "\u06AF\u0627\u0645",
3810
+ "\u062A\u0627\u0631",
3811
+ "\u06CC\u0627\u0631",
3812
+ "\u0645\u0627\u0631",
3813
+ "\u0646\u0627\u0631",
3814
+ "\u062F\u0627\u0631",
3815
+ "\u06C1\u0627\u0631",
3816
+ "\u0632\u0627\u0631",
3817
+ "\u063A\u0627\u0631",
3818
+ "\u0631\u0627\u062A",
3819
+ "\u0628\u0627\u062A",
3820
+ "\u0645\u0627\u062A",
3821
+ "\u0630\u0627\u062A",
3822
+ "\u06C1\u0627\u062A\u06BE",
3823
+ "\u0633\u0627\u062A\u06BE",
3824
+ "\u062F\u06CC\u0646",
3825
+ "\u062A\u06CC\u0646",
3826
+ "\u0686\u06CC\u0646",
3827
+ "\u0628\u06CC\u0646",
3828
+ "\u0632\u0645\u06CC\u0646",
3829
+ "\u0627\u0646\u0633\u0627\u0646",
3830
+ "\u0627\u062D\u0633\u0627\u0646",
3831
+ "\u0627\u06CC\u0645\u0627\u0646",
3832
+ "\u0627\u0633\u0644\u0627\u0645",
3833
+ "\u0627\u0639\u0644\u0627\u0646",
3834
+ "\u0627\u0645\u06A9\u0627\u0646",
3835
+ "\u0627\u0631\u0645\u0627\u0646",
3836
+ "\u0627\u0641\u063A\u0627\u0646",
3837
+ "\u0627\u06CC\u0631\u0627\u0646",
3838
+ "\u0639\u0645\u0631\u0627\u0646",
3839
+ "\u0639\u062B\u0645\u0627\u0646",
3840
+ "\u0633\u0644\u0645\u0627\u0646",
3841
+ "\u0639\u0631\u0641\u0627\u0646",
3842
+ "\u0642\u0631\u0622\u0646",
3843
+ "\u0637\u0648\u0641\u0627\u0646",
3844
+ "\u067E\u06C1\u0686\u0627\u0646",
3845
+ "\u062F\u06A9\u0627\u0646",
3846
+ "\u0645\u06A9\u0627\u0646",
3847
+ "\u0627\u0633\u0645\u0627\u0646",
3848
+ "\u0622\u0633\u0645\u0627\u0646",
3849
+ "\u0645\u06C1\u0645\u0627\u0646",
3850
+ "\u0646\u0642\u0635\u0627\u0646"
3851
+ ]);
3852
+ function applySuffixStripping(word, suffixes, minLen) {
3853
+ if (word.length <= minLen) return { stem: word };
3854
+ if (word.endsWith("\u06CC\u0627\u06BA") && word.length - 3 >= minLen) {
3855
+ const base = word.slice(0, -3);
3856
+ return { stem: `${base}\u06CC`, suffix: "\u06CC\u0627\u06BA" };
3857
+ }
3858
+ if (word.endsWith("\u06CC\u0648\u06BA") && word.length - 3 >= minLen) {
3859
+ const base = word.slice(0, -3);
3860
+ return { stem: `${base}\u06CC`, suffix: "\u06CC\u0648\u06BA" };
3861
+ }
3862
+ if (word.endsWith("\u0626\u06CC\u06BA") && word.length - 3 >= minLen) {
3863
+ const base = word.slice(0, -3);
3864
+ return { stem: base, suffix: "\u0626\u06CC\u06BA" };
3865
+ }
3866
+ if (word.endsWith("\u0624\u06BA") && word.length - 2 >= minLen) {
3867
+ const base = word.slice(0, -2);
3868
+ return { stem: base, suffix: "\u0624\u06BA" };
3869
+ }
3870
+ for (const suf of suffixes) {
3871
+ if (word.endsWith(suf)) {
3872
+ const remainder = word.slice(0, -suf.length).replace(/[\s\u200C\u200D]+$/, "");
3873
+ if (remainder.length >= minLen && !PROTECTED_WORDS.has(word)) {
3874
+ return { stem: remainder, suffix: suf };
3875
+ }
3876
+ }
3877
+ }
3878
+ return { stem: word };
3879
+ }
3880
+ function applyPrefixStripping(word, prefixes, minLen) {
3881
+ if (word.length <= minLen) return { stem: word };
3882
+ for (const pref of prefixes) {
3883
+ if (word.startsWith(pref)) {
3884
+ const remainder = word.slice(pref.length).replace(/^[\s\u200C\u200D]+/, "");
3885
+ if (remainder.length >= minLen && !PROTECTED_WORDS.has(word)) {
3886
+ return { stem: remainder, prefix: pref };
3887
+ }
3888
+ }
3889
+ }
3890
+ return { stem: word };
3891
+ }
3892
+ function getAffixes(input, options = {}) {
3893
+ if (!input || typeof input !== "string") {
3894
+ return { stem: "" };
3895
+ }
3896
+ const clean = removeDiacritics(normalizeUrdu(input.trim()));
3897
+ if (!clean) return { stem: "" };
3898
+ if (options.exceptions && options.exceptions[clean]) {
3899
+ return { stem: options.exceptions[clean] };
3900
+ }
3901
+ if (PROTECTED_WORDS.has(clean)) {
3902
+ return { stem: clean };
3903
+ }
3904
+ const minLen = options.minStemLength ?? 2;
3905
+ const doSuffixes = options.stripSuffixes ?? true;
3906
+ const doPrefixes = options.stripPrefixes ?? true;
3907
+ const suffixes = options.customSuffixes ?? URDU_SUFFIXES;
3908
+ const prefixes = options.customPrefixes ?? URDU_PREFIXES;
3909
+ let current = clean;
3910
+ let detectedSuffix;
3911
+ let detectedPrefix;
3912
+ if (doSuffixes) {
3913
+ const sRes = applySuffixStripping(current, suffixes, minLen);
3914
+ current = sRes.stem;
3915
+ detectedSuffix = sRes.suffix;
3916
+ }
3917
+ if (doPrefixes) {
3918
+ const pRes = applyPrefixStripping(current, prefixes, minLen);
3919
+ current = pRes.stem;
3920
+ detectedPrefix = pRes.prefix;
3921
+ }
3922
+ return {
3923
+ prefix: detectedPrefix,
3924
+ stem: current,
3925
+ suffix: detectedSuffix
3926
+ };
3927
+ }
3928
+ function stemUrdu(word, options = {}) {
3929
+ return getAffixes(word, options).stem;
3930
+ }
3931
+ function stemUrduText(text, options = {}) {
3932
+ if (!text || typeof text !== "string") return "";
3933
+ const tokens = text.split(/([\s\p{P}\p{S}]+)/u);
3934
+ return tokens.map((token) => {
3935
+ if (/[\u0600-\u06FF\u0750-\u077F\uFB50-\uFDFF\uFE70-\uFEFF]/.test(token)) {
3936
+ return stemUrdu(token, options);
3937
+ }
3938
+ return token;
3939
+ }).join("");
3940
+ }
3941
+
3942
+ 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 };
3705
3943
  //# sourceMappingURL=index.js.map
3706
3944
  //# sourceMappingURL=index.js.map