ass-compiler
Advanced tools
Comparing version 0.0.5 to 0.0.6
@@ -80,3 +80,4 @@ (function (global, factory) { | ||
var assign; | ||
(assign = text.match(/^alpha&?H?(\w\w)/), tag.alpha = assign[1]); | ||
(assign = text.match(/^alpha&?H?([0-9a-f]+)/i), tag.alpha = assign[1]); | ||
tag.alpha = ("00" + (tag.alpha)).slice(-2); | ||
} else if (/^(?:pos|org|move|fad|fade)\(/.test(text)) { | ||
@@ -588,3 +589,2 @@ var ref$3 = text.match(/^(\w+)\((.*?)\)?$/); | ||
function createSlice(name, styles) { | ||
// TODO: if (styles[name] === undefined) {} | ||
return { | ||
@@ -686,2 +686,5 @@ name: name, | ||
} | ||
if (!styles[dia.Style]) { | ||
dia.Style = 'Default'; | ||
} | ||
var stl = styles[dia.Style].style; | ||
@@ -717,2 +720,30 @@ var timer = info.Timer / 100 || 1; | ||
// same as Aegisub | ||
// https://github.com/Aegisub/Aegisub/blob/master/src/ass_style.h | ||
var DEFAULT_STYLE = { | ||
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 parseStyleColor(color) { | ||
@@ -729,6 +760,9 @@ var ref = color.match(/&H(\w\w)?(\w{6})&?/); | ||
var format = ref.format; | ||
var defaultStyle = ref.defaultStyle; | ||
var result = {}; | ||
for (var i = 0; i < style.length; i++) { | ||
var stl = style[i]; | ||
var ds = assign({}, DEFAULT_STYLE, defaultStyle, { Name: 'Default' }); | ||
var styles = [format.map(function (fmt) { return ds[fmt]; })].concat(style); | ||
for (var i = 0; i < styles.length; i++) { | ||
var stl = styles[i]; | ||
var s = {}; | ||
@@ -738,2 +772,6 @@ for (var j = 0; j < format.length; j++) { | ||
s[fmt] = (fmt === 'Name' || fmt === 'Fontname' || /Colour/.test(fmt)) ? stl[j] : stl[j] * 1; | ||
// this behavior is same as Aegisub by black-box testing | ||
if (fmt === 'Name' && /^(\*+)Default$/.test(s[fmt])) { | ||
s[fmt] = 'Default'; | ||
} | ||
} | ||
@@ -782,3 +820,5 @@ var ref$1 = parseStyleColor(s.PrimaryColour); | ||
function compile(text) { | ||
function compile(text, options) { | ||
if ( options === void 0 ) options = {}; | ||
var tree = parse(text); | ||
@@ -789,2 +829,3 @@ var styles = compileStyles({ | ||
format: tree.styles.format, | ||
defaultStyle: options.defaultStyle || {}, | ||
}); | ||
@@ -791,0 +832,0 @@ return { |
@@ -1,1 +0,1 @@ | ||
(function(t,r){typeof exports==="object"&&typeof module!=="undefined"?r(exports):typeof define==="function"&&define.amd?define(["exports"],r):r(t.assCompiler={})})(this,function(t){"use strict";function r(t){var r=t.toLowerCase().trim().split(/\s*;\s*/);if(r[0]==="banner"){return{name:r[0],delay:r[1]*1||0,leftToRight:r[2]*1||0,fadeAwayWidth:r[3]*1||0}}if(/^scroll\s/.test(r[0])){return{name:r[0],y1:Math.min(r[1]*1,r[2]*1),y2:Math.max(r[1]*1,r[2]*1),delay:r[3]*1||0,fadeAwayHeight:r[4]*1||0}}return null}function a(t){return t.toLowerCase().replace(/([mnlbspc])/g," $1 ").trim().replace(/\s+/g," ").split(/\s(?=[mnlbspc])/).map(function(t){return t.split(" ")})}var e=["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"];var n=e.map(function(t){return{name:t,regex:new RegExp("^"+t+"-?\\d")}});function i(t){var r={};for(var e=0;e<n.length;e++){var s=n[e];var f=s.name;var l=s.regex;if(l.test(t)){r[f]=t.slice(f.length)*1;return r}}if(/^fn/.test(t)){r.fn=t.slice(2)}else if(/^r/.test(t)){r.r=t.slice(1)}else if(/^fs[\d+-]/.test(t)){r.fs=t.slice(2)}else if(/^\d?c&?H?[0-9a-f]+|^\d?c$/i.test(t)){var v=t.match(/^(\d?)c&?H?(\w*)/);var o=v[1];var c=v[2];r["c"+(o||1)]=c&&("000000"+c).slice(-6)}else if(/^\da&?H?[0-9a-f]+/i.test(t)){var u=t.match(/^(\d)a&?H?(\w\w)/);var p=u[1];var d=u[2];r["a"+p]=d}else if(/^alpha&?H?[0-9a-f]+/i.test(t)){var h;h=t.match(/^alpha&?H?(\w\w)/),r.alpha=h[1]}else if(/^(?:pos|org|move|fad|fade)\(/.test(t)){var g=t.match(/^(\w+)\((.*?)\)?$/);var y=g[1];var m=g[2];r[y]=m.trim().split(/\s*,\s*/).map(Number)}else if(/^i?clip/.test(t)){var x=t.match(/^i?clip\((.*?)\)?$/)[1].trim().split(/\s*,\s*/);r.clip={inverse:/iclip/.test(t),scale:1,drawing:null,dots:null};if(x.length===1){r.clip.drawing=a(x[0])}if(x.length===2){r.clip.scale=x[0]*1;r.clip.drawing=a(x[1])}if(x.length===4){r.clip.dots=x.map(Number)}}else if(/^t\(/.test(t)){var b=t.match(/^t\((.*?)\)?$/)[1].trim().replace(/\\.*/,function(t){return t.replace(/,/g,"\n")}).split(/\s*,\s*/);if(!b[0]){return r}r.t={t1:0,t2:0,accel:1,tags:b[b.length-1].replace(/\n/g,",").split("\\").slice(1).map(i)};if(b.length===2){r.t.accel=b[0]*1}if(b.length===3){r.t.t1=b[0]*1;r.t.t2=b[1]*1}if(b.length===4){r.t.t1=b[0]*1;r.t.t2=b[1]*1;r.t.accel=b[2]*1}}return r}function s(t){var r=[];var a=0;var e="";for(var n=0;n<t.length;n++){var s=t[n];if(s==="("){a++}if(s===")"){a--}if(a<0){a=0}if(!a&&s==="\\"){if(e){r.push(e)}e=""}else{e+=s}}r.push(e);return r.map(i)}function f(t){var r=t.split(/{([^{}]*?)}/);var e=[];if(r[0].length){e.push({tags:[],text:r[0],drawing:[]})}for(var n=1;n<r.length;n+=2){var i=s(r[n]);var f=i.reduce(function(t,r){return r.p===undefined?t:!!r.p},false);e.push({tags:i,text:f?"":r[n+1],drawing:f?a(r[n+1]):[]})}return{raw:t,combined:e.map(function(t){return t.text}).join(""),parsed:e}}function l(t){var r=t.split(":");return r[0]*3600+r[1]*60+r[2]*1}function v(t,a){var e=t.split(",");if(e.length>a.length){var n=e.slice(a.length-1).join();e=e.slice(0,a.length-1);e.push(n)}var i={};for(var s=0;s<e.length;s++){var v=a[s];var o=e[s].trim();switch(v){case"Layer":case"MarginL":case"MarginR":case"MarginV":i[v]=o*1;break;case"Start":case"End":i[v]=l(o);break;case"Effect":i[v]=r(o);break;case"Text":i[v]=f(o);break;default:i[v]=o}}return i}function o(t){return t.match(/Format\s*:\s*(.*)/i)[1].split(/\s*,\s*/)}function c(t){return t.match(/Style\s*:\s*(.*)/i)[1].split(/\s*,\s*/)}function u(t){var r={info:{},styles:{format:[],style:[]},events:{format:[],comment:[],dialogue:[]}};var a=t.split(/\r?\n/);var e=0;for(var n=0;n<a.length;n++){var i=a[n].trim();if(/^;/.test(i)){continue}if(/^\[Script Info\]/i.test(i)){e=1}else if(/^\[V4\+? Styles\]/i.test(i)){e=2}else if(/^\[Events\]/i.test(i)){e=3}else if(/^\[.*\]/.test(i)){e=0}if(e===0){continue}if(e===1){if(/:/.test(i)){var s=i.match(/(.*?)\s*:\s*(.*)/);var f=s[1];var l=s[2];r.info[f]=l}}if(e===2){if(/^Format\s*:/i.test(i)){r.styles.format=o(i)}if(/^Style\s*:/i.test(i)){r.styles.style.push(c(i))}}if(e===3){if(/^Format\s*:/i.test(i)){r.events.format=o(i)}if(/^(?:Comment|Dialogue)\s*:/i.test(i)){var u=i.match(/^(\w+?)\s*:\s*(.*)/i);var p=u[1];var d=u[2];r.events[p.toLowerCase()].push(v(d,r.events.format))}}}return r}var p=Object.assign||function t(r){var a=[],e=arguments.length-1;while(e-- >0)a[e]=arguments[e+1];for(var n=0;n<a.length;n++){if(!a[n]){continue}var i=Object.keys(a[n]);for(var s=0;s<i.length;s++){r[i[s]]=a[n][i[s]]}}return r};function d(t){var r={type:null,prev:null,next:null,points:[]};if(/[mnlbs]/.test(t[0])){r.type=t[0].toUpperCase().replace("N","L").replace("B","C")}for(var a=t.length-!(t.length&1),e=1;e<a;e+=2){r.points.push({x:t[e]*1,y:t[e+1]*1})}return r}function h(t){if(!t.points.length||!t.type){return false}if(/C|S/.test(t.type)&&t.points.length<3){return false}return true}function g(t){var r=Infinity;var a=Infinity;var e=-Infinity;var n=-Infinity;(i=[]).concat.apply(i,t.map(function(t){var r=t.points;return r})).forEach(function(t){var i=t.x;var s=t.y;r=Math.min(r,i);a=Math.min(a,s);e=Math.max(e,i);n=Math.max(n,s)});return{minX:r,minY:a,width:e-r,height:n-a};var i}function y(t,r,a){var e=[];var n=[0,2/3,1/3,0];var i=[0,1/3,2/3,0];var s=[0,1/6,2/3,1/6];var f=function(t,r){return t[0]*r[0]+t[1]*r[1]+t[2]*r[2]+t[3]*r[3]};var l=[t[t.length-1].x,t[0].x,t[1].x,t[2].x];var v=[t[t.length-1].y,t[0].y,t[1].y,t[2].y];e.push({type:r==="M"?"M":"L",points:[{x:f(s,l),y:f(s,v)}]});for(var o=3;o<t.length;o++){l=[t[o-3].x,t[o-2].x,t[o-1].x,t[o].x];v=[t[o-3].y,t[o-2].y,t[o-1].y,t[o].y];e.push({type:"C",points:[{x:f(n,l),y:f(n,v)},{x:f(i,l),y:f(i,v)},{x:f(s,l),y:f(s,v)}]})}if(a==="L"||a==="C"){var c=t[t.length-1];e.push({type:"L",points:[{x:c.x,y:c.y}]})}return e}function m(t){return t.map(function(t){var r=t.type;var a=t.points;return r+a.map(function(t){var r=t.x;var a=t.y;return r+","+a}).join(",")}).join("")}function x(t){var r=[];var a=0;while(a<t.length){var e=t[a];var n=d(e);if(n.type){if(n.type==="S"){var i=r[a-1].points.slice(-1)[0];var s=i.x;var f=i.y;n.points.unshift({x:s,y:f})}if(h(n)){if(a){n.prev=r[a-1].type;r[a-1].next=n.type}r.push(n)}a++}else{if(r[a-1].type==="S"){var l={p:n.points,c:r[a-1].points.slice(0,3)};r[a-1].points=r[a-1].points.concat((l[e[0]]||[]).map(function(t){var r=t.x;var a=t.y;return{x:r,y:a}}))}t.splice(a,1)}}var v=(o=[]).concat.apply(o,r.map(function(t){var r=t.type;var a=t.points;var e=t.prev;var n=t.next;return r==="S"?y(a,e,n):{type:r,points:a}}));return p({instructions:v,d:m(v)},g(r));var o}var b=["fs","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 w(t,r,a){var e,n,i;if(a===void 0)a={};var s=t[r];if(s===undefined){return null}if(r==="pos"||r==="org"){return s.length===2?(e={},e[r]={x:s[0],y:s[1]},e):null}if(r==="move"){var f=s[0];var l=s[1];var v=s[2];var o=s[3];var c=s[4];if(c===void 0)c=0;var u=s[5];if(u===void 0)u=0;return s.length===4||s.length===6?{move:{x1:f,y1:l,x2:v,y2:o,t1:c,t2:u}}:null}if(r==="fad"||r==="fade"){if(s.length===2){var d=s[0];var h=s[1];return{fade:{type:"fad",t1:d,t2:h}}}if(s.length===7){var g=s[0];var y=s[1];var m=s[2];var S=s[3];var M=s[4];var C=s[5];var k=s[6];return{fade:{type:"fade",a1:g,a2:y,a3:m,t1:S,t2:M,t3:C,t4:k}}}return null}if(r==="clip"){var O=s.inverse;var L=s.scale;var j=s.drawing;var E=s.dots;if(j){return{clip:{inverse:O,scale:L,drawing:x(j),dots:E}}}if(E){var H=E[0];var N=E[1];var $=E[2];var I=E[3];return{clip:{inverse:O,scale:L,drawing:j,dots:{x1:H,y1:N,x2:$,y2:I}}}}return null}if(/^[xy]?(bord|shad)$/.test(r)){s=Math.max(s,0)}if(r==="bord"){return{xbord:s,ybord:s}}if(r==="shad"){return{xshad:s,yshad:s}}if(/^c\d$/.test(r)){return n={},n[r]=s||a[r],n}if(r==="alpha"){return{a1:s,a2:s,a3:s,a4:s}}if(r==="fr"){return{frz:s}}if(r==="fs"){return{fs:/^\+|-/.test(s)?(s*1>-10?1+s/10:1)*a.fs:s*1}}if(r==="t"){var R=s.t1;var F=s.accel;var z=s.tags;var A=s.t2||(a.end-a.start)*1e3;var B={};z.forEach(function(t){var r=Object.keys(t)[0];if(~b.indexOf(r)&&!(r==="clip"&&!t[r].dots)){p(B,w(t,r,a))}});return{t:{t1:R,t2:A,accel:F,tag:B}}}return i={},i[r]=s,i}var S=[null,1,2,3,null,7,8,9,null,4,5,6];var M=["r","a","an","pos","org","move","fade","fad","clip"];function C(t,r){return{name:t,borderStyle:r[t].style.BorderStyle,tag:r[t].tag,fragments:[]}}function k(t){var r=t.styles;var a=t.name;var e=t.parsed;var n=t.start;var i=t.end;var s;var f;var l;var v;var o;var c;var u=[];var d=C(a,r);var h={};for(var g=0;g<e.length;g++){var y=e[g];var m=y.tags;var b=y.text;var k=y.drawing;var O=void 0;for(var L=0;L<m.length;L++){var j=m[L];O=j.r===undefined?O:j.r}var E={tag:O===undefined?JSON.parse(JSON.stringify(h)):{},text:b,drawing:k.length?x(k):null};for(var H=0;H<m.length;H++){var N=m[H];s=s||S[N.a||0]||N.an;f=f||w(N,"pos");l=l||w(N,"org");v=v||w(N,"move");o=o||w(N,"fade")||w(N,"fad");c=w(N,"clip")||c;var $=Object.keys(N)[0];if($&&!~M.indexOf($)){var I=d.tag;var R=I.c1;var F=I.c2;var z=I.c3;var A=I.c4;var B=h.fs||d.tag.fs;var P=w(N,$,{start:n,end:i,c1:R,c2:F,c3:z,c4:A,fs:B});if($==="t"){E.tag.t=E.tag.t||[];E.tag.t.push(P.t)}else{p(E.tag,P)}}}h=E.tag;if(O!==undefined){u.push(d);d=C(O||a,r)}if(E.text||E.drawing){var T=d.fragments[d.fragments.length-1]||{};if(T.text&&E.text&&!Object.keys(E.tag).length){T.text+=E.text}else{d.fragments.push(E)}}}u.push(d);return p({alignment:s,slices:u},f,l,v,o,c)}function O(t){var r=t.info;var a=t.styles;var e=t.dialogues;var n=Infinity;var i=[];for(var s=0;s<e.length;s++){var f=e[s];if(f.Start>=f.End){continue}var l=a[f.Style].style;var v=r.Timer/100||1;var o=k({styles:a,name:f.Style,parsed:f.Text.parsed,start:f.Start,end:f.End});var c=o.alignment||l.Alignment;n=Math.min(n,f.Layer);i.push(p({layer:f.Layer,start:f.Start/v,end:f.End/v,margin:{left:f.MarginL||l.MarginL,right:f.MarginR||l.MarginR,vertical:f.MarginV||l.MarginV},effect:f.Effect},o,{alignment:c}))}for(var u=0;u<i.length;u++){i[u].layer-=n}return i.sort(function(t,r){return t.start-r.start||t.end-r.end})}function L(t){var r=t.match(/&H(\w\w)?(\w{6})&?/);var a=r[1];var e=r[2];return[a||"00",e]}function j(t){var r=t.info;var a=t.style;var e=t.format;var n={};for(var i=0;i<a.length;i++){var s=a[i];var f={};for(var l=0;l<e.length;l++){var v=e[l];f[v]=v==="Name"||v==="Fontname"||/Colour/.test(v)?s[l]:s[l]*1}var o=L(f.PrimaryColour);var c=o[0];var u=o[1];var p=L(f.SecondaryColour);var d=p[0];var h=p[1];var g=L(f.OutlineColour);var y=g[0];var m=g[1];var x=L(f.BackColour);var b=x[0];var w=x[1];var S={fn:f.Fontname,fs:f.Fontsize,c1:u,a1:c,c2:h,a2:d,c3:m,a3:y,c4:w,a4:b,b:Math.abs(f.Bold),i:Math.abs(f.Italic),u:Math.abs(f.Underline),s:Math.abs(f.StrikeOut),fscx:f.ScaleX,fscy:f.ScaleY,fsp:f.Spacing,frz:f.Angle,xbord:f.Outline,ybord:f.Outline,xshad:f.Shadow,yshad:f.Shadow,q:/^[0-3]$/.test(r.WrapStyle)?r.WrapStyle*1:2};n[f.Name]={style:f,tag:S}}return n}function E(t){var r=u(t);var a=j({info:r.info,style:r.styles.style,format:r.styles.format});return{info:r.info,width:r.info.PlayResX*1||null,height:r.info.PlayResY*1||null,collisions:r.info.Collisions||"Normal",styles:a,dialogues:O({info:r.info,styles:a,dialogues:r.events.dialogue})}}t.parse=u;t.compile=E;Object.defineProperty(t,"__esModule",{value:true})}); | ||
(function(t,r){typeof exports==="object"&&typeof module!=="undefined"?r(exports):typeof define==="function"&&define.amd?define(["exports"],r):r(t.assCompiler={})})(this,function(t){"use strict";function r(t){var r=t.toLowerCase().trim().split(/\s*;\s*/);if(r[0]==="banner"){return{name:r[0],delay:r[1]*1||0,leftToRight:r[2]*1||0,fadeAwayWidth:r[3]*1||0}}if(/^scroll\s/.test(r[0])){return{name:r[0],y1:Math.min(r[1]*1,r[2]*1),y2:Math.max(r[1]*1,r[2]*1),delay:r[3]*1||0,fadeAwayHeight:r[4]*1||0}}return null}function a(t){return t.toLowerCase().replace(/([mnlbspc])/g," $1 ").trim().replace(/\s+/g," ").split(/\s(?=[mnlbspc])/).map(function(t){return t.split(" ")})}var e=["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"];var n=e.map(function(t){return{name:t,regex:new RegExp("^"+t+"-?\\d")}});function i(t){var r={};for(var e=0;e<n.length;e++){var s=n[e];var l=s.name;var f=s.regex;if(f.test(t)){r[l]=t.slice(l.length)*1;return r}}if(/^fn/.test(t)){r.fn=t.slice(2)}else if(/^r/.test(t)){r.r=t.slice(1)}else if(/^fs[\d+-]/.test(t)){r.fs=t.slice(2)}else if(/^\d?c&?H?[0-9a-f]+|^\d?c$/i.test(t)){var v=t.match(/^(\d?)c&?H?(\w*)/);var o=v[1];var u=v[2];r["c"+(o||1)]=u&&("000000"+u).slice(-6)}else if(/^\da&?H?[0-9a-f]+/i.test(t)){var c=t.match(/^(\d)a&?H?(\w\w)/);var p=c[1];var d=c[2];r["a"+p]=d}else if(/^alpha&?H?[0-9a-f]+/i.test(t)){var g;g=t.match(/^alpha&?H?([0-9a-f]+)/i),r.alpha=g[1];r.alpha=("00"+r.alpha).slice(-2)}else if(/^(?:pos|org|move|fad|fade)\(/.test(t)){var y=t.match(/^(\w+)\((.*?)\)?$/);var h=y[1];var m=y[2];r[h]=m.trim().split(/\s*,\s*/).map(Number)}else if(/^i?clip/.test(t)){var x=t.match(/^i?clip\((.*?)\)?$/)[1].trim().split(/\s*,\s*/);r.clip={inverse:/iclip/.test(t),scale:1,drawing:null,dots:null};if(x.length===1){r.clip.drawing=a(x[0])}if(x.length===2){r.clip.scale=x[0]*1;r.clip.drawing=a(x[1])}if(x.length===4){r.clip.dots=x.map(Number)}}else if(/^t\(/.test(t)){var b=t.match(/^t\((.*?)\)?$/)[1].trim().replace(/\\.*/,function(t){return t.replace(/,/g,"\n")}).split(/\s*,\s*/);if(!b[0]){return r}r.t={t1:0,t2:0,accel:1,tags:b[b.length-1].replace(/\n/g,",").split("\\").slice(1).map(i)};if(b.length===2){r.t.accel=b[0]*1}if(b.length===3){r.t.t1=b[0]*1;r.t.t2=b[1]*1}if(b.length===4){r.t.t1=b[0]*1;r.t.t2=b[1]*1;r.t.accel=b[2]*1}}return r}function s(t){var r=[];var a=0;var e="";for(var n=0;n<t.length;n++){var s=t[n];if(s==="("){a++}if(s===")"){a--}if(a<0){a=0}if(!a&&s==="\\"){if(e){r.push(e)}e=""}else{e+=s}}r.push(e);return r.map(i)}function l(t){var r=t.split(/{([^{}]*?)}/);var e=[];if(r[0].length){e.push({tags:[],text:r[0],drawing:[]})}for(var n=1;n<r.length;n+=2){var i=s(r[n]);var l=i.reduce(function(t,r){return r.p===undefined?t:!!r.p},false);e.push({tags:i,text:l?"":r[n+1],drawing:l?a(r[n+1]):[]})}return{raw:t,combined:e.map(function(t){return t.text}).join(""),parsed:e}}function f(t){var r=t.split(":");return r[0]*3600+r[1]*60+r[2]*1}function v(t,a){var e=t.split(",");if(e.length>a.length){var n=e.slice(a.length-1).join();e=e.slice(0,a.length-1);e.push(n)}var i={};for(var s=0;s<e.length;s++){var v=a[s];var o=e[s].trim();switch(v){case"Layer":case"MarginL":case"MarginR":case"MarginV":i[v]=o*1;break;case"Start":case"End":i[v]=f(o);break;case"Effect":i[v]=r(o);break;case"Text":i[v]=l(o);break;default:i[v]=o}}return i}function o(t){return t.match(/Format\s*:\s*(.*)/i)[1].split(/\s*,\s*/)}function u(t){return t.match(/Style\s*:\s*(.*)/i)[1].split(/\s*,\s*/)}function c(t){var r={info:{},styles:{format:[],style:[]},events:{format:[],comment:[],dialogue:[]}};var a=t.split(/\r?\n/);var e=0;for(var n=0;n<a.length;n++){var i=a[n].trim();if(/^;/.test(i)){continue}if(/^\[Script Info\]/i.test(i)){e=1}else if(/^\[V4\+? Styles\]/i.test(i)){e=2}else if(/^\[Events\]/i.test(i)){e=3}else if(/^\[.*\]/.test(i)){e=0}if(e===0){continue}if(e===1){if(/:/.test(i)){var s=i.match(/(.*?)\s*:\s*(.*)/);var l=s[1];var f=s[2];r.info[l]=f}}if(e===2){if(/^Format\s*:/i.test(i)){r.styles.format=o(i)}if(/^Style\s*:/i.test(i)){r.styles.style.push(u(i))}}if(e===3){if(/^Format\s*:/i.test(i)){r.events.format=o(i)}if(/^(?:Comment|Dialogue)\s*:/i.test(i)){var c=i.match(/^(\w+?)\s*:\s*(.*)/i);var p=c[1];var d=c[2];r.events[p.toLowerCase()].push(v(d,r.events.format))}}}return r}var p=Object.assign||function t(r){var a=[],e=arguments.length-1;while(e-- >0)a[e]=arguments[e+1];for(var n=0;n<a.length;n++){if(!a[n]){continue}var i=Object.keys(a[n]);for(var s=0;s<i.length;s++){r[i[s]]=a[n][i[s]]}}return r};function d(t){var r={type:null,prev:null,next:null,points:[]};if(/[mnlbs]/.test(t[0])){r.type=t[0].toUpperCase().replace("N","L").replace("B","C")}for(var a=t.length-!(t.length&1),e=1;e<a;e+=2){r.points.push({x:t[e]*1,y:t[e+1]*1})}return r}function g(t){if(!t.points.length||!t.type){return false}if(/C|S/.test(t.type)&&t.points.length<3){return false}return true}function y(t){var r=Infinity;var a=Infinity;var e=-Infinity;var n=-Infinity;(i=[]).concat.apply(i,t.map(function(t){var r=t.points;return r})).forEach(function(t){var i=t.x;var s=t.y;r=Math.min(r,i);a=Math.min(a,s);e=Math.max(e,i);n=Math.max(n,s)});return{minX:r,minY:a,width:e-r,height:n-a};var i}function h(t,r,a){var e=[];var n=[0,2/3,1/3,0];var i=[0,1/3,2/3,0];var s=[0,1/6,2/3,1/6];var l=function(t,r){return t[0]*r[0]+t[1]*r[1]+t[2]*r[2]+t[3]*r[3]};var f=[t[t.length-1].x,t[0].x,t[1].x,t[2].x];var v=[t[t.length-1].y,t[0].y,t[1].y,t[2].y];e.push({type:r==="M"?"M":"L",points:[{x:l(s,f),y:l(s,v)}]});for(var o=3;o<t.length;o++){f=[t[o-3].x,t[o-2].x,t[o-1].x,t[o].x];v=[t[o-3].y,t[o-2].y,t[o-1].y,t[o].y];e.push({type:"C",points:[{x:l(n,f),y:l(n,v)},{x:l(i,f),y:l(i,v)},{x:l(s,f),y:l(s,v)}]})}if(a==="L"||a==="C"){var u=t[t.length-1];e.push({type:"L",points:[{x:u.x,y:u.y}]})}return e}function m(t){return t.map(function(t){var r=t.type;var a=t.points;return r+a.map(function(t){var r=t.x;var a=t.y;return r+","+a}).join(",")}).join("")}function x(t){var r=[];var a=0;while(a<t.length){var e=t[a];var n=d(e);if(n.type){if(n.type==="S"){var i=r[a-1].points.slice(-1)[0];var s=i.x;var l=i.y;n.points.unshift({x:s,y:l})}if(g(n)){if(a){n.prev=r[a-1].type;r[a-1].next=n.type}r.push(n)}a++}else{if(r[a-1].type==="S"){var f={p:n.points,c:r[a-1].points.slice(0,3)};r[a-1].points=r[a-1].points.concat((f[e[0]]||[]).map(function(t){var r=t.x;var a=t.y;return{x:r,y:a}}))}t.splice(a,1)}}var v=(o=[]).concat.apply(o,r.map(function(t){var r=t.type;var a=t.points;var e=t.prev;var n=t.next;return r==="S"?h(a,e,n):{type:r,points:a}}));return p({instructions:v,d:m(v)},y(r));var o}var b=["fs","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 S(t,r,a){var e,n,i;if(a===void 0)a={};var s=t[r];if(s===undefined){return null}if(r==="pos"||r==="org"){return s.length===2?(e={},e[r]={x:s[0],y:s[1]},e):null}if(r==="move"){var l=s[0];var f=s[1];var v=s[2];var o=s[3];var u=s[4];if(u===void 0)u=0;var c=s[5];if(c===void 0)c=0;return s.length===4||s.length===6?{move:{x1:l,y1:f,x2:v,y2:o,t1:u,t2:c}}:null}if(r==="fad"||r==="fade"){if(s.length===2){var d=s[0];var g=s[1];return{fade:{type:"fad",t1:d,t2:g}}}if(s.length===7){var y=s[0];var h=s[1];var m=s[2];var w=s[3];var M=s[4];var C=s[5];var O=s[6];return{fade:{type:"fade",a1:y,a2:h,a3:m,t1:w,t2:M,t3:C,t4:O}}}return null}if(r==="clip"){var k=s.inverse;var F=s.scale;var L=s.drawing;var H=s.dots;if(L){return{clip:{inverse:k,scale:F,drawing:x(L),dots:H}}}if(H){var j=H[0];var E=H[1];var N=H[2];var $=H[3];return{clip:{inverse:k,scale:F,drawing:L,dots:{x1:j,y1:E,x2:N,y2:$}}}}return null}if(/^[xy]?(bord|shad)$/.test(r)){s=Math.max(s,0)}if(r==="bord"){return{xbord:s,ybord:s}}if(r==="shad"){return{xshad:s,yshad:s}}if(/^c\d$/.test(r)){return n={},n[r]=s||a[r],n}if(r==="alpha"){return{a1:s,a2:s,a3:s,a4:s}}if(r==="fr"){return{frz:s}}if(r==="fs"){return{fs:/^\+|-/.test(s)?(s*1>-10?1+s/10:1)*a.fs:s*1}}if(r==="t"){var I=s.t1;var R=s.accel;var A=s.tags;var B=s.t2||(a.end-a.start)*1e3;var z={};A.forEach(function(t){var r=Object.keys(t)[0];if(~b.indexOf(r)&&!(r==="clip"&&!t[r].dots)){p(z,S(t,r,a))}});return{t:{t1:I,t2:B,accel:R,tag:z}}}return i={},i[r]=s,i}var w=[null,1,2,3,null,7,8,9,null,4,5,6];var M=["r","a","an","pos","org","move","fade","fad","clip"];function C(t,r){return{name:t,borderStyle:r[t].style.BorderStyle,tag:r[t].tag,fragments:[]}}function O(t){var r=t.styles;var a=t.name;var e=t.parsed;var n=t.start;var i=t.end;var s;var l;var f;var v;var o;var u;var c=[];var d=C(a,r);var g={};for(var y=0;y<e.length;y++){var h=e[y];var m=h.tags;var b=h.text;var O=h.drawing;var k=void 0;for(var F=0;F<m.length;F++){var L=m[F];k=L.r===undefined?k:L.r}var H={tag:k===undefined?JSON.parse(JSON.stringify(g)):{},text:b,drawing:O.length?x(O):null};for(var j=0;j<m.length;j++){var E=m[j];s=s||w[E.a||0]||E.an;l=l||S(E,"pos");f=f||S(E,"org");v=v||S(E,"move");o=o||S(E,"fade")||S(E,"fad");u=S(E,"clip")||u;var N=Object.keys(E)[0];if(N&&!~M.indexOf(N)){var $=d.tag;var I=$.c1;var R=$.c2;var A=$.c3;var B=$.c4;var z=g.fs||d.tag.fs;var D=S(E,N,{start:n,end:i,c1:I,c2:R,c3:A,c4:B,fs:z});if(N==="t"){H.tag.t=H.tag.t||[];H.tag.t.push(D.t)}else{p(H.tag,D)}}}g=H.tag;if(k!==undefined){c.push(d);d=C(k||a,r)}if(H.text||H.drawing){var P=d.fragments[d.fragments.length-1]||{};if(P.text&&H.text&&!Object.keys(H.tag).length){P.text+=H.text}else{d.fragments.push(H)}}}c.push(d);return p({alignment:s,slices:c},l,f,v,o,u)}function k(t){var r=t.info;var a=t.styles;var e=t.dialogues;var n=Infinity;var i=[];for(var s=0;s<e.length;s++){var l=e[s];if(l.Start>=l.End){continue}if(!a[l.Style]){l.Style="Default"}var f=a[l.Style].style;var v=r.Timer/100||1;var o=O({styles:a,name:l.Style,parsed:l.Text.parsed,start:l.Start,end:l.End});var u=o.alignment||f.Alignment;n=Math.min(n,l.Layer);i.push(p({layer:l.Layer,start:l.Start/v,end:l.End/v,margin:{left:l.MarginL||f.MarginL,right:l.MarginR||f.MarginR,vertical:l.MarginV||f.MarginV},effect:l.Effect},o,{alignment:u}))}for(var c=0;c<i.length;c++){i[c].layer-=n}return i.sort(function(t,r){return t.start-r.start||t.end-r.end})}var F={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 L(t){var r=t.match(/&H(\w\w)?(\w{6})&?/);var a=r[1];var e=r[2];return[a||"00",e]}function H(t){var r=t.info;var a=t.style;var e=t.format;var n=t.defaultStyle;var i={};var s=p({},F,n,{Name:"Default"});var l=[e.map(function(t){return s[t]})].concat(a);for(var f=0;f<l.length;f++){var v=l[f];var o={};for(var u=0;u<e.length;u++){var c=e[u];o[c]=c==="Name"||c==="Fontname"||/Colour/.test(c)?v[u]:v[u]*1;if(c==="Name"&&/^(\*+)Default$/.test(o[c])){o[c]="Default"}}var d=L(o.PrimaryColour);var g=d[0];var y=d[1];var h=L(o.SecondaryColour);var m=h[0];var x=h[1];var b=L(o.OutlineColour);var S=b[0];var w=b[1];var M=L(o.BackColour);var C=M[0];var O=M[1];var k={fn:o.Fontname,fs:o.Fontsize,c1:y,a1:g,c2:x,a2:m,c3:w,a3:S,c4:O,a4:C,b:Math.abs(o.Bold),i:Math.abs(o.Italic),u:Math.abs(o.Underline),s:Math.abs(o.StrikeOut),fscx:o.ScaleX,fscy:o.ScaleY,fsp:o.Spacing,frz:o.Angle,xbord:o.Outline,ybord:o.Outline,xshad:o.Shadow,yshad:o.Shadow,q:/^[0-3]$/.test(r.WrapStyle)?r.WrapStyle*1:2};i[o.Name]={style:o,tag:k}}return i}function j(t,r){if(r===void 0)r={};var a=c(t);var e=H({info:a.info,style:a.styles.style,format:a.styles.format,defaultStyle:r.defaultStyle||{}});return{info:a.info,width:a.info.PlayResX*1||null,height:a.info.PlayResY*1||null,collisions:a.info.Collisions||"Normal",styles:e,dialogues:k({info:a.info,styles:e,dialogues:a.events.dialogue})}}t.parse=c;t.compile=j;Object.defineProperty(t,"__esModule",{value:true})}); |
{ | ||
"name": "ass-compiler", | ||
"version": "0.0.5", | ||
"version": "0.0.6", | ||
"description": "Parses and compiles ASS subtitle format to easy-to-use data structure.", | ||
@@ -43,15 +43,15 @@ "main": "dist/ass-compiler.js", | ||
"chai": "^4.1.2", | ||
"cross-env": "^5.1.1", | ||
"eslint": "^4.13.1", | ||
"cross-env": "^5.1.3", | ||
"eslint": "^4.15.0", | ||
"eslint-config-airbnb-base": "^12.1.0", | ||
"eslint-plugin-import": "^2.8.0", | ||
"istanbul": "^0.4.5", | ||
"mocha": "^4.0.1", | ||
"mocha": "^4.1.0", | ||
"mocha-istanbul": "^0.3.0", | ||
"rollup": "^0.52.1", | ||
"rollup": "^0.54.0", | ||
"rollup-plugin-buble": "^0.18.0", | ||
"rollup-plugin-istanbul": "^2.0.0", | ||
"rollup-plugin-multi-entry": "^2.0.2", | ||
"uglify-js": "^3.2.2" | ||
"uglify-js": "^3.3.6" | ||
} | ||
} |
@@ -24,5 +24,39 @@ # ass-compiler | ||
parse(text); | ||
compile(text); | ||
compile(text, options); | ||
``` | ||
### options | ||
```js | ||
{ | ||
// A Style named `Default` will be automatic generated by options.defaultStyle | ||
// if it is not exists in `[V4+ Style]` section. | ||
defaultStyle: { | ||
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', | ||
}, | ||
} | ||
``` | ||
For details of data structure, please use the [online viewer](https://ass.js.org/ass-compiler/). |
@@ -12,2 +12,5 @@ import { compileText } from './text.js'; | ||
} | ||
if (!styles[dia.Style]) { | ||
dia.Style = 'Default'; | ||
} | ||
const stl = styles[dia.Style].style; | ||
@@ -14,0 +17,0 @@ const timer = info.Timer / 100 || 1; |
@@ -5,3 +5,3 @@ import { parse } from '../parser/index.js'; | ||
export function compile(text) { | ||
export function compile(text, options = {}) { | ||
const tree = parse(text); | ||
@@ -12,2 +12,3 @@ const styles = compileStyles({ | ||
format: tree.styles.format, | ||
defaultStyle: options.defaultStyle || {}, | ||
}); | ||
@@ -14,0 +15,0 @@ return { |
@@ -0,1 +1,31 @@ | ||
import { assign } from '../utils.js'; | ||
// same as Aegisub | ||
// https://github.com/Aegisub/Aegisub/blob/master/src/ass_style.h | ||
const DEFAULT_STYLE = { | ||
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 parseStyleColor(color) { | ||
@@ -6,6 +36,8 @@ const [, a, c] = color.match(/&H(\w\w)?(\w{6})&?/); | ||
export function compileStyles({ info, style, format }) { | ||
export function compileStyles({ info, style, format, defaultStyle }) { | ||
const result = {}; | ||
for (let i = 0; i < style.length; i++) { | ||
const stl = style[i]; | ||
const ds = assign({}, DEFAULT_STYLE, defaultStyle, { Name: 'Default' }); | ||
const styles = [format.map(fmt => ds[fmt])].concat(style); | ||
for (let i = 0; i < styles.length; i++) { | ||
const stl = styles[i]; | ||
const s = {}; | ||
@@ -15,2 +47,6 @@ for (let j = 0; j < format.length; j++) { | ||
s[fmt] = (fmt === 'Name' || fmt === 'Fontname' || /Colour/.test(fmt)) ? stl[j] : stl[j] * 1; | ||
// this behavior is same as Aegisub by black-box testing | ||
if (fmt === 'Name' && /^(\*+)Default$/.test(s[fmt])) { | ||
s[fmt] = 'Default'; | ||
} | ||
} | ||
@@ -17,0 +53,0 @@ const [a1, c1] = parseStyleColor(s.PrimaryColour); |
@@ -14,3 +14,2 @@ import { compileDrawing } from './drawing.js'; | ||
function createSlice(name, styles) { | ||
// TODO: if (styles[name] === undefined) {} | ||
return { | ||
@@ -17,0 +16,0 @@ name, |
@@ -35,3 +35,4 @@ import { parseDrawing } from './drawing.js'; | ||
} else if (/^alpha&?H?[0-9a-f]+/i.test(text)) { | ||
[, tag.alpha] = text.match(/^alpha&?H?(\w\w)/); | ||
[, tag.alpha] = text.match(/^alpha&?H?([0-9a-f]+)/i); | ||
tag.alpha = `00${tag.alpha}`.slice(-2); | ||
} else if (/^(?:pos|org|move|fad|fade)\(/.test(text)) { | ||
@@ -38,0 +39,0 @@ const [, key, value] = text.match(/^(\w+)\((.*?)\)?$/); |
59680
1505
62