glin-profanity 2.3.7 → 3.0.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/dist/index.cjs CHANGED
@@ -1,26 +1,9 @@
1
1
  var __create = Object.create;
2
2
  var __defProp = Object.defineProperty;
3
- var __defProps = Object.defineProperties;
4
3
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
- var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
6
4
  var __getOwnPropNames = Object.getOwnPropertyNames;
7
- var __getOwnPropSymbols = Object.getOwnPropertySymbols;
8
5
  var __getProtoOf = Object.getPrototypeOf;
9
6
  var __hasOwnProp = Object.prototype.hasOwnProperty;
10
- var __propIsEnum = Object.prototype.propertyIsEnumerable;
11
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
12
- var __spreadValues = (a, b) => {
13
- for (var prop in b || (b = {}))
14
- if (__hasOwnProp.call(b, prop))
15
- __defNormalProp(a, prop, b[prop]);
16
- if (__getOwnPropSymbols)
17
- for (var prop of __getOwnPropSymbols(b)) {
18
- if (__propIsEnum.call(b, prop))
19
- __defNormalProp(a, prop, b[prop]);
20
- }
21
- return a;
22
- };
23
- var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
24
7
  var __commonJS = (cb, mod) => function __require() {
25
8
  return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
26
9
  };
@@ -45,26 +28,6 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
45
28
  mod
46
29
  ));
47
30
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
48
- var __async = (__this, __arguments, generator) => {
49
- return new Promise((resolve, reject) => {
50
- var fulfilled = (value) => {
51
- try {
52
- step(generator.next(value));
53
- } catch (e) {
54
- reject(e);
55
- }
56
- };
57
- var rejected = (value) => {
58
- try {
59
- step(generator.throw(value));
60
- } catch (e) {
61
- reject(e);
62
- }
63
- };
64
- var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
65
- step((generator = generator.apply(__this, __arguments)).next());
66
- });
67
- };
68
31
 
69
32
  // ../../node_modules/react/cjs/react.production.min.js
