边界情况:超长行、同一天、空标签
这篇专门去撞几个容易出问题的地方。
一、同一天的两篇文章
这篇和 002_markdown_全特性.md 都是 2026-10-16。
日期相同的时候,索引里按路径排:002_... 在 005_... 前面。文章索引同时喂给三处,所以三处应该看到同一个顺序:
/feed.xml:002 排在 005 前面/search?q=的结果- 上一篇/下一篇:005 页面底下左边的“←”指向 002,002 页面底下右边的“→”指向 005
另外注意区别:/posts/ 这个目录页是树的顺序,按文件名排,它不关心 front matter 里的日期。日期排序只发生在文章索引那三处。
二、tags 里留了空位
front matter 里写的是 tags: 边界, 测试, , 长行,中间那个逗号后面什么都没有。
解析器会把空项丢掉,所以标签只有三个:#边界、#测试、#长行。不应该出现一个空的 #。
三、不写 summary
summary 字段被我省略了。列表页和搜索结果会退回用正文第一行当摘要,而不是显示空白,也不该把整段正文塞进去。
实际结果是:列表里这一篇的摘要变成了“边界情况:超长行、同一天、空标签”——因为源文件正文的第一行就是这个一级标题,取首行时只去掉了行首的 #,没有跳过它。这不算 bug(摘要本来就只是一行占位),但值得知道:标题去重只发生在网页正文里,不影响摘要取值。想让摘要好看,还是老实写 summary。
对比一下:004_没有front_matter.md 不是文章,列表里只有文件名和大小,连摘要行都没有。
四、不认识的 front matter 字段
上面那行 author: 是故意的。front matter 里出现不认识的键,应该被安静忽略——不报错、不渲染、不影响其它字段。哪天想加 draft: true 这种字段,加之前得先在解析器里实现,光写在文件里是没用的。
五、超长行
下面这一整段是一行,没有换行符:
中华人民共和国国家标准《标点符号用法》里规定,句号、逗号、顿号、分号、冒号、问号、叹号、引号、括号、省略号、破折号各有各的位置,中文排版的行宽通常建议每行 30 到 40 个汉字,而终端窗口在手机上可能只有 28 列,于是这一段在窄屏上必须靠软换行来处理,否则就会横向溢出;如果这个页面在手机上出现了横向滚动条,那说明长行的处理是有问题的,因为 markdown 里根本没有换行符可以依赖,能靠的只有 CSS 的 overflow-wrap 和终端渲染器的列宽计算——这是一段故意写得很长很长很长很长很长很长很长很长很长的单行文本,用来确认自动换行确实生效。
再给一个没有任何空格可断的超长"单词",模拟一条不会换行的长 URL:
https://blog.example.com/posts/005_边界情况.md?raw=1&utm_source=longtest&utm_medium=none&utm_campaign=overflow-wrap-test&x=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
六、中文里的 emoji 与混合字符
🚀 终端博客、📝 markdown、🐧 Linux、🇨🇳 中文、a→b←c、①②③、〇、(全角括号)、「引号」。
行内混排:ssh -p 2222 localhost 和 ssh -p 2222 localhost 看起来差不多,但一个是代码一个是普通文字。
测试一下容易出错的组合:><!--、&、<b>粗体</b>、a\b、100%、$HOME、#注释。
七、制表符与深缩进
代码块里的制表符应该稳定占一个缩进位,而不是跳到第 8 列:
func main() {
if len(os.Args) > 1 {
switch os.Args[1] {
case "help":
fmt.Println("help")
}
}
}
列表里嵌四层,看缩进会不会串位:
- 一层
- 二层
- 三层
- 四层,这里的内容比较长,目的是让这一层也发生一次软换行,看看缩进标记会不会跟着内容一起折行而不对齐。
- 五层
- 四层,这里的内容比较长,目的是让这一层也发生一次软换行,看看缩进标记会不会跟着内容一起折行而不对齐。
- 三层
- 二层
八、空行与连续空行
上面故意留了几行空行。
现在应该只看到一段正常的垂直间距,而不是四个空行叠在一起。
九、结尾没有换行
下面这行是文件的最后一行,后面没有额外的空行,某些工具会在这里报警告,但渲染结果应该看不出区别。
结束。