anylang
Version:
A translator's kit that uses the free APIs of Google Translate, Yandex, Bing, ChatGPT, and other LLMs
68 lines (66 loc) • 9.33 kB
JavaScript
import { escapeRegExp } from './strings';
const tokens = ['tokenStart', 'tokenEnd', 'tokenClose'];
/**
* Util for pack multiple requests to one
*
* It's just encode/decode all texts with custom separation options
*/
export class Multiplexor {
// private readonly token: Array<Array<string>> = [];
constructor(options) {
this.options = {
tokenStart: '<',
tokenEnd: '>',
tokenClose: '/',
};
if (options !== undefined) {
['tokenStart', 'tokenEnd', 'tokenClose'].forEach((key) => {
const item = options[key];
if (item !== undefined && item.search(/&|:/) !== -1) {
throw new Error(`Option ${key} has disallow characters (& or :)`);
}
});
for (const key in options) {
this.options[key] = options[key];
}
}
}
encode(data) {
const { tokenStart: start = '', tokenEnd: end = '', tokenClose: close = '', } = this.options;
return data
.map(({ id, text }) => start + id + end + this.escape(text) + start + close + id + end)
.join(' ');
}
decode(text) {
const { tokenStart: start = '', tokenEnd: end = '', tokenClose: close = '', } = this.options;
const pattern = `${start}\\s*(\\d+)\\s*${end}([\\w\\W]+?)${start}\\s*${close}\\s*\\1\\s*${end}`;
const matchSet = text.matchAll(new RegExp(pattern, 'gm'));
const result = [];
let match = matchSet.next();
while (!match.done) {
result.push({
id: match.value[1],
text: this.unescape(match.value[2]),
});
match = matchSet.next();
}
return result;
}
escape(text) {
return tokens.reduce((text, tokenName, index) => {
const token = this.options[tokenName];
if (!token)
return text;
return text.replace(new RegExp(escapeRegExp(token), 'g'), `&${index + 1}:`);
}, text);
}
unescape(text) {
return tokens.reduce((text, tokenName, index) => {
const token = this.options[tokenName];
if (!token)
return text;
return text.replace(new RegExp(`&${index + 1}:`, 'g'), token);
}, text);
}
}
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInV0aWxzL011bHRpcGxleG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFhekMsTUFBTSxNQUFNLEdBQUcsQ0FBQyxZQUFZLEVBQUUsVUFBVSxFQUFFLFlBQVksQ0FBVSxDQUFDO0FBRWpFOzs7O0dBSUc7QUFDSCxNQUFNLE9BQU8sV0FBVztJQU92QixxREFBcUQ7SUFDckQsWUFBWSxPQUFpQjtRQVBaLFlBQU8sR0FBWTtZQUNuQyxVQUFVLEVBQUUsR0FBRztZQUNmLFFBQVEsRUFBRSxHQUFHO1lBQ2IsVUFBVSxFQUFFLEdBQUc7U0FDZixDQUFDO1FBSUQsSUFBSSxPQUFPLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDM0IsQ0FBQyxZQUFZLEVBQUUsVUFBVSxFQUFFLFlBQVksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUN4RCxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsR0FBb0IsQ0FBQyxDQUFDO2dCQUMzQyxJQUFJLElBQUksS0FBSyxTQUFTLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO29CQUNyRCxNQUFNLElBQUksS0FBSyxDQUFDLFVBQVUsR0FBRyxtQ0FBbUMsQ0FBQyxDQUFDO2dCQUNuRSxDQUFDO1lBQ0YsQ0FBQyxDQUFDLENBQUM7WUFFSCxLQUFLLE1BQU0sR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO2dCQUMzQixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQW9CLENBQUMsR0FBRyxPQUFPLENBQUMsR0FBb0IsQ0FBQyxDQUFDO1lBQ3BFLENBQUM7UUFDRixDQUFDO0lBQ0YsQ0FBQztJQUVNLE1BQU0sQ0FBQyxJQUFxQjtRQUNsQyxNQUFNLEVBQ0wsVUFBVSxFQUFFLEtBQUssR0FBRyxFQUFFLEVBQ3RCLFFBQVEsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUNsQixVQUFVLEVBQUUsS0FBSyxHQUFHLEVBQUUsR0FDdEIsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBRWpCLE9BQU8sSUFBSTthQUNULEdBQUcsQ0FDSCxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FDaEIsS0FBSyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLEdBQUcsS0FBSyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQ2hFO2FBQ0EsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2IsQ0FBQztJQUVNLE1BQU0sQ0FBQyxJQUFZO1FBQ3pCLE1BQU0sRUFDTCxVQUFVLEVBQUUsS0FBSyxHQUFHLEVBQUUsRUFDdEIsUUFBUSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQ2xCLFVBQVUsRUFBRSxLQUFLLEdBQUcsRUFBRSxHQUN0QixHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7UUFFakIsTUFBTSxPQUFPLEdBQUcsR0FBRyxLQUFLLGlCQUFpQixHQUFHLGVBQWUsS0FBSyxPQUFPLEtBQUssY0FBYyxHQUFHLEVBQUUsQ0FBQztRQUNoRyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBRTFELE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUNsQixJQUFJLEtBQUssR0FBRyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDNUIsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNwQixNQUFNLENBQUMsSUFBSSxDQUFDO2dCQUNYLEVBQUUsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFDbEIsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNuQyxDQUFDLENBQUM7WUFDSCxLQUFLLEdBQUcsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3pCLENBQUM7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNmLENBQUM7SUFFTyxNQUFNLENBQUMsSUFBWTtRQUMxQixPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQy9DLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7WUFFdEMsSUFBSSxDQUFDLEtBQUs7Z0JBQUUsT0FBTyxJQUFJLENBQUM7WUFFeEIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksTUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxJQUFJLEtBQUssR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzdFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNWLENBQUM7SUFFTyxRQUFRLENBQUMsSUFBWTtRQUM1QixPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQy9DLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7WUFFdEMsSUFBSSxDQUFDLEtBQUs7Z0JBQUUsT0FBTyxJQUFJLENBQUM7WUFFeEIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQy9ELENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNWLENBQUM7Q0FDRCIsImZpbGUiOiJ1dGlscy9NdWx0aXBsZXhvci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGVzY2FwZVJlZ0V4cCB9IGZyb20gJy4vc3RyaW5ncyc7XG5cbmludGVyZmFjZSBPcHRpb25zIHtcblx0dG9rZW5TdGFydD86IHN0cmluZztcblx0dG9rZW5FbmQ/OiBzdHJpbmc7XG5cdHRva2VuQ2xvc2U/OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBUZXh0Q29udGFpbmVyIHtcblx0aWQ6IHN0cmluZztcblx0dGV4dDogc3RyaW5nO1xufVxuXG5jb25zdCB0b2tlbnMgPSBbJ3Rva2VuU3RhcnQnLCAndG9rZW5FbmQnLCAndG9rZW5DbG9zZSddIGFzIGNvbnN0O1xuXG4vKipcbiAqIFV0aWwgZm9yIHBhY2sgbXVsdGlwbGUgcmVxdWVzdHMgdG8gb25lXG4gKlxuICogSXQncyBqdXN0IGVuY29kZS9kZWNvZGUgYWxsIHRleHRzIHdpdGggY3VzdG9tIHNlcGFyYXRpb24gb3B0aW9uc1xuICovXG5leHBvcnQgY2xhc3MgTXVsdGlwbGV4b3Ige1xuXHRwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IE9wdGlvbnMgPSB7XG5cdFx0dG9rZW5TdGFydDogJzwnLFxuXHRcdHRva2VuRW5kOiAnPicsXG5cdFx0dG9rZW5DbG9zZTogJy8nLFxuXHR9O1xuXG5cdC8vIHByaXZhdGUgcmVhZG9ubHkgdG9rZW46IEFycmF5PEFycmF5PHN0cmluZz4+ID0gW107XG5cdGNvbnN0cnVjdG9yKG9wdGlvbnM/OiBPcHRpb25zKSB7XG5cdFx0aWYgKG9wdGlvbnMgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Wyd0b2tlblN0YXJ0JywgJ3Rva2VuRW5kJywgJ3Rva2VuQ2xvc2UnXS5mb3JFYWNoKChrZXkpID0+IHtcblx0XHRcdFx0Y29uc3QgaXRlbSA9IG9wdGlvbnNba2V5IGFzIGtleW9mIE9wdGlvbnNdO1xuXHRcdFx0XHRpZiAoaXRlbSAhPT0gdW5kZWZpbmVkICYmIGl0ZW0uc2VhcmNoKC8mfDovKSAhPT0gLTEpIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYE9wdGlvbiAke2tleX0gaGFzIGRpc2FsbG93IGNoYXJhY3RlcnMgKCYgb3IgOilgKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cblx0XHRcdGZvciAoY29uc3Qga2V5IGluIG9wdGlvbnMpIHtcblx0XHRcdFx0dGhpcy5vcHRpb25zW2tleSBhcyBrZXlvZiBPcHRpb25zXSA9IG9wdGlvbnNba2V5IGFzIGtleW9mIE9wdGlvbnNdO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBlbmNvZGUoZGF0YTogVGV4dENvbnRhaW5lcltdKSB7XG5cdFx0Y29uc3Qge1xuXHRcdFx0dG9rZW5TdGFydDogc3RhcnQgPSAnJyxcblx0XHRcdHRva2VuRW5kOiBlbmQgPSAnJyxcblx0XHRcdHRva2VuQ2xvc2U6IGNsb3NlID0gJycsXG5cdFx0fSA9IHRoaXMub3B0aW9ucztcblxuXHRcdHJldHVybiBkYXRhXG5cdFx0XHQubWFwKFxuXHRcdFx0XHQoeyBpZCwgdGV4dCB9KSA9PlxuXHRcdFx0XHRcdHN0YXJ0ICsgaWQgKyBlbmQgKyB0aGlzLmVzY2FwZSh0ZXh0KSArIHN0YXJ0ICsgY2xvc2UgKyBpZCArIGVuZCxcblx0XHRcdClcblx0XHRcdC5qb2luKCcgJyk7XG5cdH1cblxuXHRwdWJsaWMgZGVjb2RlKHRleHQ6IHN0cmluZykge1xuXHRcdGNvbnN0IHtcblx0XHRcdHRva2VuU3RhcnQ6IHN0YXJ0ID0gJycsXG5cdFx0XHR0b2tlbkVuZDogZW5kID0gJycsXG5cdFx0XHR0b2tlbkNsb3NlOiBjbG9zZSA9ICcnLFxuXHRcdH0gPSB0aGlzLm9wdGlvbnM7XG5cblx0XHRjb25zdCBwYXR0ZXJuID0gYCR7c3RhcnR9XFxcXHMqKFxcXFxkKylcXFxccyoke2VuZH0oW1xcXFx3XFxcXFddKz8pJHtzdGFydH1cXFxccyoke2Nsb3NlfVxcXFxzKlxcXFwxXFxcXHMqJHtlbmR9YDtcblx0XHRjb25zdCBtYXRjaFNldCA9IHRleHQubWF0Y2hBbGwobmV3IFJlZ0V4cChwYXR0ZXJuLCAnZ20nKSk7XG5cblx0XHRjb25zdCByZXN1bHQgPSBbXTtcblx0XHRsZXQgbWF0Y2ggPSBtYXRjaFNldC5uZXh0KCk7XG5cdFx0d2hpbGUgKCFtYXRjaC5kb25lKSB7XG5cdFx0XHRyZXN1bHQucHVzaCh7XG5cdFx0XHRcdGlkOiBtYXRjaC52YWx1ZVsxXSxcblx0XHRcdFx0dGV4dDogdGhpcy51bmVzY2FwZShtYXRjaC52YWx1ZVsyXSksXG5cdFx0XHR9KTtcblx0XHRcdG1hdGNoID0gbWF0Y2hTZXQubmV4dCgpO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRwcml2YXRlIGVzY2FwZSh0ZXh0OiBzdHJpbmcpIHtcblx0XHRyZXR1cm4gdG9rZW5zLnJlZHVjZSgodGV4dCwgdG9rZW5OYW1lLCBpbmRleCkgPT4ge1xuXHRcdFx0Y29uc3QgdG9rZW4gPSB0aGlzLm9wdGlvbnNbdG9rZW5OYW1lXTtcblxuXHRcdFx0aWYgKCF0b2tlbikgcmV0dXJuIHRleHQ7XG5cblx0XHRcdHJldHVybiB0ZXh0LnJlcGxhY2UobmV3IFJlZ0V4cChlc2NhcGVSZWdFeHAodG9rZW4pLCAnZycpLCBgJiR7aW5kZXggKyAxfTpgKTtcblx0XHR9LCB0ZXh0KTtcblx0fVxuXG5cdHByaXZhdGUgdW5lc2NhcGUodGV4dDogc3RyaW5nKSB7XG5cdFx0cmV0dXJuIHRva2Vucy5yZWR1Y2UoKHRleHQsIHRva2VuTmFtZSwgaW5kZXgpID0+IHtcblx0XHRcdGNvbnN0IHRva2VuID0gdGhpcy5vcHRpb25zW3Rva2VuTmFtZV07XG5cblx0XHRcdGlmICghdG9rZW4pIHJldHVybiB0ZXh0O1xuXG5cdFx0XHRyZXR1cm4gdGV4dC5yZXBsYWNlKG5ldyBSZWdFeHAoYCYke2luZGV4ICsgMX06YCwgJ2cnKSwgdG9rZW4pO1xuXHRcdH0sIHRleHQpO1xuXHR9XG59XG4iXX0=