Obsidian 写博客发布到 Astro 博客项目
本文通过 evisx/obsidian-content-publisher 导出
- Astro 博客项目1 (使用
git
版本管理) - Obsidian 和 插件 (obsidian-content-publisher)
场景
博客文章原文都放在 Obsidian vault 的某个文件夹下 (假设 Blog
)。需要某种形式复制一份到博客项目里。
可以手动转换:
- 拷贝博客文章到 astro 项目的内容文件夹2下 (假设
src/content/posts/
) - 将 frontmatter3转换为项目需要的 (schema4)
- 同时将文章 (同时也是笔记) 内 Obsidian 的 Wikilink5 处理成可以访问的 Markdown Link
插件做了什么?
将上述的过程自动化,同时提供 frontmatter 转换的配置表 (支持少量的 js 代码 {{script}}
)。
(实现过程见 Obsidian 插件开发 Content Publisher)
Wikilink 转换
依赖插件生成的
pubUrl
设置需要跟博客项目发布出来的 url 一致。(大部分默认 slug 是文件相对路径,但也可以用 slug
覆盖6)
上图配置:{{buiSlug}}
表示使用插件默认的 slug
生成规则。
上图配置表示依次尝试执行模板里的代码,替换 [ [Wikilink] ]
为 [markdown](link)
。
上图配置: [{{refer}}]({{pubUrl}})
表示处理形如 [ [refer] ]
链接,插件将找到引用的文件并基于上面设置的 pubSlug
计算得到最终的 pubUrl = urlPrefix + pubSlug
,作为真正的链接。
%%原文%%
(实现过程见 [ [Obsidian 插件开发 Content Publisher] ])
%%转换结果%%
(实现过程见 [Obsidian 插件开发 Content Publisher](https://evisx.me/posts/technical-development-obsidian-plugin-obsidian-plugin-development-content-publisher))
frontmatter 转换
基于用户设置的配置表重新生成 YAML frontmatter
比如 always; title; {{file.basename}}
表示该属性总是需要,名称为 title
,其值为笔记的文件名。将生成形如:
---
title: Obsidian 写博客发布到 Astro 博客项目
---
而 present; modDatetime; {{frontmatter.modTime}}
(例子与图示略不同),frontmatter
为笔记的元数据,present
规则将先计算代码模板的值,如果存在才生成该属性到文章,否则不生成。
最后 none; slug; {{pubSlug}}
表示不需要该属性设置。(如果必要,可以直接删除)
%%obsidian 笔记%%
Obsidian 写博客发布到 Astro 博客项目
---
author: evisx
tags:
- obsidian
description: Obsidian writes blogs and posts to the Astro blog project
draft: false
---
%%转换结果%%
Obsidian 写博客发布到 Astro 博客项目
---
title: Obsidian 写博客发布到 Astro 博客项目
author: evisx
pubDatetime: 2024-04-28T22:52:03+08:00
modDatetime: 2024-04-28T22:52:00+08:00
featured: false
draft: false
tags:
- obsidian
description: Obsidian writes blogs and posts to the Astro blog project
---
与其他插件一起使用
导出和发布
最后部署博客项目。
总结
插件目前仅处理一些导出时的差异 (YAML frontmatter 和 Wikilink),就能实现博客文章原文和博客项目分离的目的。提供了一些处理模板,但是使用和理解需要一定的 JS
代码基础。