{"version":3,"file":"spoiler-alert.js","names":["define","_exports","_pluginApi","_toMarkdown","_applySpoiler","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","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","t","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"],"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"],"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\"], function (_exports, _pluginApi, _toMarkdown, _applySpoiler) {\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: \"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  }\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)(\"1.15.0\", 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\": _discourseI18n.default.t(\"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});"],"mappings":"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"}