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