{"version":3,"file":"svg-animation-parser.cjs","sources":["../../../src/utils/svg-animation-parser.js"],"sourcesContent":["/**\r\n * SVG 动画解析器\r\n * 解析 SVG 中的原生动画标签（<animate>, <animateTransform>, <animateMotion>）\r\n * 并将其转换为可以在 Paper.js 中执行的动画配置\r\n * 使用 Cheerio 进行 DOM 解析\r\n */\r\n\r\nimport * as cheerio from 'cheerio';\r\n\r\n/**\r\n * 解析 SVG 字符串中的动画标签\r\n * @param {string} svgContent - SVG 内容\r\n * @returns {Array} 动画配置数组\r\n */\r\nexport function parseSVGAnimations(svgContent) {\r\n  const animations = [];\r\n  \r\n  // 使用 Cheerio 加载 SVG\r\n  const $ = cheerio.load(svgContent, {\r\n    xml: {\r\n      xmlMode: true,\r\n      decodeEntities: false,\r\n    },\r\n  });\r\n  \r\n  // 解析 <animate> 标签\r\n  $('animate').each((index, element) => {\r\n    const $el = $(element);\r\n    const attrs = {};\r\n    \r\n    // 提取所有属性\r\n    Object.keys(element.attribs || {}).forEach(key => {\r\n      attrs[key] = element.attribs[key];\r\n    });\r\n    \r\n    const animation = parseAnimateTag(attrs, $, $el);\r\n    if (animation) {\r\n      animations.push(animation);\r\n    }\r\n  });\r\n  \r\n  // 解析 <animateTransform> 标签\r\n  $('animateTransform').each((index, element) => {\r\n    const $el = $(element);\r\n    const attrs = {};\r\n    \r\n    Object.keys(element.attribs || {}).forEach(key => {\r\n      attrs[key] = element.attribs[key];\r\n    });\r\n    \r\n    const animation = parseAnimateTransformTag(attrs, $, $el);\r\n    if (animation) {\r\n      animations.push(animation);\r\n    }\r\n  });\r\n  \r\n  // 解析 <animateMotion> 标签\r\n  $('animateMotion').each((index, element) => {\r\n    const $el = $(element);\r\n    const attrs = {};\r\n    \r\n    Object.keys(element.attribs || {}).forEach(key => {\r\n      attrs[key] = element.attribs[key];\r\n    });\r\n    \r\n    const animation = parseAnimateMotionTag(attrs, $, $el);\r\n    if (animation) {\r\n      animations.push(animation);\r\n    }\r\n  });\r\n  \r\n  return animations;\r\n}\r\n\r\n/**\r\n * 解析 <animate> 标签\r\n * @param {Object} attrs - 属性对象\r\n * @param {cheerio.CheerioAPI} $ - Cheerio 实例\r\n * @param {cheerio.Cheerio} $el - 动画元素\r\n * @returns {Object|null} 动画配置\r\n */\r\nfunction parseAnimateTag(attrs, $, $el) {\r\n  const attributeName = attrs.attributeName;\r\n  if (!attributeName) return null;\r\n  \r\n  // 查找父元素\r\n  const parentElement = findParentElement($, $el);\r\n  if (!parentElement) return null;\r\n  \r\n  const begin = parseTime(attrs.begin || '0s');\r\n  const dur = parseTime(attrs.dur || '1s');\r\n  const repeatCount = attrs.repeatCount === 'indefinite' ? Infinity : parseInt(attrs.repeatCount || '1');\r\n  const values = attrs.values ? attrs.values.split(';') : null;\r\n  const from = attrs.from;\r\n  const to = attrs.to;\r\n  const keyTimes = attrs.keyTimes ? attrs.keyTimes.split(';').map(parseFloat) : null;\r\n  \r\n  const animation = {\r\n    selector: parentElement.selector,\r\n    id: parentElement.id,\r\n    tagName: parentElement.tagName,\r\n    attributeName,\r\n    begin,\r\n    duration: dur,\r\n    repeatCount,\r\n    values,\r\n    from,\r\n    to,\r\n    keyTimes,\r\n    type: 'animate',\r\n  };\r\n  \r\n  return animation;\r\n}\r\n\r\n/**\r\n * 解析 <animateTransform> 标签\r\n * @param {Object} attrs - 属性对象\r\n * @param {cheerio.CheerioAPI} $ - Cheerio 实例\r\n * @param {cheerio.Cheerio} $el - 动画元素\r\n * @returns {Object|null} 动画配置\r\n */\r\nfunction parseAnimateTransformTag(attrs, $, $el) {\r\n  const type = attrs.type || 'translate';\r\n  const parentElement = findParentElement($, $el);\r\n  if (!parentElement) return null;\r\n  \r\n  const begin = parseTime(attrs.begin || '0s');\r\n  const dur = parseTime(attrs.dur || '1s');\r\n  const repeatCount = attrs.repeatCount === 'indefinite' ? Infinity : parseInt(attrs.repeatCount || '1');\r\n  const values = attrs.values ? attrs.values.split(';') : null;\r\n  const from = attrs.from;\r\n  const to = attrs.to;\r\n  const keyTimes = attrs.keyTimes ? attrs.keyTimes.split(';').map(parseFloat) : null;\r\n  \r\n  const animation = {\r\n    selector: parentElement.selector,\r\n    id: parentElement.id,\r\n    tagName: parentElement.tagName,\r\n    type: 'animateTransform',\r\n    transformType: type,\r\n    begin,\r\n    duration: dur,\r\n    repeatCount,\r\n    values,\r\n    from,\r\n    to,\r\n    keyTimes,\r\n  };\r\n  \r\n  return animation;\r\n}\r\n\r\n/**\r\n * 解析 <animateMotion> 标签\r\n * @param {Object} attrs - 属性对象\r\n * @param {cheerio.CheerioAPI} $ - Cheerio 实例\r\n * @param {cheerio.Cheerio} $el - 动画元素\r\n * @returns {Object|null} 动画配置\r\n */\r\nfunction parseAnimateMotionTag(attrs, $, $el) {\r\n  const parentElement = findParentElement($, $el);\r\n  if (!parentElement) return null;\r\n  \r\n  const begin = parseTime(attrs.begin || '0s');\r\n  const dur = parseTime(attrs.dur || '1s');\r\n  const repeatCount = attrs.repeatCount === 'indefinite' ? Infinity : parseInt(attrs.repeatCount || '1');\r\n  const path = attrs.path;\r\n  const keyPoints = attrs.keyPoints ? attrs.keyPoints.split(';').map(parseFloat) : null;\r\n  const keyTimes = attrs.keyTimes ? attrs.keyTimes.split(';').map(parseFloat) : null;\r\n  \r\n  const animation = {\r\n    selector: parentElement.selector,\r\n    id: parentElement.id,\r\n    tagName: parentElement.tagName,\r\n    type: 'animateMotion',\r\n    begin,\r\n    duration: dur,\r\n    repeatCount,\r\n    path,\r\n    keyPoints,\r\n    keyTimes,\r\n  };\r\n  \r\n  return animation;\r\n}\r\n\r\n/**\r\n * 查找动画标签的父元素\r\n * @param {cheerio.CheerioAPI} $ - Cheerio 实例\r\n * @param {cheerio.Cheerio} $el - 动画元素\r\n * @returns {Object|null} 父元素信息 { selector, id, tagName }\r\n */\r\nfunction findParentElement($, $el) {\r\n  // 获取父元素\r\n  const parent = $el.parent();\r\n  \r\n  if (parent.length === 0 || parent[0].type === 'root') {\r\n    return null;\r\n  }\r\n  \r\n  const parentNode = parent[0];\r\n  const tagName = parentNode.tagName || parentNode.name;\r\n  \r\n  if (!tagName) {\r\n    return null;\r\n  }\r\n  \r\n  // 提取 id 属性\r\n  const id = parentNode.attribs?.id || null;\r\n  \r\n  // 生成选择器（优先使用 id，如果没有 id 则使用标签名）\r\n  let selector = tagName;\r\n  if (id) {\r\n    selector = `#${id}`;\r\n  }\r\n  \r\n  return { selector, id, tagName };\r\n}\r\n\r\n/**\r\n * 解析时间字符串（如 \"0s\", \"1.5s\", \"500ms\"）\r\n * @param {string} timeStr - 时间字符串\r\n * @returns {number} 时间（秒）\r\n */\r\nfunction parseTime(timeStr) {\r\n  if (!timeStr) return 0;\r\n  \r\n  const match = timeStr.match(/^([\\d.]+)(s|ms)?$/);\r\n  if (!match) return 0;\r\n  \r\n  const value = parseFloat(match[1]);\r\n  const unit = match[2] || 's';\r\n  \r\n  return unit === 'ms' ? value / 1000 : value;\r\n}\r\n\r\n/**\r\n * 将 SVG 动画配置转换为 Paper.js 可执行的动画函数\r\n * @param {Object} animation - SVG 动画配置\r\n * @returns {Function} 动画函数 (relativeTime, element, svgElement, context) => ({ ... })\r\n */\r\nexport function convertSVGAnimationToFunction(animation) {\r\n  return (relativeTime, element, svgElement, context) => {\r\n    const { absoluteTime, startTime, duration } = context;\r\n    \r\n    // 计算动画的绝对开始时间\r\n    const animationStartTime = startTime + animation.begin;\r\n    const animationDuration = animation.duration;\r\n    \r\n    // 计算相对于动画开始的时间\r\n    let animRelativeTime = absoluteTime - animationStartTime;\r\n    \r\n    // 调试：输出时间计算（已禁用）\r\n    // if (animation.selector === '#BirdFlapClosed_2_18' && absoluteTime <= 2) {\r\n    //   const beforeMod = animRelativeTime;\r\n    //   let afterMod = animRelativeTime;\r\n    //   if (animation.repeatCount === Infinity) {\r\n    //     afterMod = animRelativeTime % animationDuration;\r\n    //   }\r\n    //   const progress = afterMod / animationDuration;\r\n    //   if (Math.abs(absoluteTime % 0.1) < 0.01 || progress >= 0.9) {\r\n    //     console.log(`[动画函数] absoluteTime=${absoluteTime.toFixed(3)}, animRelativeTime=${beforeMod.toFixed(3)}, afterMod=${afterMod.toFixed(3)}, progress=${progress.toFixed(6)}`);\r\n    //   }\r\n    // }\r\n    \r\n    // 如果动画还没开始，返回空属性\r\n    if (animRelativeTime < 0) {\r\n      return {};\r\n    }\r\n    \r\n    // 处理重复\r\n    if (animation.repeatCount === Infinity) {\r\n      // 无限重复：取模\r\n      animRelativeTime = animRelativeTime % animationDuration;\r\n      // 确保在 [0, duration) 范围内\r\n      if (animRelativeTime < 0) {\r\n        animRelativeTime = 0;\r\n      }\r\n    } else {\r\n      const totalDuration = animationDuration * animation.repeatCount;\r\n      if (animRelativeTime > totalDuration) {\r\n        // 动画已结束，使用最后一个值\r\n        animRelativeTime = animationDuration;\r\n      } else {\r\n        // 在重复周期内，取模\r\n        animRelativeTime = animRelativeTime % animationDuration;\r\n      }\r\n    }\r\n    \r\n    // 计算进度（0-1）\r\n    let progress = animRelativeTime / animationDuration;\r\n    if (progress < 0) progress = 0;\r\n    if (progress > 1) progress = 1;\r\n    // 注意：progress 可以等于 1，这样能正确处理最后一个 keyTime\r\n    \r\n    // 根据动画类型生成属性\r\n    const props = {};\r\n    \r\n    if (animation.type === 'animate') {\r\n      // 处理不同的 attributeName\r\n      if (animation.attributeName === 'display') {\r\n        // display 动画：根据 values 或 from/to 设置 visibility\r\n        // 使用 keyTimes 来精确控制显示/隐藏时机\r\n        if (animation.values && animation.keyTimes) {\r\n          // 根据 keyTimes 和 values 计算当前值\r\n          // keyTimes 和 values 的数量应该相同\r\n          let currentValue = animation.values[0];\r\n          \r\n          // 找到 progress 所在的 keyTimes 区间\r\n          // SVG 规范：keyTimes[i] 对应 values[i]\r\n          // 当 progress 在 [keyTimes[i], keyTimes[i+1]) 时，使用 values[i]\r\n          // 当 progress 等于 keyTimes[i+1] 时，使用 values[i+1]\r\n          let found = false;\r\n          for (let i = 0; i < animation.keyTimes.length - 1; i++) {\r\n            const currentKeyTime = animation.keyTimes[i];\r\n            const nextKeyTime = animation.keyTimes[i + 1];\r\n            \r\n            // 如果 progress 正好等于下一个 keyTime，使用下一个 value\r\n            if (Math.abs(progress - nextKeyTime) < 0.000001) {\r\n              currentValue = animation.values[i + 1];\r\n              found = true;\r\n              break;\r\n            }\r\n            // 如果 progress 在当前区间内 [currentKeyTime, nextKeyTime)\r\n            // 注意：当 progress 等于 currentKeyTime 时，也应该使用 values[i]\r\n            if (progress >= currentKeyTime && progress < nextKeyTime) {\r\n              currentValue = animation.values[i];\r\n              found = true;\r\n              break;\r\n            }\r\n          }\r\n          // 如果没找到，说明 progress 在最后一个区间或等于最后一个 keyTime\r\n          if (!found) {\r\n            const lastIndex = animation.keyTimes.length - 1;\r\n            if (progress >= animation.keyTimes[lastIndex]) {\r\n              currentValue = animation.values[lastIndex];\r\n            } else {\r\n              // 这种情况不应该发生，但为了安全，使用第一个值\r\n              currentValue = animation.values[0];\r\n            }\r\n          }\r\n          \r\n          props.opacity = currentValue === 'none' ? 0 : 1;\r\n          \r\n          // 调试：输出 keyTimes 匹配结果（已禁用）\r\n          // if (animation.selector === '#BirdFlapClosed_2_18' && absoluteTime <= 2) {\r\n          //   if (Math.abs(absoluteTime % 0.1) < 0.01 || progress >= 0.9) {\r\n          //     console.log(`[keyTimes匹配] progress=${progress.toFixed(6)}, currentValue=${currentValue}, opacity=${currentValue === 'none' ? 0 : 1}`);\r\n          //   }\r\n          // }\r\n        } else if (animation.values) {\r\n          // 没有 keyTimes，均匀分布\r\n          const valueIndex = Math.min(\r\n            Math.floor(progress * animation.values.length),\r\n            animation.values.length - 1\r\n          );\r\n          const value = animation.values[valueIndex];\r\n          props.opacity = value === 'none' ? 0 : 1;\r\n        } else if (animation.from && animation.to) {\r\n          const fromValue = animation.from === 'none' ? 0 : 1;\r\n          const toValue = animation.to === 'none' ? 0 : 1;\r\n          props.opacity = fromValue + (toValue - fromValue) * progress;\r\n        }\r\n      } else if (animation.attributeName === 'opacity') {\r\n        if (animation.values) {\r\n          const valueIndex = Math.floor(progress * (animation.values.length - 1));\r\n          props.opacity = parseFloat(animation.values[valueIndex] || animation.values[animation.values.length - 1]);\r\n        } else if (animation.from !== undefined && animation.to !== undefined) {\r\n          props.opacity = parseFloat(animation.from) + (parseFloat(animation.to) - parseFloat(animation.from)) * progress;\r\n        }\r\n      } else if (animation.attributeName === 'fill' || animation.attributeName === 'stroke') {\r\n        // 颜色动画：简化处理，只支持 from 到 to\r\n        if (animation.from && animation.to) {\r\n          // 颜色插值比较复杂，这里简化处理\r\n          props[animation.attributeName] = progress < 0.5 ? animation.from : animation.to;\r\n        }\r\n      }\r\n    } else if (animation.type === 'animateTransform') {\r\n      // 处理变换动画\r\n      if (animation.transformType === 'rotate') {\r\n        if (animation.values) {\r\n          const valueIndex = Math.floor(progress * (animation.values.length - 1));\r\n          const value = animation.values[valueIndex] || animation.values[animation.values.length - 1];\r\n          // 解析 rotate(angle [x y])\r\n          const rotateMatch = value.match(/rotate\\(([^)]+)\\)/);\r\n          if (rotateMatch) {\r\n            const parts = rotateMatch[1].split(/\\s+/);\r\n            props.rotation = parseFloat(parts[0]);\r\n          }\r\n        } else if (animation.from && animation.to) {\r\n          const fromMatch = animation.from.match(/rotate\\(([^)]+)\\)/);\r\n          const toMatch = animation.to.match(/rotate\\(([^)]+)\\)/);\r\n          if (fromMatch && toMatch) {\r\n            const fromAngle = parseFloat(fromMatch[1].split(/\\s+/)[0]);\r\n            const toAngle = parseFloat(toMatch[1].split(/\\s+/)[0]);\r\n            props.rotation = fromAngle + (toAngle - fromAngle) * progress;\r\n          }\r\n        }\r\n      } else if (animation.transformType === 'scale') {\r\n        if (animation.values) {\r\n          const valueIndex = Math.floor(progress * (animation.values.length - 1));\r\n          const value = animation.values[valueIndex] || animation.values[animation.values.length - 1];\r\n          const scaleMatch = value.match(/scale\\(([^)]+)\\)/);\r\n          if (scaleMatch) {\r\n            const parts = scaleMatch[1].split(/\\s+/);\r\n            props.scaleX = parseFloat(parts[0]);\r\n            props.scaleY = parts[1] ? parseFloat(parts[1]) : props.scaleX;\r\n          }\r\n        } else if (animation.from && animation.to) {\r\n          const fromMatch = animation.from.match(/scale\\(([^)]+)\\)/);\r\n          const toMatch = animation.to.match(/scale\\(([^)]+)\\)/);\r\n          if (fromMatch && toMatch) {\r\n            const fromParts = fromMatch[1].split(/\\s+/);\r\n            const toParts = toMatch[1].split(/\\s+/);\r\n            const fromX = parseFloat(fromParts[0]);\r\n            const fromY = fromParts[1] ? parseFloat(fromParts[1]) : fromX;\r\n            const toX = parseFloat(toParts[0]);\r\n            const toY = toParts[1] ? parseFloat(toParts[1]) : toX;\r\n            props.scaleX = fromX + (toX - fromX) * progress;\r\n            props.scaleY = fromY + (toY - fromY) * progress;\r\n          }\r\n        }\r\n      } else if (animation.transformType === 'translate') {\r\n        if (animation.values) {\r\n          const valueIndex = Math.floor(progress * (animation.values.length - 1));\r\n          const value = animation.values[valueIndex] || animation.values[animation.values.length - 1];\r\n          const translateMatch = value.match(/translate\\(([^)]+)\\)/);\r\n          if (translateMatch) {\r\n            const parts = translateMatch[1].split(/\\s+/);\r\n            props.x = parseFloat(parts[0]);\r\n            props.y = parts[1] ? parseFloat(parts[1]) : 0;\r\n          }\r\n        } else if (animation.from && animation.to) {\r\n          const fromMatch = animation.from.match(/translate\\(([^)]+)\\)/);\r\n          const toMatch = animation.to.match(/translate\\(([^)]+)\\)/);\r\n          if (fromMatch && toMatch) {\r\n            const fromParts = fromMatch[1].split(/\\s+/);\r\n            const toParts = toMatch[1].split(/\\s+/);\r\n            const fromX = parseFloat(fromParts[0]);\r\n            const fromY = fromParts[1] ? parseFloat(fromParts[1]) : 0;\r\n            const toX = parseFloat(toParts[0]);\r\n            const toY = toParts[1] ? parseFloat(toParts[1]) : 0;\r\n            props.x = fromX + (toX - fromX) * progress;\r\n            props.y = fromY + (toY - fromY) * progress;\r\n          }\r\n        }\r\n      }\r\n    } else if (animation.type === 'animateMotion') {\r\n      // 路径动画：简化处理，只支持简单的路径\r\n      if (animation.path) {\r\n        // 解析路径并计算当前位置\r\n        // 这里简化处理，实际应该解析 SVG path 并计算位置\r\n        // TODO: 实现路径动画\r\n      }\r\n    }\r\n    \r\n    return props;\r\n  };\r\n}\r\n"],"names":["cheerio"],"mappings":"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"}