70
33
  var require_react_production_min = __commonJS({
@@ -2233,7 +2196,19 @@ __export(index_exports, {
2233
2196
  SeverityLevel: () => SeverityLevel,
2234
2197
  checkProfanity: () => checkProfanity,
2235
2198
  checkProfanityAsync: () => checkProfanityAsync,
2199
+ collapseRepeatedCharacters: () => collapseRepeatedCharacters,
2200
+ collapseSpacedCharacters: () => collapseSpacedCharacters,
2201
+ containsLeetspeak: () => containsLeetspeak,
2202
+ containsUnicodeObfuscation: () => containsUnicodeObfuscation,
2203
+ convertFullWidth: () => convertFullWidth,
2204
+ convertHomoglyphs: () => convertHomoglyphs,
2205
+ detectCharacterSets: () => detectCharacterSets,
2206
+ generateLeetspeakVariants: () => generateLeetspeakVariants,
2236
2207
  isWordProfane: () => isWordProfane,
2208
+ normalizeLeetspeak: () => normalizeLeetspeak,
2209
+ normalizeNFKD: () => normalizeNFKD,
2210
+ normalizeUnicode: () => normalizeUnicode,
2211
+ removeZeroWidthCharacters: () => removeZeroWidthCharacters,
2237
2212
  useProfanityChecker: () => useProfanityChecker
2238
2213
  });
2239
2214
  module.exports = __toCommonJS(index_exports);
@@ -2770,6 +2745,203 @@ var danish_default = {
2770
2745
  ]
2771
2746
  };
2772
2747
 
2748
+ // ../../shared/dictionaries/dutch.json
2749
+ var dutch_default = {
2750
+ words: [
2751
+ "aardappels afgieteng",
2752
+ "achter het raam zitten",
2753
+ "afberen",
2754
+ "aflebberen",
2755
+ "afrossen",
2756
+ "afrukken",
2757
+ "aftrekken",
2758
+ "afwerkplaats",
2759
+ "afzeiken",
2760
+ "afzuigen",
2761
+ "anderhalve man en een paardekop",
2762
+ "anita",
2763
+ "asbak",
2764
+ "aso",
2765
+ "bagger schijten",
2766
+ "balen",
2767
+ "bedonderen",
2768
+ "befborstelg",
2769
+ "beffen",
2770
+ "bekken",
2771
+ "belazeren",
2772
+ "besodemieterd zijn",
2773
+ "besodemieteren",
2774
+ "beurt",
2775
+ "boemelen",
2776
+ "boerelul",
2777
+ "boerenpummelg",
2778
+ "bokkelul",
2779
+ "botergeil",
2780
+ "broekhoesten",
2781
+ "brugpieperg",
2782
+ "buffelen",
2783
+ "buiten de pot piesen",
2784
+ "da's kloten van de bok",
2785
+ "de ballen",
2786
+ "de hoer spelen",
2787
+ "de hond uitlaten",
2788
+ "de koffer induiken",
2789
+ "delg",
2790
+ "de pijp aan maarten geven",
2791
+ "de pijp uitgaan",
2792
+ "dombo",
2793
+ "draaikontg",
2794
+ "driehoog achter wonen",
2795
+ "drolg",
2796
+ "drooggeiler",
2797
+ "droogkloot",
2798
+ "een beurt geven",
2799
+ "een nummertje maken",
2800
+ "een wip maken",
2801
+ "eikel",
2802
+ "engerd",
2803
+ "flamoes",
2804
+ "flikken",
2805
+ "flikker",
2806
+ "gadverdamme",
2807
+ "galbak",
2808
+ "gat",
2809
+ "gedoogzone",
2810
+ "geilneef",
2811
+ "gesodemieter",
2812
+ "godverdomme",
2813
+ "graftak",
2814
+ "gras maaien",
2815
+ "gratenkutg",
2816
+ "greppeldel",
2817
+ "griet",
2818
+ "hoempert",
2819
+ "hoer",
2820
+ "hoerenbuurt",
2821
+ "hoerenloper",
2822
+ "hoerig",
2823
+ "hol",
2824
+ "hufter",
2825
+ "huisdealer",
2826
+ "johny",
2827
+ "kanen",
2828
+ "kettingzeugg",
2829
+ "klaarkomen",
2830
+ "klerebeer",
2831
+ "klojo",
2832
+ "klooien",
2833
+ "klootjesvolk",
2834
+ "klootoog",
2835
+ "klootzak",
2836
+ "kloten",
2837
+ "knor",
2838
+ "kontg",
2839
+ "kontneuken",
2840
+ "krentekakker",
2841
+ "kut",
2842
+ "kuttelikkertje",
2843
+ "kwakkieg",
2844
+ "liefdesgrot",
2845
+ "lul",
2846
+ "lul-de-behanger",
2847
+ "lulhannes",
2848
+ "lummel",
2849
+ "mafketel",
2850
+ "matennaaierg",
2851
+ "matje",
2852
+ "mof",
2853
+ "mutsg",
2854
+ "naaien",
2855
+ "naakt",
2856
+ "neuken",
2857
+ "neukstier",
2858
+ "nicht",
2859
+ "oetlul",
2860
+ "opgeilen",
2861
+ "opkankeren",
2862
+ "oprotten",
2863
+ "opsodemieteren",
2864
+ "op z'n hondjes",
2865
+ "op z'n sodemieter geven",
2866
+ "opzouten",
2867
+ "ouwehoer",
2868
+ "ouwehoeren",
2869
+ "ouwe rukker",
2870
+ "paal",
2871
+ "paardelul",
2872
+ "palen",
2873
+ "penozeg",
2874
+ "piesen",
2875
+ "pijpbekkieg",
2876
+ "pijpen",
2877
+ "pik",
2878
+ "pleurislaaier",
2879
+ "poep",
2880
+ "poepen",
2881
+ "poot",
2882
+ "portiekslet",
2883
+ "pot",
2884
+ "potverdorie",
2885
+ "publiciteitsgeil",
2886
+ "raaskallen",
2887
+ "reet",
2888
+ "reetridder",
2889
+ "reet trappen, voor zijn",
2890
+ "remsporeng",
2891
+ "reutelen",
2892
+ "rothoer",
2893
+ "rotzak",
2894
+ "rukhond",
2895
+ "rukken",
2896
+ "schatje",
2897
+ "schijt",
2898
+ "schijten",
2899
+ "schoft",
2900
+ "schuinsmarcheerder",
2901
+ "shit",
2902
+ "slempen",
2903
+ "sletg",
2904
+ "sletterig",
2905
+ "slik mijn zaad",
2906
+ "snolg",
2907
+ "spuiten",
2908
+ "standje",
2909
+ "standje-69g",
2910
+ "stoephoer",
2911
+ "stootje",
2912
+ "strontg",
2913
+ "sufferdg",
2914
+ "tapijtnek",
2915
+ "teefg",
2916
+ "temeier",
2917
+ "teringlijer",
2918
+ "toeter",
2919
+ "tongzoeng",
2920
+ "triootjeg",
2921
+ "trottoir prostitu\xE9e",
2922
+ "trottoirteef",
2923
+ "vergallen",
2924
+ "verkloten",
2925
+ "verneuken",
2926
+ "viespeuk",
2927
+ "vingeren",
2928
+ "vleesroos",
2929
+ "voor jan lul",
2930
+ "voor jan-met-de-korte-achternaam",
2931
+ "watje",
2932
+ "welzijnsmafia",
2933
+ "wijf",
2934
+ "wippen",
2935
+ "wuftje",
2936
+ "zaadje",
2937
+ "zakkenwasser",
2938
+ "zeiken",
2939
+ "zeiker",
2940
+ "zuigen",
2941
+ "zuiplap"
2942
+ ]
2943
+ };
2944
+
2773
2945
  // ../../shared/dictionaries/esperanto.json
2774
2946
  var esperanto_default = {
2775
2947
  words: [
@@ -4562,197 +4734,1044 @@ var japanese_default = {
4562
4734
  // ../../shared/dictionaries/turkish.json
4563
4735
  var turkish_default = {
4564
4736
  words: [
4565
- "aardappels afgieteng",
4566
- "achter het raam zitten",
4567
- "afberen",
4568
- "aflebberen",
4569
- "afrossen",
4570
- "afrukken",
4571
- "aftrekken",
4572
- "afwerkplaats",
4573
- "afzeiken",
4574
- "afzuigen",
4575
- "anderhalve man en een paardekop",
4576
- "anita",
4577
- "asbak",
4578
- "aso",
4579
- "bagger schijten",
4580
- "balen",
4581
- "bedonderen",
4582
- "befborstelg",
4583
- "beffen",
4584
- "bekken",
4585
- "belazeren",
4586
- "besodemieterd zijn",
4587
- "besodemieteren",
4588
- "beurt",
4589
- "boemelen",
4590
- "boerelul",
4591
- "boerenpummelg",
4592
- "bokkelul",
4593
- "botergeil",
4594
- "broekhoesten",
4595
- "brugpieperg",
4596
- "buffelen",
4597
- "buiten de pot piesen",
4598
- "da's kloten van de bok",
4599
- "de ballen",
4600
- "de hoer spelen",
4601
- "de hond uitlaten",
4602
- "de koffer induiken",
4603
- "delg",
4604
- "de pijp aan maarten geven",
4605
- "de pijp uitgaan",
4606
- "dombo",
4607
- "draaikontg",
4608
- "driehoog achter wonen",
4609
- "drolg",
4610
- "drooggeiler",
4611
- "droogkloot",
4612
- "een beurt geven",
4613
- "een nummertje maken",
4614
- "een wip maken",
4615
- "eikel",
4616
- "engerd",
4617
- "flamoes",
4618
- "flikken",
4619
- "flikker",
4620
- "gadverdamme",
4621
- "galbak",
4622
- "gat",
4623
- "gedoogzone",
4624
- "geilneef",
4625
- "gesodemieter",
4626
- "godverdomme",
4627
- "graftak",
4628
- "gras maaien",
4629
- "gratenkutg",
4630
- "greppeldel",
4631
- "griet",
4632
- "hoempert",
4633
- "hoer",
4634
- "hoerenbuurt",
4635
- "hoerenloper",
4636
- "hoerig",
4637
- "hol",
4638
- "hufter",
4639
- "huisdealer",
4640
- "johny",
4641
- "kanen",
4642
- "kettingzeugg",
4643
- "klaarkomen",
4644
- "klerebeer",
4645
- "klojo",
4646
- "klooien",
4647
- "klootjesvolk",
4648
- "klootoog",
4649
- "klootzak",
4650
- "kloten",
4651
- "knor",
4652
- "kontg",
4653
- "kontneuken",
4654
- "krentekakker",
4655
- "kut",
4656
- "kuttelikkertje",
4657
- "kwakkieg",
4658
- "liefdesgrot",
4659
- "lul",
4660
- "lul-de-behanger",
4661
- "lulhannes",
4662
- "lummel",
4663
- "mafketel",
4664
- "matennaaierg",
4665
- "matje",
4666
- "mof",
4667
- "mutsg",
4668
- "naaien",
4669
- "naakt",
4670
- "neuken",
4671
- "neukstier",
4672
- "nicht",
4673
- "oetlul",
4674
- "opgeilen",
4675
- "opkankeren",
4676
- "oprotten",
4677
- "opsodemieteren",
4678
- "op z'n hondjes",
4679
- "op z'n sodemieter geven",
4680
- "opzouten",
4681
- "ouwehoer",
4682
- "ouwehoeren",
4683
- "ouwe rukker",
4684
- "paal",
4685
- "paardelul",
4686
- "palen",
4687
- "penozeg",
4688
- "piesen",
4689
- "pijpbekkieg",
4690
- "pijpen",
4691
- "pik",
4692
- "pleurislaaier",
4693
- "poep",
4694
- "poepen",
4695
- "poot",
4696
- "portiekslet",
4697
- "pot",
4698
- "potverdorie",
4699
- "publiciteitsgeil",
4700
- "raaskallen",
4701
- "reet",
4702
- "reetridder",
4703
- "reet trappen, voor zijn",
4704
- "remsporeng",
4705
- "reutelen",
4706
- "rothoer",
4707
- "rotzak",
4708
- "rukhond",
4709
- "rukken",
4710
- "schatje",
4711
- "schijt",
4712
- "schijten",
4713
- "schoft",
4714
- "schuinsmarcheerder",
4737
+ "18+",
4738
+ "30+1",
4739
+ "31",
4740
+ ":poop:",
4741
+ "a.g.",
4742
+ "a.mk",
4743
+ "a.q",
4744
+ "a.q.",
4745
+ "a.\u0131g",
4746
+ "abaza",
4747
+ "abazan",
4748
+ "adi",
4749
+ "ag",
4750
+ "ag.",
4751
+ "ahmak",
4752
+ "ak",
4753
+ "akp",
4754
+ "al a\u011Fz\u0131na",
4755
+ "allah",
4756
+ "allahs\u0131z",
4757
+ "am",
4758
+ "am biti",
4759
+ "am.k",
4760
+ "amar\u0131m",
4761
+ "ambiti",
4762
+ "amcik",
4763
+ "amck",
4764
+ "amckl",
4765
+ "amcklama",
4766
+ "amcklaryla",
4767
+ "amckta",
4768
+ "amcktan",
4769
+ "amcuk",
4770
+ "amc\u0131k",
4771
+ "amc\u0131k ho\u015Faf\u0131",
4772
+ "amc\u0131ka\u011F\u0131z",
4773
+ "amc\u0131klama",
4774
+ "amc\u0131kland\u0131",
4775
+ "amc\u0131klar\u0131",
4776
+ "amc\u0131\u011F\u0131 ",
4777
+ "amc\u0131\u011F\u0131n",
4778
+ "amc\u0131\u011F\u0131n\u0131",
4779
+ "amc\u0131\u011F\u0131n\u0131z\u0131",
4780
+ "amed",
4781
+ "amg",
4782
+ "amin oglu",
4783
+ "amina",
4784
+ "amina g",
4785
+ "amina k",
4786
+ "amina koyarim",
4787
+ "amina koyayim",
4788
+ "amina koyay\u0131m",
4789
+ "aminako",
4790
+ "aminakoyarim",
4791
+ "aminakoyim",
4792
+ "aminda",
4793
+ "amindan",
4794
+ "amindayken",
4795
+ "amini",
4796
+ "aminiyarraaniskiim",
4797
+ "aminoglu",
4798
+ "amiyum",
4799
+ "amk",
4800
+ "amk \xE7ocu\u011Fu",
4801
+ "amk.",
4802
+ "amkafa",
4803
+ "amlarnzn",
4804
+ "aml\u0131",
4805
+ "amm",
4806
+ "ammak",
4807
+ "ammna",
4808
+ "amm\u0131na",
4809
+ "amn",
4810
+ "amna",
4811
+ "amnda",
4812
+ "amndaki",
4813
+ "amngtn",
4814
+ "amnn",
4815
+ "amona",
4816
+ "amq",
4817
+ "amsiz",
4818
+ "amsz",
4819
+ "ams\u0131z",
4820
+ "amteri",
4821
+ "amugaa",
4822
+ "amuna",
4823
+ "amu\u011Fa",
4824
+ "am\u0131g",
4825
+ "am\u0131k",
4826
+ "am\u0131n",
4827
+ "am\u0131n feryad\u0131",
4828
+ "am\u0131n oglu",
4829
+ "am\u0131n o\u011Flu",
4830
+ "am\u0131na",
4831
+ "Am\u0131na",
4832
+ "am\u0131na g",
4833
+ "am\u0131na k",
4834
+ "am\u0131na koy",
4835
+ "am\u0131na koyar\u0131m",
4836
+ "am\u0131na koyay\u0131m",
4837
+ "am\u0131na koyim",
4838
+ "am\u0131na koyyim",
4839
+ "am\u0131na s",
4840
+ "am\u0131na sikem",
4841
+ "am\u0131na sokam",
4842
+ "am\u0131nad\xFCrz\xFC",
4843
+ "am\u0131nako",
4844
+ "am\u0131nakoyim",
4845
+ "am\u0131no\u011Flu",
4846
+ "am\u0131n\u0131",
4847
+ "am\u0131n\u0131 s",
4848
+ "am\u0131s\u0131na",
4849
+ "am\u0131s\u0131n\u0131",
4850
+ "ana",
4851
+ "anaaann",
4852
+ "anal",
4853
+ "analarn",
4854
+ "anam",
4855
+ "anamla",
4856
+ "anan",
4857
+ "anana",
4858
+ "anandan",
4859
+ "anani",
4860
+ "anani sikerim",
4861
+ "anani sikeyim",
4862
+ "ananin",
4863
+ "ananisikerim",
4864
+ "ananisikeyim",
4865
+ "anann",
4866
+ "ananz",
4867
+ "anan\u0131",
4868
+ "anan\u0131 ",
4869
+ "anan\u0131 sikerim",
4870
+ "anan\u0131 sikeyim",
4871
+ "anan\u0131n",
4872
+ "anan\u0131n am",
4873
+ "anan\u0131n am\u0131",
4874
+ "anan\u0131n d\xF6l\xFC",
4875
+ "anan\u0131nki",
4876
+ "anan\u0131sikerim",
4877
+ "anan\u0131sikeyim",
4878
+ "anan\u0131z\u0131",
4879
+ "anan\u0131z\u0131n",
4880
+ "anan\u0131z\u0131n am",
4881
+ "anas",
4882
+ "anasi",
4883
+ "anasinin",
4884
+ "anas\u0131 orospu",
4885
+ "anas\u0131n\u0131",
4886
+ "anas\u0131n\u0131 avrad\u0131n\u0131",
4887
+ "anas\u0131n\u0131n am",
4888
+ "anay",
4889
+ "anayin",
4890
+ "angut",
4891
+ "anl\u0131k be\u011Feni",
4892
+ "anneni",
4893
+ "annenin",
4894
+ "annesiz",
4895
+ "anuna",
4896
+ "aptal",
4897
+ "aq",
4898
+ "aq.",
4899
+ "ass",
4900
+ "atkafas\u0131",
4901
+ "atm\u0131k",
4902
+ "attrrm",
4903
+ "att\u0131rd\u0131\u011F\u0131m",
4904
+ "auzlu",
4905
+ "avon",
4906
+ "avrad\u0131n\u0131",
4907
+ "avrat",
4908
+ "ayklarmalrmsikerim",
4909
+ "azd\u0131m",
4910
+ "azd\u0131r",
4911
+ "azd\u0131r\u0131c\u0131",
4912
+ "a\u011Fz\u0131na",
4913
+ "a\u011Fz\u0131na s\u0131\xE7ay\u0131m",
4914
+ "a\u015Fa\u011Fl\u0131k",
4915
+ "a\u015Fa\u011Fl\u0131ksn\u0131z",
4916
+ "a\u015Fa\u011F\u0131l\u0131ks\u0131n",
4917
+ "a\u015Fa\u011F\u0131l\u0131ks\u0131n\u0131z",
4918
+ "b.k",
4919
+ "babaannesi ka\u015Far",
4920
+ "babafingo",
4921
+ "babani",
4922
+ "baban\u0131",
4923
+ "baban\u0131n",
4924
+ "babas\u0131 pezevenk",
4925
+ "babas\u0131 tornac\u0131 anas\u0131 orospu",
4926
+ "baca\u011F\u0131na s\u0131\xE7ay\u0131m",
4927
+ "bacini",
4928
+ "bacn",
4929
+ "bacndan",
4930
+ "bacy",
4931
+ "bac\u0131n",
4932
+ "bac\u0131na",
4933
+ "bac\u0131n\u0131",
4934
+ "bac\u0131n\u0131n",
4935
+ "bastard",
4936
+ "basur",
4937
+ "bayanlar",
4938
+ "beyinsiz",
4939
+ "be\u011Fen",
4940
+ "be\u011Fenirmisiniz",
4941
+ "bira",
4942
+ "biseksuel",
4943
+ "bisekuel",
4944
+ "bisexual",
4945
+ "bisikiverem",
4946
+ "bitch",
4947
+ "biting",
4948
+ "bok",
4949
+ "boka",
4950
+ "bokbok",
4951
+ "bokhu",
4952
+ "bokkkumu",
4953
+ "boklar",
4954
+ "boktan",
4955
+ "boku",
4956
+ "bokubokuna",
4957
+ "bokum",
4958
+ "bok\xE7a",
4959
+ "bombok",
4960
+ "boner",
4961
+ "bosalmak",
4962
+ "boycot",
4963
+ "boycott",
4964
+ "boykot",
4965
+ "bo\u015Falmak",
4966
+ "bo\u015Fluk",
4967
+ "browni",
4968
+ "b\u0131z\u0131r",
4969
+ "ccc",
4970
+ "ccc ccc",
4971
+ "ccc incisiker ccc",
4972
+ "cccincisikerccc",
4973
+ "ccs colgate ccc",
4974
+ "cenabet",
4975
+ "cibiliyetsiz",
4976
+ "cibilliyetini",
4977
+ "cibilliyetsiz",
4978
+ "cif",
4979
+ "cikar",
4980
+ "cim",
4981
+ "cm",
4982
+ "coca cola",
4983
+ "cola",
4984
+ "dalaks\u0131z",
4985
+ "dallama",
4986
+ "daltassak",
4987
+ "dalyarak",
4988
+ "dalyarrak",
4989
+ "dangalak",
4990
+ "dasak",
4991
+ "dassagi",
4992
+ "dassak",
4993
+ "da\u015Fak",
4994
+ "da\u015F\u015Fak",
4995
+ "da\u015F\u015Faks\u0131z",
4996
+ "dede",
4997
+ "destek",
4998
+ "destekk",
4999
+ "deste\u011Finizi",
5000
+ "devsol",
5001
+ "dhkp",
5002
+ "diktim",
5003
+ "dildo",
5004
+ "din",
5005
+ "dinci",
5006
+ "dingil",
5007
+ "dingilini",
5008
+ "dinsiz",
5009
+ "dkerim",
5010
+ "domal",
5011
+ "domalan",
5012
+ "domald\u0131",
5013
+ "domald\u0131n",
5014
+ "domalmak",
5015
+ "domalm\u0131\u015F",
5016
+ "domals\u0131n",
5017
+ "domalt",
5018
+ "domaltarak",
5019
+ "domaltip",
5020
+ "domaltmak",
5021
+ "domalt\u0131p",
5022
+ "domalt\u0131r",
5023
+ "domalt\u0131r\u0131m",
5024
+ "domal\u0131k",
5025
+ "domal\u0131yor",
5026
+ "domuz yag\u0131",
5027
+ "domuz ya\u011F\u0131",
5028
+ "domuzyag\u0131",
5029
+ "durum",
5030
+ "d\xF6l\xFC",
5031
+ "d\xF6nek",
5032
+ "d\xFCd\xFCk",
5033
+ "d\xFCrz\xFC",
5034
+ "eben",
5035
+ "ebeni",
5036
+ "ebenin",
5037
+ "ebeninki",
5038
+ "ebleh",
5039
+ "ecdadini",
5040
+ "ecdad\u0131n\u0131",
5041
+ "edit",
5042
+ "embesil",
5043
+ "emek server",
5044
+ "emi",
5045
+ "ensest",
5046
+ "erotik",
5047
+ "escinsel",
5048
+ "ev han\u0131mlar\u0131",
5049
+ "ezik",
5050
+ "e\u015Fcinsel",
5051
+ "fahise",
5052
+ "fahi\u015Fe",
5053
+ "farmasi",
5054
+ "fasist",
5055
+ "fasizm",
5056
+ "fa\u015Fist",
5057
+ "fa\u015Fizm",
5058
+ "feri\u015Ftah",
5059
+ "ferre",
5060
+ "fuck",
5061
+ "fucker",
5062
+ "fuckin",
5063
+ "fucking",
5064
+ "f\u0131rsat",
5065
+ "g*t",
5066
+ "g*t\xFC",
5067
+ "g*t\xFCn",
5068
+ "g*t\xFCne",
5069
+ "g.t",
5070
+ "gasp",
5071
+ "gavad",
5072
+ "gavat",
5073
+ "gavurun d\xF6l\xFC",
5074
+ "gay",
5075
+ "geber",
5076
+ "geberik",
5077
+ "gebermek",
5078
+ "gebermi\u015F",
5079
+ "gebersin",
5080
+ "gebertir",
5081
+ "geri zekal\u0131",
5082
+ "gerizekali",
5083
+ "gerizekal\u0131",
5084
+ "gerizekal\u0131d\u0131r",
5085
+ "gerzek",
5086
+ "ger\u0131 zekal\u0131d\u0131r",
5087
+ "ger\u0131zekal\u0131",
5088
+ "giberim",
5089
+ "giberler",
5090
+ "gibis",
5091
+ "gibi\u015F",
5092
+ "gibmek",
5093
+ "gibtiler",
5094
+ "giren \xE7\u0131kan",
5095
+ "goddamn",
5096
+ "godo\u015F",
5097
+ "godumun",
5098
+ "got",
5099
+ "gotelek",
5100
+ "gotlalesi",
5101
+ "gotlu",
5102
+ "gotten",
5103
+ "gotundeki",
5104
+ "gotunden",
5105
+ "gotune",
5106
+ "gotunu",
5107
+ "gotuze",
5108
+ "gotveren",
5109
+ "goyiim",
5110
+ "goyum",
5111
+ "goyuyim",
5112
+ "goyyim",
5113
+ "gtelek",
5114
+ "gtn",
5115
+ "gtnde",
5116
+ "gtnden",
5117
+ "gtne",
5118
+ "gtten",
5119
+ "gtveren",
5120
+ "guat",
5121
+ "g\xF6t",
5122
+ "g\xF6t deli\u011Fi",
5123
+ "g\xF6t herif",
5124
+ "g\xF6t o\u011Flan\u0131",
5125
+ "g\xF6t veren",
5126
+ "g\xF6t verir",
5127
+ "g\xF6te",
5128
+ "g\xF6telek",
5129
+ "g\xF6tlalesi",
5130
+ "g\xF6tlek",
5131
+ "g\xF6to\u011Flan\u0131",
5132
+ "g\xF6to\u015F",
5133
+ "g\xF6ts\xFCn",
5134
+ "g\xF6ts\xFCn\xFCz",
5135
+ "g\xF6tten",
5136
+ "g\xF6tveren",
5137
+ "g\xF6tvern",
5138
+ "g\xF6t\xFC",
5139
+ "g\xF6t\xFCn",
5140
+ "g\xF6t\xFCne",
5141
+ "g\xF6t\xFCne koyim",
5142
+ "g\xF6t\xFCnekoyim",
5143
+ "g\xF6t\xFCn\xFC",
5144
+ "g\xF6t\xFCn\xFCze",
5145
+ "g\xF6t\xFCyle",
5146
+ "g\xF6\u011F\xFCs",
5147
+ "hack",
5148
+ "han\u0131mlar",
5149
+ "has siktir",
5150
+ "hasiktir",
5151
+ "hasiktr",
5152
+ "hassikome",
5153
+ "hassiktir",
5154
+ "hassittir",
5155
+ "hastir",
5156
+ "haydar",
5157
+ "haysiyetsiz",
5158
+ "hayvan",
5159
+ "hayvan herif",
5160
+ "ha\u015Fgerya",
5161
+ "hile",
5162
+ "hizbullah",
5163
+ "homo",
5164
+ "ho\u015Faf\u0131",
5165
+ "hristiyan",
5166
+ "hsktr",
5167
+ "huur",
5168
+ "hz.muhammed",
5169
+ "hz.\xF6mer",
5170
+ "h\xF6d\xFCk",
5171
+ "h\u0131rs\u0131z",
5172
+ "h\u0131yar",
5173
+ "h\u0131yara\u011Fas\u0131",
5174
+ "i.ne",
5175
+ "ibina",
5176
+ "ibine",
5177
+ "ibinenin",
5178
+ "ibne",
5179
+ "ibnedir",
5180
+ "ibneler",
5181
+ "ibneleri",
5182
+ "ibnelik",
5183
+ "ibneli\u011Fi",
5184
+ "ibnelri",
5185
+ "ibneni",
5186
+ "ibnenin",
5187
+ "ibnerator",
5188
+ "ibnesi",
5189
+ "idiot",
5190
+ "idiyot",
5191
+ "igrenc",
5192
+ "ilk yorum",
5193
+ "imansz",
5194
+ "inci siker",
5195
+ "incisike",
5196
+ "incisiker",
5197
+ "ipne",
5198
+ "ipneler",
5199
+ "irsail",
5200
+ "iserim",
5201
+ "israil",
5202
+ "israli",
5203
+ "israyil",
5204
+ "isra\u0131l",
5205
+ "it",
5206
+ "iti",
5207
+ "itler",
5208
+ "ito\u011Flu it",
5209
+ "izrail",
5210
+ "i\u011Fren\xE7",
5211
+ "i\u015F f\u0131rsat\u0131",
5212
+ "i\u015Ferim",
5213
+ "k.o.c",
5214
+ "k.o.\xE7",
5215
+ "kadek",
5216
+ "kafam girsin",
5217
+ "kafasiz",
5218
+ "kafas\u0131z",
5219
+ "kahpe",
5220
+ "kahpenin",
5221
+ "kahpenin feryad\u0131",
5222
+ "kaka",
5223
+ "kaltak",
5224
+ "kancik",
5225
+ "kanc\u0131k",
5226
+ "kan\u0131",
5227
+ "kan\u0131 bozuk",
5228
+ "kappe",
5229
+ "karhane",
5230
+ "kariyer f\u0131rsat\u0131",
5231
+ "kavat",
5232
+ "kavatn",
5233
+ "kaypak",
5234
+ "kayyum",
5235
+ "kazik",
5236
+ "kazma",
5237
+ "kaz\u0131k",
5238
+ "ka\xE7\u0131rma",
5239
+ "ka\u015Far",
5240
+ "kerane",
5241
+ "kerhane",
5242
+ "kerhanelerde",
5243
+ "keriz",
5244
+ "kerizler",
5245
+ "kevase",
5246
+ "keva\u015Fe",
5247
+ "kevvase",
5248
+ "koca g\xF6t",
5249
+ "kodumun",
5250
+ "kodumunun",
5251
+ "koduumun",
5252
+ "kodu\u011Fmun",
5253
+ "kodu\u011Fmunun",
5254
+ "komonist",
5255
+ "komunist",
5256
+ "komunizm",
5257
+ "kom\xFCnist",
5258
+ "kom\xFCnizm",
5259
+ "kongragel",
5260
+ "kopegi",
5261
+ "kope\u011Fi",
5262
+ "koyarm",
5263
+ "koyay\u0131m",
5264
+ "koyiim",
5265
+ "koyiiym",
5266
+ "koyim",
5267
+ "koyum",
5268
+ "koyyim",
5269
+ "krar",
5270
+ "kro",
5271
+ "kro musunuz",
5272
+ "kromusunuz",
5273
+ "kuku",
5274
+ "kukudaym",
5275
+ "kurdistan",
5276
+ "k\xF6peginin",
5277
+ "k\xF6pekle\u015Fme",
5278
+ "k\xFCrdistan",
5279
+ "k\u0131ro",
5280
+ "k\u0131\xE7",
5281
+ "k\u0131\xE7\u0131n\u0131z",
5282
+ "k\u0131\xE7\u0131n\u0131za",
5283
+ "l.an",
5284
+ "laciye boyad\u0131m",
5285
+ "lan",
5286
+ "lanet",
5287
+ "lann",
5288
+ "lannn",
5289
+ "lavuk",
5290
+ "len",
5291
+ "leyn",
5292
+ "lezle",
5293
+ "lezler",
5294
+ "libo\u015F",
5295
+ "madafaka",
5296
+ "mal",
5297
+ "malafat",
5298
+ "malak",
5299
+ "mallar",
5300
+ "manda",
5301
+ "mankafa",
5302
+ "manyak",
5303
+ "mcik",
5304
+ "meme",
5305
+ "memelerini",
5306
+ "memi\u015F",
5307
+ "mezveleli",
5308
+ "minaamc\u0131k",
5309
+ "mincikliyim",
5310
+ "mk",
5311
+ "mna",
5312
+ "moloz",
5313
+ "monakkoluyum",
5314
+ "moron",
5315
+ "motherfucker",
5316
+ "mudik",
5317
+ "musevi",
5318
+ "musevi bozuk",
5319
+ "m\xFCsl\xFCman",
5320
+ "nah",
5321
+ "o \xE7",
5322
+ "o. \xE7ocu\u011Fu",
5323
+ "o.\xE7",
5324
+ "o.\xE7.",
5325
+ "oc",
5326
+ "ocuu",
5327
+ "ocuun",
5328
+ "odun",
5329
+ "okuz",
5330
+ "oriflame",
5331
+ "orosbu",
5332
+ "orosbucocuu",
5333
+ "orospu",
5334
+ "orospu cocugu",
5335
+ "orospu \xE7oc",
5336
+ "orospu \xE7ocuklar\u0131",
5337
+ "orospu \xE7ocu\u011Fu",
5338
+ "orospu \xE7ocu\u011Fudur",
5339
+ "orospucocugu",
5340
+ "orospudur",
5341
+ "orospular",
5342
+ "orospunun",
5343
+ "orospunun evlad\u0131",
5344
+ "orospuydu",
5345
+ "orospuyuz",
5346
+ "orospu\xE7ocu\u011Fu",
5347
+ "orostoban",
5348
+ "orostopol",
5349
+ "orrospu",
5350
+ "oruc",
5351
+ "oruspu",
5352
+ "oruspu \xE7ocu\u011Fu",
5353
+ "oruspu\xE7ocu\u011Fu",
5354
+ "oru\xE7",
5355
+ "osbir",
5356
+ "ossurduum",
5357
+ "ossurmak",
5358
+ "ossuruk",
5359
+ "osur",
5360
+ "osuram",
5361
+ "osurduu",
5362
+ "osuruk",
5363
+ "osururum",
5364
+ "otusbir",
5365
+ "otuzbir",
5366
+ "oyna",
5367
+ "O\xC7",
5368
+ "o\xE7",
5369
+ "o\xE7.",
5370
+ "o\u011Flan",
5371
+ "o\u011Flanc\u0131",
5372
+ "o\u011Flu it",
5373
+ "p kk",
5374
+ "patlak zar",
5375
+ "penis",
5376
+ "peygamber",
5377
+ "pezevek",
5378
+ "pezeven",
5379
+ "pezeveng",
5380
+ "pezevengi",
5381
+ "pezevengin evlad\u0131",
5382
+ "pezevenk",
5383
+ "pezevenkler",
5384
+ "pezo",
5385
+ "pic",
5386
+ "pici",
5387
+ "picler",
5388
+ "pipi",
5389
+ "pipi\u015F",
5390
+ "pis",
5391
+ "pisliktir",
5392
+ "pi\xE7",
5393
+ "pi\xE7 kurusu",
5394
+ "pi\xE7i",
5395
+ "pi\xE7in o\u011Flu",
5396
+ "pi\xE7inin",
5397
+ "pi\xE7ler",
5398
+ "pi\xE7sin",
5399
+ "pi\xE7siniz",
5400
+ "pkk",
5401
+ "pok",
5402
+ "pokunu",
5403
+ "pompalama",
5404
+ "pompalamak",
5405
+ "porn",
5406
+ "porno",
5407
+ "protesto",
5408
+ "pussy",
5409
+ "putpererst",
5410
+ "putperest",
5411
+ "pu\u015Ft",
5412
+ "pu\u015Fttur",
5413
+ "pvp",
5414
+ "rahminde",
5415
+ "rak",
5416
+ "rak\u0131",
5417
+ "revizyonist",
5418
+ "s.ikerim",
5419
+ "s.iktm",
5420
+ "s.ktir",
5421
+ "s.tir",
5422
+ "s1kerim",
5423
+ "s1kerm",
5424
+ "s1krm",
5425
+ "sahtekar",
5426
+ "sakso",
5427
+ "saksofon",
5428
+ "salaak",
5429
+ "salak",
5430
+ "sana ne",
5431
+ "sanane",
5432
+ "saxo",
5433
+ "sayfa",
5434
+ "sekis",
5435
+ "seks",
5436
+ "serefsiz",
5437
+ "serefsz",
5438
+ "serefszler",
5439
+ "sevgi koyar\u0131m",
5440
+ "sevi\u015F",
5441
+ "sevi\u015Felim",
5442
+ "sevi\u015Fmek",
5443
+ "sex",
5444
+ "sexs",
4715
5445
  "shit",
4716
- "slempen",
4717
- "sletg",
4718
- "sletterig",
4719
- "slik mijn zaad",
4720
- "snolg",
4721
- "spuiten",
4722
- "standje",
4723
- "standje-69g",
4724
- "stoephoer",
4725
- "stootje",
4726
- "strontg",
4727
- "sufferdg",
4728
- "tapijtnek",
4729
- "teefg",
4730
- "temeier",
4731
- "teringlijer",
4732
- "toeter",
4733
- "tongzoeng",
4734
- "triootjeg",
4735
- "trottoir prostitu\xE9e",
4736
- "trottoirteef",
4737
- "vergallen",
4738
- "verkloten",
4739
- "verneuken",
4740
- "viespeuk",
4741
- "vingeren",
4742
- "vleesroos",
4743
- "voor jan lul",
4744
- "voor jan-met-de-korte-achternaam",
4745
- "watje",
4746
- "welzijnsmafia",
4747
- "wijf",
4748
- "wippen",
4749
- "wuftje",
4750
- "zaadje",
4751
- "zakkenwasser",
4752
- "zeiken",
4753
- "zeiker",
4754
- "zuigen",
4755
- "zuiplap"
5446
+ "si.\xE7mak",
5447
+ "sicarsin",
5448
+ "sicmak",
5449
+ "sicti",
5450
+ "sie",
5451
+ "sigara",
5452
+ "sik",
5453
+ "sik k\u0131r\u0131\u011F\u0131",
5454
+ "sikdi",
5455
+ "sikdi\u011Fim",
5456
+ "sike",
5457
+ "sikecem",
5458
+ "sikem",
5459
+ "siken",
5460
+ "sikenin",
5461
+ "siker",
5462
+ "sikerim",
5463
+ "sikerler",
5464
+ "sikersin",
5465
+ "sikert",
5466
+ "sikertir",
5467
+ "sikertirler",
5468
+ "sikertmek",
5469
+ "sikesen",
5470
+ "sikesicenin",
5471
+ "sikey",
5472
+ "sikeydim",
5473
+ "sikeyim",
5474
+ "sikeym",
5475
+ "siki",
5476
+ "sikicem",
5477
+ "sikici",
5478
+ "sikien",
5479
+ "sikienler",
5480
+ "sikiiim",
5481
+ "sikiiimmm",
5482
+ "sikiim",
5483
+ "sikiir",
5484
+ "sikiirken",
5485
+ "sikik",
5486
+ "sikil",
5487
+ "sikildiini",
5488
+ "sikilesice",
5489
+ "sikilmi",
5490
+ "sikilmie",
5491
+ "sikilmis",
5492
+ "sikilmi\u015F",
5493
+ "sikilsin",
5494
+ "sikim",
5495
+ "sikimde",
5496
+ "sikimden",
5497
+ "sikime",
5498
+ "sikimi",
5499
+ "sikimiin",
5500
+ "sikimin",
5501
+ "sikimle",
5502
+ "sikimsonik",
5503
+ "sikimtrak",
5504
+ "sikin",
5505
+ "sikinde",
5506
+ "sikinden",
5507
+ "sikine",
5508
+ "sikini",
5509
+ "sikip",
5510
+ "sikis",
5511
+ "sikisek",
5512
+ "sikisen",
5513
+ "sikish",
5514
+ "sikismis",
5515
+ "sikitiin",
5516
+ "sikiyim",
5517
+ "sikiym",
5518
+ "sikiyorum",
5519
+ "siki\u015F",
5520
+ "siki\u015Fen",
5521
+ "siki\u015Fken",
5522
+ "siki\u015Fme",
5523
+ "siki\u015Fmek",
5524
+ "sikkim",
5525
+ "sikko",
5526
+ "sikleri",
5527
+ "sikleriii",
5528
+ "sikli",
5529
+ "sikm",
5530
+ "sikmek",
5531
+ "sikmem",
5532
+ "sikmeyi",
5533
+ "sikmiler",
5534
+ "sikmisligim",
5535
+ "siksem",
5536
+ "sikseydin",
5537
+ "sikseyidin",
5538
+ "siksin",
5539
+ "siksinbaya",
5540
+ "siksinler",
5541
+ "siksiz",
5542
+ "siksok",
5543
+ "siksz",
5544
+ "sikt",
5545
+ "sikti",
5546
+ "siktigimin",
5547
+ "siktigiminin",
5548
+ "siktii",
5549
+ "siktiim",
5550
+ "siktiimin",
5551
+ "siktiiminin",
5552
+ "siktiler",
5553
+ "siktim",
5554
+ "siktim ",
5555
+ "siktimin",
5556
+ "siktiminin",
5557
+ "siktin",
5558
+ "siktir",
5559
+ "siktir et",
5560
+ "siktir git",
5561
+ "siktir lan",
5562
+ "siktir ol git",
5563
+ "siktirgit",
5564
+ "siktirir",
5565
+ "siktiririm",
5566
+ "siktiriyor",
5567
+ "siktirolgit",
5568
+ "siktirsin",
5569
+ "sikti\u011Fim",
5570
+ "sikti\u011Fimin",
5571
+ "sikti\u011Fiminin",
5572
+ "siktr",
5573
+ "siqem",
5574
+ "sisme",
5575
+ "sittimin",
5576
+ "sittir",
5577
+ "skcem",
5578
+ "skecem",
5579
+ "skem",
5580
+ "sker",
5581
+ "skerim",
5582
+ "skerm",
5583
+ "skeyim",
5584
+ "skiim",
5585
+ "skik",
5586
+ "skim",
5587
+ "skime",
5588
+ "skiym",
5589
+ "skm",
5590
+ "skmek",
5591
+ "skrm",
5592
+ "sksin",
5593
+ "sksn",
5594
+ "sksz",
5595
+ "sktiimin",
5596
+ "sktim",
5597
+ "sktir",
5598
+ "sktirsin",
5599
+ "sktr",
5600
+ "sktroradan",
5601
+ "sktrr",
5602
+ "sktrsn",
5603
+ "skyim",
5604
+ "slaleni",
5605
+ "snane",
5606
+ "sokacak",
5607
+ "sokam",
5608
+ "sokarim",
5609
+ "sokarm",
5610
+ "sokarmkoduumun",
5611
+ "sokar\u0131m",
5612
+ "sokaym",
5613
+ "sokay\u0131m",
5614
+ "sokiim",
5615
+ "soktu\u011Fumunun",
5616
+ "sokuk",
5617
+ "sokum",
5618
+ "sokuyum",
5619
+ "soku\u015F",
5620
+ "soxum",
5621
+ "sperm",
5622
+ "sulaleni",
5623
+ "s\xE7kik",
5624
+ "s\xFClaleni",
5625
+ "s\xFClalenizi",
5626
+ "s\xFCrt\xFCk",
5627
+ "s\xFCt\xFC bozuk",
5628
+ "s\xFCzme",
5629
+ "s\u0131ecem",
5630
+ "s\u0131ker\u0131m",
5631
+ "s\u0131km",
5632
+ "s\u0131kt\u0131r",
5633
+ "s\u0131\xE7ar\u0131m",
5634
+ "s\u0131\xE7mak",
5635
+ "s\u0131\xE7t\u0131\u011F\u0131m",
5636
+ "taaklarn",
5637
+ "taaklarna",
5638
+ "takip",
5639
+ "takip et",
5640
+ "takma",
5641
+ "tarrakimin",
5642
+ "tasak",
5643
+ "tassak",
5644
+ "tayyip",
5645
+ "ta\u015Fak",
5646
+ "ta\u015F\u015Fak",
5647
+ "temas\u0131yla",
5648
+ "teror",
5649
+ "terorist",
5650
+ "ter\xF6r",
5651
+ "ter\xF6rist",
5652
+ "thumb?",
5653
+ "tipini s.k",
5654
+ "tipinizi s.keyim",
5655
+ "tiyniyat",
5656
+ "tokmaklama",
5657
+ "tokmaklamak",
5658
+ "top",
5659
+ "toplarm",
5660
+ "topsun",
5661
+ "toto\u015F",
5662
+ "transeksuel",
5663
+ "transeks\xFCel",
5664
+ "travesti",
5665
+ "ukler",
5666
+ "ulan",
5667
+ "ulen",
5668
+ "ulker",
5669
+ "vagina",
5670
+ "vajina",
5671
+ "vajinan\u0131",
5672
+ "va\u015Fina",
5673
+ "veled",
5674
+ "veled i zina",
5675
+ "veledizina",
5676
+ "verdiimin",
5677
+ "verem",
5678
+ "vodka",
5679
+ "votka",
5680
+ "weled",
5681
+ "weledizina",
5682
+ "whore",
5683
+ "wslik",
5684
+ "wslik server",
5685
+ "xikeyim",
5686
+ "yaaraaa",
5687
+ "yahudi",
5688
+ "yalaka",
5689
+ "yalama",
5690
+ "yalarun",
5691
+ "yalar\u0131m",
5692
+ "yaraaam",
5693
+ "yarak",
5694
+ "yaraks\u0131z",
5695
+ "yaraktr",
5696
+ "yaram",
5697
+ "yaraminbasi",
5698
+ "yaramn",
5699
+ "yararmorospunun",
5700
+ "yark",
5701
+ "yarra",
5702
+ "yarraaaa",
5703
+ "yarraak",
5704
+ "yarraam",
5705
+ "yarraam\u0131",
5706
+ "yarragi",
5707
+ "yarragimi",
5708
+ "yarragina",
5709
+ "yarragindan",
5710
+ "yarragm",
5711
+ "yarraimin",
5712
+ "yarrak",
5713
+ "yarram",
5714
+ "yarramin",
5715
+ "yarraminba\u015F\u0131",
5716
+ "yarramn",
5717
+ "yarram\u0131n",
5718
+ "yarran",
5719
+ "yarrana",
5720
+ "yarra\u011F",
5721
+ "yarra\u011F\u0131m",
5722
+ "yarra\u011F\u0131m\u0131",
5723
+ "yarrk",
5724
+ "yarro",
5725
+ "yarrrak",
5726
+ "yaudi",
5727
+ "yavak",
5728
+ "yavu\u015Fak",
5729
+ "yav\u015F",
5730
+ "yav\u015Fak",
5731
+ "yav\u015Fakt\u0131r",
5732
+ "yav\u015Famak",
5733
+ "ya\u011Fudi",
5734
+ "yilisik",
5735
+ "yogurtlayam",
5736
+ "yosma",
5737
+ "yo\u011Furtlayam",
5738
+ "yrak",
5739
+ "yrk",
5740
+ "yrrak",
5741
+ "y\u0131l\u0131\u015F\u0131k",
5742
+ "zibidi",
5743
+ "zigsin",
5744
+ "zikeyim",
5745
+ "zikiiim",
5746
+ "zikiim",
5747
+ "zikik",
5748
+ "zikim",
5749
+ "ziksiiin",
5750
+ "ziksiin",
5751
+ "zina",
5752
+ "zulliyetini",
5753
+ "zviyetini",
5754
+ "z\u0131kk\u0131m\u0131m",
5755
+ "\xE7al\u0131\u015Fmak istermisiniz?",
5756
+ "\xE7\xFCk",
5757
+ "\xF6k\xFCz",
5758
+ "\xF6l",
5759
+ "\xF6\u015Fex",
5760
+ "\xFCkler",
5761
+ "\xFClker",
5762
+ "\xFClk\xFCc\xFC",
5763
+ "\u0131bnel\u0131k",
5764
+ "\u015Ferefsiz",
5765
+ "\u015Ferefsizler",
5766
+ "\u015Ferefsizlerin",
5767
+ "\u015Ferefsizlik",
5768
+ "\u015Firret",
5769
+ "\u015Fi\u015Fme",
5770
+ "\u015Fi\u015Fme bebek",
5771
+ "\u015Fi\u015Fme kad\u0131n",
5772
+ "\u015Fi\u015Fme manken",
5773
+ "\u015F\u0131ll\u0131k",
5774
+ "\u015F\u0131rf\u0131nt\u0131"
4756
5775
  ]
4757
5776
  };
4758
5777
 
@@ -4922,6 +5941,7 @@ var dictionary_default = {
4922
5941
  chinese: chinese_default.words,
4923
5942
  czech: czech_default.words,
4924
5943
  danish: danish_default.words,
5944
+ dutch: dutch_default.words,
4925
5945
  english: english_default.words,
4926
5946
  esperanto: esperanto_default.words,
4927
5947
  finnish: finnish_default.words,
@@ -5238,47 +6258,614 @@ var ContextAnalyzer = class {
5238
6258
  }
5239
6259
  };
5240
6260
 
6261
+ // src/utils/leetspeak.ts
6262
+ var BASIC_SUBSTITUTIONS = {
6263
+ "0": "o",
6264
+ "1": "i",
6265
+ "3": "e",
6266
+ "4": "a",
6267
+ "5": "s",
6268
+ "7": "t",
6269
+ "8": "b",
6270
+ "9": "g"
6271
+ };
6272
+ var MODERATE_SUBSTITUTIONS = {
6273
+ ...BASIC_SUBSTITUTIONS,
6274
+ "@": "a",
6275
+ "$": "s",
6276
+ "!": "i",
6277
+ "(": "c",
6278
+ "<": "c",
6279
+ "{": "c",
6280
+ "[": "c",
6281
+ "+": "t",
6282
+ "\u20AC": "e",
6283
+ "&": "e",
6284
+ "#": "h",
6285
+ "\xA5": "y",
6286
+ "\xA7": "s",
6287
+ "\u2020": "t",
6288
+ "\xAE": "r",
6289
+ "\xA9": "c",
6290
+ "\xB2": "2",
6291
+ "\xB3": "3"
6292
+ };
6293
+ var AGGRESSIVE_MULTI_CHAR = [
6294
+ // Letter A patterns
6295
+ [/\/\\/g, "a"],
6296
+ [/\/-\\/g, "a"],
6297
+ [/\^/g, "a"],
6298
+ // Letter B patterns
6299
+ [/\|3/g, "b"],
6300
+ [/13/g, "b"],
6301
+ [/ß/g, "b"],
6302
+ // Letter D patterns
6303
+ [/\|\)/g, "d"],
6304
+ [/\|>/g, "d"],
6305
+ [/\[\)/g, "d"],
6306
+ // Letter F patterns
6307
+ [/\|=/g, "f"],
6308
+ [/ph/gi, "f"],
6309
+ // Letter H patterns
6310
+ [/\|-\|/g, "h"],
6311
+ [/\}\{/g, "h"],
6312
+ // Letter K patterns
6313
+ [/\|</g, "k"],
6314
+ [/\|\{/g, "k"],
6315
+ // Letter L patterns
6316
+ [/\|_/g, "l"],
6317
+ // Letter M patterns
6318
+ [/\/\\\/\\/g, "m"],
6319
+ [/\|V\|/g, "m"],
6320
+ [/\[V\]/g, "m"],
6321
+ // Letter N patterns
6322
+ [/\/\\\//g, "n"],
6323
+ [/\|\\\|/g, "n"],
6324
+ // Letter P patterns
6325
+ [/\|\*/g, "p"],
6326
+ [/\|o/g, "p"],
6327
+ // Letter R patterns
6328
+ [/\|2/g, "r"],
6329
+ [/\|\?/g, "r"],
6330
+ // Letter U patterns
6331
+ [/\|_\|/g, "u"],
6332
+ [/\\_\\/g, "u"],
6333
+ [/\/_\//g, "u"],
6334
+ // Letter V patterns
6335
+ [/\\\//g, "v"],
6336
+ // Letter W patterns
6337
+ [/\\\/\\\//g, "w"],
6338
+ [/vv/gi, "w"],
6339
+ // Letter X patterns
6340
+ [/><]/g, "x"],
6341
+ // Letter Y patterns
6342
+ [/'\//g, "y"],
6343
+ // Letter Z patterns
6344
+ [/7_/g, "z"]
6345
+ ];
6346
+ var AGGRESSIVE_SUBSTITUTIONS = {
6347
+ ...MODERATE_SUBSTITUTIONS,
6348
+ "|": "i",
6349
+ "6": "g",
6350
+ "2": "z",
6351
+ "%": "z"
6352
+ };
6353
+ function normalizeLeetspeak(text, options = {}) {
6354
+ const {
6355
+ level = "moderate",
6356
+ collapseRepeated = true,
6357
+ maxRepeated = 2,
6358
+ removeSpacedChars = true
6359
+ } = options;
6360
+ let normalized = text;
6361
+ if (removeSpacedChars) {
6362
+ normalized = collapseSpacedCharacters(normalized);
6363
+ }
6364
+ if (level === "aggressive") {
6365
+ for (const [pattern, replacement] of AGGRESSIVE_MULTI_CHAR) {
6366
+ normalized = normalized.replace(pattern, replacement);
6367
+ }
6368
+ }
6369
+ const substitutions = getSubstitutionMap(level);
6370
+ normalized = normalized.split("").map((char) => substitutions[char] || char).join("");
6371
+ if (collapseRepeated) {
6372
+ normalized = collapseRepeatedCharacters(normalized, maxRepeated);
6373
+ }
6374
+ return normalized;
6375
+ }
6376
+ function getSubstitutionMap(level) {
6377
+ switch (level) {
6378
+ case "basic":
6379
+ return BASIC_SUBSTITUTIONS;
6380
+ case "moderate":
6381
+ return MODERATE_SUBSTITUTIONS;
6382
+ case "aggressive":
6383
+ return AGGRESSIVE_SUBSTITUTIONS;
6384
+ default:
6385
+ return MODERATE_SUBSTITUTIONS;
6386
+ }
6387
+ }
6388
+ function collapseSpacedCharacters(text) {
6389
+ const spacedPattern = /\b([a-zA-Z0-9@$!#])\s+([a-zA-Z0-9@$!#])(\s+[a-zA-Z0-9@$!#])+\b/g;
6390
+ return text.replace(spacedPattern, (match) => {
6391
+ return match.replace(/\s+/g, "");
6392
+ });
6393
+ }
6394
+ function collapseRepeatedCharacters(text, maxRepeated = 2) {
6395
+ const pattern = new RegExp(`(.)\\1{${maxRepeated},}`, "gi");
6396
+ return text.replace(pattern, (match, char) => char.repeat(maxRepeated));
6397
+ }
6398
+ function containsLeetspeak(text) {
6399
+ const leetspeakPatterns = [
6400
+ /[0-9]/,
6401
+ // Contains numbers (potential leetspeak)
6402
+ /[@$!#]/,
6403
+ // Contains common leetspeak symbols
6404
+ /(.)\1{3,}/,
6405
+ // Excessive character repetition
6406
+ /\b[a-zA-Z]\s+[a-zA-Z]\s+[a-zA-Z]\b/
6407
+ // Spaced characters
6408
+ ];
6409
+ return leetspeakPatterns.some((pattern) => pattern.test(text));
6410
+ }
6411
+ function generateLeetspeakVariants(word, level = "moderate") {
6412
+ const variants = /* @__PURE__ */ new Set([word.toLowerCase()]);
6413
+ const substitutions = getSubstitutionMap(level);
6414
+ const reverseMap = {};
6415
+ for (const [leet, normal] of Object.entries(substitutions)) {
6416
+ if (!reverseMap[normal]) {
6417
+ reverseMap[normal] = [];
6418
+ }
6419
+ reverseMap[normal].push(leet);
6420
+ }
6421
+ function generateVariants(current, index) {
6422
+ if (index >= word.length) {
6423
+ variants.add(current);
6424
+ return;
6425
+ }
6426
+ const char = word[index].toLowerCase();
6427
+ generateVariants(current + char, index + 1);
6428
+ if (reverseMap[char]) {
6429
+ for (const leetChar of reverseMap[char]) {
6430
+ generateVariants(current + leetChar, index + 1);
6431
+ }
6432
+ }
6433
+ }
6434
+ if (word.length <= 6) {
6435
+ generateVariants("", 0);
6436
+ }
6437
+ return Array.from(variants);
6438
+ }
6439
+
6440
+ // src/utils/unicode.ts
6441
+ var HOMOGLYPHS = {
6442
+ // Cyrillic homoglyphs (look like Latin)
6443
+ "\u0430": "a",
6444
+ // Cyrillic small a
6445
+ "\u0410": "A",
6446
+ // Cyrillic capital A
6447
+ "\u0435": "e",
6448
+ // Cyrillic small e
6449
+ "\u0415": "E",
6450
+ // Cyrillic capital E
6451
+ "\u043E": "o",
6452
+ // Cyrillic small o
6453
+ "\u041E": "O",
6454
+ // Cyrillic capital O
6455
+ "\u0440": "p",
6456
+ // Cyrillic small er
6457
+ "\u0420": "P",
6458
+ // Cyrillic capital Er
6459
+ "\u0441": "c",
6460
+ // Cyrillic small es
6461
+ "\u0421": "C",
6462
+ // Cyrillic capital Es
6463
+ "\u0443": "y",
6464
+ // Cyrillic small u
6465
+ "\u0423": "Y",
6466
+ // Cyrillic capital U
6467
+ "\u0445": "x",
6468
+ // Cyrillic small ha
6469
+ "\u0425": "X",
6470
+ // Cyrillic capital Ha
6471
+ "\u0456": "i",
6472
+ // Cyrillic small i (Ukrainian)
6473
+ "\u0406": "I",
6474
+ // Cyrillic capital I (Ukrainian)
6475
+ "\u0458": "j",
6476
+ // Cyrillic small je
6477
+ "\u0408": "J",
6478
+ // Cyrillic capital Je
6479
+ "\u0455": "s",
6480
+ // Cyrillic small dze
6481
+ "\u0405": "S",
6482
+ // Cyrillic capital Dze
6483
+ // Greek homoglyphs
6484
+ "\u03B1": "a",
6485
+ // Greek small alpha
6486
+ "\u0391": "A",
6487
+ // Greek capital Alpha
6488
+ "\u03B2": "b",
6489
+ // Greek small beta (sort of)
6490
+ "\u0392": "B",
6491
+ // Greek capital Beta
6492
+ "\u03B5": "e",
6493
+ // Greek small epsilon
6494
+ "\u0395": "E",
6495
+ // Greek capital Epsilon
6496
+ "\u03B7": "n",
6497
+ // Greek small eta
6498
+ "\u0397": "H",
6499
+ // Greek capital Eta
6500
+ "\u03B9": "i",
6501
+ // Greek small iota
6502
+ "\u0399": "I",
6503
+ // Greek capital Iota
6504
+ "\u03BA": "k",
6505
+ // Greek small kappa
6506
+ "\u039A": "K",
6507
+ // Greek capital Kappa
6508
+ "\u03BD": "v",
6509
+ // Greek small nu (looks like v)
6510
+ "\u039D": "N",
6511
+ // Greek capital Nu
6512
+ "\u03BF": "o",
6513
+ // Greek small omicron
6514
+ "\u039F": "O",
6515
+ // Greek capital Omicron
6516
+ "\u03C1": "p",
6517
+ // Greek small rho
6518
+ "\u03A1": "P",
6519
+ // Greek capital Rho
6520
+ "\u03C4": "t",
6521
+ // Greek small tau
6522
+ "\u03A4": "T",
6523
+ // Greek capital Tau
6524
+ "\u03C5": "u",
6525
+ // Greek small upsilon
6526
+ "\u03A5": "Y",
6527
+ // Greek capital Upsilon
6528
+ "\u03C7": "x",
6529
+ // Greek small chi
6530
+ "\u03A7": "X",
6531
+ // Greek capital Chi
6532
+ // Mathematical symbols
6533
+ "\u2102": "C",
6534
+ // Double-struck capital C
6535
+ "\u210D": "H",
6536
+ // Double-struck capital H
6537
+ "\u2115": "N",
6538
+ // Double-struck capital N
6539
+ "\u2119": "P",
6540
+ // Double-struck capital P
6541
+ "\u211A": "Q",
6542
+ // Double-struck capital Q
6543
+ "\u211D": "R",
6544
+ // Double-struck capital R
6545
+ "\u2124": "Z",
6546
+ // Double-struck capital Z
6547
+ // Subscript/superscript
6548
+ "\u1D43": "a",
6549
+ "\u1D47": "b",
6550
+ "\u1D9C": "c",
6551
+ "\u1D48": "d",
6552
+ "\u1D49": "e",
6553
+ "\u1DA0": "f",
6554
+ "\u1D4D": "g",
6555
+ "\u02B0": "h",
6556
+ "\u2071": "i",
6557
+ "\u02B2": "j",
6558
+ "\u1D4F": "k",
6559
+ "\u02E1": "l",
6560
+ "\u1D50": "m",
6561
+ "\u207F": "n",
6562
+ "\u1D52": "o",
6563
+ "\u1D56": "p",
6564
+ "\u02B3": "r",
6565
+ "\u02E2": "s",
6566
+ "\u1D57": "t",
6567
+ "\u1D58": "u",
6568
+ "\u1D5B": "v",
6569
+ "\u02B7": "w",
6570
+ "\u02E3": "x",
6571
+ "\u02B8": "y",
6572
+ "\u1DBB": "z",
6573
+ // Small caps
6574
+ "\u1D00": "A",
6575
+ "\u0299": "B",
6576
+ "\u1D04": "C",
6577
+ "\u1D05": "D",
6578
+ "\u1D07": "E",
6579
+ "\uA730": "F",
6580
+ "\u0262": "G",
6581
+ "\u029C": "H",
6582
+ "\u026A": "I",
6583
+ "\u1D0A": "J",
6584
+ "\u1D0B": "K",
6585
+ "\u029F": "L",
6586
+ "\u1D0D": "M",
6587
+ "\u0274": "N",
6588
+ "\u1D0F": "O",
6589
+ "\u1D18": "P",
6590
+ "\u01EB": "Q",
6591
+ "\u0280": "R",
6592
+ "\uA731": "S",
6593
+ "\u1D1B": "T",
6594
+ "\u1D1C": "U",
6595
+ "\u1D20": "V",
6596
+ "\u1D21": "W",
6597
+ "\u028F": "Y",
6598
+ "\u1D22": "Z",
6599
+ // Other lookalikes
6600
+ "\u24D0": "a",
6601
+ "\u24D1": "b",
6602
+ "\u24D2": "c",
6603
+ "\u24D3": "d",
6604
+ "\u24D4": "e",
6605
+ "\u24D5": "f",
6606
+ "\u24D6": "g",
6607
+ "\u24D7": "h",
6608
+ "\u24D8": "i",
6609
+ "\u24D9": "j",
6610
+ "\u24DA": "k",
6611
+ "\u24DB": "l",
6612
+ "\u24DC": "m",
6613
+ "\u24DD": "n",
6614
+ "\u24DE": "o",
6615
+ "\u24DF": "p",
6616
+ "\u24E0": "q",
6617
+ "\u24E1": "r",
6618
+ "\u24E2": "s",
6619
+ "\u24E3": "t",
6620
+ "\u24E4": "u",
6621
+ "\u24E5": "v",
6622
+ "\u24E6": "w",
6623
+ "\u24E7": "x",
6624
+ "\u24E8": "y",
6625
+ "\u24E9": "z",
6626
+ // Fancy Unicode letters
6627
+ "\uFF41": "a",
6628
+ "\uFF42": "b",
6629
+ "\uFF43": "c",
6630
+ "\uFF44": "d",
6631
+ "\uFF45": "e",
6632
+ "\uFF46": "f",
6633
+ "\uFF47": "g",
6634
+ "\uFF48": "h",
6635
+ "\uFF49": "i",
6636
+ "\uFF4A": "j",
6637
+ "\uFF4B": "k",
6638
+ "\uFF4C": "l",
6639
+ "\uFF4D": "m",
6640
+ "\uFF4E": "n",
6641
+ "\uFF4F": "o",
6642
+ "\uFF50": "p",
6643
+ "\uFF51": "q",
6644
+ "\uFF52": "r",
6645
+ "\uFF53": "s",
6646
+ "\uFF54": "t",
6647
+ "\uFF55": "u",
6648
+ "\uFF56": "v",
6649
+ "\uFF57": "w",
6650
+ "\uFF58": "x",
6651
+ "\uFF59": "y",
6652
+ "\uFF5A": "z",
6653
+ // Mirrored/rotated
6654
+ "\u0250": "a",
6655
+ "\u0254": "c",
6656
+ "\u01DD": "e",
6657
+ "\u025F": "j",
6658
+ "\u0265": "h",
6659
+ "\u026F": "m",
6660
+ "\u0279": "r",
6661
+ "\u0287": "t",
6662
+ "\u028C": "v",
6663
+ "\u028D": "w",
6664
+ // Common lookalikes
6665
+ "\u0142": "l",
6666
+ "\u0141": "L",
6667
+ "\xF8": "o",
6668
+ "\xD8": "O",
6669
+ "\u0111": "d",
6670
+ "\u0110": "D",
6671
+ "\u0127": "h",
6672
+ "\u0126": "H",
6673
+ "\u0131": "i",
6674
+ "\u0130": "I",
6675
+ "\u0138": "k",
6676
+ "\u0140": "l",
6677
+ "\u013F": "L",
6678
+ "\u014B": "n",
6679
+ "\u014A": "N",
6680
+ "\u0153": "oe",
6681
+ "\u0152": "OE",
6682
+ "\u017F": "s",
6683
+ "\u0167": "t",
6684
+ "\u0166": "T"
6685
+ };
6686
+ var ZERO_WIDTH_CHARS = [
6687
+ "\u200B",
6688
+ // Zero-width space
6689
+ "\u200C",
6690
+ // Zero-width non-joiner
6691
+ "\u200D",
6692
+ // Zero-width joiner
6693
+ "\u200E",
6694
+ // Left-to-right mark
6695
+ "\u200F",
6696
+ // Right-to-left mark
6697
+ "\u2060",
6698
+ // Word joiner
6699
+ "\u2061",
6700
+ // Function application
6701
+ "\u2062",
6702
+ // Invisible times
6703
+ "\u2063",
6704
+ // Invisible separator
6705
+ "\u2064",
6706
+ // Invisible plus
6707
+ "\uFEFF",
6708
+ // Byte order mark / zero-width no-break space
6709
+ "\xAD",
6710
+ // Soft hyphen
6711
+ "\u034F",
6712
+ // Combining grapheme joiner
6713
+ "\u061C",
6714
+ // Arabic letter mark
6715
+ "\u115F",
6716
+ // Hangul choseong filler
6717
+ "\u1160",
6718
+ // Hangul jungseong filler
6719
+ "\u17B4",
6720
+ // Khmer vowel inherent Aq
6721
+ "\u17B5",
6722
+ // Khmer vowel inherent Aa
6723
+ "\u180E",
6724
+ // Mongolian vowel separator
6725
+ "\u3164"
6726
+ // Hangul filler
6727
+ ];
6728
+ function normalizeUnicode(text, options = {}) {
6729
+ const {
6730
+ nfkd = true,
6731
+ homoglyphs = true,
6732
+ fullWidth = true,
6733
+ removeDiacritics = true,
6734
+ removeZeroWidth = true
6735
+ } = options;
6736
+ let normalized = text;
6737
+ if (removeZeroWidth) {
6738
+ normalized = removeZeroWidthCharacters(normalized);
6739
+ }
6740
+ if (fullWidth) {
6741
+ normalized = convertFullWidth(normalized);
6742
+ }
6743
+ if (homoglyphs) {
6744
+ normalized = convertHomoglyphs(normalized);
6745
+ }
6746
+ if (nfkd || removeDiacritics) {
6747
+ normalized = normalizeNFKD(normalized, removeDiacritics);
6748
+ }
6749
+ return normalized;
6750
+ }
6751
+ function removeZeroWidthCharacters(text) {
6752
+ const pattern = new RegExp(`[${ZERO_WIDTH_CHARS.join("")}]`, "g");
6753
+ return text.replace(pattern, "");
6754
+ }
6755
+ function convertFullWidth(text) {
6756
+ return text.replace(/[\uFF01-\uFF5E]/g, (char) => {
6757
+ return String.fromCharCode(char.charCodeAt(0) - 65248);
6758
+ });
6759
+ }
6760
+ function convertHomoglyphs(text) {
6761
+ return text.split("").map((char) => HOMOGLYPHS[char] || char).join("");
6762
+ }
6763
+ function normalizeNFKD(text, removeDiacritics = true) {
6764
+ let normalized = text.normalize("NFKD");
6765
+ if (removeDiacritics) {
6766
+ normalized = normalized.replace(/[\u0300-\u036f]/g, "");
6767
+ }
6768
+ return normalized;
6769
+ }
6770
+ function containsUnicodeObfuscation(text) {
6771
+ const zeroWidthPattern = new RegExp(`[${ZERO_WIDTH_CHARS.join("")}]`);
6772
+ if (zeroWidthPattern.test(text)) return true;
6773
+ if (/[\uFF01-\uFF5E]/.test(text)) return true;
6774
+ for (const char of text) {
6775
+ if (HOMOGLYPHS[char]) return true;
6776
+ }
6777
+ if (/[\u0300-\u036f]/.test(text)) return true;
6778
+ if (text !== text.normalize("NFKD")) return true;
6779
+ return false;
6780
+ }
6781
+ function detectCharacterSets(text) {
6782
+ const hasLatin = /[a-zA-Z]/.test(text);
6783
+ const hasCyrillic = /[\u0400-\u04FF]/.test(text);
6784
+ const hasGreek = /[\u0370-\u03FF]/.test(text);
6785
+ const hasFullWidth = /[\uFF01-\uFF5E]/.test(text);
6786
+ const scriptCount = [hasLatin, hasCyrillic, hasGreek, hasFullWidth].filter(Boolean).length;
6787
+ return {
6788
+ hasLatin,
6789
+ hasCyrillic,
6790
+ hasGreek,
6791
+ hasFullWidth,
6792
+ hasMixed: scriptCount > 1
6793
+ };
6794
+ }
6795
+
5241
6796
  // src/filters/Filter.ts
5242
6797
  var Filter = class {
6798
+ /**
6799
+ * Creates a new Filter instance with the specified configuration.
6800
+ *
6801
+ * @param config - Filter configuration options
6802
+ *
6803
+ * @example
6804
+ * ```typescript
6805
+ * // Basic usage
6806
+ * const filter = new Filter({ languages: ['english'] });
6807
+ *
6808
+ * // With leetspeak detection
6809
+ * const filter = new Filter({
6810
+ * languages: ['english'],
6811
+ * detectLeetspeak: true,
6812
+ * leetspeakLevel: 'moderate',
6813
+ * });
6814
+ *
6815
+ * // With all advanced features
6816
+ * const filter = new Filter({
6817
+ * languages: ['english', 'spanish'],
6818
+ * detectLeetspeak: true,
6819
+ * normalizeUnicode: true,
6820
+ * cacheResults: true,
6821
+ * enableContextAware: true,
6822
+ * });
6823
+ * ```
6824
+ */
5243
6825
  constructor(config) {
5244
- var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l;
5245
6826
  const defaultLanguage = "english";
5246
- this.enableContextAware = (_a = config == null ? void 0 : config.enableContextAware) != null ? _a : false;
5247
- this.contextWindow = (_b = config == null ? void 0 : config.contextWindow) != null ? _b : 3;
5248
- this.confidenceThreshold = (_c = config == null ? void 0 : config.confidenceThreshold) != null ? _c : 0.7;
5249
- this.primaryLanguage = ((_d = config == null ? void 0 : config.languages) == null ? void 0 : _d[0]) || defaultLanguage;
6827
+ this.enableContextAware = config?.enableContextAware ?? false;
6828
+ this.contextWindow = config?.contextWindow ?? 3;
6829
+ this.confidenceThreshold = config?.confidenceThreshold ?? 0.7;
6830
+ this.primaryLanguage = config?.languages?.[0] || defaultLanguage;
5250
6831
  if (this.enableContextAware) {
5251
6832
  this.contextAnalyzer = new ContextAnalyzer({
5252
6833
  contextWindow: this.contextWindow,
5253
6834
  language: this.primaryLanguage,
5254
- domainWhitelists: ((_e = config == null ? void 0 : config.domainWhitelists) == null ? void 0 : _e[this.primaryLanguage]) || []
6835
+ domainWhitelists: config?.domainWhitelists?.[this.primaryLanguage] || []
5255
6836
  });
5256
6837
  }
5257
- let words = [];
5258
- this.caseSensitive = (_f = config == null ? void 0 : config.caseSensitive) != null ? _f : false;
5259
- this.allowObfuscatedMatch = (_g = config == null ? void 0 : config.allowObfuscatedMatch) != null ? _g : false;
5260
- this.wordBoundaries = (_h = config == null ? void 0 : config.wordBoundaries) != null ? _h : !this.allowObfuscatedMatch;
5261
- this.replaceWith = config == null ? void 0 : config.replaceWith;
5262
- this.severityLevels = (_i = config == null ? void 0 : config.severityLevels) != null ? _i : false;
6838
+ this.caseSensitive = config?.caseSensitive ?? false;
6839
+ this.allowObfuscatedMatch = config?.allowObfuscatedMatch ?? false;
6840
+ this.wordBoundaries = config?.wordBoundaries ?? !this.allowObfuscatedMatch;
6841
+ this.replaceWith = config?.replaceWith;
6842
+ this.severityLevels = config?.severityLevels ?? false;
5263
6843
  this.ignoreWords = new Set(
5264
- ((_j = config == null ? void 0 : config.ignoreWords) == null ? void 0 : _j.map((word) => word.toLowerCase())) || []
6844
+ config?.ignoreWords?.map((word) => word.toLowerCase()) || []
5265
6845
  );
5266
- this.logProfanity = (_k = config == null ? void 0 : config.logProfanity) != null ? _k : false;
5267
- this.fuzzyToleranceLevel = (_l = config == null ? void 0 : config.fuzzyToleranceLevel) != null ? _l : 0.8;
5268
- if (config == null ? void 0 : config.allLanguages) {
6846
+ this.logProfanity = config?.logProfanity ?? false;
6847
+ this.fuzzyToleranceLevel = config?.fuzzyToleranceLevel ?? 0.8;
6848
+ this.detectLeetspeak = config?.detectLeetspeak ?? false;
6849
+ this.leetspeakLevel = config?.leetspeakLevel ?? "moderate";
6850
+ this.normalizeUnicodeEnabled = config?.normalizeUnicode ?? true;
6851
+ this.cacheResults = config?.cacheResults ?? false;
6852
+ this.maxCacheSize = config?.maxCacheSize ?? 1e3;
6853
+ this.cache = /* @__PURE__ */ new Map();
6854
+ let words = [];
6855
+ if (config?.allLanguages) {
5269
6856
  for (const lang in dictionary_default) {
5270
6857
  if (Object.prototype.hasOwnProperty.call(dictionary_default, lang)) {
5271
6858
  words = [...words, ...dictionary_default[lang]];
5272
6859
  }
5273
6860
  }
5274
6861
  } else {
5275
- const languages = (config == null ? void 0 : config.languages) || ["english"];
6862
+ const languages = config?.languages || ["english"];
5276
6863
  const languagesChecks = new Set(languages);
5277
6864
  languagesChecks.forEach((lang) => {
5278
6865
  words = [...words, ...dictionary_default[lang]];
5279
6866
  });
5280
6867
  }
5281
- if (config == null ? void 0 : config.customWords) {
6868
+ if (config?.customWords) {
5282
6869
  words = [...words, ...config.customWords];
5283
6870
  }
5284
6871
  this.words = new Map(words.map((word) => [word.toLowerCase(), 1]));
@@ -5288,6 +6875,34 @@ var Filter = class {
5288
6875
  console.log("[glin-profanity]", ...args);
5289
6876
  }
5290
6877
  }
6878
+ /**
6879
+ * Normalizes text for profanity detection using all enabled normalization methods.
6880
+ * Applies Unicode normalization, leetspeak detection, and obfuscation handling.
6881
+ *
6882
+ * @param text - The input text to normalize
6883
+ * @returns The normalized text
6884
+ */
6885
+ normalizeText(text) {
6886
+ let normalized = text;
6887
+ if (this.normalizeUnicodeEnabled) {
6888
+ normalized = normalizeUnicode(normalized);
6889
+ }
6890
+ if (this.detectLeetspeak) {
6891
+ normalized = normalizeLeetspeak(normalized, {
6892
+ level: this.leetspeakLevel,
6893
+ collapseRepeated: true,
6894
+ removeSpacedChars: true
6895
+ });
6896
+ }
6897
+ if (this.allowObfuscatedMatch && !this.detectLeetspeak) {
6898
+ normalized = this.normalizeObfuscated(normalized);
6899
+ }
6900
+ return normalized;
6901
+ }
6902
+ /**
6903
+ * Legacy obfuscation normalization method (for backward compatibility).
6904
+ * @deprecated Use normalizeText() with detectLeetspeak option instead.
6905
+ */
5291
6906
  normalizeObfuscated(text) {
5292
6907
  let normalized = text.replace(/([a-zA-Z])\1{1,}/g, "$1$1");
5293
6908
  const charMap = {
@@ -5300,6 +6915,92 @@ var Filter = class {
5300
6915
  normalized = normalized.replace(/[@$!1*]/g, (m) => charMap[m] || m);
5301
6916
  return normalized;
5302
6917
  }
6918
+ /**
6919
+ * Clears the result cache.
6920
+ * Useful when dictionary or configuration changes.
6921
+ */
6922
+ clearCache() {
6923
+ this.cache.clear();
6924
+ }
6925
+ /**
6926
+ * Gets the current cache size.
6927
+ * @returns Number of cached results
6928
+ */
6929
+ getCacheSize() {
6930
+ return this.cache.size;
6931
+ }
6932
+ /**
6933
+ * Exports the current filter configuration as a JSON-serializable object.
6934
+ * Useful for saving configuration to files or sharing between environments.
6935
+ *
6936
+ * @returns The current filter configuration
6937
+ *
6938
+ * @example
6939
+ * ```typescript
6940
+ * const filter = new Filter({
6941
+ * languages: ['english', 'spanish'],
6942
+ * detectLeetspeak: true,
6943
+ * leetspeakLevel: 'aggressive',
6944
+ * });
6945
+ *
6946
+ * const config = filter.getConfig();
6947
+ * // Save to file: fs.writeFileSync('filter.config.json', JSON.stringify(config));
6948
+ *
6949
+ * // Later, restore:
6950
+ * // const saved = JSON.parse(fs.readFileSync('filter.config.json'));
6951
+ * // const restored = new Filter(saved);
6952
+ * ```
6953
+ */
6954
+ getConfig() {
6955
+ return {
6956
+ languages: [this.primaryLanguage],
6957
+ caseSensitive: this.caseSensitive,
6958
+ wordBoundaries: this.wordBoundaries,
6959
+ replaceWith: this.replaceWith,
6960
+ severityLevels: this.severityLevels,
6961
+ ignoreWords: Array.from(this.ignoreWords),
6962
+ logProfanity: this.logProfanity,
6963
+ allowObfuscatedMatch: this.allowObfuscatedMatch,
6964
+ fuzzyToleranceLevel: this.fuzzyToleranceLevel,
6965
+ enableContextAware: this.enableContextAware,
6966
+ contextWindow: this.contextWindow,
6967
+ confidenceThreshold: this.confidenceThreshold,
6968
+ detectLeetspeak: this.detectLeetspeak,
6969
+ leetspeakLevel: this.leetspeakLevel,
6970
+ normalizeUnicode: this.normalizeUnicodeEnabled,
6971
+ cacheResults: this.cacheResults,
6972
+ maxCacheSize: this.maxCacheSize
6973
+ };
6974
+ }
6975
+ /**
6976
+ * Returns the current word dictionary size.
6977
+ * Useful for monitoring and debugging.
6978
+ *
6979
+ * @returns Number of words in the dictionary
6980
+ */
6981
+ getWordCount() {
6982
+ return this.words.size;
6983
+ }
6984
+ /**
6985
+ * Adds a result to the cache, evicting oldest entries if necessary.
6986
+ */
6987
+ addToCache(key, result) {
6988
+ if (!this.cacheResults) return;
6989
+ if (this.cache.size >= this.maxCacheSize) {
6990
+ const firstKey = this.cache.keys().next().value;
6991
+ if (firstKey) {
6992
+ this.cache.delete(firstKey);
6993
+ }
6994
+ }
6995
+ this.cache.set(key, result);
6996
+ }
6997
+ /**
6998
+ * Gets a cached result if available.
6999
+ */
7000
+ getFromCache(key) {
7001
+ if (!this.cacheResults) return void 0;
7002
+ return this.cache.get(key);
7003
+ }
5303
7004
  getRegex(word) {
5304
7005
  const flags = this.caseSensitive ? "g" : "gi";
5305
7006
  const escapedWord = word.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
@@ -5329,8 +7030,24 @@ var Filter = class {
5329
7030
  if (this.isFuzzyToleranceMatch(word, text)) return 2 /* FUZZY */;
5330
7031
  return void 0;
5331
7032
  }
7033
+ /**
7034
+ * Checks if the given text contains profanity.
7035
+ *
7036
+ * @param value - The text to check
7037
+ * @returns True if the text contains profanity
7038
+ *
7039
+ * @example
7040
+ * ```typescript
7041
+ * const filter = new Filter({ detectLeetspeak: true });
7042
+ *
7043
+ * filter.isProfane('hello'); // false
7044
+ * filter.isProfane('fuck'); // true
7045
+ * filter.isProfane('f4ck'); // true (leetspeak)
7046
+ * filter.isProfane('fυck'); // true (Unicode homoglyph)
7047
+ * ```
7048
+ */
5332
7049
  isProfane(value) {
5333
- const input = this.allowObfuscatedMatch ? this.normalizeObfuscated(value) : value;
7050
+ const input = this.normalizeText(value);
5334
7051
  for (const word of this.words.keys()) {
5335
7052
  if (!this.ignoreWords.has(word.toLowerCase()) && this.evaluateSeverity(word, input) !== void 0) {
5336
7053
  return true;
@@ -5341,9 +7058,39 @@ var Filter = class {
5341
7058
  matches(word) {
5342
7059
  return this.isProfane(word);
5343
7060
  }
7061
+ /**
7062
+ * Performs a comprehensive profanity check on the given text.
7063
+ *
7064
+ * @param text - The text to check for profanity
7065
+ * @returns Result object containing detected profanity information
7066
+ *
7067
+ * @example
7068
+ * ```typescript
7069
+ * const filter = new Filter({
7070
+ * languages: ['english'],
7071
+ * detectLeetspeak: true,
7072
+ * normalizeUnicode: true,
7073
+ * });
7074
+ *
7075
+ * const result = filter.checkProfanity('This is f4ck!ng bad');
7076
+ * console.log(result.containsProfanity); // true
7077
+ * console.log(result.profaneWords); // ['fuck']
7078
+ *
7079
+ * // With caching for repeated checks
7080
+ * const filter2 = new Filter({ cacheResults: true });
7081
+ * filter2.checkProfanity('same text'); // Computed
7082
+ * filter2.checkProfanity('same text'); // Retrieved from cache
7083
+ * ```
7084
+ */
5344
7085
  checkProfanity(text) {
7086
+ const cacheKey = text;
7087
+ const cachedResult = this.getFromCache(cacheKey);
7088
+ if (cachedResult) {
7089
+ this.debugLog("Cache hit for:", text.substring(0, 50));
7090
+ return cachedResult;
7091
+ }
5345
7092
  if (!this.enableContextAware) {
5346
- let input2 = this.allowObfuscatedMatch ? this.normalizeObfuscated(text) : text;
7093
+ let input2 = this.normalizeText(text);
5347
7094
  input2 = input2.toLowerCase();
5348
7095
  const profaneWords2 = [];
5349
7096
  const severityMap2 = {};
@@ -5373,14 +7120,16 @@ var Filter = class {
5373
7120
  );
5374
7121
  }
5375
7122
  }
5376
- return {
7123
+ const result2 = {
5377
7124
  containsProfanity: profaneWords2.length > 0,
5378
7125
  profaneWords: Array.from(new Set(profaneWords2)),
5379
7126
  processedText: this.replaceWith ? processedText2 : void 0,
5380
7127
  severityMap: this.severityLevels && Object.keys(severityMap2).length > 0 ? severityMap2 : void 0
5381
7128
  };
7129
+ this.addToCache(cacheKey, result2);
7130
+ return result2;
5382
7131
  }
5383
- let input = this.allowObfuscatedMatch ? this.normalizeObfuscated(text) : text;
7132
+ let input = this.normalizeText(text);
5384
7133
  input = input.toLowerCase();
5385
7134
  const originalText = text;
5386
7135
  const profaneWords = [];
@@ -5441,7 +7190,7 @@ var Filter = class {
5441
7190
  const totalScore = matches.reduce((sum, match) => sum + (match.contextScore || 0.5), 0);
5442
7191
  contextScore = totalScore / matches.length;
5443
7192
  }
5444
- return {
7193
+ const result = {
5445
7194
  containsProfanity: profaneWords.length > 0,
5446
7195
  profaneWords: Array.from(new Set(profaneWords)),
5447
7196
  processedText: this.replaceWith ? processedText : void 0,
@@ -5450,12 +7199,20 @@ var Filter = class {
5450
7199
  contextScore,
5451
7200
  reason: matches.length > 0 ? `Found ${matches.length} potential profanity matches` : "No profanity detected"
5452
7201
  };
7202
+ this.addToCache(cacheKey, result);
7203
+ return result;
5453
7204
  }
7205
+ /**
7206
+ * Checks profanity with minimum severity filtering.
7207
+ *
7208
+ * @param text - The text to check
7209
+ * @param minSeverity - Minimum severity level to include in results
7210
+ * @returns Object with filtered words and full result
7211
+ */
5454
7212
  checkProfanityWithMinSeverity(text, minSeverity = 1 /* EXACT */) {
5455
7213
  const result = this.checkProfanity(text);
5456
7214
  const filteredWords = result.severityMap && result.profaneWords.length > 0 ? result.profaneWords.filter((word) => {
5457
- var _a;
5458
- const severity = (_a = result.severityMap) == null ? void 0 : _a[word];
7215
+ const severity = result.severityMap?.[word];
5459
7216
  return typeof severity === "number" && severity >= minSeverity;
5460
7217
  }) : [];
5461
7218
  return { filteredWords, result };
@@ -5497,11 +7254,14 @@ var globalWhitelist_default = {
5497
7254
 
5498
7255
  // src/core/index.ts
5499
7256
  function createFilterConfig(config) {
5500
- var _a;
5501
- const effective = __spreadProps(__spreadValues({}, config != null ? config : {}), {
5502
- ignoreWords: globalWhitelist_default.whitelist,
5503
- fuzzyToleranceLevel: (_a = config == null ? void 0 : config.fuzzyToleranceLevel) != null ? _a : 0.8
5504
- });
7257
+ const effective = {
7258
+ ...config ?? {},
7259
+ ignoreWords: [
7260
+ ...globalWhitelist_default.whitelist,
7261
+ ...config?.ignoreWords ?? []
7262
+ ],
7263
+ fuzzyToleranceLevel: config?.fuzzyToleranceLevel ?? 0.8
7264
+ };
5505
7265
  if (effective.allowObfuscatedMatch && effective.wordBoundaries) {
5506
7266
  console.warn(
5507
7267
  "[Glin-Profanity] Obfuscated match enabled \u2192 wordBoundaries will be ignored internally."
@@ -5510,24 +7270,22 @@ function createFilterConfig(config) {
5510
7270
  return effective;
5511
7271
  }
5512
7272
  function checkProfanity(text, config) {
5513
- var _a;
5514
7273
  const filterConfig = createFilterConfig(config);
5515
7274
  const filter = new Filter(filterConfig);
5516
7275
  const checkResult = filter.checkProfanity(text);
5517
- const filteredWords = (config == null ? void 0 : config.minSeverity) && checkResult.severityMap ? checkResult.profaneWords.filter(
7276
+ const filteredWords = config?.minSeverity && checkResult.severityMap ? checkResult.profaneWords.filter(
5518
7277
  (word) => checkResult.severityMap && checkResult.severityMap[word] >= config.minSeverity
5519
7278
  ) : checkResult.profaneWords;
5520
- const autoReplaced = (config == null ? void 0 : config.autoReplace) && checkResult.processedText ? checkResult.processedText : text;
5521
- (_a = config == null ? void 0 : config.customActions) == null ? void 0 : _a.call(config, checkResult);
5522
- return __spreadProps(__spreadValues({}, checkResult), {
7279
+ const autoReplaced = config?.autoReplace && checkResult.processedText ? checkResult.processedText : text;
7280
+ config?.customActions?.(checkResult);
7281
+ return {
7282
+ ...checkResult,
5523
7283
  filteredWords,
5524
7284
  autoReplaced
5525
- });
7285
+ };
5526
7286
  }
5527
- function checkProfanityAsync(text, config) {
5528
- return __async(this, null, function* () {
5529
- return Promise.resolve(checkProfanity(text, config));
5530
- });
7287
+ async function checkProfanityAsync(text, config) {
7288
+ return Promise.resolve(checkProfanity(text, config));
5531
7289
  }
5532
7290
  function isWordProfane(word, config) {
5533
7291
  return checkProfanity(word, config).containsProfanity;
@@ -5536,18 +7294,17 @@ function isWordProfane(word, config) {
5536
7294
  // src/hooks/useProfanityChecker.ts
5537
7295
  var import_react = __toESM(require_react(), 1);
5538
7296
  var useProfanityChecker = (config) => {
5539
- var _a;
5540
7297
  const [result, setResult] = (0, import_react.useState)(null);
5541
7298
  const checkText = (0, import_react.useCallback)((text) => {
5542
7299
  const checkResult = checkProfanity(text, config);
5543
7300
  setResult(checkResult);
5544
7301
  return checkResult;
5545
7302
  }, [config]);
5546
- const checkTextAsync = (0, import_react.useCallback)((text) => __async(null, null, function* () {
5547
- const checkResult = yield checkProfanityAsync(text, config);
7303
+ const checkTextAsync = (0, import_react.useCallback)(async (text) => {
7304
+ const checkResult = await checkProfanityAsync(text, config);
5548
7305
  setResult(checkResult);
5549
7306
  return checkResult;
5550
- }), [config]);
7307
+ }, [config]);
5551
7308
  const isWordProfaneCallback = (0, import_react.useCallback)((word) => {
5552
7309
  return isWordProfane(word, config);
5553
7310
  }, [config]);
@@ -5557,7 +7314,7 @@ var useProfanityChecker = (config) => {
5557
7314
  checkText,
5558
7315
  checkTextAsync,
5559
7316
  reset,
5560
- isDirty: (_a = result == null ? void 0 : result.containsProfanity) != null ? _a : false,
7317
+ isDirty: result?.containsProfanity ?? false,
5561
7318
  isWordProfane: isWordProfaneCallback
5562
7319
  };
5563
7320
  };
@@ -5568,7 +7325,19 @@ var useProfanityChecker = (config) => {
5568
7325
  SeverityLevel,
5569
7326
  checkProfanity,
5570
7327
  checkProfanityAsync,
7328
+ collapseRepeatedCharacters,
7329
+ collapseSpacedCharacters,
7330
+ containsLeetspeak,
7331
+ containsUnicodeObfuscation,
7332
+ convertFullWidth,
7333
+ convertHomoglyphs,
7334
+ detectCharacterSets,
7335
+ generateLeetspeakVariants,
5571
7336
  isWordProfane,
7337
+ normalizeLeetspeak,
7338
+ normalizeNFKD,
7339
+ normalizeUnicode,
7340
+ removeZeroWidthCharacters,
5572
7341
  useProfanityChecker
5573
7342
  });
5574
7343
  /*! Bundled license information: