{"version":3,"file":"text.cjs","sources":["../../../src/text/text.ts"],"sourcesContent":["export interface TextMatch {\n  text: string;\n  start: number;\n  length: number;\n  end: number;\n}\n\n/**\n * Adapt findMatchesInText for react-highlight-words findChunks handler.\n * See https://github.com/bvaughn/react-highlight-words#props\n */\nexport function findHighlightChunksInText({\n  searchWords,\n  textToHighlight,\n}: {\n  searchWords: Array<string | RegExp>;\n  textToHighlight: string;\n}) {\n  const chunks: TextMatch[] = [];\n  for (const term of searchWords) {\n    if (typeof term === 'string') {\n      chunks.push(...findMatchesInText(textToHighlight, term));\n    }\n  }\n  return chunks;\n}\n\nconst cleanNeedle = (needle: string): string => {\n  return needle.replace(/[[{(][\\w,.\\/:;<=>?:*+]+$/, '');\n};\n\n/**\n * Returns a list of substring regexp matches.\n */\nexport function findMatchesInText(haystack: string, needle: string): TextMatch[] {\n  // Empty search can send re.exec() into infinite loop, exit early\n  if (!haystack || !needle) {\n    return [];\n  }\n\n  const matches: TextMatch[] = [];\n  const { cleaned, flags } = parseFlags(cleanNeedle(needle));\n  let regexp: RegExp;\n\n  try {\n    regexp = new RegExp(`(?:${cleaned})`, flags);\n  } catch (error) {\n    return matches;\n  }\n\n  haystack.replace(regexp, (substring, ...rest) => {\n    if (substring) {\n      const offset = rest[rest.length - 2];\n      matches.push({\n        text: substring,\n        start: offset,\n        length: substring.length,\n        end: offset + substring.length,\n      });\n    }\n    return '';\n  });\n\n  return matches;\n}\n\nconst CLEAR_FLAG = '-';\nconst FLAGS_REGEXP = /\\(\\?([ims-]+)\\)/g;\n\n/**\n * Converts any mode modifiers in the text to the Javascript equivalent flag\n */\nexport function parseFlags(text: string): { cleaned: string; flags: string } {\n  const flags: Set<string> = new Set(['g']);\n\n  const cleaned = text.replace(FLAGS_REGEXP, (str, group) => {\n    const clearAll = group.startsWith(CLEAR_FLAG);\n\n    for (let i = 0; i < group.length; ++i) {\n      const flag = group.charAt(i);\n      if (clearAll || group.charAt(i - 1) === CLEAR_FLAG) {\n        flags.delete(flag);\n      } else if (flag !== CLEAR_FLAG) {\n        flags.add(flag);\n      }\n    }\n    return ''; // Remove flag from text\n  });\n\n  return {\n    cleaned: cleaned,\n    flags: Array.from(flags).join(''),\n  };\n}\n"],"names":[],"mappings":";;;;;AAWO,SAAS,yBAAA,CAA0B;AAAA,EACxC,WAAA;AAAA,EACA;AACF,CAAA,EAGG;AACD,EAAA,MAAM,SAAsB,EAAC;AAC7B,EAAA,KAAA,MAAW,QAAQ,WAAA,EAAa;AAC9B,IAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,MAAA,MAAA,CAAO,IAAA,CAAK,GAAG,iBAAA,CAAkB,eAAA,EAAiB,IAAI,CAAC,CAAA;AAAA,IACzD;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAEA,MAAM,WAAA,GAAc,CAAC,MAAA,KAA2B;AAC9C,EAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,0BAAA,EAA4B,EAAE,CAAA;AACtD,CAAA;AAKO,SAAS,iBAAA,CAAkB,UAAkB,MAAA,EAA6B;AAE/E,EAAA,IAAI,CAAC,QAAA,IAAY,CAAC,MAAA,EAAQ;AACxB,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,MAAM,UAAuB,EAAC;AAC9B,EAAA,MAAM,EAAE,OAAA,EAAS,KAAA,KAAU,UAAA,CAAW,WAAA,CAAY,MAAM,CAAC,CAAA;AACzD,EAAA,IAAI,MAAA;AAEJ,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,IAAI,MAAA,CAAO,CAAA,GAAA,EAAM,OAAO,KAAK,KAAK,CAAA;AAAA,EAC7C,SAAS,KAAA,EAAO;AACd,IAAA,OAAO,OAAA;AAAA,EACT;AAEA,EAAA,QAAA,CAAS,OAAA,CAAQ,MAAA,EAAQ,CAAC,SAAA,EAAA,GAAc,IAAA,KAAS;AAC/C,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA;AACnC,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,IAAA,EAAM,SAAA;AAAA,QACN,KAAA,EAAO,MAAA;AAAA,QACP,QAAQ,SAAA,CAAU,MAAA;AAAA,QAClB,GAAA,EAAK,SAAS,SAAA,CAAU;AAAA,OACzB,CAAA;AAAA,IACH;AACA,IAAA,OAAO,EAAA;AAAA,EACT,CAAC,CAAA;AAED,EAAA,OAAO,OAAA;AACT;AAEA,MAAM,UAAA,GAAa,GAAA;AACnB,MAAM,YAAA,GAAe,kBAAA;AAKd,SAAS,WAAW,IAAA,EAAkD;AAC3E,EAAA,MAAM,KAAA,mBAAqB,IAAI,GAAA,CAAI,CAAC,GAAG,CAAC,CAAA;AAExC,EAAA,MAAM,UAAU,IAAA,CAAK,OAAA,CAAQ,YAAA,EAAc,CAAC,KAAK,KAAA,KAAU;AACzD,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,UAAA,CAAW,UAAU,CAAA;AAE5C,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAA,EAAQ,EAAE,CAAA,EAAG;AACrC,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA;AAC3B,MAAA,IAAI,YAAY,KAAA,CAAM,MAAA,CAAO,CAAA,GAAI,CAAC,MAAM,UAAA,EAAY;AAClD,QAAA,KAAA,CAAM,OAAO,IAAI,CAAA;AAAA,MACnB,CAAA,MAAA,IAAW,SAAS,UAAA,EAAY;AAC9B,QAAA,KAAA,CAAM,IAAI,IAAI,CAAA;AAAA,MAChB;AAAA,IACF;AACA,IAAA,OAAO,EAAA;AAAA,EACT,CAAC,CAAA;AAED,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,OAAO,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA,CAAE,KAAK,EAAE;AAAA,GAClC;AACF;;;;;;"}