From 4cc5910df3f7249263f4786d73e7e2ba7962d995 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A7=8B=E4=BA=8E=E5=88=9D=E8=A7=81?= <752204717@qq.com> Date: Fri, 15 May 2026 16:11:13 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=8A=95=E7=A8=BF=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=E9=A2=84=E8=A7=88=E6=96=87=E7=AB=A0=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- js/article.js | 228 +++++++++++++++++++++++++++----------------------- 1 file changed, 123 insertions(+), 105 deletions(-) diff --git a/js/article.js b/js/article.js index 1d3d6f1..46b6cbe 100644 --- a/js/article.js +++ b/js/article.js @@ -135,7 +135,7 @@ document.head.appendChild(script); // 列表 function at_list() { - + function adjustNavHeight() { var windowHeight = window.innerHeight; // 获取页面高度 $(".anchor-nav").css("height", windowHeight + "px"); // 设置导航栏高度为页面高度 @@ -8880,17 +8880,35 @@ ${header if (!cell || !cell.cellId) return ''; const content = cell.text || ''; + + // 1. 判断是否是 Base64 图片 (用于点击预览逻辑) const isBase64Image = /^]*src=["']data:image\//i.test(content); - const finalContent = isBase64Image - ? content.replace( + // 2. 判断是否是服务器特定的图片路径 (用于拼接域名) + const isServerPathImage = /src=["']\/public\/articleTableImage/i.test(content); + + let finalContent = content; + + if (isBase64Image) { + // 处理 Base64:注入点击预览 picPreview + finalContent = content.replace( /]*?)src=["'](data:image\/[^"']+)["']([^>]*)>/gi, (match, preAttrs, src, postAttrs) => { const safeSrc = src.replace(/'/g, "\\'"); - return ``; + return ``; } - ) - : content; + ); + } else if (isServerPathImage) { + // 处理特定路径:拼接域名 https://submission.tmrjournals.com + finalContent = content.replace( + /]*?)src=["'](\/public\/articleTableImage[^"']+)["']([^>]*)>/gi, + (match, preAttrs, src, postAttrs) => { + const fullUrl = `https://submission.tmrjournals.com${src}`; + // 建议这里也加上 max-width 兼容性更好 + return ``; + } + ); + } return ` @@ -8974,7 +8992,7 @@ text-align:left;color:#333;" >${item.table.note ? item.table.note : '' updateCitationDisplayWithMyTable('.wen_rong .content-box .conthtmn', result.data.refers, { writeInnerHTML: true, hideEmptyCite: true - }); + }); } /** @@ -8985,138 +9003,138 @@ function updateCitationDisplayWithMyTable(root, refers, opt) { opt = opt || {}; var el = typeof root === 'string' ? document.querySelector(root) : root; if (!el) return { idToNum: {}, order: [] }; - + // 1) 合法参考文献集合 var validRef = Object.create(null); (refers || []).forEach(function (r) { - if (r && r.p_refer_id != null) validRef[String(r.p_refer_id)] = true; + if (r && r.p_refer_id != null) validRef[String(r.p_refer_id)] = true; }); - + function parseIds(raw) { - return String(raw || '') - .split(',') - .map(function (s) { return s.trim(); }) - .filter(Boolean); + return String(raw || '') + .split(',') + .map(function (s) { return s.trim(); }) + .filter(Boolean); } - + function formatNums(nums) { - var a = nums.filter(function (n, i, arr) { return arr.indexOf(n) === i; }) - .sort(function (x, y) { return x - y; }); - var out = [], i = 0; - while (i < a.length) { - var j = i; - while (j < a.length - 1 && a[j + 1] === a[j] + 1) j++; - if (j - i >= 2) out.push(a[i] + '–' + a[j]); - else for (var k = i; k <= j; k++) out.push(String(a[k])); - i = j + 1; - } - return out.join(', '); + var a = nums.filter(function (n, i, arr) { return arr.indexOf(n) === i; }) + .sort(function (x, y) { return x - y; }); + var out = [], i = 0; + while (i < a.length) { + var j = i; + while (j < a.length - 1 && a[j + 1] === a[j] + 1) j++; + if (j - i >= 2) out.push(a[i] + '–' + a[j]); + else for (var k = i; k <= j; k++) out.push(String(a[k])); + i = j + 1; + } + return out.join(', '); } - + // 2) 建一个“表格索引”:tableId -> 真实表格节点 // 这里把常见承载节点都尝试一遍,你可按官网实际 class 再加 var tableMap = Object.create(null); var tableCandidates = el.querySelectorAll( - 'table, .myeditabledivTable, .wordTableHtml, [data-table-id], [data-amt-id], [main-id]' + 'table, .myeditabledivTable, .wordTableHtml, [data-table-id], [data-amt-id], [main-id]' ); tableCandidates.forEach(function (node) { - var ids = [ - node.getAttribute('data-table-id'), - node.getAttribute('data-amt-id'), - node.getAttribute('data-id'), - node.getAttribute('main-id') - ].filter(Boolean).map(String); - ids.forEach(function (id) { - if (!tableMap[id]) tableMap[id] = node; - }); + var ids = [ + node.getAttribute('data-table-id'), + node.getAttribute('data-amt-id'), + node.getAttribute('data-id'), + node.getAttribute('main-id') + ].filter(Boolean).map(String); + ids.forEach(function (id) { + if (!tableMap[id]) tableMap[id] = node; + }); }); - + // 3) 全局编号状态 var idToNum = Object.create(null); var order = []; var nextNum = 1; - + function assignId(id) { - id = String(id); - if (!validRef[id]) return null; // 不存在就不显示 - if (idToNum[id] == null) { - idToNum[id] = nextNum++; - order.push(id); - } - return idToNum[id]; + id = String(id); + if (!validRef[id]) return null; // 不存在就不显示 + if (idToNum[id] == null) { + idToNum[id] = nextNum++; + order.push(id); + } + return idToNum[id]; } - + function paintCiteNode(node, ids) { - var nums = []; - ids.forEach(function (id) { - var n = assignId(id); - if (n != null) nums.push(n); - }); - nums = nums.filter(function (v, i, a) { return a.indexOf(v) === i; }) - .sort(function (a, b) { return a - b; }); - - if (!nums.length) { - node.removeAttribute('data-cite-label'); - if (opt.writeInnerHTML) node.innerHTML = ''; - if (opt.hideEmptyCite !== false) node.style.display = 'none'; - return; - } - - var label = formatNums(nums); - node.setAttribute('data-cite-label', label); - if (opt.writeInnerHTML) node.innerHTML = '[' + label + ']'; + var nums = []; + ids.forEach(function (id) { + var n = assignId(id); + if (n != null) nums.push(n); + }); + nums = nums.filter(function (v, i, a) { return a.indexOf(v) === i; }) + .sort(function (a, b) { return a - b; }); + + if (!nums.length) { + node.removeAttribute('data-cite-label'); + if (opt.writeInnerHTML) node.innerHTML = ''; + if (opt.hideEmptyCite !== false) node.style.display = 'none'; + return; + } + + var label = formatNums(nums); + node.setAttribute('data-cite-label', label); + if (opt.writeInnerHTML) node.innerHTML = '[' + label + ']'; } - + // 4) 扫描一个子树内 mycite/autocite function scanCitesInSubtree(node) { - node.querySelectorAll('mycite, autocite').forEach(function (cite) { - paintCiteNode(cite, parseIds(cite.getAttribute('data-id'))); - }); + node.querySelectorAll('mycite, autocite').forEach(function (cite) { + paintCiteNode(cite, parseIds(cite.getAttribute('data-id'))); + }); } - + // 5) 主遍历:遇到 mytable 时“提前注入”对应表格引用 var consumedTableNode = new WeakSet(); - + function walk(node) { - if (!node || node.nodeType !== 1) return; - var tag = node.tagName.toLowerCase(); - - // 5.1 引用标签 - if (tag === 'mycite' || tag === 'autocite') { - paintCiteNode(node, parseIds(node.getAttribute('data-id'))); - return; - } - - // 5.2 mytable 占位:在这里扫描对应表格 - if (tag === 'mytable') { - var tid = String(node.getAttribute('data-id') || '').trim(); - var tableNode = tid ? tableMap[tid] : null; - if (!tableNode) { - // 兜底:按属性再找一次 - tableNode = el.querySelector( - '[data-table-id="' + tid + '"], [data-amt-id="' + tid + '"], [data-id="' + tid + '"], [main-id="' + tid + '"]' - ); + if (!node || node.nodeType !== 1) return; + var tag = node.tagName.toLowerCase(); + + // 5.1 引用标签 + if (tag === 'mycite' || tag === 'autocite') { + paintCiteNode(node, parseIds(node.getAttribute('data-id'))); + return; } - if (tableNode && !consumedTableNode.has(tableNode)) { - scanCitesInSubtree(tableNode); // 在 mytable 位置提前计入 - consumedTableNode.add(tableNode); // 后续真实表格处不再重复 + + // 5.2 mytable 占位:在这里扫描对应表格 + if (tag === 'mytable') { + var tid = String(node.getAttribute('data-id') || '').trim(); + var tableNode = tid ? tableMap[tid] : null; + if (!tableNode) { + // 兜底:按属性再找一次 + tableNode = el.querySelector( + '[data-table-id="' + tid + '"], [data-amt-id="' + tid + '"], [data-id="' + tid + '"], [main-id="' + tid + '"]' + ); + } + if (tableNode && !consumedTableNode.has(tableNode)) { + scanCitesInSubtree(tableNode); // 在 mytable 位置提前计入 + consumedTableNode.add(tableNode); // 后续真实表格处不再重复 + } + return; + } + + // 5.3 若走到真实表格节点,且已在 mytable 处消费过,则跳过 + if (consumedTableNode.has(node)) return; + + // 5.4 正常递归 + for (var ch = node.firstElementChild; ch; ch = ch.nextElementSibling) { + walk(ch); } - return; - } - - // 5.3 若走到真实表格节点,且已在 mytable 处消费过,则跳过 - if (consumedTableNode.has(node)) return; - - // 5.4 正常递归 - for (var ch = node.firstElementChild; ch; ch = ch.nextElementSibling) { - walk(ch); - } } - + walk(el); - + return { idToNum: idToNum, order: order }; - } +} function initArticleHtml(htmlData, refs, type) { document.querySelectorAll('wmath').forEach(el => {