// history_detail_scripts.js - 从 history_detail.html 中提取的 JavaScript 代码 // 这个文件包含了历史详情页面的主要 JavaScript 逻辑 window.addEventListener('storage', function(e) { if (e.key === 'paperBurnerSettings') { // 重新加载设置并刷新 chatbot 配置 if (window.ChatbotCore && typeof window.ChatbotCore.getChatbotConfig === 'function') { // 你可以强制刷新 Chatbot UI 或重载配置 window.ChatbotUI && window.ChatbotUI.updateChatbotUI && window.ChatbotUI.updateChatbotUI(); } } }); /** * 将 exact 文本转为模糊正则,允许空格、换行模糊匹配,大小写不敏感 * @param {string} exact * @returns {RegExp} */ function escapeRegExp(string) { // 更安全地转义所有正则特殊字符 return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); } function fuzzyRegFromExact(exact) { // 先转义所有正则特殊字符 let pattern = escapeRegExp(exact); // 将所有空白替换为 \s+,允许跨行、多个空格 pattern = pattern.replace(/\s+/g, '\\s+'); // 可选:忽略前后空白 pattern = '\\s*' + pattern + '\\s*'; return new RegExp(pattern, 'gi'); } /** * 检查是否有OCR数据 * @returns {boolean} */ function hasOcrData() { return window.data && window.data.ocr && window.data.ocr.trim() !== ''; } /** * 检查是否有翻译数据 * @returns {boolean} */ function hasTranslationData() { return window.data && window.data.translation && window.data.translation.trim() !== ''; } /** * 检查是否有原始PDF数据 * @returns {boolean} */ function hasOriginalPdfData() { return window.data && window.data.metadata && window.data.metadata.originalPdfBase64; } /** * 创建确认对话框 * @param {string} title - 对话框标题 * @param {string} message - 对话框消息 * @param {string} confirmText - 确认按钮文本 * @param {string} cancelText - 取消按钮文本 * @returns {Promise} 用户是否确认 */ function showConfirmDialog(title, message, confirmText = '确认', cancelText = '取消') { return new Promise((resolve) => { // 创建对话框容器 const dialogOverlay = document.createElement('div'); dialogOverlay.id = 'pbx-confirm-dialog-overlay'; dialogOverlay.style.cssText = ` position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0, 0, 0, 0.5); display: flex; align-items: center; justify-content: center; z-index: 10000; `; const dialogBox = document.createElement('div'); dialogBox.style.cssText = ` background: white; border-radius: 12px; padding: 24px; max-width: 400px; width: 90%; box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15); `; dialogBox.innerHTML = `

${title}

${message}

`; dialogOverlay.appendChild(dialogBox); document.body.appendChild(dialogOverlay); // 按钮事件 const confirmBtn = dialogBox.querySelector('#pbx-dialog-confirm'); const cancelBtn = dialogBox.querySelector('#pbx-dialog-cancel'); const cleanup = () => { document.body.removeChild(dialogOverlay); }; confirmBtn.onclick = () => { cleanup(); resolve(true); }; cancelBtn.onclick = () => { cleanup(); resolve(false); }; // 点击遮罩层关闭 dialogOverlay.onclick = (e) => { if (e.target === dialogOverlay) { cleanup(); resolve(false); } }; // ESC 键关闭 const handleEsc = (e) => { if (e.key === 'Escape') { cleanup(); resolve(false); document.removeEventListener('keydown', handleEsc); } }; document.addEventListener('keydown', handleEsc); }); } /** * 触发重新处理文档(OCR和/或翻译) * @param {boolean} includeTranslation - 是否包含翻译 */ async function triggerReprocess(includeTranslation) { const docId = window.docIdForLocalStorage; const docName = window.data ? window.data.name : '未知文档'; if (!docId) { alert('无法获取文档ID,请刷新页面重试。'); return; } // 保存处理模式到 localStorage,以便主页面读取 const reprocessConfig = { docId: docId, docName: docName, includeTranslation: includeTranslation, timestamp: Date.now() }; localStorage.setItem('pbx_reprocess_config', JSON.stringify(reprocessConfig)); // 跳转到主页面 const baseUrl = window.location.pathname.replace('/views/history/history_detail.html', '/'); window.location.href = baseUrl + '?reprocess=1'; } /** * 处理"Word文档"标签点击 * 如果没有OCR数据,询问用户是否需要生成 */ async function handleOcrTabClick() { // 如果已有OCR数据,直接显示 if (hasOcrData()) { showTab('ocr'); return; } // 检查是否有原始PDF if (!hasOriginalPdfData()) { alert('当前记录没有保存原始PDF数据,无法重新处理。'); return; } // 弹出确认对话框 const confirmed = await showConfirmDialog( '生成Word文档', '当前文档尚未进行OCR处理。是否需要启动OCR处理生成Word文档?\n\n处理完成后可在本页面查看和导出。', '启动OCR', '取消' ); if (confirmed) { await triggerReprocess(false); // 仅OCR,不翻译 } } /** * 处理"仅翻译"标签点击 * 如果没有翻译数据,询问用户是否需要生成翻译对照文档 */ async function handleTranslationTabClick() { // 如果已有翻译数据,直接显示 if (hasTranslationData()) { showTab('translation'); return; } // 检查是否有原始PDF if (!hasOriginalPdfData()) { alert('当前记录没有保存原始PDF数据,无法重新处理。'); return; } // 弹出确认对话框 const confirmed = await showConfirmDialog( '生成翻译对照文档', '当前文档尚未进行翻译处理。是否需要启动OCR+翻译处理?\n\n这将生成原文Word文档和翻译对照文档,处理完成后可在本页面查看和导出。', '启动OCR+翻译', '取消' ); if (confirmed) { await triggerReprocess(true); // OCR + 翻译 } } // 绑定 tab 按钮点击事件 document.addEventListener('DOMContentLoaded', function() { if (document.getElementById('tab-ocr')) { document.getElementById('tab-ocr').onclick = handleOcrTabClick; } if (document.getElementById('tab-translation')) { document.getElementById('tab-translation').onclick = handleTranslationTabClick; } if (document.getElementById('tab-chunk-compare')) { document.getElementById('tab-chunk-compare').onclick = function() { showTab('chunk-compare'); }; } if (document.getElementById('tab-pdf-compare')) { document.getElementById('tab-pdf-compare').onclick = function() { showTab('pdf-compare'); }; } if (document.getElementById('tab-original-file')) { document.getElementById('tab-original-file').onclick = function() { showTab('original-file'); }; } // 页面加载后渲染详情 if (typeof renderDetail === 'function') { renderDetail(); } });