0%

python实现批量往hexo文章添加YAML头

最近在kali用的比较多,于是想把Hexo也迁移过来,所以进行了一些工作,但是等到迁移完成之后,编译的时候就傻眼了,时间全乱了……

原本的文章发布时间全都看不到了,变成了执行hexo g命令的时间。

于是到处去寻找解决办法,发现原来是YAML文件头的问题。

因为之前写博客都是在windows下,所以开新文档的时候基本上没有使用hexohexo new命令,都是用typora新开一个文档就开始弄,然后手动创建一个文件夹存放图片等依赖文件,只有生成静态页面和发布的时候才用到了hexo的命令。

而用hexo new生成新文章的时候,hexo会自动创建同名文件夹用来存放图片,并在文章对应的markdown文件开头添加YAML信息,包括了文章的title,发布时间,tags等一些信息,而生成静态文件的时候,文章的发布日期就是在YAML头部信息中获取的。

平时我写文档的时候,都是手动指定title,所以markdown文件的YAML头部信息中就只有title,没有其他信息。

在生成静态文件的时候,如果没有指定发布日期,那么hexo会把文件的修改时间当成发布时间。

然而当我们迁移了目录之后,文件的修改时间被改变了,所以生成的时候,导致发布时间全都变成了最后的修改时间。

那么解决办法也很简单,手动将发布时间写入YAML头部信息即可。但是文件太多了,手动修改太麻烦,于是我写了个脚本来解决。

由于markdown文件本身是文本文件,所以本质上是将特定格式的字符串写入文件开头。

python脚本如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# 更新hexo博客文章的文件头,批量增加信息
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import os
import re
import time

def insert_info(old, file_name, file_data):
new_info = ["---\n"]
try:
if old["title"]:
new_info.append("title: {}\n".format(old["title"]))
except:
new_info.append("title: {}\n".format(file_name))
new_info.append("date: {}\n".format(file_data))
new_info.append("categories: \n")
new_info.append("tags: \n")
new_info.append("---\n")
return new_info

def modify_md_content(top):
info_columns = ["title", "date", "categories", "tags"]
for root, dirs, files in os.walk(top, topdown=False):
# 循环文件
for file_name in files:
file_name_split = file_name.split('.')

try:
if file_name_split[-1] == 'md':
# 找到md文件并且复制md文件路径
md_file_path = os.path.join(root, '.'.join(file_name_split))
# 添加字典存放yaml信息
yaml_info = {}
# 打开md文件然后进行替换
with open(md_file_path, 'r', encoding='utf8') as fr:
# 按行读取md文件
data = fr.readlines()
# 此时说明有文章信息
if "---" in data[0]:
for i,line in enumerate(data[1:]):
# 直到下一个---时退出
if "---" in line:
index = i + 1
break
else:
index = 0
# 从yaml头中解析title等字段并保存
tmp = line.replace(" ", "").replace("\n", "").split(":")
yaml_info[tmp[0]] = tmp[1]
# 获取文件修改时间
time_array = time.localtime(os.path.getmtime(file_name))
update_time = time.strftime("%Y-%m-%d %H:%M:%S", time_array)
# 生成新的YAML头
data_inser = insert_info(yaml_info, file_name_split[0], update_time)
# 修改YAML头
data = data_inser + data[index+1:]

print(data_inser)

with open(md_file_path, 'w', encoding='utf8') as fr:
for line in data:
fr.write(line)

except FileNotFoundError as e:
print(e)

if __name__ == '__main__':
top = r'./'
modify_md_content(top)

然后将脚本放到/blog/source/_posts 文件夹下运行即可。