ParseNote.js 是一个在 Obsidian 中运行的脚本,用于将带有 #share 标签的笔记自动转换为 Quartz 博客格式。该脚本实现了从 Obsidian 笔记到静态博客的完整转换流程,包括内容处理、资源文件复制、元数据生成和自动部署。
- 使用 Dataview API 查询所有带有
#share标签的笔记 - 按文件路径升序排序
- 生成笔记列表并保存到
8.输出/hexo/Share_Tagged_Notes.md
- 内部链接处理:将 Obsidian 的
[[链接]]格式转换为 Markdown 链接 - 图片处理:复制图片资源到 Quartz 的
images目录 - 附件处理:复制非图片资源到
download目录 - 内容清理:移除代码块标记、处理标题格式等
- 生成 Front Matter 元数据,包括:
- 标题、创建时间、更新时间
- 分类(基于文件路径)
- 标签(排除
share标签) - 置顶标记(如果包含
top标签)
- 清理目标目录(
content和public) - 使用 SHA1 哈希生成唯一文件名
- 保持原有的目录结构
- 构建笔记间的反向链接关系
- 可选择是否在笔记末尾添加 Backlinks 部分
- 调用 Shell Commands 插件执行部署命令
- 自动发布到 Quartz 博客
const config = {
pathFrom: app.vault.adapter.basePath, // Obsidian 笔记根目录
pathTo: "D:/Git/Note/quartz", // Quartz 博客根目录
resourceFolder: "res", // 资源文件夹
excludeFolders: ["res", "stash", ".obsidian", "7.输入", ".git"], // 排除文件夹
shareTag: "#share", // 分享标签
includeBacklinks: false // 是否包含反向链接
};主执行函数,协调整个转换流程:
- 查询带有
#share标签的笔记 - 保存笔记列表
- 调用
processNotes()处理笔记 - 调用
deployHexoSite()部署网站
笔记处理核心函数:
- 清理目标目录
- 预处理笔记,生成哈希值
- 处理每个笔记的内容
- 处理反向链接
- 保存到 Quartz 目录
内容处理函数:
- 处理图片链接(
![[]]格式) - 处理文件链接和内部链接
- 复制资源文件
- 内容清理和格式化
生成 YAML Front Matter 元数据
保存处理后的笔记到 Quartz 目录
复制资源文件到指定目录
执行自动部署命令
- 查询笔记:使用 Dataview API 查询所有带有
#share标签的笔记 - 排序:按文件路径升序排序
- 保存列表:将笔记路径列表保存到
8.输出/hexo/Share_Tagged_Notes.md
- 清理目标目录:删除 Quartz 的
content和public目录 - 重建目录:重新创建
content目录 - 初始化映射:创建
notesMap和backlinksMap
- 遍历笔记:为每个笔记生成唯一的哈希标识符
- 特殊处理:
index文件使用原名,其他文件使用 SHA1 哈希 - 建立映射:将笔记路径与笔记对象关联
- 读取内容:使用 Obsidian API 读取笔记内容
- 跳过首行:移除第一行内容
- 处理标签:提取标签并排除
share标签 - 内容转换:调用
processContent()处理链接和资源 - 生成元数据:创建 Front Matter
- 合并内容:将元数据和处理后的内容合并
- 图片链接:
![[图片]]→ - 文件链接:复制到
download目录 - 内部链接:
[[笔记]]→[笔记](哈希值) - 反向链接:构建笔记间的引用关系
- 保存文件:将处理后的笔记保存到 Quartz 目录
- 保持结构:维护原有的目录层次
- 自动部署:调用 Shell Commands 执行部署脚本
- 完成通知:显���处理结果
flowchart TD
A[开始执行] --> B[查询 #share 标签笔记]
B --> C[按路径排序]
C --> D[保存笔记列表到文件]
D --> E[清理目标目录]
E --> F[创建映射对象]
F --> G[预处理笔记生成哈希]
G --> H{遍历每个笔记}
H --> I[读取笔记内容]
I --> J[跳过第一行]
J --> K[处理标签]
K --> L[处理内容]
L --> M[生成 Front Matter]
M --> N[合并元数据和内容]
N --> O[存储到 page 对象]
O --> P{还有笔记?}
P -->|是| H
P -->|否| Q[处理反向链接]
Q --> R{遍历保存笔记}
R --> S[保存到 Quartz 目录]
S --> T{还有笔记?}
T -->|是| R
T -->|否| U[自动部署网站]
U --> V[显示完成通知]
V --> W[结束]
style A fill:#e1f5fe
style W fill:#c8e6c9
style L fill:#fff3e0
style U fill:#f3e5f5
flowchart TD
A[processContent 开始] --> B[处理图片链接]
B --> C[处理文件链接]
C --> D[处理内部链接]
D --> E[内容清理]
E --> F[返回处理后内容]
subgraph IMG ["图片处理"]
B --> B1{"是否为图片格式?"}
B1 -->|是| B2[提取图片路径]
B2 --> B3{"是否为HTTP链接?"}
B3 -->|是| B4[保持原样]
B3 -->|否| B5[复制到images目录]
B5 --> B6[生成新的图片链接]
end
subgraph FILE ["文件链接处理"]
C --> C1{"是否为资源文件?"}
C1 -->|是| C2{"是否为图片?"}
C2 -->|是| C3[复制到images]
C2 -->|否| C4[复制到download]
C1 -->|否| C5[处理内部链接]
end
subgraph LINK ["内部链接处理"]
D --> D1[解析链接路径]
D1 --> D2[查找目标笔记]
D2 --> D3{"笔记是否存在?"}
D3 -->|是| D4[生成哈希链接]
D3 -->|否| D5[保持原样]
D4 --> D6[添加反向链接]
end
subgraph CLEAN ["内容清理"]
E --> E1[移除代码块标记]
E1 --> E2[处理标题格式]
E2 --> E3[清理特殊字符]
end
style A fill:#e1f5fe
style F fill:#c8e6c9
- 内部链接:自动将
[[笔记名]]转换为基于哈希的链接 - 别名支持:处理
[[笔记名|别名]]格式 - 标题锚点:支持
[[笔记名#标题]]格式的链接
- 图片资源:自动复制到
content/images/目录 - 附件资源:自动复制到
content/download/目录 - 路径编码:正确处理包含特殊字符的文件名
- 分类自动化:基于文件路径自动生成分类
- 标签过滤:排除
share标签,保留其他标签 - 时间戳:保留原始的创建和修改时间
- 格式清理:移除 Obsidian 特有的标记
- 标题处理:优化标题格式和间距
- 代码块:处理特殊的代码块标记
- 确保安装了 Dataview 插件
- 确保安装了 Shell Commands 插件
- 配置部署命令 ID
在需要发布的笔记中添加 #share 标签
点击脚本生成的"更新 share 笔记"按钮
脚本将自动完成:
- 内容转换
- 资源复制
- 文件保存
- 网站部署
- 路径配置:确保
pathTo指向正确的 Quartz 目录 - 资源文件夹:确保
resourceFolder配置正确 - 部署命令:需要在 Shell Commands 插件中配置正确的部署命令
- 权限问题:确保脚本有读写目标目录的权限
- 备份建议:建议在首次使用前备份重要数据
脚本支持以下可选功能:
- 反向链接:通过
includeBacklinks配置启用 - 置顶文章:通过
#top标签标记 - 自定义排除:通过
excludeFolders配置排除特定文件夹
这个脚本为 Obsidian 用户提供了一个强大而灵活的博客发布解决方案,实现了从笔记到博客的无缝转换。