mirror of
https://github.com/discourse/discourse.git
synced 2024-12-25 03:16:19 +08:00
50 lines
1.1 KiB
JavaScript
50 lines
1.1 KiB
JavaScript
const CONTAINS_BLOCK_REGEX = /\n|<img|!\[[^\]]*\][(\[]/;
|
|
|
|
function insertSpoiler(_, spoiler) {
|
|
const element = CONTAINS_BLOCK_REGEX.test(spoiler) ? "div" : "span";
|
|
return `<${element} class='spoiler'>${spoiler}</${element}>`;
|
|
}
|
|
|
|
function replaceSpoilers(text) {
|
|
text ||= "";
|
|
let previousText;
|
|
|
|
do {
|
|
previousText = text;
|
|
text = text.replace(
|
|
/\[spoiler\]((?:(?!\[spoiler\]|\[\/spoiler\])[\S\s])*)\[\/spoiler\]/gi,
|
|
insertSpoiler
|
|
);
|
|
} while (text !== previousText);
|
|
|
|
return text;
|
|
}
|
|
|
|
function setupMarkdownIt(helper) {
|
|
helper.registerOptions((opts, siteSettings) => {
|
|
opts.features["spoiler-alert"] = !!siteSettings.spoiler_enabled;
|
|
});
|
|
|
|
helper.registerPlugin((md) => {
|
|
md.inline.bbcode.ruler.push("spoiler", {
|
|
tag: "spoiler",
|
|
wrap: "span.spoiler",
|
|
});
|
|
|
|
md.block.bbcode.ruler.push("spoiler", {
|
|
tag: "spoiler",
|
|
wrap: "div.spoiler",
|
|
});
|
|
});
|
|
}
|
|
|
|
export function setup(helper) {
|
|
helper.allowList(["span.spoiler", "div.spoiler"]);
|
|
|
|
if (helper.markdownIt) {
|
|
setupMarkdownIt(helper);
|
|
} else {
|
|
helper.addPreProcessor(replaceSpoilers);
|
|
}
|
|
}
|