Obsidian里一键发布&预览Hexo博客

三葉Leaves Author

本文章能帮你实现仅在Obsidian里,完成从写作、部署到发布的全流程。如果你使用Obsidian + Hexo + Git&Netlify&Vercel这种类型的工作流,这将对你十分受用

1. 编写脚本

编写一键发布脚本

将如下代码粘贴进记事本,并且重命名成DeployBlog.bat这样的批处理文件,最好保存在你博客的根目录下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@echo off
:: 下面替换成你的博客项目地址如:D:\Projects\LeavesBlog
cd /d "你博客的项目地址"
setlocal
:: 获取年、月、日
for /f "tokens=2 delims==" %%a in ('wmic os get localdatetime /value') do set "dt=%%a"
set "year=%dt:~0,4%"
set "month=%dt:~4,2%"
set "day=%dt:~6,2%"
:: 获取小时、分钟、秒
set "hour=%dt:~8,2%"
set "minute=%dt:~10,2%"
set "second=%dt:~12,2%"
:: 构建日期字符串
set "DATE=%year%-%month%-%day% %hour%:%minute%:%second%"
:: 执行Hexo生成和Git命令
hexo g && git add . && git commit -m "ArticlePublish[%DATE%]" && git push
endlocal
pause

编写一键预览脚本

同样的逻辑,这次我将编写好的文本文档保存为LocalServer.bat 。命令里只用到了一个hexo s,那是因为我们在obsidian里只会改动到.md文件,而这种文档,hexo是会实时更新的(只需浏览器里刷新网页就能查看变动)

1
2
3
@echo off
cd "D:\Projects\LeavesBlog" && start http://localhost:4000 && hexo s
pause

2. 将脚本嵌入Obsidian

我们先在Obsidian里新建一个Markdown文档,我这里命名为shortcuts.md,最好放在根目录下。
由于在Obsidian里可以使用![]()来插入文件,所以可以这样写:
![一键发布](DeployBlog.bat)
![一键预览](LocalServer.bat)
前提是你Obsidian的仓库地址必须和博客的项目地址相同
圆括号里可以用相对路径,但是貌似用不了绝对路径,因为一用绝对路径它会把链接当成图像来处理。 最终效果如下:

完成后的效果
完成后的效果

如此一来,以后我们写完Obsidian文章,就无需再开启IDE或者开终端去打指令了,那样做割裂感太强,一点也不优雅。以后我们直接在Obsidian里点击那个按钮就行。

3. 编写计划任务

如果你连那个按钮都懒得点,只想专注于写作的话,那给Windows添加一个计划任务,使其每次检测到Obsidian关闭时,自动执行Deploy.bat那个脚本就行了。

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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
from git import Repo  
from datetime import datetime
import os
import re
import subprocess
import sys


def format_commit_message(message):
"""
格式化commit消息
如果消息格式为"ArticlePublish[yyyy-mm-dd HH:MM:SS]",
则转换为"于[yyyy-mm-dd HH:MM:SS]更新了文章"
""" pattern = r"ArticlePublish\[(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})\]"
match = re.match(pattern, message.strip())
if match:
timestamp = match.group(1)
return f"于[{timestamp}]更新了文章"
return message.strip()


def write_header(file):
"""
写入文章头部内容
""" header = '''---
title: 叶子的Blog网站更新日志
date: 2024-11-10 04:00:00
updated: tags:
- 日志
- 建站
- 运维
permalink: Gitlog
excerpt: 💡该文档能帮助你知道 我的Blog网站 的任何更新情况,无论是新增功能、文章更新还是bug修复。内容由 Python 脚本根据我的 Git 记录自动生成💡
cover: https://ybkjzj.com:5555/d/webImage/%E8%88%AA%E5%A4%A9%20%E5%9C%B0%E7%90%83%20%E8%88%AA%E6%8B%8D%E7%85%A7%E7%89%87%204k%E9%A3%8E%E6%99%AF%E5%A3%81%E7%BA%B8_%E5%BD%BC%E5%B2%B8%E5%9B%BE%E7%BD%91.jpg
comment: true
categories:
---
{% note primary fa-regular fa-robot %} 该文是我编写的`Python`脚本根据我的`Git`记录**动态生成**的。 {% endnote %}
> 💡该文档能帮助你知道 我的Blog网站 的**任何更新**情况,无论是新增功能、文章更新还是bug修复。
> 💡你可以把它理解为我整个网站的**更新日志**。如此以来,我最近对我的网站做了什么,有没有发布新文章便都一目了然了。 \n\n\n---\n'''

file.write(header)


