forked from aojiaotage/text-censor
-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.js
85 lines (64 loc) · 1.34 KB
/
index.js
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
var fs = require('fs')
var path = __dirname + '/keywords'
var map = {}
var lineReader = require('readline').createInterface({
input: require('fs').createReadStream(path, {encoding: 'UTF-8'})
});
lineReader.on('line', function (line) {
if(!line) return
addWord(line)
});
function addWord(word) {
var parent = map
for (var i = 0; i < word.length; i++) {
if (!parent[word[i]]) parent[word[i]] = {}
parent = parent[word[i]]
}
parent.isEnd = true
}
function filter(s, cb) {
var parent = map
for (var i = 0; i < s.length; i++) {
if (s[i] == '*') {
continue
}
var found = false
var skip = 0
var sWord = ''
for (var j = i; j < s.length; j++) {
if (!parent[s[j]]) {
// console.log('skip ', s[j])
found = false
skip = j - i
parent = map
break;
}
sWord = sWord + s[j]
if (parent[s[j]].isEnd) {
found = true
skip = j - i
break
}
parent = parent[s[j]]
}
if (skip > 1) {
i += skip - 1
}
if (!found) {
continue
}
var stars = '*'
for (var k = 0; k < skip; k++) {
stars = stars + '*'
}
var reg = new RegExp(sWord, 'g')
s = s.replace(reg, stars)
}
if(typeof cb === 'function'){
cb(null, s)
}
return s
}
module.exports = {
filter: filter
}