Word转换HTML

将Word(.docx)内容自动转换为语义清晰的HTML结构,支持拖放上传与结果预览,处理全程在本地完成,安全高效。

拖放Word文件到此处

或点击选择文件

支持.docx格式,所有处理均在本地完成

${escapeHtml(title)} ${content} `; } // === UI 状态切换 === function showLoading(text) { uploadSection.classList.add('hidden'); resultSection.classList.add('hidden'); statusSection.classList.remove('hidden'); loadingStatus.classList.remove('hidden'); errorStatus.classList.add('hidden'); if (text) loadingText.textContent = text; } function showError(message) { uploadSection.classList.add('hidden'); resultSection.classList.add('hidden'); statusSection.classList.remove('hidden'); loadingStatus.classList.add('hidden'); errorStatus.classList.remove('hidden'); errorMessage.textContent = message || getI18nText('toolPage.convertFailed', '转换失败'); } function resetTool() { wordFile = null; htmlContent = null; htmlPreview.innerHTML = ''; htmlCode.textContent = ''; fileNameEl.textContent = ''; uploadSection.classList.remove('hidden'); statusSection.classList.add('hidden'); resultSection.classList.add('hidden'); switchTab('preview'); } // === 工具函数 === function readFileAsArrayBuffer(file) { return new Promise((resolve, reject) => { const reader = new FileReader(); reader.onload = () => resolve(reader.result); reader.onerror = () => reject(new Error('文件读取失败')); reader.readAsArrayBuffer(file); }); } function formatHtml(html) { if (!html) return ''; let formatted = ''; let indent = 0; const tokens = html.replace(/>\s*\n<').split('\n'); for (const token of tokens) { const trimmed = token.trim(); if (!trimmed) continue; if (trimmed.startsWith('$/) && !trimmed.match(/^<(img|br|hr|input|meta|link)\b/i)) { indent++; } } return formatted.trim(); } function escapeHtml(str) { if (!str) return ''; return String(str).replace(/&/g, '&').replace(//g, '>').replace(/"/g, '"'); } function showToast(message, type = 'info') { statusToast.className = 'fixed bottom-4 left-1/2 transform -translate-x-1/2 px-4 py-2 rounded-lg text-sm'; statusToast.classList.remove('hidden'); statusToast.style.background = type === 'success' ? 'var(--color-success, #10b981)' : type === 'error' ? 'var(--color-danger, #ef4444)' : '#374151'; statusToast.style.color = '#fff'; statusToast.textContent = message; setTimeout(() => { statusToast.classList.add('hidden'); }, 3000); } // === 初始化 === document.addEventListener('DOMContentLoaded', initEventListeners);