@sideid/id-profanity-filter 1.9.6 β 1.10.4
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/.eslintrc.js +30 -2
- package/README.md +45 -3
- package/dist/config/options.d.ts +24 -0
- package/dist/constants/wordList.d.ts +1 -1
- package/dist/core/analyzer.d.ts +1 -1
- package/dist/core/filter.d.ts +1 -1
- package/dist/core/matcher.d.ts +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.esm.js +411 -77
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +412 -76
- package/dist/index.js.map +1 -1
- package/dist/types/index.d.ts +2 -0
- package/dist/utils/similarityUtils.d.ts +25 -0
- package/eslint.config.mjs +40 -0
- package/package.json +2 -2
- package/src/config/options.ts +2 -0
- package/src/constants/regions/general.ts +102 -2
- package/src/constants/regions/jawa.ts +10 -0
- package/src/constants/wordList.ts +21 -14
- package/src/core/analyzer.ts +8 -14
- package/src/core/filter.ts +182 -41
- package/src/core/matcher.ts +131 -61
- package/src/index.ts +34 -15
- package/src/types/index.ts +4 -2
- package/src/utils/regexUtils.ts +0 -1
- package/src/utils/similarityUtils.ts +97 -2
- package/test.js +184 -0
- package/src/constants/categories/index.ts +0 -31
- package/src/constants/regions/index.ts +0 -62
package/.eslintrc.js
CHANGED
|
@@ -1,16 +1,44 @@
|
|
|
1
1
|
module.exports = {
|
|
2
2
|
parser: '@typescript-eslint/parser',
|
|
3
|
-
extends: ['plugin:@typescript-eslint/recommended', 'prettier'],
|
|
4
3
|
parserOptions: {
|
|
5
4
|
ecmaVersion: 2020,
|
|
6
5
|
sourceType: 'module',
|
|
6
|
+
project: './tsconfig.json',
|
|
7
7
|
},
|
|
8
|
+
extends: [
|
|
9
|
+
'eslint:recommended',
|
|
10
|
+
'plugin:@typescript-eslint/recommended',
|
|
11
|
+
'prettier', // Disables ESLint rules that might conflict with Prettier
|
|
12
|
+
],
|
|
13
|
+
plugins: ['@typescript-eslint'],
|
|
8
14
|
env: {
|
|
9
15
|
node: true,
|
|
10
16
|
jest: true,
|
|
11
17
|
},
|
|
12
18
|
rules: {
|
|
19
|
+
// Enforce consistent code style
|
|
13
20
|
'@typescript-eslint/explicit-function-return-type': 'off',
|
|
14
|
-
'@typescript-eslint/no-explicit-any': '
|
|
21
|
+
'@typescript-eslint/no-explicit-any': 'warn',
|
|
22
|
+
'@typescript-eslint/no-unused-vars': ['warn', { argsIgnorePattern: '^_' }],
|
|
23
|
+
|
|
24
|
+
// Allow certain TypeScript patterns
|
|
25
|
+
'@typescript-eslint/no-non-null-assertion': 'off',
|
|
26
|
+
|
|
27
|
+
// General ESLint rules
|
|
28
|
+
'no-console': ['warn', { allow: ['warn', 'error'] }],
|
|
29
|
+
'prefer-const': 'warn',
|
|
30
|
+
'no-var': 'error',
|
|
31
|
+
|
|
32
|
+
// Make sure imports are properly sorted
|
|
33
|
+
'sort-imports': [
|
|
34
|
+
'off',
|
|
35
|
+
{
|
|
36
|
+
ignoreCase: false,
|
|
37
|
+
ignoreDeclarationSort: true,
|
|
38
|
+
ignoreMemberSort: false,
|
|
39
|
+
memberSyntaxSortOrder: ['none', 'all', 'multiple', 'single'],
|
|
40
|
+
},
|
|
41
|
+
],
|
|
15
42
|
},
|
|
43
|
+
ignorePatterns: ['dist/', 'node_modules/', '*.js', '*.d.ts'],
|
|
16
44
|
};
|
package/README.md
CHANGED
|
@@ -13,6 +13,7 @@ Library JavaScript/TypeScript untuk mendeteksi, menyensor, dan menganalisis kata
|
|
|
13
13
|
- π **Penyensoran** - Menyensor kata-kata kotor dengan berbagai opsi kustomisasi
|
|
14
14
|
- πΊοΈ **Dukungan Bahasa Daerah** - Mencakup kata-kata dari berbagai daerah di Indonesia (Jawa, Sunda, Batak, dll)
|
|
15
15
|
- π§ **Deteksi Cerdas** - Mendeteksi variasi ejaan, kata terpisah, dan kesamaan kata
|
|
16
|
+
- π **Deteksi Levenshtein** - Mendeteksi kata kotor yang dimodifikasi dengan typo atau sengaja disamarkan
|
|
16
17
|
- π‘οΈ **Preset** - Preset filter siap pakai untuk berbagai kebutuhan
|
|
17
18
|
- π§ **Kustomisasi** - Opsi untuk menambahkan whitelist dan daftar kata kustom
|
|
18
19
|
|
|
@@ -182,11 +183,20 @@ Mengaktifkan deteksi variasi ejaan Bahasa Indonesia.
|
|
|
182
183
|
|
|
183
184
|
Mengaktifkan deteksi kata yang dipisah.
|
|
184
185
|
|
|
185
|
-
##### `enableSimilarityDetection(threshold: number = 0.8)`
|
|
186
|
+
##### `enableSimilarityDetection(threshold: number = 0.8, useLevenshtein: boolean = false, maxLevenshteinDistance: number = 2)`
|
|
186
187
|
|
|
187
188
|
Mengaktifkan deteksi berdasarkan kesamaan kata.
|
|
188
189
|
|
|
189
190
|
- **threshold**: Ambang batas kesamaan (0-1, default: 0.8)
|
|
191
|
+
- **useLevenshtein**: Gunakan algoritma Levenshtein untuk deteksi (default: false)
|
|
192
|
+
- **maxLevenshteinDistance**: Jarak edit maksimum yang diizinkan (default: 2)
|
|
193
|
+
|
|
194
|
+
##### `enableLevenshteinDetection(threshold: number = 0.8, maxDistance: number = 2)`
|
|
195
|
+
|
|
196
|
+
Mengaktifkan deteksi berbasis jarak Levenshtein.
|
|
197
|
+
|
|
198
|
+
- **threshold**: Ambang batas kesamaan (0-1, default: 0.8)
|
|
199
|
+
- **maxDistance**: Jarak edit maksimum yang diizinkan (default: 2)
|
|
190
200
|
|
|
191
201
|
### Opsi Filter
|
|
192
202
|
|
|
@@ -210,6 +220,8 @@ interface FilterOptions {
|
|
|
210
220
|
detectSimilarity?: boolean; // Deteksi kata berdasarkan kesamaan
|
|
211
221
|
similarityThreshold?: number; // Ambang batas kesamaan (0-1)
|
|
212
222
|
detectSplit?: boolean; // Deteksi kata yang dipisah (a-n-j-i-n-g)
|
|
223
|
+
useLevenshtein?: boolean; // Gunakan algoritma Levenshtein untuk deteksi kesamaan
|
|
224
|
+
maxLevenshteinDistance?: number; // Jarak edit maksimum untuk deteksi Levenshtein
|
|
213
225
|
}
|
|
214
226
|
```
|
|
215
227
|
|
|
@@ -258,6 +270,8 @@ const filter = new IDProfanityFilter({
|
|
|
258
270
|
detectSimilarity: true, // Deteksi kata yang mirip
|
|
259
271
|
similarityThreshold: 0.8, // Ambang batas kesamaan
|
|
260
272
|
detectSplit: true, // Deteksi kata yang dipisah
|
|
273
|
+
useLevenshtein: true, // Gunakan algoritma Levenshtein
|
|
274
|
+
maxLevenshteinDistance: 2, // Jarak Levenshtein maksimum
|
|
261
275
|
});
|
|
262
276
|
```
|
|
263
277
|
|
|
@@ -300,10 +314,10 @@ console.log(hasil2.filtered);
|
|
|
300
314
|
// Output: "Dia sangat ***** dan ****** dengan temannya"
|
|
301
315
|
```
|
|
302
316
|
|
|
303
|
-
### Deteksi Berdasarkan Kesamaan
|
|
317
|
+
### Deteksi Berdasarkan Kesamaan (Similarity Detection)
|
|
304
318
|
|
|
305
319
|
```typescript
|
|
306
|
-
// Aktifkan deteksi kesamaan
|
|
320
|
+
// Aktifkan deteksi kesamaan standar
|
|
307
321
|
const filter = new IDProfanityFilter();
|
|
308
322
|
filter.enableSimilarityDetection(0.75); // Set threshold kesamaan ke 0.75
|
|
309
323
|
|
|
@@ -323,6 +337,34 @@ console.log(hasil.filtered);
|
|
|
323
337
|
// Output: "Dia benar-benar ****** dan *******!"
|
|
324
338
|
```
|
|
325
339
|
|
|
340
|
+
### Deteksi dengan Algoritma Levenshtein Distance
|
|
341
|
+
|
|
342
|
+
```typescript
|
|
343
|
+
// Aktifkan deteksi menggunakan algoritma Levenshtein Distance
|
|
344
|
+
const filter = new IDProfanityFilter();
|
|
345
|
+
filter.enableLevenshteinDetection(0.85, 2);
|
|
346
|
+
// Threshold 0.85, maksimal 2 karakter berbeda
|
|
347
|
+
|
|
348
|
+
const teks = 'Dia benar-benar konntol dan anjiing sekali!';
|
|
349
|
+
const hasil = filter.filter(teks);
|
|
350
|
+
|
|
351
|
+
console.log(hasil.filtered);
|
|
352
|
+
// Output: "Dia benar-benar ******* dan ****** sekali!"
|
|
353
|
+
|
|
354
|
+
// Atau menggunakan opsi langsung:
|
|
355
|
+
const filterCustom = new IDProfanityFilter({
|
|
356
|
+
detectSimilarity: true,
|
|
357
|
+
useLevenshtein: true,
|
|
358
|
+
similarityThreshold: 0.85,
|
|
359
|
+
maxLevenshteinDistance: 2,
|
|
360
|
+
});
|
|
361
|
+
|
|
362
|
+
// Mendeteksi typo atau variasi disengaja
|
|
363
|
+
const teksVariasi = 'kontool kamu kwontol anjiing';
|
|
364
|
+
console.log(filterCustom.filter(teksVariasi).filtered);
|
|
365
|
+
// Output: "******* kamu ******* ******"
|
|
366
|
+
```
|
|
367
|
+
|
|
326
368
|
### Variasi Sensor Kata
|
|
327
369
|
|
|
328
370
|
```typescript
|
package/dist/config/options.d.ts
CHANGED
|
@@ -17,6 +17,8 @@ export declare const FILTER_PRESETS: {
|
|
|
17
17
|
detectSimilarity?: boolean;
|
|
18
18
|
similarityThreshold?: number;
|
|
19
19
|
detectSplit?: boolean;
|
|
20
|
+
useLevenshtein?: boolean;
|
|
21
|
+
maxLevenshteinDistance?: number;
|
|
20
22
|
};
|
|
21
23
|
moderate: {
|
|
22
24
|
severityThreshold: number;
|
|
@@ -34,6 +36,8 @@ export declare const FILTER_PRESETS: {
|
|
|
34
36
|
detectSimilarity?: boolean;
|
|
35
37
|
similarityThreshold?: number;
|
|
36
38
|
detectSplit?: boolean;
|
|
39
|
+
useLevenshtein?: boolean;
|
|
40
|
+
maxLevenshteinDistance?: number;
|
|
37
41
|
};
|
|
38
42
|
light: {
|
|
39
43
|
severityThreshold: number;
|
|
@@ -51,6 +55,8 @@ export declare const FILTER_PRESETS: {
|
|
|
51
55
|
detectSimilarity?: boolean;
|
|
52
56
|
similarityThreshold?: number;
|
|
53
57
|
detectSplit?: boolean;
|
|
58
|
+
useLevenshtein?: boolean;
|
|
59
|
+
maxLevenshteinDistance?: number;
|
|
54
60
|
};
|
|
55
61
|
childSafe: {
|
|
56
62
|
checkSubstring: boolean;
|
|
@@ -68,6 +74,8 @@ export declare const FILTER_PRESETS: {
|
|
|
68
74
|
detectSimilarity?: boolean;
|
|
69
75
|
similarityThreshold?: number;
|
|
70
76
|
detectSplit?: boolean;
|
|
77
|
+
useLevenshtein?: boolean;
|
|
78
|
+
maxLevenshteinDistance?: number;
|
|
71
79
|
};
|
|
72
80
|
};
|
|
73
81
|
export declare const CATEGORY_PRESETS: {
|
|
@@ -87,6 +95,8 @@ export declare const CATEGORY_PRESETS: {
|
|
|
87
95
|
detectSimilarity?: boolean;
|
|
88
96
|
similarityThreshold?: number;
|
|
89
97
|
detectSplit?: boolean;
|
|
98
|
+
useLevenshtein?: boolean;
|
|
99
|
+
maxLevenshteinDistance?: number;
|
|
90
100
|
};
|
|
91
101
|
insults: {
|
|
92
102
|
categories: ProfanityCategory[];
|
|
@@ -104,6 +114,8 @@ export declare const CATEGORY_PRESETS: {
|
|
|
104
114
|
detectSimilarity?: boolean;
|
|
105
115
|
similarityThreshold?: number;
|
|
106
116
|
detectSplit?: boolean;
|
|
117
|
+
useLevenshtein?: boolean;
|
|
118
|
+
maxLevenshteinDistance?: number;
|
|
107
119
|
};
|
|
108
120
|
profanity: {
|
|
109
121
|
categories: ProfanityCategory[];
|
|
@@ -121,6 +133,8 @@ export declare const CATEGORY_PRESETS: {
|
|
|
121
133
|
detectSimilarity?: boolean;
|
|
122
134
|
similarityThreshold?: number;
|
|
123
135
|
detectSplit?: boolean;
|
|
136
|
+
useLevenshtein?: boolean;
|
|
137
|
+
maxLevenshteinDistance?: number;
|
|
124
138
|
};
|
|
125
139
|
};
|
|
126
140
|
export declare const REGION_PRESETS: {
|
|
@@ -140,6 +154,8 @@ export declare const REGION_PRESETS: {
|
|
|
140
154
|
detectSimilarity?: boolean;
|
|
141
155
|
similarityThreshold?: number;
|
|
142
156
|
detectSplit?: boolean;
|
|
157
|
+
useLevenshtein?: boolean;
|
|
158
|
+
maxLevenshteinDistance?: number;
|
|
143
159
|
};
|
|
144
160
|
jawa: {
|
|
145
161
|
regions: Region[];
|
|
@@ -157,6 +173,8 @@ export declare const REGION_PRESETS: {
|
|
|
157
173
|
detectSimilarity?: boolean;
|
|
158
174
|
similarityThreshold?: number;
|
|
159
175
|
detectSplit?: boolean;
|
|
176
|
+
useLevenshtein?: boolean;
|
|
177
|
+
maxLevenshteinDistance?: number;
|
|
160
178
|
};
|
|
161
179
|
sunda: {
|
|
162
180
|
regions: Region[];
|
|
@@ -174,6 +192,8 @@ export declare const REGION_PRESETS: {
|
|
|
174
192
|
detectSimilarity?: boolean;
|
|
175
193
|
similarityThreshold?: number;
|
|
176
194
|
detectSplit?: boolean;
|
|
195
|
+
useLevenshtein?: boolean;
|
|
196
|
+
maxLevenshteinDistance?: number;
|
|
177
197
|
};
|
|
178
198
|
betawi: {
|
|
179
199
|
regions: Region[];
|
|
@@ -191,6 +211,8 @@ export declare const REGION_PRESETS: {
|
|
|
191
211
|
detectSimilarity?: boolean;
|
|
192
212
|
similarityThreshold?: number;
|
|
193
213
|
detectSplit?: boolean;
|
|
214
|
+
useLevenshtein?: boolean;
|
|
215
|
+
maxLevenshteinDistance?: number;
|
|
194
216
|
};
|
|
195
217
|
batak: {
|
|
196
218
|
regions: Region[];
|
|
@@ -208,6 +230,8 @@ export declare const REGION_PRESETS: {
|
|
|
208
230
|
detectSimilarity?: boolean;
|
|
209
231
|
similarityThreshold?: number;
|
|
210
232
|
detectSplit?: boolean;
|
|
233
|
+
useLevenshtein?: boolean;
|
|
234
|
+
maxLevenshteinDistance?: number;
|
|
211
235
|
};
|
|
212
236
|
};
|
|
213
237
|
export declare const REPLACEMENT_CHARS: {
|
package/dist/core/analyzer.d.ts
CHANGED
package/dist/core/filter.d.ts
CHANGED
package/dist/core/matcher.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ProfanityWord, ProfanityCategory, Region, FilterOptions } from
|
|
1
|
+
import { ProfanityWord, ProfanityCategory, Region, FilterOptions } from '../types';
|
|
2
2
|
export declare function findProfanity(text: string, options?: FilterOptions): string[];
|
|
3
3
|
/**
|
|
4
4
|
* Mencari kata kotor lengkap dengan metadata
|
package/dist/index.d.ts
CHANGED