discourse/app/assets/javascripts/pretty-text/censored-words.js.es6

40 lines
1.1 KiB
Plaintext
Raw Normal View History

2017-01-31 10:39:45 +08:00
function escapeRegexp(text) {
2017-01-31 10:45:04 +08:00
return text.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&');
2017-01-31 10:39:45 +08:00
}
export function censor(text, censoredWords, censoredPattern) {
let patterns = [],
originalText = text;
if (censoredWords && censoredWords.length) {
2017-01-31 10:39:45 +08:00
patterns = censoredWords.split("|").map(t => `(${escapeRegexp(t)})`);
}
if (censoredPattern && censoredPattern.length > 0) {
2016-11-09 06:59:51 +08:00
patterns.push("(" + censoredPattern + ")");
}
if (patterns.length) {
let censorRegexp;
try {
censorRegexp = new RegExp("(\\b(?:" + patterns.join("|") + ")\\b)(?![^\\(]*\\))", "ig");
if (censorRegexp) {
let m = censorRegexp.exec(text);
while (m && m[0]) {
if (m[0].length > originalText.length) { return originalText; } // regex is dangerous
const replacement = new Array(m[0].length+1).join('■');
2017-01-31 10:39:45 +08:00
text = text.replace(new RegExp(`(\\b${escapeRegexp(m[0])}\\b)(?![^\\(]*\\))`, "ig"), replacement);
m = censorRegexp.exec(text);
}
}
} catch(e) {
return originalText;
}
}
return text;
}