UNPKG

assjs

Version:

A lightweight JavaScript ASS subtitle renderer

2 lines (1 loc) 34.1 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(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 i,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=void 0,3600*(i=d.split(":"))[0]+60*i[1]+1*i[2]);break;case"Effect":o[c]=t(d);break;case"Text":o[c]=n(d);break;default:o[c]=d}}return o}var o=["Name","Fontname","Fontsize","PrimaryColour","SecondaryColour","OutlineColour","BackColour","Bold","Italic","Underline","StrikeOut","ScaleX","ScaleY","Spacing","Angle","BorderStyle","Outline","Shadow","Alignment","MarginL","MarginR","MarginV","Encoding"],l=["Layer","Start","End","Style","Name","MarginL","MarginR","MarginV","Effect","Text"];function c(t){var e=o.concat(l);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 d(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 f(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 p(t){return!(!t.points.length||!t.type)&&!(/C|S/.test(t.type)&&t.points.length<3)}function u(t){return t.map((function(t){return t.type+t.points.map((function(t){return t.x+","+t.y})).join(",")})).join("")}function h(t){for(var e,a=[],s=0;s<t.length;){var r=t[s],n=f(r);if(p(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:u(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 g=["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 y(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,m=i.scale,v=i.drawing,x=i.dots;return v?{clip:{inverse:u,scale:m,drawing:h(v),dots:x}}:x?{clip:{inverse:u,scale:m,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];~g.indexOf(e)&&("clip"!==e||t[e].dots)&&Object.assign(k,y(t,e,a))})),{t:{t1:b,t2:$,accel:w,tag:k}}}return(n={})[e]=i,n}var m=[null,1,2,3,null,7,8,9,null,4,5,6],v=["r","a","an","pos","org","move","fade","fad","clip"];function x(t){for(var e,a,s,r,n,i,o,l=t.styles,c=t.style,d=t.parsed,f=t.start,p=t.end,u={q:l[c].tag.q},g=[],x={style:c,fragments:[]},b={},w=0;w<d.length;w++){for(var S=d[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?(o=b,JSON.parse(JSON.stringify(Object.assign({},o,{k:void 0,kf:void 0,ko:void 0,kt:void 0})))):{},text:k,drawing:A.length?h(A):null},j=0;j<$.length;j++){var L=$[j];e=e||m[L.a||0]||L.an,u=y(L,"q")||u,r||(a=a||y(L,"pos")),s=s||y(L,"org"),a||(r=r||y(L,"move")),n=n||y(L,"fade")||y(L,"fad"),i=y(L,"clip")||i;var N=Object.keys(L)[0];if(N&&!~v.indexOf(N)){var R=l[c].tag,F=y(L,N,{start:f,end:p,c1:R.c1,c2:R.c2,c3:R.c3,c4:R.c4,fs:b.fs||R.fs});"t"===N?(O.tag.t=O.tag.t||[],O.tag.t.push(F.t)):Object.assign(O.tag,F)}}if(b=O.tag,void 0!==M&&(g.push(x),x={style:l[M]?M:c,fragments:[]}),O.text||O.drawing){var B=x.fragments[x.fragments.length-1]||{};B.text&&O.text&&!Object.keys(O.tag).length?B.text+=O.text:x.fragments.push(O)}}return g.push(x),Object.assign({alignment:e,slices:g},u,a,s,r,n,i)}function b(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=x({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 w={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 S(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 $(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 o=n.match(/(.*?)\s*:\s*(.*)/),l=o[1],f=o[2];e.info[l]=f}if(2===s&&(/^Format\s*:/i.test(n)&&(e.styles.format=c(n)),/^Style\s*:/i.test(n)&&e.styles.style.push(d(n,e.styles.format))),3===s&&(/^Format\s*:/i.test(n)&&(e.events.format=c(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(i(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({},w,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=S(a.PrimaryColour),i=s[0],o=s[1],l=S(a.SecondaryColour),c=l[0],d=l[1],f=S(a.OutlineColour),p=f[0],u=f[1],h=S(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:b({styles:r,dialogues:a.events.dialogue})}}const k="fontBoundingBoxAscent"in TextMetrics.prototype,A=navigator.userAgent.toLowerCase().includes("firefox"),M=!k&&A?512:2048,E=Object.create(null),C=document.createElement("canvas").getContext("2d"),O=document.createElement("div");O.className="ASS-fix-font-size",O.style.fontSize=`${M}px`;const j=document.createElement("span");j.textContent="0",O.append(j);const L=k?null:O;function N(t,e){if(!E[t])if(k){C.font=`${M}px "${t}"`;const e=C.measureText("");E[t]=e.fontBoundingBoxAscent+e.fontBoundingBoxDescent}else j.style.fontFamily=`"${t}"`,E[t]=j.clientHeight;return e*M/E[t]}function R(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 F(){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 B(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 z(t,e,a){const s=t.animate(e,a);return s.pause(),s}function T(t,e){(t.animations||[]).forEach((t=>{t[e]()}))}const _=["frx","fry","frz"],H=["fscx","fscy"],q=["fax","fay"];const I=["blur","xbord","ybord","xshad","yshad"];function P(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 V(t){return`calc(var(--ass-scale) * ${t}px)`}function D(t,e){const{x1:a,y1:s,x2:r,y2:n,t1:i,t2:o}=t,l=`translate(${V(a)}, ${V(s)})`,c=`translate(${V(r)}, ${V(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 W(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 X(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",R((e.a1||t.a1)+(e.c1||t.c1))]]:"a3"===a||"c3"===a?[["border-color",R((e.a3||t.a3)+(e.c3||t.c3))]]:"a4"===a||"c4"===a?[["shadow-color",R((e.a4||t.a4)+(e.c4||t.c4))]]:"fs"===a?[["real-fs",N(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 z(t,[i],{duration:o,delay:e,fill:"forwards",easing:U(o,r)})}))}function Y(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 G(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?Y(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:Y(n.clip,a.scriptRes.width,a.scriptRes.height)},o=Math.max(0,s-e);return z(t,[i],{duration:o,delay:e,fill:"forwards",easing:U(o,r)})}))}(i,t,e)),{$div:i}}function J(t,e){const a=`ASS-${F()}`,s=t.xbord||t.ybord,r=t.xshad||t.yshad,n="ff"!==(t.a1||"00").toLowerCase(),i=(t.blur||t.be||0)*e,o=B("filter",[["id",a]]);o.append(B("feGaussianBlur",[["stdDeviation",s?0:i],["in","SourceGraphic"],["result","sg_b"]])),o.append(B("feFlood",[["flood-color","var(--ass-fill-color)"],["result","c1"]])),o.append(B("feComposite",[["operator","in"],["in","c1"],["in2","sg_b"],["result","main"]])),s&&(o.append(B("feMorphology",[["radius",`${t.xbord*e} ${t.ybord*e}`],["operator","dilate"],["in","SourceGraphic"],["result","dil"]])),o.append(B("feGaussianBlur",[["stdDeviation",i],["in","dil"],["result","dil_b"]])),o.append(B("feComposite",[["operator","out"],["in","dil_b"],["in2","SourceGraphic"],["result","dil_b_o"]])),o.append(B("feFlood",[["flood-color","var(--ass-border-color)"],["result","c3"]])),o.append(B("feComposite",[["operator","in"],["in","c3"],["in2","dil_b_o"],["result","border"]]))),r&&(s||n)&&(o.append(B("feOffset",[["dx",t.xshad*e],["dy",t.yshad*e],["in",s?n?"dil":"dil_b_o":"SourceGraphic"],["result","off"]])),o.append(B("feGaussianBlur",[["stdDeviation",i],["in","off"],["result","off_b"]])),n||(o.append(B("feOffset",[["dx",t.xshad*e],["dy",t.yshad*e],["in","SourceGraphic"],["result","sg_off"]])),o.append(B("feComposite",[["operator","out"],["in","off_b"],["in2","sg_off"],["result","off_b_o"]]))),o.append(B("feFlood",[["flood-color","var(--ass-shadow-color)"],["result","c4"]])),o.append(B("feComposite",[["operator","in"],["in","c4"],["in2",n?"off_b":"off_b_o"],["result","shadow"]])));const l=B("feMerge",[]);return r&&(s||n)&&l.append(B("feMergeNode",[["in","shadow"]])),s&&l.append(B("feMergeNode",[["in","border"]])),l.append(B("feMergeNode",[["in","main"]])),o.append(l),{id:a,el:o}}function K(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",R(`${t.a3}${t.c3}`)],["shadow-color",R(`${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=J(c,e.sbas?e.scale:1),a=B("svg",[["width",0],["height",0]]);a.append(t.el),p={id:t.id,el:a}}if(f.push(...function(t){return[["real-fs",N(t.fn,t.fs)],["tag-fs",t.fs],["tag-fsp",t.fsp],["fill-color",R(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].map((e=>[`--ass-tag-${e}`,`${t[e]||0}`])),...H.map((e=>[`--ass-tag-${e}`,t.p?1:(t[e]||100)/100]))]}(c));const h=[c,...(c.t||[]).map((t=>t.tag))],g=_.some((t=>h.some((e=>e[t])))),y=H.some((t=>h.some((e=>void 0!==e[t]&&100!==e[t])))),m=q.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=B("svg",[["width",h],["height",g],["viewBox",`${-p} ${-u} ${h} ${g}`]]),m=a.sbas?a.scale:1,v=B("defs"),x=J(s,m);v.append(x.el),y.append(v);const b=`ASS-${F()}`,w=B("symbol",[["id",b],["viewBox",`${r} ${n} ${i} ${o}`]]);return w.append(B("path",[["d",t.drawing.d]])),y.append(w),y.append(B("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,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(...X(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?P(r,o):null,n?D(n,o):null,...i?W(i,o):[]].filter(Boolean).map((([e,a])=>z(t,e,a)))}(s,t)),s.append(r),{$div:s,animations:o}}function Z(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 Q(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 tt(t,e){const{$div:a,animations:s}=K(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]:Z(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,G(t,e)),t.effect&&Object.assign(t,{$div:Q(t,e)}),t}function et(t){const{box:e}=t;for(;e.lastChild;)e.lastChild.remove();t.actives=[],t.space=[]}function at(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=tt(a[t.index],t);(e.animations||[]).forEach((t=>{t.currentTime=1e3*(r-e.start)})),s.push(e),t.video.paused||T(e,"play")}t.index+=1}}function st(t){return function(){et(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})(),at(t,e.currentTime)}}function rt(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",...[...I,..._,...q].map((t=>`tag-${t}`))].forEach((t=>{window.CSS.registerProperty({name:`--ass-${t}`,syntax:"<number>",inherits:!0,initialValue:0})})),["border-opacity","shadow-opacity",...H.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 nt{#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}=$(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)}}))),L&&a.append(L);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"]{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.#e=function(t){const{video:e}=t,[a,s]=rt(e);return function(){const r=(s,n)=>{at(t,n?.mediaTime||e.currentTime),t.requestId=a(r)};s(t.requestId),t.requestId=a(r),t.actives.forEach((t=>{T(t,"play")}))}}(this.#t),this.#a=function(t){const[,e]=rt(t.video);return function(){e(t.requestId),t.requestId=0,t.actives.forEach((t=>{T(t,"pause")}))}}(this.#t),this.#s=st(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=r.width||a.videoWidth||n,l=r.height||a.videoHeight||i,c=e.scriptRes.width,d=e.scriptRes.height;let f=c,p=d;const u=Math.min(n/o,i/l);"video_width"===t.resampling&&(p=c/o*l),"video_height"===t.resampling&&(f=d/l*o),e.scale=Math.min(n/f,i/p),"script_width"===t.resampling&&(e.scale=u*(o/f)),"script_height"===t.resampling&&(e.scale=u*(l/p));const h=e.scale*f,g=e.scale*p;e.width=h,e.height=g,e.resampledRes={width:f,height:p},s.style.cssText=`width:${h}px;height:${g}px;top:${(i-g)/2}px;left:${(n-h)/2}px;`,s.style.setProperty("--ass-scale",e.scale),s.style.setProperty("--ass-scale-stroke",e.sbas?e.scale:1),st(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(),et(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),L&&L.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{nt as default};