├── .gitignore ├── .travis.yml ├── LICENSE ├── README.md ├── lib ├── config │ └── en_US.json └── swearjar.js ├── package.json └── test └── test.js /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - "7" 4 | - "6" 5 | - "5" 6 | - "4" 7 | - "0.12" 8 | - "0.11" 9 | - "0.10" 10 | - "0.8" 11 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2014 Ramon Torres 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # swearjar-node 2 | 3 | Profanity detection and filtering library. 4 | 5 | [![Build Status](https://travis-ci.org/raymondjavaxx/swearjar-node.svg?branch=master)](https://travis-ci.org/raymondjavaxx/swearjar-node) 6 | 7 | ## Installation 8 | 9 | npm install --save swearjar 10 | 11 | ## Usage 12 | 13 | ### swearjar.profane(text) 14 | 15 | Returns true if the given string contains profanity. 16 | 17 | var swearjar = require('swearjar'); 18 | swearjar.profane("hello there"); // false 19 | swearjar.profane("hello mother f-bomb"); // true 20 | 21 | ### swearjar.censor(text) 22 | 23 | Replaces profanity with asterisks. 24 | 25 | var clean = swearjar.censor("f-bomb you"); // **** you 26 | 27 | ### swearjar.scorecard(text) 28 | 29 | Generates a report from the given text. 30 | 31 | swearjar.scorecard("f-bomb you"); // {sexual: 1, inappropriate: 1} 32 | 33 | ### swearjar.loadBadWords(path) 34 | 35 | Loads a dictionary of words to be used as filter. 36 | 37 | NOTE: A US English default list located in the config directory is included and loaded by default. 38 | 39 | swearjar.loadBadWords('./config/profanity.json'); 40 | 41 | A dictionary is just a plain JSON file containing an object where its keys are the words to check for and the values are arrays of categories where the words fall in. 42 | 43 | { 44 | "word1": ["category1", "category2"], 45 | "word2": ["category1"], 46 | "word3": ["category2"] 47 | } 48 | 49 | ## Acknowledgements 50 | 51 | `swearjar-node` is based on [Swearjar](https://github.com/joshbuddy/swearjar) (Ruby) and [Swearjar PHP](https://github.com/raymondjavaxx/swearjar-php). 52 | -------------------------------------------------------------------------------- /lib/config/en_US.json: -------------------------------------------------------------------------------- 1 | { 2 | "anus": ["sexual"], 3 | "arse": ["insult"], 4 | "arsehole": ["insult"], 5 | "ass": ["sexual","insult"], 6 | "ass-hat": ["insult"], 7 | "ass-pirate": ["discriminatory"], 8 | "assbag": ["insult"], 9 | "assbandit": ["discriminatory"], 10 | "assbanger": ["discriminatory"], 11 | "assbite": ["insult"], 12 | "assclown": ["sexual"], 13 | "asscock": ["insult"], 14 | "asscracker": ["sexual"], 15 | "assface": ["sexual"], 16 | "assfuck": ["sexual"], 17 | "assfucker": ["discriminatory"], 18 | "assgoblin": ["discriminatory"], 19 | "asshat": ["sexual"], 20 | "asshead": ["insult"], 21 | "asshole": ["insult"], 22 | "asshopper": ["discriminatory"], 23 | "assjacker": ["discriminatory"], 24 | "asslick": ["insult"], 25 | "asslicker": ["insult"], 26 | "assmonkey": ["insult"], 27 | "assmunch": ["insult"], 28 | "assmuncher": ["sexual"], 29 | "assnigger": ["discriminatory"], 30 | "asspirate": ["discriminatory"], 31 | "assshit": ["insult"], 32 | "assshole": ["sexual"], 33 | "asssucker": ["insult"], 34 | "asswad": ["sexual"], 35 | "asswipe": ["sexual"], 36 | "bampot": ["insult"], 37 | "bastard": ["insult"], 38 | "beaner": ["discriminatory"], 39 | "beastial": ["sexual"], 40 | "beastiality": ["sexual"], 41 | "beastility": ["sexual"], 42 | "bestial": ["sexual"], 43 | "bestiality": ["sexual"], 44 | "bitch": ["insult"], 45 | "bitchass": ["insult"], 46 | "bitcher": ["insult"], 47 | "bitchin": ["inappropriate"], 48 | "bitching": ["inappropriate"], 49 | "bitchtit": ["discriminatory"], 50 | "bitchy": ["insult"], 51 | "blow job": ["sexual"], 52 | "blowjob": ["sexual"], 53 | "bollocks": ["sexual"], 54 | "bollox": ["sexual"], 55 | "boner": ["sexual"], 56 | "bullshit": ["inappropriate"], 57 | "butt plug": ["sexual"], 58 | "camel toe": ["sexual"], 59 | "choad": ["sexual"], 60 | "chode": ["sexual"], 61 | "clit": ["sexual"], 62 | "clitface": ["insult"], 63 | "clitfuck": ["sexual"], 64 | "clusterfuck": ["inappropriate"], 65 | "cock": ["sexual"], 66 | "cockbite": ["insult"], 67 | "cockburger": ["insult"], 68 | "cockface": ["insult"], 69 | "cockfucker": ["insult"], 70 | "cockhead": ["insult"], 71 | "cockmonkey": ["insult"], 72 | "cocknose": ["insult"], 73 | "cocknugget": ["insult"], 74 | "cockshit": ["insult"], 75 | "cocksuck": ["sexual"], 76 | "cocksucked": ["sexual"], 77 | "cocksucker": ["discriminatory","sexual"], 78 | "cocksucking": ["sexual","discriminatory"], 79 | "cocksucks": ["sexual","discriminatory"], 80 | "coochie": ["sexual"], 81 | "coochy": ["sexual"], 82 | "cooter": ["sexual"], 83 | "cum": ["sexual"], 84 | "cumbubble": ["insult"], 85 | "cumdumpster": ["sexual"], 86 | "cummer": ["sexual"], 87 | "cumming": ["sexual"], 88 | "cumshot": ["sexual"], 89 | "cumslut": ["sexual","insult"], 90 | "cumtart": ["insult"], 91 | "cunillingus": ["sexual"], 92 | "cunnie": ["sexual"], 93 | "cunnilingus": ["sexual"], 94 | "cunt": ["insult","sexual"], 95 | "cuntface": ["insult"], 96 | "cunthole": ["sexual"], 97 | "cuntlick": ["sexual"], 98 | "cuntlicker": ["sexual","discriminatory"], 99 | "cuntlicking": ["sexual"], 100 | "cuntrag": ["insult"], 101 | "cuntslut": ["insult"], 102 | "cyberfuc": ["sexual"], 103 | "cyberfuck": ["sexual"], 104 | "cyberfucked": ["sexual"], 105 | "cyberfucker": ["sexual"], 106 | "cyberfucking": ["sexual"], 107 | "dago": ["discriminatory"], 108 | "damn": ["inappropriate"], 109 | "deggo": ["discriminatory"], 110 | "dick": ["sexual","insult"], 111 | "dickbag": ["insult"], 112 | "dickbeaters": ["sexual"], 113 | "dickface": ["insult"], 114 | "dickfuck": ["insult"], 115 | "dickhead": ["insult"], 116 | "dickhole": ["sexual"], 117 | "dickjuice": ["sexual"], 118 | "dickmilk": ["sexual"], 119 | "dickslap": ["sexual"], 120 | "dickwad": ["insult"], 121 | "dickweasel": ["insult"], 122 | "dickweed": ["insult"], 123 | "dickwod": ["insult"], 124 | "dildo": ["sexual"], 125 | "dink": ["insult","sexual"], 126 | "dipshit": ["insult"], 127 | "doochbag": ["insult"], 128 | "dookie": ["inappropriate"], 129 | "douche": ["insult"], 130 | "douche-fag": ["insult"], 131 | "douchebag": ["insult"], 132 | "douchewaffle": ["discriminatory"], 133 | "dumass": ["insult"], 134 | "dumb ass": ["insult"], 135 | "dumbass": ["insult"], 136 | "dumbfuck": ["insult"], 137 | "dumbshit": ["insult"], 138 | "dumshit": ["insult"], 139 | "ejaculate": ["sexual"], 140 | "ejaculated": ["sexual"], 141 | "ejaculates": ["sexual"], 142 | "ejaculating": ["sexual"], 143 | "ejaculation": ["sexual"], 144 | "fag": ["discriminatory"], 145 | "fagbag": ["discriminatory"], 146 | "fagfucker": ["discriminatory"], 147 | "fagging": ["discriminatory"], 148 | "faggit": ["discriminatory"], 149 | "faggot": ["discriminatory"], 150 | "faggotcock": ["discriminatory"], 151 | "faggs": ["discriminatory"], 152 | "fagot": ["discriminatory"], 153 | "fags": ["discriminatory"], 154 | "fagtard": ["discriminatory"], 155 | "fart": ["inappropriate"], 156 | "farted": ["inappropriate"], 157 | "farting": ["inappropriate"], 158 | "farty": ["inappropriate"], 159 | "fatass": ["insult"], 160 | "felatio": ["sexual"], 161 | "fellatio": ["sexual"], 162 | "feltch": ["sexual"], 163 | "fingerfuck": ["sexual"], 164 | "fingerfucked": ["sexual"], 165 | "fingerfucker": ["sexual"], 166 | "fingerfucking": ["sexual"], 167 | "fingerfucks": ["sexual"], 168 | "fistfuck": ["sexual"], 169 | "fistfucked": ["sexual"], 170 | "fistfucker": ["sexual"], 171 | "fistfucking": ["sexual"], 172 | "flamer": ["discriminatory"], 173 | "fuck": ["sexual"], 174 | "fuckass": ["insult"], 175 | "fuckbag": ["insult"], 176 | "fuckboy": ["insult"], 177 | "fuckbrain": ["insult"], 178 | "fuckbutt": ["sexual"], 179 | "fucked": ["sexual"], 180 | "fucker": ["sexual","insult"], 181 | "fuckersucker": ["insult"], 182 | "fuckface": ["insult"], 183 | "fuckhead": ["sexual"], 184 | "fuckhole": ["insult"], 185 | "fuckin": ["sexual"], 186 | "fucking": ["sexual"], 187 | "fuckme": ["sexual"], 188 | "fucknut": ["insult"], 189 | "fucknutt": ["insult"], 190 | "fuckoff": ["insult"], 191 | "fuckstick": ["sexual"], 192 | "fucktard": ["insult"], 193 | "fuckup": ["insult"], 194 | "fuckwad": ["insult"], 195 | "fuckwit": ["insult"], 196 | "fuckwitt": ["insult"], 197 | "fudgepacker": ["discriminatory"], 198 | "fuk": ["sexual"], 199 | "gangbang": ["sexual"], 200 | "gangbanged": ["sexual"], 201 | "goddamn": ["inappropriate","blasphemy"], 202 | "goddamnit": ["inappropriate","blasphemy"], 203 | "gooch": ["sexual"], 204 | "gook": ["discriminatory"], 205 | "gringo": ["discriminatory"], 206 | "guido": ["discriminatory"], 207 | "handjob": ["sexual"], 208 | "hardcoresex": ["sexual"], 209 | "heeb": ["discriminatory"], 210 | "hell": ["inappropriate"], 211 | "ho": ["discriminatory"], 212 | "hoe": ["discriminatory"], 213 | "homo": ["discriminatory"], 214 | "homodumbshit": ["insult"], 215 | "honkey": ["discriminatory"], 216 | "horniest": ["sexual"], 217 | "horny": ["sexual"], 218 | "hotsex": ["sexual"], 219 | "humping": ["sexual"], 220 | "jackass": ["insult"], 221 | "jap": ["discriminatory"], 222 | "jigaboo": ["discriminatory"], 223 | "jism": ["sexual"], 224 | "jiz": ["sexual"], 225 | "jizm": ["sexual"], 226 | "jizz": ["sexual"], 227 | "jungle bunny": ["discriminatory"], 228 | "junglebunny": ["discriminatory"], 229 | "kike": ["discriminatory"], 230 | "kock": ["sexual"], 231 | "kondum": ["sexual"], 232 | "kooch": ["sexual"], 233 | "kootch": ["sexual"], 234 | "kum": ["sexual"], 235 | "kumer": ["sexual"], 236 | "kummer": ["sexual"], 237 | "kumming": ["sexual"], 238 | "kums": ["sexual"], 239 | "kunilingus": ["sexual"], 240 | "kunt": ["sexual"], 241 | "kyke": ["discriminatory"], 242 | "lezzie": ["discriminatory"], 243 | "lust": ["sexual"], 244 | "lusting": ["sexual"], 245 | "mcfagget": ["discriminatory"], 246 | "mick": ["discriminatory"], 247 | "minge": ["sexual"], 248 | "mothafuck": ["sexual"], 249 | "mothafucka": ["sexual","insult"], 250 | "mothafuckaz": ["sexual"], 251 | "mothafucked": ["sexual"], 252 | "mothafucker": ["sexual","insult"], 253 | "mothafuckin": ["sexual"], 254 | "mothafucking": ["sexual"], 255 | "mothafucks": ["sexual"], 256 | "motherfuck": ["sexual"], 257 | "motherfucked": ["sexual"], 258 | "motherfucker": ["sexual","insult"], 259 | "motherfuckin": ["sexual"], 260 | "motherfucking": ["sexual"], 261 | "muff": ["sexual"], 262 | "muffdiver": ["discriminatory","sexual"], 263 | "munging": ["sexual"], 264 | "negro": ["discriminatory"], 265 | "nigga": ["discriminatory"], 266 | "nigger": ["discriminatory"], 267 | "niglet": ["discriminatory"], 268 | "nut sack": ["sexual"], 269 | "nutsack": ["sexual"], 270 | "orgasim": ["sexual"], 271 | "orgasm": ["sexual"], 272 | "paki": ["discriminatory"], 273 | "panooch": ["sexual"], 274 | "pecker": ["sexual"], 275 | "peckerhead": ["insult"], 276 | "penis": ["sexual"], 277 | "penisfucker": ["discriminatory"], 278 | "penispuffer": ["discriminatory"], 279 | "phonesex": ["sexual"], 280 | "phuk": ["sexual"], 281 | "phuked": ["sexual"], 282 | "phuking": ["sexual"], 283 | "phukked": ["sexual"], 284 | "phukking": ["sexual"], 285 | "phuks": ["sexual"], 286 | "phuq": ["sexual"], 287 | "pis": ["sexual"], 288 | "pises": ["sexual"], 289 | "pisin": ["sexual"], 290 | "pising": ["sexual"], 291 | "pisof": ["sexual"], 292 | "piss": ["inappropriate"], 293 | "pissed": ["inappropriate"], 294 | "pisser": ["sexual"], 295 | "pisses": ["sexual"], 296 | "pissflaps": ["sexual"], 297 | "pissin": ["sexual"], 298 | "pissing": ["sexual"], 299 | "pissoff": ["sexual"], 300 | "polesmoker": ["discriminatory"], 301 | "pollock": ["discriminatory"], 302 | "poon": ["sexual"], 303 | "poonani": ["sexual"], 304 | "poonany": ["sexual"], 305 | "poontang": ["sexual"], 306 | "porch monkey": ["discriminatory"], 307 | "porchmonkey": ["discriminatory"], 308 | "porn": ["sexual"], 309 | "porno": ["sexual"], 310 | "pornography": ["sexual"], 311 | "pornos": ["sexual"], 312 | "prick": ["sexual"], 313 | "punanny": ["sexual"], 314 | "punta": ["insult"], 315 | "pusies": ["sexual","insult"], 316 | "pussies": ["sexual","insult"], 317 | "pussy": ["sexual","insult"], 318 | "pussylicking": ["sexual"], 319 | "pusy": ["sexual"], 320 | "puto": ["insult"], 321 | "renob": ["sexual"], 322 | "rimjob": ["sexual"], 323 | "ruski": ["discriminatory"], 324 | "sandnigger": ["discriminatory"], 325 | "schlong": ["sexual"], 326 | "scrote": ["sexual"], 327 | "shit": ["sexual","inappropriate"], 328 | "shitass": ["insult"], 329 | "shitbag": ["insult"], 330 | "shitbagger": ["insult"], 331 | "shitbrain": ["insult"], 332 | "shitbreath": ["insult"], 333 | "shitcunt": ["insult"], 334 | "shitdick": ["insult"], 335 | "shited": ["sexual"], 336 | "shitface": ["insult"], 337 | "shitfaced": ["inappropriate","insult"], 338 | "shitfull": ["sexual"], 339 | "shithead": ["insult"], 340 | "shithole": ["insult"], 341 | "shithouse": ["inappropriate"], 342 | "shiting": ["sexual"], 343 | "shitspitter": ["sexual"], 344 | "shitstain": ["inappropriate","insult"], 345 | "shitted": ["sexual"], 346 | "shitter": ["sexual"], 347 | "shittiest": ["inappropriate"], 348 | "shitting": ["inappropriate"], 349 | "shitty": ["inappropriate"], 350 | "shity": ["sexual"], 351 | "shiz": ["inappropriate"], 352 | "shiznit": ["inappropriate"], 353 | "skank": ["insult"], 354 | "skeet": ["sexual"], 355 | "skullfuck": ["sexual"], 356 | "slut": ["discriminatory"], 357 | "slutbag": ["discriminatory"], 358 | "sluts": ["sexual"], 359 | "smeg": ["inappropriate"], 360 | "smut": ["sexual"], 361 | "snatch": ["sexual"], 362 | "spic": ["discriminatory"], 363 | "spick": ["discriminatory"], 364 | "splooge": ["sexual"], 365 | "spunk": ["sexual"], 366 | "tard": ["discriminatory"], 367 | "testicle": ["sexual"], 368 | "thundercunt": ["insult"], 369 | "tit": ["sexual"], 370 | "tits": ["sexual"], 371 | "titfuck": ["sexual"], 372 | "tittyfuck": ["sexual"], 373 | "twat": ["sexual"], 374 | "twatlips": ["insult"], 375 | "twatwaffle": ["discriminatory"], 376 | "unclefucker": ["discriminatory"], 377 | "va-j-j": ["sexual"], 378 | "vag": ["sexual"], 379 | "vagina": ["sexual"], 380 | "vjayjay": ["sexual"], 381 | "wank": ["sexual"], 382 | "wetback": ["discriminatory"], 383 | "whore": ["insult"], 384 | "whorebag": ["insult"], 385 | "whoreface": ["insult"] 386 | } 387 | -------------------------------------------------------------------------------- /lib/swearjar.js: -------------------------------------------------------------------------------- 1 | // swearjar-node 2 | var path = require('path'); 3 | var swearjar = { 4 | 5 | _badWords: {}, 6 | 7 | scan: function (text, callback) { 8 | var word, key, match; 9 | var regex = /\w+/g 10 | 11 | while (match = regex.exec(text)) { 12 | word = match[0]; 13 | key = word.toLowerCase(); 14 | 15 | if (key in this._badWords && Array.isArray(this._badWords[key])) { 16 | if (callback(word, match.index, this._badWords[key]) === false) { 17 | break; 18 | } 19 | } 20 | } 21 | }, 22 | 23 | profane: function (text) { 24 | var profane = false; 25 | 26 | this.scan(text, function (word, index, categories) { 27 | profane = true; 28 | return false; // Stop on first match 29 | }); 30 | 31 | return profane; 32 | }, 33 | 34 | scorecard: function (text) { 35 | var scorecard = {}; 36 | 37 | this.scan(text, function (word, index, categories) { 38 | for (var i = 0; i < categories.length; i+=1) { 39 | var cat = categories[i]; 40 | 41 | if (cat in scorecard) { 42 | scorecard[cat] += 1; 43 | } else { 44 | scorecard[cat] = 1; 45 | } 46 | }; 47 | }); 48 | 49 | return scorecard; 50 | }, 51 | 52 | censor: function (text) { 53 | var censored = text; 54 | 55 | this.scan(text, function (word, index, categories) { 56 | censored = censored.substr(0, index) + 57 | word.replace(/\S/g, '*') + 58 | censored.substr(index + word.length); 59 | }); 60 | 61 | return censored; 62 | }, 63 | 64 | loadBadWords: function (relativePath) { 65 | var basePath = path.dirname(module.parent.filename); 66 | var fullPath = path.join(basePath, relativePath); 67 | this._badWords = require(fullPath); 68 | }, 69 | 70 | setBadWords: function (badWords) { 71 | this._badWords = badWords || {}; 72 | } 73 | }; 74 | 75 | swearjar._badWords = require("./config/en_US.json"); 76 | 77 | module.exports = swearjar; 78 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "swearjar", 3 | "description": "Profanity detection and filtering library.", 4 | "version": "0.2.0", 5 | "homepage": "https://github.com/raymondjavaxx/swearjar-node", 6 | "keywords": ["swear", "curse", "unallowed", "profanity", "clean", "filter", "badwords"], 7 | "author": { 8 | "name": "Ramon Torres", 9 | "email": "raymondjavaxx@gmail.com", 10 | "url": "https://github.com/raymondjavaxx" 11 | }, 12 | "repository": { 13 | "type": "git", 14 | "url": "git@github.com:raymondjavaxx/swearjar-node.git" 15 | }, 16 | "licenses": [ 17 | { 18 | "type": "MIT", 19 | "url": "https://github.com/raymondjavaxx/swearjar-node/LICENSE" 20 | } 21 | ], 22 | "main": "lib/swearjar", 23 | "engines": { 24 | "node": ">= 0.8.0" 25 | }, 26 | "devDependencies": { 27 | "mocha": "~1.18.2" 28 | }, 29 | "scripts": { 30 | "test": "mocha" 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /test/test.js: -------------------------------------------------------------------------------- 1 | var assert = require('assert'); 2 | var swearjar = require('../lib/swearjar.js'); 3 | 4 | describe('swearjar.profane', function () { 5 | 6 | it('should should detect bad words', function () { 7 | assert.equal(swearjar.profane('i love you john doe'), false); 8 | assert.equal(swearjar.profane('fuck you john doe'), true); 9 | }); 10 | 11 | it('should detect uppercase bad words', function () { 12 | assert.equal(swearjar.profane('FUCK you john doe'), true); 13 | }); 14 | 15 | it('should detect mixedcase bad words', function () { 16 | assert.equal(swearjar.profane('FuCk you john doe'), true); 17 | }); 18 | 19 | }); 20 | 21 | describe('swearjar.censor', function () { 22 | 23 | it('should remove bad words', function () { 24 | assert.equal(swearjar.censor('fuck you john doe bitch'), "**** you john doe *****"); 25 | }); 26 | 27 | it('should handle edgecases', function () { 28 | assert.equal(swearjar.censor("Assasin's Creed Ass"), "Assasin's Creed ***"); 29 | assert.equal(swearjar.censor("Assasin's Creed\nAss"), "Assasin's Creed\n***"); 30 | }); 31 | 32 | }); 33 | 34 | describe('swearjar.scorecard', function () { 35 | 36 | it('should count bad words and categorize them', function () { 37 | assert.deepEqual(swearjar.scorecard('fuck you john doe'), { 38 | sexual: 1 39 | }); 40 | 41 | assert.deepEqual(swearjar.scorecard('fuck you john doe bitch fuck'), { 42 | sexual: 2, 43 | insult: 1 44 | }); 45 | }); 46 | }); 47 | 48 | describe('should handle object properties', function() { 49 | 50 | it('should not return "should" as profane', function () { 51 | 52 | Object.defineProperty(Object.prototype, 'should', { 53 | set: function(){}, 54 | get: function(){ 55 | return this; 56 | }, 57 | configurable: true 58 | }); 59 | 60 | assert.equal(swearjar.profane('this should not be profane'), false); 61 | }); 62 | }); 63 | --------------------------------------------------------------------------------