@sideid/id-profanity-filter 1.11.7 → 1.11.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +2 -2
- package/dist/index.esm.js +1166 -438
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +1166 -438
- 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/minang.d.ts +4 -0
- 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 -9
- package/src/constants/regions/bali.ts +4 -7
- package/src/constants/regions/batak.ts +169 -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 +2 -4
- package/src/constants/regions/minang.ts +53 -0
- package/src/constants/regions/sunda.ts +2 -4
- package/src/constants/wordList.ts +31 -34
- package/src/core/analyzer.ts +15 -26
- package/src/core/filter.ts +23 -39
- package/src/core/matcher.ts +25 -49
- package/src/index.ts +5 -16
- package/src/types/index.ts +26 -25
- package/src/utils/ahoCorasick.ts +1 -1
- package/src/utils/regexUtils.ts +37 -43
- package/src/utils/similarityUtils.ts +13 -28
- package/src/utils/stringUtils.ts +30 -38
- /package/{prettierrc → .prettierrc} +0 -0
package/dist/index.esm.js
CHANGED
|
@@ -1,211 +1,211 @@
|
|
|
1
1
|
const general = [
|
|
2
2
|
{
|
|
3
|
-
word:
|
|
4
|
-
category:
|
|
5
|
-
region:
|
|
3
|
+
word: 'anjing',
|
|
4
|
+
category: 'profanity',
|
|
5
|
+
region: 'general',
|
|
6
6
|
severity: 0.7,
|
|
7
|
-
aliases: [
|
|
8
|
-
description:
|
|
9
|
-
context:
|
|
7
|
+
aliases: ['anjay', 'anjir', 'anying', 'njing', 'anj', 'anjg', 'ajg'],
|
|
8
|
+
description: 'Mengacu pada hewan anjing, digunakan sebagai umpatan',
|
|
9
|
+
context: 'Umpatan umum untuk menunjukkan kemarahan atau ketidaksetujuan',
|
|
10
10
|
},
|
|
11
11
|
{
|
|
12
|
-
word:
|
|
13
|
-
category:
|
|
14
|
-
region:
|
|
12
|
+
word: 'babi',
|
|
13
|
+
category: 'profanity',
|
|
14
|
+
region: 'general',
|
|
15
15
|
severity: 0.6,
|
|
16
|
-
aliases: [
|
|
17
|
-
description:
|
|
18
|
-
context:
|
|
16
|
+
aliases: ['bab1', 'b4b1', 'b4bi', '8481', '8ab1', 'ba81'],
|
|
17
|
+
description: 'Mengacu pada hewan babi, digunakan sebagai umpatan',
|
|
18
|
+
context: 'Umpatan umum untuk menunjukkan kemarahan atau ketidaksetujuan',
|
|
19
19
|
},
|
|
20
20
|
{
|
|
21
|
-
word:
|
|
22
|
-
category:
|
|
23
|
-
region:
|
|
21
|
+
word: 'bangsat',
|
|
22
|
+
category: 'insult',
|
|
23
|
+
region: 'general',
|
|
24
24
|
severity: 0.8,
|
|
25
|
-
aliases: [
|
|
26
|
-
description:
|
|
27
|
-
context:
|
|
25
|
+
aliases: ['bangst', 'bngst', 'bgst'],
|
|
26
|
+
description: 'Secara harfiah berarti kutu busuk, digunakan sebagai umpatan untuk menyebut seseorang yang tidak bermoral',
|
|
27
|
+
context: 'Umpatan kasar untuk menyebut orang yang dianggap jahat atau merugikan',
|
|
28
28
|
},
|
|
29
29
|
{
|
|
30
|
-
word:
|
|
31
|
-
category:
|
|
32
|
-
region:
|
|
30
|
+
word: 'kontol',
|
|
31
|
+
category: 'sexual',
|
|
32
|
+
region: 'general',
|
|
33
33
|
severity: 0.9,
|
|
34
|
-
aliases: [
|
|
35
|
-
description:
|
|
36
|
-
context:
|
|
34
|
+
aliases: ['kntl', 'k0ntol', 'k0nt0l'],
|
|
35
|
+
description: 'Kata vulgar yang mengacu pada alat kelamin laki-laki',
|
|
36
|
+
context: 'Umpatan kasar atau istilah vulgar untuk alat kelamin',
|
|
37
37
|
},
|
|
38
38
|
{
|
|
39
|
-
word:
|
|
40
|
-
category:
|
|
41
|
-
region:
|
|
39
|
+
word: 'memek',
|
|
40
|
+
category: 'sexual',
|
|
41
|
+
region: 'general',
|
|
42
42
|
severity: 0.9,
|
|
43
|
-
aliases: [
|
|
44
|
-
description:
|
|
45
|
-
context:
|
|
43
|
+
aliases: ['mmk', 'memk'],
|
|
44
|
+
description: 'Kata vulgar yang mengacu pada alat kelamin perempuan',
|
|
45
|
+
context: 'Umpatan kasar atau istilah vulgar untuk alat kelamin',
|
|
46
46
|
},
|
|
47
47
|
{
|
|
48
|
-
word:
|
|
49
|
-
category:
|
|
50
|
-
region:
|
|
48
|
+
word: 'bego',
|
|
49
|
+
category: 'insult',
|
|
50
|
+
region: 'general',
|
|
51
51
|
severity: 0.5,
|
|
52
|
-
aliases: [
|
|
53
|
-
description:
|
|
54
|
-
context:
|
|
52
|
+
aliases: ['bgo', 'begok'],
|
|
53
|
+
description: 'Kata yang mengacu pada kebodohan seseorang',
|
|
54
|
+
context: 'Hinaan untuk menyebut orang yang dianggap tidak pintar',
|
|
55
55
|
},
|
|
56
56
|
{
|
|
57
|
-
word:
|
|
58
|
-
category:
|
|
59
|
-
region:
|
|
57
|
+
word: 'tolol',
|
|
58
|
+
category: 'insult',
|
|
59
|
+
region: 'general',
|
|
60
60
|
severity: 0.6,
|
|
61
|
-
aliases: [
|
|
62
|
-
description:
|
|
63
|
-
context:
|
|
61
|
+
aliases: ['tll', 'tlol'],
|
|
62
|
+
description: 'Kata yang mengacu pada kebodohan seseorang',
|
|
63
|
+
context: 'Hinaan untuk menyebut orang yang dianggap tidak pintar',
|
|
64
64
|
},
|
|
65
65
|
{
|
|
66
|
-
word:
|
|
67
|
-
category:
|
|
68
|
-
region:
|
|
66
|
+
word: 'bajingan',
|
|
67
|
+
category: 'insult',
|
|
68
|
+
region: 'general',
|
|
69
69
|
severity: 0.7,
|
|
70
|
-
aliases: [
|
|
71
|
-
description:
|
|
72
|
-
context:
|
|
70
|
+
aliases: ['bajingn', 'bjgn'],
|
|
71
|
+
description: 'Kata yang mengacu pada orang jahat atau tidak bermoral',
|
|
72
|
+
context: 'Hinaan untuk menyebut orang yang dianggap jahat atau tidak bermoral',
|
|
73
73
|
},
|
|
74
74
|
{
|
|
75
|
-
word:
|
|
76
|
-
category:
|
|
77
|
-
region:
|
|
75
|
+
word: 'goblok',
|
|
76
|
+
category: 'insult',
|
|
77
|
+
region: 'general',
|
|
78
78
|
severity: 0.6,
|
|
79
|
-
aliases: [
|
|
80
|
-
description:
|
|
81
|
-
context:
|
|
79
|
+
aliases: ['gblk', 'goblk'],
|
|
80
|
+
description: 'Kata yang mengacu pada kebodohan seseorang',
|
|
81
|
+
context: 'Hinaan untuk menyebut orang yang dianggap tidak pintar',
|
|
82
82
|
},
|
|
83
83
|
{
|
|
84
|
-
word:
|
|
85
|
-
category:
|
|
86
|
-
region:
|
|
84
|
+
word: 'keparat',
|
|
85
|
+
category: 'insult',
|
|
86
|
+
region: 'general',
|
|
87
87
|
severity: 0.7,
|
|
88
|
-
aliases: [
|
|
89
|
-
description:
|
|
90
|
-
context:
|
|
88
|
+
aliases: ['kprt', 'keprat'],
|
|
89
|
+
description: 'Kata yang mengacu pada orang jahat atau tidak bermoral',
|
|
90
|
+
context: 'Hinaan untuk menyebut orang yang dianggap jahat atau tidak bermoral',
|
|
91
91
|
},
|
|
92
92
|
{
|
|
93
|
-
word:
|
|
94
|
-
category:
|
|
95
|
-
region:
|
|
93
|
+
word: 'bacot',
|
|
94
|
+
category: 'insult',
|
|
95
|
+
region: 'general',
|
|
96
96
|
severity: 0.5,
|
|
97
|
-
aliases: [
|
|
98
|
-
description:
|
|
99
|
-
context:
|
|
97
|
+
aliases: ['bcot', 'bacot2'],
|
|
98
|
+
description: 'Kata yang mengacu pada orang yang banyak bicara',
|
|
99
|
+
context: 'Hinaan untuk menyebut orang yang banyak bicara atau cerewet',
|
|
100
100
|
},
|
|
101
101
|
{
|
|
102
|
-
word:
|
|
103
|
-
category:
|
|
104
|
-
region:
|
|
102
|
+
word: 'ngentot',
|
|
103
|
+
category: 'sexual',
|
|
104
|
+
region: 'general',
|
|
105
105
|
severity: 0.9,
|
|
106
|
-
aliases: [
|
|
107
|
-
description:
|
|
108
|
-
context:
|
|
106
|
+
aliases: ['ngentod', 'ntot', 'tod'],
|
|
107
|
+
description: 'Istilah kasar untuk aktivitas seksual',
|
|
108
|
+
context: 'Kata vulgar yang merujuk pada aktivitas seksual',
|
|
109
109
|
},
|
|
110
110
|
{
|
|
111
|
-
word:
|
|
112
|
-
category:
|
|
113
|
-
region:
|
|
111
|
+
word: 'sialan',
|
|
112
|
+
category: 'insult',
|
|
113
|
+
region: 'general',
|
|
114
114
|
severity: 0.5,
|
|
115
|
-
aliases: [
|
|
116
|
-
description:
|
|
117
|
-
context:
|
|
115
|
+
aliases: ['sialn', 'sl'],
|
|
116
|
+
description: 'Kata yang mengacu pada orang yang membawa sial',
|
|
117
|
+
context: 'Hinaan untuk menyebut orang yang dianggap membawa sial',
|
|
118
118
|
},
|
|
119
119
|
{
|
|
120
|
-
word:
|
|
121
|
-
category:
|
|
122
|
-
region:
|
|
120
|
+
word: 'pler',
|
|
121
|
+
category: 'sexual',
|
|
122
|
+
region: 'general',
|
|
123
123
|
severity: 0.9,
|
|
124
|
-
aliases: [
|
|
125
|
-
description:
|
|
126
|
-
context:
|
|
124
|
+
aliases: ['peler', 'plr', 'biji'],
|
|
125
|
+
description: 'Istilah kasar untuk alat kelamin laki-laki',
|
|
126
|
+
context: 'Kata vulgar yang merujuk pada alat kelamin laki-laki',
|
|
127
127
|
},
|
|
128
128
|
{
|
|
129
|
-
word:
|
|
130
|
-
category:
|
|
131
|
-
region:
|
|
129
|
+
word: 'bokep',
|
|
130
|
+
category: 'sexual',
|
|
131
|
+
region: 'general',
|
|
132
132
|
severity: 0.7,
|
|
133
|
-
aliases: [
|
|
134
|
-
description:
|
|
135
|
-
context:
|
|
133
|
+
aliases: ['bkp', 'bokap'],
|
|
134
|
+
description: 'Istilah untuk video atau konten pornografi',
|
|
135
|
+
context: 'Kata yang mengacu pada materi pornografi',
|
|
136
136
|
},
|
|
137
137
|
{
|
|
138
|
-
word:
|
|
139
|
-
category:
|
|
140
|
-
region:
|
|
138
|
+
word: 'coli',
|
|
139
|
+
category: 'sexual',
|
|
140
|
+
region: 'general',
|
|
141
141
|
severity: 0.8,
|
|
142
|
-
aliases: [
|
|
143
|
-
description:
|
|
144
|
-
context:
|
|
142
|
+
aliases: ['col', 'coly'],
|
|
143
|
+
description: 'Istilah untuk masturbasi laki-laki',
|
|
144
|
+
context: 'Kata vulgar yang merujuk pada aktivitas seksual pribadi',
|
|
145
145
|
},
|
|
146
146
|
{
|
|
147
|
-
word:
|
|
148
|
-
category:
|
|
149
|
-
region:
|
|
147
|
+
word: 'desah',
|
|
148
|
+
category: 'sexual',
|
|
149
|
+
region: 'general',
|
|
150
150
|
severity: 0.6,
|
|
151
|
-
aliases: [
|
|
152
|
-
description:
|
|
153
|
-
context:
|
|
151
|
+
aliases: ['ds4h', 'dsh'],
|
|
152
|
+
description: 'Istilah untuk suara yang dibuat selama aktivitas seksual',
|
|
153
|
+
context: 'Dapat menjadi vulgar tergantung konteks penggunaan',
|
|
154
154
|
},
|
|
155
155
|
{
|
|
156
|
-
word:
|
|
157
|
-
category:
|
|
158
|
-
region:
|
|
156
|
+
word: 'seks',
|
|
157
|
+
category: 'sexual',
|
|
158
|
+
region: 'general',
|
|
159
159
|
severity: 0.5,
|
|
160
|
-
aliases: [
|
|
161
|
-
description:
|
|
162
|
-
context:
|
|
160
|
+
aliases: ['sex', 'ML'],
|
|
161
|
+
description: 'Istilah untuk aktivitas seksual',
|
|
162
|
+
context: 'Dapat menjadi vulgar tergantung konteks penggunaan',
|
|
163
163
|
},
|
|
164
164
|
{
|
|
165
|
-
word:
|
|
166
|
-
category:
|
|
167
|
-
region:
|
|
165
|
+
word: 'kondom',
|
|
166
|
+
category: 'sexual',
|
|
167
|
+
region: 'general',
|
|
168
168
|
severity: 0.5,
|
|
169
|
-
aliases: [
|
|
170
|
-
description:
|
|
171
|
-
context:
|
|
169
|
+
aliases: ['kndm', 'kondom', 'cd'],
|
|
170
|
+
description: 'Alat kontrasepsi',
|
|
171
|
+
context: 'Dapat menjadi vulgar tergantung konteks penggunaan',
|
|
172
172
|
},
|
|
173
173
|
{
|
|
174
|
-
word:
|
|
175
|
-
category:
|
|
176
|
-
region:
|
|
174
|
+
word: 'ngewe',
|
|
175
|
+
category: 'sexual',
|
|
176
|
+
region: 'general',
|
|
177
177
|
severity: 0.9,
|
|
178
|
-
aliases: [
|
|
179
|
-
description:
|
|
180
|
-
context:
|
|
178
|
+
aliases: ['ngew', 'we'],
|
|
179
|
+
description: 'Istilah kasar untuk aktivitas seksual',
|
|
180
|
+
context: 'Kata vulgar yang merujuk pada aktivitas seksual',
|
|
181
181
|
},
|
|
182
182
|
{
|
|
183
|
-
word:
|
|
184
|
-
category:
|
|
185
|
-
region:
|
|
183
|
+
word: 'puki',
|
|
184
|
+
category: 'sexual',
|
|
185
|
+
region: 'general',
|
|
186
186
|
severity: 0.9,
|
|
187
|
-
aliases: [
|
|
188
|
-
description:
|
|
189
|
-
context:
|
|
187
|
+
aliases: ['puk', 'pukih'],
|
|
188
|
+
description: 'Kata vulgar yang mengacu pada alat kelamin perempuan',
|
|
189
|
+
context: 'Kata vulgar yang merujuk pada anatomi seksual',
|
|
190
190
|
},
|
|
191
191
|
{
|
|
192
|
-
word:
|
|
193
|
-
category:
|
|
194
|
-
region:
|
|
192
|
+
word: 'xxx',
|
|
193
|
+
category: 'sexual',
|
|
194
|
+
region: 'general',
|
|
195
195
|
severity: 0.6,
|
|
196
|
-
aliases: [
|
|
197
|
-
description:
|
|
198
|
-
context:
|
|
196
|
+
aliases: ['xXx', 'triplex'],
|
|
197
|
+
description: 'Simbol yang sering digunakan untuk menandai konten pornografi',
|
|
198
|
+
context: 'Digunakan untuk menandai konten seksual eksplisit',
|
|
199
199
|
},
|
|
200
200
|
{
|
|
201
|
-
word:
|
|
202
|
-
category:
|
|
203
|
-
region:
|
|
201
|
+
word: 'xnxx',
|
|
202
|
+
category: 'sexual',
|
|
203
|
+
region: 'general',
|
|
204
204
|
severity: 0.6,
|
|
205
|
-
aliases: [
|
|
206
|
-
description:
|
|
207
|
-
context:
|
|
208
|
-
}
|
|
205
|
+
aliases: ['xnxx', 'xnx'],
|
|
206
|
+
description: 'simbol yang sering digunakan untuk menandai konten pornografi',
|
|
207
|
+
context: 'Digunakan untuk menandai konten seksual eksplisit',
|
|
208
|
+
},
|
|
209
209
|
];
|
|
210
210
|
general.map((item) => item.word);
|
|
211
211
|
|
|
@@ -359,15 +359,7 @@ const jawa = [
|
|
|
359
359
|
category: 'insult',
|
|
360
360
|
region: 'jawa',
|
|
361
361
|
severity: 0.7,
|
|
362
|
-
aliases: [
|
|
363
|
-
'bajilak',
|
|
364
|
-
'bajhingan',
|
|
365
|
-
'bajingak',
|
|
366
|
-
'bajingseng',
|
|
367
|
-
'bajindul',
|
|
368
|
-
'bajigur',
|
|
369
|
-
'jingan',
|
|
370
|
-
],
|
|
362
|
+
aliases: ['bajilak', 'bajhingan', 'bajingak', 'bajingseng', 'bajindul', 'bajigur', 'jingan'],
|
|
371
363
|
description: 'Sebutan untuk orang yang dianggap jahat atau tidak bermoral',
|
|
372
364
|
context: 'Umpatan untuk mengekspresikan kemarahan atau kekesalan',
|
|
373
365
|
},
|
|
@@ -1046,221 +1038,221 @@ sunda.map((item) => item.word);
|
|
|
1046
1038
|
|
|
1047
1039
|
const betawi = [
|
|
1048
1040
|
{
|
|
1049
|
-
word:
|
|
1050
|
-
category:
|
|
1051
|
-
region:
|
|
1041
|
+
word: 'jablay',
|
|
1042
|
+
category: 'sexual',
|
|
1043
|
+
region: 'betawi',
|
|
1052
1044
|
severity: 0.7,
|
|
1053
|
-
aliases: [
|
|
1045
|
+
aliases: ['jabl4y', 'jalay'],
|
|
1054
1046
|
description: 'Singkatan dari "jarang dibelai", istilah untuk perempuan yang mudah didekati',
|
|
1055
|
-
context:
|
|
1047
|
+
context: 'Hinaan yang merendahkan untuk wanita',
|
|
1056
1048
|
},
|
|
1057
1049
|
{
|
|
1058
|
-
word:
|
|
1059
|
-
category:
|
|
1060
|
-
region:
|
|
1050
|
+
word: 'udik',
|
|
1051
|
+
category: 'insult',
|
|
1052
|
+
region: 'betawi',
|
|
1061
1053
|
severity: 0.5,
|
|
1062
|
-
aliases: [
|
|
1063
|
-
description:
|
|
1064
|
-
context:
|
|
1054
|
+
aliases: ['kampungan', 'ndeso'],
|
|
1055
|
+
description: 'Kata yang mengacu pada seseorang yang dianggap ketinggalan zaman atau tidak modern',
|
|
1056
|
+
context: 'Hinaan untuk menyebut orang yang dianggap tidak modern atau kampungan',
|
|
1065
1057
|
},
|
|
1066
1058
|
{
|
|
1067
|
-
word:
|
|
1068
|
-
category:
|
|
1069
|
-
region:
|
|
1059
|
+
word: 'perek',
|
|
1060
|
+
category: 'sexual',
|
|
1061
|
+
region: 'betawi',
|
|
1070
1062
|
severity: 0.7,
|
|
1071
|
-
aliases: [
|
|
1072
|
-
description:
|
|
1073
|
-
context:
|
|
1063
|
+
aliases: ['perempuan eksperimen', 'prk'],
|
|
1064
|
+
description: 'Istilah untuk perempuan yang dianggap memiliki moral yang rendah',
|
|
1065
|
+
context: 'Hinaan yang merendahkan untuk wanita',
|
|
1074
1066
|
},
|
|
1075
1067
|
];
|
|
1076
1068
|
betawi.map((item) => item.word);
|
|
1077
1069
|
|
|
1078
|
-
const
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
severity: 0.7,
|
|
1088
|
-
aliases: ["bkp", "bokap"],
|
|
1089
|
-
description: "Istilah untuk video atau konten pornografi",
|
|
1090
|
-
context: "Kata yang mengacu pada materi pornografi",
|
|
1070
|
+
const minang = [
|
|
1071
|
+
{
|
|
1072
|
+
word: 'pantek',
|
|
1073
|
+
category: 'insult',
|
|
1074
|
+
region: 'minang',
|
|
1075
|
+
severity: 1,
|
|
1076
|
+
aliases: ['pantak', 'kalera'],
|
|
1077
|
+
description: 'Secara harfiah berarti "kelamin pria',
|
|
1078
|
+
context: 'Digunakan ketika kesal dan mengumpat ke sesorang',
|
|
1091
1079
|
},
|
|
1092
1080
|
{
|
|
1093
|
-
word:
|
|
1094
|
-
category:
|
|
1095
|
-
region:
|
|
1096
|
-
severity: 0.
|
|
1097
|
-
aliases: [
|
|
1098
|
-
description:
|
|
1099
|
-
context:
|
|
1081
|
+
word: 'kondiak',
|
|
1082
|
+
category: 'insult',
|
|
1083
|
+
region: 'minang',
|
|
1084
|
+
severity: 0.5,
|
|
1085
|
+
aliases: ['kondik', 'kandiak'],
|
|
1086
|
+
description: 'Secara harfiah berarti "babi"',
|
|
1087
|
+
context: 'Digunakan ketika bercanda dengan teman sebaya',
|
|
1100
1088
|
},
|
|
1101
1089
|
{
|
|
1102
|
-
word:
|
|
1103
|
-
category:
|
|
1104
|
-
region:
|
|
1105
|
-
severity: 0.
|
|
1106
|
-
aliases: [
|
|
1107
|
-
description:
|
|
1108
|
-
context:
|
|
1090
|
+
word: 'binga',
|
|
1091
|
+
category: 'insult',
|
|
1092
|
+
region: 'minang',
|
|
1093
|
+
severity: 0.4,
|
|
1094
|
+
aliases: ['tele', 'binguang'],
|
|
1095
|
+
description: 'Secara harfiah berarti "tolol"',
|
|
1096
|
+
context: 'Digunakan untuk menyebut orang yang dianggap bodoh dalam melakukan sesuatu',
|
|
1109
1097
|
},
|
|
1110
1098
|
{
|
|
1111
|
-
word:
|
|
1112
|
-
category:
|
|
1113
|
-
region:
|
|
1114
|
-
severity: 0.
|
|
1115
|
-
aliases: [
|
|
1116
|
-
description:
|
|
1117
|
-
context:
|
|
1099
|
+
word: 'incek',
|
|
1100
|
+
category: 'sexual',
|
|
1101
|
+
region: 'minang',
|
|
1102
|
+
severity: 0.8,
|
|
1103
|
+
aliases: ['ncek'],
|
|
1104
|
+
description: 'Secara harfiah berarti "kelamin wanita"',
|
|
1105
|
+
context: 'Digunakan ketika menyerang pribadi sesorang',
|
|
1118
1106
|
},
|
|
1119
1107
|
{
|
|
1120
|
-
word:
|
|
1121
|
-
category:
|
|
1122
|
-
region:
|
|
1123
|
-
severity: 0.
|
|
1124
|
-
aliases: [
|
|
1125
|
-
description:
|
|
1126
|
-
context:
|
|
1108
|
+
word: 'kanciang',
|
|
1109
|
+
category: 'sexual',
|
|
1110
|
+
region: 'minang',
|
|
1111
|
+
severity: 0.3,
|
|
1112
|
+
aliases: ['kanciang'],
|
|
1113
|
+
description: 'Secara harfiah berarti "pipis"',
|
|
1114
|
+
context: 'Digunakan ketika orang tersebut melakukan kesalahan',
|
|
1127
1115
|
},
|
|
1116
|
+
];
|
|
1117
|
+
minang.map((item) => item.word);
|
|
1118
|
+
|
|
1119
|
+
const madura = [
|
|
1128
1120
|
{
|
|
1129
|
-
word:
|
|
1130
|
-
category:
|
|
1131
|
-
region:
|
|
1132
|
-
severity: 0.
|
|
1133
|
-
aliases: [
|
|
1134
|
-
description:
|
|
1135
|
-
context:
|
|
1121
|
+
word: 'Pate',
|
|
1122
|
+
category: 'insult',
|
|
1123
|
+
region: 'madura',
|
|
1124
|
+
severity: 0.7,
|
|
1125
|
+
aliases: ['Pate', 'Pate jih', 'pate ben'],
|
|
1126
|
+
description: 'Secara harfiah berarti "anjing"',
|
|
1127
|
+
context: 'Digunakan untuk menyebut orang yang dianggap hina atau tidak berguna',
|
|
1136
1128
|
},
|
|
1137
1129
|
{
|
|
1138
|
-
word:
|
|
1139
|
-
category:
|
|
1140
|
-
region:
|
|
1141
|
-
severity: 0.
|
|
1142
|
-
aliases: [
|
|
1143
|
-
description: "
|
|
1144
|
-
context:
|
|
1130
|
+
word: 'Matanah',
|
|
1131
|
+
category: 'insult',
|
|
1132
|
+
region: 'madura',
|
|
1133
|
+
severity: 0.4,
|
|
1134
|
+
aliases: ['Matanah', 'Matanah jereyah'],
|
|
1135
|
+
description: 'Kata kasar yang merujuk pada "mata" (bentuk kasar dari mata, sementara bentuk halusnya adalah "ma\'repat")',
|
|
1136
|
+
context: 'Digunakan sebagai umpatan atau dalam ungkapan seperti "ngabes matanah rah!" (Lihat-lihat matanya, dong!) untuk menegur seseorang yang tersandung',
|
|
1145
1137
|
},
|
|
1146
1138
|
{
|
|
1147
|
-
word:
|
|
1148
|
-
category:
|
|
1149
|
-
region:
|
|
1150
|
-
severity: 0.
|
|
1151
|
-
aliases: [
|
|
1152
|
-
description:
|
|
1153
|
-
context:
|
|
1139
|
+
word: 'Taeh',
|
|
1140
|
+
category: 'insult',
|
|
1141
|
+
region: 'madura',
|
|
1142
|
+
severity: 0.8,
|
|
1143
|
+
aliases: ['Taeh'],
|
|
1144
|
+
description: 'Secara harfiah berarti "tinja" atau "kotoran"',
|
|
1145
|
+
context: 'Digunakan untuk mengungkapkan kekesalan yang ditujukan terhadap seseorang, mengumpamakan mereka dengan hal yang menjijikkan',
|
|
1154
1146
|
},
|
|
1155
1147
|
{
|
|
1156
|
-
word:
|
|
1157
|
-
category:
|
|
1158
|
-
region:
|
|
1148
|
+
word: 'Korang ajher',
|
|
1149
|
+
category: 'insult',
|
|
1150
|
+
region: 'madura',
|
|
1159
1151
|
severity: 0.6,
|
|
1160
|
-
aliases: [
|
|
1161
|
-
description: "
|
|
1162
|
-
context:
|
|
1152
|
+
aliases: ['Korang ajher'],
|
|
1153
|
+
description: 'Berarti "kurang ajar" dalam bahasa Indonesia',
|
|
1154
|
+
context: 'Digunakan saat kesal terhadap seseorang atau menghadapi tingkah laku orang lain yang dirasa kurang sopan',
|
|
1155
|
+
},
|
|
1156
|
+
{
|
|
1157
|
+
word: 'Gendheng',
|
|
1158
|
+
category: 'insult',
|
|
1159
|
+
region: 'madura',
|
|
1160
|
+
severity: 0.5,
|
|
1161
|
+
aliases: ['Gendheng', 'Bhungghen'],
|
|
1162
|
+
description: 'Berarti "bodoh" atau "goblok" dalam bahasa Indonesia',
|
|
1163
|
+
context: 'Digunakan untuk menghina kecerdasan seseorang yang dianggap tidak pintar',
|
|
1163
1164
|
},
|
|
1164
1165
|
];
|
|
1165
|
-
|
|
1166
|
+
madura.map((item) => item.word);
|
|
1166
1167
|
|
|
1167
|
-
const
|
|
1168
|
-
...general.filter((word) => word.category === "insult"),
|
|
1169
|
-
...jawa.filter((word) => word.category === "insult"),
|
|
1170
|
-
...sunda.filter((word) => word.category === "insult"),
|
|
1171
|
-
...betawi.filter((word) => word.category === "insult"),
|
|
1172
|
-
{
|
|
1173
|
-
word: "idiot",
|
|
1174
|
-
category: "insult",
|
|
1175
|
-
region: "general",
|
|
1176
|
-
severity: 0.6,
|
|
1177
|
-
aliases: ["idi0t", "idot"],
|
|
1178
|
-
description: "Kata yang mengacu pada kebodohan seseorang",
|
|
1179
|
-
context: "Hinaan untuk menyebut orang yang dianggap sangat tidak pintar",
|
|
1180
|
-
},
|
|
1168
|
+
const aceh = [
|
|
1181
1169
|
{
|
|
1182
|
-
word:
|
|
1183
|
-
category:
|
|
1184
|
-
region:
|
|
1185
|
-
severity: 0.
|
|
1186
|
-
aliases: [
|
|
1187
|
-
description:
|
|
1188
|
-
context:
|
|
1170
|
+
word: 'pukoe ma',
|
|
1171
|
+
category: 'sexual',
|
|
1172
|
+
region: 'aceh',
|
|
1173
|
+
severity: 0.9,
|
|
1174
|
+
aliases: ['pukoima', 'pukima'],
|
|
1175
|
+
description: 'Secara harfiah berarti kemaluan ibu',
|
|
1176
|
+
context: 'Umpatan sangat kasar yang menyerang ibu seseorang',
|
|
1189
1177
|
},
|
|
1190
1178
|
{
|
|
1191
|
-
word:
|
|
1192
|
-
category:
|
|
1193
|
-
region:
|
|
1179
|
+
word: 'bui',
|
|
1180
|
+
category: 'insult',
|
|
1181
|
+
region: 'aceh',
|
|
1194
1182
|
severity: 0.6,
|
|
1195
|
-
aliases: [
|
|
1196
|
-
description:
|
|
1197
|
-
context:
|
|
1183
|
+
aliases: [],
|
|
1184
|
+
description: 'Secara harfiah berarti babi',
|
|
1185
|
+
context: 'Umpatan untuk menyebut orang yang dianggap kotor, rakus, atau tidak berakhlak',
|
|
1198
1186
|
},
|
|
1199
1187
|
{
|
|
1200
|
-
word:
|
|
1201
|
-
category:
|
|
1202
|
-
region:
|
|
1188
|
+
word: 'asèe',
|
|
1189
|
+
category: 'insult',
|
|
1190
|
+
region: 'aceh',
|
|
1203
1191
|
severity: 0.6,
|
|
1204
|
-
aliases: [
|
|
1205
|
-
description:
|
|
1206
|
-
context:
|
|
1192
|
+
aliases: ['asee'],
|
|
1193
|
+
description: 'Secara harfiah berarti anjing',
|
|
1194
|
+
context: 'Umpatan untuk menyebut orang yang dianggap hina atau tidak berguna',
|
|
1207
1195
|
},
|
|
1208
1196
|
{
|
|
1209
|
-
word:
|
|
1210
|
-
category:
|
|
1211
|
-
region:
|
|
1212
|
-
severity: 0.
|
|
1213
|
-
aliases: [
|
|
1214
|
-
description:
|
|
1215
|
-
context:
|
|
1197
|
+
word: 'haramjadah',
|
|
1198
|
+
category: 'insult',
|
|
1199
|
+
region: 'aceh',
|
|
1200
|
+
severity: 0.8,
|
|
1201
|
+
aliases: [],
|
|
1202
|
+
description: 'Berarti kurang ajar atau anak haram (lebih halus dari aneuk bajeung)',
|
|
1203
|
+
context: 'Umpatan kasar untuk menyebut anak yang tidak sopan atau tidak beradab',
|
|
1216
1204
|
},
|
|
1217
1205
|
{
|
|
1218
|
-
word: "
|
|
1219
|
-
category:
|
|
1220
|
-
region:
|
|
1221
|
-
severity: 0.
|
|
1222
|
-
aliases: [
|
|
1223
|
-
description:
|
|
1224
|
-
context:
|
|
1206
|
+
word: "pa'ak",
|
|
1207
|
+
category: 'insult',
|
|
1208
|
+
region: 'aceh',
|
|
1209
|
+
severity: 0.6,
|
|
1210
|
+
aliases: [],
|
|
1211
|
+
description: 'Berarti bodoh',
|
|
1212
|
+
context: 'Umpatan untuk menyebut seseorang yang tidak pintar',
|
|
1225
1213
|
},
|
|
1226
1214
|
{
|
|
1227
|
-
word:
|
|
1228
|
-
category:
|
|
1229
|
-
region:
|
|
1230
|
-
severity: 0.
|
|
1231
|
-
aliases: [
|
|
1232
|
-
description: "
|
|
1233
|
-
context:
|
|
1215
|
+
word: 'sangak',
|
|
1216
|
+
category: 'insult',
|
|
1217
|
+
region: 'aceh',
|
|
1218
|
+
severity: 0.6,
|
|
1219
|
+
aliases: [],
|
|
1220
|
+
description: "Berarti bodoh (lebih kasar dari pa'ak)",
|
|
1221
|
+
context: 'Umpatan kasar untuk menyebut seseorang yang sangat bodoh',
|
|
1234
1222
|
},
|
|
1223
|
+
];
|
|
1224
|
+
aceh.map((item) => item.word);
|
|
1225
|
+
|
|
1226
|
+
const bali = [
|
|
1235
1227
|
{
|
|
1236
|
-
word:
|
|
1237
|
-
category:
|
|
1238
|
-
region:
|
|
1239
|
-
severity: 0.
|
|
1240
|
-
aliases: [
|
|
1241
|
-
description:
|
|
1242
|
-
context:
|
|
1228
|
+
word: 'cicing',
|
|
1229
|
+
category: 'insult',
|
|
1230
|
+
region: 'bali',
|
|
1231
|
+
severity: 0.7,
|
|
1232
|
+
aliases: [],
|
|
1233
|
+
description: 'Secara harfiah berarti anjing',
|
|
1234
|
+
context: 'Umpatan umum di Bali untuk menyebut orang yang dianggap hina atau tidak berguna',
|
|
1243
1235
|
},
|
|
1244
1236
|
{
|
|
1245
|
-
word:
|
|
1246
|
-
category:
|
|
1247
|
-
region:
|
|
1248
|
-
severity: 0.
|
|
1249
|
-
aliases: [
|
|
1250
|
-
description:
|
|
1251
|
-
context:
|
|
1237
|
+
word: 'bengkung',
|
|
1238
|
+
category: 'insult',
|
|
1239
|
+
region: 'bali',
|
|
1240
|
+
severity: 0.5,
|
|
1241
|
+
aliases: [],
|
|
1242
|
+
description: 'Berarti bengkok atau tidak lurus (juga bisa berarti tidak jujur)',
|
|
1243
|
+
context: 'Umpatan ringan untuk menyebut orang yang tidak jujur atau berkelakuan buruk',
|
|
1252
1244
|
},
|
|
1253
1245
|
{
|
|
1254
|
-
word:
|
|
1255
|
-
category:
|
|
1256
|
-
region:
|
|
1257
|
-
severity: 0.
|
|
1258
|
-
aliases: [
|
|
1259
|
-
description:
|
|
1260
|
-
context:
|
|
1246
|
+
word: 'belog',
|
|
1247
|
+
category: 'insult',
|
|
1248
|
+
region: 'bali',
|
|
1249
|
+
severity: 0.6,
|
|
1250
|
+
aliases: [],
|
|
1251
|
+
description: 'Berarti bodoh',
|
|
1252
|
+
context: 'Umpatan umum untuk menyebut seseorang yang tidak pintar',
|
|
1261
1253
|
},
|
|
1262
1254
|
];
|
|
1263
|
-
|
|
1255
|
+
bali.map((item) => item.word);
|
|
1264
1256
|
|
|
1265
1257
|
const batak = [
|
|
1266
1258
|
{
|
|
@@ -1380,6 +1372,15 @@ const batak = [
|
|
|
1380
1372
|
description: 'Berarti orang yang suka bicara omong kosong atau tidak jelas',
|
|
1381
1373
|
context: 'Umpatan ringan untuk menyebut orang yang perkataannya tidak bisa dipercaya.',
|
|
1382
1374
|
},
|
|
1375
|
+
{
|
|
1376
|
+
word: 'loak',
|
|
1377
|
+
category: 'insult',
|
|
1378
|
+
region: 'batak',
|
|
1379
|
+
severity: 0.5,
|
|
1380
|
+
aliases: [],
|
|
1381
|
+
description: 'Berarti orang yang bodoh',
|
|
1382
|
+
context: 'Umpatan kasar untuk menyebut orang yang tidak pintar.',
|
|
1383
|
+
},
|
|
1383
1384
|
{
|
|
1384
1385
|
word: 'songon babiat',
|
|
1385
1386
|
category: 'insult',
|
|
@@ -1398,20 +1399,766 @@ const batak = [
|
|
|
1398
1399
|
description: 'Secara harfiah berarti pohon lapuk (kiasan untuk tidak berguna)',
|
|
1399
1400
|
context: 'Umpatan untuk menyebut orang yang dianggap tidak berguna.',
|
|
1400
1401
|
},
|
|
1402
|
+
{
|
|
1403
|
+
word: 'bujang inam',
|
|
1404
|
+
category: 'sexual',
|
|
1405
|
+
region: 'batak',
|
|
1406
|
+
severity: 0.8,
|
|
1407
|
+
aliases: [],
|
|
1408
|
+
description: 'Secara harfiah berarti kemaluan (kasar)',
|
|
1409
|
+
context: 'Umpatan kasar untuk menyebut kemaluan wanita.',
|
|
1410
|
+
},
|
|
1411
|
+
{
|
|
1412
|
+
word: 'pilat',
|
|
1413
|
+
category: 'sexual',
|
|
1414
|
+
region: 'batak',
|
|
1415
|
+
severity: 0.8,
|
|
1416
|
+
aliases: [],
|
|
1417
|
+
description: 'Secara harfiah berarti kemaluan (kasar)',
|
|
1418
|
+
context: 'Umpatan kasar untuk menyebut kemaluan pria.',
|
|
1419
|
+
},
|
|
1420
|
+
{
|
|
1421
|
+
word: 'heang',
|
|
1422
|
+
category: 'sexual',
|
|
1423
|
+
region: 'batak',
|
|
1424
|
+
severity: 0.8,
|
|
1425
|
+
aliases: [],
|
|
1426
|
+
description: 'Secara harfiah berarti kemaluan (kasar)',
|
|
1427
|
+
context: 'Umpatan kasar untuk menyebut kemaluan wanita.',
|
|
1428
|
+
},
|
|
1429
|
+
{
|
|
1430
|
+
word: 'longor',
|
|
1431
|
+
category: 'insult',
|
|
1432
|
+
region: 'batak',
|
|
1433
|
+
severity: 0.7,
|
|
1434
|
+
aliases: [],
|
|
1435
|
+
description: 'Berarti bodoh atau dungu (kasar)',
|
|
1436
|
+
context: 'Umpatan kasar untuk menyebut seseorang yang sangat tidak pintar.',
|
|
1437
|
+
},
|
|
1438
|
+
{
|
|
1439
|
+
word: 'te',
|
|
1440
|
+
category: 'disgusting',
|
|
1441
|
+
region: 'batak',
|
|
1442
|
+
severity: 0.6,
|
|
1443
|
+
aliases: [],
|
|
1444
|
+
description: 'Secara harfiah berarti kotoran atau najis',
|
|
1445
|
+
context: 'Umpatan untuk menunjukkan sesuatu yang menjijikkan atau kotor.',
|
|
1446
|
+
},
|
|
1447
|
+
{
|
|
1448
|
+
word: 'rojan',
|
|
1449
|
+
category: 'disgusting',
|
|
1450
|
+
region: 'batak',
|
|
1451
|
+
severity: 0.6,
|
|
1452
|
+
aliases: [],
|
|
1453
|
+
description: 'Secara harfiah berarti kotoran atau najis',
|
|
1454
|
+
context: 'Umpatan untuk menunjukkan sesuatu yang menjijikkan atau buruk.',
|
|
1455
|
+
},
|
|
1456
|
+
{
|
|
1457
|
+
word: 'teho',
|
|
1458
|
+
category: 'insult',
|
|
1459
|
+
region: 'batak',
|
|
1460
|
+
severity: 0.8,
|
|
1461
|
+
aliases: [],
|
|
1462
|
+
description: 'Secara harfiah berarti mengatakan kamu kayak tai)',
|
|
1463
|
+
context: 'Umpatan sangat kasar untuk menghina seseorang.',
|
|
1464
|
+
},
|
|
1465
|
+
{
|
|
1466
|
+
word: 'roa',
|
|
1467
|
+
category: 'insult',
|
|
1468
|
+
region: 'batak',
|
|
1469
|
+
severity: 0.8,
|
|
1470
|
+
aliases: [],
|
|
1471
|
+
description: 'Secara harfiah berarti mengatakan rupa yang jelek)',
|
|
1472
|
+
context: 'Umpatan sangat kasar untuk menghina seseorang.',
|
|
1473
|
+
},
|
|
1474
|
+
{
|
|
1475
|
+
word: 'pargabus',
|
|
1476
|
+
category: 'insult',
|
|
1477
|
+
region: 'batak',
|
|
1478
|
+
severity: 0.6,
|
|
1479
|
+
aliases: [],
|
|
1480
|
+
description: 'Berarti pembohong atau penipu',
|
|
1481
|
+
context: 'Umpatan untuk menyebut orang yang tidak jujur.',
|
|
1482
|
+
},
|
|
1483
|
+
{
|
|
1484
|
+
word: 'tois hian',
|
|
1485
|
+
category: 'insult',
|
|
1486
|
+
region: 'batak',
|
|
1487
|
+
severity: 0.8,
|
|
1488
|
+
aliases: [],
|
|
1489
|
+
description: 'Secara harfiah berarti mengatakan sombong kali)',
|
|
1490
|
+
context: 'Umpatan sangat kasar untuk menghina seseorang yang sombong.',
|
|
1491
|
+
},
|
|
1492
|
+
{
|
|
1493
|
+
word: 'rittik',
|
|
1494
|
+
category: 'insult',
|
|
1495
|
+
region: 'batak',
|
|
1496
|
+
severity: 0.8,
|
|
1497
|
+
aliases: [],
|
|
1498
|
+
description: 'Secara harfiah berarti mengatakan prilaku seperti orang gila)',
|
|
1499
|
+
context: 'Umpatan kasar untuk menghina seseorang yang dianggap seperti orang gila.',
|
|
1500
|
+
},
|
|
1501
|
+
{
|
|
1502
|
+
word: 'maup',
|
|
1503
|
+
category: 'insult',
|
|
1504
|
+
region: 'batak',
|
|
1505
|
+
severity: 0.8,
|
|
1506
|
+
aliases: [],
|
|
1507
|
+
description: 'Secara harfiah berarti mengatakan mampus(mati aja) aja kau)',
|
|
1508
|
+
context: 'Umpatan kasar untuk menghina seseorang yang sulit untuk diajari atau susah mengerti.',
|
|
1509
|
+
},
|
|
1510
|
+
{
|
|
1511
|
+
word: 'matami',
|
|
1512
|
+
category: 'profanity',
|
|
1513
|
+
region: 'batak',
|
|
1514
|
+
severity: 0.6,
|
|
1515
|
+
aliases: [],
|
|
1516
|
+
description: 'Berarti matamu tapi dengan nada kesal atau marah',
|
|
1517
|
+
context: 'Umpatan untuk menunjukkan kekesalan atau emosi karna dipandnag tidak layak.',
|
|
1518
|
+
},
|
|
1519
|
+
{
|
|
1520
|
+
word: 'pasib jo babam',
|
|
1521
|
+
category: 'profanity',
|
|
1522
|
+
region: 'batak',
|
|
1523
|
+
severity: 0.6,
|
|
1524
|
+
aliases: [],
|
|
1525
|
+
description: 'Berarti memerintahkan untuk diam dengan emosi',
|
|
1526
|
+
context: 'Umpatan untuk menunjukkan kekesalan atau emosi karna terlalu berisik.',
|
|
1527
|
+
},
|
|
1528
|
+
{
|
|
1529
|
+
word: 'hira begu',
|
|
1530
|
+
category: 'insult',
|
|
1531
|
+
region: 'batak',
|
|
1532
|
+
severity: 0.5,
|
|
1533
|
+
aliases: [],
|
|
1534
|
+
description: 'Secara harfiah berarti mengatakan kamu kayak setan(bisa karna prilakunya)',
|
|
1535
|
+
context: 'Umpatan kasar untuk menghina seseorang yang suka hilang tiba-tiba seperti setan.',
|
|
1536
|
+
},
|
|
1537
|
+
{
|
|
1538
|
+
word: 'bakke',
|
|
1539
|
+
category: 'profanity',
|
|
1540
|
+
region: 'batak',
|
|
1541
|
+
severity: 0.6,
|
|
1542
|
+
aliases: [],
|
|
1543
|
+
description: 'Berarti bangkai atau bau bangka',
|
|
1544
|
+
context: 'Umpatan untuk menunjukkan kekesalan atau merasa heran kepada orng yang bau atau orang yang berantakan.',
|
|
1545
|
+
},
|
|
1546
|
+
{
|
|
1547
|
+
word: 'panakko',
|
|
1548
|
+
category: 'profanity',
|
|
1549
|
+
region: 'batak',
|
|
1550
|
+
severity: 0.6,
|
|
1551
|
+
aliases: [],
|
|
1552
|
+
description: 'Berarti si pencuri',
|
|
1553
|
+
context: 'Umpatan untuk menunjukkan kekesalan atau emosi kepada orng suka mengambil tanpa permisi.',
|
|
1554
|
+
},
|
|
1401
1555
|
];
|
|
1402
1556
|
batak.map((item) => item.word);
|
|
1403
1557
|
|
|
1558
|
+
const sexual = [
|
|
1559
|
+
...general.filter((word) => word.category === 'sexual'),
|
|
1560
|
+
...jawa.filter((word) => word.category === 'sexual'),
|
|
1561
|
+
...sunda.filter((word) => word.category === 'sexual'),
|
|
1562
|
+
...betawi.filter((word) => word.category === 'sexual'),
|
|
1563
|
+
...minang.filter((word) => word.category === 'sexual'),
|
|
1564
|
+
...madura.filter((word) => word.category === 'sexual'),
|
|
1565
|
+
...sunda.filter((word) => word.category === 'sexual'),
|
|
1566
|
+
...aceh.filter((word) => word.category === 'sexual'),
|
|
1567
|
+
...bali.filter((word) => word.category === 'sexual'),
|
|
1568
|
+
...batak.filter((word) => word.category === 'sexual'),
|
|
1569
|
+
{
|
|
1570
|
+
word: 'bokep',
|
|
1571
|
+
category: 'sexual',
|
|
1572
|
+
region: 'general',
|
|
1573
|
+
severity: 0.7,
|
|
1574
|
+
aliases: ['bkp', 'bokap'],
|
|
1575
|
+
description: 'Istilah untuk video atau konten pornografi',
|
|
1576
|
+
context: 'Kata yang mengacu pada materi pornografi',
|
|
1577
|
+
},
|
|
1578
|
+
{
|
|
1579
|
+
word: 'coli',
|
|
1580
|
+
category: 'sexual',
|
|
1581
|
+
region: 'general',
|
|
1582
|
+
severity: 0.8,
|
|
1583
|
+
aliases: ['col', 'coly'],
|
|
1584
|
+
description: 'Istilah untuk masturbasi laki-laki',
|
|
1585
|
+
context: 'Kata vulgar yang merujuk pada aktivitas seksual pribadi',
|
|
1586
|
+
},
|
|
1587
|
+
{
|
|
1588
|
+
word: 'desah',
|
|
1589
|
+
category: 'sexual',
|
|
1590
|
+
region: 'general',
|
|
1591
|
+
severity: 0.6,
|
|
1592
|
+
aliases: ['ds4h', 'dsh'],
|
|
1593
|
+
description: 'Istilah untuk suara yang dibuat selama aktivitas seksual',
|
|
1594
|
+
context: 'Dapat menjadi vulgar tergantung konteks penggunaan',
|
|
1595
|
+
},
|
|
1596
|
+
{
|
|
1597
|
+
word: 'seks',
|
|
1598
|
+
category: 'sexual',
|
|
1599
|
+
region: 'general',
|
|
1600
|
+
severity: 0.5,
|
|
1601
|
+
aliases: ['sex', 'ML'],
|
|
1602
|
+
description: 'Istilah untuk aktivitas seksual',
|
|
1603
|
+
context: 'Dapat menjadi vulgar tergantung konteks penggunaan',
|
|
1604
|
+
},
|
|
1605
|
+
{
|
|
1606
|
+
word: 'itil',
|
|
1607
|
+
category: 'sexual',
|
|
1608
|
+
region: 'general',
|
|
1609
|
+
severity: 0.9,
|
|
1610
|
+
aliases: ['itl', 'itul'],
|
|
1611
|
+
description: 'Kata vulgar yang mengacu pada bagian dari alat kelamin perempuan',
|
|
1612
|
+
context: 'Kata vulgar yang merujuk pada anatomi seksual',
|
|
1613
|
+
},
|
|
1614
|
+
{
|
|
1615
|
+
word: 'kondom',
|
|
1616
|
+
category: 'sexual',
|
|
1617
|
+
region: 'general',
|
|
1618
|
+
severity: 0.5,
|
|
1619
|
+
aliases: ['kndm', 'kondom', 'cd'],
|
|
1620
|
+
description: 'Alat kontrasepsi',
|
|
1621
|
+
context: 'Dapat menjadi vulgar tergantung konteks penggunaan',
|
|
1622
|
+
},
|
|
1623
|
+
{
|
|
1624
|
+
word: 'ngewe',
|
|
1625
|
+
category: 'sexual',
|
|
1626
|
+
region: 'general',
|
|
1627
|
+
severity: 0.9,
|
|
1628
|
+
aliases: ['ngew', 'we'],
|
|
1629
|
+
description: 'Istilah kasar untuk aktivitas seksual',
|
|
1630
|
+
context: 'Kata vulgar yang merujuk pada aktivitas seksual',
|
|
1631
|
+
},
|
|
1632
|
+
{
|
|
1633
|
+
word: 'puki',
|
|
1634
|
+
category: 'sexual',
|
|
1635
|
+
region: 'general',
|
|
1636
|
+
severity: 0.9,
|
|
1637
|
+
aliases: ['puk', 'pukih'],
|
|
1638
|
+
description: 'Kata vulgar yang mengacu pada alat kelamin perempuan',
|
|
1639
|
+
context: 'Kata vulgar yang merujuk pada anatomi seksual',
|
|
1640
|
+
},
|
|
1641
|
+
{
|
|
1642
|
+
word: 'xxx',
|
|
1643
|
+
category: 'sexual',
|
|
1644
|
+
region: 'general',
|
|
1645
|
+
severity: 0.6,
|
|
1646
|
+
aliases: ['xXx', 'triplex'],
|
|
1647
|
+
description: 'Simbol yang sering digunakan untuk menandai konten pornografi',
|
|
1648
|
+
context: 'Digunakan untuk menandai konten seksual eksplisit',
|
|
1649
|
+
},
|
|
1650
|
+
];
|
|
1651
|
+
sexual.map((item) => item.word);
|
|
1652
|
+
|
|
1653
|
+
const insult = [
|
|
1654
|
+
...general.filter((word) => word.category === 'insult'),
|
|
1655
|
+
...jawa.filter((word) => word.category === 'insult'),
|
|
1656
|
+
...sunda.filter((word) => word.category === 'insult'),
|
|
1657
|
+
...betawi.filter((word) => word.category === 'insult'),
|
|
1658
|
+
...minang.filter((word) => word.category === 'insult'),
|
|
1659
|
+
...madura.filter((word) => word.category === 'insult'),
|
|
1660
|
+
...sunda.filter((word) => word.category === 'insult'),
|
|
1661
|
+
...aceh.filter((word) => word.category === 'insult'),
|
|
1662
|
+
...bali.filter((word) => word.category === 'insult'),
|
|
1663
|
+
...batak.filter((word) => word.category === 'insult'),
|
|
1664
|
+
{
|
|
1665
|
+
word: 'idiot',
|
|
1666
|
+
category: 'insult',
|
|
1667
|
+
region: 'general',
|
|
1668
|
+
severity: 0.6,
|
|
1669
|
+
aliases: ['idi0t', 'idot'],
|
|
1670
|
+
description: 'Kata yang mengacu pada kebodohan seseorang',
|
|
1671
|
+
context: 'Hinaan untuk menyebut orang yang dianggap sangat tidak pintar',
|
|
1672
|
+
},
|
|
1673
|
+
{
|
|
1674
|
+
word: 'dungu',
|
|
1675
|
+
category: 'insult',
|
|
1676
|
+
region: 'general',
|
|
1677
|
+
severity: 0.5,
|
|
1678
|
+
aliases: ['dngu', 'dongu'],
|
|
1679
|
+
description: 'Kata yang mengacu pada kebodohan seseorang',
|
|
1680
|
+
context: 'Hinaan untuk menyebut orang yang dianggap tidak pintar',
|
|
1681
|
+
},
|
|
1682
|
+
{
|
|
1683
|
+
word: 'sinting',
|
|
1684
|
+
category: 'insult',
|
|
1685
|
+
region: 'general',
|
|
1686
|
+
severity: 0.6,
|
|
1687
|
+
aliases: ['sintng', 'senteng'],
|
|
1688
|
+
description: 'Kata yang mengacu pada kegilaan atau ketidakwarasan seseorang',
|
|
1689
|
+
context: 'Hinaan untuk menyebut orang yang dianggap gila atau tidak waras',
|
|
1690
|
+
},
|
|
1691
|
+
{
|
|
1692
|
+
word: 'sarap',
|
|
1693
|
+
category: 'insult',
|
|
1694
|
+
region: 'general',
|
|
1695
|
+
severity: 0.6,
|
|
1696
|
+
aliases: ['saraf', 'srap'],
|
|
1697
|
+
description: 'Kata yang mengacu pada kegilaan atau ketidakwarasan seseorang',
|
|
1698
|
+
context: 'Hinaan untuk menyebut orang yang dianggap gila atau tidak waras',
|
|
1699
|
+
},
|
|
1700
|
+
{
|
|
1701
|
+
word: 'geblek',
|
|
1702
|
+
category: 'insult',
|
|
1703
|
+
region: 'general',
|
|
1704
|
+
severity: 0.5,
|
|
1705
|
+
aliases: ['gblk', 'geblk'],
|
|
1706
|
+
description: 'Kata yang mengacu pada kebodohan seseorang',
|
|
1707
|
+
context: 'Hinaan untuk menyebut orang yang dianggap tidak pintar',
|
|
1708
|
+
},
|
|
1709
|
+
{
|
|
1710
|
+
word: 'kampungan',
|
|
1711
|
+
category: 'insult',
|
|
1712
|
+
region: 'general',
|
|
1713
|
+
severity: 0.5,
|
|
1714
|
+
aliases: ['kmpngn', 'kamphungan'],
|
|
1715
|
+
description: 'Kata yang mengacu pada ketidaksopanan atau kenaifan seseorang',
|
|
1716
|
+
context: 'Hinaan untuk menyebut orang yang dianggap tidak modern atau primitif',
|
|
1717
|
+
},
|
|
1718
|
+
{
|
|
1719
|
+
word: 'udik',
|
|
1720
|
+
category: 'insult',
|
|
1721
|
+
region: 'general',
|
|
1722
|
+
severity: 0.5,
|
|
1723
|
+
aliases: ['udhik', 'udek'],
|
|
1724
|
+
description: 'Kata yang mengacu pada ketidaksopanan atau kenaifan seseorang',
|
|
1725
|
+
context: 'Hinaan untuk menyebut orang yang dianggap tidak modern atau primitif',
|
|
1726
|
+
},
|
|
1727
|
+
{
|
|
1728
|
+
word: 'dongo',
|
|
1729
|
+
category: 'insult',
|
|
1730
|
+
region: 'general',
|
|
1731
|
+
severity: 0.5,
|
|
1732
|
+
aliases: ['donggo', 'dungu'],
|
|
1733
|
+
description: 'Kata yang mengacu pada kebodohan seseorang',
|
|
1734
|
+
context: 'Hinaan untuk menyebut orang yang dianggap tidak pintar',
|
|
1735
|
+
},
|
|
1736
|
+
{
|
|
1737
|
+
word: 'tolol',
|
|
1738
|
+
category: 'insult',
|
|
1739
|
+
region: 'general',
|
|
1740
|
+
severity: 0.6,
|
|
1741
|
+
aliases: ['tol0l', 'tollo', 'tlol'],
|
|
1742
|
+
description: 'Kata yang mengacu pada kebodohan seseorang',
|
|
1743
|
+
context: 'Hinaan untuk menyebut orang yang dianggap tidak pintar',
|
|
1744
|
+
},
|
|
1745
|
+
{
|
|
1746
|
+
word: 'brengsek',
|
|
1747
|
+
category: 'insult',
|
|
1748
|
+
region: 'general',
|
|
1749
|
+
severity: 0.7,
|
|
1750
|
+
aliases: ['brengskek', 'brengsik', 'brengzek'],
|
|
1751
|
+
description: 'Kata yang mengacu pada kelakuan buruk atau tidak bermoral',
|
|
1752
|
+
context: 'Hinaan untuk menyebut orang yang dianggap memiliki kelakuan buruk',
|
|
1753
|
+
},
|
|
1754
|
+
];
|
|
1755
|
+
insult.map((item) => item.word);
|
|
1756
|
+
|
|
1757
|
+
const profanity = [
|
|
1758
|
+
...general.filter((word) => word.category === 'profanity'),
|
|
1759
|
+
...jawa.filter((word) => word.category === 'profanity'),
|
|
1760
|
+
...sunda.filter((word) => word.category === 'profanity'),
|
|
1761
|
+
...betawi.filter((word) => word.category === 'profanity'),
|
|
1762
|
+
...minang.filter((word) => word.category === 'profanity'),
|
|
1763
|
+
...madura.filter((word) => word.category === 'profanity'),
|
|
1764
|
+
...sunda.filter((word) => word.category === 'profanity'),
|
|
1765
|
+
...aceh.filter((word) => word.category === 'profanity'),
|
|
1766
|
+
...bali.filter((word) => word.category === 'profanity'),
|
|
1767
|
+
...batak.filter((word) => word.category === 'profanity'),
|
|
1768
|
+
{
|
|
1769
|
+
word: 'anjing',
|
|
1770
|
+
category: 'profanity',
|
|
1771
|
+
region: 'general',
|
|
1772
|
+
severity: 0.9,
|
|
1773
|
+
aliases: ['anjir', 'anying', 'njing', 'njir'],
|
|
1774
|
+
description: 'Kata umpatan yang mengacu pada hewan anjing',
|
|
1775
|
+
context: 'Digunakan sebagai ekspresi kemarahan atau frustasi',
|
|
1776
|
+
},
|
|
1777
|
+
{
|
|
1778
|
+
word: 'babi',
|
|
1779
|
+
category: 'profanity',
|
|
1780
|
+
region: 'general',
|
|
1781
|
+
severity: 0.8,
|
|
1782
|
+
aliases: ['babik', 'khinzir'],
|
|
1783
|
+
description: 'Kata umpatan yang mengacu pada hewan babi',
|
|
1784
|
+
context: 'Digunakan untuk mengekspresikan kemarahan atau menghina seseorang',
|
|
1785
|
+
},
|
|
1786
|
+
{
|
|
1787
|
+
word: 'bangsat',
|
|
1788
|
+
category: 'profanity',
|
|
1789
|
+
region: 'general',
|
|
1790
|
+
severity: 0.8,
|
|
1791
|
+
aliases: ['bgst', 'bangst'],
|
|
1792
|
+
description: 'Kata umpatan kasar yang berarti kutu atau parasit',
|
|
1793
|
+
context: 'Digunakan untuk menunjukkan kemarahan atau menghina seseorang',
|
|
1794
|
+
},
|
|
1795
|
+
{
|
|
1796
|
+
word: 'kampret',
|
|
1797
|
+
category: 'profanity',
|
|
1798
|
+
region: 'general',
|
|
1799
|
+
severity: 0.7,
|
|
1800
|
+
aliases: ['kampret lu', 'kampretot'],
|
|
1801
|
+
description: 'Kata umpatan yang mengacu pada jenis kelelawar kecil',
|
|
1802
|
+
context: 'Digunakan untuk mengungkapkan kekesalan atau menghina seseorang',
|
|
1803
|
+
},
|
|
1804
|
+
{
|
|
1805
|
+
word: 'sialan',
|
|
1806
|
+
category: 'profanity',
|
|
1807
|
+
region: 'general',
|
|
1808
|
+
severity: 0.6,
|
|
1809
|
+
aliases: ['sial', 'siaal'],
|
|
1810
|
+
description: 'Kata umpatan yang menunjukkan nasib buruk',
|
|
1811
|
+
context: 'Digunakan untuk mengekspresikan kekesalan atau kemarahan',
|
|
1812
|
+
},
|
|
1813
|
+
{
|
|
1814
|
+
word: 'monyet',
|
|
1815
|
+
category: 'profanity',
|
|
1816
|
+
region: 'general',
|
|
1817
|
+
severity: 0.7,
|
|
1818
|
+
aliases: ['monyong', 'munyuk'],
|
|
1819
|
+
description: 'Kata umpatan yang mengacu pada hewan primata',
|
|
1820
|
+
context: 'Digunakan untuk menghina atau mengekspresikan kemarahan',
|
|
1821
|
+
},
|
|
1822
|
+
{
|
|
1823
|
+
word: 'bajingan',
|
|
1824
|
+
category: 'profanity',
|
|
1825
|
+
region: 'general',
|
|
1826
|
+
severity: 0.8,
|
|
1827
|
+
aliases: ['bajinga', 'bjngn'],
|
|
1828
|
+
description: 'Kata umpatan yang berarti penjahat atau orang jahat',
|
|
1829
|
+
context: 'Digunakan untuk mengumpat seseorang yang dianggap buruk perilakunya',
|
|
1830
|
+
},
|
|
1831
|
+
{
|
|
1832
|
+
word: 'jancok',
|
|
1833
|
+
category: 'profanity',
|
|
1834
|
+
region: 'jawa',
|
|
1835
|
+
severity: 0.9,
|
|
1836
|
+
aliases: ['jancuk', 'jancik', 'dancok'],
|
|
1837
|
+
description: 'Kata umpatan kasar dalam bahasa Jawa',
|
|
1838
|
+
context: 'Umpatan sangat kasar dalam budaya Jawa, menunjukkan kemarahan yang tinggi',
|
|
1839
|
+
},
|
|
1840
|
+
{
|
|
1841
|
+
word: 'cuk',
|
|
1842
|
+
category: 'profanity',
|
|
1843
|
+
region: 'jawa',
|
|
1844
|
+
severity: 0.8,
|
|
1845
|
+
aliases: ['cok', 'cug'],
|
|
1846
|
+
description: 'Bentuk singkat dari jancok',
|
|
1847
|
+
context: 'Versi pendek dari umpatan jancok, digunakan dalam percakapan sehari-hari',
|
|
1848
|
+
},
|
|
1849
|
+
{
|
|
1850
|
+
word: 'asu',
|
|
1851
|
+
category: 'profanity',
|
|
1852
|
+
region: 'jawa',
|
|
1853
|
+
severity: 0.8,
|
|
1854
|
+
aliases: ['asyu', 'su'],
|
|
1855
|
+
description: 'Kata Jawa untuk anjing, digunakan sebagai umpatan',
|
|
1856
|
+
context: 'Ekspresi umpatan yang umum di masyarakat Jawa',
|
|
1857
|
+
},
|
|
1858
|
+
{
|
|
1859
|
+
word: 'sia',
|
|
1860
|
+
category: 'profanity',
|
|
1861
|
+
region: 'sunda',
|
|
1862
|
+
severity: 0.6,
|
|
1863
|
+
aliases: ['siah', 'siaa'],
|
|
1864
|
+
description: 'Kata ganti orang kedua dalam bahasa Sunda yang kasar',
|
|
1865
|
+
context: 'Menunjukkan ketidakhormatan pada lawan bicara dalam konteks Sunda',
|
|
1866
|
+
},
|
|
1867
|
+
{
|
|
1868
|
+
word: 'lu',
|
|
1869
|
+
category: 'profanity',
|
|
1870
|
+
region: 'betawi',
|
|
1871
|
+
severity: 0.4,
|
|
1872
|
+
aliases: ['elu', 'lo'],
|
|
1873
|
+
description: 'Kata ganti orang kedua dalam dialek Betawi',
|
|
1874
|
+
context: 'Dapat dianggap kasar dalam konteks formal atau saat berbicara dengan orang yang lebih tua',
|
|
1875
|
+
},
|
|
1876
|
+
{
|
|
1877
|
+
word: 'goblok',
|
|
1878
|
+
category: 'profanity',
|
|
1879
|
+
region: 'general',
|
|
1880
|
+
severity: 0.7,
|
|
1881
|
+
aliases: ['goblog', 'goblokk', 'bego', 'bodoh'],
|
|
1882
|
+
description: 'Kata umpatan yang menunjukkan kebodohan',
|
|
1883
|
+
context: 'Digunakan untuk menghina kecerdasan seseorang',
|
|
1884
|
+
},
|
|
1885
|
+
];
|
|
1886
|
+
profanity.map((item) => item.word);
|
|
1887
|
+
|
|
1888
|
+
const slur = [
|
|
1889
|
+
...general.filter((word) => word.category === 'slur'),
|
|
1890
|
+
...jawa.filter((word) => word.category === 'slur'),
|
|
1891
|
+
...sunda.filter((word) => word.category === 'slur'),
|
|
1892
|
+
...betawi.filter((word) => word.category === 'slur'),
|
|
1893
|
+
...minang.filter((word) => word.category === 'slur'),
|
|
1894
|
+
...madura.filter((word) => word.category === 'slur'),
|
|
1895
|
+
...sunda.filter((word) => word.category === 'slur'),
|
|
1896
|
+
...aceh.filter((word) => word.category === 'slur'),
|
|
1897
|
+
...bali.filter((word) => word.category === 'slur'),
|
|
1898
|
+
...batak.filter((word) => word.category === 'slur'),
|
|
1899
|
+
{
|
|
1900
|
+
word: 'cina',
|
|
1901
|
+
category: 'slur',
|
|
1902
|
+
region: 'general',
|
|
1903
|
+
severity: 0.7,
|
|
1904
|
+
aliases: ['cino', 'china'],
|
|
1905
|
+
description: 'Sebutan yang dianggap merendahkan untuk orang keturunan Tionghoa',
|
|
1906
|
+
context: 'Dianggap tidak sopan dan sebaiknya diganti dengan "Tionghoa"',
|
|
1907
|
+
},
|
|
1908
|
+
{
|
|
1909
|
+
word: 'banci',
|
|
1910
|
+
category: 'slur',
|
|
1911
|
+
region: 'general',
|
|
1912
|
+
severity: 0.7,
|
|
1913
|
+
aliases: ['bencong', 'waria', 'bences'],
|
|
1914
|
+
description: 'Istilah merendahkan untuk transgender atau pria yang dianggap feminin',
|
|
1915
|
+
context: 'Digunakan sebagai hinaan terhadap identitas gender atau ekspresi gender seseorang',
|
|
1916
|
+
},
|
|
1917
|
+
{
|
|
1918
|
+
word: 'autis',
|
|
1919
|
+
category: 'slur',
|
|
1920
|
+
region: 'general',
|
|
1921
|
+
severity: 0.6,
|
|
1922
|
+
aliases: ['autis lu', 'autisan'],
|
|
1923
|
+
description: 'Penyalahgunaan kondisi medis sebagai hinaan',
|
|
1924
|
+
context: 'Menggunakan kondisi spektrum autisme sebagai hinaan untuk seseorang yang dianggap aneh',
|
|
1925
|
+
},
|
|
1926
|
+
{
|
|
1927
|
+
word: 'londo',
|
|
1928
|
+
category: 'slur',
|
|
1929
|
+
region: 'jawa',
|
|
1930
|
+
severity: 0.5,
|
|
1931
|
+
aliases: ['landa', 'landi'],
|
|
1932
|
+
description: 'Sebutan untuk orang Belanda atau orang berkulit putih',
|
|
1933
|
+
context: 'Dapat bersifat merendahkan tergantung konteks dan nada bicara',
|
|
1934
|
+
},
|
|
1935
|
+
{
|
|
1936
|
+
word: 'keling',
|
|
1937
|
+
category: 'slur',
|
|
1938
|
+
region: 'general',
|
|
1939
|
+
severity: 0.8,
|
|
1940
|
+
aliases: ['kaling', 'hitam legam'],
|
|
1941
|
+
description: 'Istilah merendahkan untuk orang India atau berkulit gelap',
|
|
1942
|
+
context: 'Dianggap sangat tidak sopan dan bernada rasis',
|
|
1943
|
+
},
|
|
1944
|
+
{
|
|
1945
|
+
word: 'cacat',
|
|
1946
|
+
category: 'slur',
|
|
1947
|
+
region: 'general',
|
|
1948
|
+
severity: 0.7,
|
|
1949
|
+
aliases: ['cacad', 'difabel'],
|
|
1950
|
+
description: 'Istilah merendahkan untuk penyandang disabilitas',
|
|
1951
|
+
context: 'Digunakan sebagai hinaan untuk menunjukkan ketidaksempurnaan',
|
|
1952
|
+
},
|
|
1953
|
+
{
|
|
1954
|
+
word: 'gembel',
|
|
1955
|
+
category: 'slur',
|
|
1956
|
+
region: 'general',
|
|
1957
|
+
severity: 0.6,
|
|
1958
|
+
aliases: ['gembul', 'gelandangan'],
|
|
1959
|
+
description: 'Istilah merendahkan untuk orang tidak mampu atau tunawisma',
|
|
1960
|
+
context: 'Mengandung stigma terhadap kemiskinan dan kelas sosial',
|
|
1961
|
+
},
|
|
1962
|
+
{
|
|
1963
|
+
word: 'kampungan',
|
|
1964
|
+
category: 'slur',
|
|
1965
|
+
region: 'general',
|
|
1966
|
+
severity: 0.5,
|
|
1967
|
+
aliases: ['ndeso', 'katrok', 'udik'],
|
|
1968
|
+
description: 'Istilah merendahkan untuk orang dari daerah pedesaan',
|
|
1969
|
+
context: 'Menyiratkan seseorang tidak beradab, tidak berpendidikan, atau ketinggalan zaman',
|
|
1970
|
+
},
|
|
1971
|
+
{
|
|
1972
|
+
word: 'tolol',
|
|
1973
|
+
category: 'slur',
|
|
1974
|
+
region: 'general',
|
|
1975
|
+
severity: 0.6,
|
|
1976
|
+
aliases: ['tololnya', 'tolo'],
|
|
1977
|
+
description: 'Hinaan terhadap kecerdasan seseorang',
|
|
1978
|
+
context: 'Digunakan untuk menghina kapasitas mental seseorang',
|
|
1979
|
+
},
|
|
1980
|
+
];
|
|
1981
|
+
slur.map((item) => item.word);
|
|
1982
|
+
|
|
1983
|
+
const drugs = [
|
|
1984
|
+
...general.filter((word) => word.category === 'drugs'),
|
|
1985
|
+
...jawa.filter((word) => word.category === 'drugs'),
|
|
1986
|
+
...sunda.filter((word) => word.category === 'drugs'),
|
|
1987
|
+
...betawi.filter((word) => word.category === 'drugs'),
|
|
1988
|
+
...minang.filter((word) => word.category === 'drugs'),
|
|
1989
|
+
...madura.filter((word) => word.category === 'drugs'),
|
|
1990
|
+
...sunda.filter((word) => word.category === 'drugs'),
|
|
1991
|
+
...aceh.filter((word) => word.category === 'drugs'),
|
|
1992
|
+
...bali.filter((word) => word.category === 'drugs'),
|
|
1993
|
+
...batak.filter((word) => word.category === 'drugs'),
|
|
1994
|
+
{
|
|
1995
|
+
word: 'ganja',
|
|
1996
|
+
category: 'drugs',
|
|
1997
|
+
region: 'general',
|
|
1998
|
+
severity: 0.6,
|
|
1999
|
+
aliases: ['cimeng', 'kanabis', 'marijuana'],
|
|
2000
|
+
description: 'Tanaman yang mengandung zat psikoaktif',
|
|
2001
|
+
context: 'Digunakan untuk merujuk pada narkotika jenis cannabis',
|
|
2002
|
+
},
|
|
2003
|
+
{
|
|
2004
|
+
word: 'sabu',
|
|
2005
|
+
category: 'drugs',
|
|
2006
|
+
region: 'general',
|
|
2007
|
+
severity: 0.8,
|
|
2008
|
+
aliases: ['crystal', 'meth', 'ss'],
|
|
2009
|
+
description: 'Narkotika jenis metamfetamin',
|
|
2010
|
+
context: 'Istilah untuk metamfetamin yang merupakan narkotika berbahaya',
|
|
2011
|
+
},
|
|
2012
|
+
{
|
|
2013
|
+
word: 'inex',
|
|
2014
|
+
category: 'drugs',
|
|
2015
|
+
region: 'general',
|
|
2016
|
+
severity: 0.7,
|
|
2017
|
+
aliases: ['ekstasi', 'pil'],
|
|
2018
|
+
description: 'Obat terlarang yang mengandung MDMA',
|
|
2019
|
+
context: 'Nama slang untuk obat terlarang ecstasy',
|
|
2020
|
+
},
|
|
2021
|
+
{
|
|
2022
|
+
word: 'sakaw',
|
|
2023
|
+
category: 'drugs',
|
|
2024
|
+
region: 'general',
|
|
2025
|
+
severity: 0.5,
|
|
2026
|
+
aliases: ['ketagihan', 'menarik'],
|
|
2027
|
+
description: 'Gejala putus obat pada pecandu',
|
|
2028
|
+
context: 'Menggambarkan kondisi pecandu yang sedang mengalami gejala putus obat',
|
|
2029
|
+
},
|
|
2030
|
+
{
|
|
2031
|
+
word: 'ngepil',
|
|
2032
|
+
category: 'drugs',
|
|
2033
|
+
region: 'jawa',
|
|
2034
|
+
severity: 0.3,
|
|
2035
|
+
aliases: ['minum pil', 'telan pil'],
|
|
2036
|
+
description: 'Mengkonsumsi obat-obatan terlarang dalam bentuk pil',
|
|
2037
|
+
context: 'Istilah dalam bahasa gaul untuk mengkonsumsi obat terlarang jenis tablet',
|
|
2038
|
+
},
|
|
2039
|
+
{
|
|
2040
|
+
word: 'nyimeng',
|
|
2041
|
+
category: 'drugs',
|
|
2042
|
+
region: 'sunda',
|
|
2043
|
+
severity: 0.6,
|
|
2044
|
+
aliases: ['nyimang', 'isap ganja'],
|
|
2045
|
+
description: 'Mengisap ganja atau marijuana',
|
|
2046
|
+
context: 'Istilah sunda untuk aktivitas mengkonsumsi ganja',
|
|
2047
|
+
},
|
|
2048
|
+
];
|
|
2049
|
+
drugs.map((item) => item.word);
|
|
2050
|
+
|
|
2051
|
+
const disgusting = [
|
|
2052
|
+
...general.filter((word) => word.category === 'disgusting'),
|
|
2053
|
+
...jawa.filter((word) => word.category === 'disgusting'),
|
|
2054
|
+
...sunda.filter((word) => word.category === 'disgusting'),
|
|
2055
|
+
...betawi.filter((word) => word.category === 'disgusting'),
|
|
2056
|
+
...minang.filter((word) => word.category === 'disgusting'),
|
|
2057
|
+
...madura.filter((word) => word.category === 'disgusting'),
|
|
2058
|
+
...sunda.filter((word) => word.category === 'disgusting'),
|
|
2059
|
+
...aceh.filter((word) => word.category === 'disgusting'),
|
|
2060
|
+
...bali.filter((word) => word.category === 'disgusting'),
|
|
2061
|
+
...batak.filter((word) => word.category === 'disgusting'),
|
|
2062
|
+
{
|
|
2063
|
+
word: 'muntah',
|
|
2064
|
+
category: 'disgusting',
|
|
2065
|
+
region: 'general',
|
|
2066
|
+
severity: 0.4,
|
|
2067
|
+
aliases: ['muntaber', 'memuntahkan'],
|
|
2068
|
+
description: 'Muntahan atau tindakan muntah',
|
|
2069
|
+
context: 'Digunakan untuk mengekspresikan rasa jijik atau menggambarkan tindakan tersebut',
|
|
2070
|
+
},
|
|
2071
|
+
{
|
|
2072
|
+
word: 'ingus',
|
|
2073
|
+
category: 'disgusting',
|
|
2074
|
+
region: 'general',
|
|
2075
|
+
severity: 0.4,
|
|
2076
|
+
aliases: ['ingusan', 'beringus'],
|
|
2077
|
+
description: 'Lendir hidung',
|
|
2078
|
+
context: 'Digunakan untuk menggambarkan lendir hidung atau sebagai hinaan',
|
|
2079
|
+
},
|
|
2080
|
+
{
|
|
2081
|
+
word: 'tai',
|
|
2082
|
+
category: 'disgusting',
|
|
2083
|
+
region: 'general',
|
|
2084
|
+
severity: 0.8,
|
|
2085
|
+
aliases: ['tahi', 'kotoran'],
|
|
2086
|
+
description: 'Kotoran manusia',
|
|
2087
|
+
context: 'Istilah vulgar untuk kotoran, sering digunakan sebagai hinaan',
|
|
2088
|
+
},
|
|
2089
|
+
{
|
|
2090
|
+
word: 'jembut',
|
|
2091
|
+
category: 'disgusting',
|
|
2092
|
+
region: 'general',
|
|
2093
|
+
severity: 1.0,
|
|
2094
|
+
aliases: ['jembud', 'rambut kemaluan'],
|
|
2095
|
+
description: 'Rambut kemaluan',
|
|
2096
|
+
context: 'Istilah vulgar untuk rambut kemaluan, dianggap sangat tidak pantas',
|
|
2097
|
+
},
|
|
2098
|
+
{
|
|
2099
|
+
word: 'pecret',
|
|
2100
|
+
category: 'disgusting',
|
|
2101
|
+
region: 'sunda',
|
|
2102
|
+
severity: 0.8,
|
|
2103
|
+
aliases: ['mencret', 'diare'],
|
|
2104
|
+
description: 'Diare dalam bahasa Sunda',
|
|
2105
|
+
context: 'Dianggap vulgar ketika disebutkan di depan umum',
|
|
2106
|
+
},
|
|
2107
|
+
{
|
|
2108
|
+
word: 'bacot',
|
|
2109
|
+
category: 'disgusting',
|
|
2110
|
+
region: 'betawi',
|
|
2111
|
+
severity: 0.8,
|
|
2112
|
+
aliases: ['cicing', 'berisik'],
|
|
2113
|
+
description: 'Mulut atau omongan berisik dalam konteks vulgar',
|
|
2114
|
+
context: 'Istilah kasar yang digunakan untuk menyuruh seseorang diam',
|
|
2115
|
+
},
|
|
2116
|
+
{
|
|
2117
|
+
word: 'lendir',
|
|
2118
|
+
category: 'disgusting',
|
|
2119
|
+
region: 'general',
|
|
2120
|
+
severity: 0.3,
|
|
2121
|
+
aliases: ['berlendir', 'cairan lengket'],
|
|
2122
|
+
description: 'Lendir atau cairan lengket',
|
|
2123
|
+
context: 'Dapat digunakan dalam konteks vulgar untuk menggambarkan cairan tubuh',
|
|
2124
|
+
},
|
|
2125
|
+
];
|
|
2126
|
+
disgusting.map((item) => item.word);
|
|
2127
|
+
|
|
2128
|
+
const blasphemy = [
|
|
2129
|
+
...general.filter((word) => word.category === 'blasphemy'),
|
|
2130
|
+
...jawa.filter((word) => word.category === 'blasphemy'),
|
|
2131
|
+
...sunda.filter((word) => word.category === 'blasphemy'),
|
|
2132
|
+
...betawi.filter((word) => word.category === 'blasphemy'),
|
|
2133
|
+
...minang.filter((word) => word.category === 'blasphemy'),
|
|
2134
|
+
...madura.filter((word) => word.category === 'blasphemy'),
|
|
2135
|
+
...sunda.filter((word) => word.category === 'blasphemy'),
|
|
2136
|
+
...aceh.filter((word) => word.category === 'blasphemy'),
|
|
2137
|
+
...bali.filter((word) => word.category === 'blasphemy'),
|
|
2138
|
+
...batak.filter((word) => word.category === 'blasphemy'),
|
|
2139
|
+
{
|
|
2140
|
+
word: 'kafir',
|
|
2141
|
+
category: 'blasphemy',
|
|
2142
|
+
region: 'general',
|
|
2143
|
+
severity: 0.6,
|
|
2144
|
+
aliases: ['kapir', 'kafur'],
|
|
2145
|
+
description: 'Istilah untuk orang yang tidak percaya pada Islam',
|
|
2146
|
+
context: 'Dapat bersifat merendahkan ketika digunakan terhadap non-Muslim',
|
|
2147
|
+
},
|
|
2148
|
+
];
|
|
2149
|
+
blasphemy.map((item) => item.word);
|
|
2150
|
+
|
|
1404
2151
|
const wordObjects = [
|
|
1405
2152
|
...general,
|
|
1406
2153
|
...jawa,
|
|
1407
2154
|
...sunda,
|
|
1408
2155
|
...betawi,
|
|
1409
2156
|
...batak,
|
|
1410
|
-
|
|
1411
|
-
|
|
1412
|
-
|
|
2157
|
+
...minang,
|
|
2158
|
+
...bali,
|
|
2159
|
+
...madura,
|
|
1413
2160
|
// ...bugis,
|
|
1414
|
-
|
|
2161
|
+
...aceh,
|
|
1415
2162
|
// ...ambon,
|
|
1416
2163
|
// ...papua,
|
|
1417
2164
|
// ...manado,
|
|
@@ -1437,7 +2184,7 @@ wordObjects
|
|
|
1437
2184
|
* @param keepFirstAndLast Apakah harus menyimpan huruf pertama dan terakhir
|
|
1438
2185
|
* @returns Kata yang telah disensor
|
|
1439
2186
|
*/
|
|
1440
|
-
function censorWord(word, replaceChar =
|
|
2187
|
+
function censorWord(word, replaceChar = '*', keepFirstAndLast = false) {
|
|
1441
2188
|
if (word.length <= 2) {
|
|
1442
2189
|
return replaceChar.repeat(word.length);
|
|
1443
2190
|
}
|
|
@@ -1455,9 +2202,9 @@ function censorWord(word, replaceChar = "*", keepFirstAndLast = false) {
|
|
|
1455
2202
|
function normalizeText(text) {
|
|
1456
2203
|
return text
|
|
1457
2204
|
.toLowerCase()
|
|
1458
|
-
.normalize(
|
|
1459
|
-
.replace(/[\u0300-\u036f]/g,
|
|
1460
|
-
.replace(/[^\w\s]/g,
|
|
2205
|
+
.normalize('NFD') // Normalisasi Unicode
|
|
2206
|
+
.replace(/[\u0300-\u036f]/g, '') // Hapus diacritic marks
|
|
2207
|
+
.replace(/[^\w\s]/g, '') // Hapus karakter non-alphanumeric
|
|
1461
2208
|
.trim(); // Hapus whitespace di awal dan akhir
|
|
1462
2209
|
}
|
|
1463
2210
|
/**
|
|
@@ -1474,7 +2221,7 @@ function containsAnyWord(text, wordList, checkSubstring = false) {
|
|
|
1474
2221
|
const normalizedWord = normalizeText(word);
|
|
1475
2222
|
return checkSubstring
|
|
1476
2223
|
? normalizedText.includes(normalizedWord)
|
|
1477
|
-
: new RegExp(`\\b${escapeRegExp(normalizedWord)}\\b`,
|
|
2224
|
+
: new RegExp(`\\b${escapeRegExp(normalizedWord)}\\b`, 'i').test(normalizedText);
|
|
1478
2225
|
});
|
|
1479
2226
|
}
|
|
1480
2227
|
/**
|
|
@@ -1491,7 +2238,7 @@ function containsEuphemism(text, wordList) {
|
|
|
1491
2238
|
return false;
|
|
1492
2239
|
const firstChar = word[0];
|
|
1493
2240
|
const lastChar = word[word.length - 1];
|
|
1494
|
-
const pattern = new RegExp(`\\b${escapeRegExp(firstChar)}[*@#\\-_.!?\\s]{${word.length - 2}}${escapeRegExp(lastChar)}\\b`,
|
|
2241
|
+
const pattern = new RegExp(`\\b${escapeRegExp(firstChar)}[*@#\\-_.!?\\s]{${word.length - 2}}${escapeRegExp(lastChar)}\\b`, 'i');
|
|
1495
2242
|
return pattern.test(text);
|
|
1496
2243
|
});
|
|
1497
2244
|
}
|
|
@@ -1504,11 +2251,11 @@ function containsEuphemism(text, wordList) {
|
|
|
1504
2251
|
* @returns Boolean apakah teks mengandung upaya menghindari filter
|
|
1505
2252
|
*/
|
|
1506
2253
|
function detectSplitWords(text, wordList) {
|
|
1507
|
-
const compressedText = text.replace(/[\s\-_.!?*]/g,
|
|
2254
|
+
const compressedText = text.replace(/[\s\-_.!?*]/g, '').toLowerCase();
|
|
1508
2255
|
return wordList.some((word) => compressedText.includes(normalizeText(word)));
|
|
1509
2256
|
}
|
|
1510
2257
|
function escapeRegExp(string) {
|
|
1511
|
-
return string.replace(/[.*+?^${}()|[\]\\]/g,
|
|
2258
|
+
return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
1512
2259
|
}
|
|
1513
2260
|
/**
|
|
1514
2261
|
* Mengganti sebagian kata dengan masking
|
|
@@ -1520,9 +2267,9 @@ function escapeRegExp(string) {
|
|
|
1520
2267
|
* @param maskChar Karakter masking
|
|
1521
2268
|
* @returns Teks yang telah dimasking
|
|
1522
2269
|
*/
|
|
1523
|
-
function maskText(text, visibleStart = 1, visibleEnd = 1, maskChar =
|
|
2270
|
+
function maskText(text, visibleStart = 1, visibleEnd = 1, maskChar = '*') {
|
|
1524
2271
|
if (!text)
|
|
1525
|
-
return
|
|
2272
|
+
return '';
|
|
1526
2273
|
if (text.length <= visibleStart + visibleEnd)
|
|
1527
2274
|
return text;
|
|
1528
2275
|
const start = text.substring(0, visibleStart);
|
|
@@ -1539,25 +2286,25 @@ function maskText(text, visibleStart = 1, visibleEnd = 1, maskChar = "*") {
|
|
|
1539
2286
|
*/
|
|
1540
2287
|
function toLeetSpeak(text) {
|
|
1541
2288
|
const leetMap = {
|
|
1542
|
-
a: [
|
|
1543
|
-
b: [
|
|
1544
|
-
c: [
|
|
1545
|
-
e: [
|
|
1546
|
-
g: [
|
|
1547
|
-
i: [
|
|
1548
|
-
l: [
|
|
1549
|
-
o: [
|
|
1550
|
-
s: [
|
|
1551
|
-
t: [
|
|
1552
|
-
z: [
|
|
2289
|
+
a: ['4', '@'],
|
|
2290
|
+
b: ['8', '6'],
|
|
2291
|
+
c: ['<', '(', '{'],
|
|
2292
|
+
e: ['3'],
|
|
2293
|
+
g: ['9'],
|
|
2294
|
+
i: ['1', '!'],
|
|
2295
|
+
l: ['1', '|'],
|
|
2296
|
+
o: ['0'],
|
|
2297
|
+
s: ['5', '$'],
|
|
2298
|
+
t: ['7', '+'],
|
|
2299
|
+
z: ['2'],
|
|
1553
2300
|
};
|
|
1554
2301
|
return text
|
|
1555
|
-
.split(
|
|
2302
|
+
.split('')
|
|
1556
2303
|
.map((char) => {
|
|
1557
2304
|
const lowerChar = char.toLowerCase();
|
|
1558
2305
|
return leetMap[lowerChar] || char;
|
|
1559
2306
|
})
|
|
1560
|
-
.join(
|
|
2307
|
+
.join('');
|
|
1561
2308
|
}
|
|
1562
2309
|
/**
|
|
1563
2310
|
* memisahkan teks menajdi kelimat
|
|
@@ -1567,9 +2314,7 @@ function toLeetSpeak(text) {
|
|
|
1567
2314
|
*/
|
|
1568
2315
|
function splitIntoSentences(text) {
|
|
1569
2316
|
// split berdasarkan titik, seru, taya yagn diikuti spasi atau akhir string
|
|
1570
|
-
return text
|
|
1571
|
-
.split(/(?<=[.!?])\s+|(?<=[.!?])$/)
|
|
1572
|
-
.filter((sentence) => sentence.trim().length > 0);
|
|
2317
|
+
return text.split(/(?<=[.!?])\s+|(?<=[.!?])$/).filter((sentence) => sentence.trim().length > 0);
|
|
1573
2318
|
}
|
|
1574
2319
|
/**
|
|
1575
2320
|
* mengambil kata-kata di sekitar indeks tertentu
|
|
@@ -1581,7 +2326,7 @@ function splitIntoSentences(text) {
|
|
|
1581
2326
|
*/
|
|
1582
2327
|
function getContextAroundIndex(text, index, windowSize = 5) {
|
|
1583
2328
|
if (!text || index < 0 || index >= text.length)
|
|
1584
|
-
return
|
|
2329
|
+
return '';
|
|
1585
2330
|
const words = text.split(/\s+/);
|
|
1586
2331
|
let currentPosition = 0;
|
|
1587
2332
|
let targetWordIndex = -1;
|
|
@@ -1595,11 +2340,11 @@ function getContextAroundIndex(text, index, windowSize = 5) {
|
|
|
1595
2340
|
currentPosition += wordLength + 1;
|
|
1596
2341
|
}
|
|
1597
2342
|
if (targetWordIndex === -1)
|
|
1598
|
-
return
|
|
2343
|
+
return '';
|
|
1599
2344
|
// Ambil kata-kata di sekitar
|
|
1600
2345
|
const startIndex = Math.max(0, targetWordIndex - windowSize);
|
|
1601
2346
|
const endIndex = Math.min(words.length, targetWordIndex + windowSize + 1);
|
|
1602
|
-
return words.slice(startIndex, endIndex).join(
|
|
2347
|
+
return words.slice(startIndex, endIndex).join(' ');
|
|
1603
2348
|
}
|
|
1604
2349
|
|
|
1605
2350
|
/**
|
|
@@ -1630,7 +2375,7 @@ function createWordRegex(word, options = {}) {
|
|
|
1630
2375
|
pattern = `\\b${pattern}\\b`;
|
|
1631
2376
|
}
|
|
1632
2377
|
// Buat regex dengan flag case-insensitive jika diminta
|
|
1633
|
-
return new RegExp(pattern, caseSensitive ?
|
|
2378
|
+
return new RegExp(pattern, caseSensitive ? 'g' : 'gi');
|
|
1634
2379
|
}
|
|
1635
2380
|
/**
|
|
1636
2381
|
* Menambahkan variasi leet speak ke pola regex
|
|
@@ -1644,29 +2389,29 @@ function createWordRegex(word, options = {}) {
|
|
|
1644
2389
|
*/
|
|
1645
2390
|
function addLeetSpeakVariations(pattern) {
|
|
1646
2391
|
const leetMap = {
|
|
1647
|
-
a: [
|
|
1648
|
-
b: [
|
|
1649
|
-
c: [
|
|
1650
|
-
e: [
|
|
1651
|
-
g: [
|
|
1652
|
-
i: [
|
|
1653
|
-
l: [
|
|
1654
|
-
o: [
|
|
1655
|
-
s: [
|
|
1656
|
-
t: [
|
|
1657
|
-
z: [
|
|
2392
|
+
a: ['a', '4', '@'],
|
|
2393
|
+
b: ['b', '8', '6'],
|
|
2394
|
+
c: ['c', '(', '{', '<'],
|
|
2395
|
+
e: ['e', '3'],
|
|
2396
|
+
g: ['g', '6', '9'],
|
|
2397
|
+
i: ['i', '1', '!', '|'],
|
|
2398
|
+
l: ['l', '1', '|'],
|
|
2399
|
+
o: ['o', '0'],
|
|
2400
|
+
s: ['s', '5', '$'],
|
|
2401
|
+
t: ['t', '7', '+'],
|
|
2402
|
+
z: ['z', '2'],
|
|
1658
2403
|
};
|
|
1659
2404
|
return pattern
|
|
1660
|
-
.split(
|
|
2405
|
+
.split('')
|
|
1661
2406
|
.map((char) => {
|
|
1662
2407
|
const lowerChar = char.toLowerCase();
|
|
1663
2408
|
const variations = leetMap[lowerChar];
|
|
1664
2409
|
if (variations && variations.length > 1) {
|
|
1665
|
-
return `[${variations.join(
|
|
2410
|
+
return `[${variations.join('')}]`;
|
|
1666
2411
|
}
|
|
1667
2412
|
return char;
|
|
1668
2413
|
})
|
|
1669
|
-
.join(
|
|
2414
|
+
.join('');
|
|
1670
2415
|
}
|
|
1671
2416
|
/**
|
|
1672
2417
|
* Menambahkan kemungkinan split/pemisahan antar karakter
|
|
@@ -1676,7 +2421,7 @@ function addLeetSpeakVariations(pattern) {
|
|
|
1676
2421
|
*/
|
|
1677
2422
|
function addSplitVariations(pattern) {
|
|
1678
2423
|
// Tambahkan kemungkinan spasi atau karakter penghubung di antara setiap huruf
|
|
1679
|
-
return pattern.split(
|
|
2424
|
+
return pattern.split('').join('[\\s\\-._*+]?');
|
|
1680
2425
|
}
|
|
1681
2426
|
/**
|
|
1682
2427
|
* Membuat regex untuk mencari kata dengan variasi spasi dan karakter penghubung
|
|
@@ -1688,7 +2433,7 @@ function addSplitVariations(pattern) {
|
|
|
1688
2433
|
function createEvasionRegex(word) {
|
|
1689
2434
|
// Tambahkan kemungkinan spasi atau karakter penghubung di antara setiap huruf
|
|
1690
2435
|
const pattern = addSplitVariations(escapeRegExp(word));
|
|
1691
|
-
return new RegExp(pattern,
|
|
2436
|
+
return new RegExp(pattern, 'gi');
|
|
1692
2437
|
}
|
|
1693
2438
|
/**
|
|
1694
2439
|
* Menambahkan variasi ejaan Bahasa Indonesia
|
|
@@ -1699,27 +2444,27 @@ function createEvasionRegex(word) {
|
|
|
1699
2444
|
function addIndonesianVariations(pattern) {
|
|
1700
2445
|
// Variasi ejaan dalam Bahasa Indonesia
|
|
1701
2446
|
const variationMap = {
|
|
1702
|
-
c: [
|
|
1703
|
-
k: [
|
|
1704
|
-
j: [
|
|
1705
|
-
y: [
|
|
1706
|
-
u: [
|
|
1707
|
-
f: [
|
|
1708
|
-
z: [
|
|
1709
|
-
x: [
|
|
2447
|
+
c: ['c', 'k'], // contoh: becok/bekok
|
|
2448
|
+
k: ['k', 'c', 'q'], // contoh: kacau/qacau
|
|
2449
|
+
j: ['j', 'dj'], // contoh: jualan/djualan (ejaan lama)
|
|
2450
|
+
y: ['y', 'j'], // contoh: ya/ja
|
|
2451
|
+
u: ['u', 'oe'], // contoh: untuk/oentoek (ejaan lama)
|
|
2452
|
+
f: ['f', 'p', 'v'], // contoh: kafir/kapir
|
|
2453
|
+
z: ['z', 'j', 's'], // contoh: zaman/jaman
|
|
2454
|
+
x: ['x', 'ks'], // contoh: taxi/taksi
|
|
1710
2455
|
};
|
|
1711
2456
|
// Ganti tiap karakter dengan variasinya
|
|
1712
2457
|
return pattern
|
|
1713
|
-
.split(
|
|
2458
|
+
.split('')
|
|
1714
2459
|
.map((char) => {
|
|
1715
2460
|
const lowerChar = char.toLowerCase();
|
|
1716
2461
|
const variations = variationMap[lowerChar];
|
|
1717
2462
|
if (variations && variations.length > 1) {
|
|
1718
|
-
return `[${variations.join(
|
|
2463
|
+
return `[${variations.join('')}]`;
|
|
1719
2464
|
}
|
|
1720
2465
|
return char;
|
|
1721
2466
|
})
|
|
1722
|
-
.join(
|
|
2467
|
+
.join('');
|
|
1723
2468
|
}
|
|
1724
2469
|
/**
|
|
1725
2470
|
* Membuat regex untuk mencocokkan kata dengan mempertimbangkan variasi ejaan Bahasa Indonesia
|
|
@@ -1729,7 +2474,7 @@ function addIndonesianVariations(pattern) {
|
|
|
1729
2474
|
*/
|
|
1730
2475
|
function createIndonesianVariationRegex(word) {
|
|
1731
2476
|
const pattern = addIndonesianVariations(escapeRegExp(word));
|
|
1732
|
-
return new RegExp(`\\b${pattern}\\b`,
|
|
2477
|
+
return new RegExp(`\\b${pattern}\\b`, 'gi');
|
|
1733
2478
|
}
|
|
1734
2479
|
/**
|
|
1735
2480
|
* Membuat regex untuk mencocokkan kata dengan konteks
|
|
@@ -1742,7 +2487,7 @@ function createContextRegex(word, contextSize = 3) {
|
|
|
1742
2487
|
const wordPattern = escapeRegExp(word);
|
|
1743
2488
|
// Membuat pola yang menangkap beberapa kata sebelum dan setelah kata target
|
|
1744
2489
|
const pattern = `((?:\\S+\\s+){0,${contextSize}})(\\b${wordPattern}\\b)((?:\\s+\\S+){0,${contextSize}})`;
|
|
1745
|
-
return new RegExp(pattern,
|
|
2490
|
+
return new RegExp(pattern, 'gi');
|
|
1746
2491
|
}
|
|
1747
2492
|
/**
|
|
1748
2493
|
* Membuat regex untuk mencocokkan variasi penulisan kata
|
|
@@ -1753,8 +2498,8 @@ function createContextRegex(word, contextSize = 3) {
|
|
|
1753
2498
|
function createWordFormRegex(word) {
|
|
1754
2499
|
// Implementasi sederhana untuk mencocokkan berbagai imbuhan
|
|
1755
2500
|
// Ini bisa dikembangkan lebih lanjut untuk mencocokkan bentukan kata yang lebih kompleks
|
|
1756
|
-
const prefixes = [
|
|
1757
|
-
const suffixes = [
|
|
2501
|
+
const prefixes = ['', 'me', 'pe', 'ber', 'di', 'ter', 'se'];
|
|
2502
|
+
const suffixes = ['', 'kan', 'an', 'i', 'nya'];
|
|
1758
2503
|
const patterns = [];
|
|
1759
2504
|
// Kombinasikan prefix dan suffix
|
|
1760
2505
|
for (const prefix of prefixes) {
|
|
@@ -1762,7 +2507,7 @@ function createWordFormRegex(word) {
|
|
|
1762
2507
|
patterns.push(`\\b${prefix}${escapeRegExp(word)}${suffix}\\b`);
|
|
1763
2508
|
}
|
|
1764
2509
|
}
|
|
1765
|
-
return new RegExp(patterns.join(
|
|
2510
|
+
return new RegExp(patterns.join('|'), 'gi');
|
|
1766
2511
|
}
|
|
1767
2512
|
|
|
1768
2513
|
/**
|
|
@@ -1796,7 +2541,8 @@ function levenshteinDistance(str1, str2) {
|
|
|
1796
2541
|
const cost = s1[i - 1] === s2[j - 1] ? 0 : 1;
|
|
1797
2542
|
matrix[i][j] = Math.min(matrix[i - 1][j] + 1, // deletion
|
|
1798
2543
|
matrix[i][j - 1] + 1, // insertion
|
|
1799
|
-
matrix[i - 1][j - 1] + cost
|
|
2544
|
+
matrix[i - 1][j - 1] + cost // substitution
|
|
2545
|
+
);
|
|
1800
2546
|
}
|
|
1801
2547
|
}
|
|
1802
2548
|
return matrix[len1][len2];
|
|
@@ -1975,8 +2721,7 @@ function findPossibleProfanityBySimiliarity(text, profanityWords, threshold = 0.
|
|
|
1975
2721
|
let bestMatch = null;
|
|
1976
2722
|
for (const profanity of lengthFilteredCandidates) {
|
|
1977
2723
|
const similarity = stringSimilarity(word, profanity);
|
|
1978
|
-
if (similarity >= threshold &&
|
|
1979
|
-
(!bestMatch || similarity > bestMatch.similarity)) {
|
|
2724
|
+
if (similarity >= threshold && (!bestMatch || similarity > bestMatch.similarity)) {
|
|
1980
2725
|
bestMatch = {
|
|
1981
2726
|
word,
|
|
1982
2727
|
original: profanity,
|
|
@@ -2025,8 +2770,7 @@ function findProfanityByLevenshteinDistance(text, profanityWords, threshold = 0.
|
|
|
2025
2770
|
const distance = levenshteinDistance(word, profanity);
|
|
2026
2771
|
if (distance <= maxDistance) {
|
|
2027
2772
|
const similarity = 1 - distance / Math.max(word.length, profanity.length);
|
|
2028
|
-
if (similarity >= threshold &&
|
|
2029
|
-
(!bestMatch || similarity > bestMatch.similarity)) {
|
|
2773
|
+
if (similarity >= threshold && (!bestMatch || similarity > bestMatch.similarity)) {
|
|
2030
2774
|
bestMatch = {
|
|
2031
2775
|
word,
|
|
2032
2776
|
original: profanity,
|
|
@@ -2072,7 +2816,7 @@ function isCharacterCountSimilar(str1, str2, maxDifference) {
|
|
|
2072
2816
|
}
|
|
2073
2817
|
|
|
2074
2818
|
const DEFAULT_OPTIONS = {
|
|
2075
|
-
replaceWith:
|
|
2819
|
+
replaceWith: '*',
|
|
2076
2820
|
fullWordCensor: true,
|
|
2077
2821
|
detectLeetSpeak: true,
|
|
2078
2822
|
checkSubstring: false,
|
|
@@ -2095,7 +2839,7 @@ const FILTER_PRESETS = {
|
|
|
2095
2839
|
light: {
|
|
2096
2840
|
...DEFAULT_OPTIONS,
|
|
2097
2841
|
severityThreshold: 0.7,
|
|
2098
|
-
categories: [
|
|
2842
|
+
categories: ['sexual', 'slur', 'blasphemy'],
|
|
2099
2843
|
},
|
|
2100
2844
|
childSafe: {
|
|
2101
2845
|
...DEFAULT_OPTIONS,
|
|
@@ -2108,49 +2852,49 @@ const FILTER_PRESETS = {
|
|
|
2108
2852
|
const CATEGORY_PRESETS = {
|
|
2109
2853
|
sexual: {
|
|
2110
2854
|
...DEFAULT_OPTIONS,
|
|
2111
|
-
categories: [
|
|
2855
|
+
categories: ['sexual'],
|
|
2112
2856
|
},
|
|
2113
2857
|
insults: {
|
|
2114
2858
|
...DEFAULT_OPTIONS,
|
|
2115
|
-
categories: [
|
|
2859
|
+
categories: ['insult'],
|
|
2116
2860
|
},
|
|
2117
2861
|
profanity: {
|
|
2118
2862
|
...DEFAULT_OPTIONS,
|
|
2119
|
-
categories: [
|
|
2863
|
+
categories: ['profanity'],
|
|
2120
2864
|
},
|
|
2121
2865
|
};
|
|
2122
2866
|
const REGION_PRESETS = {
|
|
2123
2867
|
general: {
|
|
2124
2868
|
...DEFAULT_OPTIONS,
|
|
2125
|
-
regions: [
|
|
2869
|
+
regions: ['general'],
|
|
2126
2870
|
},
|
|
2127
2871
|
jawa: {
|
|
2128
2872
|
...DEFAULT_OPTIONS,
|
|
2129
|
-
regions: [
|
|
2873
|
+
regions: ['jawa'],
|
|
2130
2874
|
},
|
|
2131
2875
|
sunda: {
|
|
2132
2876
|
...DEFAULT_OPTIONS,
|
|
2133
|
-
regions: [
|
|
2877
|
+
regions: ['sunda'],
|
|
2134
2878
|
},
|
|
2135
2879
|
betawi: {
|
|
2136
2880
|
...DEFAULT_OPTIONS,
|
|
2137
|
-
regions: [
|
|
2881
|
+
regions: ['betawi'],
|
|
2138
2882
|
},
|
|
2139
2883
|
batak: {
|
|
2140
2884
|
...DEFAULT_OPTIONS,
|
|
2141
|
-
regions: [
|
|
2885
|
+
regions: ['batak'],
|
|
2142
2886
|
},
|
|
2143
2887
|
};
|
|
2144
2888
|
const REPLACEMENT_CHARS = {
|
|
2145
|
-
asterisk:
|
|
2146
|
-
hash:
|
|
2147
|
-
dollar:
|
|
2148
|
-
at:
|
|
2149
|
-
percent:
|
|
2150
|
-
underscore:
|
|
2151
|
-
dash:
|
|
2152
|
-
dot:
|
|
2153
|
-
grawlix:
|
|
2889
|
+
asterisk: '*',
|
|
2890
|
+
hash: '#',
|
|
2891
|
+
dollar: '$',
|
|
2892
|
+
at: '@',
|
|
2893
|
+
percent: '%',
|
|
2894
|
+
underscore: '_',
|
|
2895
|
+
dash: '-',
|
|
2896
|
+
dot: '.',
|
|
2897
|
+
grawlix: '#@$%&!',
|
|
2154
2898
|
};
|
|
2155
2899
|
/**
|
|
2156
2900
|
* Membuat opsi custom dengan menggabungkan dengan default
|
|
@@ -2177,8 +2921,7 @@ function getPresetOptions(presetName, additionalOptions = {}) {
|
|
|
2177
2921
|
presetOptions = FILTER_PRESETS[presetName];
|
|
2178
2922
|
}
|
|
2179
2923
|
else if (presetName in CATEGORY_PRESETS) {
|
|
2180
|
-
presetOptions =
|
|
2181
|
-
CATEGORY_PRESETS[presetName];
|
|
2924
|
+
presetOptions = CATEGORY_PRESETS[presetName];
|
|
2182
2925
|
}
|
|
2183
2926
|
else if (presetName in REGION_PRESETS) {
|
|
2184
2927
|
presetOptions = REGION_PRESETS[presetName];
|
|
@@ -2197,7 +2940,7 @@ function getPresetOptions(presetName, additionalOptions = {}) {
|
|
|
2197
2940
|
* @param type Tipe karakter pengganti
|
|
2198
2941
|
* @returns Karakter pengganti
|
|
2199
2942
|
*/
|
|
2200
|
-
function getReplacementChar(type =
|
|
2943
|
+
function getReplacementChar(type = 'asterisk') {
|
|
2201
2944
|
return REPLACEMENT_CHARS[type] || REPLACEMENT_CHARS.asterisk;
|
|
2202
2945
|
}
|
|
2203
2946
|
/**
|
|
@@ -2216,7 +2959,7 @@ function getRandomGrawlix() {
|
|
|
2216
2959
|
* @returns String pengganti
|
|
2217
2960
|
*/
|
|
2218
2961
|
function makeRandomGrawlixString(length) {
|
|
2219
|
-
let result =
|
|
2962
|
+
let result = '';
|
|
2220
2963
|
const grawlix = REPLACEMENT_CHARS.grawlix;
|
|
2221
2964
|
for (let i = 0; i < length; i++) {
|
|
2222
2965
|
result += grawlix[Math.floor(Math.random() * grawlix.length)];
|
|
@@ -2244,7 +2987,7 @@ class AhoCorasick {
|
|
|
2244
2987
|
*/
|
|
2245
2988
|
addPattern(pattern) {
|
|
2246
2989
|
if (this.built) {
|
|
2247
|
-
throw new Error(
|
|
2990
|
+
throw new Error('Cannot add patterns after the automaton is built');
|
|
2248
2991
|
}
|
|
2249
2992
|
let node = this.root;
|
|
2250
2993
|
const normalizedPattern = pattern.toLowerCase();
|
|
@@ -2381,9 +3124,7 @@ function findProfanity(text, options = {}) {
|
|
|
2381
3124
|
let baseWordsToCheck = wordList.length > 0 ? wordList : [];
|
|
2382
3125
|
if (baseWordsToCheck.length === 0) {
|
|
2383
3126
|
const filteredWords = wordObjects.filter((word) => {
|
|
2384
|
-
const matchCategory = categories
|
|
2385
|
-
? categories.includes(word.category)
|
|
2386
|
-
: true;
|
|
3127
|
+
const matchCategory = categories ? categories.includes(word.category) : true;
|
|
2387
3128
|
const matchRegion = regions ? regions.includes(word.region) : true;
|
|
2388
3129
|
const matchSeverity = word.severity >= severityThreshold;
|
|
2389
3130
|
return matchCategory && matchRegion && matchSeverity;
|
|
@@ -2393,9 +3134,7 @@ function findProfanity(text, options = {}) {
|
|
|
2393
3134
|
const aliasMap = new Map();
|
|
2394
3135
|
wordObjects.forEach((wordObj) => {
|
|
2395
3136
|
if (wordObj.aliases && wordObj.aliases.length > 0) {
|
|
2396
|
-
const matchCategory = categories
|
|
2397
|
-
? categories.includes(wordObj.category)
|
|
2398
|
-
: true;
|
|
3137
|
+
const matchCategory = categories ? categories.includes(wordObj.category) : true;
|
|
2399
3138
|
const matchRegion = regions ? regions.includes(wordObj.region) : true;
|
|
2400
3139
|
const matchSeverity = wordObj.severity >= severityThreshold;
|
|
2401
3140
|
if (matchCategory && matchRegion && matchSeverity) {
|
|
@@ -2405,10 +3144,7 @@ function findProfanity(text, options = {}) {
|
|
|
2405
3144
|
}
|
|
2406
3145
|
}
|
|
2407
3146
|
});
|
|
2408
|
-
const wordsToCheck = [
|
|
2409
|
-
...baseWordsToCheck,
|
|
2410
|
-
...Array.from(aliasMap.keys()),
|
|
2411
|
-
].filter((word) => !whitelist.includes(word.toLowerCase()));
|
|
3147
|
+
const wordsToCheck = [...baseWordsToCheck, ...Array.from(aliasMap.keys())].filter((word) => !whitelist.includes(word.toLowerCase()));
|
|
2412
3148
|
if (wordsToCheck.length === 0) {
|
|
2413
3149
|
return [];
|
|
2414
3150
|
}
|
|
@@ -2488,8 +3224,7 @@ function findProfanity(text, options = {}) {
|
|
|
2488
3224
|
if (useLevenshtein) {
|
|
2489
3225
|
const possibleProfanity = findProfanityByLevenshteinDistance(text, wordsToCheck, similarityThreshold, maxLevenshteinDistance);
|
|
2490
3226
|
possibleProfanity.forEach((item) => {
|
|
2491
|
-
const originalWord = aliasMap.get(item.original.toLowerCase()) ||
|
|
2492
|
-
item.original.toLowerCase();
|
|
3227
|
+
const originalWord = aliasMap.get(item.original.toLowerCase()) || item.original.toLowerCase();
|
|
2493
3228
|
matches.add(originalWord);
|
|
2494
3229
|
if (!actualMatches.has(originalWord)) {
|
|
2495
3230
|
actualMatches.set(originalWord, []);
|
|
@@ -2501,8 +3236,7 @@ function findProfanity(text, options = {}) {
|
|
|
2501
3236
|
const possibleProfanity = findPossibleProfanityBySimiliarity(text, wordsToCheck, similarityThreshold);
|
|
2502
3237
|
possibleProfanity.forEach((item) => {
|
|
2503
3238
|
matches.add(item.original.toLowerCase());
|
|
2504
|
-
const originalWord = aliasMap.get(item.original.toLowerCase()) ||
|
|
2505
|
-
item.original.toLowerCase();
|
|
3239
|
+
const originalWord = aliasMap.get(item.original.toLowerCase()) || item.original.toLowerCase();
|
|
2506
3240
|
if (!actualMatches.has(originalWord)) {
|
|
2507
3241
|
actualMatches.set(originalWord, []);
|
|
2508
3242
|
}
|
|
@@ -2528,8 +3262,7 @@ function findProfanityWithMetadata(text, options = {}) {
|
|
|
2528
3262
|
return matches
|
|
2529
3263
|
.map((word) => {
|
|
2530
3264
|
const wordObject = wordObjects.find((obj) => obj.word.toLowerCase() === word.toLowerCase() ||
|
|
2531
|
-
(obj.aliases &&
|
|
2532
|
-
obj.aliases.some((alias) => alias.toLowerCase() === word.toLowerCase())));
|
|
3265
|
+
(obj.aliases && obj.aliases.some((alias) => alias.toLowerCase() === word.toLowerCase())));
|
|
2533
3266
|
return wordObject;
|
|
2534
3267
|
})
|
|
2535
3268
|
.filter((word) => word !== undefined);
|
|
@@ -2600,7 +3333,7 @@ function calculateSeverity(matchDetails) {
|
|
|
2600
3333
|
* @returns FilterResult dengan hasil filter
|
|
2601
3334
|
*/
|
|
2602
3335
|
function filter(text, options = {}) {
|
|
2603
|
-
const { replaceWith =
|
|
3336
|
+
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 };
|
|
2604
3337
|
const matches = findProfanity(text, {
|
|
2605
3338
|
...options,
|
|
2606
3339
|
detectLeetSpeak,
|
|
@@ -2626,13 +3359,12 @@ function filter(text, options = {}) {
|
|
|
2626
3359
|
const replacements = [];
|
|
2627
3360
|
matches.forEach((word) => {
|
|
2628
3361
|
const metadata = matchDetails.find((m) => m.word.toLowerCase() === word.toLowerCase() ||
|
|
2629
|
-
(m.aliases &&
|
|
2630
|
-
m.aliases.some((alias) => alias.toLowerCase() === word.toLowerCase())));
|
|
3362
|
+
(m.aliases && m.aliases.some((alias) => alias.toLowerCase() === word.toLowerCase())));
|
|
2631
3363
|
const variants = actualMatches.get(word.toLowerCase()) || [];
|
|
2632
3364
|
variants.push(word);
|
|
2633
3365
|
const uniqueVariants = [...new Set(variants)];
|
|
2634
3366
|
uniqueVariants.forEach((variant) => {
|
|
2635
|
-
const regex = new RegExp(`\\b${escapeRegExp(variant)}\\b`,
|
|
3367
|
+
const regex = new RegExp(`\\b${escapeRegExp(variant)}\\b`, 'gi');
|
|
2636
3368
|
let match;
|
|
2637
3369
|
while ((match = regex.exec(filteredText)) !== null) {
|
|
2638
3370
|
const originalWord = match[0];
|
|
@@ -2650,7 +3382,7 @@ function filter(text, options = {}) {
|
|
|
2650
3382
|
censored: censoredWord,
|
|
2651
3383
|
metadata,
|
|
2652
3384
|
});
|
|
2653
|
-
filteredText = filteredText.replace(new RegExp(`\\b${escapeRegExp(originalWord)}\\b`,
|
|
3385
|
+
filteredText = filteredText.replace(new RegExp(`\\b${escapeRegExp(originalWord)}\\b`, 'g'), censoredWord);
|
|
2654
3386
|
}
|
|
2655
3387
|
});
|
|
2656
3388
|
if (detectSplit || detectLeetSpeak) {
|
|
@@ -2679,7 +3411,7 @@ function filter(text, options = {}) {
|
|
|
2679
3411
|
censored: censoredWord,
|
|
2680
3412
|
metadata,
|
|
2681
3413
|
});
|
|
2682
|
-
filteredText = filteredText.replace(new RegExp(escapeRegExp(originalWord),
|
|
3414
|
+
filteredText = filteredText.replace(new RegExp(escapeRegExp(originalWord), 'g'), censoredWord);
|
|
2683
3415
|
}
|
|
2684
3416
|
}
|
|
2685
3417
|
if (detectSplit) {
|
|
@@ -2707,7 +3439,7 @@ function filter(text, options = {}) {
|
|
|
2707
3439
|
censored: censoredWord,
|
|
2708
3440
|
metadata,
|
|
2709
3441
|
});
|
|
2710
|
-
filteredText = filteredText.replace(new RegExp(escapeRegExp(originalWord),
|
|
3442
|
+
filteredText = filteredText.replace(new RegExp(escapeRegExp(originalWord), 'g'), censoredWord);
|
|
2711
3443
|
}
|
|
2712
3444
|
}
|
|
2713
3445
|
}
|
|
@@ -2715,11 +3447,10 @@ function filter(text, options = {}) {
|
|
|
2715
3447
|
if (detectSimilarity && useLevenshtein) {
|
|
2716
3448
|
matches.forEach((word) => {
|
|
2717
3449
|
const metadata = matchDetails.find((m) => m.word.toLowerCase() === word.toLowerCase() ||
|
|
2718
|
-
(m.aliases &&
|
|
2719
|
-
m.aliases.some((alias) => alias.toLowerCase() === word.toLowerCase())));
|
|
3450
|
+
(m.aliases && m.aliases.some((alias) => alias.toLowerCase() === word.toLowerCase())));
|
|
2720
3451
|
const variants = actualMatches.get(word.toLowerCase()) || [];
|
|
2721
3452
|
variants.forEach((variant) => {
|
|
2722
|
-
const exactVariantRegex = new RegExp(`\\b${escapeRegExp(variant)}\\b`,
|
|
3453
|
+
const exactVariantRegex = new RegExp(`\\b${escapeRegExp(variant)}\\b`, 'gi');
|
|
2723
3454
|
let match;
|
|
2724
3455
|
while ((match = exactVariantRegex.exec(filteredText)) !== null) {
|
|
2725
3456
|
const originalWord = match[0];
|
|
@@ -2737,7 +3468,7 @@ function filter(text, options = {}) {
|
|
|
2737
3468
|
censored: censoredWord,
|
|
2738
3469
|
metadata,
|
|
2739
3470
|
});
|
|
2740
|
-
filteredText = filteredText.replace(new RegExp(`\\b${escapeRegExp(originalWord)}\\b`,
|
|
3471
|
+
filteredText = filteredText.replace(new RegExp(`\\b${escapeRegExp(originalWord)}\\b`, 'g'), censoredWord);
|
|
2741
3472
|
}
|
|
2742
3473
|
});
|
|
2743
3474
|
});
|
|
@@ -2896,9 +3627,9 @@ function analyzeWithContext(text, contextWindowSize = 5, options = {}) {
|
|
|
2896
3627
|
const regex = createContextRegex(word, contextWindowSize);
|
|
2897
3628
|
let match;
|
|
2898
3629
|
while ((match = regex.exec(text)) !== null) {
|
|
2899
|
-
const beforeContext = match[1] ||
|
|
3630
|
+
const beforeContext = match[1] || '';
|
|
2900
3631
|
const wordMatch = match[2];
|
|
2901
|
-
const afterContext = match[3] ||
|
|
3632
|
+
const afterContext = match[3] || '';
|
|
2902
3633
|
result.push({
|
|
2903
3634
|
word: wordMatch,
|
|
2904
3635
|
context: beforeContext + wordMatch + afterContext,
|
|
@@ -2999,10 +3730,7 @@ class IDProfanityFilter {
|
|
|
2999
3730
|
* @param word Kata yang akan diabaikan
|
|
3000
3731
|
*/
|
|
3001
3732
|
addToWhitelist(word) {
|
|
3002
|
-
this.options.whitelist = [
|
|
3003
|
-
...(this.options.whitelist || []),
|
|
3004
|
-
word.toLowerCase(),
|
|
3005
|
-
];
|
|
3733
|
+
this.options.whitelist = [...(this.options.whitelist || []), word.toLowerCase()];
|
|
3006
3734
|
}
|
|
3007
3735
|
/**
|
|
3008
3736
|
* Menghapus kata dari whitelist
|