@sideid/id-profanity-filter 0.1.0
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 +16 -0
- package/.github/workflows/ci.yml +0 -0
- package/CONTRIBUTING.md +151 -0
- package/LICENSE +21 -0
- package/README.md +285 -0
- package/dist/constants/categories/insult.d.ts +4 -0
- package/dist/constants/categories/sexual.d.ts +4 -0
- package/dist/constants/regions/batak.d.ts +4 -0
- package/dist/constants/regions/betawi.d.ts +4 -0
- package/dist/constants/regions/general.d.ts +4 -0
- package/dist/constants/regions/jawa.d.ts +4 -0
- package/dist/constants/regions/sunda.d.ts +4 -0
- package/dist/constants/wordList.d.ts +34 -0
- package/dist/core/analyzer.d.ts +54 -0
- package/dist/core/filter.d.ts +17 -0
- package/dist/core/matcher.d.ts +31 -0
- package/dist/index.d.ts +71 -0
- package/dist/index.esm.js +1014 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/index.js +1031 -0
- package/dist/index.js.map +1 -0
- package/dist/types/index.d.ts +69 -0
- package/examples/basic.ts +52 -0
- package/jest.config.js +10 -0
- package/package.json +51 -0
- package/prettierrc +7 -0
- package/rollup.config.js +35 -0
- package/src/config/options.ts +0 -0
- package/src/constants/categories/blasphemy.ts +0 -0
- package/src/constants/categories/disgusting.ts +0 -0
- package/src/constants/categories/drugs.ts +0 -0
- package/src/constants/categories/index.ts +31 -0
- package/src/constants/categories/insult.ts +114 -0
- package/src/constants/categories/profanity.ts +0 -0
- package/src/constants/categories/sexual.ts +100 -0
- package/src/constants/categories/slur.ts +0 -0
- package/src/constants/regions/aceh.ts +0 -0
- package/src/constants/regions/ambon.ts +0 -0
- package/src/constants/regions/bali.ts +0 -0
- package/src/constants/regions/banjar.ts +0 -0
- package/src/constants/regions/batak.ts +17 -0
- package/src/constants/regions/betawi.ts +39 -0
- package/src/constants/regions/bugis.ts +0 -0
- package/src/constants/regions/general.ts +111 -0
- package/src/constants/regions/index.ts +62 -0
- package/src/constants/regions/jawa.ts +102 -0
- package/src/constants/regions/lampung.ts +0 -0
- package/src/constants/regions/madura.ts +0 -0
- package/src/constants/regions/manado.ts +0 -0
- package/src/constants/regions/minang.ts +0 -0
- package/src/constants/regions/ntb.ts +0 -0
- package/src/constants/regions/ntt.ts +0 -0
- package/src/constants/regions/palembang.ts +0 -0
- package/src/constants/regions/papua.ts +0 -0
- package/src/constants/regions/sunda.ts +35 -0
- package/src/constants/wordList.ts +125 -0
- package/src/core/analyzer.ts +204 -0
- package/src/core/filter.ts +129 -0
- package/src/core/matcher.ts +267 -0
- package/src/index.ts +133 -0
- package/src/types/index.ts +115 -0
- package/src/utils/regexUtils.ts +0 -0
- package/src/utils/stringUtils.ts +0 -0
- package/tsconfig.json +115 -0
package/.eslintrc.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
module.exports = {
|
|
2
|
+
parser: '@typescript-eslint/parser',
|
|
3
|
+
extends: ['plugin:@typescript-eslint/recommended', 'prettier'],
|
|
4
|
+
parserOptions: {
|
|
5
|
+
ecmaVersion: 2020,
|
|
6
|
+
sourceType: 'module',
|
|
7
|
+
},
|
|
8
|
+
env: {
|
|
9
|
+
node: true,
|
|
10
|
+
jest: true,
|
|
11
|
+
},
|
|
12
|
+
rules: {
|
|
13
|
+
'@typescript-eslint/explicit-function-return-type': 'off',
|
|
14
|
+
'@typescript-eslint/no-explicit-any': 'off',
|
|
15
|
+
},
|
|
16
|
+
};
|
|
File without changes
|
package/CONTRIBUTING.md
ADDED
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
# Panduan Kontribusi untuk ID-Profanity-Filter
|
|
2
|
+
|
|
3
|
+
Terima kasih telah mempertimbangkan untuk berkontribusi pada proyek ID-Profanity-Filter! Panduan ini akan menjelaskan proses kontribusi, terutama untuk menambahkan kata kotor baru ke dalam database.
|
|
4
|
+
|
|
5
|
+
## Cara Berkontribusi
|
|
6
|
+
|
|
7
|
+
### 1. Fork & Clone Repositori
|
|
8
|
+
|
|
9
|
+
- Fork repositori ini ke akun GitHub Anda
|
|
10
|
+
- Clone repositori fork Anda ke komputer lokal:
|
|
11
|
+
```bash
|
|
12
|
+
git clone https://github.com/username/id-profanity-filter.git
|
|
13
|
+
cd id-profanity-filter
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
### 2. Install Dependensi
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
npm install
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
### 3. Buat Branch Baru
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
git switch -c add-kata-kotor-daerah
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Struktur Kata Kotor
|
|
29
|
+
|
|
30
|
+
Kata-kata kotor dalam proyek ini dikelompokkan berdasarkan dua dimensi:
|
|
31
|
+
|
|
32
|
+
### Berdasarkan Daerah Asal
|
|
33
|
+
|
|
34
|
+
Lokasi file: `src/constants/regions/`
|
|
35
|
+
|
|
36
|
+
Kata-kata dikelompokkan berdasarkan daerah asalnya di Indonesia, seperti:
|
|
37
|
+
- `general.ts` - Kata-kata umum di Indonesia
|
|
38
|
+
- `jawa.ts` - Kata-kata dari Jawa
|
|
39
|
+
- `sunda.ts` - Kata-kata dari Sunda
|
|
40
|
+
- `betawi.ts` - Kata-kata dari Betawi
|
|
41
|
+
- `batak.ts` - Kata-kata dari Batak
|
|
42
|
+
- ... dan daerah lainnya
|
|
43
|
+
|
|
44
|
+
### Berdasarkan Kategori
|
|
45
|
+
|
|
46
|
+
Lokasi file: `src/constants/categories/`
|
|
47
|
+
|
|
48
|
+
Kata-kata juga dikelompokkan berdasarkan jenisnya:
|
|
49
|
+
- `sexual.ts` - Kata-kata berbau seksual
|
|
50
|
+
- `insult.ts` - Kata-kata penghinaan
|
|
51
|
+
- `profanity.ts` - Umpatan umum
|
|
52
|
+
- `slur.ts` - Kata-kata merendahkan berdasarkan identitas
|
|
53
|
+
- `drugs.ts` - Kata-kata terkait narkoba
|
|
54
|
+
- `disgusting.ts` - Kata-kata menjijikkan
|
|
55
|
+
- `blasphemy.ts` - Kata-kata penistaan agama
|
|
56
|
+
|
|
57
|
+
## Cara Menambahkan Kata Kotor Baru
|
|
58
|
+
|
|
59
|
+
### 1. Menambahkan ke File Daerah
|
|
60
|
+
|
|
61
|
+
Pilih file daerah yang sesuai di `src/constants/regions/` atau buat file baru jika daerah tersebut belum ada. Format entri kata kotor harus mengikuti interface `ProfanityWord`:
|
|
62
|
+
|
|
63
|
+
```typescript
|
|
64
|
+
{
|
|
65
|
+
word: 'kata_kotor', // Kata kotor dalam bentuk dasarnya
|
|
66
|
+
category: 'insult', // Kategori kata (sexual, insult, profanity, slur, drugs, disgusting, blasphemy)
|
|
67
|
+
region: 'nama_daerah', // Daerah asal kata
|
|
68
|
+
severity: 0.7, // Tingkat keparahan (0-1)
|
|
69
|
+
aliases: ['alias1', 'alias2'], // Variasi atau alias kata (opsional)
|
|
70
|
+
description: 'Deskripsi kata', // Penjelasan singkat tentang kata (opsional)
|
|
71
|
+
context: 'Konteks penggunaan' // Informasi konteks penggunaan (opsional)
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
Contoh menambahkan kata ke file daerah (misalnya `bali.ts`):
|
|
76
|
+
|
|
77
|
+
```typescript
|
|
78
|
+
import { ProfanityWord } from '../../types';
|
|
79
|
+
|
|
80
|
+
export const bali: ProfanityWord[] = [
|
|
81
|
+
// ... kata-kata yang sudah ada
|
|
82
|
+
{
|
|
83
|
+
word: 'cicing',
|
|
84
|
+
category: 'profanity',
|
|
85
|
+
region: 'bali',
|
|
86
|
+
severity: 0.6,
|
|
87
|
+
aliases: ['cicying'],
|
|
88
|
+
description: 'Secara harfiah berarti anjing dalam Bahasa Bali',
|
|
89
|
+
context: 'Umpatan umum dalam Bahasa Bali'
|
|
90
|
+
},
|
|
91
|
+
// ... tambahkan kata lainnya
|
|
92
|
+
];
|
|
93
|
+
|
|
94
|
+
export const baliWords = bali.map(item => item.word);
|
|
95
|
+
|
|
96
|
+
export default bali;
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### 2. Menambahkan ke File Kategori (Opsional)
|
|
100
|
+
|
|
101
|
+
Jika Anda menambahkan kata baru, perbarui juga file kategori yang sesuai (`src/constants/categories/`). Kata-kata tersebut akan otomatis terambil saat library dibuild, tetapi terkadang kategori perlu diperbarui.
|
|
102
|
+
|
|
103
|
+
### 3. Update File indeks Daerah/Kategori (jika ada daerah baru)
|
|
104
|
+
|
|
105
|
+
Jika Anda menambahkan daerah baru, pastikan untuk memperbarui file indeks:
|
|
106
|
+
- `src/constants/regions/index.ts`
|
|
107
|
+
- `src/constants/wordList.ts`
|
|
108
|
+
|
|
109
|
+
### 4. Jalankan Tes (jika ada)
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
npm test
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### 5. Build Library
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
npm run build
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### 6. Commit dan Push Perubahan Anda
|
|
122
|
+
|
|
123
|
+
```bash
|
|
124
|
+
git add .
|
|
125
|
+
git commit -m "Menambahkan kata kotor daerah X"
|
|
126
|
+
git push origin add-kata-kotor-daerah
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### 7. Buat Pull Request
|
|
130
|
+
|
|
131
|
+
Buat Pull Request dari branch Anda ke repositori utama.
|
|
132
|
+
|
|
133
|
+
## Pedoman Penambahan Kata
|
|
134
|
+
|
|
135
|
+
1. **Validasi Kata**: Pastikan kata tersebut benar-benar dianggap kasar di daerah yang dimaksud.
|
|
136
|
+
2. **Metadata**: Tambahkan metadata yang cukup, terutama tingkat keparahan dan kategori.
|
|
137
|
+
3. **Konteks**: Tambahkan komentar konteks jika diperlukan untuk menjelaskan kata tersebut.
|
|
138
|
+
4. **Bentuk Dasar**: Tambahkan kata dalam bentuk dasarnya, variasi dapat ditambahkan dalam `aliases`.
|
|
139
|
+
5. **Kategorisasi**: Kategorikan kata dengan benar (seksual, hinaan, umpatan, dll).
|
|
140
|
+
6. **Hindari Duplikasi**: Periksa apakah kata tersebut sudah ada sebelum menambahkannya.
|
|
141
|
+
|
|
142
|
+
## Format Commit
|
|
143
|
+
|
|
144
|
+
Gunakan format commit yang konsisten:
|
|
145
|
+
- `Add: Menambahkan kata X dari daerah Y`
|
|
146
|
+
- `Update: Memperbaiki metadata kata X`
|
|
147
|
+
- `Fix: Memperbaiki bug pada ...`
|
|
148
|
+
|
|
149
|
+
## Informasi Tambahan
|
|
150
|
+
|
|
151
|
+
Untuk pertanyaan atau diskusi, silakan buat issue di GitHub atau hubungi maintainer proyek. Terima kasih atas kontribusi Anda!
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Side ID ~
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
# ID-Profanity-Filter
|
|
2
|
+
|
|
3
|
+

|
|
4
|
+

|
|
5
|
+

|
|
6
|
+
|
|
7
|
+
Library JavaScript/TypeScript untuk mendeteksi, menyensor, dan menganalisis kata-kata kotor dalam Bahasa Indonesia dan bahasa daerah.
|
|
8
|
+
|
|
9
|
+
## Fitur Utama
|
|
10
|
+
|
|
11
|
+
- 🔍 **Deteksi Kata Kotor** - Mendeteksi kata-kata kasar/kotor dalam teks Bahasa Indonesia
|
|
12
|
+
- ⚠️ **Analisis Konten** - Menganalisis tingkat keparahan dan kategori kata kotor
|
|
13
|
+
- 🔒 **Penyensoran** - Menyensor kata-kata kotor dengan berbagai opsi kustomisasi
|
|
14
|
+
- 🗺️ **Dukungan Bahasa Daerah** - Mencakup kata-kata dari berbagai daerah di Indonesia (Jawa, Sunda, Batak, dll)
|
|
15
|
+
- 🔧 **Kustomisasi** - Opsi untuk menambahkan whitelist dan daftar kata kustom
|
|
16
|
+
|
|
17
|
+
## Instalasi
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
npm install @sideid/id-profanity-filter
|
|
21
|
+
# atau
|
|
22
|
+
yarn add @sideid/id-profanity-filter
|
|
23
|
+
# atau
|
|
24
|
+
pnpm add @sideid/id-profanity-filter
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Penggunaan Dasar
|
|
28
|
+
|
|
29
|
+
### JavaScript / TypeScript
|
|
30
|
+
|
|
31
|
+
```typescript
|
|
32
|
+
import IDProfanityFilter from '@sideid/id-profanity-filter';
|
|
33
|
+
|
|
34
|
+
// Buat instance filter
|
|
35
|
+
const filter = new IDProfanityFilter();
|
|
36
|
+
|
|
37
|
+
// Cek apakah teks mengandung kata kotor
|
|
38
|
+
const teks = 'Dasar anjing kamu, jangan banyak bacot!';
|
|
39
|
+
const hasProfanity = filter.isProfane(teks);
|
|
40
|
+
|
|
41
|
+
console.log(hasProfanity); // Output: true
|
|
42
|
+
|
|
43
|
+
// Filter kata kotor (sensorisasi)
|
|
44
|
+
const hasil = filter.filter(teks);
|
|
45
|
+
console.log(hasil.filtered); // Output: "Dasar **** kamu, jangan banyak ****!"
|
|
46
|
+
console.log(hasil.censored); // Output: 2 (jumlah kata yang disensor)
|
|
47
|
+
|
|
48
|
+
// Analisis konten
|
|
49
|
+
const analisis = filter.analyze(teks);
|
|
50
|
+
console.log(analisis.severityScore); // Output: 0.65 (contoh skor keparahan)
|
|
51
|
+
console.log(analisis.categories); // Output: ["profanity", "insult"]
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### Utilitas Langsung
|
|
55
|
+
|
|
56
|
+
Anda juga dapat menggunakan fungsi utilitas langsung tanpa membuat instance:
|
|
57
|
+
|
|
58
|
+
```typescript
|
|
59
|
+
import { idFilter } from '@sideid/id-profanity-filter';
|
|
60
|
+
|
|
61
|
+
const teks = 'Dasar anjing kamu, jangan banyak bacot!';
|
|
62
|
+
const hasil = idFilter.filter(teks);
|
|
63
|
+
console.log(hasil.filtered); // Output: "Dasar **** kamu, jangan banyak ****!"
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## Dokumentasi API
|
|
67
|
+
|
|
68
|
+
### Kelas `IDProfanityFilter`
|
|
69
|
+
|
|
70
|
+
#### Konstruktor
|
|
71
|
+
|
|
72
|
+
```typescript
|
|
73
|
+
constructor(options?: FilterOptions)
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
- **options**: Opsi konfigurasi filter (opsional)
|
|
77
|
+
|
|
78
|
+
#### Metode
|
|
79
|
+
|
|
80
|
+
##### `filter(text: string): FilterResult`
|
|
81
|
+
|
|
82
|
+
Menyensor kata kotor dalam teks.
|
|
83
|
+
|
|
84
|
+
- **Hasil**: Objek `FilterResult` dengan properti:
|
|
85
|
+
- `filtered`: String teks yang sudah disensor
|
|
86
|
+
- `censored`: Jumlah kata yang disensor
|
|
87
|
+
- `replacements`: Array berisi detail kata yang disensor
|
|
88
|
+
|
|
89
|
+
##### `isProfane(text: string): boolean`
|
|
90
|
+
|
|
91
|
+
Memeriksa apakah teks mengandung kata kotor.
|
|
92
|
+
|
|
93
|
+
- **Hasil**: Boolean `true` jika teks mengandung kata kotor, `false` jika tidak
|
|
94
|
+
|
|
95
|
+
##### `analyze(text: string): AnalysisResult`
|
|
96
|
+
|
|
97
|
+
Menganalisis teks untuk mendapatkan informasi detail tentang kata kotor yang ditemukan.
|
|
98
|
+
|
|
99
|
+
- **Hasil**: Objek `AnalysisResult` dengan properti:
|
|
100
|
+
- `hasProfanity`: Apakah teks mengandung kata kotor
|
|
101
|
+
- `matches`: Array kata kotor yang ditemukan
|
|
102
|
+
- `matchDetails`: Array objek kata kotor dengan metadata
|
|
103
|
+
- `categories`: Kategori kata kotor yang ditemukan
|
|
104
|
+
- `regions`: Daerah asal kata kotor yang ditemukan
|
|
105
|
+
- `severityScore`: Skor keparahan (0-1)
|
|
106
|
+
|
|
107
|
+
##### `batchAnalyze(texts: string[])`
|
|
108
|
+
|
|
109
|
+
Menganalisis batch teks sekaligus dan memberikan ringkasan.
|
|
110
|
+
|
|
111
|
+
- **Hasil**: Objek yang berisi ringkasan analisis
|
|
112
|
+
|
|
113
|
+
##### `analyzeBySentence(text: string)`
|
|
114
|
+
|
|
115
|
+
Menganalisis teks per-kalimat.
|
|
116
|
+
|
|
117
|
+
- **Hasil**: Array dari hasil analisis per-kalimat
|
|
118
|
+
|
|
119
|
+
##### `analyzeWithContext(text: string, contextWindowSize?: number)`
|
|
120
|
+
|
|
121
|
+
Menganalisis teks dengan konteks di sekitar kata kotor.
|
|
122
|
+
|
|
123
|
+
- **Hasil**: Array dari kata kotor dengan konteks di sekitarnya
|
|
124
|
+
|
|
125
|
+
##### `setOptions(options: Partial<FilterOptions>)`
|
|
126
|
+
|
|
127
|
+
Mengubah opsi filter.
|
|
128
|
+
|
|
129
|
+
##### `setWordList(wordList: string[])`
|
|
130
|
+
|
|
131
|
+
Menetapkan daftar kata kustom.
|
|
132
|
+
|
|
133
|
+
##### `addToWhitelist(word: string)`
|
|
134
|
+
|
|
135
|
+
Menambahkan kata ke whitelist (akan diabaikan dalam filter).
|
|
136
|
+
|
|
137
|
+
##### `removeFromWhitelist(word: string)`
|
|
138
|
+
|
|
139
|
+
Menghapus kata dari whitelist.
|
|
140
|
+
|
|
141
|
+
### Opsi Filter
|
|
142
|
+
|
|
143
|
+
```typescript
|
|
144
|
+
interface FilterOptions {
|
|
145
|
+
wordList?: string[]; // List kata yang ingin difilter
|
|
146
|
+
replaceWith?: string; // Karakter pengganti untuk kata yang disensor
|
|
147
|
+
fullWordCensor?: boolean; // Apakah menyensor seluruh kata atau sebagian
|
|
148
|
+
detectLeetSpeak?: boolean; // Deteksi variasi penulisan (mis: a=4, e=3)
|
|
149
|
+
whitelist?: string[]; // Kata-kata yang dikecualikan dari filter
|
|
150
|
+
checkSubstring?: boolean; // Memeriksa substring (lebih ketat)
|
|
151
|
+
categories?: ProfanityCategory[]; // Kategori kata yang difilter
|
|
152
|
+
regions?: Region[]; // Daerah asal kata yang difilter
|
|
153
|
+
severityThreshold?: number; // Tingkat keparahan minimum (0-1)
|
|
154
|
+
}
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
## Contoh Penggunaan Lanjutan
|
|
158
|
+
|
|
159
|
+
### Kustomisasi Opsi Filter
|
|
160
|
+
|
|
161
|
+
```typescript
|
|
162
|
+
const filter = new IDProfanityFilter({
|
|
163
|
+
replaceWith: '#', // Menggunakan # sebagai karakter pengganti
|
|
164
|
+
fullWordCensor: false, // Hanya menyensor sebagian kata
|
|
165
|
+
detectLeetSpeak: true, // Mendeteksi variasi seperti "b4b1" untuk "babi"
|
|
166
|
+
categories: ['sexual', 'slur'], // Hanya filter kategori tertentu
|
|
167
|
+
regions: ['jawa', 'general'], // Hanya filter dari daerah tertentu
|
|
168
|
+
severityThreshold: 0.7, // Hanya filter kata dengan tingkat keparahan ≥ 0.7
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
// Atau mengubah opsi setelah inisialisasi
|
|
172
|
+
filter.setOptions({
|
|
173
|
+
replaceWith: '@',
|
|
174
|
+
fullWordCensor: true,
|
|
175
|
+
});
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
### Menggunakan Whitelist
|
|
179
|
+
|
|
180
|
+
```typescript
|
|
181
|
+
const filter = new IDProfanityFilter();
|
|
182
|
+
|
|
183
|
+
// Menambahkan kata ke whitelist (akan diabaikan)
|
|
184
|
+
filter.addToWhitelist('anjing');
|
|
185
|
+
|
|
186
|
+
const teks =
|
|
187
|
+
'Anjing itu hewan peliharaan yang setia, tidak seperti bajingan itu';
|
|
188
|
+
const hasil = filter.filter(teks);
|
|
189
|
+
|
|
190
|
+
console.log(hasil.filtered);
|
|
191
|
+
// Output: "Anjing itu hewan peliharaan yang setia, tidak seperti ******* itu"
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
### Analisis Konten Mendalam
|
|
195
|
+
|
|
196
|
+
```typescript
|
|
197
|
+
const filter = new IDProfanityFilter();
|
|
198
|
+
const teks = 'Dasar anjing sialan! Kamu ini memang bego dan goblok.';
|
|
199
|
+
|
|
200
|
+
// Analisis teks
|
|
201
|
+
const analisis = filter.analyze(teks);
|
|
202
|
+
console.log(analisis);
|
|
203
|
+
|
|
204
|
+
/* Output:
|
|
205
|
+
{
|
|
206
|
+
hasProfanity: true,
|
|
207
|
+
matches: ['anjing', 'sialan', 'bego', 'goblok'],
|
|
208
|
+
matchDetails: [
|
|
209
|
+
{ word: 'anjing', category: 'profanity', region: 'general', severity: 0.7, ... },
|
|
210
|
+
{ word: 'bego', category: 'insult', region: 'general', severity: 0.5, ... },
|
|
211
|
+
...
|
|
212
|
+
],
|
|
213
|
+
categories: ['profanity', 'insult'],
|
|
214
|
+
regions: ['general'],
|
|
215
|
+
severityScore: 0.64
|
|
216
|
+
}
|
|
217
|
+
*/
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
### Analisis Batch
|
|
221
|
+
|
|
222
|
+
```typescript
|
|
223
|
+
const filter = new IDProfanityFilter();
|
|
224
|
+
const komentar = [
|
|
225
|
+
'Film ini sangat bagus, ceritanya menarik sekali!',
|
|
226
|
+
'Dasar goblok, sialan kamu!',
|
|
227
|
+
'Anjing emang filmnya, sampah banget.',
|
|
228
|
+
];
|
|
229
|
+
|
|
230
|
+
const hasil = filter.batchAnalyze(komentar);
|
|
231
|
+
console.log(hasil);
|
|
232
|
+
|
|
233
|
+
/* Output:
|
|
234
|
+
{
|
|
235
|
+
totalTexts: 3,
|
|
236
|
+
profaneTexts: 2,
|
|
237
|
+
cleanTexts: 1,
|
|
238
|
+
averageSeverity: 0.62,
|
|
239
|
+
topCategories: ['profanity', 'insult'],
|
|
240
|
+
topRegions: ['general'],
|
|
241
|
+
mostFrequentWords: [
|
|
242
|
+
{ word: 'anjing', count: 1 },
|
|
243
|
+
{ word: 'goblok', count: 1 },
|
|
244
|
+
{ word: 'sialan', count: 1 },
|
|
245
|
+
{ word: 'sampah', count: 1 }
|
|
246
|
+
]
|
|
247
|
+
}
|
|
248
|
+
*/
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
## Dukungan Regional
|
|
252
|
+
|
|
253
|
+
Library ini mendukung kata-kata kotor dari berbagai daerah di Indonesia:
|
|
254
|
+
|
|
255
|
+
- 🇮🇩 **General** - Kata-kata yang umum di seluruh Indonesia
|
|
256
|
+
- 🏝️ **Jawa** - Kata-kata dari bahasa Jawa
|
|
257
|
+
- 🏞️ **Sunda** - Kata-kata dari bahasa Sunda
|
|
258
|
+
- 🏙️ **Betawi** - Kata-kata dari bahasa Betawi
|
|
259
|
+
- 🌋 **Batak** - Kata-kata dari bahasa Batak
|
|
260
|
+
|
|
261
|
+
Dan daerah lainnya yang terus bertambah.
|
|
262
|
+
|
|
263
|
+
## Kategori Kata
|
|
264
|
+
|
|
265
|
+
Kata-kata dikelompokkan berdasarkan kategori:
|
|
266
|
+
|
|
267
|
+
- `sexual`: Kata-kata berbau seksual
|
|
268
|
+
- `insult`: Kata-kata penghinaan
|
|
269
|
+
- `profanity`: Umpatan umum
|
|
270
|
+
- `slur`: Perkataan merendahkan berdasarkan identitas
|
|
271
|
+
- `drugs`: Terkait narkoba
|
|
272
|
+
- `disgusting`: Kata-kata menjijikkan
|
|
273
|
+
- `blasphemy`: Penistaan agama
|
|
274
|
+
|
|
275
|
+
## Berkontribusi
|
|
276
|
+
|
|
277
|
+
Kami sangat menghargai kontribusi Anda! Untuk berkontribusi, silakan lihat [panduan kontribusi](CONTRIBUTING.md).
|
|
278
|
+
|
|
279
|
+
## Lisensi
|
|
280
|
+
|
|
281
|
+
Proyek ini dilisensikan di bawah [MIT License](LICENSE).
|
|
282
|
+
|
|
283
|
+
## Kontak & Dukungan
|
|
284
|
+
|
|
285
|
+
Jika Anda memiliki pertanyaan atau saran, silakan buka issue di repositori GitHub kami.
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { ProfanityWord } from '../types';
|
|
2
|
+
export declare const wordCategories: {
|
|
3
|
+
sexual: string[];
|
|
4
|
+
insult: string[];
|
|
5
|
+
};
|
|
6
|
+
export declare const wordRegions: {
|
|
7
|
+
general: string[];
|
|
8
|
+
jawa: string[];
|
|
9
|
+
sunda: string[];
|
|
10
|
+
betawi: string[];
|
|
11
|
+
batak: string[];
|
|
12
|
+
};
|
|
13
|
+
export declare const wordObjects: ProfanityWord[];
|
|
14
|
+
export declare const allWords: string[];
|
|
15
|
+
/**
|
|
16
|
+
* Kata-kata dengan tingkat keparahan tinggi (subset dari semua kata)
|
|
17
|
+
*/
|
|
18
|
+
export declare const severeWords: string[];
|
|
19
|
+
/**
|
|
20
|
+
* Mencari kata berdasarkan kategori dan region
|
|
21
|
+
*
|
|
22
|
+
* @param category Kategori kata kotor
|
|
23
|
+
* @param region Daerah asal kata kotor
|
|
24
|
+
* @returns Array dari kata kotor
|
|
25
|
+
*/
|
|
26
|
+
export declare function getWordsByFilter(category?: string, region?: string): string[];
|
|
27
|
+
/**
|
|
28
|
+
* Mencari metadata lengkap untuk sebuah kata
|
|
29
|
+
*
|
|
30
|
+
* @param word Kata yang dicari
|
|
31
|
+
* @returns Objek ProfanityWord jika ditemukan, undefined jika tidak
|
|
32
|
+
*/
|
|
33
|
+
export declare function getWordMetadata(word: string): ProfanityWord | undefined;
|
|
34
|
+
export default allWords;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { FilterOptions, AnalysisResult, ProfanityCategory, Region } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Menganalisis teks untuk kata kotor
|
|
4
|
+
*
|
|
5
|
+
* @param text Teks yang akan dianalisis
|
|
6
|
+
* @param options Opsi untuk analisis
|
|
7
|
+
* @return AnalysisResult dengan hasil analisis
|
|
8
|
+
*/
|
|
9
|
+
export declare function analyze(text: string, options?: FilterOptions): AnalysisResult;
|
|
10
|
+
/**
|
|
11
|
+
* menganalisis daftar teks dan ringkasan
|
|
12
|
+
*
|
|
13
|
+
* @param texts Daftar teks yagn dianalisis
|
|
14
|
+
* @param options Opsi untuk analisis
|
|
15
|
+
* @return Objek dengan ringkasan analisis
|
|
16
|
+
*/
|
|
17
|
+
export declare function batchAnalyze(texts: string[], options?: FilterOptions): {
|
|
18
|
+
totalTexts: number;
|
|
19
|
+
profaneTexts: number;
|
|
20
|
+
cleanTexts: number;
|
|
21
|
+
averageSeverity: number;
|
|
22
|
+
topCategories: ProfanityCategory[];
|
|
23
|
+
topRegions: Region[];
|
|
24
|
+
mostFrequentWords: Array<{
|
|
25
|
+
word: string;
|
|
26
|
+
count: number;
|
|
27
|
+
}>;
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Menganalisis per-kalimat untuk melokalisasi kata kotor
|
|
31
|
+
*
|
|
32
|
+
* @param text Teks yang akan dianalisis per-kalimat
|
|
33
|
+
* @param options Opsi untuk analisis
|
|
34
|
+
* @returns Array hasil analisis per-kalimat
|
|
35
|
+
*/
|
|
36
|
+
export declare function analyzeBySentence(text: string, options?: FilterOptions): Array<AnalysisResult & {
|
|
37
|
+
sentence: string;
|
|
38
|
+
}>;
|
|
39
|
+
/**
|
|
40
|
+
* Menganalisis teks untuk menemukan kata kotor pada konteks tertentu
|
|
41
|
+
*
|
|
42
|
+
* @param text Teks yang akan dianalisis
|
|
43
|
+
* @param context Kata konteks untuk dicari di dekat kata kotor
|
|
44
|
+
* @param options Opsi untuk analisis
|
|
45
|
+
* @returns Konteks di dekat kata kotor
|
|
46
|
+
*/
|
|
47
|
+
export declare function analyzeWithContext(text: string, contextWindowSize?: number, options?: FilterOptions): Array<{
|
|
48
|
+
word: string;
|
|
49
|
+
context: string;
|
|
50
|
+
position: {
|
|
51
|
+
start: number;
|
|
52
|
+
end: number;
|
|
53
|
+
};
|
|
54
|
+
}>;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { FilterOptions, FilterResult } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Menyensor kata kotor dalam teks
|
|
4
|
+
*
|
|
5
|
+
* @param text Teks yang akan disensor
|
|
6
|
+
* @param options Opsi untuk filter
|
|
7
|
+
* @returns FilterResult dengan hasil filter
|
|
8
|
+
*/
|
|
9
|
+
export declare function filter(text: string, options?: FilterOptions): FilterResult;
|
|
10
|
+
/**
|
|
11
|
+
* Memeriksa apakah teks mengandung kata kotor
|
|
12
|
+
*
|
|
13
|
+
* @param text Teks yang akan diperiksa
|
|
14
|
+
* @param options Opsi untuk pemeriksaan
|
|
15
|
+
* @returns Boolean apakah teks mengandung kata kotor
|
|
16
|
+
*/
|
|
17
|
+
export declare function isProfane(text: string, options?: FilterOptions): boolean;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { ProfanityWord, ProfanityCategory, Region, FilterOptions } from '../types';
|
|
2
|
+
export declare function findProfanity(text: string, options?: FilterOptions): string[];
|
|
3
|
+
/**
|
|
4
|
+
* Mencari kata kotor lengkap dengan metadata
|
|
5
|
+
*
|
|
6
|
+
* @param text Teks yang akan diperika
|
|
7
|
+
* @param options Opsi utnuk pencarian kata kotor
|
|
8
|
+
* @return Array dari objek kata kotor yang ditemukan
|
|
9
|
+
*/
|
|
10
|
+
export declare function findProfanityWithMetadata(text: string, options?: FilterOptions): ProfanityWord[];
|
|
11
|
+
/**
|
|
12
|
+
* Mencari kategory kata kotor yang ada dalam teks
|
|
13
|
+
*
|
|
14
|
+
* @param text matchDetails Hasil pencarian dari fingProfanityWithMetadata()
|
|
15
|
+
* @param options Opsi untuk pencarian kategori
|
|
16
|
+
*/
|
|
17
|
+
export declare function findCategories(matchDetails: ProfanityWord[]): ProfanityCategory[];
|
|
18
|
+
/**
|
|
19
|
+
* Mencari region kata kotor yang ada dalam teks
|
|
20
|
+
*
|
|
21
|
+
* @param text matchDetails Hasil pencarian dari fingProfanityWithMetadata()
|
|
22
|
+
* @param options Opsi untuk pencarian region
|
|
23
|
+
*/
|
|
24
|
+
export declare function findRegions(matchDetails: ProfanityWord[]): Region[];
|
|
25
|
+
/**
|
|
26
|
+
* Menghitung tingkat keparahan kata kotor yang ditemukan
|
|
27
|
+
*
|
|
28
|
+
* @param matchDetails Hasil pencarian dari findProfanityWithMetadata()
|
|
29
|
+
* @return Skor keparahan dari 0-1
|
|
30
|
+
*/
|
|
31
|
+
export declare function calculateSeverity(matchDetails: ProfanityWord[]): number;
|