创建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的脚本。

然后还有一个问题,就是插入的图片是![](assets/xxx)这种形式,在把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。

所以整个逻辑就是:

  1. 我只管本地写笔记
  2. 后台自动同步GitHub
  3. Actions自动更新博客

然后我只需要做第一步,完美。

后续更新

由于原来的repo是来自quartz仓库,它是MIT协议的,也不好改它的。但我的博客放在docs目录下,用MIT协议是不合适的。于是还是分开分支,让quartz的东西,保持MIT协议,里面包含quartz的配置、样式、构建脚本(当然也包括我自己的脚本和Workflow Actions)。

  1. 新建一个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
  1. 回到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协议。

这样就做到了,代码和内容分离,并使用不同的协议。