diff --git a/app/assets/javascripts/pretty-text/censored-words.js.es6 b/app/assets/javascripts/pretty-text/censored-words.js.es6 index fc5254f58d..9eac5ad68d 100644 --- a/app/assets/javascripts/pretty-text/censored-words.js.es6 +++ b/app/assets/javascripts/pretty-text/censored-words.js.es6 @@ -36,13 +36,14 @@ export function censorFn(censoredWords, censoredPattern, replacementLetter, watc try { let m = censorRegexp.exec(text); + const fourCharReplacement = new Array(5).join(replacementLetter); while (m && m[0]) { if (m[0].length > original.length) { return original; } // regex is dangerous - const replacement = new Array(m[0].length+1).join(replacementLetter); if (watchedWordsRegularExpressions) { - text = text.replace(new RegExp(`(${escapeRegexp(m[0])})(?![^\\(]*\\))`, "ig"), replacement); + text = text.replace(censorRegexp, fourCharReplacement); } else { + const replacement = new Array(m[0].length+1).join(replacementLetter); text = text.replace(new RegExp(`(\\b${escapeRegexp(m[0])}\\b)(?![^\\(]*\\))`, "ig"), replacement); } m = censorRegexp.exec(text); diff --git a/test/javascripts/lib/pretty-text-test.js.es6 b/test/javascripts/lib/pretty-text-test.js.es6 index 0fd5bf8616..df81da1cfc 100644 --- a/test/javascripts/lib/pretty-text-test.js.es6 +++ b/test/javascripts/lib/pretty-text-test.js.es6 @@ -617,7 +617,18 @@ QUnit.test("censoring", assert => { }, censoredWords: 'xyz*|plee+ase' }, - "
Pleased to meet you, but ■■■■■■■■■ call me later, ■■■123
", + "Pleased to meet you, but ■■■■ call me later, ■■■■123
", + "supports words as regular expressions"); + + assert.cookedOptions( + "Meet downtown in your town at the townhouse on Main St.", + { siteSettings: { + watched_words_regular_expressions: true, + censored_pattern: null + }, + censoredWords: '\\btown\\b' + }, + "Meet downtown in your ■■■■ at the townhouse on Main St.
", "supports words as regular expressions"); });