@sideid/id-profanity-filter 1.11.6 → 1.11.8
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.d.ts +2 -2
- package/dist/index.esm.js +1345 -455
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +1345 -455
- package/dist/index.js.map +1 -1
- package/dist/types/config/options.d.ts +1 -1
- package/dist/types/constants/categories/blasphemy.d.ts +1 -1
- package/dist/types/constants/categories/disgusting.d.ts +1 -1
- package/dist/types/constants/categories/drugs.d.ts +1 -1
- package/dist/types/constants/categories/insult.d.ts +1 -1
- package/dist/types/constants/categories/profanity.d.ts +1 -1
- package/dist/types/constants/categories/sexual.d.ts +1 -1
- package/dist/types/constants/categories/slur.d.ts +1 -1
- package/dist/types/constants/regions/bali.d.ts +1 -1
- package/dist/types/constants/regions/batak.d.ts +1 -1
- package/dist/types/constants/regions/betawi.d.ts +1 -1
- package/dist/types/constants/regions/general.d.ts +1 -1
- package/dist/types/constants/regions/madura.d.ts +4 -0
- package/dist/types/constants/regions/minang.d.ts +4 -0
- package/dist/types/constants/regions/sunda.d.ts +1 -1
- package/dist/types/constants/wordList.d.ts +10 -1
- package/dist/types/core/analyzer.d.ts +1 -1
- package/dist/types/core/filter.d.ts +1 -1
- package/dist/types/core/matcher.d.ts +1 -1
- package/dist/types/types/index.d.ts +2 -2
- package/dist/types/utils/regexUtils.d.ts +1 -1
- package/package.json +1 -1
- package/src/config/options.ts +25 -30
- package/src/constants/categories/blasphemy.ts +26 -15
- package/src/constants/categories/disgusting.ts +62 -54
- package/src/constants/categories/drugs.ts +56 -47
- package/src/constants/categories/insult.ts +80 -76
- package/src/constants/categories/profanity.ts +98 -92
- package/src/constants/categories/sexual.ts +74 -65
- package/src/constants/categories/slur.ts +73 -66
- package/src/constants/regions/aceh.ts +5 -174
- package/src/constants/regions/bali.ts +4 -137
- package/src/constants/regions/batak.ts +5 -9
- package/src/constants/regions/betawi.ts +19 -22
- package/src/constants/regions/general.ts +140 -144
- package/src/constants/regions/jawa.ts +11 -29
- package/src/constants/regions/madura.ts +57 -0
- package/src/constants/regions/minang.ts +53 -0
- package/src/constants/regions/sunda.ts +343 -19
- package/src/constants/wordList.ts +31 -34
- package/src/core/analyzer.ts +15 -26
- package/src/core/filter.ts +23 -39
- package/src/core/matcher.ts +25 -49
- package/src/index.ts +5 -16
- package/src/types/index.ts +26 -25
- package/src/utils/ahoCorasick.ts +1 -1
- package/src/utils/regexUtils.ts +37 -43
- package/src/utils/similarityUtils.ts +13 -28
- package/src/utils/stringUtils.ts +30 -38
- /package/{prettierrc → .prettierrc} +0 -0
package/dist/index.esm.js
CHANGED
|
@@ -1,211 +1,211 @@
|
|
|
1
1
|
const general = [
|
|
2
2
|
{
|
|
3
|
-
word:
|
|
4
|
-
category:
|
|
5
|
-
region:
|
|
3
|
+
word: 'anjing',
|
|
4
|
+
category: 'profanity',
|
|
5
|
+
region: 'general',
|
|
6
6
|
severity: 0.7,
|
|
7
|
-
aliases: [
|
|
8
|
-
description:
|
|
9
|
-
context:
|
|
7
|
+
aliases: ['anjay', 'anjir', 'anying', 'njing', 'anj', 'anjg', 'ajg'],
|
|
8
|
+
description: 'Mengacu pada hewan anjing, digunakan sebagai umpatan',
|
|
9
|
+
context: 'Umpatan umum untuk menunjukkan kemarahan atau ketidaksetujuan',
|
|
10
10
|
},
|
|
11
11
|
{
|
|
12
|
-
word:
|
|
13
|
-
category:
|
|
14
|
-
region:
|
|
12
|
+
word: 'babi',
|
|
13
|
+
category: 'profanity',
|
|
14
|
+
region: 'general',
|
|
15
15
|
severity: 0.6,
|
|
16
|
-
aliases: [
|
|
17
|
-
description:
|
|
18
|
-
context:
|
|
16
|
+
aliases: ['bab1', 'b4b1', 'b4bi', '8481', '8ab1', 'ba81'],
|
|
17
|
+
description: 'Mengacu pada hewan babi, digunakan sebagai umpatan',
|
|
18
|
+
context: 'Umpatan umum untuk menunjukkan kemarahan atau ketidaksetujuan',
|
|
19
19
|
},
|
|
20
20
|
{
|
|
21
|
-
word:
|
|
22
|
-
category:
|
|
23
|
-
region:
|
|
21
|
+
word: 'bangsat',
|
|
22
|
+
category: 'insult',
|
|
23
|
+
region: 'general',
|
|
24
24
|
severity: 0.8,
|
|
25
|
-
aliases: [
|
|
26
|
-
description:
|
|
27
|
-
context:
|
|
25
|
+
aliases: ['bangst', 'bngst', 'bgst'],
|
|
26
|
+
description: 'Secara harfiah berarti kutu busuk, digunakan sebagai umpatan untuk menyebut seseorang yang tidak bermoral',
|
|
27
|
+
context: 'Umpatan kasar untuk menyebut orang yang dianggap jahat atau merugikan',
|
|
28
28
|
},
|
|
29
29
|
{
|
|
30
|
-
word:
|
|
31
|
-
category:
|
|
32
|
-
region:
|
|
30
|
+
word: 'kontol',
|
|
31
|
+
category: 'sexual',
|
|
32
|
+
region: 'general',
|
|
33
33
|
severity: 0.9,
|
|
34
|
-
aliases: [
|
|
35
|
-
description:
|
|
36
|
-
context:
|
|
34
|
+
aliases: ['kntl', 'k0ntol', 'k0nt0l'],
|
|
35
|
+
description: 'Kata vulgar yang mengacu pada alat kelamin laki-laki',
|
|
36
|
+
context: 'Umpatan kasar atau istilah vulgar untuk alat kelamin',
|
|
37
37
|
},
|
|
38
38
|
{
|
|
39
|
-
word:
|
|
40
|
-
category:
|
|
41
|
-
region:
|
|
39
|
+
word: 'memek',
|
|
40
|
+
category: 'sexual',
|
|
41
|
+
region: 'general',
|
|
42
42
|
severity: 0.9,
|
|
43
|
-
aliases: [
|
|
44
|
-
description:
|
|
45
|
-
context:
|
|
43
|
+
aliases: ['mmk', 'memk'],
|
|
44
|
+
description: 'Kata vulgar yang mengacu pada alat kelamin perempuan',
|
|
45
|
+
context: 'Umpatan kasar atau istilah vulgar untuk alat kelamin',
|
|
46
46
|
},
|
|
47
47
|
{
|
|
48
|
-
word:
|
|
49
|
-
category:
|
|
50
|
-
region:
|
|
48
|
+
word: 'bego',
|
|
49
|
+
category: 'insult',
|
|
50
|
+
region: 'general',
|
|
51
51
|
severity: 0.5,
|
|
52
|
-
aliases: [
|
|
53
|
-
description:
|
|
54
|
-
context:
|
|
52
|
+
aliases: ['bgo', 'begok'],
|
|
53
|
+
description: 'Kata yang mengacu pada kebodohan seseorang',
|
|
54
|
+
context: 'Hinaan untuk menyebut orang yang dianggap tidak pintar',
|
|
55
55
|
},
|
|
56
56
|
{
|
|
57
|
-
word:
|
|
58
|
-
category:
|
|
59
|
-
region:
|
|
57
|
+
word: 'tolol',
|
|
58
|
+
category: 'insult',
|
|
59
|
+
region: 'general',
|
|
60
60
|
severity: 0.6,
|
|
61
|
-
aliases: [
|
|
62
|
-
description:
|
|
63
|
-
context:
|
|
61
|
+
aliases: ['tll', 'tlol'],
|
|
62
|
+
description: 'Kata yang mengacu pada kebodohan seseorang',
|
|
63
|
+
context: 'Hinaan untuk menyebut orang yang dianggap tidak pintar',
|
|
64
64
|
},
|
|
65
65
|
{
|
|
66
|
-
word:
|
|
67
|
-
category:
|
|
68
|
-
region:
|
|
66
|
+
word: 'bajingan',
|
|
67
|
+
category: 'insult',
|
|
68
|
+
region: 'general',
|
|
69
69
|
severity: 0.7,
|
|
70
|
-
aliases: [
|
|
71
|
-
description:
|
|
72
|
-
context:
|
|
70
|
+
aliases: ['bajingn', 'bjgn'],
|
|
71
|
+
description: 'Kata yang mengacu pada orang jahat atau tidak bermoral',
|
|
72
|
+
context: 'Hinaan untuk menyebut orang yang dianggap jahat atau tidak bermoral',
|
|
73
73
|
},
|
|
74
74
|
{
|
|
75
|
-
word:
|
|
76
|
-
category:
|
|
77
|
-
region:
|
|
75
|
+
word: 'goblok',
|
|
76
|
+
category: 'insult',
|
|
77
|
+
region: 'general',
|
|
78
78
|
severity: 0.6,
|
|
79
|
-
aliases: [
|
|
80
|
-
description:
|
|
81
|
-
context:
|
|
79
|
+
aliases: ['gblk', 'goblk'],
|
|
80
|
+
description: 'Kata yang mengacu pada kebodohan seseorang',
|
|
81
|
+
context: 'Hinaan untuk menyebut orang yang dianggap tidak pintar',
|
|
82
82
|
},
|
|
83
83
|
{
|
|
84
|
-
word:
|
|
85
|
-
category:
|
|
86
|
-
region:
|
|
84
|
+
word: 'keparat',
|
|
85
|
+
category: 'insult',
|
|
86
|
+
region: 'general',
|
|
87
87
|
severity: 0.7,
|
|
88
|
-
aliases: [
|
|
89
|
-
description:
|
|
90
|
-
context:
|
|
88
|
+
aliases: ['kprt', 'keprat'],
|
|
89
|
+
description: 'Kata yang mengacu pada orang jahat atau tidak bermoral',
|
|
90
|
+
context: 'Hinaan untuk menyebut orang yang dianggap jahat atau tidak bermoral',
|
|
91
91
|
},
|
|
92
92
|
{
|
|
93
|
-
word:
|
|
94
|
-
category:
|
|
95
|
-
region:
|
|
93
|
+
word: 'bacot',
|
|
94
|
+
category: 'insult',
|
|
95
|
+
region: 'general',
|
|
96
96
|
severity: 0.5,
|
|
97
|
-
aliases: [
|
|
98
|
-
description:
|
|
99
|
-
context:
|
|
97
|
+
aliases: ['bcot', 'bacot2'],
|
|
98
|
+
description: 'Kata yang mengacu pada orang yang banyak bicara',
|
|
99
|
+
context: 'Hinaan untuk menyebut orang yang banyak bicara atau cerewet',
|
|
100
100
|
},
|
|
101
101
|
{
|
|
102
|
-
word:
|
|
103
|
-
category:
|
|
104
|
-
region:
|
|
102
|
+
word: 'ngentot',
|
|
103
|
+
category: 'sexual',
|
|
104
|
+
region: 'general',
|
|
105
105
|
severity: 0.9,
|
|
106
|
-
aliases: [
|
|
107
|
-
description:
|
|
108
|
-
context:
|
|
106
|
+
aliases: ['ngentod', 'ntot', 'tod'],
|
|
107
|
+
description: 'Istilah kasar untuk aktivitas seksual',
|
|
108
|
+
context: 'Kata vulgar yang merujuk pada aktivitas seksual',
|
|
109
109
|
},
|
|
110
110
|
{
|
|
111
|
-
word:
|
|
112
|
-
category:
|
|
113
|
-
region:
|
|
111
|
+
word: 'sialan',
|
|
112
|
+
category: 'insult',
|
|
113
|
+
region: 'general',
|
|
114
114
|
severity: 0.5,
|
|
115
|
-
aliases: [
|
|
116
|
-
description:
|
|
117
|
-
context:
|
|
115
|
+
aliases: ['sialn', 'sl'],
|
|
116
|
+
description: 'Kata yang mengacu pada orang yang membawa sial',
|
|
117
|
+
context: 'Hinaan untuk menyebut orang yang dianggap membawa sial',
|
|
118
118
|
},
|
|
119
119
|
{
|
|
120
|
-
word:
|
|
121
|
-
category:
|
|
122
|
-
region:
|
|
120
|
+
word: 'pler',
|
|
121
|
+
category: 'sexual',
|
|
122
|
+
region: 'general',
|
|
123
123
|
severity: 0.9,
|
|
124
|
-
aliases: [
|
|
125
|
-
description:
|
|
126
|
-
context:
|
|
124
|
+
aliases: ['peler', 'plr', 'biji'],
|
|
125
|
+
description: 'Istilah kasar untuk alat kelamin laki-laki',
|
|
126
|
+
context: 'Kata vulgar yang merujuk pada alat kelamin laki-laki',
|
|
127
127
|
},
|
|
128
128
|
{
|
|
129
|
-
word:
|
|
130
|
-
category:
|
|
131
|
-
region:
|
|
129
|
+
word: 'bokep',
|
|
130
|
+
category: 'sexual',
|
|
131
|
+
region: 'general',
|
|
132
132
|
severity: 0.7,
|
|
133
|
-
aliases: [
|
|
134
|
-
description:
|
|
135
|
-
context:
|
|
133
|
+
aliases: ['bkp', 'bokap'],
|
|
134
|
+
description: 'Istilah untuk video atau konten pornografi',
|
|
135
|
+
context: 'Kata yang mengacu pada materi pornografi',
|
|
136
136
|
},
|
|
137
137
|
{
|
|
138
|
-
word:
|
|
139
|
-
category:
|
|
140
|
-
region:
|
|
138
|
+
word: 'coli',
|
|
139
|
+
category: 'sexual',
|
|
140
|
+
region: 'general',
|
|
141
141
|
severity: 0.8,
|
|
142
|
-
aliases: [
|
|
143
|
-
description:
|
|
144
|
-
context:
|
|
142
|
+
aliases: ['col', 'coly'],
|
|
143
|
+
description: 'Istilah untuk masturbasi laki-laki',
|
|
144
|
+
context: 'Kata vulgar yang merujuk pada aktivitas seksual pribadi',
|
|
145
145
|
},
|
|
146
146
|
{
|
|
147
|
-
word:
|
|
148
|
-
category:
|
|
149
|
-
region:
|
|
147
|
+
word: 'desah',
|
|
148
|
+
category: 'sexual',
|
|
149
|
+
region: 'general',
|
|
150
150
|
severity: 0.6,
|
|
151
|
-
aliases: [
|
|
152
|
-
description:
|
|
153
|
-
context:
|
|
151
|
+
aliases: ['ds4h', 'dsh'],
|
|
152
|
+
description: 'Istilah untuk suara yang dibuat selama aktivitas seksual',
|
|
153
|
+
context: 'Dapat menjadi vulgar tergantung konteks penggunaan',
|
|
154
154
|
},
|
|
155
155
|
{
|
|
156
|
-
word:
|
|
157
|
-
category:
|
|
158
|
-
region:
|
|
156
|
+
word: 'seks',
|
|
157
|
+
category: 'sexual',
|
|
158
|
+
region: 'general',
|
|
159
159
|
severity: 0.5,
|
|
160
|
-
aliases: [
|
|
161
|
-
description:
|
|
162
|
-
context:
|
|
160
|
+
aliases: ['sex', 'ML'],
|
|
161
|
+
description: 'Istilah untuk aktivitas seksual',
|
|
162
|
+
context: 'Dapat menjadi vulgar tergantung konteks penggunaan',
|
|
163
163
|
},
|
|
164
164
|
{
|
|
165
|
-
word:
|
|
166
|
-
category:
|
|
167
|
-
region:
|
|
165
|
+
word: 'kondom',
|
|
166
|
+
category: 'sexual',
|
|
167
|
+
region: 'general',
|
|
168
168
|
severity: 0.5,
|
|
169
|
-
aliases: [
|
|
170
|
-
description:
|
|
171
|
-
context:
|
|
169
|
+
aliases: ['kndm', 'kondom', 'cd'],
|
|
170
|
+
description: 'Alat kontrasepsi',
|
|
171
|
+
context: 'Dapat menjadi vulgar tergantung konteks penggunaan',
|
|
172
172
|
},
|
|
173
173
|
{
|
|
174
|
-
word:
|
|
175
|
-
category:
|
|
176
|
-
region:
|
|
174
|
+
word: 'ngewe',
|
|
175
|
+
category: 'sexual',
|
|
176
|
+
region: 'general',
|
|
177
177
|
severity: 0.9,
|
|
178
|
-
aliases: [
|
|
179
|
-
description:
|
|
180
|
-
context:
|
|
178
|
+
aliases: ['ngew', 'we'],
|
|
179
|
+
description: 'Istilah kasar untuk aktivitas seksual',
|
|
180
|
+
context: 'Kata vulgar yang merujuk pada aktivitas seksual',
|
|
181
181
|
},
|
|
182
182
|
{
|
|
183
|
-
word:
|
|
184
|
-
category:
|
|
185
|
-
region:
|
|
183
|
+
word: 'puki',
|
|
184
|
+
category: 'sexual',
|
|
185
|
+
region: 'general',
|
|
186
186
|
severity: 0.9,
|
|
187
|
-
aliases: [
|
|
188
|
-
description:
|
|
189
|
-
context:
|
|
187
|
+
aliases: ['puk', 'pukih'],
|
|
188
|
+
description: 'Kata vulgar yang mengacu pada alat kelamin perempuan',
|
|
189
|
+
context: 'Kata vulgar yang merujuk pada anatomi seksual',
|
|
190
190
|
},
|
|
191
191
|
{
|
|
192
|
-
word:
|
|
193
|
-
category:
|
|
194
|
-
region:
|
|
192
|
+
word: 'xxx',
|
|
193
|
+
category: 'sexual',
|
|
194
|
+
region: 'general',
|
|
195
195
|
severity: 0.6,
|
|
196
|
-
aliases: [
|
|
197
|
-
description:
|
|
198
|
-
context:
|
|
196
|
+
aliases: ['xXx', 'triplex'],
|
|
197
|
+
description: 'Simbol yang sering digunakan untuk menandai konten pornografi',
|
|
198
|
+
context: 'Digunakan untuk menandai konten seksual eksplisit',
|
|
199
199
|
},
|
|
200
200
|
{
|
|
201
|
-
word:
|
|
202
|
-
category:
|
|
203
|
-
region:
|
|
201
|
+
word: 'xnxx',
|
|
202
|
+
category: 'sexual',
|
|
203
|
+
region: 'general',
|
|
204
204
|
severity: 0.6,
|
|
205
|
-
aliases: [
|
|
206
|
-
description:
|
|
207
|
-
context:
|
|
208
|
-
}
|
|
205
|
+
aliases: ['xnxx', 'xnx'],
|
|
206
|
+
description: 'simbol yang sering digunakan untuk menandai konten pornografi',
|
|
207
|
+
context: 'Digunakan untuk menandai konten seksual eksplisit',
|
|
208
|
+
},
|
|
209
209
|
];
|
|
210
210
|
general.map((item) => item.word);
|
|
211
211
|
|
|
@@ -359,15 +359,7 @@ const jawa = [
|
|
|
359
359
|
category: 'insult',
|
|
360
360
|
region: 'jawa',
|
|
361
361
|
severity: 0.7,
|
|
362
|
-
aliases: [
|
|
363
|
-
'bajilak',
|
|
364
|
-
'bajhingan',
|
|
365
|
-
'bajingak',
|
|
366
|
-
'bajingseng',
|
|
367
|
-
'bajindul',
|
|
368
|
-
'bajigur',
|
|
369
|
-
'jingan',
|
|
370
|
-
],
|
|
362
|
+
aliases: ['bajilak', 'bajhingan', 'bajingak', 'bajingseng', 'bajindul', 'bajigur', 'jingan'],
|
|
371
363
|
description: 'Sebutan untuk orang yang dianggap jahat atau tidak bermoral',
|
|
372
364
|
context: 'Umpatan untuk mengekspresikan kemarahan atau kekesalan',
|
|
373
365
|
},
|
|
@@ -691,252 +683,576 @@ jawa.map((item) => item.word);
|
|
|
691
683
|
|
|
692
684
|
const sunda = [
|
|
693
685
|
{
|
|
694
|
-
word:
|
|
695
|
-
category:
|
|
696
|
-
region:
|
|
686
|
+
word: 'bagong',
|
|
687
|
+
category: 'insult',
|
|
688
|
+
region: 'sunda',
|
|
697
689
|
severity: 0.5,
|
|
698
|
-
aliases: [
|
|
699
|
-
description:
|
|
700
|
-
context:
|
|
690
|
+
aliases: ['bagog'],
|
|
691
|
+
description: 'Secara harfiah berarti babi hutan, digunakan sebagai hinaan',
|
|
692
|
+
context: 'Hinaan untuk menyebut orang yang dianggap jorok atau rakus',
|
|
701
693
|
},
|
|
702
694
|
{
|
|
703
|
-
word:
|
|
704
|
-
category:
|
|
705
|
-
region:
|
|
695
|
+
word: 'belegug',
|
|
696
|
+
category: 'insult',
|
|
697
|
+
region: 'sunda',
|
|
706
698
|
severity: 0.5,
|
|
707
|
-
aliases: [
|
|
708
|
-
description:
|
|
709
|
-
context:
|
|
699
|
+
aliases: ['belecuk', 'beledog'],
|
|
700
|
+
description: 'Kata yang mengacu pada kebodohan seseorang',
|
|
701
|
+
context: 'Hinaan untuk menyebut orang yang dianggap tidak pintar',
|
|
710
702
|
},
|
|
711
703
|
{
|
|
712
|
-
word:
|
|
713
|
-
category:
|
|
714
|
-
region:
|
|
704
|
+
word: 'goblog',
|
|
705
|
+
category: 'insult',
|
|
706
|
+
region: 'sunda',
|
|
715
707
|
severity: 0.6,
|
|
716
|
-
aliases: [
|
|
717
|
-
description:
|
|
718
|
-
context:
|
|
708
|
+
aliases: ['goblok', 'golbok'],
|
|
709
|
+
description: 'Kata yang mengacu pada kebodohan seseorang',
|
|
710
|
+
context: 'Hinaan untuk menyebut orang yang dianggap tidak pintar',
|
|
711
|
+
},
|
|
712
|
+
{
|
|
713
|
+
word: 'aing',
|
|
714
|
+
category: 'insult',
|
|
715
|
+
region: 'sunda',
|
|
716
|
+
severity: 0.3,
|
|
717
|
+
aliases: [],
|
|
718
|
+
description: 'Kata ganti orang pertama yang kasar',
|
|
719
|
+
context: 'Digunakan saat berbicara dengan teman dekat, tapi termasuk kasar',
|
|
720
|
+
},
|
|
721
|
+
{
|
|
722
|
+
word: 'sia',
|
|
723
|
+
category: 'insult',
|
|
724
|
+
region: 'sunda',
|
|
725
|
+
severity: 0.3,
|
|
726
|
+
aliases: ['silaing'],
|
|
727
|
+
description: 'Kata ganti orang kedua yang kasar',
|
|
728
|
+
context: "Digunakan sebagai pengganti 'kamu' dalam bentuk kasar",
|
|
729
|
+
},
|
|
730
|
+
{
|
|
731
|
+
word: 'anjing',
|
|
732
|
+
category: 'profanity',
|
|
733
|
+
region: 'sunda',
|
|
734
|
+
severity: 0.8,
|
|
735
|
+
aliases: ['anying'],
|
|
736
|
+
description: 'Kata umpatan yang sangat umum',
|
|
737
|
+
context: 'Digunakan dalam berbagai konteks: marah, kaget, bahkan kagum',
|
|
738
|
+
},
|
|
739
|
+
{
|
|
740
|
+
word: 'anjir',
|
|
741
|
+
category: 'profanity',
|
|
742
|
+
region: 'sunda',
|
|
743
|
+
severity: 0.6,
|
|
744
|
+
aliases: [],
|
|
745
|
+
description: 'Turunan dari kata anjing yang lebih halus',
|
|
746
|
+
context: 'Digunakan saat kesal, marah, terpesona',
|
|
747
|
+
},
|
|
748
|
+
{
|
|
749
|
+
word: 'kehed',
|
|
750
|
+
category: 'insult',
|
|
751
|
+
region: 'sunda',
|
|
752
|
+
severity: 0.6,
|
|
753
|
+
aliases: [],
|
|
754
|
+
description: 'Sialan',
|
|
755
|
+
context: 'Digunakan sebagai ungkapan kekesalan',
|
|
719
756
|
},
|
|
720
|
-
];
|
|
721
|
-
sunda.map((item) => item.word);
|
|
722
|
-
|
|
723
|
-
const betawi = [
|
|
724
757
|
{
|
|
725
|
-
word:
|
|
726
|
-
category:
|
|
727
|
-
region:
|
|
758
|
+
word: 'modar',
|
|
759
|
+
category: 'profanity',
|
|
760
|
+
region: 'sunda',
|
|
728
761
|
severity: 0.7,
|
|
729
|
-
aliases: [
|
|
730
|
-
description: '
|
|
731
|
-
context:
|
|
762
|
+
aliases: [],
|
|
763
|
+
description: 'Secara harfiah berarti mati',
|
|
764
|
+
context: 'Digunakan sebagai ungkapan kemarahan atau ancaman',
|
|
765
|
+
},
|
|
766
|
+
{
|
|
767
|
+
word: 'koplok',
|
|
768
|
+
category: 'insult',
|
|
769
|
+
region: 'sunda',
|
|
770
|
+
severity: 0.6,
|
|
771
|
+
aliases: [],
|
|
772
|
+
description: 'Setara dengan kata goblok',
|
|
773
|
+
context: 'Digunakan sebagai kata umpatan untuk menyebut orang bodoh',
|
|
732
774
|
},
|
|
733
775
|
{
|
|
734
|
-
word:
|
|
735
|
-
category:
|
|
736
|
-
region:
|
|
776
|
+
word: 'beungeut',
|
|
777
|
+
category: 'insult',
|
|
778
|
+
region: 'sunda',
|
|
737
779
|
severity: 0.5,
|
|
738
|
-
aliases: [
|
|
739
|
-
description:
|
|
740
|
-
context:
|
|
780
|
+
aliases: [],
|
|
781
|
+
description: 'Kata kasar untuk muka/wajah',
|
|
782
|
+
context: 'Digunakan untuk menghina wajah seseorang',
|
|
741
783
|
},
|
|
742
784
|
{
|
|
743
|
-
word:
|
|
744
|
-
category:
|
|
745
|
-
region:
|
|
746
|
-
severity: 0.
|
|
747
|
-
aliases: [
|
|
748
|
-
description:
|
|
749
|
-
context: "
|
|
785
|
+
word: 'lebok',
|
|
786
|
+
category: 'insult',
|
|
787
|
+
region: 'sunda',
|
|
788
|
+
severity: 0.5,
|
|
789
|
+
aliases: [],
|
|
790
|
+
description: 'Kata kasar untuk makan',
|
|
791
|
+
context: "Digunakan dalam konteks 'rasakan' atau 'makan tuh'",
|
|
750
792
|
},
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
{
|
|
760
|
-
word: "bokep",
|
|
761
|
-
category: "sexual",
|
|
762
|
-
region: "general",
|
|
763
|
-
severity: 0.7,
|
|
764
|
-
aliases: ["bkp", "bokap"],
|
|
765
|
-
description: "Istilah untuk video atau konten pornografi",
|
|
766
|
-
context: "Kata yang mengacu pada materi pornografi",
|
|
793
|
+
{
|
|
794
|
+
word: 'ontohod',
|
|
795
|
+
category: 'insult',
|
|
796
|
+
region: 'sunda',
|
|
797
|
+
severity: 0.5,
|
|
798
|
+
aliases: [],
|
|
799
|
+
description: 'Kata yang mengacu pada kebodohan seseorang',
|
|
800
|
+
context: 'Populer dari cerita Kabayan sebagai ungkapan untuk orang bodoh',
|
|
767
801
|
},
|
|
768
802
|
{
|
|
769
|
-
word:
|
|
770
|
-
category:
|
|
771
|
-
region:
|
|
772
|
-
severity: 0.
|
|
773
|
-
aliases: [
|
|
774
|
-
description: "
|
|
775
|
-
context:
|
|
803
|
+
word: 'ngajedog',
|
|
804
|
+
category: 'insult',
|
|
805
|
+
region: 'sunda',
|
|
806
|
+
severity: 0.4,
|
|
807
|
+
aliases: [],
|
|
808
|
+
description: "Bentuk kasar dari 'diam'",
|
|
809
|
+
context: 'Digunakan untuk menyuruh seseorang diam dengan kasar',
|
|
810
|
+
},
|
|
811
|
+
{
|
|
812
|
+
word: 'halik',
|
|
813
|
+
category: 'insult',
|
|
814
|
+
region: 'sunda',
|
|
815
|
+
severity: 0.5,
|
|
816
|
+
aliases: [],
|
|
817
|
+
description: "Bentuk kasar dari 'awas'",
|
|
818
|
+
context: 'Digunakan untuk menggertak atau mengusir orang',
|
|
819
|
+
},
|
|
820
|
+
{
|
|
821
|
+
word: 'sungut',
|
|
822
|
+
category: 'insult',
|
|
823
|
+
region: 'sunda',
|
|
824
|
+
severity: 0.5,
|
|
825
|
+
aliases: ['babangus'],
|
|
826
|
+
description: 'Kata kasar untuk mulut',
|
|
827
|
+
context: 'Digunakan untuk menghina cara bicara seseorang',
|
|
776
828
|
},
|
|
777
829
|
{
|
|
778
|
-
word:
|
|
779
|
-
category:
|
|
780
|
-
region:
|
|
830
|
+
word: 'belekok',
|
|
831
|
+
category: 'insult',
|
|
832
|
+
region: 'sunda',
|
|
833
|
+
severity: 0.5,
|
|
834
|
+
aliases: [],
|
|
835
|
+
description: 'Kata yang mengacu pada kebodohan seseorang',
|
|
836
|
+
context: 'Serupa dengan belegug atau goblok',
|
|
837
|
+
},
|
|
838
|
+
{
|
|
839
|
+
word: 'boloho',
|
|
840
|
+
category: 'insult',
|
|
841
|
+
region: 'sunda',
|
|
842
|
+
severity: 0.4,
|
|
843
|
+
aliases: [],
|
|
844
|
+
description: 'Kata yang mengacu pada kebodohan seseorang',
|
|
845
|
+
context: 'Versi lebih halus dari kata bodoh',
|
|
846
|
+
},
|
|
847
|
+
{
|
|
848
|
+
word: 'bebel',
|
|
849
|
+
category: 'insult',
|
|
850
|
+
region: 'sunda',
|
|
851
|
+
severity: 0.5,
|
|
852
|
+
aliases: [],
|
|
853
|
+
description: 'Setara dengan kehed',
|
|
854
|
+
context: 'Digunakan untuk mengekspresikan kekesalan',
|
|
855
|
+
},
|
|
856
|
+
{
|
|
857
|
+
word: 'hakan',
|
|
858
|
+
category: 'insult',
|
|
859
|
+
region: 'sunda',
|
|
860
|
+
severity: 0.5,
|
|
861
|
+
aliases: [],
|
|
862
|
+
description: 'Kata kasar untuk makan',
|
|
863
|
+
context: "Digunakan dalam konteks 'rasakan' atau 'makan tuh'",
|
|
864
|
+
},
|
|
865
|
+
{
|
|
866
|
+
word: 'bagoy',
|
|
867
|
+
category: 'insult',
|
|
868
|
+
region: 'sunda',
|
|
869
|
+
severity: 0.5,
|
|
870
|
+
aliases: [],
|
|
871
|
+
description: 'Turunan dari kata Bagong',
|
|
872
|
+
context: 'Umum digunakan di Priangan Barat seperti Cianjur dan Sukabumi',
|
|
873
|
+
},
|
|
874
|
+
{
|
|
875
|
+
word: 'pehul',
|
|
876
|
+
category: 'insult',
|
|
877
|
+
region: 'sunda',
|
|
781
878
|
severity: 0.6,
|
|
782
|
-
aliases: [
|
|
783
|
-
description: "
|
|
784
|
-
context:
|
|
879
|
+
aliases: ['peot hulu'],
|
|
880
|
+
description: "Akronim dari 'peot hulu', menghina seseorang tidak punya otak",
|
|
881
|
+
context: 'Digunakan untuk menghina kecerdasan seseorang',
|
|
785
882
|
},
|
|
786
883
|
{
|
|
787
|
-
word:
|
|
788
|
-
category:
|
|
789
|
-
region:
|
|
884
|
+
word: 'pamatuk',
|
|
885
|
+
category: 'insult',
|
|
886
|
+
region: 'sunda',
|
|
790
887
|
severity: 0.5,
|
|
791
|
-
aliases: [
|
|
792
|
-
description:
|
|
793
|
-
context:
|
|
888
|
+
aliases: [],
|
|
889
|
+
description: 'Paruh pada unggas',
|
|
890
|
+
context: 'Digunakan untuk mengumpat orang yang banyak bicara',
|
|
794
891
|
},
|
|
795
892
|
{
|
|
796
|
-
word:
|
|
797
|
-
category:
|
|
798
|
-
region:
|
|
893
|
+
word: 'itil',
|
|
894
|
+
category: 'sexual',
|
|
895
|
+
region: 'sunda',
|
|
799
896
|
severity: 0.9,
|
|
800
|
-
aliases: [
|
|
801
|
-
description:
|
|
802
|
-
context:
|
|
897
|
+
aliases: [],
|
|
898
|
+
description: 'Kata sangat kasar untuk alat kelamin perempuan',
|
|
899
|
+
context: 'Kata vulgar yang sangat tabu',
|
|
803
900
|
},
|
|
804
901
|
{
|
|
805
|
-
word:
|
|
806
|
-
category:
|
|
807
|
-
region:
|
|
902
|
+
word: 'nyingkah',
|
|
903
|
+
category: 'insult',
|
|
904
|
+
region: 'sunda',
|
|
808
905
|
severity: 0.5,
|
|
809
|
-
aliases: [
|
|
810
|
-
description:
|
|
811
|
-
context:
|
|
906
|
+
aliases: [],
|
|
907
|
+
description: 'Cara kasar untuk menyuruh pergi',
|
|
908
|
+
context: 'Digunakan untuk mengusir orang',
|
|
812
909
|
},
|
|
813
910
|
{
|
|
814
|
-
word:
|
|
815
|
-
category:
|
|
816
|
-
region:
|
|
817
|
-
severity: 0.
|
|
818
|
-
aliases: [
|
|
819
|
-
description:
|
|
820
|
-
context:
|
|
911
|
+
word: 'mantog',
|
|
912
|
+
category: 'insult',
|
|
913
|
+
region: 'sunda',
|
|
914
|
+
severity: 0.4,
|
|
915
|
+
aliases: [],
|
|
916
|
+
description: 'Kata kasar untuk pulang',
|
|
917
|
+
context: 'Biasanya diucapkan orang tua kepada anak yang tak kunjung pulang',
|
|
821
918
|
},
|
|
822
919
|
{
|
|
823
|
-
word:
|
|
824
|
-
category:
|
|
825
|
-
region:
|
|
826
|
-
severity: 0.
|
|
827
|
-
aliases: [
|
|
828
|
-
description:
|
|
829
|
-
context:
|
|
920
|
+
word: 'cungur',
|
|
921
|
+
category: 'insult',
|
|
922
|
+
region: 'sunda',
|
|
923
|
+
severity: 0.6,
|
|
924
|
+
aliases: [],
|
|
925
|
+
description: 'Kata kasar untuk mulut',
|
|
926
|
+
context: 'Digunakan untuk menghina cara bicara seseorang',
|
|
830
927
|
},
|
|
831
928
|
{
|
|
832
|
-
word:
|
|
833
|
-
category:
|
|
834
|
-
region:
|
|
929
|
+
word: 'bangkawarah',
|
|
930
|
+
category: 'insult',
|
|
931
|
+
region: 'sunda',
|
|
835
932
|
severity: 0.6,
|
|
836
|
-
aliases: [
|
|
837
|
-
description:
|
|
838
|
-
context:
|
|
933
|
+
aliases: ['si bangkawarah'],
|
|
934
|
+
description: 'Sebutan untuk orang yang nakal keterlaluan',
|
|
935
|
+
context: 'Menunjukkan orang yang tidak mendapat pendidikan baik',
|
|
839
936
|
},
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
...general.filter((word) => word.category === "insult"),
|
|
845
|
-
...jawa.filter((word) => word.category === "insult"),
|
|
846
|
-
...sunda.filter((word) => word.category === "insult"),
|
|
847
|
-
...betawi.filter((word) => word.category === "insult"),
|
|
848
|
-
{
|
|
849
|
-
word: "idiot",
|
|
850
|
-
category: "insult",
|
|
851
|
-
region: "general",
|
|
937
|
+
{
|
|
938
|
+
word: 'bolokotondo',
|
|
939
|
+
category: 'insult',
|
|
940
|
+
region: 'sunda',
|
|
852
941
|
severity: 0.6,
|
|
853
|
-
aliases: [
|
|
854
|
-
description:
|
|
855
|
-
context: "
|
|
942
|
+
aliases: [],
|
|
943
|
+
description: 'Kutu, dipakai sebagai kata kasar',
|
|
944
|
+
context: "Seperti 'bangsat' dalam bahasa Indonesia",
|
|
856
945
|
},
|
|
857
946
|
{
|
|
858
|
-
word:
|
|
859
|
-
category:
|
|
860
|
-
region:
|
|
947
|
+
word: 'babatok',
|
|
948
|
+
category: 'insult',
|
|
949
|
+
region: 'sunda',
|
|
861
950
|
severity: 0.5,
|
|
862
|
-
aliases: [
|
|
863
|
-
description:
|
|
864
|
-
context:
|
|
951
|
+
aliases: [],
|
|
952
|
+
description: 'Tempurung kepala',
|
|
953
|
+
context: 'Digunakan untuk menghina kecerdasan seseorang',
|
|
865
954
|
},
|
|
866
955
|
{
|
|
867
|
-
word:
|
|
868
|
-
category:
|
|
869
|
-
region:
|
|
956
|
+
word: 'polo',
|
|
957
|
+
category: 'insult',
|
|
958
|
+
region: 'sunda',
|
|
870
959
|
severity: 0.6,
|
|
871
|
-
aliases: [
|
|
872
|
-
description:
|
|
873
|
-
context:
|
|
960
|
+
aliases: [],
|
|
961
|
+
description: 'Otak secara fisik',
|
|
962
|
+
context: 'Dikatakan untuk isi kepala binatang, kasar jika untuk manusia',
|
|
874
963
|
},
|
|
875
964
|
{
|
|
876
|
-
word:
|
|
877
|
-
category:
|
|
878
|
-
region:
|
|
879
|
-
severity: 0.
|
|
880
|
-
aliases: [
|
|
881
|
-
description:
|
|
882
|
-
context:
|
|
965
|
+
word: 'gubug',
|
|
966
|
+
category: 'insult',
|
|
967
|
+
region: 'sunda',
|
|
968
|
+
severity: 0.4,
|
|
969
|
+
aliases: ['ngagubug'],
|
|
970
|
+
description: 'Mengambil tanpa permisi',
|
|
971
|
+
context: 'Menuduh seseorang mengambil barang tanpa ijin',
|
|
883
972
|
},
|
|
884
973
|
{
|
|
885
|
-
word:
|
|
886
|
-
category:
|
|
887
|
-
region:
|
|
974
|
+
word: 'padog',
|
|
975
|
+
category: 'insult',
|
|
976
|
+
region: 'sunda',
|
|
888
977
|
severity: 0.5,
|
|
889
|
-
aliases: [
|
|
890
|
-
description:
|
|
891
|
-
context:
|
|
978
|
+
aliases: ['madog'],
|
|
979
|
+
description: 'Mencuri',
|
|
980
|
+
context: 'Kata kasar yang menuduh seseorang mencuri',
|
|
981
|
+
},
|
|
982
|
+
{
|
|
983
|
+
word: 'kokod',
|
|
984
|
+
category: 'insult',
|
|
985
|
+
region: 'sunda',
|
|
986
|
+
severity: 0.4,
|
|
987
|
+
aliases: [],
|
|
988
|
+
description: 'Kata kasar untuk tangan',
|
|
989
|
+
context: 'Digunakan untuk memarahi orang yang tidak sopan menggunakan tangan',
|
|
990
|
+
},
|
|
991
|
+
{
|
|
992
|
+
word: 'cokor',
|
|
993
|
+
category: 'insult',
|
|
994
|
+
region: 'sunda',
|
|
995
|
+
severity: 0.4,
|
|
996
|
+
aliases: [],
|
|
997
|
+
description: 'Kata kasar untuk kaki',
|
|
998
|
+
context: 'Digunakan untuk memarahi orang yang tidak sopan menggunakan kaki',
|
|
999
|
+
},
|
|
1000
|
+
{
|
|
1001
|
+
word: 'nyatu',
|
|
1002
|
+
category: 'insult',
|
|
1003
|
+
region: 'sunda',
|
|
1004
|
+
severity: 0.4,
|
|
1005
|
+
aliases: [],
|
|
1006
|
+
description: 'Kata kasar untuk makan',
|
|
1007
|
+
context: 'Seperti cara makan hewan, sangat kasar jika untuk manusia',
|
|
892
1008
|
},
|
|
893
1009
|
{
|
|
894
|
-
word:
|
|
895
|
-
category:
|
|
896
|
-
region:
|
|
1010
|
+
word: 'lolodok',
|
|
1011
|
+
category: 'insult',
|
|
1012
|
+
region: 'sunda',
|
|
897
1013
|
severity: 0.5,
|
|
898
|
-
aliases: [
|
|
899
|
-
description:
|
|
900
|
-
context:
|
|
1014
|
+
aliases: [],
|
|
1015
|
+
description: 'Makan dengan cara berisik',
|
|
1016
|
+
context: 'Menghina cara makan seseorang yang seperti unggas',
|
|
1017
|
+
},
|
|
1018
|
+
{
|
|
1019
|
+
word: 'soblog',
|
|
1020
|
+
category: 'insult',
|
|
1021
|
+
region: 'sunda',
|
|
1022
|
+
severity: 0.6,
|
|
1023
|
+
aliases: [],
|
|
1024
|
+
description: 'Turunan dari goblog atau goblok',
|
|
1025
|
+
context: 'Digunakan sebagai penghinaan untuk menyebut orang bodoh',
|
|
1026
|
+
},
|
|
1027
|
+
{
|
|
1028
|
+
word: 'heunceut beureum',
|
|
1029
|
+
category: 'sexual',
|
|
1030
|
+
region: 'sunda',
|
|
1031
|
+
severity: 1.0,
|
|
1032
|
+
aliases: [],
|
|
1033
|
+
description: 'Kata yang sangat vulgar dan tabu',
|
|
1034
|
+
context: 'Sangat tidak pantas diucapkan di tempat umum',
|
|
1035
|
+
},
|
|
1036
|
+
];
|
|
1037
|
+
sunda.map((item) => item.word);
|
|
1038
|
+
|
|
1039
|
+
const betawi = [
|
|
1040
|
+
{
|
|
1041
|
+
word: 'jablay',
|
|
1042
|
+
category: 'sexual',
|
|
1043
|
+
region: 'betawi',
|
|
1044
|
+
severity: 0.7,
|
|
1045
|
+
aliases: ['jabl4y', 'jalay'],
|
|
1046
|
+
description: 'Singkatan dari "jarang dibelai", istilah untuk perempuan yang mudah didekati',
|
|
1047
|
+
context: 'Hinaan yang merendahkan untuk wanita',
|
|
901
1048
|
},
|
|
902
1049
|
{
|
|
903
|
-
word:
|
|
904
|
-
category:
|
|
905
|
-
region:
|
|
1050
|
+
word: 'udik',
|
|
1051
|
+
category: 'insult',
|
|
1052
|
+
region: 'betawi',
|
|
906
1053
|
severity: 0.5,
|
|
907
|
-
aliases: [
|
|
908
|
-
description:
|
|
909
|
-
context:
|
|
1054
|
+
aliases: ['kampungan', 'ndeso'],
|
|
1055
|
+
description: 'Kata yang mengacu pada seseorang yang dianggap ketinggalan zaman atau tidak modern',
|
|
1056
|
+
context: 'Hinaan untuk menyebut orang yang dianggap tidak modern atau kampungan',
|
|
910
1057
|
},
|
|
911
1058
|
{
|
|
912
|
-
word:
|
|
913
|
-
category:
|
|
914
|
-
region:
|
|
1059
|
+
word: 'perek',
|
|
1060
|
+
category: 'sexual',
|
|
1061
|
+
region: 'betawi',
|
|
1062
|
+
severity: 0.7,
|
|
1063
|
+
aliases: ['perempuan eksperimen', 'prk'],
|
|
1064
|
+
description: 'Istilah untuk perempuan yang dianggap memiliki moral yang rendah',
|
|
1065
|
+
context: 'Hinaan yang merendahkan untuk wanita',
|
|
1066
|
+
},
|
|
1067
|
+
];
|
|
1068
|
+
betawi.map((item) => item.word);
|
|
1069
|
+
|
|
1070
|
+
const minang = [
|
|
1071
|
+
{
|
|
1072
|
+
word: 'pantek',
|
|
1073
|
+
category: 'insult',
|
|
1074
|
+
region: 'minang',
|
|
1075
|
+
severity: 1,
|
|
1076
|
+
aliases: ['pantak', 'kalera'],
|
|
1077
|
+
description: 'Secara harfiah berarti "kelamin pria',
|
|
1078
|
+
context: 'Digunakan ketika kesal dan mengumpat ke sesorang',
|
|
1079
|
+
},
|
|
1080
|
+
{
|
|
1081
|
+
word: 'kondiak',
|
|
1082
|
+
category: 'insult',
|
|
1083
|
+
region: 'minang',
|
|
915
1084
|
severity: 0.5,
|
|
916
|
-
aliases: [
|
|
917
|
-
description:
|
|
918
|
-
context:
|
|
1085
|
+
aliases: ['kondik', 'kandiak'],
|
|
1086
|
+
description: 'Secara harfiah berarti "babi"',
|
|
1087
|
+
context: 'Digunakan ketika bercanda dengan teman sebaya',
|
|
1088
|
+
},
|
|
1089
|
+
{
|
|
1090
|
+
word: 'binga',
|
|
1091
|
+
category: 'insult',
|
|
1092
|
+
region: 'minang',
|
|
1093
|
+
severity: 0.4,
|
|
1094
|
+
aliases: ['tele', 'binguang'],
|
|
1095
|
+
description: 'Secara harfiah berarti "tolol"',
|
|
1096
|
+
context: 'Digunakan untuk menyebut orang yang dianggap bodoh dalam melakukan sesuatu',
|
|
1097
|
+
},
|
|
1098
|
+
{
|
|
1099
|
+
word: 'incek',
|
|
1100
|
+
category: 'sexual',
|
|
1101
|
+
region: 'minang',
|
|
1102
|
+
severity: 0.8,
|
|
1103
|
+
aliases: ['ncek'],
|
|
1104
|
+
description: 'Secara harfiah berarti "kelamin wanita"',
|
|
1105
|
+
context: 'Digunakan ketika menyerang pribadi sesorang',
|
|
1106
|
+
},
|
|
1107
|
+
{
|
|
1108
|
+
word: 'kanciang',
|
|
1109
|
+
category: 'sexual',
|
|
1110
|
+
region: 'minang',
|
|
1111
|
+
severity: 0.3,
|
|
1112
|
+
aliases: ['kanciang'],
|
|
1113
|
+
description: 'Secara harfiah berarti "pipis"',
|
|
1114
|
+
context: 'Digunakan ketika orang tersebut melakukan kesalahan',
|
|
1115
|
+
},
|
|
1116
|
+
];
|
|
1117
|
+
minang.map((item) => item.word);
|
|
1118
|
+
|
|
1119
|
+
const madura = [
|
|
1120
|
+
{
|
|
1121
|
+
word: 'Pate',
|
|
1122
|
+
category: 'insult',
|
|
1123
|
+
region: 'madura',
|
|
1124
|
+
severity: 0.7,
|
|
1125
|
+
aliases: ['Pate', 'Pate jih', 'pate ben'],
|
|
1126
|
+
description: 'Secara harfiah berarti "anjing"',
|
|
1127
|
+
context: 'Digunakan untuk menyebut orang yang dianggap hina atau tidak berguna',
|
|
1128
|
+
},
|
|
1129
|
+
{
|
|
1130
|
+
word: 'Matanah',
|
|
1131
|
+
category: 'insult',
|
|
1132
|
+
region: 'madura',
|
|
1133
|
+
severity: 0.4,
|
|
1134
|
+
aliases: ['Matanah', 'Matanah jereyah'],
|
|
1135
|
+
description: 'Kata kasar yang merujuk pada "mata" (bentuk kasar dari mata, sementara bentuk halusnya adalah "ma\'repat")',
|
|
1136
|
+
context: 'Digunakan sebagai umpatan atau dalam ungkapan seperti "ngabes matanah rah!" (Lihat-lihat matanya, dong!) untuk menegur seseorang yang tersandung',
|
|
1137
|
+
},
|
|
1138
|
+
{
|
|
1139
|
+
word: 'Taeh',
|
|
1140
|
+
category: 'insult',
|
|
1141
|
+
region: 'madura',
|
|
1142
|
+
severity: 0.8,
|
|
1143
|
+
aliases: ['Taeh'],
|
|
1144
|
+
description: 'Secara harfiah berarti "tinja" atau "kotoran"',
|
|
1145
|
+
context: 'Digunakan untuk mengungkapkan kekesalan yang ditujukan terhadap seseorang, mengumpamakan mereka dengan hal yang menjijikkan',
|
|
1146
|
+
},
|
|
1147
|
+
{
|
|
1148
|
+
word: 'Korang ajher',
|
|
1149
|
+
category: 'insult',
|
|
1150
|
+
region: 'madura',
|
|
1151
|
+
severity: 0.6,
|
|
1152
|
+
aliases: ['Korang ajher'],
|
|
1153
|
+
description: 'Berarti "kurang ajar" dalam bahasa Indonesia',
|
|
1154
|
+
context: 'Digunakan saat kesal terhadap seseorang atau menghadapi tingkah laku orang lain yang dirasa kurang sopan',
|
|
1155
|
+
},
|
|
1156
|
+
{
|
|
1157
|
+
word: 'Gendheng',
|
|
1158
|
+
category: 'insult',
|
|
1159
|
+
region: 'madura',
|
|
1160
|
+
severity: 0.5,
|
|
1161
|
+
aliases: ['Gendheng', 'Bhungghen'],
|
|
1162
|
+
description: 'Berarti "bodoh" atau "goblok" dalam bahasa Indonesia',
|
|
1163
|
+
context: 'Digunakan untuk menghina kecerdasan seseorang yang dianggap tidak pintar',
|
|
1164
|
+
},
|
|
1165
|
+
];
|
|
1166
|
+
madura.map((item) => item.word);
|
|
1167
|
+
|
|
1168
|
+
const aceh = [
|
|
1169
|
+
{
|
|
1170
|
+
word: 'pukoe ma',
|
|
1171
|
+
category: 'sexual',
|
|
1172
|
+
region: 'aceh',
|
|
1173
|
+
severity: 0.9,
|
|
1174
|
+
aliases: ['pukoima', 'pukima'],
|
|
1175
|
+
description: 'Secara harfiah berarti kemaluan ibu',
|
|
1176
|
+
context: 'Umpatan sangat kasar yang menyerang ibu seseorang',
|
|
1177
|
+
},
|
|
1178
|
+
{
|
|
1179
|
+
word: 'bui',
|
|
1180
|
+
category: 'insult',
|
|
1181
|
+
region: 'aceh',
|
|
1182
|
+
severity: 0.6,
|
|
1183
|
+
aliases: [],
|
|
1184
|
+
description: 'Secara harfiah berarti babi',
|
|
1185
|
+
context: 'Umpatan untuk menyebut orang yang dianggap kotor, rakus, atau tidak berakhlak',
|
|
1186
|
+
},
|
|
1187
|
+
{
|
|
1188
|
+
word: 'asèe',
|
|
1189
|
+
category: 'insult',
|
|
1190
|
+
region: 'aceh',
|
|
1191
|
+
severity: 0.6,
|
|
1192
|
+
aliases: ['asee'],
|
|
1193
|
+
description: 'Secara harfiah berarti anjing',
|
|
1194
|
+
context: 'Umpatan untuk menyebut orang yang dianggap hina atau tidak berguna',
|
|
1195
|
+
},
|
|
1196
|
+
{
|
|
1197
|
+
word: 'haramjadah',
|
|
1198
|
+
category: 'insult',
|
|
1199
|
+
region: 'aceh',
|
|
1200
|
+
severity: 0.8,
|
|
1201
|
+
aliases: [],
|
|
1202
|
+
description: 'Berarti kurang ajar atau anak haram (lebih halus dari aneuk bajeung)',
|
|
1203
|
+
context: 'Umpatan kasar untuk menyebut anak yang tidak sopan atau tidak beradab',
|
|
919
1204
|
},
|
|
920
1205
|
{
|
|
921
|
-
word: "
|
|
922
|
-
category:
|
|
923
|
-
region:
|
|
1206
|
+
word: "pa'ak",
|
|
1207
|
+
category: 'insult',
|
|
1208
|
+
region: 'aceh',
|
|
1209
|
+
severity: 0.6,
|
|
1210
|
+
aliases: [],
|
|
1211
|
+
description: 'Berarti bodoh',
|
|
1212
|
+
context: 'Umpatan untuk menyebut seseorang yang tidak pintar',
|
|
1213
|
+
},
|
|
1214
|
+
{
|
|
1215
|
+
word: 'sangak',
|
|
1216
|
+
category: 'insult',
|
|
1217
|
+
region: 'aceh',
|
|
924
1218
|
severity: 0.6,
|
|
925
|
-
aliases: [
|
|
926
|
-
description: "
|
|
927
|
-
context:
|
|
1219
|
+
aliases: [],
|
|
1220
|
+
description: "Berarti bodoh (lebih kasar dari pa'ak)",
|
|
1221
|
+
context: 'Umpatan kasar untuk menyebut seseorang yang sangat bodoh',
|
|
928
1222
|
},
|
|
1223
|
+
];
|
|
1224
|
+
aceh.map((item) => item.word);
|
|
1225
|
+
|
|
1226
|
+
const bali = [
|
|
929
1227
|
{
|
|
930
|
-
word:
|
|
931
|
-
category:
|
|
932
|
-
region:
|
|
1228
|
+
word: 'cicing',
|
|
1229
|
+
category: 'insult',
|
|
1230
|
+
region: 'bali',
|
|
933
1231
|
severity: 0.7,
|
|
934
|
-
aliases: [
|
|
935
|
-
description:
|
|
936
|
-
context:
|
|
1232
|
+
aliases: [],
|
|
1233
|
+
description: 'Secara harfiah berarti anjing',
|
|
1234
|
+
context: 'Umpatan umum di Bali untuk menyebut orang yang dianggap hina atau tidak berguna',
|
|
1235
|
+
},
|
|
1236
|
+
{
|
|
1237
|
+
word: 'bengkung',
|
|
1238
|
+
category: 'insult',
|
|
1239
|
+
region: 'bali',
|
|
1240
|
+
severity: 0.5,
|
|
1241
|
+
aliases: [],
|
|
1242
|
+
description: 'Berarti bengkok atau tidak lurus (juga bisa berarti tidak jujur)',
|
|
1243
|
+
context: 'Umpatan ringan untuk menyebut orang yang tidak jujur atau berkelakuan buruk',
|
|
1244
|
+
},
|
|
1245
|
+
{
|
|
1246
|
+
word: 'belog',
|
|
1247
|
+
category: 'insult',
|
|
1248
|
+
region: 'bali',
|
|
1249
|
+
severity: 0.6,
|
|
1250
|
+
aliases: [],
|
|
1251
|
+
description: 'Berarti bodoh',
|
|
1252
|
+
context: 'Umpatan umum untuk menyebut seseorang yang tidak pintar',
|
|
937
1253
|
},
|
|
938
1254
|
];
|
|
939
|
-
|
|
1255
|
+
bali.map((item) => item.word);
|
|
940
1256
|
|
|
941
1257
|
const batak = [
|
|
942
1258
|
{
|
|
@@ -1077,17 +1393,610 @@ const batak = [
|
|
|
1077
1393
|
];
|
|
1078
1394
|
batak.map((item) => item.word);
|
|
1079
1395
|
|
|
1396
|
+
const sexual = [
|
|
1397
|
+
...general.filter((word) => word.category === 'sexual'),
|
|
1398
|
+
...jawa.filter((word) => word.category === 'sexual'),
|
|
1399
|
+
...sunda.filter((word) => word.category === 'sexual'),
|
|
1400
|
+
...betawi.filter((word) => word.category === 'sexual'),
|
|
1401
|
+
...minang.filter((word) => word.category === 'sexual'),
|
|
1402
|
+
...madura.filter((word) => word.category === 'sexual'),
|
|
1403
|
+
...sunda.filter((word) => word.category === 'sexual'),
|
|
1404
|
+
...aceh.filter((word) => word.category === 'sexual'),
|
|
1405
|
+
...bali.filter((word) => word.category === 'sexual'),
|
|
1406
|
+
...batak.filter((word) => word.category === 'sexual'),
|
|
1407
|
+
{
|
|
1408
|
+
word: 'bokep',
|
|
1409
|
+
category: 'sexual',
|
|
1410
|
+
region: 'general',
|
|
1411
|
+
severity: 0.7,
|
|
1412
|
+
aliases: ['bkp', 'bokap'],
|
|
1413
|
+
description: 'Istilah untuk video atau konten pornografi',
|
|
1414
|
+
context: 'Kata yang mengacu pada materi pornografi',
|
|
1415
|
+
},
|
|
1416
|
+
{
|
|
1417
|
+
word: 'coli',
|
|
1418
|
+
category: 'sexual',
|
|
1419
|
+
region: 'general',
|
|
1420
|
+
severity: 0.8,
|
|
1421
|
+
aliases: ['col', 'coly'],
|
|
1422
|
+
description: 'Istilah untuk masturbasi laki-laki',
|
|
1423
|
+
context: 'Kata vulgar yang merujuk pada aktivitas seksual pribadi',
|
|
1424
|
+
},
|
|
1425
|
+
{
|
|
1426
|
+
word: 'desah',
|
|
1427
|
+
category: 'sexual',
|
|
1428
|
+
region: 'general',
|
|
1429
|
+
severity: 0.6,
|
|
1430
|
+
aliases: ['ds4h', 'dsh'],
|
|
1431
|
+
description: 'Istilah untuk suara yang dibuat selama aktivitas seksual',
|
|
1432
|
+
context: 'Dapat menjadi vulgar tergantung konteks penggunaan',
|
|
1433
|
+
},
|
|
1434
|
+
{
|
|
1435
|
+
word: 'seks',
|
|
1436
|
+
category: 'sexual',
|
|
1437
|
+
region: 'general',
|
|
1438
|
+
severity: 0.5,
|
|
1439
|
+
aliases: ['sex', 'ML'],
|
|
1440
|
+
description: 'Istilah untuk aktivitas seksual',
|
|
1441
|
+
context: 'Dapat menjadi vulgar tergantung konteks penggunaan',
|
|
1442
|
+
},
|
|
1443
|
+
{
|
|
1444
|
+
word: 'itil',
|
|
1445
|
+
category: 'sexual',
|
|
1446
|
+
region: 'general',
|
|
1447
|
+
severity: 0.9,
|
|
1448
|
+
aliases: ['itl', 'itul'],
|
|
1449
|
+
description: 'Kata vulgar yang mengacu pada bagian dari alat kelamin perempuan',
|
|
1450
|
+
context: 'Kata vulgar yang merujuk pada anatomi seksual',
|
|
1451
|
+
},
|
|
1452
|
+
{
|
|
1453
|
+
word: 'kondom',
|
|
1454
|
+
category: 'sexual',
|
|
1455
|
+
region: 'general',
|
|
1456
|
+
severity: 0.5,
|
|
1457
|
+
aliases: ['kndm', 'kondom', 'cd'],
|
|
1458
|
+
description: 'Alat kontrasepsi',
|
|
1459
|
+
context: 'Dapat menjadi vulgar tergantung konteks penggunaan',
|
|
1460
|
+
},
|
|
1461
|
+
{
|
|
1462
|
+
word: 'ngewe',
|
|
1463
|
+
category: 'sexual',
|
|
1464
|
+
region: 'general',
|
|
1465
|
+
severity: 0.9,
|
|
1466
|
+
aliases: ['ngew', 'we'],
|
|
1467
|
+
description: 'Istilah kasar untuk aktivitas seksual',
|
|
1468
|
+
context: 'Kata vulgar yang merujuk pada aktivitas seksual',
|
|
1469
|
+
},
|
|
1470
|
+
{
|
|
1471
|
+
word: 'puki',
|
|
1472
|
+
category: 'sexual',
|
|
1473
|
+
region: 'general',
|
|
1474
|
+
severity: 0.9,
|
|
1475
|
+
aliases: ['puk', 'pukih'],
|
|
1476
|
+
description: 'Kata vulgar yang mengacu pada alat kelamin perempuan',
|
|
1477
|
+
context: 'Kata vulgar yang merujuk pada anatomi seksual',
|
|
1478
|
+
},
|
|
1479
|
+
{
|
|
1480
|
+
word: 'xxx',
|
|
1481
|
+
category: 'sexual',
|
|
1482
|
+
region: 'general',
|
|
1483
|
+
severity: 0.6,
|
|
1484
|
+
aliases: ['xXx', 'triplex'],
|
|
1485
|
+
description: 'Simbol yang sering digunakan untuk menandai konten pornografi',
|
|
1486
|
+
context: 'Digunakan untuk menandai konten seksual eksplisit',
|
|
1487
|
+
},
|
|
1488
|
+
];
|
|
1489
|
+
sexual.map((item) => item.word);
|
|
1490
|
+
|
|
1491
|
+
const insult = [
|
|
1492
|
+
...general.filter((word) => word.category === 'insult'),
|
|
1493
|
+
...jawa.filter((word) => word.category === 'insult'),
|
|
1494
|
+
...sunda.filter((word) => word.category === 'insult'),
|
|
1495
|
+
...betawi.filter((word) => word.category === 'insult'),
|
|
1496
|
+
...minang.filter((word) => word.category === 'insult'),
|
|
1497
|
+
...madura.filter((word) => word.category === 'insult'),
|
|
1498
|
+
...sunda.filter((word) => word.category === 'insult'),
|
|
1499
|
+
...aceh.filter((word) => word.category === 'insult'),
|
|
1500
|
+
...bali.filter((word) => word.category === 'insult'),
|
|
1501
|
+
...batak.filter((word) => word.category === 'insult'),
|
|
1502
|
+
{
|
|
1503
|
+
word: 'idiot',
|
|
1504
|
+
category: 'insult',
|
|
1505
|
+
region: 'general',
|
|
1506
|
+
severity: 0.6,
|
|
1507
|
+
aliases: ['idi0t', 'idot'],
|
|
1508
|
+
description: 'Kata yang mengacu pada kebodohan seseorang',
|
|
1509
|
+
context: 'Hinaan untuk menyebut orang yang dianggap sangat tidak pintar',
|
|
1510
|
+
},
|
|
1511
|
+
{
|
|
1512
|
+
word: 'dungu',
|
|
1513
|
+
category: 'insult',
|
|
1514
|
+
region: 'general',
|
|
1515
|
+
severity: 0.5,
|
|
1516
|
+
aliases: ['dngu', 'dongu'],
|
|
1517
|
+
description: 'Kata yang mengacu pada kebodohan seseorang',
|
|
1518
|
+
context: 'Hinaan untuk menyebut orang yang dianggap tidak pintar',
|
|
1519
|
+
},
|
|
1520
|
+
{
|
|
1521
|
+
word: 'sinting',
|
|
1522
|
+
category: 'insult',
|
|
1523
|
+
region: 'general',
|
|
1524
|
+
severity: 0.6,
|
|
1525
|
+
aliases: ['sintng', 'senteng'],
|
|
1526
|
+
description: 'Kata yang mengacu pada kegilaan atau ketidakwarasan seseorang',
|
|
1527
|
+
context: 'Hinaan untuk menyebut orang yang dianggap gila atau tidak waras',
|
|
1528
|
+
},
|
|
1529
|
+
{
|
|
1530
|
+
word: 'sarap',
|
|
1531
|
+
category: 'insult',
|
|
1532
|
+
region: 'general',
|
|
1533
|
+
severity: 0.6,
|
|
1534
|
+
aliases: ['saraf', 'srap'],
|
|
1535
|
+
description: 'Kata yang mengacu pada kegilaan atau ketidakwarasan seseorang',
|
|
1536
|
+
context: 'Hinaan untuk menyebut orang yang dianggap gila atau tidak waras',
|
|
1537
|
+
},
|
|
1538
|
+
{
|
|
1539
|
+
word: 'geblek',
|
|
1540
|
+
category: 'insult',
|
|
1541
|
+
region: 'general',
|
|
1542
|
+
severity: 0.5,
|
|
1543
|
+
aliases: ['gblk', 'geblk'],
|
|
1544
|
+
description: 'Kata yang mengacu pada kebodohan seseorang',
|
|
1545
|
+
context: 'Hinaan untuk menyebut orang yang dianggap tidak pintar',
|
|
1546
|
+
},
|
|
1547
|
+
{
|
|
1548
|
+
word: 'kampungan',
|
|
1549
|
+
category: 'insult',
|
|
1550
|
+
region: 'general',
|
|
1551
|
+
severity: 0.5,
|
|
1552
|
+
aliases: ['kmpngn', 'kamphungan'],
|
|
1553
|
+
description: 'Kata yang mengacu pada ketidaksopanan atau kenaifan seseorang',
|
|
1554
|
+
context: 'Hinaan untuk menyebut orang yang dianggap tidak modern atau primitif',
|
|
1555
|
+
},
|
|
1556
|
+
{
|
|
1557
|
+
word: 'udik',
|
|
1558
|
+
category: 'insult',
|
|
1559
|
+
region: 'general',
|
|
1560
|
+
severity: 0.5,
|
|
1561
|
+
aliases: ['udhik', 'udek'],
|
|
1562
|
+
description: 'Kata yang mengacu pada ketidaksopanan atau kenaifan seseorang',
|
|
1563
|
+
context: 'Hinaan untuk menyebut orang yang dianggap tidak modern atau primitif',
|
|
1564
|
+
},
|
|
1565
|
+
{
|
|
1566
|
+
word: 'dongo',
|
|
1567
|
+
category: 'insult',
|
|
1568
|
+
region: 'general',
|
|
1569
|
+
severity: 0.5,
|
|
1570
|
+
aliases: ['donggo', 'dungu'],
|
|
1571
|
+
description: 'Kata yang mengacu pada kebodohan seseorang',
|
|
1572
|
+
context: 'Hinaan untuk menyebut orang yang dianggap tidak pintar',
|
|
1573
|
+
},
|
|
1574
|
+
{
|
|
1575
|
+
word: 'tolol',
|
|
1576
|
+
category: 'insult',
|
|
1577
|
+
region: 'general',
|
|
1578
|
+
severity: 0.6,
|
|
1579
|
+
aliases: ['tol0l', 'tollo', 'tlol'],
|
|
1580
|
+
description: 'Kata yang mengacu pada kebodohan seseorang',
|
|
1581
|
+
context: 'Hinaan untuk menyebut orang yang dianggap tidak pintar',
|
|
1582
|
+
},
|
|
1583
|
+
{
|
|
1584
|
+
word: 'brengsek',
|
|
1585
|
+
category: 'insult',
|
|
1586
|
+
region: 'general',
|
|
1587
|
+
severity: 0.7,
|
|
1588
|
+
aliases: ['brengskek', 'brengsik', 'brengzek'],
|
|
1589
|
+
description: 'Kata yang mengacu pada kelakuan buruk atau tidak bermoral',
|
|
1590
|
+
context: 'Hinaan untuk menyebut orang yang dianggap memiliki kelakuan buruk',
|
|
1591
|
+
},
|
|
1592
|
+
];
|
|
1593
|
+
insult.map((item) => item.word);
|
|
1594
|
+
|
|
1595
|
+
const profanity = [
|
|
1596
|
+
...general.filter((word) => word.category === 'profanity'),
|
|
1597
|
+
...jawa.filter((word) => word.category === 'profanity'),
|
|
1598
|
+
...sunda.filter((word) => word.category === 'profanity'),
|
|
1599
|
+
...betawi.filter((word) => word.category === 'profanity'),
|
|
1600
|
+
...minang.filter((word) => word.category === 'profanity'),
|
|
1601
|
+
...madura.filter((word) => word.category === 'profanity'),
|
|
1602
|
+
...sunda.filter((word) => word.category === 'profanity'),
|
|
1603
|
+
...aceh.filter((word) => word.category === 'profanity'),
|
|
1604
|
+
...bali.filter((word) => word.category === 'profanity'),
|
|
1605
|
+
...batak.filter((word) => word.category === 'profanity'),
|
|
1606
|
+
{
|
|
1607
|
+
word: 'anjing',
|
|
1608
|
+
category: 'profanity',
|
|
1609
|
+
region: 'general',
|
|
1610
|
+
severity: 0.9,
|
|
1611
|
+
aliases: ['anjir', 'anying', 'njing', 'njir'],
|
|
1612
|
+
description: 'Kata umpatan yang mengacu pada hewan anjing',
|
|
1613
|
+
context: 'Digunakan sebagai ekspresi kemarahan atau frustasi',
|
|
1614
|
+
},
|
|
1615
|
+
{
|
|
1616
|
+
word: 'babi',
|
|
1617
|
+
category: 'profanity',
|
|
1618
|
+
region: 'general',
|
|
1619
|
+
severity: 0.8,
|
|
1620
|
+
aliases: ['babik', 'khinzir'],
|
|
1621
|
+
description: 'Kata umpatan yang mengacu pada hewan babi',
|
|
1622
|
+
context: 'Digunakan untuk mengekspresikan kemarahan atau menghina seseorang',
|
|
1623
|
+
},
|
|
1624
|
+
{
|
|
1625
|
+
word: 'bangsat',
|
|
1626
|
+
category: 'profanity',
|
|
1627
|
+
region: 'general',
|
|
1628
|
+
severity: 0.8,
|
|
1629
|
+
aliases: ['bgst', 'bangst'],
|
|
1630
|
+
description: 'Kata umpatan kasar yang berarti kutu atau parasit',
|
|
1631
|
+
context: 'Digunakan untuk menunjukkan kemarahan atau menghina seseorang',
|
|
1632
|
+
},
|
|
1633
|
+
{
|
|
1634
|
+
word: 'kampret',
|
|
1635
|
+
category: 'profanity',
|
|
1636
|
+
region: 'general',
|
|
1637
|
+
severity: 0.7,
|
|
1638
|
+
aliases: ['kampret lu', 'kampretot'],
|
|
1639
|
+
description: 'Kata umpatan yang mengacu pada jenis kelelawar kecil',
|
|
1640
|
+
context: 'Digunakan untuk mengungkapkan kekesalan atau menghina seseorang',
|
|
1641
|
+
},
|
|
1642
|
+
{
|
|
1643
|
+
word: 'sialan',
|
|
1644
|
+
category: 'profanity',
|
|
1645
|
+
region: 'general',
|
|
1646
|
+
severity: 0.6,
|
|
1647
|
+
aliases: ['sial', 'siaal'],
|
|
1648
|
+
description: 'Kata umpatan yang menunjukkan nasib buruk',
|
|
1649
|
+
context: 'Digunakan untuk mengekspresikan kekesalan atau kemarahan',
|
|
1650
|
+
},
|
|
1651
|
+
{
|
|
1652
|
+
word: 'monyet',
|
|
1653
|
+
category: 'profanity',
|
|
1654
|
+
region: 'general',
|
|
1655
|
+
severity: 0.7,
|
|
1656
|
+
aliases: ['monyong', 'munyuk'],
|
|
1657
|
+
description: 'Kata umpatan yang mengacu pada hewan primata',
|
|
1658
|
+
context: 'Digunakan untuk menghina atau mengekspresikan kemarahan',
|
|
1659
|
+
},
|
|
1660
|
+
{
|
|
1661
|
+
word: 'bajingan',
|
|
1662
|
+
category: 'profanity',
|
|
1663
|
+
region: 'general',
|
|
1664
|
+
severity: 0.8,
|
|
1665
|
+
aliases: ['bajinga', 'bjngn'],
|
|
1666
|
+
description: 'Kata umpatan yang berarti penjahat atau orang jahat',
|
|
1667
|
+
context: 'Digunakan untuk mengumpat seseorang yang dianggap buruk perilakunya',
|
|
1668
|
+
},
|
|
1669
|
+
{
|
|
1670
|
+
word: 'jancok',
|
|
1671
|
+
category: 'profanity',
|
|
1672
|
+
region: 'jawa',
|
|
1673
|
+
severity: 0.9,
|
|
1674
|
+
aliases: ['jancuk', 'jancik', 'dancok'],
|
|
1675
|
+
description: 'Kata umpatan kasar dalam bahasa Jawa',
|
|
1676
|
+
context: 'Umpatan sangat kasar dalam budaya Jawa, menunjukkan kemarahan yang tinggi',
|
|
1677
|
+
},
|
|
1678
|
+
{
|
|
1679
|
+
word: 'cuk',
|
|
1680
|
+
category: 'profanity',
|
|
1681
|
+
region: 'jawa',
|
|
1682
|
+
severity: 0.8,
|
|
1683
|
+
aliases: ['cok', 'cug'],
|
|
1684
|
+
description: 'Bentuk singkat dari jancok',
|
|
1685
|
+
context: 'Versi pendek dari umpatan jancok, digunakan dalam percakapan sehari-hari',
|
|
1686
|
+
},
|
|
1687
|
+
{
|
|
1688
|
+
word: 'asu',
|
|
1689
|
+
category: 'profanity',
|
|
1690
|
+
region: 'jawa',
|
|
1691
|
+
severity: 0.8,
|
|
1692
|
+
aliases: ['asyu', 'su'],
|
|
1693
|
+
description: 'Kata Jawa untuk anjing, digunakan sebagai umpatan',
|
|
1694
|
+
context: 'Ekspresi umpatan yang umum di masyarakat Jawa',
|
|
1695
|
+
},
|
|
1696
|
+
{
|
|
1697
|
+
word: 'sia',
|
|
1698
|
+
category: 'profanity',
|
|
1699
|
+
region: 'sunda',
|
|
1700
|
+
severity: 0.6,
|
|
1701
|
+
aliases: ['siah', 'siaa'],
|
|
1702
|
+
description: 'Kata ganti orang kedua dalam bahasa Sunda yang kasar',
|
|
1703
|
+
context: 'Menunjukkan ketidakhormatan pada lawan bicara dalam konteks Sunda',
|
|
1704
|
+
},
|
|
1705
|
+
{
|
|
1706
|
+
word: 'lu',
|
|
1707
|
+
category: 'profanity',
|
|
1708
|
+
region: 'betawi',
|
|
1709
|
+
severity: 0.4,
|
|
1710
|
+
aliases: ['elu', 'lo'],
|
|
1711
|
+
description: 'Kata ganti orang kedua dalam dialek Betawi',
|
|
1712
|
+
context: 'Dapat dianggap kasar dalam konteks formal atau saat berbicara dengan orang yang lebih tua',
|
|
1713
|
+
},
|
|
1714
|
+
{
|
|
1715
|
+
word: 'goblok',
|
|
1716
|
+
category: 'profanity',
|
|
1717
|
+
region: 'general',
|
|
1718
|
+
severity: 0.7,
|
|
1719
|
+
aliases: ['goblog', 'goblokk', 'bego', 'bodoh'],
|
|
1720
|
+
description: 'Kata umpatan yang menunjukkan kebodohan',
|
|
1721
|
+
context: 'Digunakan untuk menghina kecerdasan seseorang',
|
|
1722
|
+
},
|
|
1723
|
+
];
|
|
1724
|
+
profanity.map((item) => item.word);
|
|
1725
|
+
|
|
1726
|
+
const slur = [
|
|
1727
|
+
...general.filter((word) => word.category === 'slur'),
|
|
1728
|
+
...jawa.filter((word) => word.category === 'slur'),
|
|
1729
|
+
...sunda.filter((word) => word.category === 'slur'),
|
|
1730
|
+
...betawi.filter((word) => word.category === 'slur'),
|
|
1731
|
+
...minang.filter((word) => word.category === 'slur'),
|
|
1732
|
+
...madura.filter((word) => word.category === 'slur'),
|
|
1733
|
+
...sunda.filter((word) => word.category === 'slur'),
|
|
1734
|
+
...aceh.filter((word) => word.category === 'slur'),
|
|
1735
|
+
...bali.filter((word) => word.category === 'slur'),
|
|
1736
|
+
...batak.filter((word) => word.category === 'slur'),
|
|
1737
|
+
{
|
|
1738
|
+
word: 'cina',
|
|
1739
|
+
category: 'slur',
|
|
1740
|
+
region: 'general',
|
|
1741
|
+
severity: 0.7,
|
|
1742
|
+
aliases: ['cino', 'china'],
|
|
1743
|
+
description: 'Sebutan yang dianggap merendahkan untuk orang keturunan Tionghoa',
|
|
1744
|
+
context: 'Dianggap tidak sopan dan sebaiknya diganti dengan "Tionghoa"',
|
|
1745
|
+
},
|
|
1746
|
+
{
|
|
1747
|
+
word: 'banci',
|
|
1748
|
+
category: 'slur',
|
|
1749
|
+
region: 'general',
|
|
1750
|
+
severity: 0.7,
|
|
1751
|
+
aliases: ['bencong', 'waria', 'bences'],
|
|
1752
|
+
description: 'Istilah merendahkan untuk transgender atau pria yang dianggap feminin',
|
|
1753
|
+
context: 'Digunakan sebagai hinaan terhadap identitas gender atau ekspresi gender seseorang',
|
|
1754
|
+
},
|
|
1755
|
+
{
|
|
1756
|
+
word: 'autis',
|
|
1757
|
+
category: 'slur',
|
|
1758
|
+
region: 'general',
|
|
1759
|
+
severity: 0.6,
|
|
1760
|
+
aliases: ['autis lu', 'autisan'],
|
|
1761
|
+
description: 'Penyalahgunaan kondisi medis sebagai hinaan',
|
|
1762
|
+
context: 'Menggunakan kondisi spektrum autisme sebagai hinaan untuk seseorang yang dianggap aneh',
|
|
1763
|
+
},
|
|
1764
|
+
{
|
|
1765
|
+
word: 'londo',
|
|
1766
|
+
category: 'slur',
|
|
1767
|
+
region: 'jawa',
|
|
1768
|
+
severity: 0.5,
|
|
1769
|
+
aliases: ['landa', 'landi'],
|
|
1770
|
+
description: 'Sebutan untuk orang Belanda atau orang berkulit putih',
|
|
1771
|
+
context: 'Dapat bersifat merendahkan tergantung konteks dan nada bicara',
|
|
1772
|
+
},
|
|
1773
|
+
{
|
|
1774
|
+
word: 'keling',
|
|
1775
|
+
category: 'slur',
|
|
1776
|
+
region: 'general',
|
|
1777
|
+
severity: 0.8,
|
|
1778
|
+
aliases: ['kaling', 'hitam legam'],
|
|
1779
|
+
description: 'Istilah merendahkan untuk orang India atau berkulit gelap',
|
|
1780
|
+
context: 'Dianggap sangat tidak sopan dan bernada rasis',
|
|
1781
|
+
},
|
|
1782
|
+
{
|
|
1783
|
+
word: 'cacat',
|
|
1784
|
+
category: 'slur',
|
|
1785
|
+
region: 'general',
|
|
1786
|
+
severity: 0.7,
|
|
1787
|
+
aliases: ['cacad', 'difabel'],
|
|
1788
|
+
description: 'Istilah merendahkan untuk penyandang disabilitas',
|
|
1789
|
+
context: 'Digunakan sebagai hinaan untuk menunjukkan ketidaksempurnaan',
|
|
1790
|
+
},
|
|
1791
|
+
{
|
|
1792
|
+
word: 'gembel',
|
|
1793
|
+
category: 'slur',
|
|
1794
|
+
region: 'general',
|
|
1795
|
+
severity: 0.6,
|
|
1796
|
+
aliases: ['gembul', 'gelandangan'],
|
|
1797
|
+
description: 'Istilah merendahkan untuk orang tidak mampu atau tunawisma',
|
|
1798
|
+
context: 'Mengandung stigma terhadap kemiskinan dan kelas sosial',
|
|
1799
|
+
},
|
|
1800
|
+
{
|
|
1801
|
+
word: 'kampungan',
|
|
1802
|
+
category: 'slur',
|
|
1803
|
+
region: 'general',
|
|
1804
|
+
severity: 0.5,
|
|
1805
|
+
aliases: ['ndeso', 'katrok', 'udik'],
|
|
1806
|
+
description: 'Istilah merendahkan untuk orang dari daerah pedesaan',
|
|
1807
|
+
context: 'Menyiratkan seseorang tidak beradab, tidak berpendidikan, atau ketinggalan zaman',
|
|
1808
|
+
},
|
|
1809
|
+
{
|
|
1810
|
+
word: 'tolol',
|
|
1811
|
+
category: 'slur',
|
|
1812
|
+
region: 'general',
|
|
1813
|
+
severity: 0.6,
|
|
1814
|
+
aliases: ['tololnya', 'tolo'],
|
|
1815
|
+
description: 'Hinaan terhadap kecerdasan seseorang',
|
|
1816
|
+
context: 'Digunakan untuk menghina kapasitas mental seseorang',
|
|
1817
|
+
},
|
|
1818
|
+
];
|
|
1819
|
+
slur.map((item) => item.word);
|
|
1820
|
+
|
|
1821
|
+
const drugs = [
|
|
1822
|
+
...general.filter((word) => word.category === 'drugs'),
|
|
1823
|
+
...jawa.filter((word) => word.category === 'drugs'),
|
|
1824
|
+
...sunda.filter((word) => word.category === 'drugs'),
|
|
1825
|
+
...betawi.filter((word) => word.category === 'drugs'),
|
|
1826
|
+
...minang.filter((word) => word.category === 'drugs'),
|
|
1827
|
+
...madura.filter((word) => word.category === 'drugs'),
|
|
1828
|
+
...sunda.filter((word) => word.category === 'drugs'),
|
|
1829
|
+
...aceh.filter((word) => word.category === 'drugs'),
|
|
1830
|
+
...bali.filter((word) => word.category === 'drugs'),
|
|
1831
|
+
...batak.filter((word) => word.category === 'drugs'),
|
|
1832
|
+
{
|
|
1833
|
+
word: 'ganja',
|
|
1834
|
+
category: 'drugs',
|
|
1835
|
+
region: 'general',
|
|
1836
|
+
severity: 0.6,
|
|
1837
|
+
aliases: ['cimeng', 'kanabis', 'marijuana'],
|
|
1838
|
+
description: 'Tanaman yang mengandung zat psikoaktif',
|
|
1839
|
+
context: 'Digunakan untuk merujuk pada narkotika jenis cannabis',
|
|
1840
|
+
},
|
|
1841
|
+
{
|
|
1842
|
+
word: 'sabu',
|
|
1843
|
+
category: 'drugs',
|
|
1844
|
+
region: 'general',
|
|
1845
|
+
severity: 0.8,
|
|
1846
|
+
aliases: ['crystal', 'meth', 'ss'],
|
|
1847
|
+
description: 'Narkotika jenis metamfetamin',
|
|
1848
|
+
context: 'Istilah untuk metamfetamin yang merupakan narkotika berbahaya',
|
|
1849
|
+
},
|
|
1850
|
+
{
|
|
1851
|
+
word: 'inex',
|
|
1852
|
+
category: 'drugs',
|
|
1853
|
+
region: 'general',
|
|
1854
|
+
severity: 0.7,
|
|
1855
|
+
aliases: ['ekstasi', 'pil'],
|
|
1856
|
+
description: 'Obat terlarang yang mengandung MDMA',
|
|
1857
|
+
context: 'Nama slang untuk obat terlarang ecstasy',
|
|
1858
|
+
},
|
|
1859
|
+
{
|
|
1860
|
+
word: 'sakaw',
|
|
1861
|
+
category: 'drugs',
|
|
1862
|
+
region: 'general',
|
|
1863
|
+
severity: 0.5,
|
|
1864
|
+
aliases: ['ketagihan', 'menarik'],
|
|
1865
|
+
description: 'Gejala putus obat pada pecandu',
|
|
1866
|
+
context: 'Menggambarkan kondisi pecandu yang sedang mengalami gejala putus obat',
|
|
1867
|
+
},
|
|
1868
|
+
{
|
|
1869
|
+
word: 'ngepil',
|
|
1870
|
+
category: 'drugs',
|
|
1871
|
+
region: 'jawa',
|
|
1872
|
+
severity: 0.3,
|
|
1873
|
+
aliases: ['minum pil', 'telan pil'],
|
|
1874
|
+
description: 'Mengkonsumsi obat-obatan terlarang dalam bentuk pil',
|
|
1875
|
+
context: 'Istilah dalam bahasa gaul untuk mengkonsumsi obat terlarang jenis tablet',
|
|
1876
|
+
},
|
|
1877
|
+
{
|
|
1878
|
+
word: 'nyimeng',
|
|
1879
|
+
category: 'drugs',
|
|
1880
|
+
region: 'sunda',
|
|
1881
|
+
severity: 0.6,
|
|
1882
|
+
aliases: ['nyimang', 'isap ganja'],
|
|
1883
|
+
description: 'Mengisap ganja atau marijuana',
|
|
1884
|
+
context: 'Istilah sunda untuk aktivitas mengkonsumsi ganja',
|
|
1885
|
+
},
|
|
1886
|
+
];
|
|
1887
|
+
drugs.map((item) => item.word);
|
|
1888
|
+
|
|
1889
|
+
const disgusting = [
|
|
1890
|
+
...general.filter((word) => word.category === 'disgusting'),
|
|
1891
|
+
...jawa.filter((word) => word.category === 'disgusting'),
|
|
1892
|
+
...sunda.filter((word) => word.category === 'disgusting'),
|
|
1893
|
+
...betawi.filter((word) => word.category === 'disgusting'),
|
|
1894
|
+
...minang.filter((word) => word.category === 'disgusting'),
|
|
1895
|
+
...madura.filter((word) => word.category === 'disgusting'),
|
|
1896
|
+
...sunda.filter((word) => word.category === 'disgusting'),
|
|
1897
|
+
...aceh.filter((word) => word.category === 'disgusting'),
|
|
1898
|
+
...bali.filter((word) => word.category === 'disgusting'),
|
|
1899
|
+
...batak.filter((word) => word.category === 'disgusting'),
|
|
1900
|
+
{
|
|
1901
|
+
word: 'muntah',
|
|
1902
|
+
category: 'disgusting',
|
|
1903
|
+
region: 'general',
|
|
1904
|
+
severity: 0.4,
|
|
1905
|
+
aliases: ['muntaber', 'memuntahkan'],
|
|
1906
|
+
description: 'Muntahan atau tindakan muntah',
|
|
1907
|
+
context: 'Digunakan untuk mengekspresikan rasa jijik atau menggambarkan tindakan tersebut',
|
|
1908
|
+
},
|
|
1909
|
+
{
|
|
1910
|
+
word: 'ingus',
|
|
1911
|
+
category: 'disgusting',
|
|
1912
|
+
region: 'general',
|
|
1913
|
+
severity: 0.4,
|
|
1914
|
+
aliases: ['ingusan', 'beringus'],
|
|
1915
|
+
description: 'Lendir hidung',
|
|
1916
|
+
context: 'Digunakan untuk menggambarkan lendir hidung atau sebagai hinaan',
|
|
1917
|
+
},
|
|
1918
|
+
{
|
|
1919
|
+
word: 'tai',
|
|
1920
|
+
category: 'disgusting',
|
|
1921
|
+
region: 'general',
|
|
1922
|
+
severity: 0.8,
|
|
1923
|
+
aliases: ['tahi', 'kotoran'],
|
|
1924
|
+
description: 'Kotoran manusia',
|
|
1925
|
+
context: 'Istilah vulgar untuk kotoran, sering digunakan sebagai hinaan',
|
|
1926
|
+
},
|
|
1927
|
+
{
|
|
1928
|
+
word: 'jembut',
|
|
1929
|
+
category: 'disgusting',
|
|
1930
|
+
region: 'general',
|
|
1931
|
+
severity: 1.0,
|
|
1932
|
+
aliases: ['jembud', 'rambut kemaluan'],
|
|
1933
|
+
description: 'Rambut kemaluan',
|
|
1934
|
+
context: 'Istilah vulgar untuk rambut kemaluan, dianggap sangat tidak pantas',
|
|
1935
|
+
},
|
|
1936
|
+
{
|
|
1937
|
+
word: 'pecret',
|
|
1938
|
+
category: 'disgusting',
|
|
1939
|
+
region: 'sunda',
|
|
1940
|
+
severity: 0.8,
|
|
1941
|
+
aliases: ['mencret', 'diare'],
|
|
1942
|
+
description: 'Diare dalam bahasa Sunda',
|
|
1943
|
+
context: 'Dianggap vulgar ketika disebutkan di depan umum',
|
|
1944
|
+
},
|
|
1945
|
+
{
|
|
1946
|
+
word: 'bacot',
|
|
1947
|
+
category: 'disgusting',
|
|
1948
|
+
region: 'betawi',
|
|
1949
|
+
severity: 0.8,
|
|
1950
|
+
aliases: ['cicing', 'berisik'],
|
|
1951
|
+
description: 'Mulut atau omongan berisik dalam konteks vulgar',
|
|
1952
|
+
context: 'Istilah kasar yang digunakan untuk menyuruh seseorang diam',
|
|
1953
|
+
},
|
|
1954
|
+
{
|
|
1955
|
+
word: 'lendir',
|
|
1956
|
+
category: 'disgusting',
|
|
1957
|
+
region: 'general',
|
|
1958
|
+
severity: 0.3,
|
|
1959
|
+
aliases: ['berlendir', 'cairan lengket'],
|
|
1960
|
+
description: 'Lendir atau cairan lengket',
|
|
1961
|
+
context: 'Dapat digunakan dalam konteks vulgar untuk menggambarkan cairan tubuh',
|
|
1962
|
+
},
|
|
1963
|
+
];
|
|
1964
|
+
disgusting.map((item) => item.word);
|
|
1965
|
+
|
|
1966
|
+
const blasphemy = [
|
|
1967
|
+
...general.filter((word) => word.category === 'blasphemy'),
|
|
1968
|
+
...jawa.filter((word) => word.category === 'blasphemy'),
|
|
1969
|
+
...sunda.filter((word) => word.category === 'blasphemy'),
|
|
1970
|
+
...betawi.filter((word) => word.category === 'blasphemy'),
|
|
1971
|
+
...minang.filter((word) => word.category === 'blasphemy'),
|
|
1972
|
+
...madura.filter((word) => word.category === 'blasphemy'),
|
|
1973
|
+
...sunda.filter((word) => word.category === 'blasphemy'),
|
|
1974
|
+
...aceh.filter((word) => word.category === 'blasphemy'),
|
|
1975
|
+
...bali.filter((word) => word.category === 'blasphemy'),
|
|
1976
|
+
...batak.filter((word) => word.category === 'blasphemy'),
|
|
1977
|
+
{
|
|
1978
|
+
word: 'kafir',
|
|
1979
|
+
category: 'blasphemy',
|
|
1980
|
+
region: 'general',
|
|
1981
|
+
severity: 0.6,
|
|
1982
|
+
aliases: ['kapir', 'kafur'],
|
|
1983
|
+
description: 'Istilah untuk orang yang tidak percaya pada Islam',
|
|
1984
|
+
context: 'Dapat bersifat merendahkan ketika digunakan terhadap non-Muslim',
|
|
1985
|
+
},
|
|
1986
|
+
];
|
|
1987
|
+
blasphemy.map((item) => item.word);
|
|
1988
|
+
|
|
1080
1989
|
const wordObjects = [
|
|
1081
1990
|
...general,
|
|
1082
1991
|
...jawa,
|
|
1083
1992
|
...sunda,
|
|
1084
1993
|
...betawi,
|
|
1085
1994
|
...batak,
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1995
|
+
...minang,
|
|
1996
|
+
...bali,
|
|
1997
|
+
...madura,
|
|
1089
1998
|
// ...bugis,
|
|
1090
|
-
|
|
1999
|
+
...aceh,
|
|
1091
2000
|
// ...ambon,
|
|
1092
2001
|
// ...papua,
|
|
1093
2002
|
// ...manado,
|
|
@@ -1113,7 +2022,7 @@ wordObjects
|
|
|
1113
2022
|
* @param keepFirstAndLast Apakah harus menyimpan huruf pertama dan terakhir
|
|
1114
2023
|
* @returns Kata yang telah disensor
|
|
1115
2024
|
*/
|
|
1116
|
-
function censorWord(word, replaceChar =
|
|
2025
|
+
function censorWord(word, replaceChar = '*', keepFirstAndLast = false) {
|
|
1117
2026
|
if (word.length <= 2) {
|
|
1118
2027
|
return replaceChar.repeat(word.length);
|
|
1119
2028
|
}
|
|
@@ -1131,9 +2040,9 @@ function censorWord(word, replaceChar = "*", keepFirstAndLast = false) {
|
|
|
1131
2040
|
function normalizeText(text) {
|
|
1132
2041
|
return text
|
|
1133
2042
|
.toLowerCase()
|
|
1134
|
-
.normalize(
|
|
1135
|
-
.replace(/[\u0300-\u036f]/g,
|
|
1136
|
-
.replace(/[^\w\s]/g,
|
|
2043
|
+
.normalize('NFD') // Normalisasi Unicode
|
|
2044
|
+
.replace(/[\u0300-\u036f]/g, '') // Hapus diacritic marks
|
|
2045
|
+
.replace(/[^\w\s]/g, '') // Hapus karakter non-alphanumeric
|
|
1137
2046
|
.trim(); // Hapus whitespace di awal dan akhir
|
|
1138
2047
|
}
|
|
1139
2048
|
/**
|
|
@@ -1150,7 +2059,7 @@ function containsAnyWord(text, wordList, checkSubstring = false) {
|
|
|
1150
2059
|
const normalizedWord = normalizeText(word);
|
|
1151
2060
|
return checkSubstring
|
|
1152
2061
|
? normalizedText.includes(normalizedWord)
|
|
1153
|
-
: new RegExp(`\\b${escapeRegExp(normalizedWord)}\\b`,
|
|
2062
|
+
: new RegExp(`\\b${escapeRegExp(normalizedWord)}\\b`, 'i').test(normalizedText);
|
|
1154
2063
|
});
|
|
1155
2064
|
}
|
|
1156
2065
|
/**
|
|
@@ -1167,7 +2076,7 @@ function containsEuphemism(text, wordList) {
|
|
|
1167
2076
|
return false;
|
|
1168
2077
|
const firstChar = word[0];
|
|
1169
2078
|
const lastChar = word[word.length - 1];
|
|
1170
|
-
const pattern = new RegExp(`\\b${escapeRegExp(firstChar)}[*@#\\-_.!?\\s]{${word.length - 2}}${escapeRegExp(lastChar)}\\b`,
|
|
2079
|
+
const pattern = new RegExp(`\\b${escapeRegExp(firstChar)}[*@#\\-_.!?\\s]{${word.length - 2}}${escapeRegExp(lastChar)}\\b`, 'i');
|
|
1171
2080
|
return pattern.test(text);
|
|
1172
2081
|
});
|
|
1173
2082
|
}
|
|
@@ -1180,11 +2089,11 @@ function containsEuphemism(text, wordList) {
|
|
|
1180
2089
|
* @returns Boolean apakah teks mengandung upaya menghindari filter
|
|
1181
2090
|
*/
|
|
1182
2091
|
function detectSplitWords(text, wordList) {
|
|
1183
|
-
const compressedText = text.replace(/[\s\-_.!?*]/g,
|
|
2092
|
+
const compressedText = text.replace(/[\s\-_.!?*]/g, '').toLowerCase();
|
|
1184
2093
|
return wordList.some((word) => compressedText.includes(normalizeText(word)));
|
|
1185
2094
|
}
|
|
1186
2095
|
function escapeRegExp(string) {
|
|
1187
|
-
return string.replace(/[.*+?^${}()|[\]\\]/g,
|
|
2096
|
+
return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
1188
2097
|
}
|
|
1189
2098
|
/**
|
|
1190
2099
|
* Mengganti sebagian kata dengan masking
|
|
@@ -1196,9 +2105,9 @@ function escapeRegExp(string) {
|
|
|
1196
2105
|
* @param maskChar Karakter masking
|
|
1197
2106
|
* @returns Teks yang telah dimasking
|
|
1198
2107
|
*/
|
|
1199
|
-
function maskText(text, visibleStart = 1, visibleEnd = 1, maskChar =
|
|
2108
|
+
function maskText(text, visibleStart = 1, visibleEnd = 1, maskChar = '*') {
|
|
1200
2109
|
if (!text)
|
|
1201
|
-
return
|
|
2110
|
+
return '';
|
|
1202
2111
|
if (text.length <= visibleStart + visibleEnd)
|
|
1203
2112
|
return text;
|
|
1204
2113
|
const start = text.substring(0, visibleStart);
|
|
@@ -1215,25 +2124,25 @@ function maskText(text, visibleStart = 1, visibleEnd = 1, maskChar = "*") {
|
|
|
1215
2124
|
*/
|
|
1216
2125
|
function toLeetSpeak(text) {
|
|
1217
2126
|
const leetMap = {
|
|
1218
|
-
a: [
|
|
1219
|
-
b: [
|
|
1220
|
-
c: [
|
|
1221
|
-
e: [
|
|
1222
|
-
g: [
|
|
1223
|
-
i: [
|
|
1224
|
-
l: [
|
|
1225
|
-
o: [
|
|
1226
|
-
s: [
|
|
1227
|
-
t: [
|
|
1228
|
-
z: [
|
|
2127
|
+
a: ['4', '@'],
|
|
2128
|
+
b: ['8', '6'],
|
|
2129
|
+
c: ['<', '(', '{'],
|
|
2130
|
+
e: ['3'],
|
|
2131
|
+
g: ['9'],
|
|
2132
|
+
i: ['1', '!'],
|
|
2133
|
+
l: ['1', '|'],
|
|
2134
|
+
o: ['0'],
|
|
2135
|
+
s: ['5', '$'],
|
|
2136
|
+
t: ['7', '+'],
|
|
2137
|
+
z: ['2'],
|
|
1229
2138
|
};
|
|
1230
2139
|
return text
|
|
1231
|
-
.split(
|
|
2140
|
+
.split('')
|
|
1232
2141
|
.map((char) => {
|
|
1233
2142
|
const lowerChar = char.toLowerCase();
|
|
1234
2143
|
return leetMap[lowerChar] || char;
|
|
1235
2144
|
})
|
|
1236
|
-
.join(
|
|
2145
|
+
.join('');
|
|
1237
2146
|
}
|
|
1238
2147
|
/**
|
|
1239
2148
|
* memisahkan teks menajdi kelimat
|
|
@@ -1243,9 +2152,7 @@ function toLeetSpeak(text) {
|
|
|
1243
2152
|
*/
|
|
1244
2153
|
function splitIntoSentences(text) {
|
|
1245
2154
|
// split berdasarkan titik, seru, taya yagn diikuti spasi atau akhir string
|
|
1246
|
-
return text
|
|
1247
|
-
.split(/(?<=[.!?])\s+|(?<=[.!?])$/)
|
|
1248
|
-
.filter((sentence) => sentence.trim().length > 0);
|
|
2155
|
+
return text.split(/(?<=[.!?])\s+|(?<=[.!?])$/).filter((sentence) => sentence.trim().length > 0);
|
|
1249
2156
|
}
|
|
1250
2157
|
/**
|
|
1251
2158
|
* mengambil kata-kata di sekitar indeks tertentu
|
|
@@ -1257,7 +2164,7 @@ function splitIntoSentences(text) {
|
|
|
1257
2164
|
*/
|
|
1258
2165
|
function getContextAroundIndex(text, index, windowSize = 5) {
|
|
1259
2166
|
if (!text || index < 0 || index >= text.length)
|
|
1260
|
-
return
|
|
2167
|
+
return '';
|
|
1261
2168
|
const words = text.split(/\s+/);
|
|
1262
2169
|
let currentPosition = 0;
|
|
1263
2170
|
let targetWordIndex = -1;
|
|
@@ -1271,11 +2178,11 @@ function getContextAroundIndex(text, index, windowSize = 5) {
|
|
|
1271
2178
|
currentPosition += wordLength + 1;
|
|
1272
2179
|
}
|
|
1273
2180
|
if (targetWordIndex === -1)
|
|
1274
|
-
return
|
|
2181
|
+
return '';
|
|
1275
2182
|
// Ambil kata-kata di sekitar
|
|
1276
2183
|
const startIndex = Math.max(0, targetWordIndex - windowSize);
|
|
1277
2184
|
const endIndex = Math.min(words.length, targetWordIndex + windowSize + 1);
|
|
1278
|
-
return words.slice(startIndex, endIndex).join(
|
|
2185
|
+
return words.slice(startIndex, endIndex).join(' ');
|
|
1279
2186
|
}
|
|
1280
2187
|
|
|
1281
2188
|
/**
|
|
@@ -1306,7 +2213,7 @@ function createWordRegex(word, options = {}) {
|
|
|
1306
2213
|
pattern = `\\b${pattern}\\b`;
|
|
1307
2214
|
}
|
|
1308
2215
|
// Buat regex dengan flag case-insensitive jika diminta
|
|
1309
|
-
return new RegExp(pattern, caseSensitive ?
|
|
2216
|
+
return new RegExp(pattern, caseSensitive ? 'g' : 'gi');
|
|
1310
2217
|
}
|
|
1311
2218
|
/**
|
|
1312
2219
|
* Menambahkan variasi leet speak ke pola regex
|
|
@@ -1320,29 +2227,29 @@ function createWordRegex(word, options = {}) {
|
|
|
1320
2227
|
*/
|
|
1321
2228
|
function addLeetSpeakVariations(pattern) {
|
|
1322
2229
|
const leetMap = {
|
|
1323
|
-
a: [
|
|
1324
|
-
b: [
|
|
1325
|
-
c: [
|
|
1326
|
-
e: [
|
|
1327
|
-
g: [
|
|
1328
|
-
i: [
|
|
1329
|
-
l: [
|
|
1330
|
-
o: [
|
|
1331
|
-
s: [
|
|
1332
|
-
t: [
|
|
1333
|
-
z: [
|
|
2230
|
+
a: ['a', '4', '@'],
|
|
2231
|
+
b: ['b', '8', '6'],
|
|
2232
|
+
c: ['c', '(', '{', '<'],
|
|
2233
|
+
e: ['e', '3'],
|
|
2234
|
+
g: ['g', '6', '9'],
|
|
2235
|
+
i: ['i', '1', '!', '|'],
|
|
2236
|
+
l: ['l', '1', '|'],
|
|
2237
|
+
o: ['o', '0'],
|
|
2238
|
+
s: ['s', '5', '$'],
|
|
2239
|
+
t: ['t', '7', '+'],
|
|
2240
|
+
z: ['z', '2'],
|
|
1334
2241
|
};
|
|
1335
2242
|
return pattern
|
|
1336
|
-
.split(
|
|
2243
|
+
.split('')
|
|
1337
2244
|
.map((char) => {
|
|
1338
2245
|
const lowerChar = char.toLowerCase();
|
|
1339
2246
|
const variations = leetMap[lowerChar];
|
|
1340
2247
|
if (variations && variations.length > 1) {
|
|
1341
|
-
return `[${variations.join(
|
|
2248
|
+
return `[${variations.join('')}]`;
|
|
1342
2249
|
}
|
|
1343
2250
|
return char;
|
|
1344
2251
|
})
|
|
1345
|
-
.join(
|
|
2252
|
+
.join('');
|
|
1346
2253
|
}
|
|
1347
2254
|
/**
|
|
1348
2255
|
* Menambahkan kemungkinan split/pemisahan antar karakter
|
|
@@ -1352,7 +2259,7 @@ function addLeetSpeakVariations(pattern) {
|
|
|
1352
2259
|
*/
|
|
1353
2260
|
function addSplitVariations(pattern) {
|
|
1354
2261
|
// Tambahkan kemungkinan spasi atau karakter penghubung di antara setiap huruf
|
|
1355
|
-
return pattern.split(
|
|
2262
|
+
return pattern.split('').join('[\\s\\-._*+]?');
|
|
1356
2263
|
}
|
|
1357
2264
|
/**
|
|
1358
2265
|
* Membuat regex untuk mencari kata dengan variasi spasi dan karakter penghubung
|
|
@@ -1364,7 +2271,7 @@ function addSplitVariations(pattern) {
|
|
|
1364
2271
|
function createEvasionRegex(word) {
|
|
1365
2272
|
// Tambahkan kemungkinan spasi atau karakter penghubung di antara setiap huruf
|
|
1366
2273
|
const pattern = addSplitVariations(escapeRegExp(word));
|
|
1367
|
-
return new RegExp(pattern,
|
|
2274
|
+
return new RegExp(pattern, 'gi');
|
|
1368
2275
|
}
|
|
1369
2276
|
/**
|
|
1370
2277
|
* Menambahkan variasi ejaan Bahasa Indonesia
|
|
@@ -1375,27 +2282,27 @@ function createEvasionRegex(word) {
|
|
|
1375
2282
|
function addIndonesianVariations(pattern) {
|
|
1376
2283
|
// Variasi ejaan dalam Bahasa Indonesia
|
|
1377
2284
|
const variationMap = {
|
|
1378
|
-
c: [
|
|
1379
|
-
k: [
|
|
1380
|
-
j: [
|
|
1381
|
-
y: [
|
|
1382
|
-
u: [
|
|
1383
|
-
f: [
|
|
1384
|
-
z: [
|
|
1385
|
-
x: [
|
|
2285
|
+
c: ['c', 'k'], // contoh: becok/bekok
|
|
2286
|
+
k: ['k', 'c', 'q'], // contoh: kacau/qacau
|
|
2287
|
+
j: ['j', 'dj'], // contoh: jualan/djualan (ejaan lama)
|
|
2288
|
+
y: ['y', 'j'], // contoh: ya/ja
|
|
2289
|
+
u: ['u', 'oe'], // contoh: untuk/oentoek (ejaan lama)
|
|
2290
|
+
f: ['f', 'p', 'v'], // contoh: kafir/kapir
|
|
2291
|
+
z: ['z', 'j', 's'], // contoh: zaman/jaman
|
|
2292
|
+
x: ['x', 'ks'], // contoh: taxi/taksi
|
|
1386
2293
|
};
|
|
1387
2294
|
// Ganti tiap karakter dengan variasinya
|
|
1388
2295
|
return pattern
|
|
1389
|
-
.split(
|
|
2296
|
+
.split('')
|
|
1390
2297
|
.map((char) => {
|
|
1391
2298
|
const lowerChar = char.toLowerCase();
|
|
1392
2299
|
const variations = variationMap[lowerChar];
|
|
1393
2300
|
if (variations && variations.length > 1) {
|
|
1394
|
-
return `[${variations.join(
|
|
2301
|
+
return `[${variations.join('')}]`;
|
|
1395
2302
|
}
|
|
1396
2303
|
return char;
|
|
1397
2304
|
})
|
|
1398
|
-
.join(
|
|
2305
|
+
.join('');
|
|
1399
2306
|
}
|
|
1400
2307
|
/**
|
|
1401
2308
|
* Membuat regex untuk mencocokkan kata dengan mempertimbangkan variasi ejaan Bahasa Indonesia
|
|
@@ -1405,7 +2312,7 @@ function addIndonesianVariations(pattern) {
|
|
|
1405
2312
|
*/
|
|
1406
2313
|
function createIndonesianVariationRegex(word) {
|
|
1407
2314
|
const pattern = addIndonesianVariations(escapeRegExp(word));
|
|
1408
|
-
return new RegExp(`\\b${pattern}\\b`,
|
|
2315
|
+
return new RegExp(`\\b${pattern}\\b`, 'gi');
|
|
1409
2316
|
}
|
|
1410
2317
|
/**
|
|
1411
2318
|
* Membuat regex untuk mencocokkan kata dengan konteks
|
|
@@ -1418,7 +2325,7 @@ function createContextRegex(word, contextSize = 3) {
|
|
|
1418
2325
|
const wordPattern = escapeRegExp(word);
|
|
1419
2326
|
// Membuat pola yang menangkap beberapa kata sebelum dan setelah kata target
|
|
1420
2327
|
const pattern = `((?:\\S+\\s+){0,${contextSize}})(\\b${wordPattern}\\b)((?:\\s+\\S+){0,${contextSize}})`;
|
|
1421
|
-
return new RegExp(pattern,
|
|
2328
|
+
return new RegExp(pattern, 'gi');
|
|
1422
2329
|
}
|
|
1423
2330
|
/**
|
|
1424
2331
|
* Membuat regex untuk mencocokkan variasi penulisan kata
|
|
@@ -1429,8 +2336,8 @@ function createContextRegex(word, contextSize = 3) {
|
|
|
1429
2336
|
function createWordFormRegex(word) {
|
|
1430
2337
|
// Implementasi sederhana untuk mencocokkan berbagai imbuhan
|
|
1431
2338
|
// Ini bisa dikembangkan lebih lanjut untuk mencocokkan bentukan kata yang lebih kompleks
|
|
1432
|
-
const prefixes = [
|
|
1433
|
-
const suffixes = [
|
|
2339
|
+
const prefixes = ['', 'me', 'pe', 'ber', 'di', 'ter', 'se'];
|
|
2340
|
+
const suffixes = ['', 'kan', 'an', 'i', 'nya'];
|
|
1434
2341
|
const patterns = [];
|
|
1435
2342
|
// Kombinasikan prefix dan suffix
|
|
1436
2343
|
for (const prefix of prefixes) {
|
|
@@ -1438,7 +2345,7 @@ function createWordFormRegex(word) {
|
|
|
1438
2345
|
patterns.push(`\\b${prefix}${escapeRegExp(word)}${suffix}\\b`);
|
|
1439
2346
|
}
|
|
1440
2347
|
}
|
|
1441
|
-
return new RegExp(patterns.join(
|
|
2348
|
+
return new RegExp(patterns.join('|'), 'gi');
|
|
1442
2349
|
}
|
|
1443
2350
|
|
|
1444
2351
|
/**
|
|
@@ -1472,7 +2379,8 @@ function levenshteinDistance(str1, str2) {
|
|
|
1472
2379
|
const cost = s1[i - 1] === s2[j - 1] ? 0 : 1;
|
|
1473
2380
|
matrix[i][j] = Math.min(matrix[i - 1][j] + 1, // deletion
|
|
1474
2381
|
matrix[i][j - 1] + 1, // insertion
|
|
1475
|
-
matrix[i - 1][j - 1] + cost
|
|
2382
|
+
matrix[i - 1][j - 1] + cost // substitution
|
|
2383
|
+
);
|
|
1476
2384
|
}
|
|
1477
2385
|
}
|
|
1478
2386
|
return matrix[len1][len2];
|
|
@@ -1651,8 +2559,7 @@ function findPossibleProfanityBySimiliarity(text, profanityWords, threshold = 0.
|
|
|
1651
2559
|
let bestMatch = null;
|
|
1652
2560
|
for (const profanity of lengthFilteredCandidates) {
|
|
1653
2561
|
const similarity = stringSimilarity(word, profanity);
|
|
1654
|
-
if (similarity >= threshold &&
|
|
1655
|
-
(!bestMatch || similarity > bestMatch.similarity)) {
|
|
2562
|
+
if (similarity >= threshold && (!bestMatch || similarity > bestMatch.similarity)) {
|
|
1656
2563
|
bestMatch = {
|
|
1657
2564
|
word,
|
|
1658
2565
|
original: profanity,
|
|
@@ -1701,8 +2608,7 @@ function findProfanityByLevenshteinDistance(text, profanityWords, threshold = 0.
|
|
|
1701
2608
|
const distance = levenshteinDistance(word, profanity);
|
|
1702
2609
|
if (distance <= maxDistance) {
|
|
1703
2610
|
const similarity = 1 - distance / Math.max(word.length, profanity.length);
|
|
1704
|
-
if (similarity >= threshold &&
|
|
1705
|
-
(!bestMatch || similarity > bestMatch.similarity)) {
|
|
2611
|
+
if (similarity >= threshold && (!bestMatch || similarity > bestMatch.similarity)) {
|
|
1706
2612
|
bestMatch = {
|
|
1707
2613
|
word,
|
|
1708
2614
|
original: profanity,
|
|
@@ -1748,7 +2654,7 @@ function isCharacterCountSimilar(str1, str2, maxDifference) {
|
|
|
1748
2654
|
}
|
|
1749
2655
|
|
|
1750
2656
|
const DEFAULT_OPTIONS = {
|
|
1751
|
-
replaceWith:
|
|
2657
|
+
replaceWith: '*',
|
|
1752
2658
|
fullWordCensor: true,
|
|
1753
2659
|
detectLeetSpeak: true,
|
|
1754
2660
|
checkSubstring: false,
|
|
@@ -1771,7 +2677,7 @@ const FILTER_PRESETS = {
|
|
|
1771
2677
|
light: {
|
|
1772
2678
|
...DEFAULT_OPTIONS,
|
|
1773
2679
|
severityThreshold: 0.7,
|
|
1774
|
-
categories: [
|
|
2680
|
+
categories: ['sexual', 'slur', 'blasphemy'],
|
|
1775
2681
|
},
|
|
1776
2682
|
childSafe: {
|
|
1777
2683
|
...DEFAULT_OPTIONS,
|
|
@@ -1784,49 +2690,49 @@ const FILTER_PRESETS = {
|
|
|
1784
2690
|
const CATEGORY_PRESETS = {
|
|
1785
2691
|
sexual: {
|
|
1786
2692
|
...DEFAULT_OPTIONS,
|
|
1787
|
-
categories: [
|
|
2693
|
+
categories: ['sexual'],
|
|
1788
2694
|
},
|
|
1789
2695
|
insults: {
|
|
1790
2696
|
...DEFAULT_OPTIONS,
|
|
1791
|
-
categories: [
|
|
2697
|
+
categories: ['insult'],
|
|
1792
2698
|
},
|
|
1793
2699
|
profanity: {
|
|
1794
2700
|
...DEFAULT_OPTIONS,
|
|
1795
|
-
categories: [
|
|
2701
|
+
categories: ['profanity'],
|
|
1796
2702
|
},
|
|
1797
2703
|
};
|
|
1798
2704
|
const REGION_PRESETS = {
|
|
1799
2705
|
general: {
|
|
1800
2706
|
...DEFAULT_OPTIONS,
|
|
1801
|
-
regions: [
|
|
2707
|
+
regions: ['general'],
|
|
1802
2708
|
},
|
|
1803
2709
|
jawa: {
|
|
1804
2710
|
...DEFAULT_OPTIONS,
|
|
1805
|
-
regions: [
|
|
2711
|
+
regions: ['jawa'],
|
|
1806
2712
|
},
|
|
1807
2713
|
sunda: {
|
|
1808
2714
|
...DEFAULT_OPTIONS,
|
|
1809
|
-
regions: [
|
|
2715
|
+
regions: ['sunda'],
|
|
1810
2716
|
},
|
|
1811
2717
|
betawi: {
|
|
1812
2718
|
...DEFAULT_OPTIONS,
|
|
1813
|
-
regions: [
|
|
2719
|
+
regions: ['betawi'],
|
|
1814
2720
|
},
|
|
1815
2721
|
batak: {
|
|
1816
2722
|
...DEFAULT_OPTIONS,
|
|
1817
|
-
regions: [
|
|
2723
|
+
regions: ['batak'],
|
|
1818
2724
|
},
|
|
1819
2725
|
};
|
|
1820
2726
|
const REPLACEMENT_CHARS = {
|
|
1821
|
-
asterisk:
|
|
1822
|
-
hash:
|
|
1823
|
-
dollar:
|
|
1824
|
-
at:
|
|
1825
|
-
percent:
|
|
1826
|
-
underscore:
|
|
1827
|
-
dash:
|
|
1828
|
-
dot:
|
|
1829
|
-
grawlix:
|
|
2727
|
+
asterisk: '*',
|
|
2728
|
+
hash: '#',
|
|
2729
|
+
dollar: '$',
|
|
2730
|
+
at: '@',
|
|
2731
|
+
percent: '%',
|
|
2732
|
+
underscore: '_',
|
|
2733
|
+
dash: '-',
|
|
2734
|
+
dot: '.',
|
|
2735
|
+
grawlix: '#@$%&!',
|
|
1830
2736
|
};
|
|
1831
2737
|
/**
|
|
1832
2738
|
* Membuat opsi custom dengan menggabungkan dengan default
|
|
@@ -1853,8 +2759,7 @@ function getPresetOptions(presetName, additionalOptions = {}) {
|
|
|
1853
2759
|
presetOptions = FILTER_PRESETS[presetName];
|
|
1854
2760
|
}
|
|
1855
2761
|
else if (presetName in CATEGORY_PRESETS) {
|
|
1856
|
-
presetOptions =
|
|
1857
|
-
CATEGORY_PRESETS[presetName];
|
|
2762
|
+
presetOptions = CATEGORY_PRESETS[presetName];
|
|
1858
2763
|
}
|
|
1859
2764
|
else if (presetName in REGION_PRESETS) {
|
|
1860
2765
|
presetOptions = REGION_PRESETS[presetName];
|
|
@@ -1873,7 +2778,7 @@ function getPresetOptions(presetName, additionalOptions = {}) {
|
|
|
1873
2778
|
* @param type Tipe karakter pengganti
|
|
1874
2779
|
* @returns Karakter pengganti
|
|
1875
2780
|
*/
|
|
1876
|
-
function getReplacementChar(type =
|
|
2781
|
+
function getReplacementChar(type = 'asterisk') {
|
|
1877
2782
|
return REPLACEMENT_CHARS[type] || REPLACEMENT_CHARS.asterisk;
|
|
1878
2783
|
}
|
|
1879
2784
|
/**
|
|
@@ -1892,7 +2797,7 @@ function getRandomGrawlix() {
|
|
|
1892
2797
|
* @returns String pengganti
|
|
1893
2798
|
*/
|
|
1894
2799
|
function makeRandomGrawlixString(length) {
|
|
1895
|
-
let result =
|
|
2800
|
+
let result = '';
|
|
1896
2801
|
const grawlix = REPLACEMENT_CHARS.grawlix;
|
|
1897
2802
|
for (let i = 0; i < length; i++) {
|
|
1898
2803
|
result += grawlix[Math.floor(Math.random() * grawlix.length)];
|
|
@@ -1920,7 +2825,7 @@ class AhoCorasick {
|
|
|
1920
2825
|
*/
|
|
1921
2826
|
addPattern(pattern) {
|
|
1922
2827
|
if (this.built) {
|
|
1923
|
-
throw new Error(
|
|
2828
|
+
throw new Error('Cannot add patterns after the automaton is built');
|
|
1924
2829
|
}
|
|
1925
2830
|
let node = this.root;
|
|
1926
2831
|
const normalizedPattern = pattern.toLowerCase();
|
|
@@ -2057,9 +2962,7 @@ function findProfanity(text, options = {}) {
|
|
|
2057
2962
|
let baseWordsToCheck = wordList.length > 0 ? wordList : [];
|
|
2058
2963
|
if (baseWordsToCheck.length === 0) {
|
|
2059
2964
|
const filteredWords = wordObjects.filter((word) => {
|
|
2060
|
-
const matchCategory = categories
|
|
2061
|
-
? categories.includes(word.category)
|
|
2062
|
-
: true;
|
|
2965
|
+
const matchCategory = categories ? categories.includes(word.category) : true;
|
|
2063
2966
|
const matchRegion = regions ? regions.includes(word.region) : true;
|
|
2064
2967
|
const matchSeverity = word.severity >= severityThreshold;
|
|
2065
2968
|
return matchCategory && matchRegion && matchSeverity;
|
|
@@ -2069,9 +2972,7 @@ function findProfanity(text, options = {}) {
|
|
|
2069
2972
|
const aliasMap = new Map();
|
|
2070
2973
|
wordObjects.forEach((wordObj) => {
|
|
2071
2974
|
if (wordObj.aliases && wordObj.aliases.length > 0) {
|
|
2072
|
-
const matchCategory = categories
|
|
2073
|
-
? categories.includes(wordObj.category)
|
|
2074
|
-
: true;
|
|
2975
|
+
const matchCategory = categories ? categories.includes(wordObj.category) : true;
|
|
2075
2976
|
const matchRegion = regions ? regions.includes(wordObj.region) : true;
|
|
2076
2977
|
const matchSeverity = wordObj.severity >= severityThreshold;
|
|
2077
2978
|
if (matchCategory && matchRegion && matchSeverity) {
|
|
@@ -2081,10 +2982,7 @@ function findProfanity(text, options = {}) {
|
|
|
2081
2982
|
}
|
|
2082
2983
|
}
|
|
2083
2984
|
});
|
|
2084
|
-
const wordsToCheck = [
|
|
2085
|
-
...baseWordsToCheck,
|
|
2086
|
-
...Array.from(aliasMap.keys()),
|
|
2087
|
-
].filter((word) => !whitelist.includes(word.toLowerCase()));
|
|
2985
|
+
const wordsToCheck = [...baseWordsToCheck, ...Array.from(aliasMap.keys())].filter((word) => !whitelist.includes(word.toLowerCase()));
|
|
2088
2986
|
if (wordsToCheck.length === 0) {
|
|
2089
2987
|
return [];
|
|
2090
2988
|
}
|
|
@@ -2164,8 +3062,7 @@ function findProfanity(text, options = {}) {
|
|
|
2164
3062
|
if (useLevenshtein) {
|
|
2165
3063
|
const possibleProfanity = findProfanityByLevenshteinDistance(text, wordsToCheck, similarityThreshold, maxLevenshteinDistance);
|
|
2166
3064
|
possibleProfanity.forEach((item) => {
|
|
2167
|
-
const originalWord = aliasMap.get(item.original.toLowerCase()) ||
|
|
2168
|
-
item.original.toLowerCase();
|
|
3065
|
+
const originalWord = aliasMap.get(item.original.toLowerCase()) || item.original.toLowerCase();
|
|
2169
3066
|
matches.add(originalWord);
|
|
2170
3067
|
if (!actualMatches.has(originalWord)) {
|
|
2171
3068
|
actualMatches.set(originalWord, []);
|
|
@@ -2177,8 +3074,7 @@ function findProfanity(text, options = {}) {
|
|
|
2177
3074
|
const possibleProfanity = findPossibleProfanityBySimiliarity(text, wordsToCheck, similarityThreshold);
|
|
2178
3075
|
possibleProfanity.forEach((item) => {
|
|
2179
3076
|
matches.add(item.original.toLowerCase());
|
|
2180
|
-
const originalWord = aliasMap.get(item.original.toLowerCase()) ||
|
|
2181
|
-
item.original.toLowerCase();
|
|
3077
|
+
const originalWord = aliasMap.get(item.original.toLowerCase()) || item.original.toLowerCase();
|
|
2182
3078
|
if (!actualMatches.has(originalWord)) {
|
|
2183
3079
|
actualMatches.set(originalWord, []);
|
|
2184
3080
|
}
|
|
@@ -2204,8 +3100,7 @@ function findProfanityWithMetadata(text, options = {}) {
|
|
|
2204
3100
|
return matches
|
|
2205
3101
|
.map((word) => {
|
|
2206
3102
|
const wordObject = wordObjects.find((obj) => obj.word.toLowerCase() === word.toLowerCase() ||
|
|
2207
|
-
(obj.aliases &&
|
|
2208
|
-
obj.aliases.some((alias) => alias.toLowerCase() === word.toLowerCase())));
|
|
3103
|
+
(obj.aliases && obj.aliases.some((alias) => alias.toLowerCase() === word.toLowerCase())));
|
|
2209
3104
|
return wordObject;
|
|
2210
3105
|
})
|
|
2211
3106
|
.filter((word) => word !== undefined);
|
|
@@ -2276,7 +3171,7 @@ function calculateSeverity(matchDetails) {
|
|
|
2276
3171
|
* @returns FilterResult dengan hasil filter
|
|
2277
3172
|
*/
|
|
2278
3173
|
function filter(text, options = {}) {
|
|
2279
|
-
const { replaceWith =
|
|
3174
|
+
const { replaceWith = '*', fullWordCensor = true, detectLeetSpeak = true, whitelist = [], checkSubstring = false, useRandomGrawlix = false, keepFirstAndLast = false, indonesianVariation = false, detectSplit = false, detectSimilarity = false, useLevenshtein = false, maxLevenshteinDistance = 2, similarityThreshold = 0.8, } = { ...DEFAULT_OPTIONS, ...options };
|
|
2280
3175
|
const matches = findProfanity(text, {
|
|
2281
3176
|
...options,
|
|
2282
3177
|
detectLeetSpeak,
|
|
@@ -2302,13 +3197,12 @@ function filter(text, options = {}) {
|
|
|
2302
3197
|
const replacements = [];
|
|
2303
3198
|
matches.forEach((word) => {
|
|
2304
3199
|
const metadata = matchDetails.find((m) => m.word.toLowerCase() === word.toLowerCase() ||
|
|
2305
|
-
(m.aliases &&
|
|
2306
|
-
m.aliases.some((alias) => alias.toLowerCase() === word.toLowerCase())));
|
|
3200
|
+
(m.aliases && m.aliases.some((alias) => alias.toLowerCase() === word.toLowerCase())));
|
|
2307
3201
|
const variants = actualMatches.get(word.toLowerCase()) || [];
|
|
2308
3202
|
variants.push(word);
|
|
2309
3203
|
const uniqueVariants = [...new Set(variants)];
|
|
2310
3204
|
uniqueVariants.forEach((variant) => {
|
|
2311
|
-
const regex = new RegExp(`\\b${escapeRegExp(variant)}\\b`,
|
|
3205
|
+
const regex = new RegExp(`\\b${escapeRegExp(variant)}\\b`, 'gi');
|
|
2312
3206
|
let match;
|
|
2313
3207
|
while ((match = regex.exec(filteredText)) !== null) {
|
|
2314
3208
|
const originalWord = match[0];
|
|
@@ -2326,7 +3220,7 @@ function filter(text, options = {}) {
|
|
|
2326
3220
|
censored: censoredWord,
|
|
2327
3221
|
metadata,
|
|
2328
3222
|
});
|
|
2329
|
-
filteredText = filteredText.replace(new RegExp(`\\b${escapeRegExp(originalWord)}\\b`,
|
|
3223
|
+
filteredText = filteredText.replace(new RegExp(`\\b${escapeRegExp(originalWord)}\\b`, 'g'), censoredWord);
|
|
2330
3224
|
}
|
|
2331
3225
|
});
|
|
2332
3226
|
if (detectSplit || detectLeetSpeak) {
|
|
@@ -2355,7 +3249,7 @@ function filter(text, options = {}) {
|
|
|
2355
3249
|
censored: censoredWord,
|
|
2356
3250
|
metadata,
|
|
2357
3251
|
});
|
|
2358
|
-
filteredText = filteredText.replace(new RegExp(escapeRegExp(originalWord),
|
|
3252
|
+
filteredText = filteredText.replace(new RegExp(escapeRegExp(originalWord), 'g'), censoredWord);
|
|
2359
3253
|
}
|
|
2360
3254
|
}
|
|
2361
3255
|
if (detectSplit) {
|
|
@@ -2383,7 +3277,7 @@ function filter(text, options = {}) {
|
|
|
2383
3277
|
censored: censoredWord,
|
|
2384
3278
|
metadata,
|
|
2385
3279
|
});
|
|
2386
|
-
filteredText = filteredText.replace(new RegExp(escapeRegExp(originalWord),
|
|
3280
|
+
filteredText = filteredText.replace(new RegExp(escapeRegExp(originalWord), 'g'), censoredWord);
|
|
2387
3281
|
}
|
|
2388
3282
|
}
|
|
2389
3283
|
}
|
|
@@ -2391,11 +3285,10 @@ function filter(text, options = {}) {
|
|
|
2391
3285
|
if (detectSimilarity && useLevenshtein) {
|
|
2392
3286
|
matches.forEach((word) => {
|
|
2393
3287
|
const metadata = matchDetails.find((m) => m.word.toLowerCase() === word.toLowerCase() ||
|
|
2394
|
-
(m.aliases &&
|
|
2395
|
-
m.aliases.some((alias) => alias.toLowerCase() === word.toLowerCase())));
|
|
3288
|
+
(m.aliases && m.aliases.some((alias) => alias.toLowerCase() === word.toLowerCase())));
|
|
2396
3289
|
const variants = actualMatches.get(word.toLowerCase()) || [];
|
|
2397
3290
|
variants.forEach((variant) => {
|
|
2398
|
-
const exactVariantRegex = new RegExp(`\\b${escapeRegExp(variant)}\\b`,
|
|
3291
|
+
const exactVariantRegex = new RegExp(`\\b${escapeRegExp(variant)}\\b`, 'gi');
|
|
2399
3292
|
let match;
|
|
2400
3293
|
while ((match = exactVariantRegex.exec(filteredText)) !== null) {
|
|
2401
3294
|
const originalWord = match[0];
|
|
@@ -2413,7 +3306,7 @@ function filter(text, options = {}) {
|
|
|
2413
3306
|
censored: censoredWord,
|
|
2414
3307
|
metadata,
|
|
2415
3308
|
});
|
|
2416
|
-
filteredText = filteredText.replace(new RegExp(`\\b${escapeRegExp(originalWord)}\\b`,
|
|
3309
|
+
filteredText = filteredText.replace(new RegExp(`\\b${escapeRegExp(originalWord)}\\b`, 'g'), censoredWord);
|
|
2417
3310
|
}
|
|
2418
3311
|
});
|
|
2419
3312
|
});
|
|
@@ -2572,9 +3465,9 @@ function analyzeWithContext(text, contextWindowSize = 5, options = {}) {
|
|
|
2572
3465
|
const regex = createContextRegex(word, contextWindowSize);
|
|
2573
3466
|
let match;
|
|
2574
3467
|
while ((match = regex.exec(text)) !== null) {
|
|
2575
|
-
const beforeContext = match[1] ||
|
|
3468
|
+
const beforeContext = match[1] || '';
|
|
2576
3469
|
const wordMatch = match[2];
|
|
2577
|
-
const afterContext = match[3] ||
|
|
3470
|
+
const afterContext = match[3] || '';
|
|
2578
3471
|
result.push({
|
|
2579
3472
|
word: wordMatch,
|
|
2580
3473
|
context: beforeContext + wordMatch + afterContext,
|
|
@@ -2675,10 +3568,7 @@ class IDProfanityFilter {
|
|
|
2675
3568
|
* @param word Kata yang akan diabaikan
|
|
2676
3569
|
*/
|
|
2677
3570
|
addToWhitelist(word) {
|
|
2678
|
-
this.options.whitelist = [
|
|
2679
|
-
...(this.options.whitelist || []),
|
|
2680
|
-
word.toLowerCase(),
|
|
2681
|
-
];
|
|
3571
|
+
this.options.whitelist = [...(this.options.whitelist || []), word.toLowerCase()];
|
|
2682
3572
|
}
|
|
2683
3573
|
/**
|
|
2684
3574
|
* Menghapus kata dari whitelist
|