{"version":3,"file":"linch90-od-highlight-pipe.mjs","sources":["../../../projects/od-highlight-pipe/src/lib/match.override.ts","../../../projects/od-highlight-pipe/src/lib/highlight.pipe.ts","../../../projects/od-highlight-pipe/src/lib/od-highlight-pipe.module.ts","../../../projects/od-highlight-pipe/src/public-api.ts","../../../projects/od-highlight-pipe/src/linch90-od-highlight-pipe.ts"],"sourcesContent":["import { pinyin as _pinyin } from 'pinyin-pro';\n\ninterface MatchOptions {\n  /**\n   * @description 每个汉字和拼音需要遵从的匹配精度\n   */\n  precision?: 'first' | 'start' | 'every' | 'any';\n  /**\n   * @description 匹配的汉字下标是否为连续的才算匹配成功\n   */\n  continuous?: boolean;\n  /**\n   * @description 匹配时对于空格的处理\n   */\n  space?: 'ignore' | 'preserve';\n  /**\n   * @description 最后一个字的匹配精度\n   */\n  lastPrecision?: 'first' | 'start' | 'every' | 'any';\n}\n\nconst DefaultMatchOptions: MatchOptions = {\n  precision: 'first',\n  continuous: false,\n  space: 'ignore',\n  lastPrecision: 'start',\n};\n\nconst MAX_PINYIN_LENGTH = 6;\n\n/**\n * @description: 检测汉语字符串和拼音是否匹配\n * @param {string} text 汉语字符串\n * @param {string} pinyin 拼音，支持各种缩写形式\n * @param {MatchOptions=} options 配置项\n * @return {Array | null} 若匹配成功，返回 text 中匹配成功的下标数组；若匹配失败，返回 null\n */\nexport const matchOverride = (\n  text: string,\n  pinyin: string,\n  options?: MatchOptions\n): number[] | null => {\n  if (options?.precision === 'any') {\n    options.lastPrecision = 'any';\n  }\n  const completeOptions = {\n    ...DefaultMatchOptions,\n    ...(options || {}),\n  } as Required<MatchOptions>;\n  // 移除空格\n  if (completeOptions.space === 'ignore') {\n    pinyin = pinyin.replace(/\\s/g, '');\n  }\n  const result =\n    options?.precision === 'any'\n      ? matchAny(text, pinyin, completeOptions)\n      : matchAboveStart(text, pinyin, completeOptions);\n  return result;\n};\n\n// /**\n//  * @description: 检测汉语字符串和拼音是否匹配\n//  * @param {string} text 汉语字符串\n//  * @param {string} pinyin 拼音，支持各种缩写形式\n//  * @return {Array | null} 若匹配成功，返回拼音在汉字中的下标数组；若匹配失败，返回 null\n//  */\n// export const matchOverride = (text: string, pinyin: string) => {\n//   const result = [];\n//   let currentPinyin = pinyin;\n//   let i = 0;\n//   // 是否为部分整体匹配\n//   let lowerWords = text.toLowerCase();\n//   let lowerPinyin = pinyin.toLowerCase();\n//   if (lowerWords.includes(lowerPinyin)) {\n//     i = lowerWords.indexOf(lowerPinyin);\n//   }\n//   for (; i < text.length; i++) {\n//     // 是否为一致匹配\n//     let x = lowerWords[i];\n//     let y = currentPinyin[0]?.toLowerCase();\n\n//     if (x === y) {\n//       currentPinyin = currentPinyin.slice(1);\n//       result.push(i);\n//       continue;\n//     }\n//     // 当前字的多音字拼音\n//     const ps = _pinyin(text[i], {\n//       toneType: 'none',\n//       multiple: true,\n//       type: 'array',\n//     });\n//     let currentLength = 0;\n//     ps.forEach((p) => {\n//       const length = getMatchLength(p, currentPinyin);\n//       if (length > currentLength) {\n//         currentLength = length;\n//       }\n//     });\n//     if (currentLength) {\n//       currentPinyin = currentPinyin.slice(currentLength);\n//       result.push(i);\n//     }\n//     if (!currentPinyin) {\n//       break;\n//     }\n//   }\n//   return result.length && !currentPinyin ? result : null;\n// };\n\n// 检测两个拼音最大的匹配长度\nconst getMatchLength = (pinyin1: string, pinyin2: string) => {\n  let length = 0;\n  for (let i = 0; i < pinyin1.length; i++) {\n    if (pinyin1[i] === pinyin2[length]) {\n      length++;\n    }\n  }\n  return length;\n};\n\nconst matchAny = (\n  text: string,\n  pinyin: string,\n  options: Required<MatchOptions>\n): number[] | null => {\n  let result = [];\n\n  text = text.toLowerCase();\n  pinyin = pinyin.toLowerCase();\n\n  let i = 0;\n  const matchIndex = text.indexOf(pinyin);\n  if (matchIndex !== -1) i = matchIndex;\n\n  for (; i < text.length; i++) {\n    // 空格字符\n    if (options.space === 'ignore' && text[i] === ' ') {\n      result.push(i);\n      continue;\n    }\n    // 是否为一致匹配\n    if (text[i] === pinyin[0]) {\n      pinyin = pinyin.slice(1);\n      result.push(i);\n      continue;\n    }\n\n    // 当前字的多音字拼音\n    const ps = _pinyin(text[i], {\n      toneType: 'none',\n      multiple: true,\n      type: 'array',\n    });\n    let currentLength = 0;\n    ps.forEach((p) => {\n      const length = getMatchLength(p, pinyin);\n      if (length > currentLength) {\n        currentLength = length;\n      }\n    });\n    if (currentLength) {\n      pinyin = pinyin.slice(currentLength);\n      result.push(i);\n    }\n    if (!pinyin) {\n      break;\n    }\n  }\n  // 未匹配完\n  if (pinyin) {\n    return null;\n  }\n  // 是否连续\n  if (options.continuous) {\n    const _result = result;\n    const isNotContinuous = result.some(\n      (val, index) => index > 0 && val !== _result[index - 1] + 1\n    );\n    if (isNotContinuous) {\n      return null;\n    }\n  }\n  if (options.space === 'ignore') {\n    result = result.filter((i) => text[i] !== ' ');\n  }\n  return result.length ? result : null;\n};\n\nconst matchAboveStart = (\n  text: string,\n  pinyin: string,\n  options: Required<MatchOptions>\n): number[] | null => {\n  text = text.toLowerCase();\n  pinyin = pinyin.toLowerCase();\n\n  if (text.includes(pinyin))\n    return matchAny(text, pinyin, { ...options, precision: 'any' });\n\n  const words = text.split('');\n\n  // 二维数组 dp[i][j]，i 表示遍历到的 text 索引+1, j 表示遍历到的 pinyin 的索引+1\n  const dp = Array(words.length + 1);\n  // 使用哨兵初始化 dp\n  for (let i = 0; i < dp.length; i++) {\n    dp[i] = Array(pinyin.length + 1);\n    dp[i][0] = [];\n  }\n  for (let i = 0; i < dp[0].length; i++) {\n    dp[0][i] = [];\n  }\n\n  // 动态规划匹配\n  for (let i = 1; i < dp.length; i++) {\n    // options.continuous 为 false 或 options.space 为 ignore 且当前为空格时，第 i 个字可以不参与匹配\n    if (\n      !options.continuous ||\n      (options.space == 'ignore' && text[i - 1] === ' ')\n    ) {\n      for (let j = 1; j <= pinyin.length; j++) {\n        dp[i][j - 1] = dp[i - 1][j - 1];\n      }\n    }\n    // 第 i 个字参与匹配\n    for (let j = 1; j <= pinyin.length; j++) {\n      if (!dp[i - 1][j - 1]) {\n        // 第 i - 1 已经匹配失败，停止向后匹配\n        continue;\n      } else if (j !== 1 && !dp[i - 1][j - 1].length) {\n        // 非开头且前面的字符未匹配完成，停止向后匹配\n        continue;\n      } else {\n        const muls = _pinyin(text[i - 1], {\n          type: 'array',\n          toneType: 'none',\n          multiple: true,\n        });\n\n        // 非中文匹配\n        if (text[i - 1] === pinyin[j - 1]) {\n          const matches = [...dp[i - 1][j - 1], i - 1];\n          // 记录最长的可匹配下标数组\n          if (!dp[i][j] || matches.length > dp[i][j].length) {\n            dp[i][j] = matches;\n          }\n          // pinyin 参数完全匹配完成，记录结果\n          if (j === pinyin.length) {\n            return dp[i][j];\n          }\n        }\n\n        // 剩余长度小于等于 MAX_PINYIN_LENGTH(6) 时，有可能是最后一个拼音了\n        if (pinyin.length - j <= MAX_PINYIN_LENGTH) {\n          // lastPrecision 参数处理\n          const last = muls.some((py) => {\n            if (options.lastPrecision === 'any') {\n              return py.includes(pinyin.slice(j - 1, pinyin.length));\n            }\n            if (options.lastPrecision === 'start') {\n              return py.startsWith(pinyin.slice(j - 1, pinyin.length));\n            }\n            if (options.lastPrecision === 'first') {\n              return py[0] === pinyin.slice(j - 1, pinyin.length);\n            }\n            if (options.lastPrecision === 'every') {\n              return py === pinyin.slice(j - 1, pinyin.length);\n            }\n            return false;\n          });\n          if (last) {\n            return [...dp[i - 1][j - 1], i - 1];\n          }\n        }\n\n        const precision = options.precision;\n\n        // precision 为 start 时，匹配开头\n        if (precision === 'start') {\n          muls.forEach((py) => {\n            let end = j;\n            const matches = [...dp[i - 1][j - 1], i - 1];\n            while (\n              end <= pinyin.length &&\n              py.startsWith(pinyin.slice(j - 1, end))\n            ) {\n              if (!dp[i][end] || matches.length > dp[i][end].length) {\n                dp[i][end] = matches;\n              }\n              end++;\n            }\n          });\n        }\n\n        // precision 为 first 时，匹配首字母\n        if (precision === 'first') {\n          if (muls.some((py) => py[0] === pinyin[j - 1])) {\n            const matches = [...dp[i - 1][j - 1], i - 1];\n            // 记录最长的可匹配下标数组\n            if (!dp[i][j] || matches.length > dp[i][j].length) {\n              dp[i][j] = matches;\n            }\n          }\n        }\n\n        // 匹配当前汉字的完整拼音\n        const completeMatch = muls.find(\n          (py: string) => py === pinyin.slice(j - 1, j - 1 + py.length)\n        );\n        if (completeMatch) {\n          const matches = [...dp[i - 1][j - 1], i - 1];\n          const endIndex = j - 1 + completeMatch.length;\n          // 记录最长的可匹配下标数组\n          if (!dp[i][endIndex] || matches.length > dp[i][endIndex].length) {\n            dp[i][endIndex] = matches;\n          }\n        }\n      }\n    }\n  }\n  return null;\n};\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { match, pinyin } from 'pinyin-pro';\nimport { matchOverride } from './match.override';\n\nconst escape = (s: string) => s.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\nconst replaceStartPattern = (s: string) => new RegExp(`^${s}`);\n\n@Pipe({\n  name: 'highlight',\n})\nexport class HighlightPipe implements PipeTransform {\n  /**\n   * @name transform\n   * @param value {string}\n   * @param input {string}\n   * @param pinyinMode {boolean} if enable pinyin parsing mode\n   */\n  public transform(value: string, input: string, pinyinMode = false): string {\n    const trimmedInput = input?.trim();\n    if (\n      trimmedInput === null ||\n      trimmedInput === undefined ||\n      trimmedInput === ''\n    ) {\n      return value;\n    }\n\n    try {\n      if (pinyinMode) {\n        const m = matchOverride(value, input, { precision: 'start' });\n        if (m !== null) {\n          const pinyinArr = pinyin(value, {\n            nonZh: 'consecutive',\n            toneType: 'none',\n            v: true,\n            type: 'array',\n          });\n\n          if (pinyinArr.length) {\n            const firstCharArr = pinyin(value, {\n              pattern: 'first',\n              nonZh: 'consecutive',\n              toneType: 'none',\n              v: true,\n              type: 'array',\n            });\n\n            let newInputArr: string[] = [];\n            m.forEach((mi, i) => {\n              let regex = new RegExp(replaceStartPattern(pinyinArr[i]));\n              let newInput = input.replace(regex, '');\n              if (newInput === input) {\n                regex = new RegExp(replaceStartPattern(firstCharArr[i]));\n                newInput = input.replace(regex, '');\n              }\n\n              newInputArr.push(value[mi]);\n              input = newInput;\n            });\n\n            input = newInputArr.join('');\n          }\n        }\n      }\n\n      const regex = new RegExp(`(${escape(input)})`, 'i');\n      return value.replace(regex, '<b>$1</b>');\n    } catch (e) {\n      return value;\n    }\n  }\n}\n","import { NgModule } from '@angular/core';\nimport { HighlightPipe } from './highlight.pipe';\n\n@NgModule({\n  declarations: [HighlightPipe],\n  imports: [],\n  exports: [HighlightPipe],\n})\nexport class OdHighlightPipeModule {}\n","/*\n * Public API Surface of @linch90/od-highlight-pipe\n */\n\nexport * from './lib/highlight.pipe';\nexport * from './lib/od-highlight-pipe.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["pinyin","_pinyin"],"mappings":"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"}