{"version":3,"file":"lib-parser.cjs","sources":["../../../../../../node_modules/xss/lib/parser.js"],"sourcesContent":["/**\n * Simple HTML Parser\n *\n * @author Zongmin Lei<leizongmin@gmail.com>\n */\n\nvar _ = require(\"./util\");\n\n/**\n * get tag name\n *\n * @param {String} html e.g. '<a hef=\"#\">'\n * @return {String}\n */\nfunction getTagName(html) {\n  var i = _.spaceIndex(html);\n  var tagName;\n  if (i === -1) {\n    tagName = html.slice(1, -1);\n  } else {\n    tagName = html.slice(1, i + 1);\n  }\n  tagName = _.trim(tagName).toLowerCase();\n  if (tagName.slice(0, 1) === \"/\") tagName = tagName.slice(1);\n  if (tagName.slice(-1) === \"/\") tagName = tagName.slice(0, -1);\n  return tagName;\n}\n\n/**\n * is close tag?\n *\n * @param {String} html 如：'<a hef=\"#\">'\n * @return {Boolean}\n */\nfunction isClosing(html) {\n  return html.slice(0, 2) === \"</\";\n}\n\n/**\n * parse input html and returns processed html\n *\n * @param {String} html\n * @param {Function} onTag e.g. function (sourcePosition, position, tag, html, isClosing)\n * @param {Function} escapeHtml\n * @return {String}\n */\nfunction parseTag(html, onTag, escapeHtml) {\n  \"use strict\";\n\n  var rethtml = \"\";\n  var lastPos = 0;\n  var tagStart = false;\n  var quoteStart = false;\n  var currentPos = 0;\n  var len = html.length;\n  var currentTagName = \"\";\n  var currentHtml = \"\";\n\n  chariterator: for (currentPos = 0; currentPos < len; currentPos++) {\n    var c = html.charAt(currentPos);\n    if (tagStart === false) {\n      if (c === \"<\") {\n        tagStart = currentPos;\n        continue;\n      }\n    } else {\n      if (quoteStart === false) {\n        if (c === \"<\") {\n          rethtml += escapeHtml(html.slice(lastPos, currentPos));\n          tagStart = currentPos;\n          lastPos = currentPos;\n          continue;\n        }\n        if (c === \">\" || currentPos === len - 1) {\n          rethtml += escapeHtml(html.slice(lastPos, tagStart));\n          currentHtml = html.slice(tagStart, currentPos + 1);\n          currentTagName = getTagName(currentHtml);\n          rethtml += onTag(\n            tagStart,\n            rethtml.length,\n            currentTagName,\n            currentHtml,\n            isClosing(currentHtml)\n          );\n          lastPos = currentPos + 1;\n          tagStart = false;\n          continue;\n        }\n        if (c === '\"' || c === \"'\") {\n          var i = 1;\n          var ic = html.charAt(currentPos - i);\n\n          while (ic.trim() === \"\" || ic === \"=\") {\n            if (ic === \"=\") {\n              quoteStart = c;\n              continue chariterator;\n            }\n            ic = html.charAt(currentPos - ++i);\n          }\n        }\n      } else {\n        if (c === quoteStart) {\n          quoteStart = false;\n          continue;\n        }\n      }\n    }\n  }\n  if (lastPos < len) {\n    rethtml += escapeHtml(html.substr(lastPos));\n  }\n\n  return rethtml;\n}\n\nvar REGEXP_ILLEGAL_ATTR_NAME = /[^a-zA-Z0-9\\\\_:.-]/gim;\n\n/**\n * parse input attributes and returns processed attributes\n *\n * @param {String} html e.g. `href=\"#\" target=\"_blank\"`\n * @param {Function} onAttr e.g. `function (name, value)`\n * @return {String}\n */\nfunction parseAttr(html, onAttr) {\n  \"use strict\";\n\n  var lastPos = 0;\n  var lastMarkPos = 0;\n  var retAttrs = [];\n  var tmpName = false;\n  var len = html.length;\n\n  function addAttr(name, value) {\n    name = _.trim(name);\n    name = name.replace(REGEXP_ILLEGAL_ATTR_NAME, \"\").toLowerCase();\n    if (name.length < 1) return;\n    var ret = onAttr(name, value || \"\");\n    if (ret) retAttrs.push(ret);\n  }\n\n  // 逐个分析字符\n  for (var i = 0; i < len; i++) {\n    var c = html.charAt(i);\n    var v, j;\n    if (tmpName === false && c === \"=\") {\n      tmpName = html.slice(lastPos, i);\n      lastPos = i + 1;\n      lastMarkPos = html.charAt(lastPos) === '\"' || html.charAt(lastPos) === \"'\" ? lastPos : findNextQuotationMark(html, i + 1);\n      continue;\n    }\n    if (tmpName !== false) {\n      if (\n        i === lastMarkPos\n      ) {\n        j = html.indexOf(c, i + 1);\n        if (j === -1) {\n          break;\n        } else {\n          v = _.trim(html.slice(lastMarkPos + 1, j));\n          addAttr(tmpName, v);\n          tmpName = false;\n          i = j;\n          lastPos = i + 1;\n          continue;\n        }\n      }\n    }\n    if (/\\s|\\n|\\t/.test(c)) {\n      html = html.replace(/\\s|\\n|\\t/g, \" \");\n      if (tmpName === false) {\n        j = findNextEqual(html, i);\n        if (j === -1) {\n          v = _.trim(html.slice(lastPos, i));\n          addAttr(v);\n          tmpName = false;\n          lastPos = i + 1;\n          continue;\n        } else {\n          i = j - 1;\n          continue;\n        }\n      } else {\n        j = findBeforeEqual(html, i - 1);\n        if (j === -1) {\n          v = _.trim(html.slice(lastPos, i));\n          v = stripQuoteWrap(v);\n          addAttr(tmpName, v);\n          tmpName = false;\n          lastPos = i + 1;\n          continue;\n        } else {\n          continue;\n        }\n      }\n    }\n  }\n\n  if (lastPos < html.length) {\n    if (tmpName === false) {\n      addAttr(html.slice(lastPos));\n    } else {\n      addAttr(tmpName, stripQuoteWrap(_.trim(html.slice(lastPos))));\n    }\n  }\n\n  return _.trim(retAttrs.join(\" \"));\n}\n\nfunction findNextEqual(str, i) {\n  for (; i < str.length; i++) {\n    var c = str[i];\n    if (c === \" \") continue;\n    if (c === \"=\") return i;\n    return -1;\n  }\n}\n\nfunction findNextQuotationMark(str, i) {\n  for (; i < str.length; i++) {\n    var c = str[i];\n    if (c === \" \") continue;\n    if (c === \"'\" || c === '\"') return i;\n    return -1;\n  }\n}\n\nfunction findBeforeEqual(str, i) {\n  for (; i > 0; i--) {\n    var c = str[i];\n    if (c === \" \") continue;\n    if (c === \"=\") return i;\n    return -1;\n  }\n}\n\nfunction isQuoteWrapString(text) {\n  if (\n    (text[0] === '\"' && text[text.length - 1] === '\"') ||\n    (text[0] === \"'\" && text[text.length - 1] === \"'\")\n  ) {\n    return true;\n  } else {\n    return false;\n  }\n}\n\nfunction stripQuoteWrap(text) {\n  if (isQuoteWrapString(text)) {\n    return text.substr(1, text.length - 2);\n  } else {\n    return text;\n  }\n}\n\nexports.parseTag = parseTag;\nexports.parseAttr = parseAttr;\n"],"names":["require$$0","parser"],"mappings":"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","x_google_ignoreList":[0]}