{"version":3,"file":"discourse-checklist.js","names":["define","_exports","_pluginApi","_ajax","_iconLibrary","_I18n","removeReadonlyClass","boxes","forEach","e","classList","remove","isWhitespaceNode","node","nodeType","nodeValue","match","addUlClasses","val","parent","parentElement","nodeName","firstElementChild","sibling","previousSibling","hasPrecedingContent","add","nextSibling","insertAdjacentHTML","checklistSyntax","elem","postDecorator","getElementsByClassName","postWidget","widget","postModel","getModel","can_edit","idx","onclick","ev","box","currentTarget","contains","newValue","template","document","createElement","innerHTML","iconHTML","class","insertAdjacentElement","content","firstChild","ajax","id","type","cache","then","result","blocks","regex","exec","raw","push","index","length","nth","found","newRaw","replace","ignored","off","every","b","save","edit_reason","default","t","attrs","isSaving","scheduleRerender","finally","catch","Object","defineProperty","value","_default","name","initialize","withPluginApi","api","container","lookup","checklist_enabled","decorateCookedElement","initializePlugin","setup","helper","registerOptions","opts","siteSettings","features","allowList","registerPlugin","md","core","ruler","processChecklist","REGEX","addCheckbox","state","classes","str","getClasses","checkOpenToken","Token","checkCloseToken","applyCheckboxes","pos","token","slice","i","j","l","tokens","blockTokens","nesting","children","processed","utils","arrayReplaceAt"],"sources":["discourse/plugins/discourse-checklist/discourse/initializers/checklist.js","discourse/plugins/discourse-checklist/lib/discourse-markdown/checklist.js"],"sourcesContent":["define(\"discourse/plugins/discourse-checklist/discourse/initializers/checklist\", [\"exports\", \"discourse/lib/plugin-api\", \"discourse/lib/ajax\", \"discourse-common/lib/icon-library\", \"I18n\"], function (_exports, _pluginApi, _ajax, _iconLibrary, _I18n) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.checklistSyntax = checklistSyntax;\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"discourse/lib/plugin-api\",0,\"discourse/lib/ajax\",0,\"discourse-common/lib/icon-library\",0,\"I18n\"eaimeta@70e063a35619d71f\n  function initializePlugin(api) {\n    const siteSettings = api.container.lookup(\"site-settings:main\");\n    if (siteSettings.checklist_enabled) {\n      api.decorateCookedElement(checklistSyntax, {\n        id: \"checklist\"\n      });\n    }\n  }\n  function removeReadonlyClass(boxes) {\n    boxes.forEach(e => e.classList.remove(\"readonly\"));\n  }\n  function isWhitespaceNode(node) {\n    return node.nodeType === 3 && node.nodeValue.match(/^\\s*$/);\n  }\n  function hasPrecedingContent(node) {\n    let sibling = node.previousSibling;\n    while (sibling) {\n      if (!isWhitespaceNode(sibling)) {\n        return true;\n      }\n      sibling = sibling.previousSibling;\n    }\n    return false;\n  }\n  function addUlClasses(boxes) {\n    boxes.forEach(val => {\n      let parent = val.parentElement;\n      if (parent.nodeName === \"P\" && parent.parentElement.firstElementChild === parent) {\n        parent = parent.parentElement;\n      }\n      if (parent.nodeName === \"LI\" && parent.parentElement.nodeName === \"UL\") {\n        if (!hasPrecedingContent(val)) {\n          parent.classList.add(\"has-checkbox\");\n          val.classList.add(\"list-item-checkbox\");\n          if (!val.nextSibling) {\n            val.insertAdjacentHTML(\"afterend\", \"&#8203;\"); // Ensure otherwise empty <li> does not collapse height\n          }\n        }\n      }\n    });\n  }\n\n  function checklistSyntax(elem, postDecorator) {\n    const boxes = [...elem.getElementsByClassName(\"chcklst-box\")];\n    addUlClasses(boxes);\n    if (!postDecorator) {\n      return;\n    }\n    const postWidget = postDecorator.widget;\n    const postModel = postDecorator.getModel();\n    if (!postModel.can_edit) {\n      return;\n    }\n    boxes.forEach((val, idx) => {\n      val.onclick = function (ev) {\n        const box = ev.currentTarget;\n        const classList = box.classList;\n        if (classList.contains(\"permanent\") || classList.contains(\"readonly\")) {\n          return;\n        }\n        const newValue = classList.contains(\"checked\") ? \"[ ]\" : \"[x]\";\n        const template = document.createElement(\"template\");\n        template.innerHTML = (0, _iconLibrary.iconHTML)(\"spinner\", {\n          class: \"fa-spin\"\n        });\n        box.insertAdjacentElement(\"afterend\", template.content.firstChild);\n        box.classList.add(\"hidden\");\n        boxes.forEach(e => e.classList.add(\"readonly\"));\n        (0, _ajax.ajax)(`/posts/${postModel.id}`, {\n          type: \"GET\",\n          cache: false\n        }).then(result => {\n          const blocks = [];\n\n          // Computing offsets where checkbox are not evaluated (i.e. inside\n          // code blocks).\n          [\n          // inline code\n          /`[^`\\n]*\\n?[^`\\n]*`/gm,\n          // multi-line code\n          /^```[^]*?^```/gm,\n          // bbcode\n          /\\[code\\][^]*?\\[\\/code\\]/gm,\n          // italic/bold\n          /_(?=\\S).*?\\S_/gm,\n          // strikethrough\n          /~~(?=\\S).*?\\S~~/gm].forEach(regex => {\n            let match;\n            while ((match = regex.exec(result.raw)) != null) {\n              blocks.push([match.index, match.index + match[0].length]);\n            }\n          });\n          [\n          // italic/bold\n          /([^\\[\\n]|^)\\*\\S.+?\\S\\*(?=[^\\]\\n]|$)/gm].forEach(regex => {\n            let match;\n            while ((match = regex.exec(result.raw)) != null) {\n              // Simulate lookbehind - skip the first character\n              blocks.push([match.index + 1, match.index + match[0].length]);\n            }\n          });\n\n          // make the first run go to index = 0\n          let nth = -1;\n          let found = false;\n          const newRaw = result.raw.replace(/\\[(\\s|\\_|\\-|\\x|\\\\?\\*)?\\]/gi, (match, ignored, off) => {\n            if (found) {\n              return match;\n            }\n            nth += blocks.every(b => b[0] >= off + match.length || off > b[1]);\n            if (nth === idx) {\n              found = true; // Do not replace any further matches\n              return newValue;\n            }\n            return match;\n          });\n          const save = postModel.save({\n            raw: newRaw,\n            edit_reason: _I18n.default.t(\"checklist.edit_reason\")\n          });\n          if (save && save.then) {\n            save.then(() => {\n              postWidget.attrs.isSaving = false;\n              postWidget.scheduleRerender();\n            }).finally(() => removeReadonlyClass(boxes));\n          } else {\n            removeReadonlyClass(boxes);\n          }\n        }).catch(() => removeReadonlyClass(boxes));\n      };\n    });\n  }\n  var _default = {\n    name: \"checklist\",\n    initialize: function () {\n      (0, _pluginApi.withPluginApi)(\"0.1\", api => initializePlugin(api));\n    }\n  };\n  _exports.default = _default;\n});","define(\"discourse/plugins/discourse-checklist/lib/discourse-markdown/checklist\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.setup = setup;\n  0; //eaimeta@70e063a35619d71feaimeta@70e063a35619d71f\n  const REGEX = /\\[(\\s?|x|X)\\]/g;\n  function getClasses(str) {\n    switch (str) {\n      case \"x\":\n        return \"checked fa fa-check-square-o fa-fw\";\n      case \"X\":\n        return \"checked permanent fa fa-check-square fa-fw\";\n      default:\n        return \"fa fa-square-o fa-fw\";\n    }\n  }\n  function addCheckbox(result, content, match, state) {\n    const classes = getClasses(match[1]);\n    const checkOpenToken = new state.Token(\"check_open\", \"span\", 1);\n    checkOpenToken.attrs = [[\"class\", `chcklst-box ${classes}`]];\n    result.push(checkOpenToken);\n    const checkCloseToken = new state.Token(\"check_close\", \"span\", -1);\n    result.push(checkCloseToken);\n  }\n  function applyCheckboxes(content, state) {\n    let match;\n    let result = null;\n    let pos = 0;\n    while (match = REGEX.exec(content)) {\n      if (match.index > pos) {\n        result = result || [];\n        const token = new state.Token(\"text\", \"\", 0);\n        token.content = content.slice(pos, match.index);\n        result.push(token);\n      }\n      pos = match.index + match[0].length;\n      result = result || [];\n      addCheckbox(result, content, match, state);\n    }\n    if (result && pos < content.length) {\n      const token = new state.Token(\"text\", \"\", 0);\n      token.content = content.slice(pos);\n      result.push(token);\n    }\n    return result;\n  }\n  function processChecklist(state) {\n    let i,\n      j,\n      l,\n      tokens,\n      token,\n      blockTokens = state.tokens,\n      nesting = 0;\n    for (j = 0, l = blockTokens.length; j < l; j++) {\n      if (blockTokens[j].type !== \"inline\") {\n        continue;\n      }\n      tokens = blockTokens[j].children;\n\n      // We scan from the end, to keep position when new tags are added.\n      // Use reversed logic in links start/end match\n      for (i = tokens.length - 1; i >= 0; i--) {\n        token = tokens[i];\n        nesting += token.nesting;\n        if (token.type === \"text\" && nesting === 0) {\n          const processed = applyCheckboxes(token.content, state);\n          if (processed) {\n            blockTokens[j].children = tokens = state.md.utils.arrayReplaceAt(tokens, i, processed);\n          }\n        }\n      }\n    }\n  }\n  function setup(helper) {\n    helper.registerOptions((opts, siteSettings) => {\n      opts.features[\"checklist\"] = !!siteSettings.checklist_enabled;\n    });\n    helper.allowList([\"span.chcklst-stroked\", \"span.chcklst-box fa fa-square-o fa-fw\", \"span.chcklst-box checked fa fa-check-square-o fa-fw\", \"span.chcklst-box checked permanent fa fa-check-square fa-fw\"]);\n    helper.registerPlugin(md => md.core.ruler.push(\"checklist\", processChecklist));\n  }\n});"],"mappings":"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"}