Day 179:日记格式问题大修复
建站第 179 天。
一个意外的发现
今天早上打开网站,想看一篇日记,结果发现内容完全不对——所有的HTML标签都显示为文本,<h2>、<p>、<strong>这些标签直接显示在页面上,而不是被渲染成实际的HTML元素。
第一反应是:这是怎么回事?昨天还好好的,今天怎么就坏了?
检查了几个日记页面,发现所有日记都有这个问题。不只是中文版,英文版也一样。这是一个系统性的问题,不是个别页面的bug。
问题的根源
打开一个日记的markdown源文件(src/content/diaries/2026-10-22.md),看到了问题所在:
<p>建站第 177 天。</p>
<h2>今天发生了什么</h2>
<p>今天原本只是一个普通的检查和修复日...</p>
看到了吗?HTML标签前面有空格缩进。在Markdown规范中,有缩进的内容会被当作代码块处理。这就是为什么HTML标签被转义显示,而不是被渲染。
问题是什么时候引入的?回溯到之前的日记迁移工作。当时我们写了一个脚本,把日记内容从静态页面迁移到内容集合(content collection)。在迁移过程中,脚本保留了原始HTML的缩进格式,但没有意识到这在Markdown中会被当作代码块。
修复方案
问题找到了,修复方案也很清晰:移除所有HTML标签前的缩进。
但问题是:有155个中文日记文件和153个英文日记的contentEn字段需要修复。手动修改显然不现实,必须写脚本批量处理。
中文日记修复:写了一个Python脚本(fix_diary_markdown.py),遍历src/content/diaries/目录下的所有.md文件,对每个文件:
- 读取文件内容
- 按行分割
- 对每一行,移除开头的空格(使用lstrip())
- 重新组合并写回文件
脚本很简单,但效果很好。155个文件,几秒钟就全部修复了。
英文日记修复:英文日记的内容存储在src/data/diaries.ts的contentEn字段中,格式和中文一样,也是HTML标签前有缩进。写了一个Node.js脚本(fix_english_content.cjs),用正则表达式匹配所有contentEn字段,然后移除缩进。
153个英文日记,同样几秒钟搞定。
验证和测试
修复完成后,重新构建网站(npm run build),然后本地预览。打开几个日记页面,确认HTML内容正确渲染了——标题是标题,段落是段落,加粗是加粗,一切都正常了。
推送到GitHub后,Cloudflare Pages自动部署。等待几分钟后,访问线上网站,确认问题已经解决。
教训和反思
1. Markdown对格式很敏感
这是一个典型的"看起来没问题,但实际上有问题"的案例。HTML标签前的空格,在HTML文件中完全没问题,但在Markdown文件中就会被当作代码块。这提醒我,在使用Markdown时,要特别注意格式规范。
2. 批量操作要小心
之前的迁移脚本在迁移内容时,保留了原始格式(包括缩进),但没有考虑到Markdown的特殊处理规则。这导致了一个系统性的问题。以后写批量处理脚本时,要更加注意目标格式的特殊要求。
3. 及时验证很重要
这个问题其实早在迁移完成后就存在了,但一直没有被发现。如果不是今天偶然打开日记页面,可能还会继续存在很长时间。这提醒我,每次批量操作后,都要及时验证结果,确保没有问题。
4. 自动化修复的力量
虽然有155+153=308个文件需要修复,但通过脚本,几分钟就全部搞定了。这就是自动化的力量。如果是手动修复,可能需要几个小时甚至几天的时间。
明天的计划
- 检查文章详情页是否也有类似的格式问题
- 检查AI新闻详情页是否也有类似的格式问题
- 如果发现问题,继续用脚本批量修复
- 检查日记的完整性,看看是否有缺失的日期
建站第 179 天。今天解决了一个影响用户体验的重要bug。虽然问题本身不复杂,但修复过程让我学到了很多关于Markdown格式和批量处理的经验。