{"version":3,"file":"text-splitter.cjs","sources":["../../../src/utils/text-splitter.js"],"sourcesContent":["/**\n * 文本分割工具类\n * 用于将文本按字符、单词或行进行分割，并计算每个片段的位置和尺寸\n * 使用 Canvas API 准确计算文本尺寸\n */\nimport { createCanvas } from '@napi-rs/canvas';\n\nexport class TextSplitter {\n  constructor(text, options = {}) {\n    this.text = text || '';\n    this.options = {\n      fontSize: options.fontSize || 24,\n      fontFamily: options.fontFamily || 'Arial',\n      fontWeight: options.fontWeight || 'normal',\n      fontStyle: options.fontStyle || 'normal',\n      // 字符间距\n      charSpacing: options.charSpacing || (options.fontSize * 0.1),\n      // 单词间距\n      wordSpacing: options.wordSpacing || (options.fontSize * 0.3),\n      // 行高\n      lineHeight: options.lineHeight || 1.2,\n      // 是否启用动态间距\n      dynamicSpacing: options.dynamicSpacing !== false,\n      ...options\n    };\n\n    // 创建 Canvas 上下文用于测量文本\n    this.canvas = createCanvas(1, 1);\n    this.ctx = this.canvas.getContext('2d');\n    this._setupCanvasContext();\n\n    // 存储分割后的数据\n    this.characters = [];\n    this.words = [];\n    this.lines = [];\n    \n    // 总尺寸\n    this.totalWidth = 0;\n    this.totalHeight = 0;\n\n    // 初始化分割数据\n    this._createCharacters();\n    this._createWords();\n    this._createLines();\n    this._calculateDimensions();\n  }\n\n  /**\n   * 设置 Canvas 上下文字体\n   */\n  _setupCanvasContext() {\n    const { fontSize, fontFamily, fontWeight, fontStyle } = this.options;\n    // 构建字体字符串：fontStyle fontWeight fontSize fontFamily\n    const fontString = `${fontStyle} ${fontWeight} ${fontSize}px ${fontFamily}`;\n    this.ctx.font = fontString;\n    // 设置文本基线\n    this.ctx.textBaseline = 'alphabetic';\n    this.ctx.textAlign = 'left';\n  }\n\n  /**\n   * 使用 Canvas API 准确测量文本宽度\n   */\n  _measureText(text) {\n    if (!text) return 0;\n    \n    // 使用 Canvas API 的 measureText 方法，这是最准确的方式\n    const metrics = this.ctx.measureText(text);\n    return metrics.width;\n  }\n\n  /**\n   * 判断是否为空格字符\n   */\n  _isSpace(char) {\n    return /\\s/.test(char);\n  }\n\n  /**\n   * 判断是否为符号字符\n   */\n  _isSymbol(char) {\n    return /[^\\w\\s\\u4e00-\\u9fa5]/.test(char);\n  }\n\n  /**\n   * 创建字符分割\n   */\n  _createCharacters() {\n    this.characters = [];\n    const chars = Array.from(this.text);\n    \n    for (let i = 0; i < chars.length; i++) {\n      const char = chars[i];\n      const isSpace = this._isSpace(char);\n      const isSymbol = this._isSymbol(char);\n      \n      // 使用 Canvas API 准确测量字符宽度\n      const charWidth = this._measureText(char);\n\n      this.characters.push({\n        text: char,\n        index: i,\n        isSpace,\n        isSymbol,\n        width: charWidth,\n        height: this.options.fontSize,\n        x: 0, // 将在 _calculateDimensions 中设置\n        y: 0\n      });\n    }\n  }\n\n  /**\n   * 创建单词分割\n   */\n  _createWords() {\n    this.words = [];\n    // 使用正则分割，保留空格\n    const parts = this.text.split(/(\\s+)/).filter(part => part.length > 0);\n    \n    for (let i = 0; i < parts.length; i++) {\n      const word = parts[i];\n      const isSpace = word.trim() === '';\n      \n      // 使用 Canvas API 准确测量单词宽度\n      const wordWidth = this._measureText(word);\n\n      this.words.push({\n        text: word,\n        index: i,\n        isSpace,\n        width: wordWidth,\n        height: this.options.fontSize,\n        x: 0, // 将在 _calculateDimensions 中设置\n        y: 0\n      });\n    }\n  }\n\n  /**\n   * 创建行分割\n   * 保留所有行，包括空行（只包含空格的行）\n   */\n  _createLines() {\n    this.lines = [];\n    // 保留所有行，不过滤空行或只包含空格的行\n    const lines = this.text.split('\\n');\n    \n    for (let i = 0; i < lines.length; i++) {\n      const line = lines[i];\n      // 使用 Canvas API 准确测量行宽度（包括空行）\n      const lineWidth = this._measureText(line);\n\n      this.lines.push({\n        text: line,\n        index: i,\n        width: lineWidth,\n        height: this.options.fontSize,\n        x: 0, // 将在 _calculateDimensions 中设置\n        y: 0\n      });\n    }\n  }\n\n  /**\n   * 计算动态字符间距\n   */\n  _calculateDynamicCharSpacing() {\n    const spacing = [];\n\n    if (!this.options.dynamicSpacing) {\n      return spacing;\n    }\n\n    const chars = this.characters.filter(c => !c.isSpace);\n\n    if (chars.length <= 1) {\n      return spacing;\n    }\n\n    const widths = chars.map(c => c.width);\n    const avgWidth = widths.reduce((sum, w) => sum + w, 0) / widths.length;\n    const minWidth = Math.min(...widths);\n    const maxWidth = Math.max(...widths);\n    const widthRange = maxWidth - minWidth;\n\n    if (widthRange < avgWidth * 0.2) {\n      for (let i = 0; i < chars.length - 1; i++) {\n        spacing.push(this.options.charSpacing);\n      }\n      return spacing;\n    }\n\n    for (let i = 0; i < chars.length - 1; i++) {\n      const currentChar = chars[i];\n      const nextChar = chars[i + 1];\n\n      const currentWidthRatio = currentChar.width / avgWidth;\n      const nextWidthRatio = nextChar.width / avgWidth;\n\n      let baseSpacing = this.options.charSpacing;\n\n      // 窄字符对之间减少更多间距\n      if (currentWidthRatio < 0.7 && nextWidthRatio < 0.7) {\n        baseSpacing *= 0.4; // 两个窄字符，减少 60% 间距\n      }\n      // 一个窄字符和一个正常/宽字符\n      else if (currentWidthRatio < 0.7 || nextWidthRatio < 0.7) {\n        baseSpacing *= 0.6; // 涉及窄字符，减少 40% 间距\n      }\n      // 两个宽字符之间减少间距\n      else if (currentWidthRatio > 1.3 && nextWidthRatio > 1.3) {\n        baseSpacing *= 0.7;\n      }\n      // 宽度差异大的一对\n      else if (Math.abs(currentWidthRatio - nextWidthRatio) > 0.6) {\n        baseSpacing *= 0.8;\n      }\n\n      const minSpacing = this.options.charSpacing * 0.2;\n      const maxSpacing = this.options.charSpacing * 1.5;\n      baseSpacing = Math.max(minSpacing, Math.min(maxSpacing, baseSpacing));\n\n      spacing.push(baseSpacing);\n    }\n\n    return spacing;\n  }\n\n  /**\n   * 计算动态单词间距\n   */\n  _calculateDynamicWordSpacing() {\n    const spacing = [];\n    \n    if (!this.options.dynamicSpacing) {\n      return spacing;\n    }\n    \n    const words = this.words.filter(w => !w.isSpace);\n    \n    if (words.length <= 1) {\n      return spacing;\n    }\n    \n    const widths = words.map(w => w.width);\n    const avgWidth = widths.reduce((sum, w) => sum + w, 0) / widths.length;\n    const minWidth = Math.min(...widths);\n    const maxWidth = Math.max(...widths);\n    const widthRange = maxWidth - minWidth;\n    \n    if (widthRange < avgWidth * 0.3) {\n      for (let i = 0; i < words.length - 1; i++) {\n        spacing.push(this.options.wordSpacing);\n      }\n      return spacing;\n    }\n    \n    for (let i = 0; i < words.length - 1; i++) {\n      const currentWord = words[i];\n      const nextWord = words[i + 1];\n      \n      const currentWidthRatio = currentWord.width / avgWidth;\n      const nextWidthRatio = nextWord.width / avgWidth;\n      \n      let baseSpacing = this.options.wordSpacing;\n      \n      if (currentWidthRatio < 0.8 && nextWidthRatio < 0.8) {\n        baseSpacing *= 1.3;\n      } else if (currentWidthRatio > 1.2 && nextWidthRatio > 1.2) {\n        baseSpacing *= 0.8;\n      } else if (Math.abs(currentWidthRatio - nextWidthRatio) > 0.5) {\n        baseSpacing *= 1.1;\n      }\n      \n      const minSpacing = this.options.wordSpacing * 0.5;\n      const maxSpacing = this.options.wordSpacing * 1.8;\n      baseSpacing = Math.max(minSpacing, Math.min(maxSpacing, baseSpacing));\n      \n      spacing.push(baseSpacing);\n    }\n    \n    return spacing;\n  }\n\n  /**\n   * 计算字符位置\n   * 注意：charSpacing 只用于字符间的视觉间距\n   * 但 totalWidth 应该用 Canvas measureText（不含 charSpacing）用于居中计算\n   */\n  _calculateCharacterPositions() {\n    let currentX = 0;\n    let widthSum = 0; // 不含间距的宽度累加\n    const lineHeight = this.options.fontSize * this.options.lineHeight;\n    const dynamicSpacing = this._calculateDynamicCharSpacing();\n\n    // char.x 不包含间距，只累加纯字符宽度（用于居中计算）\n    // currentX 包含间距，用于下一个字符的起始位置\n    for (let i = 0; i < this.characters.length; i++) {\n      const char = this.characters[i];\n\n      // char.x 只累加字符宽度（不含间距）\n      char.x = widthSum;\n      char.y = 0;\n\n      widthSum += char.width;\n      currentX = widthSum;\n\n      // 添加字符间距（除了最后一个字符）\n      if (i < this.characters.length - 1) {\n        const spacing = dynamicSpacing[i] || this.options.charSpacing;\n        currentX += spacing;\n      }\n    }\n\n    // 总宽度使用 measureText（不含间距），用于正确的居中计算\n    this.totalWidth = this._measureText(this.text);\n    this.totalHeight = lineHeight;\n  }\n\n  /**\n   * 计算单词位置\n   */\n  _calculateWordPositions() {\n    let currentX = 0;\n    const lineHeight = this.options.fontSize * this.options.lineHeight;\n    const dynamicSpacing = this._calculateDynamicWordSpacing();\n    \n    for (let i = 0; i < this.words.length; i++) {\n      const word = this.words[i];\n      \n      word.x = currentX;\n      word.y = 0;\n      \n      currentX += word.width;\n      \n      // 添加单词间距（除了最后一个单词）\n      if (i < this.words.length - 1) {\n        if (word.isSpace) {\n          currentX += this.options.wordSpacing * 0.3;\n        } else {\n          const spacing = dynamicSpacing[i] || this.options.wordSpacing;\n          currentX += spacing;\n        }\n      }\n    }\n    \n    this.totalWidth = currentX;\n    this.totalHeight = lineHeight;\n  }\n\n  /**\n   * 计算行位置\n   */\n  _calculateLinePositions() {\n    let currentY = 0;\n    const lineHeight = this.options.fontSize * this.options.lineHeight;\n    let maxWidth = 0;\n    \n    for (let i = 0; i < this.lines.length; i++) {\n      const line = this.lines[i];\n      \n      line.x = 0;\n      line.y = currentY;\n      \n      maxWidth = Math.max(maxWidth, line.width);\n      currentY += lineHeight;\n    }\n    \n    this.totalWidth = maxWidth;\n    this.totalHeight = currentY;\n  }\n\n  /**\n   * 计算单词位置\n   */\n  _calculateWordPositions() {\n    let currentX = 0;\n    const lineHeight = this.options.fontSize * this.options.lineHeight;\n    const dynamicSpacing = this._calculateDynamicWordSpacing();\n\n    for (let i = 0; i < this.words.length; i++) {\n      const word = this.words[i];\n\n      word.x = currentX;\n      word.y = 0;\n\n      currentX += word.width;\n\n      // 添加单词间距（除了最后一个单词）\n      if (i < this.words.length - 1) {\n        if (word.isSpace) {\n          currentX += this.options.wordSpacing * 0.3;\n        } else {\n          const spacing = dynamicSpacing[i] || this.options.wordSpacing;\n          currentX += spacing;\n        }\n      }\n    }\n\n    // 只在没有设置过 totalWidth 时设置（用于居中计算）\n    if (this.totalWidth === 0) {\n      this.totalWidth = currentX;\n    }\n    this.totalHeight = lineHeight;\n  }\n\n  /**\n   * 计算行位置\n   */\n  _calculateLinePositions() {\n    let currentY = 0;\n    const lineHeight = this.options.fontSize * this.options.lineHeight;\n    let maxWidth = 0;\n\n    for (let i = 0; i < this.lines.length; i++) {\n      const line = this.lines[i];\n\n      line.x = 0;\n      line.y = currentY;\n\n      maxWidth = Math.max(maxWidth, line.width);\n      currentY += lineHeight;\n    }\n\n    // 只在没有设置过 totalWidth 时设置\n    if (this.totalWidth === 0) {\n      this.totalWidth = maxWidth;\n    }\n    this.totalHeight = currentY;\n  }\n\n  /**\n   * 计算所有尺寸和位置\n   */\n  _calculateDimensions() {\n    // 重置 totalWidth 确保字符计算的被使用\n    this.totalWidth = 0;\n    this._calculateCharacterPositions();\n    this._calculateWordPositions();\n    this._calculateLinePositions();\n  }\n\n  /**\n   * 获取字符数组\n   */\n  getCharacters() {\n    return this.characters;\n  }\n\n  /**\n   * 获取单词数组\n   */\n  getWords() {\n    return this.words;\n  }\n\n  /**\n   * 获取行数组\n   */\n  getLines() {\n    return this.lines;\n  }\n\n  /**\n   * 获取总宽度\n   */\n  getTotalWidth() {\n    return this.totalWidth;\n  }\n\n  /**\n   * 获取总高度\n   */\n  getTotalHeight() {\n    return this.totalHeight;\n  }\n\n  /**\n   * 获取指定分割类型的数据\n   * @param {string} type - 'letter', 'word', 'line'\n   * @returns {Array} 分割后的片段数组\n   */\n  getTextSegments(type) {\n    switch (type) {\n      case 'letter':\n        return this.characters.map(char => ({\n          text: char.text,\n          index: char.index,\n          width: char.width,\n          height: char.height,\n          x: char.x,\n          y: char.y,\n          isSpace: char.isSpace,\n          isSymbol: char.isSymbol\n        }));\n      case 'word':\n        return this.words.map(word => ({\n          text: word.text,\n          index: word.index,\n          width: word.width,\n          height: word.height,\n          x: word.x,\n          y: word.y,\n          isSpace: word.isSpace\n        }));\n      case 'line':\n        return this.lines.map(line => ({\n          text: line.text,\n          index: line.index,\n          width: line.width,\n          height: line.height,\n          x: line.x,\n          y: line.y\n        }));\n      default:\n        return [];\n    }\n  }\n\n  /**\n   * 清理资源\n   */\n  destroy() {\n    // 清理 Canvas 上下文\n    if (this.canvas) {\n      this.canvas.width = 0;\n      this.canvas.height = 0;\n      this.ctx = null;\n      this.canvas = null;\n    }\n  }\n}\n\n"],"names":["createCanvas"],"mappings":"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"}