段落和列表中间添加空行的脚本

升级Hexo到v8.5.0之后,发现mathjax不能正确显示公式。看了下文档,发现推荐的hexo renderer是hexo-renderer-pandoc,而目前使用的是hexo-renderer-kramed,而且这个包已经不再更新也不推荐使用了。

那就换用hexo-renderer-pandoc,虽然公式能正常渲染,但又有新的问题,一是内嵌html不能正确识别,另一个是引用和列表展示不换行。

Markdown内嵌html不要缩进

内嵌html的问题好解决,markdown本身是不推荐直接内嵌html的,所以支持不好也难免。但好在发现了解决方案,就是每行都不缩进即可正确渲染。这一点和文档似乎有出入,文档的意思应该是只要首尾行不缩进,像<div>中间的内容就会被解析成html。但尝试之后依然失败,干脆所有内嵌的html都不缩进就OK了,像这样:

<div class="card">
<img class="ava" src="" />
<div class="card-header">
<div><a href="h" target="_blank">xxx</a></div>
<div class="info">yyy</div>
</div>
</div>

列表和引用不换行

参考这里,如果原始的markdown是这样:

list
* first item
* second item
* third item

则pandoc渲染出来后是这样:

list * first item * second item * third item

而我们期望的是这样:

list

  • first item
  • second item
  • third item

所以标准markdown的写法应该是:

list

* first item
* second item
* third item

研究发现之前写markdown的语法不太规范,之前在列表之前不加空行用的是CommonMark的语法,而主流的markdown语法为了避免误渲染,是要求在列表之前加空行的。同理,对于数字列表、块引用{% blockquote %}> xxx也需要在前面加空行:

list

1. first item
2. second item
3. third item


quote:

> xxx
> yyy
> zzz

考虑到markdown文件很多,手改一遍繁琐易错,于是写了个python脚本来做CommonMark到标准Markdown语法的转换:

import glob
import re

def Convert(lines):
    result = []
    previous_line = ''
    for line in lines:
        result.append(previous_line)
        if (line.startswith('* ') and not previous_line.startswith('* ')) \
           or (line.startswith('> ') and not previous_line.startswith('> ')) \
           or (line.startswith('{% blockquote') and not previous_line.startswith('{% blockquote')) \
           or (re.match('^\d\.', line) and not re.match('^\d\.', previous_line)):
            result.append('\n')
            print ("---")
            print (previous_line)
            print (line)
        previous_line = line
    result.append(previous_line)
    return result

if __name__ == '__main__':
    for md in glob.glob("./source/_posts/*.md"):
        print("Process:" + str(md))
        lines = []
        with open(md, 'r') as f:
            lines = f.readlines()
        result = Convert(lines)
        with open(md, 'w') as f:
            f.writelines(result)

上面脚本简单粗暴,可能会有一些误伤,比如会把引用中的一些不应该加空行的内容也加上空行,所以运行以上脚本之后还需要再人工审阅下为妙,可以在运行之前用git进行版本控制,然后diff下区别。