offensivewords
Version:
Determine if strings contain offensive words
80 lines (70 loc) • 2.56 kB
JavaScript
var words = require('./data/core_terms/en.js')
var possible = require('./data/possibly_offensive/en.js')
var atrisk = require('./data/at_risk/en.js')
var insults = require('./data/insult_terms/en.js')
var religion = require('./data/religion_terms/en.js')
var sexting = require('./data/sexting_terms/en.js')
var drugs = require('./data/drug_terms/en.js')
/**
* Convert array of words into regular expression
* @param {String} listId ID of words list
* @param {Array} wordsList Array of words
* @return {RegEx} Regular expression used for matching
*/
function convertWordsToRegExp(wordsList) {
var regStr = '',
regExpression;
// Do not use preset
for (var i = 0; i < wordsList.length; i++) {
if (typeof(wordsList[i]) === 'string' && wordsList[i].length > 0) {
regStr += ((i !== 0) ? '|' : '') + wordsList[i];
}
}
regStr = '\\b(' + regStr + ')\\b';
//regExpression = regStr;
regExpression = new RegExp(regStr, "gmi");
return regExpression;
}
var wordsRe = convertWordsToRegExp(words);
var possibleRe = convertWordsToRegExp(possible);
var atriskRe = convertWordsToRegExp(atrisk);
var insultsRe = convertWordsToRegExp(insults);
var sextingRe = convertWordsToRegExp(sexting);
var drugsRe = convertWordsToRegExp(drugs);
var religionRe = convertWordsToRegExp(religion);
function unacceptable(str) {
str = str.toLowerCase();
var wordMatch = str.match(wordsRe) || [];
var possibleMatch = str.match(possibleRe) || [];
var atriskMatch = str.match(atriskRe) || [];
var insultMatch = str.match(insultsRe) || [];
var sextingMatch = str.match(sextingRe) || [];
var drugsMatch = str.match(drugsRe) || [];
var religionMatch = str.match(religionRe) || [];
var matches = {
'offensive': wordMatch,
'potentially_offensive': possibleMatch,
'at_risk': atriskMatch,
'insult': insultMatch,
'sexting': sextingMatch,
'drugs': drugsMatch,
'religion': religionMatch,
'dangerous': wordMatch.concat(insultMatch, sextingMatch),
'risky': (drugsMatch)
};
matches.offensive = matches.offensive.filter( onlyUnique )
matches.insult = matches.insult.filter( onlyUnique )
matches.sexting = matches.sexting.filter( onlyUnique )
matches.drugs = matches.drugs.filter( onlyUnique )
matches.religion = matches.religion.filter( onlyUnique )
matches.dangerous = matches.dangerous.filter( onlyUnique )
matches.risky = matches.risky.filter( onlyUnique )
// Ensure lowercase
return matches;
}
if (module) {
module.exports = unacceptable;
}
function onlyUnique(value, index, self) {
return self.indexOf(value) === index;
}