创建Quartz博客
Quartz是使用Node.js的,所以首先是需要安装Node.js:
scoop install nodejs-lts从https://github.com/jackyzha0/quartz下载。然后是安装依赖:
npm install然后就可以创建博客了:
npx quartz create与Obsidian的联动
平时用Obsidian来写东西,但并不是写啥,都会公开。所以对于是否要公开,用一个YAML frontmatter做为开关。
---
publish: true
---
true是要发表的,false是不发表的。
但是Quartz默认是不管的,它并不去识别publish: false这个字段,我们需要修改quartz.config.ts,找到这一段:
import * as Plugin from "./quartz/plugins"
const config: QuartzConfig = {
configuration: {
// ...
},
plugins: {
transformers: [
Plugin.FrontMatter(),
// ...
],
filters: [
// 这里通常有一些默认的 filter,比如 RemoveDrafts 之类的
],
emitters: [
// ...
],
},
}
export default config在filters里面加上Plugin.ExplicitPublish():
filters: [
Plugin.ExplicitPublish(),
// 如果你还有其他 filter,就按需要保留
// Plugin.RemoveDrafts(),
],这样子,就会只发布publish: true的markdown文件。
构建博客
设置好之后,就可以用obsidian中的文档来生成博客了,用以下指令:
# 如需要本地预览,加上 --serve
npx quartz build -d ../YuNotebooks -o docs
输入直接用上一层目录的obsidian vault,我的笔记在本地,而生成的博客,只有我标识了publish: true的部分,输入的html文档,就放到docs文件夹里,方便后面在GitHub上指定它为Pages。
但是这里还是有一个问题,就是publish: false的md虽然不会被渲染,但是对应的assets文件夹(放图片,用的Custom Attachment Location)这些还是会被拷贝到docs目录下,必须要写个脚本来清除它,于是就写了一个cleanup_public_no_html.py的脚本。
然后还有一个问题,就是插入的图片是这种形式,在把md渲染成html的时候,它会把这个目录当成是根目录下的,结果就是md文件如果放一层目录,就会变成./assets/xxx,放两层目录下,就会变成./assets/xxx,这样子图片就会显示不正常,又需要写一个脚本,correct-image-path.py来读取生成的html文件,修改一下路径。
发布博客
到这里就没啥了,推送到GitHub,把docs目录选为Pages,打完收工。
做个懒人
还想更进一步,毕竟是和Obsidian联动,就是我只管在Obsidian里写笔记,不用管博客,这是最好的,笔记反正是可以控制是否发表,不需要每次我想发表,就得来弄一下。所以笔记我放到private repo里。搞个Secret,让Actions可以拉取,然后该怎么跑,让Actions去弄。然后我再设置,每天北京时间早上3:00自动跑一次Actions,这样子,我压根不用管博客,只管笔记。笔记也是设置好的,自动同步到GitHub。
所以整个逻辑就是:
- 我只管本地写笔记
- 后台自动同步GitHub
- Actions自动更新博客
然后我只需要做第一步,完美。
后续更新
由于原来的repo是来自quartz仓库,它是MIT协议的,也不好改它的。但我的博客放在docs目录下,用MIT协议是不合适的。于是还是分开分支,让quartz的东西,保持MIT协议,里面包含quartz的配置、样式、构建脚本(当然也包括我自己的脚本和Workflow Actions)。
- 新建一个
gh-pages分支,包含博客的内容,用CC BY-NC-ND 4.0协议。
git checkout --orphan gh-pages
git rm -rf .
touch README.md
git add README.md
git commit -m "Initial commit for gh-pages"
git push -u origin gh-pages- 回到main分支:
修改quartz/components/Footer.tsx ,在博客页面底部添加了 CC 协议链接,明确告知读者内容版权。
<p>
Content licensed under <a href="https://creativecommons.org/licenses/by-nc-nd/4.0/">CC BY-NC-ND 4.0</a>
</p>修改[Workflow](ygc-blog/.github/workflows/deploy-from-private-content.yaml at main · YuLab-SMU/ygc-blog),把原来同步内容到docs和推送的步骤,变成用peaceiris/actions-gh-pages发布到gh-pages分支。这个gh-pages分支里自动加入LICENSE文件,声明CC BY-NC-ND 4.0协议。
这样就做到了,代码和内容分离,并使用不同的协议。