段落和列表中间添加空行的脚本
升级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下区别。