ass-compiler
Version:
Parses and compiles ASS subtitle format to easy-to-use data structure.
263 lines (240 loc) • 5.34 kB
TypeScript
import { ParsedTag, CompiledTag } from './tags';
interface ScriptInfo {
Title: string;
ScriptType: 'V4.00' | 'V4.00+' | string;
WrapStyle: '0' | '1' | '2' | '3';
PlayResX: string;
PlayResY: string;
ScaledBorderAndShadow: 'yes' | 'no';
Collisions: 'Normal' | 'Reverse';
[name: string]: string;
}
interface ParsedASSStyles {
format: string[];
style: {
Name: string;
Fontname: string;
Fontsize: string;
PrimaryColour: string;
SecondaryColour: string;
OutlineColour: string;
BackColour: string;
Bold: string;
Italic: string;
Underline: string;
StrikeOut: string;
ScaleX: string;
ScaleY: string;
Spacing: string;
Angle: string;
BorderStyle: string;
Outline: string;
Shadow: string;
Alignment: string;
MarginL: string;
MarginR: string;
MarginV: string;
Encoding: string;
}[];
}
interface ParsedASSEventTextParsed {
tags: { [K in keyof ParsedTag]: ParsedTag[K]; }[];
text: string;
drawing: string[][];
}
interface EffectBanner {
name: 'banner';
delay: number;
leftToRight: number;
fadeAwayWidth: number;
}
interface EffectScroll {
name: 'scroll up' | 'scroll down';
y1: number;
y2: number;
delay: number;
fadeAwayHeight: number;
}
interface EffectUnknown {
name: string;
}
interface ParsedASSEventText {
raw: string;
combined: string;
parsed: ParsedASSEventTextParsed[];
}
interface ParsedASSEvent {
Layer: number;
Start: number;
End: number;
Style: string;
Name: string;
MarginL: number;
MarginR: number;
MarginV: number;
Effect?: EffectBanner | EffectScroll | EffectUnknown;
Text: ParsedASSEventText;
}
interface ParsedASSEvents {
format: string[];
comment: ParsedASSEvent[];
dialogue: ParsedASSEvent[];
}
export interface ParsedASS {
info: ScriptInfo;
styles: ParsedASSStyles;
events: ParsedASSEvents;
}
/**
* Parse ASS string.
* @param text
*/
export function parse(text: string): ParsedASS;
export function stringify(obj: ParsedASS): string;
export interface CompiledASSStyleTag {
fn: string;
fs: number;
c1: string;
a1: string;
c2: string;
a2: string;
c3: string;
a3: string;
c4: string;
a4: string;
b: 0 | 1;
i: 0 | 1;
u: 0 | 1;
s: 0 | 1;
fscx: number;
fscy: number;
fsp: number;
frz: number;
xbord: number;
ybord: number;
xshad: number;
yshad: number;
fe: number;
// TODO: [breaking change] delete `q`
q: 0 | 1 | 2 | 3;
}
export interface CompiledASSStyle {
style: {
Name: string;
Fontname: string;
Fontsize: number;
PrimaryColour: string;
SecondaryColour: string;
OutlineColour: string;
BackColour: string;
Bold: -1 | 0;
Italic: -1 | 0;
Underline: -1 | 0;
StrikeOut: -1 | 0;
ScaleX: number;
ScaleY: number;
Spacing: number;
Angle: number;
BorderStyle: 1 | 3;
Outline: number;
Shadow: number;
Alignment: number;
MarginL: number;
MarginR: number;
MarginV: number;
Encoding: number;
}
tag: CompiledASSStyleTag;
}
export interface DialogueDrawingInstruction {
type: 'M' | 'L' | 'C';
points: {
x: number;
y: number;
}[];
}
export interface DialogueDrawing {
instructions: DialogueDrawingInstruction[];
d: string;
minX: number;
minY: number;
width: number;
height: number;
}
export interface DialogueFragment {
tag: CompiledTag;
text: string;
drawing?: DialogueDrawing;
}
export interface DialogueSlice {
style: string;
fragments: DialogueFragment[];
}
export interface Dialogue {
layer: number;
start: number;
end: number;
style: string;
name: string;
margin: {
left: number;
right: number;
vertical: number;
}
effect?: EffectBanner | EffectScroll | EffectUnknown;
alignment: number;
q: 0 | 1 | 2 | 3;
slices: DialogueSlice[];
pos?: {
x: number;
y: number;
};
org?: {
x: number;
y: number;
};
move?: {
x1: number;
y1: number;
x2: number;
y2: number;
t1: number;
t2: number;
};
fade?: {
type: 'fad';
t1: number;
t2: number;
} | {
type: 'fade';
a1: number;
a2: number;
a3: number;
t1: number;
t2: number;
t3: number;
t4: number;
};
clip?: {
inverse: boolean;
scale: number;
drawing?: DialogueDrawing;
dots?: {
x1: number;
y1: number;
x2: number;
y2: number;
}
}
}
export interface CompiledASS {
info: ScriptInfo;
width: number;
height: number;
collisions: 'Normal' | 'Reverse';
wrapStyle: 0 | 1 | 2 | 3;
styles: { [styleName: string]: CompiledASSStyle };
dialogues: Dialogue[];
}
export function compile(text: string, options: object): CompiledASS;
export function decompile(obj: CompiledASS): string;