我理解问题所在了。我们需要更精确地处理列表中的代码块。以下是专门针对列表代码块渲染问题的修复方案,同时确保不影响现有的主题帖和回帖渲染:
复制代码 隐藏代码
<script>
const markdownProcessed = new WeakSet();
window.parseMarkdown = function(element) {
if (markdownProcessed.has(element)) return;
try {
if (element.innerHTML.includes('<markdown>')) {
element.innerHTML = element.innerHTML
.replace(/<markdown>/gi, '<markdown>')
.replace(/<\/markdown>/gi, '</markdown>');
}
const rawContent = element.textContent;
const preprocessed = rawContent
.replace(/\[x\]/g, '✅')
.replace(/\[ \]/g, '⬜');
marked.setOptions({
breaks: true,
gfm: true,
silent: true,
smartLists: false
});
const parsed = marked.parse(preprocessed);
element.innerHTML = DOMPurify.sanitize(parsed, {
ADD_TAGS: ['markdown']
});
markdownProcessed.add(element);
element.querySelectorAll('pre > code:not(.hljs), li > code:not(.hljs)').forEach((codeBlock) => {
if (codeBlock.parentNode.nodeName === 'LI') {
if (codeBlock.textContent.includes('```')) {
const pre = document.createElement('pre');
const codeContent = codeBlock.textContent
.replace(/```[a-z]*\n/g, '')
.replace(/\n```/g, '');
const newCode = document.createElement('code');
newCode.textContent = codeContent;
const langMatch = codeBlock.textContent.match(/```(\w+)/);
if (langMatch) {
newCode.className = `language-${langMatch[1]}`;
}
pre.appendChild(newCode);
codeBlock.parentNode.replaceChild(pre, codeBlock);
codeBlock = newCode;
}
}
if (!codeBlock.className) {
const languageMatch = codeBlock.textContent.match(/^(\w+)\n/);
if (languageMatch) {
codeBlock.className = `language-${languageMatch[1]}`;
}
}
hljs.highlightElement(codeBlock);
});
} catch (e) {
console.error('Markdown解析错误:', e);
element.innerHTML = DOMPurify.sanitize(element.innerHTML);
}
};
document.addEventListener('DOMContentLoaded', function() {
document.querySelectorAll('.t_f').forEach(td => {
if (td.innerHTML.includes('<markdown>') || td.querySelector('markdown')) {
parseMarkdown(td);
}
});
const observer = new MutationObserver(mutations => {
mutations.forEach(mutation => {
mutation.addedNodes.forEach(node => {
if (node.nodeType === 1) {
if (node.classList.contains('t_f')) {
parseMarkdown(node);
}
else if (node.querySelectorAll) {
node.querySelectorAll('.t_f').forEach(parseMarkdown);
}
}
});
});
});
observer.observe(document.body, {
childList: true,
subtree: true
});
});
$(document).ajaxStop(function() {
setTimeout(() => {
document.querySelectorAll('.t_f:not([data-processed])').forEach(el => {
parseMarkdown(el);
});
}, 300);
});
window.debugListCode = function() {
console.groupCollapsed('列表代码块状态');
document.querySelectorAll('li > code').forEach(codeBlock => {
console.log('列表中的代码块:', {
text: codeBlock.textContent.substring(0, 50) + (codeBlock.textContent.length > 50 ? '...' : ''),
containsBackticks: codeBlock.textContent.includes('```'),
parent: codeBlock.parentNode
});
});
console.groupEnd();
};
</script>
关键修复点 - 专门处理列表中的代码块:
复制代码 隐藏代码
if (codeBlock.parentNode.nodeName === 'LI') {
if (codeBlock.textContent.includes('```')) {
const pre = document.createElement('pre');
const codeContent = codeBlock.textContent
.replace(/```[a-z]*\n/g, '')
.replace(/\n```/g, '');
const newCode = document.createElement('code');
newCode.textContent = codeContent;
const langMatch = codeBlock.textContent.match(/```(\w+)/);
if (langMatch) {
newCode.className = `language-${langMatch[1]}`;
}
pre.appendChild(newCode);
codeBlock.parentNode.replaceChild(pre, codeBlock);
codeBlock = newCode;
}
}
复制代码 隐藏代码
.t_f li > pre {
margin: 10px 0;
padding: 12px;
background: #f8f9fa;
border: 1px solid #eaecef;
border-radius: 4px;
overflow: auto;
}
.t_f li > pre code {
background: none !important;
padding: 0 !important;
border: none !important;
border-radius: 0 !important;
}
使用说明:
- 将上述完整JS代码复制到footer.php
- 将CSS代码添加到header.php
- 在浏览器控制台执行
debugListCode()
查看列表代码块状态
如果问题仍然存在 - 最终解决方案
如果以上方案仍不能解决问题,请使用这个专门为列表代码块设计的解析器替代方案:
复制代码 隐藏代码
const parsed = marked.parse(preprocessed);
function customMarkdownParser(markdown) {
return markdown.replace(/(^(\s*)[-*]\s+.*\n)(\s*)```([\s\S]*?)```/gm, (match, p1, p2, p3, p4) => {
return `${p1}${p3}<pre><code>${p4}</code></pre>`;
});
}
const customParsed = customMarkdownParser(preprocessed);
const parsed = marked.parse(customParsed);
调试建议:
在代码块处理部分添加详细日志:
复制代码 隐藏代码
console.log('处理代码块:', {
isList: codeBlock.parentNode.nodeName === 'LI',
containsBackticks: codeBlock.textContent.includes('```'),
text: codeBlock.textContent.substring(0, 50) + (codeBlock.textContent.length > 50 ? '...' : '')
});
if (codeBlock.parentNode.nodeName === 'LI' && codeBlock.textContent.includes('```')) {
console.log('转换列表代码块');
console.log('原始内容:', codeBlock.textContent);
console.log('处理后内容:', codeContent);
}
这个方案专门针对列表中的代码块进行了深度处理:
- 精确识别包含```标记的列表代码块
- 自动移除```标记并提取纯代码内容
- 创建正确的
<pre><code>
结构
- 保留代码语言信息
- 应用正确的语法高亮
同时保留了您原有代码中主题帖和回帖渲染的所有功能。请尝试这个方案,它应该能解决列表代码块渲染问题。