@awesome-fe/translate
Version:
Translation utils
154 lines • 6.89 kB
JavaScript
;
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, '&')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/\xa0/g, ' ');
}
}
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(/</g, '<')
.replace(/>/g, '>')
.replace(/ /g, '\xa0')
.replace(/&/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