mirror of
https://github.com/discourse/discourse.git
synced 2024-11-29 02:23:40 +08:00
d7bd62d9cf
Applying oneboxes and replacing censored watched words does not happen in a strict order which often lead to inconsistencies. This commit fixes the behavior and will never censor oneboxes. To make it always censor oneboxes implies significant changes to the PrettyText pipeline.
45 lines
1.0 KiB
JavaScript
45 lines
1.0 KiB
JavaScript
import { censorFn } from "pretty-text/censored-words";
|
|
|
|
function recurse(tokens, apply) {
|
|
let i;
|
|
for (i = 0; i < tokens.length; i++) {
|
|
if (tokens[i].type === "html_raw" && tokens[i].onebox) {
|
|
continue;
|
|
}
|
|
|
|
apply(tokens[i]);
|
|
if (tokens[i].children) {
|
|
recurse(tokens[i].children, apply);
|
|
}
|
|
}
|
|
}
|
|
|
|
function censorTree(state, censor) {
|
|
if (!state.tokens) {
|
|
return;
|
|
}
|
|
|
|
recurse(state.tokens, (token) => {
|
|
if (token.content) {
|
|
token.content = censor(token.content);
|
|
}
|
|
});
|
|
}
|
|
|
|
export function setup(helper) {
|
|
helper.registerOptions((opts, siteSettings) => {
|
|
opts.watchedWordsRegularExpressions =
|
|
siteSettings.watched_words_regular_expressions;
|
|
});
|
|
|
|
helper.registerPlugin((md) => {
|
|
const censoredRegexp = md.options.discourse.censoredRegexp;
|
|
|
|
if (censoredRegexp) {
|
|
const replacement = String.fromCharCode(9632);
|
|
const censor = censorFn(censoredRegexp, replacement);
|
|
md.core.ruler.push("censored", (state) => censorTree(state, censor));
|
|
}
|
|
});
|
|
}
|