{"version":3,"sources":["jsdelivr-header.js","/npm/truncate-html@1.2.2/dist/truncate.cjs.js"],"names":[],"mappings":"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","file":"/npm/truncate-html@1.2.2/dist/truncate.cjs.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/truncate-html@1.2.2/dist/truncate.cjs.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","\"use strict\";\nconst cheerio = require(\"cheerio\");\nconst astralRange = /\\ud83c[\\udffb-\\udfff](?=\\ud83c[\\udffb-\\udfff])|(?:[^\\ud800-\\udfff][\\u0300-\\u036f\\ufe20-\\ufe23\\u20d0-\\u20f0]?|[\\u0300-\\u036f\\ufe20-\\ufe23\\u20d0-\\u20f0]|(?:\\ud83c[\\udde6-\\uddff]){2}|[\\ud800-\\udbff][\\udc00-\\udfff]|[\\ud800-\\udfff])[\\ufe0e\\ufe0f]?(?:[\\u0300-\\u036f\\ufe20-\\ufe23\\u20d0-\\u20f0]|\\ud83c[\\udffb-\\udfff])?(?:\\u200d(?:[^\\ud800-\\udfff]|(?:\\ud83c[\\udde6-\\uddff]){2}|[\\ud800-\\udbff][\\udc00-\\udfff])[\\ufe0e\\ufe0f]?(?:[\\u0300-\\u036f\\ufe20-\\ufe23\\u20d0-\\u20f0]|\\ud83c[\\udffb-\\udfff])?)*/g;\nconst defaultOptions = {\n  // remove all tags\n  stripTags: false,\n  // postfix of the string\n  ellipsis: \"...\",\n  // decode html entities\n  decodeEntities: false,\n  // whether truncate by words\n  byWords: false,\n  // // truncate by words, set to true keep words\n  // // set to number then truncate by word count\n  // length: 0\n  excludes: \"\",\n  // remove tags\n  customNodeStrategy: (n) => n,\n  reserveLastWord: false,\n  // keep word completed if truncate at the middle of the word, works no matter byWords is true/false\n  trimTheOnlyWord: false,\n  keepWhitespaces: false\n  // even if set true, continuous whitespace will count as one\n};\nlet userDefaults = defaultOptions;\nfunction truncate(html, length, truncateOptions) {\n  const options = sanitizeOptions(length, truncateOptions);\n  if (!html || isNaN(options.length) || options.length < 1 || options.length === Infinity) {\n    return isCheerioInstance(html) ? html.html() || \"\" : html;\n  }\n  let $;\n  if (isCheerioInstance(html)) {\n    $ = html;\n  } else {\n    $ = cheerio.load(`${html}`, {\n      decodeEntities: options.decodeEntities\n    }, false);\n  }\n  const $html = $.root();\n  if (options.excludes) $html.find(options.excludes).remove();\n  if (options.stripTags) {\n    return truncateText($html.text(), options);\n  }\n  const travelChildren = function($ele, isParentLastNode = true) {\n    const contents = $ele.contents();\n    const lastIdx = contents.length - 1;\n    return contents.each(function(idx) {\n      const nodeType = this.type;\n      const node = $(this);\n      if (nodeType === \"text\") {\n        if (!options.limit) {\n          node.remove();\n          return;\n        }\n        this.data = truncateText(\n          node.text(),\n          options,\n          isParentLastNode && idx === lastIdx\n        );\n        return;\n      }\n      if (nodeType === \"tag\") {\n        if (!options.limit) {\n          node.remove();\n          return;\n        }\n        const strategy = options.customNodeStrategy(node);\n        if (strategy === \"remove\") {\n          node.remove();\n          return;\n        }\n        if (strategy === \"keep\") {\n          return;\n        }\n        travelChildren(strategy || node, isParentLastNode && idx === lastIdx);\n        return;\n      }\n      node.remove();\n      return;\n    });\n  };\n  travelChildren($html);\n  return $html.html() || \"\";\n}\ntruncate.setup = function(options) {\n  userDefaults = extendOptions(options, defaultOptions);\n};\nfunction truncateText(text, options, isLastNode) {\n  if (!options.keepWhitespaces) {\n    text = text.replace(/\\s+/g, \" \");\n  }\n  const byWords = options.byWords;\n  const astralSafeCharacterArray = text.match(astralRange);\n  if (!astralSafeCharacterArray) {\n    return \"\";\n  }\n  const strLen = astralSafeCharacterArray.length;\n  let idx = 0;\n  let count = 0;\n  let prevIsBlank = byWords;\n  let curIsBlank = false;\n  while (idx < strLen) {\n    curIsBlank = isBlank(astralSafeCharacterArray[idx++]);\n    if (byWords && prevIsBlank === curIsBlank) continue;\n    if (count === options.limit) {\n      if (prevIsBlank && curIsBlank) {\n        prevIsBlank = curIsBlank;\n        continue;\n      }\n      --idx;\n      break;\n    }\n    if (byWords) {\n      if (!curIsBlank) ++count;\n    } else {\n      if (!(curIsBlank && prevIsBlank)) ++count;\n    }\n    prevIsBlank = curIsBlank;\n  }\n  options.limit -= count;\n  if (options.limit) {\n    return text;\n  }\n  const str = byWords ? astralSafeCharacterArray.slice(0, idx).join(\"\") : substr(astralSafeCharacterArray, idx, options);\n  if (str === text) {\n    return isLastNode ? text : text + options.ellipsis;\n  } else {\n    return str + options.ellipsis;\n  }\n}\nfunction substr(astralSafeCharacterArray, len, options) {\n  const sliced = astralSafeCharacterArray.slice(0, len).join(\"\");\n  if (!options.reserveLastWord || astralSafeCharacterArray.length === len) {\n    return sliced;\n  }\n  const boundary = astralSafeCharacterArray.slice(len - 1, len + 1).join(\"\");\n  if (/\\W/.test(boundary)) {\n    return sliced;\n  }\n  if (typeof options.reserveLastWord === \"number\" && options.reserveLastWord < 0) {\n    const result = sliced.replace(/\\w+$/, \"\");\n    if (!(result.length === 0 && sliced.length === options.length)) {\n      return result;\n    }\n    if (options.trimTheOnlyWord) return sliced;\n  }\n  const maxExceeded = options.reserveLastWord !== true && options.reserveLastWord > 0 ? options.reserveLastWord : 10;\n  const mtc = astralSafeCharacterArray.slice(len).join(\"\").match(/(\\w+)/);\n  const exceeded = mtc ? mtc[1] : \"\";\n  return sliced + exceeded.substring(0, maxExceeded);\n}\nfunction sanitizeOptions(length, truncateOptions) {\n  switch (typeof length) {\n    case \"object\":\n      truncateOptions = length;\n      break;\n    case \"number\":\n      if (typeof truncateOptions === \"object\") {\n        truncateOptions.length = length;\n      } else {\n        truncateOptions = {\n          length\n        };\n      }\n  }\n  if (truncateOptions && truncateOptions.excludes) {\n    if (!Array.isArray(truncateOptions.excludes)) {\n      truncateOptions.excludes = [truncateOptions.excludes];\n    }\n    truncateOptions.excludes = truncateOptions.excludes.join(\",\");\n  }\n  const options = extendOptions(Object.assign({}, userDefaults, truncateOptions), defaultOptions);\n  options.limit = options.length;\n  return options;\n}\nfunction isBlank(char) {\n  return char === \" \" || char === \"\\f\" || char === \"\\n\" || char === \"\\r\" || char === \"\t\" || char === \"\\v\" || char === \" \" || char === \"\\u2028\" || char === \"\\u2029\";\n}\nfunction extendOptions(options, defaultOptions2) {\n  if (options == null) {\n    options = {};\n  }\n  for (const k in defaultOptions2) {\n    const v = defaultOptions2[k];\n    if (options[k] != null) {\n      continue;\n    }\n    options[k] = v;\n  }\n  return options;\n}\nfunction isCheerioInstance(elem) {\n  return elem && elem.contains && elem.html && elem.parseHTML && true;\n}\nmodule.exports = truncate;\n"]}