@svta/common-media-library
Version:
A common library for media playback in JavaScript
122 lines • 4.74 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.parseCue = parseCue;
const WebVttParsingError_js_1 = require("../WebVttParsingError.js");
const parseOptions_js_1 = require("./parseOptions.js");
const parseTimestamp_js_1 = require("./parseTimestamp.js");
const Settings_js_1 = require("./Settings.js");
const BAD_TIMESTAMP = 'Malformed time stamp.';
function parseCue(input, cue, regionList) {
// Remember the original input if we need to throw an error.
const oInput = input;
// 4.1 WebVTT timestamp
function consumeTimeStamp() {
const ts = (0, parseTimestamp_js_1.parseTimeStamp)(input);
if (ts === null) {
throw new WebVttParsingError_js_1.WebVttParsingError(BAD_TIMESTAMP + oInput);
}
// Remove time stamp from input.
input = input.replace(/^[^\sa-zA-Z-]+/, '');
return ts;
}
// 4.4.2 WebVTT cue settings
function consumeCueSettings(input, cue) {
const settings = new Settings_js_1.Settings();
(0, parseOptions_js_1.parseOptions)(input, function (k, v) {
switch (k) {
case 'region': {
// Find the last region we parsed with the same region id.
for (let i = regionList.length - 1; i >= 0; i--) {
if (regionList[i].id === v) {
settings.set(k, regionList[i]);
break;
}
}
break;
}
case 'vertical': {
settings.alt(k, v, ['rl', 'lr']);
break;
}
case 'line': {
const vals = v.split(',');
const vals0 = vals[0];
settings.integer(k, vals0);
settings.percent(k, vals0) ? settings.set('snapToLines', false) : null;
settings.alt(k, vals0, ['auto']);
if (vals.length === 2) {
settings.alt('lineAlign', vals[1], ['start', 'center', 'end']);
}
break;
}
case 'position': {
const vals = v.split(',');
settings.percent(k, vals[0]);
if (vals.length === 2) {
settings.alt('positionAlign', vals[1], ['line-left', 'center', 'line-right', 'auto']);
}
break;
}
case 'size': {
settings.percent(k, v);
break;
}
case 'align': {
settings.alt(k, v, ['start', 'center', 'end', 'left', 'right']);
break;
}
}
}, /:/, /\s/);
// Apply default values for any missing fields.
cue.region = settings.get('region', null);
cue.vertical = settings.get('vertical', '');
try {
cue.line = settings.get('line', 'auto');
}
catch (e) {
// eslint-ignore-line
}
cue.lineAlign = settings.get('lineAlign', 'start');
cue.snapToLines = settings.get('snapToLines', true);
cue.size = settings.get('size', 100);
// Safari still uses the old middle value and won't accept center
try {
cue.align = settings.get('align', 'center');
}
catch (e) {
cue.align = settings.get('align', 'middle');
}
try {
cue.position = settings.get('position', 'auto');
}
catch (e) {
const positions = {
start: 0,
left: 0,
center: 50,
middle: 50,
end: 100,
right: 100,
};
cue.position = settings.get('position', positions[cue.align]);
}
cue.positionAlign = settings.get('positionAlign', 'auto');
}
function skipWhitespace() {
input = input.replace(/^\s+/, '');
}
// 4.1 WebVTT cue timings.
skipWhitespace();
cue.startTime = consumeTimeStamp(); // (1) collect cue start time
skipWhitespace();
if (input.substr(0, 3) !== '-->') { // (3) next characters must match "-->"
throw new WebVttParsingError_js_1.WebVttParsingError(BAD_TIMESTAMP + " (time stamps must be separated by '-->'): ");
}
input = input.substr(3);
skipWhitespace();
cue.endTime = consumeTimeStamp(); // (5) collect cue end time
// 4.1 WebVTT cue settings list.
skipWhitespace();
consumeCueSettings(input, cue);
}
//# sourceMappingURL=parseCue.js.map