今日问题与解决方案整理(Hexo Butterfly 主题博客搭建 + 网络安全笔记迁移)
今日问题与解决方案整理(Hexo Butterfly 主题博客搭建 + 网络安全笔记迁移)
一、Markdown 笔记批量迁移到 Hexo
1. 问题:本地笔记(D:\Blog\ 小迪学习笔记)迁移到 Hexo _posts 目录
需求:批量迁移大量网络安全笔记,自动生成 Hexo 所需 Front-matter(避免手动修改),要求 title 用笔记文件名,categories/tags 固定为网络安全相关分类。
解决方案:使用 Python 迁移脚本(自动添加 Front-matter + 复制文件):
1 | import os |
- 使用步骤:
将脚本保存为 migrate_notes.py,放在 D:\Blog 目录(与笔记源目录同级)。
打开 CMD 命令行,执行 cd D:\Blog 切换到脚本目录。
运行 python migrate_notes.py,等待脚本完成所有笔记迁移。
二、Hexo 构建(hexo g)报错解决
1. 问题 1:Nunjucks Error(无法解析 SSTI 代码中的 {{ }} 语法)
报错信息:Unable to call class.base.subclasses, which is undefined or falsey。原因是笔记中 SSTI 渗透测试代码的 {{ }} 被 Hexo/Butterfly 主题的 Nunjucks 模板引擎误解析为模板语法。
解决方案:如果代码块中含有
{{ }},必须用` 和 `包裹,避免模板引擎解析。例如:
1 | import os |
2. 问题 2:unknown block tag: endraw( 成对 / 嵌套错误)
- **报错原因**:正文中误加多余的 {% raw %}/{% endraw %}(如表格、列表中),或 {% raw %} 未完整包裹代码块导致标签不成对。
- **解决方案**:用脚本清理正文中多余的 raw 标签,仅保留代码块内的有效 raw 标记:
{% raw %}
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
import os
# 配置 Hexo 文章目录
posts_dir = r"D:\BlogFile\source\_posts"
for filename in os.listdir(posts_dir):
if filename.endswith(".md"):
file_path = os.path.join(posts_dir, filename)
with open(file_path, "r", encoding="utf-8") as f:
lines = f.readlines()
new_lines = []
in_code_block = False
code_block_content = []
for line in lines:
stripped_line = line.strip()
# 跳过正文中单独的 raw 标签(非代码块内)
if stripped_line in ("{% raw %}", "{% endraw %}"):
continue
# 处理代码块
if stripped_line.startswith("```"):
if not in_code_block:
in_code_block = True
code_block_content = [line]
else:
code_block_content.append(line)
in_code_block = False
# 含 {{ 的代码块加 raw 包裹
if any("{{" in c for c in code_block_content):
new_lines.append("{% raw %}\n")
new_lines.extend(code_block_content)
new_lines.append("{% endraw %}\n")
else:
new_lines.extend(code_block_content)
elif in_code_block:
code_block_content.append(line)
else:
new_lines.append(line)
# 写回处理后的内容
with open(file_path, "w", encoding="utf-8") as f:
f.writelines(new_lines)
print(f"已清理多余 raw 标签:{filename}")
print("所有文章 raw 标签错误修复完成!")
{% endraw %}
1 | import os |
三、Hexo 图片路径适配问题
1. 问题:本地 Windows 路径(C:\Users…\image.png)无法显示
原因:Hexo 生成的是静态网页,无法访问本地电脑的绝对路径(如 C:\Users\…\image.png),仅支持项目内相对路径或网络图片 URL。
解决方案:用脚本自动迁移本地图片到 Hexo 图片目录,并替换 Markdown 中的路径:
1 | import os |
- 关键说明:
脚本仅匹配 Typora 默认截图路径(C:\Users...\image-xxxx.png),若图片路径不同,可修改 img_path_pattern 正则表达式。
迁移后图片存储在 Hexo 项目的 source/img 目录,文章中路径变为 /img/xxx.png(Butterfly 主题可直接识别)。
四、其他关键问题
1. 问题:Butterfly 主题 cover 字段不填的影响
答案:
- 不填 cover:文章列表页(首页 / 分类页)的文章卡片无自定义封面,显示主题默认背景(无报错,功能完全正常)。
- 填 cover:需配置 cover: /img/xxx.webp(图片需放在 source/img 目录),列表页和文章详情页顶部会显示自定义封面,提升视觉效果;若需统一封面,可在主题配置文件中设置默认封面。
五、核心工具 / 命令总结
| 操作场景 | 关键命令 / 工具 |
|---|---|
| Hexo 文章预览 | hexo clean && hexo g && hexo s(清理缓存→生成静态文件→启动本地服务器,访问 http://localhost:4000) |
| Hexo 文章部署 | hexo d(需提前配置 GitHub Pages/Gitee Pages 等部署目标) |
| Markdown 笔记迁移 | 上述 migrate_notes.py 脚本 |
| 代码块 {{ }} 解析修复 | 上述 fix_code_raw.py 脚本 |
| 本地图片路径适配 | 上述 migrate_imgs.py 脚本 |
| 批量转换 WebP 图片(可选) | Windows 批处理脚本 toWebp.bat(依赖 Google cwebp 工具) |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 0xMouise!




