UNPKG

assjs-v2

Version:

A lightweight JavaScript ASS subtitle renderer

2 lines (1 loc) 34.4 kB
function e(e){var t=e.toLowerCase().trim().split(/\s*;\s*/);return"banner"===t[0]?{name:t[0],delay:1*t[1]||0,leftToRight:1*t[2]||0,fadeAwayWidth:1*t[3]||0}:/^scroll\s/.test(t[0])?{name:t[0],y1:Math.min(1*t[1],1*t[2]),y2:Math.max(1*t[1],1*t[2]),delay:1*t[3]||0,fadeAwayHeight:1*t[4]||0}:""!==e?{name:e}:null}function t(e){return e?e.toLowerCase().replace(/([+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?)/g," $1 ").replace(/([mnlbspc])/g," $1 ").trim().replace(/\s+/g," ").split(/\s(?=[mnlbspc])/).map(function(e){return e.split(" ").filter(function(e,t){return!(t&&isNaN(1*e))})}):[]}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(e){return{name:e,regex:new RegExp("^"+e+"-?\\d")}});function s(e){for(var r,n={},i=0;i<a.length;i++){var o=a[i],l=o.name;if(o.regex.test(e))return n[l]=1*e.slice(l.length),n}if(/^fn/.test(e))n.fn=e.slice(2);else if(/^r/.test(e))n.r=e.slice(1);else if(/^fs[\d+-]/.test(e))n.fs=e.slice(2);else if(/^\d?c&?H?[0-9a-fA-F]+|^\d?c$/.test(e)){var c=e.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(e)){var p=e.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(e))r=e.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(e)){var g=e.match(/^(\w+)\((.*?)\)?$/),y=g[1],m=g[2];n[y]=m.trim().split(/\s*,\s*/).map(Number)}else if(/^i?clip\([^)]+/.test(e)){var x=e.match(/^i?clip\((.*?)\)?$/)[1].trim().split(/\s*,\s*/);n.clip={inverse:/iclip/.test(e),scale:1,drawing:null,dots:null},1===x.length&&(n.clip.drawing=t(x[0])),2===x.length&&(n.clip.scale=1*x[0],n.clip.drawing=t(x[1])),4===x.length&&(n.clip.dots=x.map(Number))}else if(/^t\(/.test(e)){var v=e.match(/^t\((.*?)\)?$/)[1].trim().replace(/\\.*/,function(e){return e.replace(/,/g,"\n")}).split(/\s*,\s*/);if(!v[0])return n;n.t={t1:0,t2:0,accel:1,tags:v[v.length-1].replace(/\n/g,",").split("\\").slice(1).map(s)},2===v.length&&(n.t.accel=1*v[0]),3===v.length&&(n.t.t1=1*v[0],n.t.t2=1*v[1]),4===v.length&&(n.t.t1=1*v[0],n.t.t2=1*v[1],n.t.accel=1*v[2])}return n}function r(e){for(var t=[],a=0,r="",n=e.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&&t.push(r),r="")}return t.map(s)}function n(e){var a=e.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(e,t){return void 0===t.p?e:!!t.p},!1);s.push({tags:i,text:o?"":a[n+1],drawing:o?t(a[n+1]):[]})}return{raw:e,combined:s.map(function(e){return e.text}).join(""),parsed:s}}function i(e){var t=e.split(":");return 3600*t[0]+60*t[1]+1*t[2]}function o(t,a){var s=t.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]=e(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(e){var t=l.concat(c);return e.match(/Format\s*:\s*(.*)/i)[1].split(/\s*,\s*/).map(function(e){return t.find(function(t){return t.toLowerCase()===e.toLowerCase()})||e})}function f(e,t){var a=e.match(/Style\s*:\s*(.*)/i)[1].split(/\s*,\s*/);return Object.assign.apply(Object,[{}].concat(t.map(function(e,t){var s;return(s={})[e]=a[t],s})))}function p(e){var t={type:null,prev:null,next:null,points:[]};/[mnlbs]/.test(e[0])&&(t.type=e[0].toUpperCase().replace("N","L").replace("B","C"));for(var a=e.length-!(1&e.length),s=1;s<a;s+=2)t.points.push({x:1*e[s],y:1*e[s+1]});return t}function u(e){return!(!e.points.length||!e.type)&&!(/C|S/.test(e.type)&&e.points.length<3)}function h(e){return e.map(function(e){return e.type+e.points.map(function(e){return e.x+","+e.y}).join(",")}).join("")}function g(e){for(var t,a=[],s=0;s<e.length;){var r=e[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(e){return{x:e.x,y:e.y}}))}e.splice(s,1)}}var d=(t=[]).concat.apply(t,a.map(function(e){var t=e.type,a=e.points,s=e.prev,r=e.next;return"S"===t?function(e,t,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(e,t){return e[0]*t[0]+e[1]*t[1]+e[2]*t[2]+e[3]*t[3]},l=[e[e.length-1].x,e[0].x,e[1].x,e[2].x],c=[e[e.length-1].y,e[0].y,e[1].y,e[2].y];s.push({type:"M"===t?"M":"L",points:[{x:o(i,l),y:o(i,c)}]});for(var d=3;d<e.length;d++)l=[e[d-3].x,e[d-2].x,e[d-1].x,e[d].x],c=[e[d-3].y,e[d-2].y,e[d-1].y,e[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=e[e.length-1];s.push({type:"L",points:[{x:f.x,y:f.y}]})}return s}(a,s,r):{type:t,points:a}}));return Object.assign({instructions:d,d:h(d)},function(e){var t,a=1/0,s=1/0,r=-1/0,n=-1/0;return(t=[]).concat.apply(t,e.map(function(e){return e.points})).forEach(function(e){var t=e.x,i=e.y;a=Math.min(a,t),s=Math.min(s,i),r=Math.max(r,t),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(e,t,a){var s,r,n;void 0===a&&(a={});var i=e[t];if(void 0===i)return null;if("pos"===t||"org"===t)return 2===i.length?((s={})[t]={x:i[0],y:i[1]},s):null;if("move"===t){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"===t||"fade"===t)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"===t){var u=i.inverse,h=i.scale,x=i.drawing,v=i.dots;return x?{clip:{inverse:u,scale:h,drawing:g(x),dots:v}}:v?{clip:{inverse:u,scale:h,drawing:x,dots:{x1:v[0],y1:v[1],x2:v[2],y2:v[3]}}}:null}if(/^[xy]?(bord|shad)$/.test(t)&&(i=Math.max(i,0)),"bord"===t)return{xbord:i,ybord:i};if("shad"===t)return{xshad:i,yshad:i};if(/^c\d$/.test(t))return(r={})[t]=i||a[t],r;if("alpha"===t)return{a1:i,a2:i,a3:i,a4:i};if("fr"===t)return{frz:i};if("fs"===t)return{fs:/^\+|-/.test(i)?(1*i>-10?1+i/10:1)*a.fs:1*i};if("K"===t)return{kf:i};if("t"===t){var b=i.t1,w=i.accel,S=i.tags,$=i.t2||1e3*(a.end-a.start),k={};return S.forEach(function(e){var t=Object.keys(e)[0];~y.indexOf(t)&&("clip"!==t||e[t].dots)&&Object.assign(k,m(e,t,a))}),{t:{t1:b,t2:$,accel:w,tag:k}}}return(n={})[t]=i,n}var x=[null,1,2,3,null,7,8,9,null,4,5,6],v=["r","a","an","pos","org","move","fade","fad","clip"];function b(e){return JSON.parse(JSON.stringify(Object.assign({},e,{k:void 0,kf:void 0,ko:void 0,kt:void 0})))}function w(e){for(var t,a,s,r,n,i,o=e.styles,l=e.style,c=e.parsed,d=e.start,f=e.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,C=0;C<$.length;C++){var E=$[C];M=void 0===E.r?M:E.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];t=t||x[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&&!~v.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 z=h.fragments[h.fragments.length-1]||{};z.text&&O.text&&!Object.keys(O.tag).length?z.text+=O.text:h.fragments.push(O)}}return u.push(h),Object.assign({alignment:t,slices:u},p,a,s,r,n,i)}function S(e){for(var t=e.styles,a=e.dialogues,s=1/0,r=[],n=0;n<a.length;n++){var i=a[n];if(!(i.Start>=i.End)){t[i.Style]||(i.Style="Default");var o=t[i.Style].style,l=w({styles:t,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(e,t){return e.start-t.start||e.end-t.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(e){if(/^(&|H|&H)[0-9a-f]{6,}/i.test(e)){var t=e.match(/&?H?([0-9a-f]{2})?([0-9a-f]{6})/i);return[t[1]||"00",t[2]]}var a=parseInt(e,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(e,t){void 0===t&&(t={});var a=function(e){for(var t={info:{},styles:{format:[],style:[]},events:{format:[],comment:[],dialogue:[]}},a=e.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];t.info[l]=c}if(2===s&&(/^Format\s*:/i.test(n)&&(t.styles.format=d(n)),/^Style\s*:/i.test(n)&&t.styles.style.push(f(n,t.styles.format))),3===s&&(/^Format\s*:/i.test(n)&&(t.events.format=d(n)),/^(?:Comment|Dialogue)\s*:/i.test(n))){var p=n.match(/^(\w+?)\s*:\s*(.*)/i),u=p[1],h=p[2];t.events[u.toLowerCase()].push(o(h,t.events.format))}}}return t}(e),s=Object.assign(t.defaultInfo||{},a.info),r=function(e){for(var t=e.info,a=e.style,s=e.defaultStyle,r={},n=[Object.assign({},s,{Name:"Default"})].concat(a),i=function(e){var a=Object.assign({},$,n[e]);/^(\*+)Default$/.test(a.Name)&&(a.Name="Default"),Object.keys(a).forEach(function(e){"Name"===e||"Fontname"===e||/Colour/.test(e)||(a[e]*=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(t.WrapStyle)?1*t.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:t.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,C=navigator.userAgent.toLowerCase().includes("firefox"),E=!M&&C?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=`${E}px`;const N=document.createElement("span");N.textContent="0",L.append(N);const R=M?null:L;function F(e,t){if(!O[e])if(M){j.font=`${E}px "${e}"`;const t=j.measureText("");O[e]=t.fontBoundingBoxAscent+t.fontBoundingBoxDescent}else N.style.fontFamily=`"${e}"`,O[e]=N.clientHeight;return t*E/O[e]}function z(e){const t=e.match(/(\w\w)(\w\w)(\w\w)(\w\w)/),a=function(e){return 1-`0x${e}`/255}(t[1]),s=+`0x${t[2]}`,r=+`0x${t[3]}`;return`rgba(${+`0x${t[4]}`},${r},${s},${a})`}function B(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{const t=Math.trunc(16*Math.random());return("x"===e?t:3&t|8).toString(16)})}function T(e,t=[]){const a=document.createElementNS("http://www.w3.org/2000/svg",e);for(let e=0;e<t.length;e+=1){const s=t[e];a.setAttributeNS("xlink:href"===s[0]?"http://www.w3.org/1999/xlink":null,s[0],s[1])}return a}function _(e,t,a){const s=e.animate(t,a);return s.pause(),s}function H(e,t){(e.animations||[]).forEach(e=>{e[t]()})}const q=["frx","fry","frz"],P=["fscx","fscy"],I=["fax","fay"];const V=["blur","xbord","ybord","xshad","yshad"];function W(e,t){const{name:a,delay:s,leftToRight:r}=e,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) * ${t/(s||1)*i}px))`}],{duration:t,fill:"forwards"}]}function D(e){return`calc(var(--ass-scale) * ${e}px)`}function X(e,t){const{x1:a,y1:s,x2:r,y2:n,t1:i,t2:o}=e,l=`translate(${D(a)}, ${D(s)})`,c=`translate(${D(r)}, ${D(n)})`,d=Math.max(o,t);return[[{offset:0,transform:l},i>0?{offset:i/d,transform:l}:null,o>0&&o<t?{offset:o/d,transform:c}:null,{offset:1,transform:c}].filter(Boolean),{duration:d,fill:"forwards"}]}function Y(e,t){const{type:a,a1:s,a2:r,a3:n,t1:i,t2:o,t3:l,t4:c}=e;if("fad"===a){return[[[{offset:0,opacity:1},{offset:1,opacity:0}],{duration:o,delay:t-o,fill:"forwards"}],[[{offset:0,opacity:0},{offset:1,opacity:1}],{duration:i,composite:"replace"}]]}const d=Math.max(t,c),f=[s,r,n].map(e=>1-e/255);return[[[0,i,o,l,c].map(e=>e/d).map((e,t)=>({offset:e,opacity:f[t>>1]})),{duration:d,fill:"forwards"}]]}function U(e,t){if(1===t)return"linear";const a=Math.ceil(e/1e3*60);return`linear(${Array.from({length:a+1}).map((e,s)=>(s/a)**t).join(",")})`}function G(e,t,a){const s={...a,...t.tag};return(t.tag.t||[]).map(({t1:t,t2:a,accel:r,tag:n})=>{const i=Object.fromEntries(Object.keys(n).flatMap(e=>function(e,t,a){const s=t[a];return void 0===s||"clip"===a?[]:"a1"===a||"c1"===a?[["fill-color",z((t.a1||e.a1)+(t.c1||e.c1))]]:"a3"===a||"c3"===a?[["border-color",z((t.a3||e.a3)+(t.c3||e.c3))]]:"a4"===a||"c4"===a?[["shadow-color",z((t.a4||e.a4)+(t.c4||e.c4))]]:"fs"===a?[["real-fs",F(t.fn||e.fn,t.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,e)).map(([e,t])=>[`--ass-${e}`,t]).concat([["offset",1]])),o=Math.max(0,a-t);return _(e,[i],{duration:o,delay:t,fill:"forwards",easing:U(o,r)})})}function J(e,t,a){if(!e.dots)return"";const{x1:s,y1:r,x2:n,y2:i}=e.dots;return`polygon(evenodd, ${[[s,r],[s,i],[n,i],[n,r],[s,r]].map(([e,s])=>[e/t,s/a]).concat(e.inverse?[[0,0],[0,1],[1,1],[1,0],[0,0]]:[]).map(e=>e.map(e=>100*e+"%").join(" ")).join(",")})`}function K(e,t){const{clip:a,animations:s}=e;if(!a)return{};const{width:r,height:n}=t.scriptRes,i=document.createElement("div");return t.box.insertBefore(i,e.$div),i.append(e.$div),i.className="ASS-clip-area",i.style.zIndex=e.$div.style.zIndex,i.style.clipPath=a.dots?J(a,r,n):function(e,t,a,s){if(!e.drawing)return"";const r=s.scale/(1<<e.scale-1);let n=e.drawing.instructions.map(({type:e,points:t})=>e+t.map(({x:e,y:t})=>`${e*r},${t*r}`).join(",")).join("");return e.inverse&&(n+=`M0,0L0,${a},${t},${a},${t},0,0,0Z`),`path(evenodd, "${n}")`}(a,r,n,t),s.push(...function(e,t,a){return t.slices.flatMap(e=>e.fragments).flatMap(e=>e.tag.t||[]).filter(({tag:e})=>e.clip).map(({t1:t,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-t);return _(e,[i],{duration:o,delay:t,fill:"forwards",easing:U(o,r)})})}(i,e,t)),{$div:i}}function Z(e,t){const a=`ASS-${B()}`,s=e.xbord||e.ybord,r=e.xshad||e.yshad,n="ff"!==(e.a1||"00").toLowerCase(),i=(e.blur||e.be||0)*t,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",`${e.xbord*t} ${e.ybord*t}`],["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",e.xshad*t],["dy",e.yshad*t],["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",e.xshad*t],["dy",e.yshad*t],["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(e,t){const{styles:a}=t,s=document.createElement("div");s.className="ASS-dialogue",s.dataset.wrapStyle=e.q;const r=document.createDocumentFragment(),{align:n,slices:i}=e;[["--ass-align-h",["0%","50%","100%"][n.h]],["--ass-align-v",["100%","50%","0%"][n.v]]].forEach(([e,t])=>{s.style.setProperty(e,t)});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(e){return[["border-width",2*e.xbord],["border-color",z(`${e.a3}${e.c3}`)],["shadow-color",z(`${e.a4}${e.c4}`)],["tag-blur",e.blur||e.be||0],["tag-xbord",e.xbord],["tag-ybord",e.ybord],["tag-xshad",e.xshad],["tag-yshad",e.yshad]].map(([e,t])=>[`--ass-${e}`,t])}(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 e=Z(c,t.sbas?t.scale:1),a=T("svg",[["width",0],["height",0]]);a.append(e.el),p={id:e.id,el:a}}if(f.push(...function(e){return[["real-fs",F(e.fn,e.fs)],["tag-fs",e.fs],["tag-fsp",e.fsp],["fill-color",z(e.a1+e.c1)]].filter(([,e])=>e).map(([e,t])=>[`--ass-${e}`,t])}(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 e=-c.pbo*(c.fscy||100)/100;d+=`vertical-align:calc(var(--ass-scale) * ${e}px);`}f.push(...function(e){return[...[...q,...I].map(t=>[`--ass-tag-${t}`,`${e[t]||0}`]),...P.map(t=>[`--ass-tag-${t}`,e.p?1:(e[t]||100)/100])]}(c));const h=[c,...(c.t||[]).map(e=>e.tag)],g=q.some(e=>h.some(t=>t[e])),y=P.some(e=>h.some(t=>void 0!==t[e]&&100!==t[e])),m=I.some(e=>h.some(t=>t[e]));(function(e,t){return e.replace(/\\h/g," ").replace(/\\N/g,"\n").replace(/\\n/g,2===t?"\n":" ")})(s,e.q).split("\n").forEach((e,s)=>{const h=document.createElement("span"),x=document.createElement("span");if((y||m)&&(y&&(x.dataset.scale=""),m&&(x.dataset.skew=""),x.textContent=e),g&&(h.dataset.rotate=""),l){h.dataset.drawing="";const e=function(e,t,a){if(!e.drawing.d)return null;const s={...t,...e.tag},{minX:r,minY:n,width:i,height:o}=e.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,x=T("defs"),v=Z(s,m);x.append(v.el),y.append(x);const b=`ASS-${B()}`,w=T("symbol",[["id",b],["viewBox",`${r} ${n} ${i} ${o}`]]);return w.append(T("path",[["d",e.drawing.d]])),y.append(w),y.append(T("use",[["width",i*c],["height",o*d],["xlink:href",`#${b}`]])),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,t);if(!e)return;h.style.cssText=e.cssText,h.append(e.$svg)}else{if(s){const e=document.createElement("div");e.dataset.is="br",e.style.setProperty("--ass-tag-fs",c.fs),r.append(e)}if(!e)return;y||m?h.append(x):h.textContent=e;const t=y||m?x:h;t.dataset.text=e,u&&(t.dataset.borderStyle=i,t.dataset.stroke="css"),p&&(t.dataset.stroke="svg",t.append(p.el))}h.style.cssText+=d,f.forEach(([e,t])=>{h.style.setProperty(e,t)}),o.push(...G(h,a,n)),r.append(h)})})}),o.push(...function(e,t){const{start:a,end:s,effect:r,move:n,fade:i}=t,o=1e3*(s-a);return[r&&!n?W(r,o):null,n?X(n,o):null,...i?Y(i,o):[]].filter(Boolean).map(([t,a])=>_(e,t,a))}(s,e)),s.append(r),{$div:s,animations:o}}function ee(e,t){const{video:a,space:s,scale:r}=t,{layer:n,margin:i,width:o,height:l,alignment:c,end:d}=e,f=t.width-Math.trunc(r*(i.left+i.right)),p=t.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,x=0;const v=e=>(m=(e=>{const t=g.left.width[e],a=g.center.width[e],s=g.right.width[e],r=g.left.end[e],n=g.center.end[e],i=g.right.end[e];return"left"===y&&(r>h&&t||n>h&&a&&2*o+a>f||i>h&&s&&o+s>f)||"center"===y&&(r>h&&t&&2*t+o>f||n>h&&a||i>h&&s&&2*s+o>f)||"right"===y&&(r>h&&t&&t+o>f||n>h&&a&&2*o+a>f||i>h&&s)})(e)?0:m+1,m>=l&&(x=e,!0));if(c<=3){x=p-u-1;for(let e=x;e>u&&!v(e);e-=1);}else if(c>=7){x=u+1;for(let e=x;e<p-u&&!v(e);e+=1);}else{x=p-l>>1;for(let e=x;e<p-u&&!v(e);e+=1);}c>3&&(x-=l-1);for(let e=x;e<x+l;e+=1)g[y].width[e]=o,g[y].end[e]=100*d;return x}function te(e,t){const a=document.createElement("div");a.className="ASS-effect-area",t.box.insertBefore(a,e.$div),a.append(e.$div);const{width:s,height:r}=t.scriptRes,{name:n,y1:i,y2:o,leftToRight:l,fadeAwayWidth:c,fadeAwayHeight:d}=e.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"][e.align.v]),n.startsWith("scroll")){const t=f/r*100,s=(r-p)/r*100;a.style.cssText=`top:${t}%;bottom:${s}%;`,a.style.justifyContent=["flex-start","center","flex-end"][e.align.h]}if(d){const e=d/(p-f)*100;a.style.maskImage=[`linear-gradient(#000 ${100-e}%, transparent)`,`linear-gradient(transparent, #000 ${e}%)`].join(",")}if(c){const e=c/s*100;a.style.maskImage=`linear-gradient(90deg, transparent, #000 ${e}%)`}return a}function ae(e,t){const{$div:a,animations:s}=Q(e,t);Object.assign(e,{$div:a,animations:s}),t.box.append(a);const{width:r}=a.getBoundingClientRect();Object.assign(e,{width:r}),a.style.cssText+=function(e){const{layer:t,align:a,effect:s,pos:r,margin:n,q:i}=e;let o="";return t&&(o+=`z-index:${t};`),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}(e);const{height:n}=a.getBoundingClientRect();Object.assign(e,{height:n});const{x:i,y:o}=function(e,t){const{scale:a}=t,{move:s,align:r,width:n,height:i,margin:o,slices:l}=e;let c=0,d=0;if(e.pos||s){const t=e.pos||{x:0,y:0},s=a*t.x,o=a*t.y;c=[s,s-n/2,s-n][r.h],d=[o-i,o-i/2,o][r.v]}else c=[0,(t.width-n)/2,t.width-n-a*o.right][r.h],d=l.some(e=>e.fragments.some(({keyframes:e})=>e?.length))?[t.height-i-o.vertical,(t.height-i)/2,o.vertical][r.v]:ee(e,t);return{x:c+[0,n/2,n][r.h],y:d+[i,i/2,0][r.v]}}(e,t);return Object.assign(e,{x:i,y:o}),a.style.cssText+=`left:${i}px;top:${o}px;`,function(e,t){const{align:a,width:s,height:r,x:n,y:i,$div:o}=e,l=(e.org?e.org.x*t:n)+[0,s/2,s][a.h],c=(e.org?e.org.y*t:i)+[r,r/2,0][a.v];for(let e=o.childNodes.length-1;e>=0;e-=1){const t=o.childNodes[e];if(""===t.dataset.rotate){const e=l-n-t.offsetLeft,a=c-i-t.offsetTop;t.style.cssText+=`transform-origin:${e}px ${a}px;`}}}(e,t.scale),Object.assign(e,K(e,t)),e.effect&&Object.assign(e,{$div:te(e,t)}),e}function se(e){const{box:t}=e;for(;t.lastChild;)t.lastChild.remove();e.actives=[],e.space=[]}function re(e,t){const{dialogues:a,actives:s}=e,r=t-e.delay;for(let e=s.length-1;e>=0;e-=1){const t=s[e],{end:a}=t;a<r&&(t.$div.remove(),s.splice(e,1))}for(;e.index<a.length&&r>=a[e.index].start;){if(r<a[e.index].end){const t=ae(a[e.index],e);(t.animations||[]).forEach(e=>{e.currentTime=1e3*(r-t.start)}),s.push(t),e.video.paused||H(t,"play")}e.index+=1}}function ne(e){return function(){se(e);const{video:t,dialogues:a}=e,s=t.currentTime-e.delay;e.index=(()=>{for(let e=0;e<a.length;e+=1)if(s<a[e].end)return e;return(a.length||1)-1})(),re(e,t.currentTime)}}function ie(e){const t=e.requestVideoFrameCallback;return[t?e.requestVideoFrameCallback.bind(e):requestAnimationFrame,t?e.cancelVideoFrameCallback.bind(e):cancelAnimationFrame]}window.CSS.registerProperty&&(["real-fs","tag-fs","tag-fsp","border-width",...[...V,...q,...I].map(e=>`tag-${e}`)].forEach(e=>{window.CSS.registerProperty({name:`--ass-${e}`,syntax:"<number>",inherits:!0,initialValue:0})}),["border-opacity","shadow-opacity",...P.map(e=>`tag-${e}`)].forEach(e=>{window.CSS.registerProperty({name:`--ass-${e}`,syntax:"<number>",inherits:!0,initialValue:1})}),["fill-color","border-color","shadow-color"].forEach(e=>{window.CSS.registerProperty({name:`--ass-${e}`,syntax:"<color>",inherits:!0,initialValue:"transparent"})}));class oe{#e={video:null,box:document.createElement("div"),observer:null,clientContainer:null,scale:1,width:0,height:0,scriptRes:{},layoutRes:{},resampledRes:{},index:0,sbas:!0,styles:{},dialogues:[],actives:[],space:[],requestId:0,delay:0};#t;#a;#s;#r;constructor(e,t,{container:a=t.parentNode,resampling:s,clientContainer:r}={}){if(this.#e.video=t,this.#e.clientContainer=r,!a)throw new Error("Missing container.");const{info:n,width:i,height:o,styles:l,dialogues:c}=A(e);this.#e.sbas=/yes/i.test(n.ScaledBorderAndShadow),this.#e.layoutRes={width:1*n.LayoutResX||t.videoWidth||t.clientWidth,height:1*n.LayoutResY||t.videoHeight||t.clientHeight},this.#e.scriptRes={width:i||this.#e.layoutRes.width,height:o||this.#e.layoutRes.height},this.#e.styles=l,this.#e.dialogues=c.map(e=>Object.assign(e,{effect:["banner","scroll up","scroll down"].includes(e.effect?.name)?e.effect:null,align:{h:(e.alignment+2)%3,v:Math.trunc((e.alignment-1)/3)}})),R&&a.append(R);const{box:d}=this.#e;d.className="ASS-box",a.append(d),function(e){const t=e.getRootNode()||document,a=t===document?document.head:t;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;z-index:2;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)}@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"]{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));position:relative}.ASS-dialogue [data-border-style="3"]:before,.ASS-dialogue [data-border-style="3"]:after{content:"";z-index:-1;width:100%;height:100%;position:absolute}.ASS-dialogue [data-border-style="3"]:before{background-color:var(--ass-shadow-color);left:calc(var(--ass-scale-stroke)*var(--ass-tag-xshad)*1px);top:calc(var(--ass-scale-stroke)*var(--ass-tag-yshad)*1px)}.ASS-dialogue [data-border-style="3"]:after{background-color:var(--ass-border-color);top:0;left:0}@container style(--ass-tag-xbord:0) and style(--ass-tag-ybord:0){.ASS-dialogue [data-border-style="3"]:after{background-color:#0000}}@container style(--ass-tag-xshad:0) and style(--ass-tag-yshad:0){.ASS-dialogue [data-border-style="3"]:before{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.#t=function(e){const{video:t}=e,[a,s]=ie(t);return function(){const r=(s,n)=>{re(e,n?.mediaTime||t.currentTime),e.requestId=a(r)};s(e.requestId),e.requestId=a(r),e.actives.forEach(e=>{H(e,"play")})}}(this.#e),this.#a=function(e){const[,t]=ie(e.video);return function(){t(e.requestId),e.requestId=0,e.actives.forEach(e=>{H(e,"pause")})}}(this.#e),this.#s=ne(this.#e),t.addEventListener("play",this.#t),t.addEventListener("pause",this.#a),t.addEventListener("playing",this.#t),t.addEventListener("waiting",this.#a),t.addEventListener("seeking",this.#s),this.#r=function(e,t){const{video:a,box:s,layoutRes:r,clientContainer:n}=t;return function(){const i=a.clientWidth,o=a.clientHeight,l=a.videoWidth||i,c=a.videoHeight||o,d=r.width||l,f=r.height||c,p=t.scriptRes.width,u=t.scriptRes.height;let h=p,g=u;const y=Math.min(i/d,o/f);if("container"===e.resampling){const e=n.clientWidth||i,a=n.clientHeight||o,r=Math.min(e/p,a/u);return h=p*r,g=u*r,t.scale=r,t.width=h,t.height=g,t.resampledRes={width:h,height:g},s.style.cssText=`width:${h}px;height:${g}px;top:${(a-g)/2}px;left:${(e-h)/2}px;`,s.style.setProperty("--ass-scale",t.scale),s.style.setProperty("--ass-scale-stroke",t.sbas?t.scale:1),s.style.transform="scale(1)",void ne(t)()}"video_width"===e.resampling&&(g=p/d*f),"video_height"===e.resampling&&(h=u/f*d),t.scale=Math.min(i/h,o/g),"script_width"===e.resampling&&(t.scale=y*(d/h)),"script_height"===e.resampling&&(t.scale=y*(f/g));const m=t.scale*h,x=t.scale*g;t.width=m,t.height=x,t.resampledRes={width:h,height:g},s.style.cssText=`width:${m}px;height:${x}px;top:${(o-x)/2}px;left:${(i-m)/2}px;`,s.style.setProperty("--ass-scale",t.scale),s.style.setProperty("--ass-scale-stroke",t.sbas?t.scale:1);const v=l/d/(c/f);v>1&&(s.style.transform=`scaleX(${v})`),v<1&&(s.style.transform=`scaleY(${1/v})`),ne(t)()}}(this,this.#e),this.#r(),this.resampling=s;const f=new ResizeObserver(this.#r);return f.observe(t),r&&f.observe(r),this.#e.observer=f,this}destroy(){const{video:e,box:t,observer:a,clientContainer:s}=this.#e;return this.#a(),se(this.#e),e.removeEventListener("play",this.#t),e.removeEventListener("pause",this.#a),e.removeEventListener("playing",this.#t),e.removeEventListener("waiting",this.#a),e.removeEventListener("seeking",this.#s),R&&R.remove(),t.remove(),a.unobserve(this.#e.video),s&&a.unobserve(s),this.#e.styles={},this.#e.dialogues=[],this}show(){return this.#e.box.style.visibility="visible",this}hide(){return this.#e.box.style.visibility="hidden",this}#n="video_height";get resampling(){return this.#n}set resampling(e){e!==this.#n&&(/^(video|script)_(width|height)$/.test(e)||"container"===e)&&(this.#n=e,this.#r())}get delay(){return this.#e.delay}set delay(e){"number"==typeof e&&(this.#e.delay=e,this.#s())}}export{oe as default};