@nkzw/profane
Version:
Zero dependency profanity detector.
488 lines (485 loc) • 13 kB
JavaScript
// src/badwords-en.json
var badwords_en_default = {
anus: ["sexual"],
arse: ["insult"],
arsehole: ["insult"],
"ass-hat": ["insult"],
"ass-pirate": ["discriminatory"],
ass: ["sexual", "insult"],
assbag: ["insult"],
assbandit: ["discriminatory"],
assbanger: ["discriminatory"],
assbite: ["insult"],
assclown: ["sexual"],
asscock: ["insult"],
asscracker: ["sexual"],
assface: ["sexual"],
assfuck: ["sexual"],
assfucker: ["discriminatory"],
assgoblin: ["discriminatory"],
asshat: ["sexual"],
asshead: ["insult"],
asshole: ["insult"],
asshopper: ["discriminatory"],
assjacker: ["discriminatory"],
asslick: ["insult"],
asslicker: ["insult"],
assmonkey: ["insult"],
assmunch: ["insult"],
assmuncher: ["sexual"],
assnigger: ["discriminatory"],
asspirate: ["discriminatory"],
assshit: ["insult"],
assshole: ["sexual"],
asssucker: ["insult"],
asswad: ["sexual"],
asswipe: ["sexual"],
bampot: ["insult"],
bastard: ["insult"],
beaner: ["discriminatory"],
beastial: ["sexual"],
beastiality: ["sexual"],
beastility: ["sexual"],
bestial: ["sexual"],
bestiality: ["sexual"],
bitch: ["insult"],
bitchass: ["insult"],
bitcher: ["insult"],
bitchin: ["inappropriate"],
bitching: ["inappropriate"],
bitchtit: ["discriminatory"],
bitchy: ["insult"],
"blow job": ["sexual"],
blowjob: ["sexual"],
bollocks: ["sexual"],
bollox: ["sexual"],
boner: ["sexual"],
bullshit: ["inappropriate"],
"butt plug": ["sexual"],
"camel toe": ["sexual"],
choad: ["sexual"],
chode: ["sexual"],
clit: ["sexual"],
clitface: ["insult"],
clitfuck: ["sexual"],
clusterfuck: ["inappropriate"],
cock: ["sexual"],
cockbite: ["insult"],
cockburger: ["insult"],
cockface: ["insult"],
cockfucker: ["insult"],
cockhead: ["insult"],
cockmonkey: ["insult"],
cocknose: ["insult"],
cocknugget: ["insult"],
cockshit: ["insult"],
cocksuck: ["sexual"],
cocksucked: ["sexual"],
cocksucker: ["discriminatory", "sexual"],
cocksucking: ["sexual", "discriminatory"],
cocksucks: ["sexual", "discriminatory"],
coochie: ["sexual"],
coochy: ["sexual"],
coon: ["discriminatory", "racist"],
cooter: ["sexual"],
cracka: ["discriminatory", "racist"],
cracker: ["discriminatory", "racist"],
cum: ["sexual"],
cumbubble: ["insult"],
cumdumpster: ["sexual"],
cummer: ["sexual"],
cumming: ["sexual"],
cumshot: ["sexual"],
cumslut: ["sexual", "insult"],
cumtart: ["insult"],
cunillingus: ["sexual"],
cunnie: ["sexual"],
cunnilingus: ["sexual"],
cunt: ["insult", "sexual"],
cuntface: ["insult"],
cunthole: ["sexual"],
cuntlick: ["sexual"],
cuntlicker: ["sexual", "discriminatory"],
cuntlicking: ["sexual"],
cuntrag: ["insult"],
cuntslut: ["insult"],
cyberfuc: ["sexual"],
cyberfuck: ["sexual"],
cyberfucked: ["sexual"],
cyberfucker: ["sexual"],
cyberfucking: ["sexual"],
dago: ["discriminatory"],
damn: ["inappropriate"],
deggo: ["discriminatory"],
dick: ["sexual", "insult"],
dickbag: ["insult"],
dickbeaters: ["sexual"],
dickface: ["insult"],
dickfuck: ["insult"],
dickhead: ["insult"],
dickhole: ["sexual"],
dickjuice: ["sexual"],
dickmilk: ["sexual"],
dickslap: ["sexual"],
dickwad: ["insult"],
dickweasel: ["insult"],
dickweed: ["insult"],
dickwod: ["insult"],
dildo: ["sexual"],
dink: ["insult", "sexual"],
dipshit: ["insult"],
doochbag: ["insult"],
dookie: ["inappropriate"],
"douche-fag": ["insult"],
douche: ["insult"],
douchebag: ["insult"],
douchewaffle: ["discriminatory"],
dumass: ["insult"],
"dumb ass": ["insult"],
dumbass: ["insult"],
dumbfuck: ["insult"],
dumbshit: ["insult"],
dumshit: ["insult"],
ejaculate: ["sexual"],
ejaculated: ["sexual"],
ejaculates: ["sexual"],
ejaculating: ["sexual"],
ejaculation: ["sexual"],
fag: ["discriminatory", "sexist"],
fagbag: ["discriminatory", "sexist"],
fagfucker: ["discriminatory", "sexist"],
fagging: ["discriminatory", "sexist"],
faggit: ["discriminatory", "sexist"],
faggot: ["discriminatory", "sexist"],
faggotcock: ["discriminatory", "sexist"],
faggs: ["discriminatory", "sexist"],
fagot: ["discriminatory", "sexist"],
fags: ["discriminatory", "sexist"],
fagtard: ["discriminatory", "sexist"],
fart: ["inappropriate"],
farted: ["inappropriate"],
farting: ["inappropriate"],
farty: ["inappropriate"],
fatass: ["insult"],
felatio: ["sexual"],
fellatio: ["sexual"],
feltch: ["sexual"],
fingerfuck: ["sexual"],
fingerfucked: ["sexual"],
fingerfucker: ["sexual"],
fingerfucking: ["sexual"],
fingerfucks: ["sexual"],
fistfuck: ["sexual"],
fistfucked: ["sexual"],
fistfucker: ["sexual"],
fistfucking: ["sexual"],
flamer: ["discriminatory", "sexist"],
fuck: ["sexual"],
fuckass: ["insult"],
fuckbag: ["insult"],
fuckboy: ["insult"],
fuckbrain: ["insult"],
fuckbutt: ["sexual"],
fucked: ["sexual"],
fucker: ["sexual", "insult"],
fuckersucker: ["insult"],
fuckface: ["insult"],
fuckhead: ["sexual"],
fuckhole: ["insult"],
fuckin: ["sexual"],
fucking: ["sexual"],
fuckme: ["sexual"],
fucknut: ["insult"],
fucknutt: ["insult"],
fuckoff: ["insult"],
fuckstick: ["sexual"],
fucktard: ["insult"],
fuckup: ["insult"],
fuckwad: ["insult"],
fuckwit: ["insult"],
fuckwitt: ["insult"],
fudgepacker: ["discriminatory", "sexist"],
fuk: ["sexual"],
gangbang: ["sexual"],
gangbanged: ["sexual"],
goddamn: ["inappropriate", "blasphemy"],
goddamnit: ["inappropriate", "blasphemy"],
gooch: ["sexual"],
gook: ["discriminatory"],
gringo: ["discriminatory"],
guido: ["discriminatory"],
handjob: ["sexual"],
hardcoresex: ["sexual"],
heeb: ["discriminatory", "racist", "religious"],
hell: ["inappropriate", "religious"],
ho: ["discriminatory", "sexist"],
hoe: ["discriminatory", "sexist"],
homo: ["discriminatory", "sexist"],
homodumbshit: ["insult"],
honkey: ["discriminatory", "racist"],
horniest: ["sexual"],
horny: ["sexual"],
hotsex: ["sexual"],
humping: ["sexual"],
jackass: ["insult"],
jap: ["discriminatory", "racist"],
jigaboo: ["discriminatory", "racist"],
jism: ["sexual"],
jiz: ["sexual"],
jizm: ["sexual"],
jizz: ["sexual"],
"jungle bunny": ["discriminatory", "racist"],
junglebunny: ["discriminatory", "racist"],
kike: ["discriminatory", "racist", "religious"],
kock: ["sexual"],
kondum: ["sexual"],
kooch: ["sexual"],
kootch: ["sexual"],
kum: ["sexual"],
kumer: ["sexual"],
kummer: ["sexual"],
kumming: ["sexual"],
kums: ["sexual"],
kunilingus: ["sexual"],
kunt: ["sexual"],
kyke: ["discriminatory"],
lezzie: ["discriminatory", "sexist"],
lust: ["sexual"],
lusting: ["sexual"],
mcfagget: ["discriminatory"],
mick: ["discriminatory", "racist"],
minge: ["sexual"],
mothafuck: ["sexual"],
mothafucka: ["sexual", "insult"],
mothafuckaz: ["sexual"],
mothafucked: ["sexual"],
mothafucker: ["sexual", "insult"],
mothafuckin: ["sexual"],
mothafucking: ["sexual"],
mothafucks: ["sexual"],
motherfuck: ["sexual"],
motherfucked: ["sexual"],
motherfucker: ["sexual", "insult"],
motherfuckin: ["sexual"],
motherfucking: ["sexual"],
muff: ["sexual"],
muffdiver: ["discriminatory", "sexual"],
munging: ["sexual"],
negro: ["discriminatory"],
nigga: ["discriminatory", "racist"],
nigger: ["discriminatory", "racist"],
niglet: ["discriminatory"],
"nut sack": ["sexual"],
nutsack: ["sexual"],
orgasim: ["sexual"],
orgasm: ["sexual"],
paki: ["discriminatory"],
panooch: ["sexual"],
pecker: ["sexual"],
peckerhead: ["insult"],
penis: ["sexual"],
penisfucker: ["discriminatory"],
penispuffer: ["discriminatory"],
phonesex: ["sexual"],
phuk: ["sexual"],
phuked: ["sexual"],
phuking: ["sexual"],
phukked: ["sexual"],
phukking: ["sexual"],
phuks: ["sexual"],
phuq: ["sexual"],
pis: ["sexual"],
pises: ["sexual"],
pisin: ["sexual"],
pising: ["sexual"],
pisof: ["sexual"],
piss: ["inappropriate"],
pissed: ["inappropriate"],
pisser: ["sexual"],
pisses: ["sexual"],
pissflaps: ["sexual"],
pissin: ["sexual"],
pissing: ["sexual"],
pissoff: ["sexual"],
polesmoker: ["discriminatory"],
pollock: ["discriminatory"],
poon: ["sexual"],
poonani: ["sexual"],
poonany: ["sexual"],
poontang: ["sexual"],
"porch monkey": ["discriminatory"],
porchmonkey: ["discriminatory"],
porn: ["sexual"],
porno: ["sexual"],
pornography: ["sexual"],
pornos: ["sexual"],
prick: ["sexual"],
punanny: ["sexual"],
punta: ["insult"],
pusies: ["sexual", "insult"],
pussies: ["sexual", "insult"],
pussy: ["sexual", "insult"],
pussylicking: ["sexual"],
pusy: ["sexual"],
puto: ["insult"],
renob: ["sexual"],
rimjob: ["sexual"],
ruski: ["discriminatory"],
sandnigger: ["discriminatory"],
schlong: ["sexual"],
scrote: ["sexual"],
shit: ["sexual", "inappropriate"],
shitass: ["insult"],
shitbag: ["insult"],
shitbagger: ["insult"],
shitbrain: ["insult"],
shitbreath: ["insult"],
shitcunt: ["insult"],
shitdick: ["insult"],
shited: ["sexual"],
shitface: ["insult"],
shitfaced: ["inappropriate", "insult"],
shitfull: ["sexual"],
shithead: ["insult"],
shithole: ["insult"],
shithouse: ["inappropriate"],
shiting: ["sexual"],
shitspitter: ["sexual"],
shitstain: ["inappropriate", "insult"],
shitted: ["sexual"],
shitter: ["sexual"],
shittiest: ["inappropriate"],
shitting: ["inappropriate"],
shitty: ["inappropriate"],
shity: ["sexual"],
shiz: ["inappropriate"],
shiznit: ["inappropriate"],
skank: ["insult"],
skeet: ["sexual"],
skullfuck: ["sexual"],
slut: ["discriminatory"],
slutbag: ["discriminatory"],
sluts: ["sexual"],
smeg: ["inappropriate"],
smut: ["sexual"],
snatch: ["sexual"],
spic: ["discriminatory"],
spick: ["discriminatory"],
splooge: ["sexual"],
spunk: ["sexual"],
tard: ["discriminatory"],
testicle: ["sexual"],
thundercunt: ["insult"],
tit: ["sexual"],
titfuck: ["sexual"],
tits: ["sexual"],
tittyfuck: ["sexual"],
twat: ["sexual"],
twatlips: ["insult"],
twatwaffle: ["discriminatory"],
unclefucker: ["discriminatory"],
"va-j-j": ["sexual"],
vag: ["sexual"],
vagina: ["sexual"],
vjayjay: ["sexual"],
wank: ["sexual"],
wetback: ["discriminatory"],
whore: ["insult"],
whorebag: ["insult"],
whoreface: ["insult"],
wog: ["discriminatory", "racist"],
wop: ["discriminatory", "racist"]
};
// node_modules/.pnpm/escape-string-regexp@5.0.0/node_modules/escape-string-regexp/index.js
function escapeStringRegexp(string) {
if (typeof string !== "string") {
throw new TypeError("Expected a string");
}
return string.replace(/[|\\{}()[\]^$+*?.]/g, "\\$&").replace(/-/g, "\\x2d");
}
// src/profane.ts
var NORMALIZERS = [
[/0/g, "o"],
[/1/g, "i"],
[/3/g, "e"],
[/4/g, "a"],
[/5/g, "s"],
[/6/g, "g"],
[/7/g, "t"],
[/8/g, "b"],
[/ph/g, "f"]
];
var normalize = (text) => {
NORMALIZERS.forEach(([word, replacement]) => {
text = text.replace(word, replacement);
});
return text;
};
function getWordList() {
const copy = {};
for (const [key, value] of Object.entries(badwords_en_default)) {
copy[key] = value;
}
return copy;
}
var Profane = class {
constructor(options = { normalize: true, wholeWordsOnly: false, words: badwords_en_default }) {
this.options = options;
this.words = this.options.words || badwords_en_default;
this.options.normalize = !("normalize" in this.options) ? true : this.options.normalize;
}
words;
scan(text, callback) {
if (this.options.normalize) {
text = normalize(text);
}
Object.keys(this.words).forEach((badWord) => {
const regex = new RegExp(
this.options.wholeWordsOnly ? "\\b" + escapeStringRegexp(badWord) + "\\b" : escapeStringRegexp(badWord),
"ig"
);
let match;
while (match = regex.exec(text)) {
if (callback(match[0], match.index, this.words[badWord]) === false) {
break;
}
}
});
}
check(text) {
let hasWord = false;
this.scan(text, () => {
hasWord = true;
return false;
});
return hasWord;
}
censor(censored, replacement = "*") {
this.scan(censored, (word, index) => {
censored = censored.substring(0, index) + word.replace(/\S/g, replacement) + censored.substring(index + word.length);
});
return censored;
}
getWordFrequencies(text) {
const frequencies = {};
this.scan(text, (word) => {
word = word.toLowerCase();
frequencies[word] = (frequencies[word] || 0) + 1;
});
return frequencies;
}
getCategoryFrequencies(text) {
const frequencies = {};
this.scan(
text,
(_, __, categories) => categories.forEach((category) => {
frequencies[category] = (frequencies[category] || 0) + 1;
})
);
return frequencies;
}
};
export {
Profane as default,
getWordList
};