UNPKG

@awesome-fe/translate

Version:
130 lines 5.65 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.restructureTable = exports.markAndSwap = exports.Marker = void 0; var fs_1 = require("fs"); var dom_models_1 = require("../tiny-dom/dom-models"); var common_1 = require("../common"); var slugs = require("github-slugger"); var util_1 = require("util"); var Marker = /** @class */ (function () { function Marker(selectors) { if (selectors === void 0) { selectors = dom_models_1.defaultSelectors; } this.selectors = selectors; } Marker.prototype.markFile = function (filename) { var content = fs_1.readFileSync(filename, 'utf8'); fs_1.writeFileSync(filename, this.mark(content), 'utf8'); }; Marker.prototype.mark = function (content) { var doc = dom_models_1.DomDocument.parse(content); this.addTranslationMark(doc); return doc.toHtml(); }; Marker.prototype.addTranslationMark = function (doc) { this.addIdForHeaders(doc); this.markAndSwapAll(doc); }; Marker.prototype.addIdForHeaders = function (body) { var headers = body.querySelectorAll(function (it) { return ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'].includes(it.nodeName); }); var slugger = slugs(); headers.forEach(function (header) { if (!header.hasAttribute('id')) { header.setAttribute('id', toId(slugger, header.textContent)); } }); }; Marker.prototype.markAndSwapAll = function (body) { restructureTable(body); this.selectors.forEach(function (selector) { return markAndSwap(body, selector); }); }; return Marker; }()); exports.Marker = Marker; function toId(slugger, text) { return slugger.slug(text); } function isPaired(prev, element) { return prev && prev.nextElementSibling === element && prev.isTagOf(element.tagName) && prev.className === element.className; } function markAndSwap(element, selector) { var elements = element.querySelectorAll(selector); elements.forEach(function (element) { if (common_1.containsChinese(element.innerHTML) && !element.hasAttribute('no-translate')) { var prev = element.previousElementSibling; if (isPaired(prev, element) && !common_1.containsChinese(prev.innerHTML)) { element.setAttribute('translation-result', 'on'); prev.setAttribute('translation-origin', 'off'); element.parentNode.insertBefore(element, prev); // 交换 id,中文内容应该占用原文的 id var id = prev.getAttribute('id'); if (id) { prev.removeAttribute('id'); element.setAttribute('id', id); } var href = prev.getAttribute('href'); if (href) { element.setAttribute('href', href); } if (element.isTagOf('h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'li')) { var prevAnchor = prev.querySelector(function (it) { return it.isTagOf('a') && it.hasAttribute('href'); }); var thisAnchor = element.querySelector(function (it) { return it.isTagOf('a') && it.hasAttribute('href'); }); if (prevAnchor && thisAnchor && common_1.containsChinese(decodeURIComponent(thisAnchor.getAttribute('href')))) { thisAnchor.setAttribute('href', prevAnchor.getAttribute('href')); } } } } }); } exports.markAndSwap = markAndSwap; function shouldMergeTable(element) { return element.getAttribute('translation-merge-rows') === 'no'; } function shouldMergeRow(element) { if (element.getAttribute('translation-merge-rows') === 'no') { return false; } // 如果内部有 p 元素,则禁止自动合并 for (var i = 0; i < element.cells.length; ++i) { if (element.cells[i].querySelector(function (it) { return it.isTagOf('p'); })) { return false; } } return true; } // 重塑表格结构 function restructureTable(element) { var items = element.querySelectorAll(function (it) { return it.isTagOf('table'); }); items.forEach(function (table) { if (shouldMergeTable(table)) { return; } // 对出现在 thead 的行和出现在 tbody 的行进行统一处理 var rows = table.querySelectorAll(function (it) { return it.isTagOf('tr'); }); var translationRows = []; for (var i = 0; i < rows.length - 1; ++i) { var thisRow = rows[i]; var nextRow = rows[i + 1]; if (shouldMergeRow(nextRow) && common_1.containsChinese(nextRow.innerHTML) && !common_1.containsChinese(thisRow.innerHTML)) { translationRows.push(nextRow); mergeRows(thisRow, nextRow); } } translationRows.forEach(function (row) { return row.remove(); }); }); } exports.restructureTable = restructureTable; function mergeRows(originRow, translationRow) { if (originRow.cells.length !== translationRow.cells.length) { return; } for (var i = 0; i < originRow.cells.length; ++i) { var originCell = originRow.cells[i]; var translationCell = translationRow.cells[i]; if (util_1.isDeepStrictEqual(originCell.attrs, translationCell.attrs) && originCell.innerHTML !== translationCell.innerHTML) { originCell.innerHTML = "<p>" + originCell.innerHTML + "</p><p>" + translationCell.innerHTML + "</p>"; } } } //# sourceMappingURL=marker.js.map