UNPKG

@awesome-fe/translate

Version:
79 lines 3.01 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.FakeTranslationEngine = void 0; const translation_engine_1 = require("./translation-engine"); const delay_1 = require("../dom/delay"); const dom_models_1 = require("../dom/parse5/dom-models"); const url_patterns_1 = require("./url-patterns"); const sentence_formatter_1 = require("./sentence-formatter"); function isTranslatableText(text) { return /[A-Za-z]/.test(text) && text !== 'no-translate' && !/^[A-Z]+$/.test(text); } function translateText(text) { if (!isTranslatableText(text)) { return text; } if (text.startsWith('[') && text.endsWith(']')) { const content = text.substring(1, text.length - 1); return `[译${content}]`; } else { return `译${text}`; } } function translate(node) { if (node instanceof dom_models_1.DomText) { // 网址和邮件地址不翻译 if (url_patterns_1.simpleEmailPattern.test(node.value) || url_patterns_1.urlSchemaPattern.test(node.value)) { return; } node.value = translateText(node.value); } else if (node instanceof dom_models_1.DomElement && (node.isTagOf('code', 'kbd') || node.getAttribute('translate') === 'no')) { // 什么也不做 } else if (node instanceof dom_models_1.DomElement && node.isTagOf('img', 'audio', 'video')) { const alt = node.getAttribute('alt'); if (alt) { node.setAttribute('alt', translateText(alt)); } } else if (node instanceof dom_models_1.DomParentNode) { node.childNodes.forEach(translate); } } function mergeTextNodes(parent) { let text = ''; for (let i = parent.childNodes.length - 1; i >= 0; i--) { const node = parent.childNodes[i]; if (node instanceof dom_models_1.DomText) { text = node.value + text; const previousSibling = node.previousSibling(); if (!(previousSibling instanceof dom_models_1.DomText) || previousSibling instanceof dom_models_1.DomText && /\n+/.test(previousSibling.textContent)) { node.value = text; text = ''; } else { node.remove(); } } if (node instanceof dom_models_1.DomParentNode) { mergeTextNodes(node); } } } class FakeTranslationEngine extends translation_engine_1.TranslationEngine { async batchTranslate(pairs, format) { await (0, delay_1.delay)(200); for (let pair of pairs) { const html = sentence_formatter_1.SentenceFormatter.toHtml(pair[0], format); const doc = dom_models_1.DomDocumentFragment.parse(html); mergeTextNodes(doc); translate(doc); pair[1] = sentence_formatter_1.SentenceFormatter.fromHtml(doc.toHtml(), format); } return pairs; } } exports.FakeTranslationEngine = FakeTranslationEngine; //# sourceMappingURL=fake-engine.js.map