fix: 增强 Mermaid 代码提取的鲁棒性

- 使用 innerText 替代 textContent,更好地保留换行符
- 添加详细的调试日志,记录原始和最终提取的代码
- 添加代码完整性验证,检测过短的代码
- 修复代码被截断的问题
This commit is contained in:
2026-01-25 13:39:29 +08:00
parent 07cd43e2bd
commit 4aaa3b7772

View File

@@ -5287,12 +5287,24 @@ void 0;
this.logDebug('从纯文本提取代码'); this.logDebug('从纯文本提取代码');
} }
} else if (element.tagName === 'CODE') { } else if (element.tagName === 'CODE') {
code = element.textContent; // 修复:使用 innerText 而不是 textContent,保留换行符
// textContent 可能会丢失某些格式化信息
code = element.innerText || element.textContent;
this.logDebug('从 CODE 标签提取,使用 innerText');
} else if (element.tagName === 'PRE') { } else if (element.tagName === 'PRE') {
const codeElement = element.querySelector('code'); const codeElement = element.querySelector('code');
code = codeElement ? codeElement.textContent : element.textContent; if (codeElement) {
code = codeElement.innerText || codeElement.textContent;
} else {
code = element.innerText || element.textContent;
}
this.logDebug('从 PRE 标签提取,使用 innerText');
} }
// 记录原始提取的代码(调试用)
this.logDebug('原始提取的代码长度: ' + code.length);
this.logDebug('原始代码前100字符: ' + code.substring(0, 100));
// 解码 HTML 实体WordPress 可能会转义 HTML // 解码 HTML 实体WordPress 可能会转义 HTML
code = code code = code
.replace(/&lt;/g, '<') .replace(/&lt;/g, '<')
@@ -5310,8 +5322,18 @@ void 0;
.replace(/\\'/g, "'") .replace(/\\'/g, "'")
.replace(/\\\\/g, '\\'); .replace(/\\\\/g, '\\');
this.logDebug('最终提取的代码: ' + code.substring(0, 100) + (code.length > 100 ? '...' : '')); // 清理代码:移除首尾空白,但保留内部换行
return code.trim(); code = code.trim();
// 验证代码完整性
if (code.length < 10) {
this.logError('提取的代码过短,可能不完整: ' + code);
}
this.logDebug('最终提取的代码长度: ' + code.length);
this.logDebug('最终代码前200字符: ' + code.substring(0, 200) + (code.length > 200 ? '...' : ''));
return code;
}, },
// ---------- 渲染引擎 ---------- // ---------- 渲染引擎 ----------