网站结构

模板主要由 5 个部分组成:

可用函数

config.typ 从 tufted-lib/tufted.typ 导入并重新导出,页面里可以直接用:

具体使用见 Typst 功能速览与样例。

主要配置

站点配置集中在 config.typ:

// 站点信息
#let site-title = "rainoffallingstar’s Blog"
#let site-tagline = "凡是过往,皆为序章。"
#let site-author = "rainoffallingstar"
#let site-url = "https://blog.rainoffallingstar.com"

// 导航项:第一项是站名,兼作返回首页
#let header-links = (
  "/": site-title,
  "/Links/": "友链",
  "/About/": "关于",
)

模板本体由上游提供,本站只传入站点参数:

#let site = tufted.tufted-web.with(
  header-links: header-links,
  website-title: site-title,
  website-url: site-url,        // 用于 canonical / sitemap / RSS
  author: site-author,
  description: site-description,
  feed-dir: ("/Blog/",),        // 生成 RSS 并在导航栏显示订阅图标
  css: ("/assets/custom.css", "/assets/site.css"),
  footer-elements: ( /* ... */ ),
)

可选参数

上游 tufted-web 支持的主要参数:

页面写法:

#import "../config.typ": template, tufted
#show: template.with(
  title: "文章标题",
  description: "一句话摘要",
  date: datetime(year: 2025, month: 4, day: 16),
)

关于日期

build.py 生成 sitemap.xml 和 feed.xml 时,会从以下位置取日期:

  1. HTML 里的 <meta name="date">(由 date: 参数生成)
  2. 目录名中的 YYYY-MM-DD

目录名里没有标准日期的文章需要显式传 date:,否则不会进入 RSS。

自动构建产物

python build.py build 除 HTML/PDF 外还会生成:

层级结构与继承

网站遵循层级结构。根目录从 ../config.typ 导入,而子页面从其父目录的 ../index.typ 文件导入。

content/ 目录中所有的 **/index.typ 文件都会成为可访问的页面,其路径对应文件夹的路径(例如 content/Blog/index.typ → example.github.io/Blog)。

与上游同步

本仓库基于 Tufted-Blog-Template。 .github/workflows/update.yml 会每两周向上游拉取一次改动并开 PR。

本站自有文件已写入 .github/.templatesyncignore,同步时不会被覆盖: content/、config.typ、assets/custom.css、assets/site.css、部署工作流等。