@ioris/parser-ttml
Version:
[](https://badge.fury.io/js/@ioris%2Fparser-ttml) [](https://opensource.org/licenses/MIT)
3 lines (2 loc) • 1.94 kB
JavaScript
import{createLyric as C}from"@ioris/core";var g=r=>Node.ELEMENT_NODE===r.nodeType,m=r=>{let e=r.toLowerCase();return n=>n.nodeName.toLowerCase()===e};function u(r){return r===""?0:r.endsWith("s")?Number(r.slice(0,-1)):Number(r.split(":").reduce((e,n)=>60*e+Number(n),0))}var d=r=>({begin:u(r.getAttribute("begin")||""),end:u(r.getAttribute("end")||"")}),T={Line:"Line",Word:"Word"},h=class{lineTokenizer;paragraphTokenizer;offsetSec;constructor(e){this.lineTokenizer=e?e.lineTokenizer:void 0,this.paragraphTokenizer=e?e.paragraphTokenizer:void 0,this.offsetSec=e?e.offsetSec:void 0}async parse(e,n){let i=u(e.querySelector("body")?.getAttribute("dur")||""),o=[],a=e.querySelectorAll("div");for(let t of Array.from(a)){let{lineTimelines:s}=this.parseParagraphTimelines(t);o.push(s)}return await C({resourceID:n,duration:i,timelines:o,lineTokenizer:this.lineTokenizer,paragraphTokenizer:this.paragraphTokenizer,offsetSec:this.offsetSec})}parseParagraphTimelines(e){if(!g(e)||!m("div")(e))throw new Error("Invalid TTML format");let n=e.querySelectorAll("p"),i=[];for(let o of Array.from(n)){let{wordTimelines:a}=this.parseLineTimelines(o);i.push(a)}return{lineTimelines:i}}parseLineTimelines(e){if(!g(e)||!m("p")(e))throw new Error("Invalid TTML format");let n=[],{begin:i,end:o}=d(e);if((Array.from(e.children).filter(g).filter(m("span")).length>0?T.Word:T.Line)===T.Line)return e.textContent===null?{wordTimelines:n}:(n.push({wordID:crypto.randomUUID(),begin:i,end:o,text:e.textContent}),{wordTimelines:n});let l=Array.from(e.querySelectorAll("span"));return l.reduce((t,s,y)=>{let f=t.wordTimelines[t.wordTimelines.length-1],{begin:c,end:b}=d(s),p=l[y-1],{end:L}=p?d(p):{end:c},A=L-c>.1||s.nextSibling!==null&&s.nextSibling.nodeType===3;return t.wordTimelines[0]={...t.wordTimelines[0],begin:f?.begin||c,end:b,text:`${f?.text||""}${s.textContent}${A?" ":""}`},t},{wordTimelines:n})}};export{h as TTMLParser};
//# sourceMappingURL=index.mjs.map