import { registerOption } from 'pretty-text/pretty-text'; function insertDetails(_, summary, details) { return `
${summary}${details}
`; } // replace all [details] BBCode with HTML 5.1 equivalent function replaceDetails(text) { text = text || ""; while (text !== (text = text.replace(/\[details=([^\]]+)\]((?:(?!\[details=[^\]]+\]|\[\/details\])[\S\s])*)\[\/details\]/ig, insertDetails))); // add new lines to make sure we *always* have a

element after and around // otherwise we can't hide the content since we can't target text nodes via CSS return text.replace(/<\/summary>/ig, "\n\n") .replace(/<\/details>/ig, "\n\n\n\n"); } registerOption((siteSettings, opts) => { opts.features.details = true; }); export function setup(helper) { helper.whiteList([ 'summary', 'summary[title]', 'details', 'details[open]', 'details.elided' ]); helper.addPreProcessor(text => replaceDetails(text)); }