UNPKG

@nkzw/profane

Version:

Zero dependency profanity detector.

488 lines (485 loc) 13 kB
// 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 };