@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.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
|
},
|
|
@@ -1050,221 +1042,221 @@ sunda.map((item) => item.word);
|
|
|
1050
1042
|
|
|
1051
1043
|
const betawi = [
|
|
1052
1044
|
{
|
|
1053
|
-
word:
|
|
1054
|
-
category:
|
|
1055
|
-
region:
|
|
1045
|
+
word: 'jablay',
|
|
1046
|
+
category: 'sexual',
|
|
1047
|
+
region: 'betawi',
|
|
1056
1048
|
severity: 0.7,
|
|
1057
|
-
aliases: [
|
|
1049
|
+
aliases: ['jabl4y', 'jalay'],
|
|
1058
1050
|
description: 'Singkatan dari "jarang dibelai", istilah untuk perempuan yang mudah didekati',
|
|
1059
|
-
context:
|
|
1051
|
+
context: 'Hinaan yang merendahkan untuk wanita',
|
|
1060
1052
|
},
|
|
1061
1053
|
{
|
|
1062
|
-
word:
|
|
1063
|
-
category:
|
|
1064
|
-
region:
|
|
1054
|
+
word: 'udik',
|
|
1055
|
+
category: 'insult',
|
|
1056
|
+
region: 'betawi',
|
|
1065
1057
|
severity: 0.5,
|
|
1066
|
-
aliases: [
|
|
1067
|
-
description:
|
|
1068
|
-
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',
|
|
1069
1061
|
},
|
|
1070
1062
|
{
|
|
1071
|
-
word:
|
|
1072
|
-
category:
|
|
1073
|
-
region:
|
|
1063
|
+
word: 'perek',
|
|
1064
|
+
category: 'sexual',
|
|
1065
|
+
region: 'betawi',
|
|
1074
1066
|
severity: 0.7,
|
|
1075
|
-
aliases: [
|
|
1076
|
-
description:
|
|
1077
|
-
context:
|
|
1067
|
+
aliases: ['perempuan eksperimen', 'prk'],
|
|
1068
|
+
description: 'Istilah untuk perempuan yang dianggap memiliki moral yang rendah',
|
|
1069
|
+
context: 'Hinaan yang merendahkan untuk wanita',
|
|
1078
1070
|
},
|
|
1079
1071
|
];
|
|
1080
1072
|
betawi.map((item) => item.word);
|
|
1081
1073
|
|
|
1082
|
-
const
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
severity: 0.7,
|
|
1092
|
-
aliases: ["bkp", "bokap"],
|
|
1093
|
-
description: "Istilah untuk video atau konten pornografi",
|
|
1094
|
-
context: "Kata yang mengacu pada materi pornografi",
|
|
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',
|
|
1095
1083
|
},
|
|
1096
1084
|
{
|
|
1097
|
-
word:
|
|
1098
|
-
category:
|
|
1099
|
-
region:
|
|
1100
|
-
severity: 0.
|
|
1101
|
-
aliases: [
|
|
1102
|
-
description:
|
|
1103
|
-
context:
|
|
1085
|
+
word: 'kondiak',
|
|
1086
|
+
category: 'insult',
|
|
1087
|
+
region: 'minang',
|
|
1088
|
+
severity: 0.5,
|
|
1089
|
+
aliases: ['kondik', 'kandiak'],
|
|
1090
|
+
description: 'Secara harfiah berarti "babi"',
|
|
1091
|
+
context: 'Digunakan ketika bercanda dengan teman sebaya',
|
|
1104
1092
|
},
|
|
1105
1093
|
{
|
|
1106
|
-
word:
|
|
1107
|
-
category:
|
|
1108
|
-
region:
|
|
1109
|
-
severity: 0.
|
|
1110
|
-
aliases: [
|
|
1111
|
-
description:
|
|
1112
|
-
context:
|
|
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',
|
|
1113
1101
|
},
|
|
1114
1102
|
{
|
|
1115
|
-
word:
|
|
1116
|
-
category:
|
|
1117
|
-
region:
|
|
1118
|
-
severity: 0.
|
|
1119
|
-
aliases: [
|
|
1120
|
-
description:
|
|
1121
|
-
context:
|
|
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',
|
|
1122
1110
|
},
|
|
1123
1111
|
{
|
|
1124
|
-
word:
|
|
1125
|
-
category:
|
|
1126
|
-
region:
|
|
1127
|
-
severity: 0.
|
|
1128
|
-
aliases: [
|
|
1129
|
-
description:
|
|
1130
|
-
context:
|
|
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',
|
|
1131
1119
|
},
|
|
1120
|
+
];
|
|
1121
|
+
minang.map((item) => item.word);
|
|
1122
|
+
|
|
1123
|
+
const madura = [
|
|
1132
1124
|
{
|
|
1133
|
-
word:
|
|
1134
|
-
category:
|
|
1135
|
-
region:
|
|
1136
|
-
severity: 0.
|
|
1137
|
-
aliases: [
|
|
1138
|
-
description:
|
|
1139
|
-
context:
|
|
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',
|
|
1140
1132
|
},
|
|
1141
1133
|
{
|
|
1142
|
-
word:
|
|
1143
|
-
category:
|
|
1144
|
-
region:
|
|
1145
|
-
severity: 0.
|
|
1146
|
-
aliases: [
|
|
1147
|
-
description: "
|
|
1148
|
-
context:
|
|
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',
|
|
1149
1141
|
},
|
|
1150
1142
|
{
|
|
1151
|
-
word:
|
|
1152
|
-
category:
|
|
1153
|
-
region:
|
|
1154
|
-
severity: 0.
|
|
1155
|
-
aliases: [
|
|
1156
|
-
description:
|
|
1157
|
-
context:
|
|
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',
|
|
1158
1150
|
},
|
|
1159
1151
|
{
|
|
1160
|
-
word:
|
|
1161
|
-
category:
|
|
1162
|
-
region:
|
|
1152
|
+
word: 'Korang ajher',
|
|
1153
|
+
category: 'insult',
|
|
1154
|
+
region: 'madura',
|
|
1163
1155
|
severity: 0.6,
|
|
1164
|
-
aliases: [
|
|
1165
|
-
description: "
|
|
1166
|
-
context:
|
|
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',
|
|
1167
1168
|
},
|
|
1168
1169
|
];
|
|
1169
|
-
|
|
1170
|
+
madura.map((item) => item.word);
|
|
1170
1171
|
|
|
1171
|
-
const
|
|
1172
|
-
...general.filter((word) => word.category === "insult"),
|
|
1173
|
-
...jawa.filter((word) => word.category === "insult"),
|
|
1174
|
-
...sunda.filter((word) => word.category === "insult"),
|
|
1175
|
-
...betawi.filter((word) => word.category === "insult"),
|
|
1176
|
-
{
|
|
1177
|
-
word: "idiot",
|
|
1178
|
-
category: "insult",
|
|
1179
|
-
region: "general",
|
|
1180
|
-
severity: 0.6,
|
|
1181
|
-
aliases: ["idi0t", "idot"],
|
|
1182
|
-
description: "Kata yang mengacu pada kebodohan seseorang",
|
|
1183
|
-
context: "Hinaan untuk menyebut orang yang dianggap sangat tidak pintar",
|
|
1184
|
-
},
|
|
1172
|
+
const aceh = [
|
|
1185
1173
|
{
|
|
1186
|
-
word:
|
|
1187
|
-
category:
|
|
1188
|
-
region:
|
|
1189
|
-
severity: 0.
|
|
1190
|
-
aliases: [
|
|
1191
|
-
description:
|
|
1192
|
-
context:
|
|
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',
|
|
1193
1181
|
},
|
|
1194
1182
|
{
|
|
1195
|
-
word:
|
|
1196
|
-
category:
|
|
1197
|
-
region:
|
|
1183
|
+
word: 'bui',
|
|
1184
|
+
category: 'insult',
|
|
1185
|
+
region: 'aceh',
|
|
1198
1186
|
severity: 0.6,
|
|
1199
|
-
aliases: [
|
|
1200
|
-
description:
|
|
1201
|
-
context:
|
|
1187
|
+
aliases: [],
|
|
1188
|
+
description: 'Secara harfiah berarti babi',
|
|
1189
|
+
context: 'Umpatan untuk menyebut orang yang dianggap kotor, rakus, atau tidak berakhlak',
|
|
1202
1190
|
},
|
|
1203
1191
|
{
|
|
1204
|
-
word:
|
|
1205
|
-
category:
|
|
1206
|
-
region:
|
|
1192
|
+
word: 'asèe',
|
|
1193
|
+
category: 'insult',
|
|
1194
|
+
region: 'aceh',
|
|
1207
1195
|
severity: 0.6,
|
|
1208
|
-
aliases: [
|
|
1209
|
-
description:
|
|
1210
|
-
context:
|
|
1196
|
+
aliases: ['asee'],
|
|
1197
|
+
description: 'Secara harfiah berarti anjing',
|
|
1198
|
+
context: 'Umpatan untuk menyebut orang yang dianggap hina atau tidak berguna',
|
|
1211
1199
|
},
|
|
1212
1200
|
{
|
|
1213
|
-
word:
|
|
1214
|
-
category:
|
|
1215
|
-
region:
|
|
1216
|
-
severity: 0.
|
|
1217
|
-
aliases: [
|
|
1218
|
-
description:
|
|
1219
|
-
context:
|
|
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',
|
|
1220
1208
|
},
|
|
1221
1209
|
{
|
|
1222
|
-
word: "
|
|
1223
|
-
category:
|
|
1224
|
-
region:
|
|
1225
|
-
severity: 0.
|
|
1226
|
-
aliases: [
|
|
1227
|
-
description:
|
|
1228
|
-
context:
|
|
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',
|
|
1229
1217
|
},
|
|
1230
1218
|
{
|
|
1231
|
-
word:
|
|
1232
|
-
category:
|
|
1233
|
-
region:
|
|
1234
|
-
severity: 0.
|
|
1235
|
-
aliases: [
|
|
1236
|
-
description: "
|
|
1237
|
-
context:
|
|
1219
|
+
word: 'sangak',
|
|
1220
|
+
category: 'insult',
|
|
1221
|
+
region: 'aceh',
|
|
1222
|
+
severity: 0.6,
|
|
1223
|
+
aliases: [],
|
|
1224
|
+
description: "Berarti bodoh (lebih kasar dari pa'ak)",
|
|
1225
|
+
context: 'Umpatan kasar untuk menyebut seseorang yang sangat bodoh',
|
|
1238
1226
|
},
|
|
1227
|
+
];
|
|
1228
|
+
aceh.map((item) => item.word);
|
|
1229
|
+
|
|
1230
|
+
const bali = [
|
|
1239
1231
|
{
|
|
1240
|
-
word:
|
|
1241
|
-
category:
|
|
1242
|
-
region:
|
|
1243
|
-
severity: 0.
|
|
1244
|
-
aliases: [
|
|
1245
|
-
description:
|
|
1246
|
-
context:
|
|
1232
|
+
word: 'cicing',
|
|
1233
|
+
category: 'insult',
|
|
1234
|
+
region: 'bali',
|
|
1235
|
+
severity: 0.7,
|
|
1236
|
+
aliases: [],
|
|
1237
|
+
description: 'Secara harfiah berarti anjing',
|
|
1238
|
+
context: 'Umpatan umum di Bali untuk menyebut orang yang dianggap hina atau tidak berguna',
|
|
1247
1239
|
},
|
|
1248
1240
|
{
|
|
1249
|
-
word:
|
|
1250
|
-
category:
|
|
1251
|
-
region:
|
|
1252
|
-
severity: 0.
|
|
1253
|
-
aliases: [
|
|
1254
|
-
description:
|
|
1255
|
-
context:
|
|
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',
|
|
1256
1248
|
},
|
|
1257
1249
|
{
|
|
1258
|
-
word:
|
|
1259
|
-
category:
|
|
1260
|
-
region:
|
|
1261
|
-
severity: 0.
|
|
1262
|
-
aliases: [
|
|
1263
|
-
description:
|
|
1264
|
-
context:
|
|
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',
|
|
1265
1257
|
},
|
|
1266
1258
|
];
|
|
1267
|
-
|
|
1259
|
+
bali.map((item) => item.word);
|
|
1268
1260
|
|
|
1269
1261
|
const batak = [
|
|
1270
1262
|
{
|
|
@@ -1384,6 +1376,15 @@ const batak = [
|
|
|
1384
1376
|
description: 'Berarti orang yang suka bicara omong kosong atau tidak jelas',
|
|
1385
1377
|
context: 'Umpatan ringan untuk menyebut orang yang perkataannya tidak bisa dipercaya.',
|
|
1386
1378
|
},
|
|
1379
|
+
{
|
|
1380
|
+
word: 'loak',
|
|
1381
|
+
category: 'insult',
|
|
1382
|
+
region: 'batak',
|
|
1383
|
+
severity: 0.5,
|
|
1384
|
+
aliases: [],
|
|
1385
|
+
description: 'Berarti orang yang bodoh',
|
|
1386
|
+
context: 'Umpatan kasar untuk menyebut orang yang tidak pintar.',
|
|
1387
|
+
},
|
|
1387
1388
|
{
|
|
1388
1389
|
word: 'songon babiat',
|
|
1389
1390
|
category: 'insult',
|
|
@@ -1402,20 +1403,766 @@ const batak = [
|
|
|
1402
1403
|
description: 'Secara harfiah berarti pohon lapuk (kiasan untuk tidak berguna)',
|
|
1403
1404
|
context: 'Umpatan untuk menyebut orang yang dianggap tidak berguna.',
|
|
1404
1405
|
},
|
|
1406
|
+
{
|
|
1407
|
+
word: 'bujang inam',
|
|
1408
|
+
category: 'sexual',
|
|
1409
|
+
region: 'batak',
|
|
1410
|
+
severity: 0.8,
|
|
1411
|
+
aliases: [],
|
|
1412
|
+
description: 'Secara harfiah berarti kemaluan (kasar)',
|
|
1413
|
+
context: 'Umpatan kasar untuk menyebut kemaluan wanita.',
|
|
1414
|
+
},
|
|
1415
|
+
{
|
|
1416
|
+
word: 'pilat',
|
|
1417
|
+
category: 'sexual',
|
|
1418
|
+
region: 'batak',
|
|
1419
|
+
severity: 0.8,
|
|
1420
|
+
aliases: [],
|
|
1421
|
+
description: 'Secara harfiah berarti kemaluan (kasar)',
|
|
1422
|
+
context: 'Umpatan kasar untuk menyebut kemaluan pria.',
|
|
1423
|
+
},
|
|
1424
|
+
{
|
|
1425
|
+
word: 'heang',
|
|
1426
|
+
category: 'sexual',
|
|
1427
|
+
region: 'batak',
|
|
1428
|
+
severity: 0.8,
|
|
1429
|
+
aliases: [],
|
|
1430
|
+
description: 'Secara harfiah berarti kemaluan (kasar)',
|
|
1431
|
+
context: 'Umpatan kasar untuk menyebut kemaluan wanita.',
|
|
1432
|
+
},
|
|
1433
|
+
{
|
|
1434
|
+
word: 'longor',
|
|
1435
|
+
category: 'insult',
|
|
1436
|
+
region: 'batak',
|
|
1437
|
+
severity: 0.7,
|
|
1438
|
+
aliases: [],
|
|
1439
|
+
description: 'Berarti bodoh atau dungu (kasar)',
|
|
1440
|
+
context: 'Umpatan kasar untuk menyebut seseorang yang sangat tidak pintar.',
|
|
1441
|
+
},
|
|
1442
|
+
{
|
|
1443
|
+
word: 'te',
|
|
1444
|
+
category: 'disgusting',
|
|
1445
|
+
region: 'batak',
|
|
1446
|
+
severity: 0.6,
|
|
1447
|
+
aliases: [],
|
|
1448
|
+
description: 'Secara harfiah berarti kotoran atau najis',
|
|
1449
|
+
context: 'Umpatan untuk menunjukkan sesuatu yang menjijikkan atau kotor.',
|
|
1450
|
+
},
|
|
1451
|
+
{
|
|
1452
|
+
word: 'rojan',
|
|
1453
|
+
category: 'disgusting',
|
|
1454
|
+
region: 'batak',
|
|
1455
|
+
severity: 0.6,
|
|
1456
|
+
aliases: [],
|
|
1457
|
+
description: 'Secara harfiah berarti kotoran atau najis',
|
|
1458
|
+
context: 'Umpatan untuk menunjukkan sesuatu yang menjijikkan atau buruk.',
|
|
1459
|
+
},
|
|
1460
|
+
{
|
|
1461
|
+
word: 'teho',
|
|
1462
|
+
category: 'insult',
|
|
1463
|
+
region: 'batak',
|
|
1464
|
+
severity: 0.8,
|
|
1465
|
+
aliases: [],
|
|
1466
|
+
description: 'Secara harfiah berarti mengatakan kamu kayak tai)',
|
|
1467
|
+
context: 'Umpatan sangat kasar untuk menghina seseorang.',
|
|
1468
|
+
},
|
|
1469
|
+
{
|
|
1470
|
+
word: 'roa',
|
|
1471
|
+
category: 'insult',
|
|
1472
|
+
region: 'batak',
|
|
1473
|
+
severity: 0.8,
|
|
1474
|
+
aliases: [],
|
|
1475
|
+
description: 'Secara harfiah berarti mengatakan rupa yang jelek)',
|
|
1476
|
+
context: 'Umpatan sangat kasar untuk menghina seseorang.',
|
|
1477
|
+
},
|
|
1478
|
+
{
|
|
1479
|
+
word: 'pargabus',
|
|
1480
|
+
category: 'insult',
|
|
1481
|
+
region: 'batak',
|
|
1482
|
+
severity: 0.6,
|
|
1483
|
+
aliases: [],
|
|
1484
|
+
description: 'Berarti pembohong atau penipu',
|
|
1485
|
+
context: 'Umpatan untuk menyebut orang yang tidak jujur.',
|
|
1486
|
+
},
|
|
1487
|
+
{
|
|
1488
|
+
word: 'tois hian',
|
|
1489
|
+
category: 'insult',
|
|
1490
|
+
region: 'batak',
|
|
1491
|
+
severity: 0.8,
|
|
1492
|
+
aliases: [],
|
|
1493
|
+
description: 'Secara harfiah berarti mengatakan sombong kali)',
|
|
1494
|
+
context: 'Umpatan sangat kasar untuk menghina seseorang yang sombong.',
|
|
1495
|
+
},
|
|
1496
|
+
{
|
|
1497
|
+
word: 'rittik',
|
|
1498
|
+
category: 'insult',
|
|
1499
|
+
region: 'batak',
|
|
1500
|
+
severity: 0.8,
|
|
1501
|
+
aliases: [],
|
|
1502
|
+
description: 'Secara harfiah berarti mengatakan prilaku seperti orang gila)',
|
|
1503
|
+
context: 'Umpatan kasar untuk menghina seseorang yang dianggap seperti orang gila.',
|
|
1504
|
+
},
|
|
1505
|
+
{
|
|
1506
|
+
word: 'maup',
|
|
1507
|
+
category: 'insult',
|
|
1508
|
+
region: 'batak',
|
|
1509
|
+
severity: 0.8,
|
|
1510
|
+
aliases: [],
|
|
1511
|
+
description: 'Secara harfiah berarti mengatakan mampus(mati aja) aja kau)',
|
|
1512
|
+
context: 'Umpatan kasar untuk menghina seseorang yang sulit untuk diajari atau susah mengerti.',
|
|
1513
|
+
},
|
|
1514
|
+
{
|
|
1515
|
+
word: 'matami',
|
|
1516
|
+
category: 'profanity',
|
|
1517
|
+
region: 'batak',
|
|
1518
|
+
severity: 0.6,
|
|
1519
|
+
aliases: [],
|
|
1520
|
+
description: 'Berarti matamu tapi dengan nada kesal atau marah',
|
|
1521
|
+
context: 'Umpatan untuk menunjukkan kekesalan atau emosi karna dipandnag tidak layak.',
|
|
1522
|
+
},
|
|
1523
|
+
{
|
|
1524
|
+
word: 'pasib jo babam',
|
|
1525
|
+
category: 'profanity',
|
|
1526
|
+
region: 'batak',
|
|
1527
|
+
severity: 0.6,
|
|
1528
|
+
aliases: [],
|
|
1529
|
+
description: 'Berarti memerintahkan untuk diam dengan emosi',
|
|
1530
|
+
context: 'Umpatan untuk menunjukkan kekesalan atau emosi karna terlalu berisik.',
|
|
1531
|
+
},
|
|
1532
|
+
{
|
|
1533
|
+
word: 'hira begu',
|
|
1534
|
+
category: 'insult',
|
|
1535
|
+
region: 'batak',
|
|
1536
|
+
severity: 0.5,
|
|
1537
|
+
aliases: [],
|
|
1538
|
+
description: 'Secara harfiah berarti mengatakan kamu kayak setan(bisa karna prilakunya)',
|
|
1539
|
+
context: 'Umpatan kasar untuk menghina seseorang yang suka hilang tiba-tiba seperti setan.',
|
|
1540
|
+
},
|
|
1541
|
+
{
|
|
1542
|
+
word: 'bakke',
|
|
1543
|
+
category: 'profanity',
|
|
1544
|
+
region: 'batak',
|
|
1545
|
+
severity: 0.6,
|
|
1546
|
+
aliases: [],
|
|
1547
|
+
description: 'Berarti bangkai atau bau bangka',
|
|
1548
|
+
context: 'Umpatan untuk menunjukkan kekesalan atau merasa heran kepada orng yang bau atau orang yang berantakan.',
|
|
1549
|
+
},
|
|
1550
|
+
{
|
|
1551
|
+
word: 'panakko',
|
|
1552
|
+
category: 'profanity',
|
|
1553
|
+
region: 'batak',
|
|
1554
|
+
severity: 0.6,
|
|
1555
|
+
aliases: [],
|
|
1556
|
+
description: 'Berarti si pencuri',
|
|
1557
|
+
context: 'Umpatan untuk menunjukkan kekesalan atau emosi kepada orng suka mengambil tanpa permisi.',
|
|
1558
|
+
},
|
|
1405
1559
|
];
|
|
1406
1560
|
batak.map((item) => item.word);
|
|
1407
1561
|
|
|
1562
|
+
const sexual = [
|
|
1563
|
+
...general.filter((word) => word.category === 'sexual'),
|
|
1564
|
+
...jawa.filter((word) => word.category === 'sexual'),
|
|
1565
|
+
...sunda.filter((word) => word.category === 'sexual'),
|
|
1566
|
+
...betawi.filter((word) => word.category === 'sexual'),
|
|
1567
|
+
...minang.filter((word) => word.category === 'sexual'),
|
|
1568
|
+
...madura.filter((word) => word.category === 'sexual'),
|
|
1569
|
+
...sunda.filter((word) => word.category === 'sexual'),
|
|
1570
|
+
...aceh.filter((word) => word.category === 'sexual'),
|
|
1571
|
+
...bali.filter((word) => word.category === 'sexual'),
|
|
1572
|
+
...batak.filter((word) => word.category === 'sexual'),
|
|
1573
|
+
{
|
|
1574
|
+
word: 'bokep',
|
|
1575
|
+
category: 'sexual',
|
|
1576
|
+
region: 'general',
|
|
1577
|
+
severity: 0.7,
|
|
1578
|
+
aliases: ['bkp', 'bokap'],
|
|
1579
|
+
description: 'Istilah untuk video atau konten pornografi',
|
|
1580
|
+
context: 'Kata yang mengacu pada materi pornografi',
|
|
1581
|
+
},
|
|
1582
|
+
{
|
|
1583
|
+
word: 'coli',
|
|
1584
|
+
category: 'sexual',
|
|
1585
|
+
region: 'general',
|
|
1586
|
+
severity: 0.8,
|
|
1587
|
+
aliases: ['col', 'coly'],
|
|
1588
|
+
description: 'Istilah untuk masturbasi laki-laki',
|
|
1589
|
+
context: 'Kata vulgar yang merujuk pada aktivitas seksual pribadi',
|
|
1590
|
+
},
|
|
1591
|
+
{
|
|
1592
|
+
word: 'desah',
|
|
1593
|
+
category: 'sexual',
|
|
1594
|
+
region: 'general',
|
|
1595
|
+
severity: 0.6,
|
|
1596
|
+
aliases: ['ds4h', 'dsh'],
|
|
1597
|
+
description: 'Istilah untuk suara yang dibuat selama aktivitas seksual',
|
|
1598
|
+
context: 'Dapat menjadi vulgar tergantung konteks penggunaan',
|
|
1599
|
+
},
|
|
1600
|
+
{
|
|
1601
|
+
word: 'seks',
|
|
1602
|
+
category: 'sexual',
|
|
1603
|
+
region: 'general',
|
|
1604
|
+
severity: 0.5,
|
|
1605
|
+
aliases: ['sex', 'ML'],
|
|
1606
|
+
description: 'Istilah untuk aktivitas seksual',
|
|
1607
|
+
context: 'Dapat menjadi vulgar tergantung konteks penggunaan',
|
|
1608
|
+
},
|
|
1609
|
+
{
|
|
1610
|
+
word: 'itil',
|
|
1611
|
+
category: 'sexual',
|
|
1612
|
+
region: 'general',
|
|
1613
|
+
severity: 0.9,
|
|
1614
|
+
aliases: ['itl', 'itul'],
|
|
1615
|
+
description: 'Kata vulgar yang mengacu pada bagian dari alat kelamin perempuan',
|
|
1616
|
+
context: 'Kata vulgar yang merujuk pada anatomi seksual',
|
|
1617
|
+
},
|
|
1618
|
+
{
|
|
1619
|
+
word: 'kondom',
|
|
1620
|
+
category: 'sexual',
|
|
1621
|
+
region: 'general',
|
|
1622
|
+
severity: 0.5,
|
|
1623
|
+
aliases: ['kndm', 'kondom', 'cd'],
|
|
1624
|
+
description: 'Alat kontrasepsi',
|
|
1625
|
+
context: 'Dapat menjadi vulgar tergantung konteks penggunaan',
|
|
1626
|
+
},
|
|
1627
|
+
{
|
|
1628
|
+
word: 'ngewe',
|
|
1629
|
+
category: 'sexual',
|
|
1630
|
+
region: 'general',
|
|
1631
|
+
severity: 0.9,
|
|
1632
|
+
aliases: ['ngew', 'we'],
|
|
1633
|
+
description: 'Istilah kasar untuk aktivitas seksual',
|
|
1634
|
+
context: 'Kata vulgar yang merujuk pada aktivitas seksual',
|
|
1635
|
+
},
|
|
1636
|
+
{
|
|
1637
|
+
word: 'puki',
|
|
1638
|
+
category: 'sexual',
|
|
1639
|
+
region: 'general',
|
|
1640
|
+
severity: 0.9,
|
|
1641
|
+
aliases: ['puk', 'pukih'],
|
|
1642
|
+
description: 'Kata vulgar yang mengacu pada alat kelamin perempuan',
|
|
1643
|
+
context: 'Kata vulgar yang merujuk pada anatomi seksual',
|
|
1644
|
+
},
|
|
1645
|
+
{
|
|
1646
|
+
word: 'xxx',
|
|
1647
|
+
category: 'sexual',
|
|
1648
|
+
region: 'general',
|
|
1649
|
+
severity: 0.6,
|
|
1650
|
+
aliases: ['xXx', 'triplex'],
|
|
1651
|
+
description: 'Simbol yang sering digunakan untuk menandai konten pornografi',
|
|
1652
|
+
context: 'Digunakan untuk menandai konten seksual eksplisit',
|
|
1653
|
+
},
|
|
1654
|
+
];
|
|
1655
|
+
sexual.map((item) => item.word);
|
|
1656
|
+
|
|
1657
|
+
const insult = [
|
|
1658
|
+
...general.filter((word) => word.category === 'insult'),
|
|
1659
|
+
...jawa.filter((word) => word.category === 'insult'),
|
|
1660
|
+
...sunda.filter((word) => word.category === 'insult'),
|
|
1661
|
+
...betawi.filter((word) => word.category === 'insult'),
|
|
1662
|
+
...minang.filter((word) => word.category === 'insult'),
|
|
1663
|
+
...madura.filter((word) => word.category === 'insult'),
|
|
1664
|
+
...sunda.filter((word) => word.category === 'insult'),
|
|
1665
|
+
...aceh.filter((word) => word.category === 'insult'),
|
|
1666
|
+
...bali.filter((word) => word.category === 'insult'),
|
|
1667
|
+
...batak.filter((word) => word.category === 'insult'),
|
|
1668
|
+
{
|
|
1669
|
+
word: 'idiot',
|
|
1670
|
+
category: 'insult',
|
|
1671
|
+
region: 'general',
|
|
1672
|
+
severity: 0.6,
|
|
1673
|
+
aliases: ['idi0t', 'idot'],
|
|
1674
|
+
description: 'Kata yang mengacu pada kebodohan seseorang',
|
|
1675
|
+
context: 'Hinaan untuk menyebut orang yang dianggap sangat tidak pintar',
|
|
1676
|
+
},
|
|
1677
|
+
{
|
|
1678
|
+
word: 'dungu',
|
|
1679
|
+
category: 'insult',
|
|
1680
|
+
region: 'general',
|
|
1681
|
+
severity: 0.5,
|
|
1682
|
+
aliases: ['dngu', 'dongu'],
|
|
1683
|
+
description: 'Kata yang mengacu pada kebodohan seseorang',
|
|
1684
|
+
context: 'Hinaan untuk menyebut orang yang dianggap tidak pintar',
|
|
1685
|
+
},
|
|
1686
|
+
{
|
|
1687
|
+
word: 'sinting',
|
|
1688
|
+
category: 'insult',
|
|
1689
|
+
region: 'general',
|
|
1690
|
+
severity: 0.6,
|
|
1691
|
+
aliases: ['sintng', 'senteng'],
|
|
1692
|
+
description: 'Kata yang mengacu pada kegilaan atau ketidakwarasan seseorang',
|
|
1693
|
+
context: 'Hinaan untuk menyebut orang yang dianggap gila atau tidak waras',
|
|
1694
|
+
},
|
|
1695
|
+
{
|
|
1696
|
+
word: 'sarap',
|
|
1697
|
+
category: 'insult',
|
|
1698
|
+
region: 'general',
|
|
1699
|
+
severity: 0.6,
|
|
1700
|
+
aliases: ['saraf', 'srap'],
|
|
1701
|
+
description: 'Kata yang mengacu pada kegilaan atau ketidakwarasan seseorang',
|
|
1702
|
+
context: 'Hinaan untuk menyebut orang yang dianggap gila atau tidak waras',
|
|
1703
|
+
},
|
|
1704
|
+
{
|
|
1705
|
+
word: 'geblek',
|
|
1706
|
+
category: 'insult',
|
|
1707
|
+
region: 'general',
|
|
1708
|
+
severity: 0.5,
|
|
1709
|
+
aliases: ['gblk', 'geblk'],
|
|
1710
|
+
description: 'Kata yang mengacu pada kebodohan seseorang',
|
|
1711
|
+
context: 'Hinaan untuk menyebut orang yang dianggap tidak pintar',
|
|
1712
|
+
},
|
|
1713
|
+
{
|
|
1714
|
+
word: 'kampungan',
|
|
1715
|
+
category: 'insult',
|
|
1716
|
+
region: 'general',
|
|
1717
|
+
severity: 0.5,
|
|
1718
|
+
aliases: ['kmpngn', 'kamphungan'],
|
|
1719
|
+
description: 'Kata yang mengacu pada ketidaksopanan atau kenaifan seseorang',
|
|
1720
|
+
context: 'Hinaan untuk menyebut orang yang dianggap tidak modern atau primitif',
|
|
1721
|
+
},
|
|
1722
|
+
{
|
|
1723
|
+
word: 'udik',
|
|
1724
|
+
category: 'insult',
|
|
1725
|
+
region: 'general',
|
|
1726
|
+
severity: 0.5,
|
|
1727
|
+
aliases: ['udhik', 'udek'],
|
|
1728
|
+
description: 'Kata yang mengacu pada ketidaksopanan atau kenaifan seseorang',
|
|
1729
|
+
context: 'Hinaan untuk menyebut orang yang dianggap tidak modern atau primitif',
|
|
1730
|
+
},
|
|
1731
|
+
{
|
|
1732
|
+
word: 'dongo',
|
|
1733
|
+
category: 'insult',
|
|
1734
|
+
region: 'general',
|
|
1735
|
+
severity: 0.5,
|
|
1736
|
+
aliases: ['donggo', 'dungu'],
|
|
1737
|
+
description: 'Kata yang mengacu pada kebodohan seseorang',
|
|
1738
|
+
context: 'Hinaan untuk menyebut orang yang dianggap tidak pintar',
|
|
1739
|
+
},
|
|
1740
|
+
{
|
|
1741
|
+
word: 'tolol',
|
|
1742
|
+
category: 'insult',
|
|
1743
|
+
region: 'general',
|
|
1744
|
+
severity: 0.6,
|
|
1745
|
+
aliases: ['tol0l', 'tollo', 'tlol'],
|
|
1746
|
+
description: 'Kata yang mengacu pada kebodohan seseorang',
|
|
1747
|
+
context: 'Hinaan untuk menyebut orang yang dianggap tidak pintar',
|
|
1748
|
+
},
|
|
1749
|
+
{
|
|
1750
|
+
word: 'brengsek',
|
|
1751
|
+
category: 'insult',
|
|
1752
|
+
region: 'general',
|
|
1753
|
+
severity: 0.7,
|
|
1754
|
+
aliases: ['brengskek', 'brengsik', 'brengzek'],
|
|
1755
|
+
description: 'Kata yang mengacu pada kelakuan buruk atau tidak bermoral',
|
|
1756
|
+
context: 'Hinaan untuk menyebut orang yang dianggap memiliki kelakuan buruk',
|
|
1757
|
+
},
|
|
1758
|
+
];
|
|
1759
|
+
insult.map((item) => item.word);
|
|
1760
|
+
|
|
1761
|
+
const profanity = [
|
|
1762
|
+
...general.filter((word) => word.category === 'profanity'),
|
|
1763
|
+
...jawa.filter((word) => word.category === 'profanity'),
|
|
1764
|
+
...sunda.filter((word) => word.category === 'profanity'),
|
|
1765
|
+
...betawi.filter((word) => word.category === 'profanity'),
|
|
1766
|
+
...minang.filter((word) => word.category === 'profanity'),
|
|
1767
|
+
...madura.filter((word) => word.category === 'profanity'),
|
|
1768
|
+
...sunda.filter((word) => word.category === 'profanity'),
|
|
1769
|
+
...aceh.filter((word) => word.category === 'profanity'),
|
|
1770
|
+
...bali.filter((word) => word.category === 'profanity'),
|
|
1771
|
+
...batak.filter((word) => word.category === 'profanity'),
|
|
1772
|
+
{
|
|
1773
|
+
word: 'anjing',
|
|
1774
|
+
category: 'profanity',
|
|
1775
|
+
region: 'general',
|
|
1776
|
+
severity: 0.9,
|
|
1777
|
+
aliases: ['anjir', 'anying', 'njing', 'njir'],
|
|
1778
|
+
description: 'Kata umpatan yang mengacu pada hewan anjing',
|
|
1779
|
+
context: 'Digunakan sebagai ekspresi kemarahan atau frustasi',
|
|
1780
|
+
},
|
|
1781
|
+
{
|
|
1782
|
+
word: 'babi',
|
|
1783
|
+
category: 'profanity',
|
|
1784
|
+
region: 'general',
|
|
1785
|
+
severity: 0.8,
|
|
1786
|
+
aliases: ['babik', 'khinzir'],
|
|
1787
|
+
description: 'Kata umpatan yang mengacu pada hewan babi',
|
|
1788
|
+
context: 'Digunakan untuk mengekspresikan kemarahan atau menghina seseorang',
|
|
1789
|
+
},
|
|
1790
|
+
{
|
|
1791
|
+
word: 'bangsat',
|
|
1792
|
+
category: 'profanity',
|
|
1793
|
+
region: 'general',
|
|
1794
|
+
severity: 0.8,
|
|
1795
|
+
aliases: ['bgst', 'bangst'],
|
|
1796
|
+
description: 'Kata umpatan kasar yang berarti kutu atau parasit',
|
|
1797
|
+
context: 'Digunakan untuk menunjukkan kemarahan atau menghina seseorang',
|
|
1798
|
+
},
|
|
1799
|
+
{
|
|
1800
|
+
word: 'kampret',
|
|
1801
|
+
category: 'profanity',
|
|
1802
|
+
region: 'general',
|
|
1803
|
+
severity: 0.7,
|
|
1804
|
+
aliases: ['kampret lu', 'kampretot'],
|
|
1805
|
+
description: 'Kata umpatan yang mengacu pada jenis kelelawar kecil',
|
|
1806
|
+
context: 'Digunakan untuk mengungkapkan kekesalan atau menghina seseorang',
|
|
1807
|
+
},
|
|
1808
|
+
{
|
|
1809
|
+
word: 'sialan',
|
|
1810
|
+
category: 'profanity',
|
|
1811
|
+
region: 'general',
|
|
1812
|
+
severity: 0.6,
|
|
1813
|
+
aliases: ['sial', 'siaal'],
|
|
1814
|
+
description: 'Kata umpatan yang menunjukkan nasib buruk',
|
|
1815
|
+
context: 'Digunakan untuk mengekspresikan kekesalan atau kemarahan',
|
|
1816
|
+
},
|
|
1817
|
+
{
|
|
1818
|
+
word: 'monyet',
|
|
1819
|
+
category: 'profanity',
|
|
1820
|
+
region: 'general',
|
|
1821
|
+
severity: 0.7,
|
|
1822
|
+
aliases: ['monyong', 'munyuk'],
|
|
1823
|
+
description: 'Kata umpatan yang mengacu pada hewan primata',
|
|
1824
|
+
context: 'Digunakan untuk menghina atau mengekspresikan kemarahan',
|
|
1825
|
+
},
|
|
1826
|
+
{
|
|
1827
|
+
word: 'bajingan',
|
|
1828
|
+
category: 'profanity',
|
|
1829
|
+
region: 'general',
|
|
1830
|
+
severity: 0.8,
|
|
1831
|
+
aliases: ['bajinga', 'bjngn'],
|
|
1832
|
+
description: 'Kata umpatan yang berarti penjahat atau orang jahat',
|
|
1833
|
+
context: 'Digunakan untuk mengumpat seseorang yang dianggap buruk perilakunya',
|
|
1834
|
+
},
|
|
1835
|
+
{
|
|
1836
|
+
word: 'jancok',
|
|
1837
|
+
category: 'profanity',
|
|
1838
|
+
region: 'jawa',
|
|
1839
|
+
severity: 0.9,
|
|
1840
|
+
aliases: ['jancuk', 'jancik', 'dancok'],
|
|
1841
|
+
description: 'Kata umpatan kasar dalam bahasa Jawa',
|
|
1842
|
+
context: 'Umpatan sangat kasar dalam budaya Jawa, menunjukkan kemarahan yang tinggi',
|
|
1843
|
+
},
|
|
1844
|
+
{
|
|
1845
|
+
word: 'cuk',
|
|
1846
|
+
category: 'profanity',
|
|
1847
|
+
region: 'jawa',
|
|
1848
|
+
severity: 0.8,
|
|
1849
|
+
aliases: ['cok', 'cug'],
|
|
1850
|
+
description: 'Bentuk singkat dari jancok',
|
|
1851
|
+
context: 'Versi pendek dari umpatan jancok, digunakan dalam percakapan sehari-hari',
|
|
1852
|
+
},
|
|
1853
|
+
{
|
|
1854
|
+
word: 'asu',
|
|
1855
|
+
category: 'profanity',
|
|
1856
|
+
region: 'jawa',
|
|
1857
|
+
severity: 0.8,
|
|
1858
|
+
aliases: ['asyu', 'su'],
|
|
1859
|
+
description: 'Kata Jawa untuk anjing, digunakan sebagai umpatan',
|
|
1860
|
+
context: 'Ekspresi umpatan yang umum di masyarakat Jawa',
|
|
1861
|
+
},
|
|
1862
|
+
{
|
|
1863
|
+
word: 'sia',
|
|
1864
|
+
category: 'profanity',
|
|
1865
|
+
region: 'sunda',
|
|
1866
|
+
severity: 0.6,
|
|
1867
|
+
aliases: ['siah', 'siaa'],
|
|
1868
|
+
description: 'Kata ganti orang kedua dalam bahasa Sunda yang kasar',
|
|
1869
|
+
context: 'Menunjukkan ketidakhormatan pada lawan bicara dalam konteks Sunda',
|
|
1870
|
+
},
|
|
1871
|
+
{
|
|
1872
|
+
word: 'lu',
|
|
1873
|
+
category: 'profanity',
|
|
1874
|
+
region: 'betawi',
|
|
1875
|
+
severity: 0.4,
|
|
1876
|
+
aliases: ['elu', 'lo'],
|
|
1877
|
+
description: 'Kata ganti orang kedua dalam dialek Betawi',
|
|
1878
|
+
context: 'Dapat dianggap kasar dalam konteks formal atau saat berbicara dengan orang yang lebih tua',
|
|
1879
|
+
},
|
|
1880
|
+
{
|
|
1881
|
+
word: 'goblok',
|
|
1882
|
+
category: 'profanity',
|
|
1883
|
+
region: 'general',
|
|
1884
|
+
severity: 0.7,
|
|
1885
|
+
aliases: ['goblog', 'goblokk', 'bego', 'bodoh'],
|
|
1886
|
+
description: 'Kata umpatan yang menunjukkan kebodohan',
|
|
1887
|
+
context: 'Digunakan untuk menghina kecerdasan seseorang',
|
|
1888
|
+
},
|
|
1889
|
+
];
|
|
1890
|
+
profanity.map((item) => item.word);
|
|
1891
|
+
|
|
1892
|
+
const slur = [
|
|
1893
|
+
...general.filter((word) => word.category === 'slur'),
|
|
1894
|
+
...jawa.filter((word) => word.category === 'slur'),
|
|
1895
|
+
...sunda.filter((word) => word.category === 'slur'),
|
|
1896
|
+
...betawi.filter((word) => word.category === 'slur'),
|
|
1897
|
+
...minang.filter((word) => word.category === 'slur'),
|
|
1898
|
+
...madura.filter((word) => word.category === 'slur'),
|
|
1899
|
+
...sunda.filter((word) => word.category === 'slur'),
|
|
1900
|
+
...aceh.filter((word) => word.category === 'slur'),
|
|
1901
|
+
...bali.filter((word) => word.category === 'slur'),
|
|
1902
|
+
...batak.filter((word) => word.category === 'slur'),
|
|
1903
|
+
{
|
|
1904
|
+
word: 'cina',
|
|
1905
|
+
category: 'slur',
|
|
1906
|
+
region: 'general',
|
|
1907
|
+
severity: 0.7,
|
|
1908
|
+
aliases: ['cino', 'china'],
|
|
1909
|
+
description: 'Sebutan yang dianggap merendahkan untuk orang keturunan Tionghoa',
|
|
1910
|
+
context: 'Dianggap tidak sopan dan sebaiknya diganti dengan "Tionghoa"',
|
|
1911
|
+
},
|
|
1912
|
+
{
|
|
1913
|
+
word: 'banci',
|
|
1914
|
+
category: 'slur',
|
|
1915
|
+
region: 'general',
|
|
1916
|
+
severity: 0.7,
|
|
1917
|
+
aliases: ['bencong', 'waria', 'bences'],
|
|
1918
|
+
description: 'Istilah merendahkan untuk transgender atau pria yang dianggap feminin',
|
|
1919
|
+
context: 'Digunakan sebagai hinaan terhadap identitas gender atau ekspresi gender seseorang',
|
|
1920
|
+
},
|
|
1921
|
+
{
|
|
1922
|
+
word: 'autis',
|
|
1923
|
+
category: 'slur',
|
|
1924
|
+
region: 'general',
|
|
1925
|
+
severity: 0.6,
|
|
1926
|
+
aliases: ['autis lu', 'autisan'],
|
|
1927
|
+
description: 'Penyalahgunaan kondisi medis sebagai hinaan',
|
|
1928
|
+
context: 'Menggunakan kondisi spektrum autisme sebagai hinaan untuk seseorang yang dianggap aneh',
|
|
1929
|
+
},
|
|
1930
|
+
{
|
|
1931
|
+
word: 'londo',
|
|
1932
|
+
category: 'slur',
|
|
1933
|
+
region: 'jawa',
|
|
1934
|
+
severity: 0.5,
|
|
1935
|
+
aliases: ['landa', 'landi'],
|
|
1936
|
+
description: 'Sebutan untuk orang Belanda atau orang berkulit putih',
|
|
1937
|
+
context: 'Dapat bersifat merendahkan tergantung konteks dan nada bicara',
|
|
1938
|
+
},
|
|
1939
|
+
{
|
|
1940
|
+
word: 'keling',
|
|
1941
|
+
category: 'slur',
|
|
1942
|
+
region: 'general',
|
|
1943
|
+
severity: 0.8,
|
|
1944
|
+
aliases: ['kaling', 'hitam legam'],
|
|
1945
|
+
description: 'Istilah merendahkan untuk orang India atau berkulit gelap',
|
|
1946
|
+
context: 'Dianggap sangat tidak sopan dan bernada rasis',
|
|
1947
|
+
},
|
|
1948
|
+
{
|
|
1949
|
+
word: 'cacat',
|
|
1950
|
+
category: 'slur',
|
|
1951
|
+
region: 'general',
|
|
1952
|
+
severity: 0.7,
|
|
1953
|
+
aliases: ['cacad', 'difabel'],
|
|
1954
|
+
description: 'Istilah merendahkan untuk penyandang disabilitas',
|
|
1955
|
+
context: 'Digunakan sebagai hinaan untuk menunjukkan ketidaksempurnaan',
|
|
1956
|
+
},
|
|
1957
|
+
{
|
|
1958
|
+
word: 'gembel',
|
|
1959
|
+
category: 'slur',
|
|
1960
|
+
region: 'general',
|
|
1961
|
+
severity: 0.6,
|
|
1962
|
+
aliases: ['gembul', 'gelandangan'],
|
|
1963
|
+
description: 'Istilah merendahkan untuk orang tidak mampu atau tunawisma',
|
|
1964
|
+
context: 'Mengandung stigma terhadap kemiskinan dan kelas sosial',
|
|
1965
|
+
},
|
|
1966
|
+
{
|
|
1967
|
+
word: 'kampungan',
|
|
1968
|
+
category: 'slur',
|
|
1969
|
+
region: 'general',
|
|
1970
|
+
severity: 0.5,
|
|
1971
|
+
aliases: ['ndeso', 'katrok', 'udik'],
|
|
1972
|
+
description: 'Istilah merendahkan untuk orang dari daerah pedesaan',
|
|
1973
|
+
context: 'Menyiratkan seseorang tidak beradab, tidak berpendidikan, atau ketinggalan zaman',
|
|
1974
|
+
},
|
|
1975
|
+
{
|
|
1976
|
+
word: 'tolol',
|
|
1977
|
+
category: 'slur',
|
|
1978
|
+
region: 'general',
|
|
1979
|
+
severity: 0.6,
|
|
1980
|
+
aliases: ['tololnya', 'tolo'],
|
|
1981
|
+
description: 'Hinaan terhadap kecerdasan seseorang',
|
|
1982
|
+
context: 'Digunakan untuk menghina kapasitas mental seseorang',
|
|
1983
|
+
},
|
|
1984
|
+
];
|
|
1985
|
+
slur.map((item) => item.word);
|
|
1986
|
+
|
|
1987
|
+
const drugs = [
|
|
1988
|
+
...general.filter((word) => word.category === 'drugs'),
|
|
1989
|
+
...jawa.filter((word) => word.category === 'drugs'),
|
|
1990
|
+
...sunda.filter((word) => word.category === 'drugs'),
|
|
1991
|
+
...betawi.filter((word) => word.category === 'drugs'),
|
|
1992
|
+
...minang.filter((word) => word.category === 'drugs'),
|
|
1993
|
+
...madura.filter((word) => word.category === 'drugs'),
|
|
1994
|
+
...sunda.filter((word) => word.category === 'drugs'),
|
|
1995
|
+
...aceh.filter((word) => word.category === 'drugs'),
|
|
1996
|
+
...bali.filter((word) => word.category === 'drugs'),
|
|
1997
|
+
...batak.filter((word) => word.category === 'drugs'),
|
|
1998
|
+
{
|
|
1999
|
+
word: 'ganja',
|
|
2000
|
+
category: 'drugs',
|
|
2001
|
+
region: 'general',
|
|
2002
|
+
severity: 0.6,
|
|
2003
|
+
aliases: ['cimeng', 'kanabis', 'marijuana'],
|
|
2004
|
+
description: 'Tanaman yang mengandung zat psikoaktif',
|
|
2005
|
+
context: 'Digunakan untuk merujuk pada narkotika jenis cannabis',
|
|
2006
|
+
},
|
|
2007
|
+
{
|
|
2008
|
+
word: 'sabu',
|
|
2009
|
+
category: 'drugs',
|
|
2010
|
+
region: 'general',
|
|
2011
|
+
severity: 0.8,
|
|
2012
|
+
aliases: ['crystal', 'meth', 'ss'],
|
|
2013
|
+
description: 'Narkotika jenis metamfetamin',
|
|
2014
|
+
context: 'Istilah untuk metamfetamin yang merupakan narkotika berbahaya',
|
|
2015
|
+
},
|
|
2016
|
+
{
|
|
2017
|
+
word: 'inex',
|
|
2018
|
+
category: 'drugs',
|
|
2019
|
+
region: 'general',
|
|
2020
|
+
severity: 0.7,
|
|
2021
|
+
aliases: ['ekstasi', 'pil'],
|
|
2022
|
+
description: 'Obat terlarang yang mengandung MDMA',
|
|
2023
|
+
context: 'Nama slang untuk obat terlarang ecstasy',
|
|
2024
|
+
},
|
|
2025
|
+
{
|
|
2026
|
+
word: 'sakaw',
|
|
2027
|
+
category: 'drugs',
|
|
2028
|
+
region: 'general',
|
|
2029
|
+
severity: 0.5,
|
|
2030
|
+
aliases: ['ketagihan', 'menarik'],
|
|
2031
|
+
description: 'Gejala putus obat pada pecandu',
|
|
2032
|
+
context: 'Menggambarkan kondisi pecandu yang sedang mengalami gejala putus obat',
|
|
2033
|
+
},
|
|
2034
|
+
{
|
|
2035
|
+
word: 'ngepil',
|
|
2036
|
+
category: 'drugs',
|
|
2037
|
+
region: 'jawa',
|
|
2038
|
+
severity: 0.3,
|
|
2039
|
+
aliases: ['minum pil', 'telan pil'],
|
|
2040
|
+
description: 'Mengkonsumsi obat-obatan terlarang dalam bentuk pil',
|
|
2041
|
+
context: 'Istilah dalam bahasa gaul untuk mengkonsumsi obat terlarang jenis tablet',
|
|
2042
|
+
},
|
|
2043
|
+
{
|
|
2044
|
+
word: 'nyimeng',
|
|
2045
|
+
category: 'drugs',
|
|
2046
|
+
region: 'sunda',
|
|
2047
|
+
severity: 0.6,
|
|
2048
|
+
aliases: ['nyimang', 'isap ganja'],
|
|
2049
|
+
description: 'Mengisap ganja atau marijuana',
|
|
2050
|
+
context: 'Istilah sunda untuk aktivitas mengkonsumsi ganja',
|
|
2051
|
+
},
|
|
2052
|
+
];
|
|
2053
|
+
drugs.map((item) => item.word);
|
|
2054
|
+
|
|
2055
|
+
const disgusting = [
|
|
2056
|
+
...general.filter((word) => word.category === 'disgusting'),
|
|
2057
|
+
...jawa.filter((word) => word.category === 'disgusting'),
|
|
2058
|
+
...sunda.filter((word) => word.category === 'disgusting'),
|
|
2059
|
+
...betawi.filter((word) => word.category === 'disgusting'),
|
|
2060
|
+
...minang.filter((word) => word.category === 'disgusting'),
|
|
2061
|
+
...madura.filter((word) => word.category === 'disgusting'),
|
|
2062
|
+
...sunda.filter((word) => word.category === 'disgusting'),
|
|
2063
|
+
...aceh.filter((word) => word.category === 'disgusting'),
|
|
2064
|
+
...bali.filter((word) => word.category === 'disgusting'),
|
|
2065
|
+
...batak.filter((word) => word.category === 'disgusting'),
|
|
2066
|
+
{
|
|
2067
|
+
word: 'muntah',
|
|
2068
|
+
category: 'disgusting',
|
|
2069
|
+
region: 'general',
|
|
2070
|
+
severity: 0.4,
|
|
2071
|
+
aliases: ['muntaber', 'memuntahkan'],
|
|
2072
|
+
description: 'Muntahan atau tindakan muntah',
|
|
2073
|
+
context: 'Digunakan untuk mengekspresikan rasa jijik atau menggambarkan tindakan tersebut',
|
|
2074
|
+
},
|
|
2075
|
+
{
|
|
2076
|
+
word: 'ingus',
|
|
2077
|
+
category: 'disgusting',
|
|
2078
|
+
region: 'general',
|
|
2079
|
+
severity: 0.4,
|
|
2080
|
+
aliases: ['ingusan', 'beringus'],
|
|
2081
|
+
description: 'Lendir hidung',
|
|
2082
|
+
context: 'Digunakan untuk menggambarkan lendir hidung atau sebagai hinaan',
|
|
2083
|
+
},
|
|
2084
|
+
{
|
|
2085
|
+
word: 'tai',
|
|
2086
|
+
category: 'disgusting',
|
|
2087
|
+
region: 'general',
|
|
2088
|
+
severity: 0.8,
|
|
2089
|
+
aliases: ['tahi', 'kotoran'],
|
|
2090
|
+
description: 'Kotoran manusia',
|
|
2091
|
+
context: 'Istilah vulgar untuk kotoran, sering digunakan sebagai hinaan',
|
|
2092
|
+
},
|
|
2093
|
+
{
|
|
2094
|
+
word: 'jembut',
|
|
2095
|
+
category: 'disgusting',
|
|
2096
|
+
region: 'general',
|
|
2097
|
+
severity: 1.0,
|
|
2098
|
+
aliases: ['jembud', 'rambut kemaluan'],
|
|
2099
|
+
description: 'Rambut kemaluan',
|
|
2100
|
+
context: 'Istilah vulgar untuk rambut kemaluan, dianggap sangat tidak pantas',
|
|
2101
|
+
},
|
|
2102
|
+
{
|
|
2103
|
+
word: 'pecret',
|
|
2104
|
+
category: 'disgusting',
|
|
2105
|
+
region: 'sunda',
|
|
2106
|
+
severity: 0.8,
|
|
2107
|
+
aliases: ['mencret', 'diare'],
|
|
2108
|
+
description: 'Diare dalam bahasa Sunda',
|
|
2109
|
+
context: 'Dianggap vulgar ketika disebutkan di depan umum',
|
|
2110
|
+
},
|
|
2111
|
+
{
|
|
2112
|
+
word: 'bacot',
|
|
2113
|
+
category: 'disgusting',
|
|
2114
|
+
region: 'betawi',
|
|
2115
|
+
severity: 0.8,
|
|
2116
|
+
aliases: ['cicing', 'berisik'],
|
|
2117
|
+
description: 'Mulut atau omongan berisik dalam konteks vulgar',
|
|
2118
|
+
context: 'Istilah kasar yang digunakan untuk menyuruh seseorang diam',
|
|
2119
|
+
},
|
|
2120
|
+
{
|
|
2121
|
+
word: 'lendir',
|
|
2122
|
+
category: 'disgusting',
|
|
2123
|
+
region: 'general',
|
|
2124
|
+
severity: 0.3,
|
|
2125
|
+
aliases: ['berlendir', 'cairan lengket'],
|
|
2126
|
+
description: 'Lendir atau cairan lengket',
|
|
2127
|
+
context: 'Dapat digunakan dalam konteks vulgar untuk menggambarkan cairan tubuh',
|
|
2128
|
+
},
|
|
2129
|
+
];
|
|
2130
|
+
disgusting.map((item) => item.word);
|
|
2131
|
+
|
|
2132
|
+
const blasphemy = [
|
|
2133
|
+
...general.filter((word) => word.category === 'blasphemy'),
|
|
2134
|
+
...jawa.filter((word) => word.category === 'blasphemy'),
|
|
2135
|
+
...sunda.filter((word) => word.category === 'blasphemy'),
|
|
2136
|
+
...betawi.filter((word) => word.category === 'blasphemy'),
|
|
2137
|
+
...minang.filter((word) => word.category === 'blasphemy'),
|
|
2138
|
+
...madura.filter((word) => word.category === 'blasphemy'),
|
|
2139
|
+
...sunda.filter((word) => word.category === 'blasphemy'),
|
|
2140
|
+
...aceh.filter((word) => word.category === 'blasphemy'),
|
|
2141
|
+
...bali.filter((word) => word.category === 'blasphemy'),
|
|
2142
|
+
...batak.filter((word) => word.category === 'blasphemy'),
|
|
2143
|
+
{
|
|
2144
|
+
word: 'kafir',
|
|
2145
|
+
category: 'blasphemy',
|
|
2146
|
+
region: 'general',
|
|
2147
|
+
severity: 0.6,
|
|
2148
|
+
aliases: ['kapir', 'kafur'],
|
|
2149
|
+
description: 'Istilah untuk orang yang tidak percaya pada Islam',
|
|
2150
|
+
context: 'Dapat bersifat merendahkan ketika digunakan terhadap non-Muslim',
|
|
2151
|
+
},
|
|
2152
|
+
];
|
|
2153
|
+
blasphemy.map((item) => item.word);
|
|
2154
|
+
|
|
1408
2155
|
const wordObjects = [
|
|
1409
2156
|
...general,
|
|
1410
2157
|
...jawa,
|
|
1411
2158
|
...sunda,
|
|
1412
2159
|
...betawi,
|
|
1413
2160
|
...batak,
|
|
1414
|
-
|
|
1415
|
-
|
|
1416
|
-
|
|
2161
|
+
...minang,
|
|
2162
|
+
...bali,
|
|
2163
|
+
...madura,
|
|
1417
2164
|
// ...bugis,
|
|
1418
|
-
|
|
2165
|
+
...aceh,
|
|
1419
2166
|
// ...ambon,
|
|
1420
2167
|
// ...papua,
|
|
1421
2168
|
// ...manado,
|
|
@@ -1441,7 +2188,7 @@ wordObjects
|
|
|
1441
2188
|
* @param keepFirstAndLast Apakah harus menyimpan huruf pertama dan terakhir
|
|
1442
2189
|
* @returns Kata yang telah disensor
|
|
1443
2190
|
*/
|
|
1444
|
-
function censorWord(word, replaceChar =
|
|
2191
|
+
function censorWord(word, replaceChar = '*', keepFirstAndLast = false) {
|
|
1445
2192
|
if (word.length <= 2) {
|
|
1446
2193
|
return replaceChar.repeat(word.length);
|
|
1447
2194
|
}
|
|
@@ -1459,9 +2206,9 @@ function censorWord(word, replaceChar = "*", keepFirstAndLast = false) {
|
|
|
1459
2206
|
function normalizeText(text) {
|
|
1460
2207
|
return text
|
|
1461
2208
|
.toLowerCase()
|
|
1462
|
-
.normalize(
|
|
1463
|
-
.replace(/[\u0300-\u036f]/g,
|
|
1464
|
-
.replace(/[^\w\s]/g,
|
|
2209
|
+
.normalize('NFD') // Normalisasi Unicode
|
|
2210
|
+
.replace(/[\u0300-\u036f]/g, '') // Hapus diacritic marks
|
|
2211
|
+
.replace(/[^\w\s]/g, '') // Hapus karakter non-alphanumeric
|
|
1465
2212
|
.trim(); // Hapus whitespace di awal dan akhir
|
|
1466
2213
|
}
|
|
1467
2214
|
/**
|
|
@@ -1478,7 +2225,7 @@ function containsAnyWord(text, wordList, checkSubstring = false) {
|
|
|
1478
2225
|
const normalizedWord = normalizeText(word);
|
|
1479
2226
|
return checkSubstring
|
|
1480
2227
|
? normalizedText.includes(normalizedWord)
|
|
1481
|
-
: new RegExp(`\\b${escapeRegExp(normalizedWord)}\\b`,
|
|
2228
|
+
: new RegExp(`\\b${escapeRegExp(normalizedWord)}\\b`, 'i').test(normalizedText);
|
|
1482
2229
|
});
|
|
1483
2230
|
}
|
|
1484
2231
|
/**
|
|
@@ -1495,7 +2242,7 @@ function containsEuphemism(text, wordList) {
|
|
|
1495
2242
|
return false;
|
|
1496
2243
|
const firstChar = word[0];
|
|
1497
2244
|
const lastChar = word[word.length - 1];
|
|
1498
|
-
const pattern = new RegExp(`\\b${escapeRegExp(firstChar)}[*@#\\-_.!?\\s]{${word.length - 2}}${escapeRegExp(lastChar)}\\b`,
|
|
2245
|
+
const pattern = new RegExp(`\\b${escapeRegExp(firstChar)}[*@#\\-_.!?\\s]{${word.length - 2}}${escapeRegExp(lastChar)}\\b`, 'i');
|
|
1499
2246
|
return pattern.test(text);
|
|
1500
2247
|
});
|
|
1501
2248
|
}
|
|
@@ -1508,11 +2255,11 @@ function containsEuphemism(text, wordList) {
|
|
|
1508
2255
|
* @returns Boolean apakah teks mengandung upaya menghindari filter
|
|
1509
2256
|
*/
|
|
1510
2257
|
function detectSplitWords(text, wordList) {
|
|
1511
|
-
const compressedText = text.replace(/[\s\-_.!?*]/g,
|
|
2258
|
+
const compressedText = text.replace(/[\s\-_.!?*]/g, '').toLowerCase();
|
|
1512
2259
|
return wordList.some((word) => compressedText.includes(normalizeText(word)));
|
|
1513
2260
|
}
|
|
1514
2261
|
function escapeRegExp(string) {
|
|
1515
|
-
return string.replace(/[.*+?^${}()|[\]\\]/g,
|
|
2262
|
+
return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
1516
2263
|
}
|
|
1517
2264
|
/**
|
|
1518
2265
|
* Mengganti sebagian kata dengan masking
|
|
@@ -1524,9 +2271,9 @@ function escapeRegExp(string) {
|
|
|
1524
2271
|
* @param maskChar Karakter masking
|
|
1525
2272
|
* @returns Teks yang telah dimasking
|
|
1526
2273
|
*/
|
|
1527
|
-
function maskText(text, visibleStart = 1, visibleEnd = 1, maskChar =
|
|
2274
|
+
function maskText(text, visibleStart = 1, visibleEnd = 1, maskChar = '*') {
|
|
1528
2275
|
if (!text)
|
|
1529
|
-
return
|
|
2276
|
+
return '';
|
|
1530
2277
|
if (text.length <= visibleStart + visibleEnd)
|
|
1531
2278
|
return text;
|
|
1532
2279
|
const start = text.substring(0, visibleStart);
|
|
@@ -1543,25 +2290,25 @@ function maskText(text, visibleStart = 1, visibleEnd = 1, maskChar = "*") {
|
|
|
1543
2290
|
*/
|
|
1544
2291
|
function toLeetSpeak(text) {
|
|
1545
2292
|
const leetMap = {
|
|
1546
|
-
a: [
|
|
1547
|
-
b: [
|
|
1548
|
-
c: [
|
|
1549
|
-
e: [
|
|
1550
|
-
g: [
|
|
1551
|
-
i: [
|
|
1552
|
-
l: [
|
|
1553
|
-
o: [
|
|
1554
|
-
s: [
|
|
1555
|
-
t: [
|
|
1556
|
-
z: [
|
|
2293
|
+
a: ['4', '@'],
|
|
2294
|
+
b: ['8', '6'],
|
|
2295
|
+
c: ['<', '(', '{'],
|
|
2296
|
+
e: ['3'],
|
|
2297
|
+
g: ['9'],
|
|
2298
|
+
i: ['1', '!'],
|
|
2299
|
+
l: ['1', '|'],
|
|
2300
|
+
o: ['0'],
|
|
2301
|
+
s: ['5', '$'],
|
|
2302
|
+
t: ['7', '+'],
|
|
2303
|
+
z: ['2'],
|
|
1557
2304
|
};
|
|
1558
2305
|
return text
|
|
1559
|
-
.split(
|
|
2306
|
+
.split('')
|
|
1560
2307
|
.map((char) => {
|
|
1561
2308
|
const lowerChar = char.toLowerCase();
|
|
1562
2309
|
return leetMap[lowerChar] || char;
|
|
1563
2310
|
})
|
|
1564
|
-
.join(
|
|
2311
|
+
.join('');
|
|
1565
2312
|
}
|
|
1566
2313
|
/**
|
|
1567
2314
|
* memisahkan teks menajdi kelimat
|
|
@@ -1571,9 +2318,7 @@ function toLeetSpeak(text) {
|
|
|
1571
2318
|
*/
|
|
1572
2319
|
function splitIntoSentences(text) {
|
|
1573
2320
|
// split berdasarkan titik, seru, taya yagn diikuti spasi atau akhir string
|
|
1574
|
-
return text
|
|
1575
|
-
.split(/(?<=[.!?])\s+|(?<=[.!?])$/)
|
|
1576
|
-
.filter((sentence) => sentence.trim().length > 0);
|
|
2321
|
+
return text.split(/(?<=[.!?])\s+|(?<=[.!?])$/).filter((sentence) => sentence.trim().length > 0);
|
|
1577
2322
|
}
|
|
1578
2323
|
/**
|
|
1579
2324
|
* mengambil kata-kata di sekitar indeks tertentu
|
|
@@ -1585,7 +2330,7 @@ function splitIntoSentences(text) {
|
|
|
1585
2330
|
*/
|
|
1586
2331
|
function getContextAroundIndex(text, index, windowSize = 5) {
|
|
1587
2332
|
if (!text || index < 0 || index >= text.length)
|
|
1588
|
-
return
|
|
2333
|
+
return '';
|
|
1589
2334
|
const words = text.split(/\s+/);
|
|
1590
2335
|
let currentPosition = 0;
|
|
1591
2336
|
let targetWordIndex = -1;
|
|
@@ -1599,11 +2344,11 @@ function getContextAroundIndex(text, index, windowSize = 5) {
|
|
|
1599
2344
|
currentPosition += wordLength + 1;
|
|
1600
2345
|
}
|
|
1601
2346
|
if (targetWordIndex === -1)
|
|
1602
|
-
return
|
|
2347
|
+
return '';
|
|
1603
2348
|
// Ambil kata-kata di sekitar
|
|
1604
2349
|
const startIndex = Math.max(0, targetWordIndex - windowSize);
|
|
1605
2350
|
const endIndex = Math.min(words.length, targetWordIndex + windowSize + 1);
|
|
1606
|
-
return words.slice(startIndex, endIndex).join(
|
|
2351
|
+
return words.slice(startIndex, endIndex).join(' ');
|
|
1607
2352
|
}
|
|
1608
2353
|
|
|
1609
2354
|
/**
|
|
@@ -1634,7 +2379,7 @@ function createWordRegex(word, options = {}) {
|
|
|
1634
2379
|
pattern = `\\b${pattern}\\b`;
|
|
1635
2380
|
}
|
|
1636
2381
|
// Buat regex dengan flag case-insensitive jika diminta
|
|
1637
|
-
return new RegExp(pattern, caseSensitive ?
|
|
2382
|
+
return new RegExp(pattern, caseSensitive ? 'g' : 'gi');
|
|
1638
2383
|
}
|
|
1639
2384
|
/**
|
|
1640
2385
|
* Menambahkan variasi leet speak ke pola regex
|
|
@@ -1648,29 +2393,29 @@ function createWordRegex(word, options = {}) {
|
|
|
1648
2393
|
*/
|
|
1649
2394
|
function addLeetSpeakVariations(pattern) {
|
|
1650
2395
|
const leetMap = {
|
|
1651
|
-
a: [
|
|
1652
|
-
b: [
|
|
1653
|
-
c: [
|
|
1654
|
-
e: [
|
|
1655
|
-
g: [
|
|
1656
|
-
i: [
|
|
1657
|
-
l: [
|
|
1658
|
-
o: [
|
|
1659
|
-
s: [
|
|
1660
|
-
t: [
|
|
1661
|
-
z: [
|
|
2396
|
+
a: ['a', '4', '@'],
|
|
2397
|
+
b: ['b', '8', '6'],
|
|
2398
|
+
c: ['c', '(', '{', '<'],
|
|
2399
|
+
e: ['e', '3'],
|
|
2400
|
+
g: ['g', '6', '9'],
|
|
2401
|
+
i: ['i', '1', '!', '|'],
|
|
2402
|
+
l: ['l', '1', '|'],
|
|
2403
|
+
o: ['o', '0'],
|
|
2404
|
+
s: ['s', '5', '$'],
|
|
2405
|
+
t: ['t', '7', '+'],
|
|
2406
|
+
z: ['z', '2'],
|
|
1662
2407
|
};
|
|
1663
2408
|
return pattern
|
|
1664
|
-
.split(
|
|
2409
|
+
.split('')
|
|
1665
2410
|
.map((char) => {
|
|
1666
2411
|
const lowerChar = char.toLowerCase();
|
|
1667
2412
|
const variations = leetMap[lowerChar];
|
|
1668
2413
|
if (variations && variations.length > 1) {
|
|
1669
|
-
return `[${variations.join(
|
|
2414
|
+
return `[${variations.join('')}]`;
|
|
1670
2415
|
}
|
|
1671
2416
|
return char;
|
|
1672
2417
|
})
|
|
1673
|
-
.join(
|
|
2418
|
+
.join('');
|
|
1674
2419
|
}
|
|
1675
2420
|
/**
|
|
1676
2421
|
* Menambahkan kemungkinan split/pemisahan antar karakter
|
|
@@ -1680,7 +2425,7 @@ function addLeetSpeakVariations(pattern) {
|
|
|
1680
2425
|
*/
|
|
1681
2426
|
function addSplitVariations(pattern) {
|
|
1682
2427
|
// Tambahkan kemungkinan spasi atau karakter penghubung di antara setiap huruf
|
|
1683
|
-
return pattern.split(
|
|
2428
|
+
return pattern.split('').join('[\\s\\-._*+]?');
|
|
1684
2429
|
}
|
|
1685
2430
|
/**
|
|
1686
2431
|
* Membuat regex untuk mencari kata dengan variasi spasi dan karakter penghubung
|
|
@@ -1692,7 +2437,7 @@ function addSplitVariations(pattern) {
|
|
|
1692
2437
|
function createEvasionRegex(word) {
|
|
1693
2438
|
// Tambahkan kemungkinan spasi atau karakter penghubung di antara setiap huruf
|
|
1694
2439
|
const pattern = addSplitVariations(escapeRegExp(word));
|
|
1695
|
-
return new RegExp(pattern,
|
|
2440
|
+
return new RegExp(pattern, 'gi');
|
|
1696
2441
|
}
|
|
1697
2442
|
/**
|
|
1698
2443
|
* Menambahkan variasi ejaan Bahasa Indonesia
|
|
@@ -1703,27 +2448,27 @@ function createEvasionRegex(word) {
|
|
|
1703
2448
|
function addIndonesianVariations(pattern) {
|
|
1704
2449
|
// Variasi ejaan dalam Bahasa Indonesia
|
|
1705
2450
|
const variationMap = {
|
|
1706
|
-
c: [
|
|
1707
|
-
k: [
|
|
1708
|
-
j: [
|
|
1709
|
-
y: [
|
|
1710
|
-
u: [
|
|
1711
|
-
f: [
|
|
1712
|
-
z: [
|
|
1713
|
-
x: [
|
|
2451
|
+
c: ['c', 'k'], // contoh: becok/bekok
|
|
2452
|
+
k: ['k', 'c', 'q'], // contoh: kacau/qacau
|
|
2453
|
+
j: ['j', 'dj'], // contoh: jualan/djualan (ejaan lama)
|
|
2454
|
+
y: ['y', 'j'], // contoh: ya/ja
|
|
2455
|
+
u: ['u', 'oe'], // contoh: untuk/oentoek (ejaan lama)
|
|
2456
|
+
f: ['f', 'p', 'v'], // contoh: kafir/kapir
|
|
2457
|
+
z: ['z', 'j', 's'], // contoh: zaman/jaman
|
|
2458
|
+
x: ['x', 'ks'], // contoh: taxi/taksi
|
|
1714
2459
|
};
|
|
1715
2460
|
// Ganti tiap karakter dengan variasinya
|
|
1716
2461
|
return pattern
|
|
1717
|
-
.split(
|
|
2462
|
+
.split('')
|
|
1718
2463
|
.map((char) => {
|
|
1719
2464
|
const lowerChar = char.toLowerCase();
|
|
1720
2465
|
const variations = variationMap[lowerChar];
|
|
1721
2466
|
if (variations && variations.length > 1) {
|
|
1722
|
-
return `[${variations.join(
|
|
2467
|
+
return `[${variations.join('')}]`;
|
|
1723
2468
|
}
|
|
1724
2469
|
return char;
|
|
1725
2470
|
})
|
|
1726
|
-
.join(
|
|
2471
|
+
.join('');
|
|
1727
2472
|
}
|
|
1728
2473
|
/**
|
|
1729
2474
|
* Membuat regex untuk mencocokkan kata dengan mempertimbangkan variasi ejaan Bahasa Indonesia
|
|
@@ -1733,7 +2478,7 @@ function addIndonesianVariations(pattern) {
|
|
|
1733
2478
|
*/
|
|
1734
2479
|
function createIndonesianVariationRegex(word) {
|
|
1735
2480
|
const pattern = addIndonesianVariations(escapeRegExp(word));
|
|
1736
|
-
return new RegExp(`\\b${pattern}\\b`,
|
|
2481
|
+
return new RegExp(`\\b${pattern}\\b`, 'gi');
|
|
1737
2482
|
}
|
|
1738
2483
|
/**
|
|
1739
2484
|
* Membuat regex untuk mencocokkan kata dengan konteks
|
|
@@ -1746,7 +2491,7 @@ function createContextRegex(word, contextSize = 3) {
|
|
|
1746
2491
|
const wordPattern = escapeRegExp(word);
|
|
1747
2492
|
// Membuat pola yang menangkap beberapa kata sebelum dan setelah kata target
|
|
1748
2493
|
const pattern = `((?:\\S+\\s+){0,${contextSize}})(\\b${wordPattern}\\b)((?:\\s+\\S+){0,${contextSize}})`;
|
|
1749
|
-
return new RegExp(pattern,
|
|
2494
|
+
return new RegExp(pattern, 'gi');
|
|
1750
2495
|
}
|
|
1751
2496
|
/**
|
|
1752
2497
|
* Membuat regex untuk mencocokkan variasi penulisan kata
|
|
@@ -1757,8 +2502,8 @@ function createContextRegex(word, contextSize = 3) {
|
|
|
1757
2502
|
function createWordFormRegex(word) {
|
|
1758
2503
|
// Implementasi sederhana untuk mencocokkan berbagai imbuhan
|
|
1759
2504
|
// Ini bisa dikembangkan lebih lanjut untuk mencocokkan bentukan kata yang lebih kompleks
|
|
1760
|
-
const prefixes = [
|
|
1761
|
-
const suffixes = [
|
|
2505
|
+
const prefixes = ['', 'me', 'pe', 'ber', 'di', 'ter', 'se'];
|
|
2506
|
+
const suffixes = ['', 'kan', 'an', 'i', 'nya'];
|
|
1762
2507
|
const patterns = [];
|
|
1763
2508
|
// Kombinasikan prefix dan suffix
|
|
1764
2509
|
for (const prefix of prefixes) {
|
|
@@ -1766,7 +2511,7 @@ function createWordFormRegex(word) {
|
|
|
1766
2511
|
patterns.push(`\\b${prefix}${escapeRegExp(word)}${suffix}\\b`);
|
|
1767
2512
|
}
|
|
1768
2513
|
}
|
|
1769
|
-
return new RegExp(patterns.join(
|
|
2514
|
+
return new RegExp(patterns.join('|'), 'gi');
|
|
1770
2515
|
}
|
|
1771
2516
|
|
|
1772
2517
|
/**
|
|
@@ -1800,7 +2545,8 @@ function levenshteinDistance(str1, str2) {
|
|
|
1800
2545
|
const cost = s1[i - 1] === s2[j - 1] ? 0 : 1;
|
|
1801
2546
|
matrix[i][j] = Math.min(matrix[i - 1][j] + 1, // deletion
|
|
1802
2547
|
matrix[i][j - 1] + 1, // insertion
|
|
1803
|
-
matrix[i - 1][j - 1] + cost
|
|
2548
|
+
matrix[i - 1][j - 1] + cost // substitution
|
|
2549
|
+
);
|
|
1804
2550
|
}
|
|
1805
2551
|
}
|
|
1806
2552
|
return matrix[len1][len2];
|
|
@@ -1979,8 +2725,7 @@ function findPossibleProfanityBySimiliarity(text, profanityWords, threshold = 0.
|
|
|
1979
2725
|
let bestMatch = null;
|
|
1980
2726
|
for (const profanity of lengthFilteredCandidates) {
|
|
1981
2727
|
const similarity = stringSimilarity(word, profanity);
|
|
1982
|
-
if (similarity >= threshold &&
|
|
1983
|
-
(!bestMatch || similarity > bestMatch.similarity)) {
|
|
2728
|
+
if (similarity >= threshold && (!bestMatch || similarity > bestMatch.similarity)) {
|
|
1984
2729
|
bestMatch = {
|
|
1985
2730
|
word,
|
|
1986
2731
|
original: profanity,
|
|
@@ -2029,8 +2774,7 @@ function findProfanityByLevenshteinDistance(text, profanityWords, threshold = 0.
|
|
|
2029
2774
|
const distance = levenshteinDistance(word, profanity);
|
|
2030
2775
|
if (distance <= maxDistance) {
|
|
2031
2776
|
const similarity = 1 - distance / Math.max(word.length, profanity.length);
|
|
2032
|
-
if (similarity >= threshold &&
|
|
2033
|
-
(!bestMatch || similarity > bestMatch.similarity)) {
|
|
2777
|
+
if (similarity >= threshold && (!bestMatch || similarity > bestMatch.similarity)) {
|
|
2034
2778
|
bestMatch = {
|
|
2035
2779
|
word,
|
|
2036
2780
|
original: profanity,
|
|
@@ -2076,7 +2820,7 @@ function isCharacterCountSimilar(str1, str2, maxDifference) {
|
|
|
2076
2820
|
}
|
|
2077
2821
|
|
|
2078
2822
|
const DEFAULT_OPTIONS = {
|
|
2079
|
-
replaceWith:
|
|
2823
|
+
replaceWith: '*',
|
|
2080
2824
|
fullWordCensor: true,
|
|
2081
2825
|
detectLeetSpeak: true,
|
|
2082
2826
|
checkSubstring: false,
|
|
@@ -2099,7 +2843,7 @@ const FILTER_PRESETS = {
|
|
|
2099
2843
|
light: {
|
|
2100
2844
|
...DEFAULT_OPTIONS,
|
|
2101
2845
|
severityThreshold: 0.7,
|
|
2102
|
-
categories: [
|
|
2846
|
+
categories: ['sexual', 'slur', 'blasphemy'],
|
|
2103
2847
|
},
|
|
2104
2848
|
childSafe: {
|
|
2105
2849
|
...DEFAULT_OPTIONS,
|
|
@@ -2112,49 +2856,49 @@ const FILTER_PRESETS = {
|
|
|
2112
2856
|
const CATEGORY_PRESETS = {
|
|
2113
2857
|
sexual: {
|
|
2114
2858
|
...DEFAULT_OPTIONS,
|
|
2115
|
-
categories: [
|
|
2859
|
+
categories: ['sexual'],
|
|
2116
2860
|
},
|
|
2117
2861
|
insults: {
|
|
2118
2862
|
...DEFAULT_OPTIONS,
|
|
2119
|
-
categories: [
|
|
2863
|
+
categories: ['insult'],
|
|
2120
2864
|
},
|
|
2121
2865
|
profanity: {
|
|
2122
2866
|
...DEFAULT_OPTIONS,
|
|
2123
|
-
categories: [
|
|
2867
|
+
categories: ['profanity'],
|
|
2124
2868
|
},
|
|
2125
2869
|
};
|
|
2126
2870
|
const REGION_PRESETS = {
|
|
2127
2871
|
general: {
|
|
2128
2872
|
...DEFAULT_OPTIONS,
|
|
2129
|
-
regions: [
|
|
2873
|
+
regions: ['general'],
|
|
2130
2874
|
},
|
|
2131
2875
|
jawa: {
|
|
2132
2876
|
...DEFAULT_OPTIONS,
|
|
2133
|
-
regions: [
|
|
2877
|
+
regions: ['jawa'],
|
|
2134
2878
|
},
|
|
2135
2879
|
sunda: {
|
|
2136
2880
|
...DEFAULT_OPTIONS,
|
|
2137
|
-
regions: [
|
|
2881
|
+
regions: ['sunda'],
|
|
2138
2882
|
},
|
|
2139
2883
|
betawi: {
|
|
2140
2884
|
...DEFAULT_OPTIONS,
|
|
2141
|
-
regions: [
|
|
2885
|
+
regions: ['betawi'],
|
|
2142
2886
|
},
|
|
2143
2887
|
batak: {
|
|
2144
2888
|
...DEFAULT_OPTIONS,
|
|
2145
|
-
regions: [
|
|
2889
|
+
regions: ['batak'],
|
|
2146
2890
|
},
|
|
2147
2891
|
};
|
|
2148
2892
|
const REPLACEMENT_CHARS = {
|
|
2149
|
-
asterisk:
|
|
2150
|
-
hash:
|
|
2151
|
-
dollar:
|
|
2152
|
-
at:
|
|
2153
|
-
percent:
|
|
2154
|
-
underscore:
|
|
2155
|
-
dash:
|
|
2156
|
-
dot:
|
|
2157
|
-
grawlix:
|
|
2893
|
+
asterisk: '*',
|
|
2894
|
+
hash: '#',
|
|
2895
|
+
dollar: '$',
|
|
2896
|
+
at: '@',
|
|
2897
|
+
percent: '%',
|
|
2898
|
+
underscore: '_',
|
|
2899
|
+
dash: '-',
|
|
2900
|
+
dot: '.',
|
|
2901
|
+
grawlix: '#@$%&!',
|
|
2158
2902
|
};
|
|
2159
2903
|
/**
|
|
2160
2904
|
* Membuat opsi custom dengan menggabungkan dengan default
|
|
@@ -2181,8 +2925,7 @@ function getPresetOptions(presetName, additionalOptions = {}) {
|
|
|
2181
2925
|
presetOptions = FILTER_PRESETS[presetName];
|
|
2182
2926
|
}
|
|
2183
2927
|
else if (presetName in CATEGORY_PRESETS) {
|
|
2184
|
-
presetOptions =
|
|
2185
|
-
CATEGORY_PRESETS[presetName];
|
|
2928
|
+
presetOptions = CATEGORY_PRESETS[presetName];
|
|
2186
2929
|
}
|
|
2187
2930
|
else if (presetName in REGION_PRESETS) {
|
|
2188
2931
|
presetOptions = REGION_PRESETS[presetName];
|
|
@@ -2201,7 +2944,7 @@ function getPresetOptions(presetName, additionalOptions = {}) {
|
|
|
2201
2944
|
* @param type Tipe karakter pengganti
|
|
2202
2945
|
* @returns Karakter pengganti
|
|
2203
2946
|
*/
|
|
2204
|
-
function getReplacementChar(type =
|
|
2947
|
+
function getReplacementChar(type = 'asterisk') {
|
|
2205
2948
|
return REPLACEMENT_CHARS[type] || REPLACEMENT_CHARS.asterisk;
|
|
2206
2949
|
}
|
|
2207
2950
|
/**
|
|
@@ -2220,7 +2963,7 @@ function getRandomGrawlix() {
|
|
|
2220
2963
|
* @returns String pengganti
|
|
2221
2964
|
*/
|
|
2222
2965
|
function makeRandomGrawlixString(length) {
|
|
2223
|
-
let result =
|
|
2966
|
+
let result = '';
|
|
2224
2967
|
const grawlix = REPLACEMENT_CHARS.grawlix;
|
|
2225
2968
|
for (let i = 0; i < length; i++) {
|
|
2226
2969
|
result += grawlix[Math.floor(Math.random() * grawlix.length)];
|
|
@@ -2248,7 +2991,7 @@ class AhoCorasick {
|
|
|
2248
2991
|
*/
|
|
2249
2992
|
addPattern(pattern) {
|
|
2250
2993
|
if (this.built) {
|
|
2251
|
-
throw new Error(
|
|
2994
|
+
throw new Error('Cannot add patterns after the automaton is built');
|
|
2252
2995
|
}
|
|
2253
2996
|
let node = this.root;
|
|
2254
2997
|
const normalizedPattern = pattern.toLowerCase();
|
|
@@ -2385,9 +3128,7 @@ function findProfanity(text, options = {}) {
|
|
|
2385
3128
|
let baseWordsToCheck = wordList.length > 0 ? wordList : [];
|
|
2386
3129
|
if (baseWordsToCheck.length === 0) {
|
|
2387
3130
|
const filteredWords = wordObjects.filter((word) => {
|
|
2388
|
-
const matchCategory = categories
|
|
2389
|
-
? categories.includes(word.category)
|
|
2390
|
-
: true;
|
|
3131
|
+
const matchCategory = categories ? categories.includes(word.category) : true;
|
|
2391
3132
|
const matchRegion = regions ? regions.includes(word.region) : true;
|
|
2392
3133
|
const matchSeverity = word.severity >= severityThreshold;
|
|
2393
3134
|
return matchCategory && matchRegion && matchSeverity;
|
|
@@ -2397,9 +3138,7 @@ function findProfanity(text, options = {}) {
|
|
|
2397
3138
|
const aliasMap = new Map();
|
|
2398
3139
|
wordObjects.forEach((wordObj) => {
|
|
2399
3140
|
if (wordObj.aliases && wordObj.aliases.length > 0) {
|
|
2400
|
-
const matchCategory = categories
|
|
2401
|
-
? categories.includes(wordObj.category)
|
|
2402
|
-
: true;
|
|
3141
|
+
const matchCategory = categories ? categories.includes(wordObj.category) : true;
|
|
2403
3142
|
const matchRegion = regions ? regions.includes(wordObj.region) : true;
|
|
2404
3143
|
const matchSeverity = wordObj.severity >= severityThreshold;
|
|
2405
3144
|
if (matchCategory && matchRegion && matchSeverity) {
|
|
@@ -2409,10 +3148,7 @@ function findProfanity(text, options = {}) {
|
|
|
2409
3148
|
}
|
|
2410
3149
|
}
|
|
2411
3150
|
});
|
|
2412
|
-
const wordsToCheck = [
|
|
2413
|
-
...baseWordsToCheck,
|
|
2414
|
-
...Array.from(aliasMap.keys()),
|
|
2415
|
-
].filter((word) => !whitelist.includes(word.toLowerCase()));
|
|
3151
|
+
const wordsToCheck = [...baseWordsToCheck, ...Array.from(aliasMap.keys())].filter((word) => !whitelist.includes(word.toLowerCase()));
|
|
2416
3152
|
if (wordsToCheck.length === 0) {
|
|
2417
3153
|
return [];
|
|
2418
3154
|
}
|
|
@@ -2492,8 +3228,7 @@ function findProfanity(text, options = {}) {
|
|
|
2492
3228
|
if (useLevenshtein) {
|
|
2493
3229
|
const possibleProfanity = findProfanityByLevenshteinDistance(text, wordsToCheck, similarityThreshold, maxLevenshteinDistance);
|
|
2494
3230
|
possibleProfanity.forEach((item) => {
|
|
2495
|
-
const originalWord = aliasMap.get(item.original.toLowerCase()) ||
|
|
2496
|
-
item.original.toLowerCase();
|
|
3231
|
+
const originalWord = aliasMap.get(item.original.toLowerCase()) || item.original.toLowerCase();
|
|
2497
3232
|
matches.add(originalWord);
|
|
2498
3233
|
if (!actualMatches.has(originalWord)) {
|
|
2499
3234
|
actualMatches.set(originalWord, []);
|
|
@@ -2505,8 +3240,7 @@ function findProfanity(text, options = {}) {
|
|
|
2505
3240
|
const possibleProfanity = findPossibleProfanityBySimiliarity(text, wordsToCheck, similarityThreshold);
|
|
2506
3241
|
possibleProfanity.forEach((item) => {
|
|
2507
3242
|
matches.add(item.original.toLowerCase());
|
|
2508
|
-
const originalWord = aliasMap.get(item.original.toLowerCase()) ||
|
|
2509
|
-
item.original.toLowerCase();
|
|
3243
|
+
const originalWord = aliasMap.get(item.original.toLowerCase()) || item.original.toLowerCase();
|
|
2510
3244
|
if (!actualMatches.has(originalWord)) {
|
|
2511
3245
|
actualMatches.set(originalWord, []);
|
|
2512
3246
|
}
|
|
@@ -2532,8 +3266,7 @@ function findProfanityWithMetadata(text, options = {}) {
|
|
|
2532
3266
|
return matches
|
|
2533
3267
|
.map((word) => {
|
|
2534
3268
|
const wordObject = wordObjects.find((obj) => obj.word.toLowerCase() === word.toLowerCase() ||
|
|
2535
|
-
(obj.aliases &&
|
|
2536
|
-
obj.aliases.some((alias) => alias.toLowerCase() === word.toLowerCase())));
|
|
3269
|
+
(obj.aliases && obj.aliases.some((alias) => alias.toLowerCase() === word.toLowerCase())));
|
|
2537
3270
|
return wordObject;
|
|
2538
3271
|
})
|
|
2539
3272
|
.filter((word) => word !== undefined);
|
|
@@ -2604,7 +3337,7 @@ function calculateSeverity(matchDetails) {
|
|
|
2604
3337
|
* @returns FilterResult dengan hasil filter
|
|
2605
3338
|
*/
|
|
2606
3339
|
function filter(text, options = {}) {
|
|
2607
|
-
const { replaceWith =
|
|
3340
|
+
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 };
|
|
2608
3341
|
const matches = findProfanity(text, {
|
|
2609
3342
|
...options,
|
|
2610
3343
|
detectLeetSpeak,
|
|
@@ -2630,13 +3363,12 @@ function filter(text, options = {}) {
|
|
|
2630
3363
|
const replacements = [];
|
|
2631
3364
|
matches.forEach((word) => {
|
|
2632
3365
|
const metadata = matchDetails.find((m) => m.word.toLowerCase() === word.toLowerCase() ||
|
|
2633
|
-
(m.aliases &&
|
|
2634
|
-
m.aliases.some((alias) => alias.toLowerCase() === word.toLowerCase())));
|
|
3366
|
+
(m.aliases && m.aliases.some((alias) => alias.toLowerCase() === word.toLowerCase())));
|
|
2635
3367
|
const variants = actualMatches.get(word.toLowerCase()) || [];
|
|
2636
3368
|
variants.push(word);
|
|
2637
3369
|
const uniqueVariants = [...new Set(variants)];
|
|
2638
3370
|
uniqueVariants.forEach((variant) => {
|
|
2639
|
-
const regex = new RegExp(`\\b${escapeRegExp(variant)}\\b`,
|
|
3371
|
+
const regex = new RegExp(`\\b${escapeRegExp(variant)}\\b`, 'gi');
|
|
2640
3372
|
let match;
|
|
2641
3373
|
while ((match = regex.exec(filteredText)) !== null) {
|
|
2642
3374
|
const originalWord = match[0];
|
|
@@ -2654,7 +3386,7 @@ function filter(text, options = {}) {
|
|
|
2654
3386
|
censored: censoredWord,
|
|
2655
3387
|
metadata,
|
|
2656
3388
|
});
|
|
2657
|
-
filteredText = filteredText.replace(new RegExp(`\\b${escapeRegExp(originalWord)}\\b`,
|
|
3389
|
+
filteredText = filteredText.replace(new RegExp(`\\b${escapeRegExp(originalWord)}\\b`, 'g'), censoredWord);
|
|
2658
3390
|
}
|
|
2659
3391
|
});
|
|
2660
3392
|
if (detectSplit || detectLeetSpeak) {
|
|
@@ -2683,7 +3415,7 @@ function filter(text, options = {}) {
|
|
|
2683
3415
|
censored: censoredWord,
|
|
2684
3416
|
metadata,
|
|
2685
3417
|
});
|
|
2686
|
-
filteredText = filteredText.replace(new RegExp(escapeRegExp(originalWord),
|
|
3418
|
+
filteredText = filteredText.replace(new RegExp(escapeRegExp(originalWord), 'g'), censoredWord);
|
|
2687
3419
|
}
|
|
2688
3420
|
}
|
|
2689
3421
|
if (detectSplit) {
|
|
@@ -2711,7 +3443,7 @@ function filter(text, options = {}) {
|
|
|
2711
3443
|
censored: censoredWord,
|
|
2712
3444
|
metadata,
|
|
2713
3445
|
});
|
|
2714
|
-
filteredText = filteredText.replace(new RegExp(escapeRegExp(originalWord),
|
|
3446
|
+
filteredText = filteredText.replace(new RegExp(escapeRegExp(originalWord), 'g'), censoredWord);
|
|
2715
3447
|
}
|
|
2716
3448
|
}
|
|
2717
3449
|
}
|
|
@@ -2719,11 +3451,10 @@ function filter(text, options = {}) {
|
|
|
2719
3451
|
if (detectSimilarity && useLevenshtein) {
|
|
2720
3452
|
matches.forEach((word) => {
|
|
2721
3453
|
const metadata = matchDetails.find((m) => m.word.toLowerCase() === word.toLowerCase() ||
|
|
2722
|
-
(m.aliases &&
|
|
2723
|
-
m.aliases.some((alias) => alias.toLowerCase() === word.toLowerCase())));
|
|
3454
|
+
(m.aliases && m.aliases.some((alias) => alias.toLowerCase() === word.toLowerCase())));
|
|
2724
3455
|
const variants = actualMatches.get(word.toLowerCase()) || [];
|
|
2725
3456
|
variants.forEach((variant) => {
|
|
2726
|
-
const exactVariantRegex = new RegExp(`\\b${escapeRegExp(variant)}\\b`,
|
|
3457
|
+
const exactVariantRegex = new RegExp(`\\b${escapeRegExp(variant)}\\b`, 'gi');
|
|
2727
3458
|
let match;
|
|
2728
3459
|
while ((match = exactVariantRegex.exec(filteredText)) !== null) {
|
|
2729
3460
|
const originalWord = match[0];
|
|
@@ -2741,7 +3472,7 @@ function filter(text, options = {}) {
|
|
|
2741
3472
|
censored: censoredWord,
|
|
2742
3473
|
metadata,
|
|
2743
3474
|
});
|
|
2744
|
-
filteredText = filteredText.replace(new RegExp(`\\b${escapeRegExp(originalWord)}\\b`,
|
|
3475
|
+
filteredText = filteredText.replace(new RegExp(`\\b${escapeRegExp(originalWord)}\\b`, 'g'), censoredWord);
|
|
2745
3476
|
}
|
|
2746
3477
|
});
|
|
2747
3478
|
});
|
|
@@ -2900,9 +3631,9 @@ function analyzeWithContext(text, contextWindowSize = 5, options = {}) {
|
|
|
2900
3631
|
const regex = createContextRegex(word, contextWindowSize);
|
|
2901
3632
|
let match;
|
|
2902
3633
|
while ((match = regex.exec(text)) !== null) {
|
|
2903
|
-
const beforeContext = match[1] ||
|
|
3634
|
+
const beforeContext = match[1] || '';
|
|
2904
3635
|
const wordMatch = match[2];
|
|
2905
|
-
const afterContext = match[3] ||
|
|
3636
|
+
const afterContext = match[3] || '';
|
|
2906
3637
|
result.push({
|
|
2907
3638
|
word: wordMatch,
|
|
2908
3639
|
context: beforeContext + wordMatch + afterContext,
|
|
@@ -3003,10 +3734,7 @@ class IDProfanityFilter {
|
|
|
3003
3734
|
* @param word Kata yang akan diabaikan
|
|
3004
3735
|
*/
|
|
3005
3736
|
addToWhitelist(word) {
|
|
3006
|
-
this.options.whitelist = [
|
|
3007
|
-
...(this.options.whitelist || []),
|
|
3008
|
-
word.toLowerCase(),
|
|
3009
|
-
];
|
|
3737
|
+
this.options.whitelist = [...(this.options.whitelist || []), word.toLowerCase()];
|
|
3010
3738
|
}
|
|
3011
3739
|
/**
|
|
3012
3740
|
* Menghapus kata dari whitelist
|