<p align="center">
<a href="https://www.glincker.com/tools/glin-profanity" target="_blank">
<img src="../../og-image.png" alt="Glin Profanity - ML-Powered Profanity Detection" width="800" />
</a>
</p>
<h1 align="center">GLIN PROFANITY - JavaScript/TypeScript</h1>
<p align="center">
<strong>ML-Powered Profanity Detection for the Modern Web</strong>
</p>
<p align="center">
<a href="https://www.npmjs.com/package/glin-profanity"><img src="https://img.shields.io/npm/v/glin-profanity" alt="NPM" /></a>
<a href="https://github.com/GLINCKER/glin-profanity/blob/main/LICENSE"><img src="https://img.shields.io/badge/license-MIT-green" alt="MIT" /></a>
<a href="https://www.npmjs.com/package/glin-profanity"><img src="https://img.shields.io/npm/dw/glin-profanity" alt="Downloads" /></a>
<a href="https://www.glincker.com/tools/glin-profanity"><img src="https://img.shields.io/badge/Live_Demo-online-blue" alt="Demo" /></a>
</p>
---
## Installation
```bash
npm install glin-profanity
```
## Quick Start
```javascript
import { checkProfanity, Filter } from 'glin-profanity';
// Simple check
const result = checkProfanity("This is f4ck1ng bad", {
detectLeetspeak: true,
languages: ['english']
});
result.containsProfanity // true
result.profaneWords // ['fucking']
// With replacement
const filter = new Filter({
replaceWith: '***',
detectLeetspeak: true
});
filter.checkProfanity("sh1t happens").processedText // "*** happens"
```
## React Hook
```tsx
import { useProfanityChecker } from 'glin-profanity';
function ChatInput() {
const { result, checkText } = useProfanityChecker({
detectLeetspeak: true
});
return (
<>
<input onChange={(e) => checkText(e.target.value)} />
{result?.containsProfanity && <span>Clean up your language</span>}
</>
);
}
```
## Features
| Feature | Description |
|---------|-------------|
| Leetspeak detection | Catches `f4ck`, `sh1t`, `@ss` |
| Unicode normalization | Handles Cyrillic/Greek lookalikes |
| ML toxicity detection | TensorFlow.js integration |
| 23 languages | Arabic to Turkish |
| Result caching | LRU cache for repeated checks |
| React hook | `useProfanityChecker` built-in |
## API
### Core Functions
```typescript
// Full check with options
checkProfanity(text: string, config?: FilterConfig): ProfanityCheckResult
// Quick boolean check
isProfane(text: string): boolean
// Async version
checkProfanityAsync(text: string, config?: FilterConfig): Promise<ProfanityCheckResult>
```
### Filter Class
```typescript
const filter = new Filter({
languages: ['english', 'spanish'],
detectLeetspeak: true,
leetspeakLevel: 'moderate', // basic | moderate | aggressive
normalizeUnicode: true,
cacheResults: true,
maxCacheSize: 1000,
replaceWith: '***'
});
filter.isProfane('f4ck'); // true
filter.checkProfanity('bad word').profaneWords; // ['bad']
filter.clearCache();
```
### Configuration Options
| Option | Type | Default | Description |
|--------|------|---------|-------------|
| `languages` | `string[]` | `['english']` | Languages to check |
| `allLanguages` | `boolean` | `false` | Check all 23 languages |
| `detectLeetspeak` | `boolean` | `false` | Enable leetspeak detection |
| `leetspeakLevel` | `string` | `'basic'` | `basic` / `moderate` / `aggressive` |
| `normalizeUnicode` | `boolean` | `true` | Normalize Unicode homoglyphs |
| `cacheResults` | `boolean` | `false` | Cache results for repeated checks |
| `maxCacheSize` | `number` | `1000` | LRU cache limit |
| `replaceWith` | `string` | `undefined` | Replacement string |
| `customWords` | `string[]` | `[]` | Add custom profane words |
| `ignoreWords` | `string[]` | `[]` | Whitelist words |
| `severityLevels` | `boolean` | `false` | Enable severity mapping |
## Documentation
| Resource | Link |
|----------|------|
| Getting Started | [docs/getting-started.md](../../docs/getting-started.md) |
| API Reference | [docs/api-reference.md](../../docs/api-reference.md) |
| Framework Examples | [docs/framework-examples.md](../../docs/framework-examples.md) |
| Advanced Features | [docs/advanced-features.md](../../docs/advanced-features.md) |
| ML Guide | [docs/ML-GUIDE.md](../../docs/ML-GUIDE.md) |
| Main README | [README.md](../../README.md) |
## License
MIT License - see [LICENSE](../../LICENSE)
---
<div align="center">
<sub>Built by <a href="https://glincker.com">GLINCKER</a></sub>
</div>