-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathindex.js
More file actions
102 lines (91 loc) · 2.92 KB
/
index.js
File metadata and controls
102 lines (91 loc) · 2.92 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
module.exports = new (function() {
var words = require('./words.json');
var defaultConfig = {
mask: '*',
fullyMasked: false,
blacklist: []
}
var wordFilter = function(str, res) {
var originalStr = str;
str = str.replace(/[^\w\s]/gi, '');
words = words.concat(defaultConfig.blacklist);
if (words.indexOf(str.toLowerCase()) >= 0) {
res.profaneWordsCount++;
var word = str;
var wordLen = word.length;
str = defaultConfig.fullyMasked ?
Array(wordLen+1).join(defaultConfig.mask) :
word.substr(0,1) + Array(wordLen-1).join(defaultConfig.mask) + word.substr(wordLen-1,1);
} else {
str = originalStr;
}
return str;
}
var doFilter = function(paragraph, res) {
if (typeof paragraph === 'string') {
var initTokens = paragraph.split('\n');
var initTokensLength = initTokens.length;
for (var j = 0; j < initTokensLength; j++ ) {
var line = initTokens[j];
var tokens = line.split(' ');
var tokensLength = tokens.length;
for (var i = 0; i < tokensLength; i++ ) {
tokens[i] = wordFilter(tokens[i], res);
}
line = tokens.join(' ');
initTokens[j] = line;
}
paragraph = initTokens.join('\n');
return paragraph;
} else {
return paragraph;
}
}
var init = function(req, res, next) {
res.profaneWordsCount = 0;
//parse req.body
for (var i in req.body) {
var item = req.body[i];
req.body[i] = filter(item, {}, res);
}
//this is a middleware, so announce finished
next();
}
var filter = function(obj, options, res) {
if (res == undefined)
res = {profaneWordsCount: 0};
if (res.profaneWordsCount == undefined)
res.profaneWordsCount = 0;
if (options != undefined) {
defaultConfig.mask = (options.mask != undefined ? options.mask : defaultConfig.mask);
defaultConfig.fullyMasked = (options.fullyMasked != undefined ? options.fullyMasked : defaultConfig.fullyMasked);
defaultConfig.blacklist = (options.blacklist != undefined ? options.blacklist : defaultConfig.blacklist);
}
if (typeof obj === "object") {
for (var key in obj) {
if (typeof obj[key] === "object")
obj[key] = filter(obj[key], options, res);
else if (typeof obj[key] !== "function")
obj[key] = doFilter(obj[key], res);
}
} else if (typeof obj === "string")
obj = doFilter(obj, res);
return obj;
}
var setOptions = function(options) {
if (options != undefined) {
defaultConfig.mask = (options.mask != undefined ? options.mask : defaultConfig.mask);
defaultConfig.fullyMasked = (options.fullyMasked != undefined ? options.fullyMasked : defaultConfig.fullyMasked);
defaultConfig.blacklist = (options.blacklist != undefined ? options.blacklist : defaultConfig.blacklist);
}
}
var rating = function(profaneWordsCount) {
//50 bad words means 100% rating
var calculatedRate = (profaneWordsCount / 50) * 100;
return calculatedRate;
}
this.rating = rating;
this.init = init;
this.filter = filter;
this.setOptions = setOptions;
})();