srt-validator
Version:
<h1 align="center">SrtValidator</h1>
112 lines (111 loc) • 4.1 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.parseTimeStamp = void 0;
var error_code_1 = require("../utils/error-code");
var parse_error_1 = require("../utils/parse-error");
var date_1 = require("./date");
var EOL = /\r?\n/;
var TRAILING_WHITE_SPACE = /\s$/;
var TIME_STAMP_REGEX = /^(\d{2}):(\d{2}):(\d{2}),(\d{3})$/;
/**
* Parse a sequence number
* @param {String} sequenceNumber
* @param {Number} lineNumber - The line number currently being parsed
* @return {Number}
*/
function parseSequenceNumber(sequenceNumber, lineNumber) {
if (!sequenceNumber) {
throw new parse_error_1.default("Missing sequence number", lineNumber, error_code_1.default.PARSER_ERROR_MISSING_SEQUENCE_NUMBER);
}
var sequenceNum = Number(sequenceNumber);
if (!Number.isInteger(sequenceNum) ||
TRAILING_WHITE_SPACE.test(sequenceNumber)) {
throw new parse_error_1.default("Expected Integer for sequence number: ".concat(sequenceNumber), lineNumber, error_code_1.default.PARSER_ERROR_INVALID_SEQUENCE_NUMBER);
}
return sequenceNum;
}
/**
* Parse a timestamp into an integer
* @example
* Input:
* "00:00:02,820"
* Output:
* 2820
* @param {String} timeStamp - a timestamp from a timespan.
* @param {Number} lineNumber - The line number currently being parsed
* @return {Number}
*/
function parseTimeStamp(timeStamp, lineNumber) {
var match = TIME_STAMP_REGEX.exec(timeStamp);
if (!match) {
throw new parse_error_1.default("Invalid time stamp: ".concat(timeStamp), lineNumber, error_code_1.default.PARSER_ERROR_INVALID_TIME_STAMP);
}
var _a = match.slice(1).map(Number), hours = _a[0], minutes = _a[1], seconds = _a[2], millis = _a[3];
return (hours * date_1.default.hour + minutes * date_1.default.minute + seconds * date_1.default.second + millis);
}
exports.parseTimeStamp = parseTimeStamp;
/**
* Parse a timespan into integer start and end values
* @example
* Input:
* "00:00:02,820 --> 00:00:05,120"
* Output:
* { start: 2820, end: 5120 }
*
* @param {String} timeSpan
* @param {Number} lineNumber - The line number currently being parsed
* @return {Object}
*/
function parseTimeSpan(timeSpan, lineNumber) {
if (!timeSpan) {
throw new parse_error_1.default("Missing time span", lineNumber, error_code_1.default.PARSER_ERROR_MISSING_TIME_SPAN);
}
var _a = timeSpan.split(' --> '), start = _a[0], end = _a[1];
if (!start || !end || TRAILING_WHITE_SPACE.test(timeSpan)) {
throw new parse_error_1.default("Invalid time span: ".concat(timeSpan), lineNumber, error_code_1.default.PARSER_ERROR_INVALID_TIME_SPAN);
}
return {
start: parseTimeStamp(start, lineNumber),
end: parseTimeStamp(end, lineNumber),
};
}
/**
* Parses a given SRT file contents
* @param {String} file - Contents of an SRT file in the string format
* @return {Array} - A list of subtitle metadata
*/
function parse(file) {
var lines = file.trimEnd().split(EOL);
var result = [];
for (var i = 0; i < lines.length; i += 1) {
var lineNumbers = { chunkStart: i, timeSpan: i, text: i, chunkEnd: i };
// First line
var sequenceNumber = parseSequenceNumber(lines[i], i);
// Second line
i += 1;
lineNumbers.timeSpan = i;
var time = parseTimeSpan(lines[i], i);
// Text can span multiple lines, so consume all lines
// until the separator
i += 1;
lineNumbers.text = i;
var linesOfText = [];
while (lines[i] && lines[i].trim()) {
linesOfText.push(lines[i]);
i += 1;
}
var text = linesOfText.join('\n');
if (!text) {
throw new parse_error_1.default("Missing caption text", i, error_code_1.default.PARSER_ERROR_MISSING_TEXT);
}
lineNumbers.chunkEnd = i - 1;
result.push({
lineNumbers: lineNumbers,
sequenceNumber: sequenceNumber,
time: time,
text: text,
});
}
return result;
}
exports.default = parse;
;