UNPKG

assjs

Version:

A lightweight JavaScript ASS subtitle renderer

2 lines (1 loc) 33.8 kB
function t(t){var e=t.toLowerCase().trim().split(/\s*;\s*/);return"banner"===e[0]?{name:e[0],delay:1*e[1]||0,leftToRight:1*e[2]||0,fadeAwayWidth:1*e[3]||0}:/^scroll\s/.test(e[0])?{name:e[0],y1:Math.min(1*e[1],1*e[2]),y2:Math.max(1*e[1],1*e[2]),delay:1*e[3]||0,fadeAwayHeight:1*e[4]||0}:""!==t?{name:t}:null}function e(t){return t?t.toLowerCase().replace(/([+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?)/g," $1 ").replace(/([mnlbspc])/g," $1 ").trim().replace(/\s+/g," ").split(/\s(?=[mnlbspc])/).map(function(t){return t.split(" ").filter(function(t,e){return!(e&&isNaN(1*t))})}):[]}var a=["b","i","u","s","fsp","k","K","kf","ko","kt","fe","q","p","pbo","a","an","fscx","fscy","fax","fay","frx","fry","frz","fr","be","blur","bord","xbord","ybord","shad","xshad","yshad"].map(function(t){return{name:t,regex:new RegExp("^"+t+"-?\\d")}});function s(t){for(var r,n={},i=0;i<a.length;i++){var o=a[i],l=o.name;if(o.regex.test(t))return n[l]=1*t.slice(l.length),n}if(/^fn/.test(t))n.fn=t.slice(2);else if(/^r/.test(t))n.r=t.slice(1);else if(/^fs[\d+-]/.test(t))n.fs=t.slice(2);else if(/^\d?c&?H?[0-9a-fA-F]+|^\d?c$/.test(t)){var c=t.match(/^(\d?)c&?H?(\w*)/),d=c[1],f=c[2];n["c"+(d||1)]=f&&("000000"+f).slice(-6)}else if(/^\da&?H?[0-9a-fA-F]+/.test(t)){var p=t.match(/^(\d)a&?H?([0-9a-f]+)/i),u=p[1],h=p[2];n["a"+u]=("00"+h).slice(-2)}else if(/^alpha&?H?[0-9a-fA-F]+/.test(t))r=t.match(/^alpha&?H?([0-9a-f]+)/i),n.alpha=r[1],n.alpha=("00"+n.alpha).slice(-2);else if(/^(?:pos|org|move|fad|fade)\([^)]+/.test(t)){var g=t.match(/^(\w+)\((.*?)\)?$/),y=g[1],m=g[2];n[y]=m.trim().split(/\s*,\s*/).map(Number)}else if(/^i?clip\([^)]+/.test(t)){var v=t.match(/^i?clip\((.*?)\)?$/)[1].trim().split(/\s*,\s*/);n.clip={inverse:/iclip/.test(t),scale:1,drawing:null,dots:null},1===v.length&&(n.clip.drawing=e(v[0])),2===v.length&&(n.clip.scale=1*v[0],n.clip.drawing=e(v[1])),4===v.length&&(n.clip.dots=v.map(Number))}else if(/^t\(/.test(t)){var x=t.match(/^t\((.*?)\)?$/)[1].trim().replace(/\\.*/,function(t){return t.replace(/,/g,"\n")}).split(/\s*,\s*/);if(!x[0])return n;n.t={t1:0,t2:0,accel:1,tags:x[x.length-1].replace(/\n/g,",").split("\\").slice(1).map(s)},2===x.length&&(n.t.accel=1*x[0]),3===x.length&&(n.t.t1=1*x[0],n.t.t2=1*x[1]),4===x.length&&(n.t.t1=1*x[0],n.t.t2=1*x[1],n.t.accel=1*x[2])}return n}function r(t){for(var e=[],a=0,r="",n=t.split("\\").slice(1).concat("").join("\\"),i=0;i<n.length;i++){var o=n[i];"("===o&&a++,")"===o&&a--,a<0&&(a=0),a||"\\"!==o?r+=o:(r&&e.push(r),r="")}return e.map(s)}function n(t){var a=t.split(/{(.*?)}/),s=[];a[0].length&&s.push({tags:[],text:a[0],drawing:[]});for(var n=1;n<a.length;n+=2){var i=r(a[n]),o=i.reduce(function(t,e){return void 0===e.p?t:!!e.p},!1);s.push({tags:i,text:o?"":a[n+1],drawing:o?e(a[n+1]):[]})}return{raw:t,combined:s.map(function(t){return t.text}).join(""),parsed:s}}function i(t){var e=t.split(":");return 3600*e[0]+60*e[1]+1*e[2]}function o(e,a){var s=e.split(",");if(s.length>a.length){var r=s.slice(a.length-1).join();(s=s.slice(0,a.length-1)).push(r)}for(var o={},l=0;l<s.length;l++){var c=a[l],d=s[l].trim();switch(c){case"Layer":case"MarginL":case"MarginR":case"MarginV":o[c]=1*d;break;case"Start":case"End":o[c]=i(d);break;case"Effect":o[c]=t(d);break;case"Text":o[c]=n(d);break;default:o[c]=d}}return o}var l=["Name","Fontname","Fontsize","PrimaryColour","SecondaryColour","OutlineColour","BackColour","Bold","Italic","Underline","StrikeOut","ScaleX","ScaleY","Spacing","Angle","BorderStyle","Outline","Shadow","Alignment","MarginL","MarginR","MarginV","Encoding"],c=["Layer","Start","End","Style","Name","MarginL","MarginR","MarginV","Effect","Text"];function d(t){var e=l.concat(c);return t.match(/Format\s*:\s*(.*)/i)[1].split(/\s*,\s*/).map(function(t){return e.find(function(e){return e.toLowerCase()===t.toLowerCase()})||t})}function f(t,e){var a=t.match(/Style\s*:\s*(.*)/i)[1].split(/\s*,\s*/);return Object.assign.apply(Object,[{}].concat(e.map(function(t,e){var s;return(s={})[t]=a[e],s})))}function p(t){var e={type:null,prev:null,next:null,points:[]};/[mnlbs]/.test(t[0])&&(e.type=t[0].toUpperCase().replace("N","L").replace("B","C"));for(var a=t.length-!(1&t.length),s=1;s<a;s+=2)e.points.push({x:1*t[s],y:1*t[s+1]});return e}function u(t){return!(!t.points.length||!t.type)&&!(/C|S/.test(t.type)&&t.points.length<3)}function h(t){return t.map(function(t){return t.type+t.points.map(function(t){return t.x+","+t.y}).join(",")}).join("")}function g(t){for(var e,a=[],s=0;s<t.length;){var r=t[s],n=p(r);if(u(n)){if("S"===n.type){var i=(a[s-1]||{points:[{x:0,y:0}]}).points.slice(-1)[0],o=i.x,l=i.y;n.points.unshift({x:o,y:l})}s&&(n.prev=a[s-1].type,a[s-1].next=n.type),a.push(n),s++}else{if(s&&"S"===a[s-1].type){var c={p:n.points,c:a[s-1].points.slice(0,3)};a[s-1].points=a[s-1].points.concat((c[r[0]]||[]).map(function(t){return{x:t.x,y:t.y}}))}t.splice(s,1)}}var d=(e=[]).concat.apply(e,a.map(function(t){var e=t.type,a=t.points,s=t.prev,r=t.next;return"S"===e?function(t,e,a){var s=[],r=[0,2/3,1/3,0],n=[0,1/3,2/3,0],i=[0,1/6,2/3,1/6],o=function(t,e){return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]+t[3]*e[3]},l=[t[t.length-1].x,t[0].x,t[1].x,t[2].x],c=[t[t.length-1].y,t[0].y,t[1].y,t[2].y];s.push({type:"M"===e?"M":"L",points:[{x:o(i,l),y:o(i,c)}]});for(var d=3;d<t.length;d++)l=[t[d-3].x,t[d-2].x,t[d-1].x,t[d].x],c=[t[d-3].y,t[d-2].y,t[d-1].y,t[d].y],s.push({type:"C",points:[{x:o(r,l),y:o(r,c)},{x:o(n,l),y:o(n,c)},{x:o(i,l),y:o(i,c)}]});if("L"===a||"C"===a){var f=t[t.length-1];s.push({type:"L",points:[{x:f.x,y:f.y}]})}return s}(a,s,r):{type:e,points:a}}));return Object.assign({instructions:d,d:h(d)},function(t){var e,a=1/0,s=1/0,r=-1/0,n=-1/0;return(e=[]).concat.apply(e,t.map(function(t){return t.points})).forEach(function(t){var e=t.x,i=t.y;a=Math.min(a,e),s=Math.min(s,i),r=Math.max(r,e),n=Math.max(n,i)}),{minX:a,minY:s,width:r-a,height:n-s}}(a))}var y=["fs","fsp","clip","c1","c2","c3","c4","a1","a2","a3","a4","alpha","fscx","fscy","fax","fay","frx","fry","frz","fr","be","blur","bord","xbord","ybord","shad","xshad","yshad"];function m(t,e,a){var s,r,n;void 0===a&&(a={});var i=t[e];if(void 0===i)return null;if("pos"===e||"org"===e)return 2===i.length?((s={})[e]={x:i[0],y:i[1]},s):null;if("move"===e){var o=i[0],l=i[1],c=i[2],d=i[3],f=i[4];void 0===f&&(f=0);var p=i[5];return void 0===p&&(p=0),4===i.length||6===i.length?{move:{x1:o,y1:l,x2:c,y2:d,t1:f,t2:p}}:null}if("fad"===e||"fade"===e)return 2===i.length?{fade:{type:"fad",t1:i[0],t2:i[1]}}:7===i.length?{fade:{type:"fade",a1:i[0],a2:i[1],a3:i[2],t1:i[3],t2:i[4],t3:i[5],t4:i[6]}}:null;if("clip"===e){var u=i.inverse,h=i.scale,v=i.drawing,x=i.dots;return v?{clip:{inverse:u,scale:h,drawing:g(v),dots:x}}:x?{clip:{inverse:u,scale:h,drawing:v,dots:{x1:x[0],y1:x[1],x2:x[2],y2:x[3]}}}:null}if(/^[xy]?(bord|shad)$/.test(e)&&(i=Math.max(i,0)),"bord"===e)return{xbord:i,ybord:i};if("shad"===e)return{xshad:i,yshad:i};if(/^c\d$/.test(e))return(r={})[e]=i||a[e],r;if("alpha"===e)return{a1:i,a2:i,a3:i,a4:i};if("fr"===e)return{frz:i};if("fs"===e)return{fs:/^\+|-/.test(i)?(1*i>-10?1+i/10:1)*a.fs:1*i};if("K"===e)return{kf:i};if("t"===e){var b=i.t1,w=i.accel,S=i.tags,$=i.t2||1e3*(a.end-a.start),k={};return S.forEach(function(t){var e=Object.keys(t)[0];~y.indexOf(e)&&("clip"!==e||t[e].dots)&&Object.assign(k,m(t,e,a))}),{t:{t1:b,t2:$,accel:w,tag:k}}}return(n={})[e]=i,n}var v=[null,1,2,3,null,7,8,9,null,4,5,6],x=["r","a","an","pos","org","move","fade","fad","clip"];function b(t){return JSON.parse(JSON.stringify(Object.assign({},t,{k:void 0,kf:void 0,ko:void 0,kt:void 0})))}function w(t){for(var e,a,s,r,n,i,o=t.styles,l=t.style,c=t.parsed,d=t.start,f=t.end,p={q:o[l].tag.q},u=[],h={style:l,fragments:[]},y={},w=0;w<c.length;w++){for(var S=c[w],$=S.tags,k=S.text,A=S.drawing,M=void 0,E=0;E<$.length;E++){var C=$[E];M=void 0===C.r?M:C.r}for(var O={tag:void 0===M?b(y):{},text:k,drawing:A.length?g(A):null},j=0;j<$.length;j++){var L=$[j];e=e||v[L.a||0]||L.an,p=m(L,"q")||p,r||(a=a||m(L,"pos")),s=s||m(L,"org"),a||(r=r||m(L,"move")),n=n||m(L,"fade")||m(L,"fad"),i=m(L,"clip")||i;var N=Object.keys(L)[0];if(N&&!~x.indexOf(N)){var R=o[l].tag,F=m(L,N,{start:d,end:f,c1:R.c1,c2:R.c2,c3:R.c3,c4:R.c4,fs:y.fs||R.fs});"t"===N?(O.tag.t=O.tag.t||[],O.tag.t.push(F.t)):Object.assign(O.tag,F)}}if(y=O.tag,void 0!==M&&(u.push(h),h={style:o[M]?M:l,fragments:[]}),O.text||O.drawing){var B=h.fragments[h.fragments.length-1]||{};B.text&&O.text&&!Object.keys(O.tag).length?B.text+=O.text:h.fragments.push(O)}}return u.push(h),Object.assign({alignment:e,slices:u},p,a,s,r,n,i)}function S(t){for(var e=t.styles,a=t.dialogues,s=1/0,r=[],n=0;n<a.length;n++){var i=a[n];if(!(i.Start>=i.End)){e[i.Style]||(i.Style="Default");var o=e[i.Style].style,l=w({styles:e,style:i.Style,parsed:i.Text.parsed,start:i.Start,end:i.End}),c=l.alignment||o.Alignment;s=Math.min(s,i.Layer),r.push(Object.assign({layer:i.Layer,start:i.Start,end:i.End,style:i.Style,name:i.Name,margin:{left:i.MarginL||o.MarginL,right:i.MarginR||o.MarginR,vertical:i.MarginV||o.MarginV},effect:i.Effect},l,{alignment:c}))}}for(var d=0;d<r.length;d++)r[d].layer-=s;return r.sort(function(t,e){return t.start-e.start||t.end-e.end})}var $={Name:"Default",Fontname:"Arial",Fontsize:"20",PrimaryColour:"&H00FFFFFF&",SecondaryColour:"&H000000FF&",OutlineColour:"&H00000000&",BackColour:"&H00000000&",Bold:"0",Italic:"0",Underline:"0",StrikeOut:"0",ScaleX:"100",ScaleY:"100",Spacing:"0",Angle:"0",BorderStyle:"1",Outline:"2",Shadow:"2",Alignment:"2",MarginL:"10",MarginR:"10",MarginV:"10",Encoding:"1"};function k(t){if(/^(&|H|&H)[0-9a-f]{6,}/i.test(t)){var e=t.match(/&?H?([0-9a-f]{2})?([0-9a-f]{6})/i);return[e[1]||"00",e[2]]}var a=parseInt(t,10);if(!isNaN(a)){var s=-2147483648;if(a<s)return["00","000000"];var r=s<=a&&a<=2147483647?("00000000"+(a<0?a+4294967296:a).toString(16)).slice(-8):String(a).slice(0,8);return[r.slice(0,2),r.slice(2)]}return["00","000000"]}function A(t,e){void 0===e&&(e={});var a=function(t){for(var e={info:{},styles:{format:[],style:[]},events:{format:[],comment:[],dialogue:[]}},a=t.split(/\r?\n/),s=0,r=0;r<a.length;r++){var n=a[r].trim();if(!/^;/.test(n)&&(/^\[Script Info\]/i.test(n)?s=1:/^\[V4\+? Styles\]/i.test(n)?s=2:/^\[Events\]/i.test(n)?s=3:/^\[.*\]/.test(n)&&(s=0),0!==s)){if(1===s&&/:/.test(n)){var i=n.match(/(.*?)\s*:\s*(.*)/),l=i[1],c=i[2];e.info[l]=c}if(2===s&&(/^Format\s*:/i.test(n)&&(e.styles.format=d(n)),/^Style\s*:/i.test(n)&&e.styles.style.push(f(n,e.styles.format))),3===s&&(/^Format\s*:/i.test(n)&&(e.events.format=d(n)),/^(?:Comment|Dialogue)\s*:/i.test(n))){var p=n.match(/^(\w+?)\s*:\s*(.*)/i),u=p[1],h=p[2];e.events[u.toLowerCase()].push(o(h,e.events.format))}}}return e}(t),s=Object.assign(e.defaultInfo||{},a.info),r=function(t){for(var e=t.info,a=t.style,s=t.defaultStyle,r={},n=[Object.assign({},s,{Name:"Default"})].concat(a),i=function(t){var a=Object.assign({},$,n[t]);/^(\*+)Default$/.test(a.Name)&&(a.Name="Default"),Object.keys(a).forEach(function(t){"Name"===t||"Fontname"===t||/Colour/.test(t)||(a[t]*=1)});var s=k(a.PrimaryColour),i=s[0],o=s[1],l=k(a.SecondaryColour),c=l[0],d=l[1],f=k(a.OutlineColour),p=f[0],u=f[1],h=k(a.BackColour),g=h[0],y=h[1],m={fn:a.Fontname,fs:a.Fontsize,c1:o,a1:i,c2:d,a2:c,c3:u,a3:p,c4:y,a4:g,b:Math.abs(a.Bold),i:Math.abs(a.Italic),u:Math.abs(a.Underline),s:Math.abs(a.StrikeOut),fscx:a.ScaleX,fscy:a.ScaleY,fsp:a.Spacing,frz:a.Angle,xbord:a.Outline,ybord:a.Outline,xshad:a.Shadow,yshad:a.Shadow,fe:a.Encoding,q:/^[0-3]$/.test(e.WrapStyle)?1*e.WrapStyle:2};r[a.Name]={style:a,tag:m}},o=0;o<n.length;o++)i(o);return r}({info:s,style:a.styles.style,defaultStyle:e.defaultStyle||{}});return{info:s,width:1*s.PlayResX||null,height:1*s.PlayResY||null,wrapStyle:/^[0-3]$/.test(s.WrapStyle)?1*s.WrapStyle:2,collisions:s.Collisions||"Normal",styles:r,dialogues:S({styles:r,dialogues:a.events.dialogue})}}const M="fontBoundingBoxAscent"in TextMetrics.prototype,E=navigator.userAgent.toLowerCase().includes("firefox"),C=!M&&E?512:2048,O=Object.create(null),j=document.createElement("canvas").getContext("2d"),L=document.createElement("div");L.className="ASS-fix-font-size",L.style.fontSize=`${C}px`;const N=document.createElement("span");N.textContent="0",L.append(N);const R=M?null:L;function F(t,e){if(!O[t])if(M){j.font=`${C}px "${t}"`;const e=j.measureText("");O[t]=e.fontBoundingBoxAscent+e.fontBoundingBoxDescent}else N.style.fontFamily=`"${t}"`,O[t]=N.clientHeight;return e*C/O[t]}function B(t){const e=t.match(/(\w\w)(\w\w)(\w\w)(\w\w)/),a=function(t){return 1-`0x${t}`/255}(e[1]),s=+`0x${e[2]}`,r=+`0x${e[3]}`;return`rgba(${+`0x${e[4]}`},${r},${s},${a})`}function z(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,t=>{const e=Math.trunc(16*Math.random());return("x"===t?e:3&e|8).toString(16)})}function T(t,e=[]){const a=document.createElementNS("http://www.w3.org/2000/svg",t);for(let t=0;t<e.length;t+=1){const s=e[t];a.setAttributeNS("xlink:href"===s[0]?"http://www.w3.org/1999/xlink":null,s[0],s[1])}return a}function _(t,e,a){const s=t.animate(e,a);return s.pause(),s}function H(t,e){(t.animations||[]).forEach(t=>{t[e]()})}const q=["frx","fry","frz"],I=["fscx","fscy"],P=["fax","fay"];const V=["blur","xbord","ybord","xshad","yshad"];function D(t,e){const{name:a,delay:s,leftToRight:r}=t,n="banner"===a?"X":"Y",i={X:r?1:-1,Y:/up/.test(a)?-1:1}[n],o=-100*i;return[[{offset:0,transform:`translate${n}(${o}%)`},{offset:1,transform:`translate${n}(calc(${o}% + var(--ass-scale) * ${e/(s||1)*i}px))`}],{duration:e,fill:"forwards"}]}function W(t){return`calc(var(--ass-scale) * ${t}px)`}function X(t,e){const{x1:a,y1:s,x2:r,y2:n,t1:i,t2:o}=t,l=`translate(${W(a)}, ${W(s)})`,c=`translate(${W(r)}, ${W(n)})`,d=Math.max(o,e);return[[{offset:0,transform:l},i>0?{offset:i/d,transform:l}:null,o>0&&o<e?{offset:o/d,transform:c}:null,{offset:1,transform:c}].filter(Boolean),{duration:d,fill:"forwards"}]}function Y(t,e){const{type:a,a1:s,a2:r,a3:n,t1:i,t2:o,t3:l,t4:c}=t;if("fad"===a){return[[[{offset:0,opacity:1},{offset:1,opacity:0}],{duration:o,delay:e-o,fill:"forwards"}],[[{offset:0,opacity:0},{offset:1,opacity:1}],{duration:i,composite:"replace"}]]}const d=Math.max(e,c),f=[s,r,n].map(t=>1-t/255);return[[[0,i,o,l,c].map(t=>t/d).map((t,e)=>({offset:t,opacity:f[e>>1]})),{duration:d,fill:"forwards"}]]}function U(t,e){if(1===e)return"linear";const a=Math.ceil(t/1e3*60);return`linear(${Array.from({length:a+1}).map((t,s)=>(s/a)**e).join(",")})`}function G(t,e,a){const s={...a,...e.tag};return(e.tag.t||[]).map(({t1:e,t2:a,accel:r,tag:n})=>{const i=Object.fromEntries(Object.keys(n).flatMap(t=>function(t,e,a){const s=e[a];return void 0===s||"clip"===a?[]:"a1"===a||"c1"===a?[["fill-color",B((e.a1||t.a1)+(e.c1||t.c1))]]:"a3"===a||"c3"===a?[["border-color",B((e.a3||t.a3)+(e.c3||t.c3))]]:"a4"===a||"c4"===a?[["shadow-color",B((e.a4||t.a4)+(e.c4||t.c4))]]:"fs"===a?[["real-fs",F(e.fn||t.fn,e.fs)],["tag-fs",s]]:"fscx"===a||"fscy"===a?[[`tag-${a}`,(s||100)/100]]:"xbord"===a||"ybord"===a?[["border-width",2*s]]:[[`tag-${a}`,s]]}(s,n,t)).map(([t,e])=>[`--ass-${t}`,e]).concat([["offset",1]])),o=Math.max(0,a-e);return _(t,[i],{duration:o,delay:e,fill:"forwards",easing:U(o,r)})})}function J(t,e,a){if(!t.dots)return"";const{x1:s,y1:r,x2:n,y2:i}=t.dots;return`polygon(evenodd, ${[[s,r],[s,i],[n,i],[n,r],[s,r]].map(([t,s])=>[t/e,s/a]).concat(t.inverse?[[0,0],[0,1],[1,1],[1,0],[0,0]]:[]).map(t=>t.map(t=>100*t+"%").join(" ")).join(",")})`}function K(t,e){const{clip:a,animations:s}=t;if(!a)return{};const{width:r,height:n}=e.scriptRes,i=document.createElement("div");return e.box.insertBefore(i,t.$div),i.append(t.$div),i.className="ASS-clip-area",i.style.zIndex=t.$div.style.zIndex,i.style.clipPath=a.dots?J(a,r,n):function(t,e,a,s){if(!t.drawing)return"";const r=s.scale/(1<<t.scale-1);let n=t.drawing.instructions.map(({type:t,points:e})=>t+e.map(({x:t,y:e})=>`${t*r},${e*r}`).join(",")).join("");return t.inverse&&(n+=`M0,0L0,${a},${e},${a},${e},0,0,0Z`),`path(evenodd, "${n}")`}(a,r,n,e),s.push(...function(t,e,a){return e.slices.flatMap(t=>t.fragments).flatMap(t=>t.tag.t||[]).filter(({tag:t})=>t.clip).map(({t1:e,t2:s,accel:r,tag:n})=>{const i={offset:1,clipPath:J(n.clip,a.scriptRes.width,a.scriptRes.height)},o=Math.max(0,s-e);return _(t,[i],{duration:o,delay:e,fill:"forwards",easing:U(o,r)})})}(i,t,e)),{$div:i}}function Z(t,e){const a=`ASS-${z()}`,s=t.xbord||t.ybord,r=t.xshad||t.yshad,n="ff"!==(t.a1||"00").toLowerCase(),i=(t.blur||t.be||0)*e,o=T("filter",[["id",a]]);o.append(T("feGaussianBlur",[["stdDeviation",s?0:i],["in","SourceGraphic"],["result","sg_b"]])),o.append(T("feFlood",[["flood-color","var(--ass-fill-color)"],["result","c1"]])),o.append(T("feComposite",[["operator","in"],["in","c1"],["in2","sg_b"],["result","main"]])),s&&(o.append(T("feMorphology",[["radius",`${t.xbord*e} ${t.ybord*e}`],["operator","dilate"],["in","SourceGraphic"],["result","dil"]])),o.append(T("feGaussianBlur",[["stdDeviation",i],["in","dil"],["result","dil_b"]])),o.append(T("feComposite",[["operator","out"],["in","dil_b"],["in2","SourceGraphic"],["result","dil_b_o"]])),o.append(T("feFlood",[["flood-color","var(--ass-border-color)"],["result","c3"]])),o.append(T("feComposite",[["operator","in"],["in","c3"],["in2","dil_b_o"],["result","border"]]))),r&&(s||n)&&(o.append(T("feOffset",[["dx",t.xshad*e],["dy",t.yshad*e],["in",s?n?"dil":"dil_b_o":"SourceGraphic"],["result","off"]])),o.append(T("feGaussianBlur",[["stdDeviation",i],["in","off"],["result","off_b"]])),n||(o.append(T("feOffset",[["dx",t.xshad*e],["dy",t.yshad*e],["in","SourceGraphic"],["result","sg_off"]])),o.append(T("feComposite",[["operator","out"],["in","off_b"],["in2","sg_off"],["result","off_b_o"]]))),o.append(T("feFlood",[["flood-color","var(--ass-shadow-color)"],["result","c4"]])),o.append(T("feComposite",[["operator","in"],["in","c4"],["in2",n?"off_b":"off_b_o"],["result","shadow"]])));const l=T("feMerge",[]);return r&&(s||n)&&l.append(T("feMergeNode",[["in","shadow"]])),s&&l.append(T("feMergeNode",[["in","border"]])),l.append(T("feMergeNode",[["in","main"]])),o.append(l),{id:a,el:o}}function Q(t,e){const{styles:a}=e,s=document.createElement("div");s.className="ASS-dialogue",s.dataset.wrapStyle=t.q;const r=document.createDocumentFragment(),{align:n,slices:i}=t;[["--ass-align-h",["0%","50%","100%"][n.h]],["--ass-align-v",["100%","50%","0%"][n.v]]].forEach(([t,e])=>{s.style.setProperty(t,e)});const o=[];return i.forEach(s=>{const n=a[s.style].tag,i=a[s.style].style.BorderStyle;s.fragments.forEach(a=>{const{text:s,drawing:l}=a,c={...n,...a.tag};let d="";const f=[];f.push(...function(t){return[["border-width",2*t.xbord],["border-color",B(`${t.a3}${t.c3}`)],["shadow-color",B(`${t.a4}${t.c4}`)],["tag-blur",t.blur||t.be||0],["tag-xbord",t.xbord],["tag-ybord",t.ybord],["tag-xshad",t.xshad],["tag-yshad",t.yshad]].map(([t,e])=>[`--ass-${t}`,e])}(c));let p=null;const u=c.xbord||c.ybord||c.xshad||c.yshad;if(u&&(l||"00"!==c.a1||c.xbord!==c.ybord)){const t=Z(c,e.sbas?e.scale:1),a=T("svg",[["width",0],["height",0]]);a.append(t.el),p={id:t.id,el:a}}if(f.push(...function(t){return[["real-fs",F(t.fn,t.fs)],["tag-fs",t.fs],["tag-fsp",t.fsp],["fill-color",B(t.a1+t.c1)]].filter(([,t])=>t).map(([t,e])=>[`--ass-${t}`,e])}(c)),l||(d+=`font-family:"${c.fn}";`,d+=c.b?`font-weight:${1===c.b?"bold":c.b};`:"",d+=c.i?"font-style:italic;":"",d+=c.u||c.s?`text-decoration:${c.u?"underline":""} ${c.s?"line-through":""};`:""),l&&c.pbo){const t=-c.pbo*(c.fscy||100)/100;d+=`vertical-align:calc(var(--ass-scale) * ${t}px);`}f.push(...function(t){return[...[...q,...P].map(e=>[`--ass-tag-${e}`,`${t[e]||0}`]),...I.map(e=>[`--ass-tag-${e}`,t.p?1:(t[e]||100)/100])]}(c));const h=[c,...(c.t||[]).map(t=>t.tag)],g=q.some(t=>h.some(e=>e[t])),y=I.some(t=>h.some(e=>void 0!==e[t]&&100!==e[t])),m=P.some(t=>h.some(e=>e[t]));(function(t,e){return t.replace(/\\h/g," ").replace(/\\N/g,"\n").replace(/\\n/g,2===e?"\n":" ")})(s,t.q).split("\n").forEach((t,s)=>{const h=document.createElement("span"),v=document.createElement("span");if((y||m)&&(y&&(v.dataset.scale=""),m&&(v.dataset.skew=""),v.textContent=t),g&&(h.dataset.rotate=""),l){h.dataset.drawing="";const t=function(t,e,a){if(!t.drawing.d)return null;const s={...e,...t.tag},{minX:r,minY:n,width:i,height:o}=t.drawing,l=a.scale/(1<<s.p-1),c=(s.fscx?s.fscx/100:1)*l,d=(s.fscy?s.fscy/100:1)*l,f=s.blur||s.be||0,p=s.xbord+(s.xshad<0?-s.xshad:0)+f,u=s.ybord+(s.yshad<0?-s.yshad:0)+f,h=i*c+2*s.xbord+Math.abs(s.xshad)+2*f,g=o*d+2*s.ybord+Math.abs(s.yshad)+2*f,y=T("svg",[["width",h],["height",g],["viewBox",`${-p} ${-u} ${h} ${g}`]]),m=a.sbas?a.scale:1,v=T("defs"),x=Z(s,m);v.append(x.el),y.append(v);const b=`ASS-${z()}`,w=T("symbol",[["id",b],["viewBox",`${r} ${n} ${i} ${o}`]]);return w.append(T("path",[["d",t.drawing.d]])),y.append(w),y.append(T("use",[["width",i*c],["height",o*d],["xlink:href",`#${b}`],["filter",`url(#${x.id})`]])),y.style.cssText=`position:absolute;left:${r*c-p}px;top:${n*d-u}px;`,{$svg:y,cssText:`position:relative;width:${i*c}px;height:${o*d}px;`}}(a,n,e);if(!t)return;h.style.cssText=t.cssText,h.append(t.$svg)}else{if(s){const t=document.createElement("div");t.dataset.is="br",t.style.setProperty("--ass-tag-fs",c.fs),r.append(t)}if(!t)return;y||m?h.append(v):h.textContent=t;const e=y||m?v:h;e.dataset.text=t,u&&(e.dataset.borderStyle=i,c.xbord||c.ybord||(e.dataset.noBorder=""),e.dataset.stroke="css"),p&&(e.dataset.stroke="svg",e.style.filter=`url(#${p.id})`,e.append(p.el))}h.style.cssText+=d,f.forEach(([t,e])=>{h.style.setProperty(t,e)}),o.push(...G(h,a,n)),r.append(h)})})}),o.push(...function(t,e){const{start:a,end:s,effect:r,move:n,fade:i}=e,o=1e3*(s-a);return[r&&!n?D(r,o):null,n?X(n,o):null,...i?Y(i,o):[]].filter(Boolean).map(([e,a])=>_(t,e,a))}(s,t)),s.append(r),{$div:s,animations:o}}function tt(t,e){const{video:a,space:s,scale:r}=e,{layer:n,margin:i,width:o,height:l,alignment:c,end:d}=t,f=e.width-Math.trunc(r*(i.left+i.right)),p=e.height,u=Math.trunc(r*i.vertical),h=100*a.currentTime;s[n]=s[n]||{left:{width:new Uint16Array(p+1),end:new Uint32Array(p+1)},center:{width:new Uint16Array(p+1),end:new Uint32Array(p+1)},right:{width:new Uint16Array(p+1),end:new Uint32Array(p+1)}};const g=s[n],y=["right","left","center"][c%3];let m=0,v=0;const x=t=>(m=(t=>{const e=g.left.width[t],a=g.center.width[t],s=g.right.width[t],r=g.left.end[t],n=g.center.end[t],i=g.right.end[t];return"left"===y&&(r>h&&e||n>h&&a&&2*o+a>f||i>h&&s&&o+s>f)||"center"===y&&(r>h&&e&&2*e+o>f||n>h&&a||i>h&&s&&2*s+o>f)||"right"===y&&(r>h&&e&&e+o>f||n>h&&a&&2*o+a>f||i>h&&s)})(t)?0:m+1,m>=l&&(v=t,!0));if(c<=3){v=p-u-1;for(let t=v;t>u&&!x(t);t-=1);}else if(c>=7){v=u+1;for(let t=v;t<p-u&&!x(t);t+=1);}else{v=p-l>>1;for(let t=v;t<p-u&&!x(t);t+=1);}c>3&&(v-=l-1);for(let t=v;t<v+l;t+=1)g[y].width[t]=o,g[y].end[t]=100*d;return v}function et(t,e){const a=document.createElement("div");a.className="ASS-effect-area",e.box.insertBefore(a,t.$div),a.append(t.$div);const{width:s,height:r}=e.scriptRes,{name:n,y1:i,y2:o,leftToRight:l,fadeAwayWidth:c,fadeAwayHeight:d}=t.effect,f=Math.min(i,o),p=Math.max(i,o);if(a.dataset.effect=n,"banner"===n&&(a.style.alignItems=l?"flex-start":"flex-end",a.style.justifyContent=["flex-end","center","flex-start"][t.align.v]),n.startsWith("scroll")){const e=f/r*100,s=(r-p)/r*100;a.style.cssText=`top:${e}%;bottom:${s}%;`,a.style.justifyContent=["flex-start","center","flex-end"][t.align.h]}if(d){const t=d/(p-f)*100;a.style.maskImage=[`linear-gradient(#000 ${100-t}%, transparent)`,`linear-gradient(transparent, #000 ${t}%)`].join(",")}if(c){const t=c/s*100;a.style.maskImage=`linear-gradient(90deg, transparent, #000 ${t}%)`}return a}function at(t,e){const{$div:a,animations:s}=Q(t,e);Object.assign(t,{$div:a,animations:s}),e.box.append(a);const{width:r}=a.getBoundingClientRect();Object.assign(t,{width:r}),a.style.cssText+=function(t){const{layer:e,align:a,effect:s,pos:r,margin:n,q:i}=t;let o="";return e&&(o+=`z-index:${e};`),o+=`text-align:${["left","center","right"][a.h]};`,s||(2!==i&&(o+=`max-width:calc(100% - var(--ass-scale) * ${n.left+n.right}px);`),r||(0!==a.h&&(o+=`padding-right:calc(var(--ass-scale) * ${n.right}px);`),2!==a.h&&(o+=`padding-left:calc(var(--ass-scale) * ${n.left}px);`))),o}(t);const{height:n}=a.getBoundingClientRect();Object.assign(t,{height:n});const{x:i,y:o}=function(t,e){const{scale:a}=e,{move:s,align:r,width:n,height:i,margin:o,slices:l}=t;let c=0,d=0;if(t.pos||s){const e=t.pos||{x:0,y:0},s=a*e.x,o=a*e.y;c=[s,s-n/2,s-n][r.h],d=[o-i,o-i/2,o][r.v]}else c=[0,(e.width-n)/2,e.width-n-a*o.right][r.h],d=l.some(t=>t.fragments.some(({keyframes:t})=>t?.length))?[e.height-i-o.vertical,(e.height-i)/2,o.vertical][r.v]:tt(t,e);return{x:c+[0,n/2,n][r.h],y:d+[i,i/2,0][r.v]}}(t,e);return Object.assign(t,{x:i,y:o}),a.style.cssText+=`left:${i}px;top:${o}px;`,function(t,e){const{align:a,width:s,height:r,x:n,y:i,$div:o}=t,l=(t.org?t.org.x*e:n)+[0,s/2,s][a.h],c=(t.org?t.org.y*e:i)+[r,r/2,0][a.v];for(let t=o.childNodes.length-1;t>=0;t-=1){const e=o.childNodes[t];if(""===e.dataset.rotate){const t=l-n-e.offsetLeft,a=c-i-e.offsetTop;e.style.cssText+=`transform-origin:${t}px ${a}px;`}}}(t,e.scale),Object.assign(t,K(t,e)),t.effect&&Object.assign(t,{$div:et(t,e)}),t}function st(t){const{box:e}=t;for(;e.lastChild;)e.lastChild.remove();t.actives=[],t.space=[]}function rt(t,e){const{dialogues:a,actives:s}=t,r=e-t.delay;for(let t=s.length-1;t>=0;t-=1){const e=s[t],{end:a}=e;a<r&&(e.$div.remove(),s.splice(t,1))}for(;t.index<a.length&&r>=a[t.index].start;){if(r<a[t.index].end){const e=at(a[t.index],t);(e.animations||[]).forEach(t=>{t.currentTime=1e3*(r-e.start)}),s.push(e),t.video.paused||H(e,"play")}t.index+=1}}function nt(t){return function(){st(t);const{video:e,dialogues:a}=t,s=e.currentTime-t.delay;t.index=(()=>{for(let t=0;t<a.length;t+=1)if(s<a[t].end)return t;return(a.length||1)-1})(),rt(t,e.currentTime)}}function it(t){const e=t.requestVideoFrameCallback;return[e?t.requestVideoFrameCallback.bind(t):requestAnimationFrame,e?t.cancelVideoFrameCallback.bind(t):cancelAnimationFrame]}window.CSS.registerProperty&&(["real-fs","tag-fs","tag-fsp","border-width",...[...V,...q,...P].map(t=>`tag-${t}`)].forEach(t=>{window.CSS.registerProperty({name:`--ass-${t}`,syntax:"<number>",inherits:!0,initialValue:0})}),["border-opacity","shadow-opacity",...I.map(t=>`tag-${t}`)].forEach(t=>{window.CSS.registerProperty({name:`--ass-${t}`,syntax:"<number>",inherits:!0,initialValue:1})}),["fill-color","border-color","shadow-color"].forEach(t=>{window.CSS.registerProperty({name:`--ass-${t}`,syntax:"<color>",inherits:!0,initialValue:"transparent"})}));class ot{#t={video:null,box:document.createElement("div"),observer:null,scale:1,width:0,height:0,scriptRes:{},layoutRes:{},resampledRes:{},index:0,sbas:!0,styles:{},dialogues:[],actives:[],space:[],requestId:0,delay:0};#e;#a;#s;#r;constructor(t,e,{container:a=e.parentNode,resampling:s}={}){if(this.#t.video=e,!a)throw new Error("Missing container.");const{info:r,width:n,height:i,styles:o,dialogues:l}=A(t);this.#t.sbas=/yes/i.test(r.ScaledBorderAndShadow),this.#t.layoutRes={width:1*r.LayoutResX||e.videoWidth||e.clientWidth,height:1*r.LayoutResY||e.videoHeight||e.clientHeight},this.#t.scriptRes={width:n||this.#t.layoutRes.width,height:i||this.#t.layoutRes.height},this.#t.styles=o,this.#t.dialogues=l.map(t=>Object.assign(t,{effect:["banner","scroll up","scroll down"].includes(t.effect?.name)?t.effect:null,align:{h:(t.alignment+2)%3,v:Math.trunc((t.alignment-1)/3)}})),R&&a.append(R);const{box:c}=this.#t;c.className="ASS-box",a.append(c),function(t){const e=t.getRootNode()||document,a=e===document?document.head:e;let s=a.querySelector("#ASS-global-style");s||(s=document.createElement("style"),s.type="text/css",s.id="ASS-global-style",s.append(document.createTextNode('.ASS-box{pointer-events:none;font-family:Arial;position:absolute;overflow:hidden}.ASS-dialogue{z-index:0;width:max-content;transform:translate(calc(var(--ass-align-h) * -1), calc(var(--ass-align-v) * -1));font-size:0;position:absolute}.ASS-dialogue span{display:inline-block}.ASS-dialogue [data-text]{color:var(--ass-fill-color);font-size:calc(var(--ass-scale) * var(--ass-real-fs) * 1px);line-height:calc(var(--ass-scale) * var(--ass-tag-fs) * 1px);letter-spacing:calc(var(--ass-scale) * var(--ass-tag-fsp) * 1px);filter:blur(calc(var(--ass-scale-stroke) * var(--ass-tag-blur) * (1 - round(up, sin(var(--ass-tag-xbord)) * sin(var(--ass-tag-xbord)))) * (1 - round(up, sin(var(--ass-tag-ybord)) * sin(var(--ass-tag-ybord)))) * 1px));display:inline-block}.ASS-dialogue [data-is=br]+[data-is=br]{height:calc(var(--ass-scale) * var(--ass-tag-fs) * 1px / 2)}.ASS-dialogue[data-wrap-style="0"],.ASS-dialogue[data-wrap-style="3"]{text-wrap:balance;white-space:pre-wrap}.ASS-dialogue[data-wrap-style="1"]{word-break:break-word;white-space:pre-wrap}.ASS-dialogue[data-wrap-style="2"]{word-break:normal;white-space:pre}.ASS-dialogue [data-border-style="1"]{position:relative}.ASS-dialogue [data-border-style="1"]:before,.ASS-dialogue [data-border-style="1"]:after{content:attr(data-text);z-index:-1;filter:blur(calc(var(--ass-scale-stroke) * var(--ass-tag-blur) * 1px));position:absolute;top:0;left:0}.ASS-dialogue [data-border-style="1"]:before{color:var(--ass-shadow-color);-webkit-text-stroke:calc(var(--ass-scale-stroke) * var(--ass-border-width) * 1px) var(--ass-shadow-color);transform:translate(calc(var(--ass-scale-stroke) * var(--ass-tag-xshad) * 1px), calc(var(--ass-scale-stroke) * var(--ass-tag-yshad) * 1px))}.ASS-dialogue [data-border-style="1"]:after{color:var(--ass-border-color);-webkit-text-stroke:calc(var(--ass-scale-stroke) * var(--ass-border-width) * 1px) var(--ass-border-color)}.ASS-dialogue [data-border-style="1"][data-stroke=svg]{color:#000}.ASS-dialogue [data-border-style="1"][data-stroke=svg]:before,.ASS-dialogue [data-border-style="1"][data-stroke=svg]:after{opacity:0}@container style(--ass-tag-xbord:0) and style(--ass-tag-ybord:0){.ASS-dialogue [data-border-style="1"]:after{display:none}}@container style(--ass-tag-xshad:0) and style(--ass-tag-yshad:0){.ASS-dialogue [data-border-style="1"]:before{display:none}}.ASS-dialogue [data-border-style="3"]{background-color:var(--ass-border-color);box-shadow:calc(var(--ass-scale-stroke) * var(--ass-tag-xshad) * 1px) calc(var(--ass-scale-stroke) * var(--ass-tag-yshad) * 1px) var(--ass-shadow-color);padding:calc(var(--ass-scale-stroke) * var(--ass-tag-xbord) * 1px) calc(var(--ass-scale-stroke) * var(--ass-tag-ybord) * 1px);filter:blur(calc(var(--ass-scale-stroke) * var(--ass-tag-blur) * 1px));display:inline;position:relative}.ASS-dialogue [data-border-style="3"][data-no-border]{background-color:#0000}.ASS-dialogue [data-rotate]{transform:perspective(312.5px) rotateY(calc(var(--ass-tag-fry) * 1deg)) rotateX(calc(var(--ass-tag-frx) * 1deg)) rotateZ(calc(var(--ass-tag-frz) * -1deg))}.ASS-dialogue [data-rotate][data-text]{transform-style:preserve-3d;word-break:normal;white-space:nowrap}.ASS-dialogue [data-scale],.ASS-dialogue [data-skew]{transform:scale(var(--ass-tag-fscx), var(--ass-tag-fscy)) skew(calc(var(--ass-tag-fax) * 57.2958deg), calc(var(--ass-tag-fay) * 57.2958deg));transform-origin:var(--ass-align-h) var(--ass-align-v);display:inline-block}.ASS-fix-font-size{visibility:hidden;width:0;height:0;font-family:Arial;line-height:normal;position:absolute;overflow:hidden}.ASS-fix-font-size span{position:absolute}.ASS-clip-area{width:100%;height:100%;position:absolute;top:0;left:0}.ASS-effect-area{width:100%;height:fit-content;display:flex;position:absolute;overflow:hidden;mask-composite:intersect}.ASS-effect-area[data-effect=banner]{flex-direction:column;height:100%}.ASS-effect-area .ASS-dialogue{position:static;transform:none}')),a.append(s))}(a),this.#e=function(t){const{video:e}=t,[a,s]=it(e);return function(){const r=(s,n)=>{rt(t,n?.mediaTime||e.currentTime),t.requestId=a(r)};s(t.requestId),t.requestId=a(r),t.actives.forEach(t=>{H(t,"play")})}}(this.#t),this.#a=function(t){const[,e]=it(t.video);return function(){e(t.requestId),t.requestId=0,t.actives.forEach(t=>{H(t,"pause")})}}(this.#t),this.#s=nt(this.#t),e.addEventListener("play",this.#e),e.addEventListener("pause",this.#a),e.addEventListener("playing",this.#e),e.addEventListener("waiting",this.#a),e.addEventListener("seeking",this.#s),this.#r=function(t,e){const{video:a,box:s,layoutRes:r}=e;return function(){const n=a.clientWidth,i=a.clientHeight,o=a.videoWidth||n,l=a.videoHeight||i,c=r.width||o,d=r.height||l,f=e.scriptRes.width,p=e.scriptRes.height;let u=f,h=p;const g=Math.min(n/c,i/d);"video_width"===t.resampling&&(h=f/c*d),"video_height"===t.resampling&&(u=p/d*c),e.scale=Math.min(n/u,i/h),"script_width"===t.resampling&&(e.scale=g*(c/u)),"script_height"===t.resampling&&(e.scale=g*(d/h));const y=e.scale*u,m=e.scale*h;e.width=y,e.height=m,e.resampledRes={width:u,height:h},s.style.cssText=`width:${y}px;height:${m}px;top:${(i-m)/2}px;left:${(n-y)/2}px;`,s.style.setProperty("--ass-scale",e.scale),s.style.setProperty("--ass-scale-stroke",e.sbas?e.scale:1);const v=o/c/(l/d);v>1&&(s.style.transform=`scaleX(${v})`),v<1&&(s.style.transform=`scaleY(${1/v})`),nt(e)()}}(this,this.#t),this.#r(),this.resampling=s;const d=new ResizeObserver(this.#r);return d.observe(e),this.#t.observer=d,this}destroy(){const{video:t,box:e,observer:a}=this.#t;return this.#a(),st(this.#t),t.removeEventListener("play",this.#e),t.removeEventListener("pause",this.#a),t.removeEventListener("playing",this.#e),t.removeEventListener("waiting",this.#a),t.removeEventListener("seeking",this.#s),R&&R.remove(),e.remove(),a.unobserve(this.#t.video),this.#t.styles={},this.#t.dialogues=[],this}show(){return this.#t.box.style.visibility="visible",this}hide(){return this.#t.box.style.visibility="hidden",this}#n="video_height";get resampling(){return this.#n}set resampling(t){t!==this.#n&&/^(video|script)_(width|height)$/.test(t)&&(this.#n=t,this.#r())}get delay(){return this.#t.delay}set delay(t){"number"==typeof t&&(this.#t.delay=t,this.#s())}}export{ot as default};