@ioris/parser-ttml
Version:
[](https://badge.fury.io/js/@ioris%2Fparser-ttml) [](https://opensource.org/licenses/MIT)
3 lines (2 loc) • 1.88 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 T=r=>({begin:u(r.getAttribute("begin")||""),end:u(r.getAttribute("end")||"")}),d={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=[],o=e.querySelectorAll("div");for(let s of Array.from(o)){let{lineTimelines:t}=this.parseParagraphTimelines(s);i.push(t)}return await C({resourceID:n,timelines:i,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:l}=this.parseLineTimelines(o);i.push(l)}return{lineTimelines:i}}parseLineTimelines(e){if(!g(e)||!m("p")(e))throw new Error("Invalid TTML format");let n=[],{begin:i,end:o}=T(e);if((Array.from(e.children).filter(g).filter(m("span")).length>0?d.Word:d.Line)===d.Line)return e.textContent===null?{wordTimelines:n}:(n.push({wordID:crypto.randomUUID(),begin:i,end:o,text:e.textContent}),{wordTimelines:n});let s=Array.from(e.querySelectorAll("span"));return s.reduce((t,a,y)=>{let f=t.wordTimelines[t.wordTimelines.length-1],{begin:c,end:L}=T(a),p=s[y-1],{end:b}=p?T(p):{end:c},A=b-c>.1||a.nextSibling!==null&&a.nextSibling.nodeType===3;return t.wordTimelines[0]={...t.wordTimelines[0],begin:f?.begin||c,end:L,text:`${f?.text||""}${a.textContent}${A?" ":""}`},t},{wordTimelines:n})}};export{h as TTMLParser};
//# sourceMappingURL=index.mjs.map