王垠博客(yinwang.org)文章备份站。通过 API 爬取博文,保存为 Markdown,Eleventy 构建静态站部署(Vercel/GitHub Actions 每周一爬取)。posts 目录为站点源文件(不再考虑导回 Obsidian)。
slug(如 mites.md),与站点 URL(/posts/{slug}/)、图片目录(images/{slug}/)三统一title 字段,不出现在文件名论研究.md),保持原样——文件名即 slug,URL 不变---
title: "我和螨虫的故事"
slug: mites
author: 王垠
created: 2026-07-15
updated: 2026-09-01
source: https://www.yinwang.org/posts/mites
---
title 必填,双引号包裹(YAML 安全),值来自 API 返回的中文标题slug 必填(URL 最后一段);author、created(API 的 publish_date)、source 必填updated 可选(API 的 updated_at,有则写入)# {title} 开始(每篇文件自包含)##,小节用 ####### 及更深:爬虫会自动转为加粗段首词## 而有 ###,爬虫自动把 ### 升为 ##(顶层小节统一 H2)# 如果不是标题而是代码(如 #define),必须用行内代码包裹images/{slug}/ 目录、<img src="/images/{slug}/文件名.png" width="400">使用 C++ 编程),但 Markdown 标记(* _ ~)与内容之间禁止插空格,否则强调失效crawler.py:主爬虫。format_content() 含自愈链(坏强调修复、顶层缩进代码转围栏、层级规范化、盘古空格),新爬内容自动规范化lint_posts.py:CI 与本地全量校验(frontmatter 必填字段、正文 H1、坏强调、顶层缩进代码、围栏配对),应恒为 0 错误;crawl.yml 爬取后与 lint.yml(push 触发)都会跑fix_bold_spacing.py:修复 ** 文字 ** 坏强调;--check 模式供校验normalize_code_blocks.py:顶层缩进代码块转围栏;--check 模式同理notify_new_posts.py:爬取后新文章邮件提醒(SMTP secrets:SMTP_HOST/SMTP_USER/SMTP_PASS/NOTIFY_TO;缺省 dry-run)migrate_to_slug_filenames.py:一次性迁移工具(中文文件名 → slug 文件名),2026-09-23 已执行完毕,仅留档/feed.xml(Atom,最新 20 篇,标题+链接+140 字摘要,有意不输出全文——内容归原作者)。feed helpers(absoluteUrl/dateToRfc3339 等)在 .eleventy.js 手写,无插件依赖。siteBaseUrl 默认 https://yinwang.jrtx.site(meta.js)。
source URL 检查是否已存在(build_source_index())updated_at 未变的文章跳过,不会重写本地已修复的文件base.njk(全站框架/搜索/进度条/lightbox)+ post.njk(文章页:公众号卡片、上/下一篇、文末广告)collections.post 由 posts.json 打 tag,prev/next 已在 .eleventy.js 的 collection 里挂好(olderPost/newerPost)