@sideid/id-profanity-filter
Version:
Library filter kata kotor dalam Bahasa Indonesia
1,051 lines (1,041 loc) • 37 kB
TypeScript
type ProfanityCategory = 'sexual' | 'insult' | 'profanity' | 'slur' | 'drugs' | 'disgusting' | 'blasphemy';
type Region = 'general' | 'jawa' | 'sunda' | 'betawi' | 'batak' | 'minang' | 'bali' | 'madura' | 'bugis' | 'aceh' | 'ambon' | 'papua' | 'manado' | 'banjar' | 'palembang' | 'lampung' | 'ntt' | 'mandailing' | 'ntb';
interface ProfanityWord {
word: string;
category: ProfanityCategory;
region: Region;
severity: number;
aliases?: string[];
description?: string;
context?: string;
}
interface FilterOptions {
replaceWith?: string;
fullWordCensor?: boolean;
detectLeetSpeak?: boolean;
checkSubstring?: boolean;
wordList?: string[];
whitelist?: string[];
categories?: ProfanityCategory[];
regions?: Region[];
severityThreshold?: number;
useRandomGrawlix?: boolean;
keepFirstAndLast?: boolean;
indonesianVariation?: boolean;
detectSimilarity?: boolean;
similarityThreshold?: number;
detectSplit?: boolean;
useLevenshtein?: boolean;
maxLevenshteinDistance?: number;
}
interface FilterResult {
filtered: string;
censored: number;
replacements: Array<{
original: string;
censored: string;
metadata?: ProfanityWord;
}>;
}
interface AnalysisResult {
hasProfanity: boolean;
matches: string[];
matchDetails: ProfanityWord[];
categories: ProfanityCategory[];
regions: Region[];
severityScore: number;
similarWords?: Array<{
word: string;
original: string;
similarity: number;
}>;
}
interface RegexOptions {
wholeWord?: boolean;
caseSensitive?: boolean;
leetSpeak?: boolean;
detectSplit?: boolean;
indonesianVariation?: boolean;
}
declare function findProfanity(text: string, options?: FilterOptions): string[];
/**
* Mencari kata kotor lengkap dengan metadata
*
* @param text Teks yang akan diperika
* @param options Opsi utnuk pencarian kata kotor
* @return Array dari objek kata kotor yang ditemukan
*/
declare function findProfanityWithMetadata(text: string, options?: FilterOptions): ProfanityWord[];
/**
* Mencari kategory kata kotor yang ada dalam teks
*
* @param matchDetails Hasil pencarian dari fingProfanityWithMetadata()
* @return Array kategori unik
*/
declare function findCategories(matchDetails: ProfanityWord[]): ProfanityCategory[];
/**
* Mencari region kata kotor yang ada dalam teks
*
* @param matchDetails Hasil pencarian dari fingProfanityWithMetadata()
* @return Array region unik
*/
declare function findRegions(matchDetails: ProfanityWord[]): Region[];
/**
* Menghitung tingkat keparahan kata kotor yang ditemukan
*
* @param matchDetails Hasil pencarian dari findProfanityWithMetadata()
* @return Skor keparahan dari 0-1
*/
declare function calculateSeverity(matchDetails: ProfanityWord[]): number;
/**
* Menyensor kata kotor dalam teks
*
* @param text Teks yang akan disensor
* @param options Opsi untuk filter
* @returns FilterResult dengan hasil filter
*/
declare function filter(text: string, options?: FilterOptions): FilterResult;
/**
* Memeriksa apakah teks mengandung kata kotor
*
* @param text Teks yang akan diperiksa
* @param options Opsi untuk pemeriksaan
* @returns Boolean apakah teks mengandung kata kotor
*/
declare function isProfane(text: string, options?: FilterOptions): boolean;
/**
* Menganalisis teks untuk kata kotor
*
* @param text Teks yang akan dianalisis
* @param options Opsi untuk analisis
* @return AnalysisResult dengan hasil analisis
*/
declare function analyze(text: string, options?: FilterOptions): AnalysisResult;
/**
* Menganalisis daftar teks dan ringkasan
*
* @param texts Daftar teks yang dianalisis
* @param options Opsi untuk analisis
* @return Objek dengan ringkasan analisis
*/
declare function batchAnalyze(texts: string[], options?: FilterOptions): {
totalTexts: number;
profaneTexts: number;
cleanTexts: number;
averageSeverity: number;
topCategories: ProfanityCategory[];
topRegions: Region[];
mostFrequentWords: Array<{
word: string;
count: number;
}>;
};
/**
* Menganalisis per-kalimat untuk melokalisasi kata kotor
*
* @param text Teks yang akan dianalisis per-kalimat
* @param options Opsi untuk analisis
* @returns Array hasil analisis per-kalimat
*/
declare function analyzeBySentence(text: string, options?: FilterOptions): Array<AnalysisResult & {
sentence: string;
}>;
/**
* Menganalisis teks untuk menemukan kata kotor pada konteks tertentu
*
* @param text Teks yang akan dianalisis
* @param contextWindowSize Ukuran konteks (jumlah kata) di sekitar kata kotor
* @param options Opsi untuk analisis
* @returns Konteks di dekat kata kotor
*/
declare function analyzeWithContext(text: string, contextWindowSize?: number, options?: FilterOptions): Array<{
word: string;
context: string;
position: {
start: number;
end: number;
};
}>;
/**
* Menyensor kata dengan karakter pengganti
*
* @param word Kata yang akan disensor
* @param replaceChar Karakter pengganti (default: '*')
* @param keepFirstAndLast Apakah harus menyimpan huruf pertama dan terakhir
* @returns Kata yang telah disensor
*/
declare function censorWord(word: string, replaceChar?: string, keepFirstAndLast?: boolean): string;
/**
* Menormalisasi string untuk keperluan pembandingan
*
* @param text Teks yang akan dinormalisasi
* @returns Teks yang telah dinormalisasi
*/
declare function normalizeText(text: string): string;
/**
* Mendeteksi apakah string berisi sebagian atau keseluruhan kata dalam wordList
*
* @param text Teks yang akan diperiksa
* @param wordList Daftar kata yang dicari
* @param checkSubstring Apakah harus memeriksa substring
* @returns Boolean apakah teks mengandung kata-kata dalam wordList
*/
declare function containsAnyWord(text: string, wordList: string[], checkSubstring?: boolean): boolean;
/**
* Memerikasa apakah stirng merupakan kode untuk kata kotor
* (Menangkap kasus seperti disensor dengan titik atau garis: a**ing, b*bi, dll)
*
* @param text Teks yang akan diperika
* @param wordList daftar kata kotor
* @return Boolean apakah teks mengandung kata kotor
*/
declare function containsEuphemism(text: string, wordList: string[]): boolean;
/**
* Mendeteksi upaya menghindari filter dengan pemisahan kata
* (Tangkap kasus seperti: a n j i n g, b-a-b-i, dll)
*
* @param text Teks yang akan diperiksa
* @param wordList Daftar kata kotor
* @returns Boolean apakah teks mengandung upaya menghindari filter
*/
declare function detectSplitWords(text: string, wordList: string[]): boolean;
declare function escapeRegExp(string: string): string;
/**
* Mengganti sebagian kata dengan masking
* (berguna untuk email, nomor telepon, dll)
*
* @param text Teks untuk dimasking
* @param visibleStart Jumlah karakter yang terlihat di awal
* @param visibleEnd Jumlah karakter yang terlihat di akhir
* @param maskChar Karakter masking
* @returns Teks yang telah dimasking
*/
declare function maskText(text: string, visibleStart?: number, visibleEnd?: number, maskChar?: string): string;
/**
* menguabh sting menjadi bentuk leet speak
* (untuk testing filter bypass)
*
* @param text Teks yang akan diubah
* @return Teks yang telah diubah ke leet speak
*/
declare function toLeetSpeak(text: string): string;
/**
* memisahkan teks menajdi kelimat
*
* @param text Teks yang akan dipisahkan
* @return Array kalimat yang telah dipisahkan
*/
declare function splitIntoSentences(text: string): string[];
/**
* mengambil kata-kata di sekitar indeks tertentu
*
* @param text Teks yang akan diambil
* @param index Indeks dalam teks
* @param windowSize jumlah kata di sekitar indeks
* @return Kata-kata di sekitar indeks
*/
declare function getContextAroundIndex(text: string, index: number, windowSize?: number): string;
/**
* Membuat pola regex untuk mencocokkan kata
*
* @param word Kata yang akan dibuat pola regex-nya
* @param options Opsi untuk pembuatan regex
* @returns Objek RegExp
*/
declare function createWordRegex(word: string, options?: RegexOptions): RegExp;
/**
* Menambahkan variasi leet speak ke pola regex
*
* Contoh:
* - 'a' bisa jadi '4', '@'
* - 'i' bisa jadi '1', '!'
*
* @param pattern Pola regex asli
* @returns Pola regex dengan variasi leet speak
*/
declare function addLeetSpeakVariations(pattern: string): string;
/**
* Menambahkan kemungkinan split/pemisahan antar karakter
*
* @param pattern Pola regex asli
* @returns Pola regex dengan kemungkinan split
*/
declare function addSplitVariations(pattern: string): string;
/**
* Membuat regex untuk mencari kata dengan variasi spasi dan karakter penghubung
* Berguna untuk mendeteksi upaya menghindari filter dengan menambahkan spasi atau karakter lain
*
* @param word Kata yang akan dibuat pola regexnya
* @returns Objek RegExp
*/
declare function createEvasionRegex(word: string): RegExp;
/**
* Menambahkan variasi ejaan Bahasa Indonesia
*
* @param pattern Pola regex asli
* @returns Pola regex dengan variasi ejaan Bahasa Indonesia
*/
declare function addIndonesianVariations(pattern: string): string;
/**
* Membuat regex untuk mencocokkan kata dengan mempertimbangkan variasi ejaan Bahasa Indonesia
*
* @param word Kata yang akan dibuat pola regexnya
* @returns Objek RegExp
*/
declare function createIndonesianVariationRegex(word: string): RegExp;
/**
* Membuat regex untuk mencocokkan kata dengan konteks
*
* @param word Kata yang akan dibuat pola regexnya
* @param contextSize Jumlah kata konteks sebelum dan sesudah
* @returns Objek RegExp
*/
declare function createContextRegex(word: string, contextSize?: number): RegExp;
/**
* Membuat regex untuk mencocokkan variasi penulisan kata
*
* @param word Kata dasar
* @returns Objek RegExp untuk mencocokkan berbagai bentuk kata
*/
declare function createWordFormRegex(word: string): RegExp;
/**
* Menghitung jarak Levenshtein antara dua string
* (Jumlah operasi insert, delete, atau replace untuk mengubah string1 menjadi string2)
*
* @param str1 String pertama
* @param str2 String kedua
* @returns Jarak Levenshtein
*/
declare function levenshteinDistance(str1: string, str2: string): number;
/**
* Menghitung tingkat kesamaan antara dua string
*
* @param str1 String pertama
* @param str2 String kedua
* @returns Nilai kesamaan (0-1, di mana 1 berarti identik)
*/
declare function stringSimilarity(str1: string, str2: string): number;
/**
* Mencari string yang paling mirip dari array
*
* @param target String target
* @param candidates Array string kandidat
* @param threshold Minimum kesamaan yang diterima (0-1)
* @returns String yang paling mirip atau null jika tidak ada yang di atas threshold
*/
declare function findMostSimilar(target: string, candidates: string[], threshold?: number): string | null;
/**
* Mencari string yang paling mirip dari array menggunakan Levenshtein distance
*
* @param target String target
* @param candidates Array string kandidat
* @param threshold Minimum kesamaan yang diterima (0-1)
* @param maxDistance Jarak Levenshtein maksimal yang diterima (default: 3)
* @returns String yang paling mirip atau null jika tidak ada yang di atas threshold
*/
declare function findMostSimilarWithLevenshtein(target: string, candidates: string[], threshold?: number, maxDistance?: number): string | null;
/**
* Cek apakah string mungkin merupakan variasi dari kata kotor
* menggunakan kesamaan string
*
* @param input String yang akan diperiksa
* @param profanityWords Daftar kata kotor
* @param threshold Batas minimum kesamaan (default: 0.75)
* @returns Array [Boolean (apakah variasi), String original (jika ditemukan)]
*/
declare function isPossibleProfanityVariation(input: string, profanityWords: string[], threshold?: number): [boolean, string | null];
/**
* Mengelompokkan kata berdasarkan kesamaan
*
* @param words Daftar kata
* @param threshold Batas minimum kesamaan (default: 0.8)
* @returns Array kluster kata yang mirip
*/
declare function clusterSimilarWords(words: string[], threshold?: number): string[][];
/**
* Cari kata-kata kotor yang mungkin dari teks menggunakan kesamaan string
* dengan optimasi untuk mengurangi kompleksitas
*
* @param text Teks yang akan diperiksa
* @param profanityWords Daftar kata kotor
* @param threshold Batas minimum kesamaan (default: 0.8)
* @returns Array kata yang mungkin merupakan kata kotor
*/
/**
* Cari kata-kata kotor yang mungkin dari teks berdasarkan kemiripan string
* dengan optimasi biar prosesnya nggak terlalu berat
*
* @param text Teks yang mau dicek
* @param profanityWords Daftar kata-kata kotor/kasar
* @param threshold Batas minimal kemiripan (default: 0.8)
* @returns Array kata yang kemungkinan kata kotor/kasar
*/
declare function findPossibleProfanityBySimiliarity(text: string, profanityWords: string[], threshold?: number): Array<{
word: string;
original: string;
similarity: number;
}>;
/**
* Cari kata-kata kotor yang mungkin dari teks menggunakan Levenshtein distance
*
* @param text Teks yang akan diperiksa
* @param profanityWords Daftar kata kotor
* @param threshold Batas minimum kesamaan (default: 0.8)
* @param maxDistance Jarak Levenshtein maksimal (default: 2)
* @returns Array kata yang mungkin merupakan kata kotor
*/
declare function findProfanityByLevenshteinDistance(text: string, profanityWords: string[], threshold?: number, maxDistance?: number): Array<{
word: string;
original: string;
similarity: number;
distance: number;
}>;
declare const DEFAULT_OPTIONS: FilterOptions;
declare const FILTER_PRESETS: {
strict: {
checkSubstring: boolean;
detectLeetSpeak: boolean;
severityThreshold: number;
replaceWith?: string;
fullWordCensor?: boolean;
wordList?: string[];
whitelist?: string[];
categories?: ProfanityCategory[];
regions?: Region[];
useRandomGrawlix?: boolean;
keepFirstAndLast?: boolean;
indonesianVariation?: boolean;
detectSimilarity?: boolean;
similarityThreshold?: number;
detectSplit?: boolean;
useLevenshtein?: boolean;
maxLevenshteinDistance?: number;
};
moderate: {
severityThreshold: number;
replaceWith?: string;
fullWordCensor?: boolean;
detectLeetSpeak?: boolean;
checkSubstring?: boolean;
wordList?: string[];
whitelist?: string[];
categories?: ProfanityCategory[];
regions?: Region[];
useRandomGrawlix?: boolean;
keepFirstAndLast?: boolean;
indonesianVariation?: boolean;
detectSimilarity?: boolean;
similarityThreshold?: number;
detectSplit?: boolean;
useLevenshtein?: boolean;
maxLevenshteinDistance?: number;
};
light: {
severityThreshold: number;
categories: ProfanityCategory[];
replaceWith?: string;
fullWordCensor?: boolean;
detectLeetSpeak?: boolean;
checkSubstring?: boolean;
wordList?: string[];
whitelist?: string[];
regions?: Region[];
useRandomGrawlix?: boolean;
keepFirstAndLast?: boolean;
indonesianVariation?: boolean;
detectSimilarity?: boolean;
similarityThreshold?: number;
detectSplit?: boolean;
useLevenshtein?: boolean;
maxLevenshteinDistance?: number;
};
childSafe: {
checkSubstring: boolean;
detectLeetSpeak: boolean;
fullWordCensor: boolean;
severityThreshold: number;
replaceWith?: string;
wordList?: string[];
whitelist?: string[];
categories?: ProfanityCategory[];
regions?: Region[];
useRandomGrawlix?: boolean;
keepFirstAndLast?: boolean;
indonesianVariation?: boolean;
detectSimilarity?: boolean;
similarityThreshold?: number;
detectSplit?: boolean;
useLevenshtein?: boolean;
maxLevenshteinDistance?: number;
};
};
declare const CATEGORY_PRESETS: {
sexual: {
categories: ProfanityCategory[];
replaceWith?: string;
fullWordCensor?: boolean;
detectLeetSpeak?: boolean;
checkSubstring?: boolean;
wordList?: string[];
whitelist?: string[];
regions?: Region[];
severityThreshold?: number;
useRandomGrawlix?: boolean;
keepFirstAndLast?: boolean;
indonesianVariation?: boolean;
detectSimilarity?: boolean;
similarityThreshold?: number;
detectSplit?: boolean;
useLevenshtein?: boolean;
maxLevenshteinDistance?: number;
};
insults: {
categories: ProfanityCategory[];
replaceWith?: string;
fullWordCensor?: boolean;
detectLeetSpeak?: boolean;
checkSubstring?: boolean;
wordList?: string[];
whitelist?: string[];
regions?: Region[];
severityThreshold?: number;
useRandomGrawlix?: boolean;
keepFirstAndLast?: boolean;
indonesianVariation?: boolean;
detectSimilarity?: boolean;
similarityThreshold?: number;
detectSplit?: boolean;
useLevenshtein?: boolean;
maxLevenshteinDistance?: number;
};
profanity: {
categories: ProfanityCategory[];
replaceWith?: string;
fullWordCensor?: boolean;
detectLeetSpeak?: boolean;
checkSubstring?: boolean;
wordList?: string[];
whitelist?: string[];
regions?: Region[];
severityThreshold?: number;
useRandomGrawlix?: boolean;
keepFirstAndLast?: boolean;
indonesianVariation?: boolean;
detectSimilarity?: boolean;
similarityThreshold?: number;
detectSplit?: boolean;
useLevenshtein?: boolean;
maxLevenshteinDistance?: number;
};
};
declare const REGION_PRESETS: {
general: {
regions: Region[];
replaceWith?: string;
fullWordCensor?: boolean;
detectLeetSpeak?: boolean;
checkSubstring?: boolean;
wordList?: string[];
whitelist?: string[];
categories?: ProfanityCategory[];
severityThreshold?: number;
useRandomGrawlix?: boolean;
keepFirstAndLast?: boolean;
indonesianVariation?: boolean;
detectSimilarity?: boolean;
similarityThreshold?: number;
detectSplit?: boolean;
useLevenshtein?: boolean;
maxLevenshteinDistance?: number;
};
jawa: {
regions: Region[];
replaceWith?: string;
fullWordCensor?: boolean;
detectLeetSpeak?: boolean;
checkSubstring?: boolean;
wordList?: string[];
whitelist?: string[];
categories?: ProfanityCategory[];
severityThreshold?: number;
useRandomGrawlix?: boolean;
keepFirstAndLast?: boolean;
indonesianVariation?: boolean;
detectSimilarity?: boolean;
similarityThreshold?: number;
detectSplit?: boolean;
useLevenshtein?: boolean;
maxLevenshteinDistance?: number;
};
sunda: {
regions: Region[];
replaceWith?: string;
fullWordCensor?: boolean;
detectLeetSpeak?: boolean;
checkSubstring?: boolean;
wordList?: string[];
whitelist?: string[];
categories?: ProfanityCategory[];
severityThreshold?: number;
useRandomGrawlix?: boolean;
keepFirstAndLast?: boolean;
indonesianVariation?: boolean;
detectSimilarity?: boolean;
similarityThreshold?: number;
detectSplit?: boolean;
useLevenshtein?: boolean;
maxLevenshteinDistance?: number;
};
betawi: {
regions: Region[];
replaceWith?: string;
fullWordCensor?: boolean;
detectLeetSpeak?: boolean;
checkSubstring?: boolean;
wordList?: string[];
whitelist?: string[];
categories?: ProfanityCategory[];
severityThreshold?: number;
useRandomGrawlix?: boolean;
keepFirstAndLast?: boolean;
indonesianVariation?: boolean;
detectSimilarity?: boolean;
similarityThreshold?: number;
detectSplit?: boolean;
useLevenshtein?: boolean;
maxLevenshteinDistance?: number;
};
batak: {
regions: Region[];
replaceWith?: string;
fullWordCensor?: boolean;
detectLeetSpeak?: boolean;
checkSubstring?: boolean;
wordList?: string[];
whitelist?: string[];
categories?: ProfanityCategory[];
severityThreshold?: number;
useRandomGrawlix?: boolean;
keepFirstAndLast?: boolean;
indonesianVariation?: boolean;
detectSimilarity?: boolean;
similarityThreshold?: number;
detectSplit?: boolean;
useLevenshtein?: boolean;
maxLevenshteinDistance?: number;
};
};
declare const REPLACEMENT_CHARS: {
asterisk: string;
hash: string;
dollar: string;
at: string;
percent: string;
underscore: string;
dash: string;
dot: string;
grawlix: string;
};
/**
* Membuat opsi custom dengan menggabungkan dengan default
*
* @param options Opsi yang akan digabungkan dengan default
* @returns Opsi yang sudah digabungkan
*/
declare function createOptions(options?: Partial<FilterOptions>): FilterOptions;
/**
* Mendapatkan opsi dari preset yang ada
*
* @param presetName Nama preset filter, kategori, atau region
* @param additionalOptions Opsi tambahan untuk mengganti preset
* @returns Opsi yang sudah digabungkan
*/
declare function getPresetOptions(presetName: string, additionalOptions?: Partial<FilterOptions>): FilterOptions;
/**
* Mendapatkan karakter pengganti
*
* @param type Tipe karakter pengganti
* @returns Karakter pengganti
*/
declare function getReplacementChar(type?: keyof typeof REPLACEMENT_CHARS): string;
/**
* Membuat karakter pengganti random dari grawlix
*
* @returns Karakter pengganti random
*/
declare function getRandomGrawlix(): string;
/**
* Membuat string pengganti untuk kata menggunakan grawlix random
*
* @param length Panjang string
* @returns String pengganti
*/
declare function makeRandomGrawlixString(length: number): string;
declare class IDProfanityFilter {
private options;
/**
* Membuat instance filter baru
* @param options Opsi untuk filter
*/
constructor(options?: FilterOptions);
/**
* Menyensor teks yang diberikan
* @param text Teks yang akan disensor
* @returns Hasil filter
*/
filter(text: string): FilterResult;
/**
* Memeriksa apakah teks mengandung kata kotor
* @param text Teks yang akan diperiksa
* @returns Boolean apakah teks mengandung kata kotor
*/
isProfane(text: string): boolean;
/**
* Menganalisis teks untuk kata kotor
* @param text Teks yang akan dianalisis
* @returns Hasil analisis
*/
analyze(text: string): AnalysisResult;
/**
* Menganalisis batch teks untuk kata kotor
* @param texts Array dari teks yang akan dianalisis
* @returns Hasil analisis batch
*/
batchAnalyze(texts: string[]): {
totalTexts: number;
profaneTexts: number;
cleanTexts: number;
averageSeverity: number;
topCategories: ProfanityCategory[];
topRegions: Region[];
mostFrequentWords: Array<{
word: string;
count: number;
}>;
};
/**
* Menganalisis teks per-kalimat
* @param text Teks yang akan dianalisis
* @returns Array hasil analisis per-kalimat
*/
analyzeBySentence(text: string): (AnalysisResult & {
sentence: string;
})[];
/**
* Menganalisis teks dengan konteks di sekitar kata kotor
* @param text Teks yang akan dianalisis
* @param contextWindowSize Jumlah kata konteks
* @returns Konteks di dekat kata kotor
*/
analyzeWithContext(text: string, contextWindowSize?: number): {
word: string;
context: string;
position: {
start: number;
end: number;
};
}[];
/**
* Mengubah opsi filter
* @param options Opsi baru untuk filter
*/
setOptions(options: Partial<FilterOptions>): void;
/**
* Menggunakan preset yang telah ditentukan
* @param presetName Nama preset yang akan digunakan
* @param additionalOptions Opsi tambahan untuk override
*/
usePreset(presetName: string, additionalOptions?: Partial<FilterOptions>): void;
/**
* Menetapkan daftar kata kustom
* @param wordList Daftar kata untuk digunakan
*/
setWordList(wordList: string[]): void;
/**
* Menambahkan kata ke whitelist
* @param word Kata yang akan diabaikan
*/
addToWhitelist(word: string): void;
/**
* Menghapus kata dari whitelist
* @param word Kata yang akan dihapus dari whitelist
*/
removeFromWhitelist(word: string): void;
/**
* Mengaktifkan deteksi variasi ejaan Indonesia
*/
enableIndonesianVariations(): void;
/**
* Mengaktifkan deteksi kata yang dipisah
*/
enableSplitWordDetection(): void;
/**
* Mengaktifkan deteksi berdasarkan kesamaan
* @param threshold Threshold kesamaan (0-1)
* @param useLevenshtein Gunakan algoritma Levenshtein untuk deteksi
* @param maxLevenshteinDistance Jarak maksimal Levenshtein (default: 2)
*/
enableSimilarityDetection(threshold?: number, useLevenshtein?: boolean, maxLevenshteinDistance?: number): void;
/**
* Mengaktifkan deteksi berbasis Levenshtein distance
* @param threshold Threshold kesamaan (0-1)
* @param maxDistance Jarak maksimal Levenshtein (default: 2)
*/
enableLevenshteinDetection(threshold?: number, maxDistance?: number): void;
}
declare const idFilter: {
filter: (text: string, options?: FilterOptions) => FilterResult;
isProfane: (text: string, options?: FilterOptions) => boolean;
analyze: (text: string, options?: FilterOptions) => AnalysisResult;
batchAnalyze: (texts: string[], options?: FilterOptions) => {
totalTexts: number;
profaneTexts: number;
cleanTexts: number;
averageSeverity: number;
topCategories: ProfanityCategory[];
topRegions: Region[];
mostFrequentWords: Array<{
word: string;
count: number;
}>;
};
getPresetOptions: typeof getPresetOptions;
presets: {
filter: {
strict: {
checkSubstring: boolean;
detectLeetSpeak: boolean;
severityThreshold: number;
replaceWith?: string;
fullWordCensor?: boolean;
wordList?: string[];
whitelist?: string[];
categories?: ProfanityCategory[];
regions?: Region[];
useRandomGrawlix?: boolean;
keepFirstAndLast?: boolean;
indonesianVariation?: boolean;
detectSimilarity?: boolean;
similarityThreshold?: number;
detectSplit?: boolean;
useLevenshtein?: boolean;
maxLevenshteinDistance?: number;
};
moderate: {
severityThreshold: number;
replaceWith?: string;
fullWordCensor?: boolean;
detectLeetSpeak?: boolean;
checkSubstring?: boolean;
wordList?: string[];
whitelist?: string[];
categories?: ProfanityCategory[];
regions?: Region[];
useRandomGrawlix?: boolean;
keepFirstAndLast?: boolean;
indonesianVariation?: boolean;
detectSimilarity?: boolean;
similarityThreshold?: number;
detectSplit?: boolean;
useLevenshtein?: boolean;
maxLevenshteinDistance?: number;
};
light: {
severityThreshold: number;
categories: ProfanityCategory[];
replaceWith?: string;
fullWordCensor?: boolean;
detectLeetSpeak?: boolean;
checkSubstring?: boolean;
wordList?: string[];
whitelist?: string[];
regions?: Region[];
useRandomGrawlix?: boolean;
keepFirstAndLast?: boolean;
indonesianVariation?: boolean;
detectSimilarity?: boolean;
similarityThreshold?: number;
detectSplit?: boolean;
useLevenshtein?: boolean;
maxLevenshteinDistance?: number;
};
childSafe: {
checkSubstring: boolean;
detectLeetSpeak: boolean;
fullWordCensor: boolean;
severityThreshold: number;
replaceWith?: string;
wordList?: string[];
whitelist?: string[];
categories?: ProfanityCategory[];
regions?: Region[];
useRandomGrawlix?: boolean;
keepFirstAndLast?: boolean;
indonesianVariation?: boolean;
detectSimilarity?: boolean;
similarityThreshold?: number;
detectSplit?: boolean;
useLevenshtein?: boolean;
maxLevenshteinDistance?: number;
};
};
category: {
sexual: {
categories: ProfanityCategory[];
replaceWith?: string;
fullWordCensor?: boolean;
detectLeetSpeak?: boolean;
checkSubstring?: boolean;
wordList?: string[];
whitelist?: string[];
regions?: Region[];
severityThreshold?: number;
useRandomGrawlix?: boolean;
keepFirstAndLast?: boolean;
indonesianVariation?: boolean;
detectSimilarity?: boolean;
similarityThreshold?: number;
detectSplit?: boolean;
useLevenshtein?: boolean;
maxLevenshteinDistance?: number;
};
insults: {
categories: ProfanityCategory[];
replaceWith?: string;
fullWordCensor?: boolean;
detectLeetSpeak?: boolean;
checkSubstring?: boolean;
wordList?: string[];
whitelist?: string[];
regions?: Region[];
severityThreshold?: number;
useRandomGrawlix?: boolean;
keepFirstAndLast?: boolean;
indonesianVariation?: boolean;
detectSimilarity?: boolean;
similarityThreshold?: number;
detectSplit?: boolean;
useLevenshtein?: boolean;
maxLevenshteinDistance?: number;
};
profanity: {
categories: ProfanityCategory[];
replaceWith?: string;
fullWordCensor?: boolean;
detectLeetSpeak?: boolean;
checkSubstring?: boolean;
wordList?: string[];
whitelist?: string[];
regions?: Region[];
severityThreshold?: number;
useRandomGrawlix?: boolean;
keepFirstAndLast?: boolean;
indonesianVariation?: boolean;
detectSimilarity?: boolean;
similarityThreshold?: number;
detectSplit?: boolean;
useLevenshtein?: boolean;
maxLevenshteinDistance?: number;
};
};
region: {
general: {
regions: Region[];
replaceWith?: string;
fullWordCensor?: boolean;
detectLeetSpeak?: boolean;
checkSubstring?: boolean;
wordList?: string[];
whitelist?: string[];
categories?: ProfanityCategory[];
severityThreshold?: number;
useRandomGrawlix?: boolean;
keepFirstAndLast?: boolean;
indonesianVariation?: boolean;
detectSimilarity?: boolean;
similarityThreshold?: number;
detectSplit?: boolean;
useLevenshtein?: boolean;
maxLevenshteinDistance?: number;
};
jawa: {
regions: Region[];
replaceWith?: string;
fullWordCensor?: boolean;
detectLeetSpeak?: boolean;
checkSubstring?: boolean;
wordList?: string[];
whitelist?: string[];
categories?: ProfanityCategory[];
severityThreshold?: number;
useRandomGrawlix?: boolean;
keepFirstAndLast?: boolean;
indonesianVariation?: boolean;
detectSimilarity?: boolean;
similarityThreshold?: number;
detectSplit?: boolean;
useLevenshtein?: boolean;
maxLevenshteinDistance?: number;
};
sunda: {
regions: Region[];
replaceWith?: string;
fullWordCensor?: boolean;
detectLeetSpeak?: boolean;
checkSubstring?: boolean;
wordList?: string[];
whitelist?: string[];
categories?: ProfanityCategory[];
severityThreshold?: number;
useRandomGrawlix?: boolean;
keepFirstAndLast?: boolean;
indonesianVariation?: boolean;
detectSimilarity?: boolean;
similarityThreshold?: number;
detectSplit?: boolean;
useLevenshtein?: boolean;
maxLevenshteinDistance?: number;
};
betawi: {
regions: Region[];
replaceWith?: string;
fullWordCensor?: boolean;
detectLeetSpeak?: boolean;
checkSubstring?: boolean;
wordList?: string[];
whitelist?: string[];
categories?: ProfanityCategory[];
severityThreshold?: number;
useRandomGrawlix?: boolean;
keepFirstAndLast?: boolean;
indonesianVariation?: boolean;
detectSimilarity?: boolean;
similarityThreshold?: number;
detectSplit?: boolean;
useLevenshtein?: boolean;
maxLevenshteinDistance?: number;
};
batak: {
regions: Region[];
replaceWith?: string;
fullWordCensor?: boolean;
detectLeetSpeak?: boolean;
checkSubstring?: boolean;
wordList?: string[];
whitelist?: string[];
categories?: ProfanityCategory[];
severityThreshold?: number;
useRandomGrawlix?: boolean;
keepFirstAndLast?: boolean;
indonesianVariation?: boolean;
detectSimilarity?: boolean;
similarityThreshold?: number;
detectSplit?: boolean;
useLevenshtein?: boolean;
maxLevenshteinDistance?: number;
};
};
};
};
export { CATEGORY_PRESETS, DEFAULT_OPTIONS, FILTER_PRESETS, IDProfanityFilter, REGION_PRESETS, REPLACEMENT_CHARS, addIndonesianVariations, addLeetSpeakVariations, addSplitVariations, analyze, analyzeBySentence, analyzeWithContext, batchAnalyze, calculateSeverity, censorWord, clusterSimilarWords, containsAnyWord, containsEuphemism, createContextRegex, createEvasionRegex, createIndonesianVariationRegex, createOptions, createWordFormRegex, createWordRegex, IDProfanityFilter as default, detectSplitWords, escapeRegExp, filter, findCategories, findMostSimilar, findMostSimilarWithLevenshtein, findPossibleProfanityBySimiliarity, findProfanity, findProfanityByLevenshteinDistance, findProfanityWithMetadata, findRegions, getContextAroundIndex, getPresetOptions, getRandomGrawlix, getReplacementChar, idFilter, isPossibleProfanityVariation, isProfane, levenshteinDistance, makeRandomGrawlixString, maskText, normalizeText, splitIntoSentences, stringSimilarity, toLeetSpeak };
export type { AnalysisResult, FilterOptions, FilterResult, ProfanityCategory, ProfanityWord, RegexOptions, Region };