{"version":3,"file":"spoiler-alert.js","names":["define","_exports","_pluginApi","_toMarkdown","_applySpoiler","_richEditorExtension","spoil","element","querySelectorAll","forEach","spoiler","classList","remove","add","default","initializeSpoiler","api","decorateCookedElement","id","addComposerToolbarPopupMenuOption","icon","label","action","toolbarEvent","applySurround","multiline","useBlockMode","addTagDecorateCallback","attributes","this","test","class","prefix","suffix","addBlockDecorateCallback","text","name","trim","registerRichEditorExtension","Object","defineProperty","value","initialize","container","lookup","spoiler_enabled","withPluginApi","_discourseI18n","_setSpoilerHidden","addEventListener","event","toggleSpoiler","key","INTERACTIVE_SELECTOR","join","setAttributes","entries","_ref","removeAttribute","setAttribute","role","tabindex","i18n","Array","from","children","e","getAttribute","_setSpoilerVisible","preventDefault","defaultPrevented","target","closest","isInteractive","window","getSelection","setup","helper","allowList","markdownIt","registerOptions","opts","siteSettings","features","registerPlugin","md","inline","bbcode","ruler","push","tag","wrap","block","setupMarkdownIt","addPreProcessor","replaceSpoilers","CONTAINS_BLOCK_REGEX","insertSpoiler","_","previousText","replace","SPOILER_NODES","extension","nodeSpec","attrs","blurred","group","content","parseDOM","toDOM","inline_spoiler","parse","bbcode_spoiler","wrap_bbcode","state","token","nesting","attrGet","openNode","schema","nodes","top","type","closeNode","serializeNode","node","write","renderContent","renderInline","plugins","pmState","Plugin","pmView","Decoration","DecorationSet","props","decorations","getState","handleClickOn","view","pos","nodePos","includes","decoSet","empty","newDeco","find","nodeSize","length","doc","dispatch","tr","setMeta","init","apply","set","getMeta","map","mapping"],"sources":["discourse/plugins/spoiler-alert/initializers/spoiler-alert.js","discourse/plugins/spoiler-alert/lib/apply-spoiler.js","discourse/plugins/spoiler-alert/lib/discourse-markdown/spoiler-alert.js","discourse/plugins/spoiler-alert/lib/rich-editor-extension.js"],"sourcesContent":["define(\"discourse/plugins/spoiler-alert/initializers/spoiler-alert\", [\"exports\", \"discourse/lib/plugin-api\", \"discourse/lib/to-markdown\", \"discourse/plugins/spoiler-alert/lib/apply-spoiler\", \"discourse/plugins/spoiler-alert/lib/rich-editor-extension\"], function (_exports, _pluginApi, _toMarkdown, _applySpoiler, _richEditorExtension) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  _exports.initializeSpoiler = initializeSpoiler;\n  function spoil(element) {\n    element.querySelectorAll(\".spoiler\").forEach(spoiler => {\n      spoiler.classList.remove(\"spoiler\");\n      spoiler.classList.add(\"spoiled\");\n      (0, _applySpoiler.default)(spoiler);\n    });\n  }\n  function initializeSpoiler(api) {\n    api.decorateCookedElement(spoil, {\n      id: \"spoiler-alert\"\n    });\n    api.addComposerToolbarPopupMenuOption({\n      icon: \"wand-magic\",\n      label: \"spoiler.title\",\n      action: toolbarEvent => {\n        toolbarEvent.applySurround(\"[spoiler]\", \"[/spoiler]\", \"spoiler_text\", {\n          multiline: false,\n          useBlockMode: true\n        });\n      }\n    });\n    (0, _toMarkdown.addTagDecorateCallback)(function () {\n      const {\n        attributes\n      } = this.element;\n      if (/\\bspoiled\\b/.test(attributes.class)) {\n        this.prefix = \"[spoiler]\";\n        this.suffix = \"[/spoiler]\";\n      }\n    });\n    (0, _toMarkdown.addBlockDecorateCallback)(function (text) {\n      const {\n        name,\n        attributes\n      } = this.element;\n      if (name === \"div\" && /\\bspoiled\\b/.test(attributes.class)) {\n        this.prefix = \"[spoiler]\\n\";\n        this.suffix = \"\\n[/spoiler]\";\n        return text.trim();\n      }\n    });\n    api.registerRichEditorExtension(_richEditorExtension.default);\n  }\n  var _default = _exports.default = {\n    name: \"spoiler-alert\",\n    initialize(container) {\n      const siteSettings = container.lookup(\"service:site-settings\");\n      if (siteSettings.spoiler_enabled) {\n        (0, _pluginApi.withPluginApi)(initializeSpoiler);\n      }\n    }\n  };\n});","define(\"discourse/plugins/spoiler-alert/lib/apply-spoiler\", [\"exports\", \"discourse-i18n\"], function (_exports, _discourseI18n) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = applySpoiler;\n  const INTERACTIVE_SELECTOR = [\"a\", \"area\", \"audio\", \"button\", \"details\", \"embed\", \"iframe\", \"img.animated\", \"input\", \"map\", \"object\", \"option\", \"portal\", \"select\", \"textarea\", \"track\", \"video\", \".lightbox\"].join(\", \");\n  function isInteractive(event) {\n    return event.defaultPrevented || event.target.closest(INTERACTIVE_SELECTOR);\n  }\n  function noTextSelected() {\n    return window.getSelection() + \"\" === \"\";\n  }\n  function setAttributes(element, attributes) {\n    Object.entries(attributes).forEach(_ref => {\n      let [key, value] = _ref;\n      if (value === null) {\n        element.removeAttribute(key);\n      } else {\n        element.setAttribute(key, value);\n      }\n    });\n  }\n  function _setSpoilerHidden(element) {\n    const spoilerHiddenAttributes = {\n      role: \"button\",\n      tabindex: \"0\",\n      \"data-spoiler-state\": \"blurred\",\n      \"aria-expanded\": false,\n      \"aria-label\": (0, _discourseI18n.i18n)(\"spoiler.label.show\"),\n      \"aria-live\": \"polite\"\n    };\n\n    // Set default attributes & classes on spoiler\n    setAttributes(element, spoilerHiddenAttributes);\n    element.classList.add(\"spoiler-blurred\");\n\n    // Set aria-hidden for all children of the spoiler\n    Array.from(element.children).forEach(e => {\n      e.setAttribute(\"aria-hidden\", true);\n    });\n  }\n  function _setSpoilerVisible(element) {\n    const spoilerVisibleAttributes = {\n      \"data-spoiler-state\": \"revealed\",\n      \"aria-expanded\": true,\n      \"aria-label\": null,\n      role: null\n    };\n\n    // Set attributes & classes for when spoiler is visible\n    setAttributes(element, spoilerVisibleAttributes);\n    element.classList.remove(\"spoiler-blurred\");\n\n    // Remove aria-hidden for all children of the spoiler when visible\n    Array.from(element.children).forEach(e => {\n      e.removeAttribute(\"aria-hidden\");\n    });\n  }\n  function toggleSpoiler(event, element) {\n    if (element.getAttribute(\"data-spoiler-state\") === \"blurred\") {\n      _setSpoilerVisible(element);\n      event.preventDefault();\n    } else if (!isInteractive(event) && noTextSelected()) {\n      _setSpoilerHidden(element);\n    }\n  }\n  function applySpoiler(element) {\n    _setSpoilerHidden(element);\n    element.addEventListener(\"click\", event => {\n      toggleSpoiler(event, element);\n    });\n    element.addEventListener(\"keydown\", event => {\n      if (event.key === \"Enter\") {\n        toggleSpoiler(event, element);\n      }\n    });\n  }\n});","define(\"discourse/plugins/spoiler-alert/lib/discourse-markdown/spoiler-alert\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.setup = setup;\n  const CONTAINS_BLOCK_REGEX = /\\n|<img|!\\[[^\\]]*\\][(\\[]/;\n  function insertSpoiler(_, spoiler) {\n    const element = CONTAINS_BLOCK_REGEX.test(spoiler) ? \"div\" : \"span\";\n    return `<${element} class='spoiler'>${spoiler}</${element}>`;\n  }\n  function replaceSpoilers(text) {\n    text ||= \"\";\n    let previousText;\n    do {\n      previousText = text;\n      text = text.replace(/\\[spoiler\\]((?:(?!\\[spoiler\\]|\\[\\/spoiler\\])[\\S\\s])*)\\[\\/spoiler\\]/gi, insertSpoiler);\n    } while (text !== previousText);\n    return text;\n  }\n  function setupMarkdownIt(helper) {\n    helper.registerOptions((opts, siteSettings) => {\n      opts.features[\"spoiler-alert\"] = !!siteSettings.spoiler_enabled;\n    });\n    helper.registerPlugin(md => {\n      md.inline.bbcode.ruler.push(\"spoiler\", {\n        tag: \"spoiler\",\n        wrap: \"span.spoiler\"\n      });\n      md.block.bbcode.ruler.push(\"spoiler\", {\n        tag: \"spoiler\",\n        wrap: \"div.spoiler\"\n      });\n    });\n  }\n  function setup(helper) {\n    helper.allowList([\"span.spoiler\", \"div.spoiler\"]);\n    if (helper.markdownIt) {\n      setupMarkdownIt(helper);\n    } else {\n      helper.addPreProcessor(replaceSpoilers);\n    }\n  }\n});","define(\"discourse/plugins/spoiler-alert/lib/rich-editor-extension\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  const SPOILER_NODES = [\"inline_spoiler\", \"spoiler\"];\n\n  /** @type {RichEditorExtension} */\n  const extension = {\n    nodeSpec: {\n      spoiler: {\n        attrs: {\n          blurred: {\n            default: true\n          }\n        },\n        group: \"block\",\n        content: \"block+\",\n        parseDOM: [{\n          tag: \"div.spoiled\"\n        }],\n        toDOM: () => [\"div\", {\n          class: \"spoiled\"\n        }, 0]\n      },\n      inline_spoiler: {\n        attrs: {\n          blurred: {\n            default: true\n          }\n        },\n        group: \"inline\",\n        inline: true,\n        content: \"inline*\",\n        parseDOM: [{\n          tag: \"span.spoiled\"\n        }],\n        toDOM: () => [\"span\", {\n          class: \"spoiled\"\n        }, 0]\n      }\n    },\n    parse: {\n      bbcode_spoiler: {\n        block: \"inline_spoiler\"\n      },\n      wrap_bbcode(state, token) {\n        if (token.nesting === 1 && token.attrGet(\"class\") === \"spoiler\") {\n          state.openNode(state.schema.nodes.spoiler);\n          return true;\n        } else if (token.nesting === -1 && state.top().type.name === \"spoiler\") {\n          state.closeNode();\n          return true;\n        }\n      }\n    },\n    serializeNode: {\n      spoiler(state, node) {\n        state.write(\"[spoiler]\\n\");\n        state.renderContent(node);\n        state.write(\"[/spoiler]\\n\\n\");\n      },\n      inline_spoiler(state, node) {\n        state.write(\"[spoiler]\");\n        state.renderInline(node);\n        state.write(\"[/spoiler]\");\n      }\n    },\n    plugins(_ref) {\n      let {\n        pmState: {\n          Plugin\n        },\n        pmView: {\n          Decoration,\n          DecorationSet\n        }\n      } = _ref;\n      return new Plugin({\n        props: {\n          decorations(state) {\n            return this.getState(state);\n          },\n          handleClickOn(view, pos, node, nodePos) {\n            if (SPOILER_NODES.includes(node.type.name)) {\n              const decoSet = this.getState(view.state) || DecorationSet.empty;\n              const isBlurred = decoSet.find(nodePos, nodePos + node.nodeSize).length > 0;\n              const newDeco = isBlurred ? decoSet.remove(decoSet.find(nodePos, nodePos + node.nodeSize)) : decoSet.add(view.state.doc, [Decoration.node(nodePos, nodePos + node.nodeSize, {\n                class: \"spoiler-blurred\"\n              })]);\n              view.dispatch(view.state.tr.setMeta(this, newDeco));\n              return true;\n            }\n          }\n        },\n        state: {\n          init() {\n            return DecorationSet.empty;\n          },\n          apply(tr, set) {\n            return tr.getMeta(this) || set.map(tr.mapping, tr.doc);\n          }\n        }\n      });\n    }\n  };\n  var _default = _exports.default = extension;\n});"],"mappings":"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","ignoreList":[]}