UNPKG

@awesome-fe/translate

Version:
154 lines 6.89 kB
"use strict"; var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { if (ar || !(i in from)) { if (!ar) ar = Array.prototype.slice.call(from, 0, i); ar[i] = from[i]; } } return to.concat(ar || Array.prototype.slice.call(from)); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.subtitle = void 0; var subtitle; (function (subtitle_1) { var SubtitleFormat; (function (SubtitleFormat) { SubtitleFormat["AUTO"] = "auto"; SubtitleFormat["SRT"] = "srt"; SubtitleFormat["VTT"] = "vtt"; })(SubtitleFormat = subtitle_1.SubtitleFormat || (subtitle_1.SubtitleFormat = {})); function parse(text, format) { if (format === void 0) { format = SubtitleFormat.AUTO; } if (format === SubtitleFormat.AUTO) { return parse(text, detectFormat(text)); } else if (format === SubtitleFormat.SRT || format === SubtitleFormat.VTT) { var _a = partition(text, format), meta = _a.meta, items = _a.items; return { meta: meta, items: items.map(function (segment) { var _a; var lines = segment.split(/\r?\n/); var timeIndex = lines.findIndex(function (line) { return /\d\d:\d\d:\d\d[,.]\d\d\d --> \d\d:\d\d:\d\d[,.]\d\d\d/.test(line); }); var time = lines[timeIndex].split(' --> '); return { cue: (_a = lines[timeIndex - 1]) !== null && _a !== void 0 ? _a : '', startTime: parseTime(time[0]), endTime: parseTime(time[1]), text: unescapeSubtitle(lines.slice(timeIndex + 1).join('\n').trim(), format), }; }), }; } } subtitle_1.parse = parse; function stringify(subtitle, format) { if (format === void 0) { format = SubtitleFormat.AUTO; } if (format === SubtitleFormat.AUTO) { return stringify(subtitle, subtitle.meta.format); } else if (format === SubtitleFormat.SRT) { return subtitle.items.map(function (item, index) { return "".concat(index + 1, "\n").concat(formatTime(item.startTime, format), " --> ").concat(formatTime(item.endTime, format), "\n").concat(escapeSubtitle(item.text, format)); }).join('\n\n'); } else if (format === SubtitleFormat.VTT) { var meta = "".concat(['WEBVTT', escapeSubtitle(subtitle.meta.header, SubtitleFormat.VTT)].filter(function (it) { return !!it; }).join(' - '), "\nKind: ").concat(subtitle.meta.kind, "\nLanguage: ").concat(subtitle.meta.language); var body = subtitle.items.map(function (item, index) { var _a; return "".concat(escapeSubtitle((_a = item.cue) !== null && _a !== void 0 ? _a : '', format), "\n").concat(formatTime(item.startTime, format), " --> ").concat(formatTime(item.endTime, format), "\n").concat(escapeSubtitle(item.text, format)).trim(); }); return __spreadArray([meta], body, true).join('\n\n'); } } subtitle_1.stringify = stringify; function detectFormat(text) { if (text.startsWith('WEBVTT')) { return SubtitleFormat.VTT; } else if (/\d\d:\d\d:\d\d,\d\d\d --> \d\d:\d\d:\d\d,\d\d\d/.test(text)) { return SubtitleFormat.SRT; } else { throw new Error('Unsupported subtitle format'); } } function parseVttMeta(text) { var _a, _b; var lines = text.split('\n'); var header = lines[0]; var kind = lines[1].split(':')[1].trim(); var language = lines[2].split(':')[1].trim(); return { header: unescapeSubtitle((_b = (_a = header.split('-')[1]) === null || _a === void 0 ? void 0 : _a.trim()) !== null && _b !== void 0 ? _b : '', SubtitleFormat.VTT), format: SubtitleFormat.VTT, kind: kind, language: language, }; } function partition(text, format) { var segments = text.split(/\r?\n\r?\n/).filter(function (it) { return !!it; }); if (format === SubtitleFormat.SRT) { return { meta: { header: '', format: SubtitleFormat.SRT, kind: 'captions', language: 'en', }, items: segments, }; } else if (format === SubtitleFormat.VTT) { return { meta: parseVttMeta(segments[0]), items: segments.slice(1), }; } } function parseTime(string) { var _a = string.split(/[:,.]/).map(function (s) { return parseInt(s, 10); }), hours = _a[0], minutes = _a[1], seconds = _a[2], milliseconds = _a[3]; return hours * 3600000 + minutes * 60000 + seconds * 1000 + milliseconds; } function escapeSubtitle(text, format) { if (format === SubtitleFormat.SRT) { return text.replace(/\xa0/g, '\\h'); } else if (format === SubtitleFormat.VTT) { return text .replace(/&/g, '&amp;') .replace(/</g, '&lt;') .replace(/>/g, '&gt;') .replace(/\xa0/g, '&nbsp;'); } } function unescapeSubtitle(text, format) { if (format === SubtitleFormat.SRT) { return text.replace(/\\h/g, '\xa0').replace(/\\N/g, '\n'); } else if (format === SubtitleFormat.VTT) { return text .replace(/&lt;/g, '<') .replace(/&gt;/g, '>') .replace(/&nbsp;/g, '\xa0') .replace(/&amp;/g, '&'); } } function pad(value, length) { return value.toString().padStart(length, '0'); } function formatTime(time, format) { var hours = Math.floor(time / 3600000); var minutes = Math.floor((time - hours * 3600000) / 60000); var seconds = Math.floor((time - hours * 3600000 - minutes * 60000) / 1000); var milliseconds = time - hours * 3600000 - minutes * 60000 - seconds * 1000; if (format === SubtitleFormat.SRT) { return "".concat(pad(hours, 2), ":").concat(pad(minutes, 2), ":").concat(pad(seconds, 2), ",").concat(pad(milliseconds, 3)); } else if (format === SubtitleFormat.VTT) { return "".concat(pad(hours, 2), ":").concat(pad(minutes, 2), ":").concat(pad(seconds, 2), ".").concat(pad(milliseconds, 3)); } } })(subtitle = exports.subtitle || (exports.subtitle = {})); //# sourceMappingURL=subtitle.js.map