Files
wehub-resource-sync c48612c494
CI / E2E Tests (push) Has been cancelled
CI / Lint, Typecheck & Unit Tests (push) Has been cancelled
Docs Build / Build docs site (push) Has been cancelled
Publish @openmaic packages / Build, validate & publish (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:03:23 +08:00

81 lines
2.1 KiB
JavaScript

import { getTextByPathList } from './utils'
export function findTransitionNode(content, rootElement) {
if (!content || !rootElement) return null
const path1 = [rootElement, 'p:transition']
let transitionNode = getTextByPathList(content, path1)
if (transitionNode) return transitionNode
const path2 = [rootElement, 'mc:AlternateContent', 'mc:Choice', 'p:transition']
transitionNode = getTextByPathList(content, path2)
if (transitionNode) return transitionNode
const path3 = [rootElement, 'mc:AlternateContent', 'mc:Fallback', 'p:transition']
transitionNode = getTextByPathList(content, path3)
return transitionNode
}
export function parseTransition(transitionNode) {
if (!transitionNode) return null
const transition = {
type: 'none',
duration: 1000,
direction: null,
}
const attrs = transitionNode.attrs || {}
let durationFound = false
const durRegex = /^p\d{2}:dur$/
for (const key in attrs) {
if (durRegex.test(key) && !isNaN(parseInt(attrs[key], 10))) {
transition.duration = parseInt(attrs[key], 10)
durationFound = true
break
}
}
if (!durationFound && attrs.spd) {
switch (attrs.spd) {
case 'slow':
transition.duration = 1000
break
case 'med':
transition.duration = 800
break
case 'fast':
transition.duration = 500
break
default:
transition.duration = 1000
break
}
}
if (attrs.advClick === '0' && attrs.advTm) {
transition.autoNextAfter = parseInt(attrs.advTm, 10)
}
const effectRegex = /^(p|p\d{2}):/
for (const key in transitionNode) {
if (key !== 'attrs' && effectRegex.test(key)) {
const effectNode = transitionNode[key]
transition.type = key.substring(key.indexOf(':') + 1)
if (effectNode && effectNode.attrs) {
const effectAttrs = effectNode.attrs
if (effectAttrs.dur && !isNaN(parseInt(effectAttrs.dur, 10))) {
if (!durationFound) transition.duration = parseInt(effectAttrs.dur, 10)
}
if (effectAttrs.dir) transition.direction = effectAttrs.dir
}
break
}
}
return transition
}