东亚文字 Markdown 换行变空格的问题
最近新遇到一个老问题。
在把大部分笔记转换成文本格式的时候我开始让自己习惯用 Emacs 的 fill-paragraph
来保持对齐。跟现代编辑器常见的“折行”不同,fill-paragraph
的功能是用“硬”换行来保持每行对齐在一定宽度。这样写完之后即使用其他的工具打开也能保持原有的格式,例子的话可以参考文本的 RFC。另外用这种方法也是为了规避 Emacs 以及其他不少文本编辑器在折行上的一个问题:不能很好的判断中日韩文字的分词,只能按照空格来折行。
其他的都还好,但在写 blog 的时候遇到一个问题,markdown,或者更准确的说是HTML/CSS 在渲染段落的时候,会自动把换行替换成空格1。这对于英文或者其他空格间隔单词的字母文字来说是正确的,但对于不用空格间隔单词的中日韩文来说就会带来一个多余的空格:
上面是 HTML 的代码,注意段落中的换行是在“是个”跟“有点”之间;下面是渲染的结果,可以看到这个换行变成了句子里多余的空格。
这个问题虽然不热门,但仔细搜一搜也能找到不少讨论,解决方案不外乎两个思路
- 在 markdown 编译之前处理一遍源文件,去掉硬换行。
- 修改 jekyll 或者其他静态网站生成器,或者利用插件,在最终生成 HTML 的时候去掉段落里的换行。我之前用过这个选项2
但 markdown 只是按照简单的规则对 HTML 的简写,这个问题归根结底是 HTML/CSS 没有处理好中日韩等(好奇还有没有“等”?)东亚文字的段落。所幸 CSS3 的草案中已经有对这个问题的考虑3,目前来看,Firefox 59 已经有能看得到的支持,Safari 11.1 和 Chrome 65 还没有。
所以结论是我不打算在这个问题上花精力了,典型的不是我是世界的错(´▽`)
,等 CSS3和各大渲染引擎的实现吧。实在有碍观瞻的文章我会用一个 unfill-paragraph
的函数跑一遍,其他的就请优先使用 Firefox 或者忍忍好了🙃。
Fin.
-
假设是
white-space:normal;
的情况,常见、也让描述简单一些。 ↩ -
http://blog.guorongfei.com/2015/04/25/how-to-fix-the-markdown-newline-blank-problem/ ↩