def get_commit_history(repo_path, output_file):
"""
读取git仓库的commit历史并输出为markdown格式

Parameters: repo_path (str): git仓库的本地路径
output_file (str): 输出markdown文件的路径
""" try:
# 打开git仓库
repo = Repo(repo_path)

# 获取所有commit
commits = list(repo.iter_commits('main'))

with open(output_file, 'w', encoding='utf-8') as f:
# 写入自定义头部
write_header(f)

# 遍历每个commit
for commit in commits:
# 格式化commit时间
commit_time = datetime.fromtimestamp(commit.committed_date).strftime('%Y-%m-%d %H:%M:%S')

# 获取修改的文件列表
files_changed = []
try:
for parent in commit.parents:
diff = parent.diff(commit)
files_changed.extend([d.a_path for d in diff])
except:
pass

# 处理commit信息
formatted_message = format_commit_message(commit.message)

# 构建GitHub commit链接
github_url = f"https://github.com/LeavesWebber/LeavesBlog/commit/{commit.hexsha}"
# 写入commit信息
f.write(f'---\n')
f.write(f'### 🔄 版本号: [{commit.hexsha[:8]}]({github_url})\n\n')
f.write(f'**发布者:** 三葉Leaves <{commit.author.email}>\n\n')
f.write(f'**更新日期:** {commit_time}\n\n')
f.write('{% note blue fa-bolt %}#### ' + formatted_message + '{% endnote %} \n')
f.write(f' \n')
f.write(f'---\n')

print(f'Commit history has been exported to {output_file}')

except Exception as e:
print(f'Error: {str(e)}')


def execute_commands(repo_path, commit_message):
"""
执行Hexo和Git命令
""" # 设置 Git 环境变量,确保正确处理中文
my_env = os.environ.copy()
my_env["LANG"] = "zh_CN.UTF-8"
commands = [
'hexo clean',
'hexo g',
'hexo d',
'git add .',
f'git commit -m "{commit_message.encode("utf-8").decode("utf-8")}"', # 确保正确编码
'git push'
]

try:
# 切换到仓库目录
os.chdir(repo_path)

# 依次执行命令
for cmd in commands:
print(f'执行命令: {cmd}')
# 使用 Popen 替代 run,以更好地控制输入输出
process = subprocess.Popen(
cmd,
shell=True,
env=my_env,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
encoding='utf-8',
errors='ignore'
)

# 等待命令执行完成并获取输出
stdout, stderr = process.communicate()

if process.returncode == 0:
print(f'{cmd} 执行成功')
if stdout:
print(stdout)
else:
print(f'{cmd} 执行失败')
if stderr:
print(stderr)

except Exception as e:
print(f'发生错误: {str(e)}')


# 使用示例
if __name__ == '__main__':
# 检查命令行参数
if len(sys.argv) != 2:
print('使用方法: python3 publish.py "commit消息"')
sys.exit(1)

# 获取commit消息并确保正确编码
try:
commit_message = sys.argv[1].encode('utf-8').decode('utf-8')
except UnicodeError:
# 如果编码失败,尝试其他编码方式
try:
commit_message = sys.argv[1].encode('gbk').decode('utf-8')
except UnicodeError:
commit_message = sys.argv[1]

# 设置路径
repo_path = r"D:\Projects\LeavesBlog"
output_file = r"D:\Projects\LeavesBlog\source\_posts\Blog建站\叶子的Blog网站更新日志.md"
# 生成更新日志
get_commit_history(repo_path, output_file)

# 执行所有命令
execute_commands(repo_path, commit_message)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@echo off  
chcp 65001
cd /d "D:\Projects\LeavesBlog"
setlocal
:: 获取年、月、日
for /f "tokens=2 delims==" %%a in ('wmic os get localdatetime /value') do set "dt=%%a"
set "year=%dt:~0,4%"
set "month=%dt:~4,2%"
set "day=%dt:~6,2%"
:: 获取小时、分钟、秒
set "hour=%dt:~8,2%"
set "minute=%dt:~10,2%"
set "second=%dt:~12,2%"
:: 构建日期字符串
set "DATE=%year%-%month%-%day% %hour%:%minute%:%second%"
:: 执行Python脚本
python.exe publish.py "于[%DATE%]更新了文章"
endlocal
pause
  • 标题: Obsidian里一键发布&预览Hexo博客
  • 作者: 三葉Leaves
  • 创建于 : 2024-11-08 00:00:00
  • 更新于 : 2024-11-21 16:56:20
  • 链接: https://leavesblog.netlify.app/a36c83735b20/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论