(raw: string)
| 10 | type Scene = { id: string; start: number; duration: number }; |
| 11 | |
| 12 | function parseTiming(raw: string): { start: number; duration: number } | null { |
| 13 | const startStr = readAttr(raw, "data-start"); |
| 14 | if (startStr === null) return null; |
| 15 | const start = Number(startStr); |
| 16 | if (!Number.isFinite(start)) return null; |
| 17 | |
| 18 | const durationStr = readAttr(raw, "data-duration"); |
| 19 | if (durationStr !== null) { |
| 20 | const duration = Number(durationStr); |
| 21 | if (Number.isFinite(duration)) return { start, duration }; |
| 22 | } |
| 23 | const endStr = readAttr(raw, "data-end") ?? readAttr(raw, "data-hf-authored-end"); |
| 24 | if (endStr !== null) { |
| 25 | const end = Number(endStr); |
| 26 | if (Number.isFinite(end) && end > start) return { start, duration: end - start }; |
| 27 | } |
| 28 | return null; |
| 29 | } |
| 30 | |
| 31 | function collectCompositionIdScenes(ctx: LintContext, seen: Set<string>, out: Scene[]): void { |
| 32 | for (const tag of ctx.tags) { |
no test coverage detected