UNPKG

srt-validator

Version:
112 lines (111 loc) 4.1 kB
"use strict"; 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;