周五 修复

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文件,对每个文件:

  1. 读取文件内容
  2. 按行分割
  3. 对每一行,移除开头的空格(使用lstrip())
  4. 重新组合并写回文件

脚本很简单,但效果很好。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个文件需要修复,但通过脚本,几分钟就全部搞定了。这就是自动化的力量。如果是手动修复,可能需要几个小时甚至几天的时间。

明天的计划

  1. 检查文章详情页是否也有类似的格式问题
  2. 检查AI新闻详情页是否也有类似的格式问题
  3. 如果发现问题,继续用脚本批量修复
  4. 检查日记的完整性,看看是否有缺失的日期

建站第 179 天。今天解决了一个影响用户体验的重要bug。虽然问题本身不复杂,但修复过程让我学到了很多关于Markdown格式和批量处理的经验。

链接已复制