<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Notion on dongxiaoqi's Blog</title><link>https://notion.dongxiaoqi.top/tags/notion/</link><description>Recent content in Notion on dongxiaoqi's Blog</description><generator>Hugo -- gohugo.io</generator><language>zh-CN</language><copyright>CC BY-NC-SA 4.0</copyright><lastBuildDate>Thu, 13 Aug 2026 12:21:00 +0800</lastBuildDate><atom:link href="https://notion.dongxiaoqi.top/tags/notion/index.xml" rel="self" type="application/rss+xml"/><item><title>博客主题从 MemE 切换到 Stack 实录</title><link>https://notion.dongxiaoqi.top/p/%E5%8D%9A%E5%AE%A2%E4%B8%BB%E9%A2%98%E4%BB%8E-meme-%E5%88%87%E6%8D%A2%E5%88%B0-stack-%E5%AE%9E%E5%BD%95/</link><pubDate>Wed, 12 Aug 2026 12:45:00 +0800</pubDate><guid>https://notion.dongxiaoqi.top/p/%E5%8D%9A%E5%AE%A2%E4%B8%BB%E9%A2%98%E4%BB%8E-meme-%E5%88%87%E6%8D%A2%E5%88%B0-stack-%E5%AE%9E%E5%BD%95/</guid><description>
 &lt;blockquote&gt;
 &lt;p&gt;一次完整的话题切换实操记录：从 MemE 换到 hugo-theme-stack，顺带把被钉死的 Hugo 老版本解锁。包含三个真实踩坑和 CI 迭代验证过程。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="一背景"&gt;一、背景
&lt;/h2&gt;&lt;p&gt;博客原本用 MemE 主题（git submodule，钉在 2022 年的 v5.0.0）。MemE v5.0.0 用了旧版 &lt;code&gt;resources.ToCSS&lt;/code&gt; API，与新版 Hugo 不兼容，导致 CI 工作流被迫把 Hugo 钉在 &lt;code&gt;0.112.7&lt;/code&gt;——这是个 2023 年的老版本，越来越难维护，新特性也用不了。&lt;/p&gt;
&lt;p&gt;目标：换成更现代的主题，并顺带解除旧 Hugo 版本锁。&lt;/p&gt;
&lt;h2 id="二选型"&gt;二、选型
&lt;/h2&gt;&lt;p&gt;候选了三个主流主题，最终选 &lt;strong&gt;hugo-theme-stack&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;卡片式文章列表、左侧边栏、原生暗色模式切换&lt;/li&gt;
&lt;li&gt;维护活跃，文档完善&lt;/li&gt;
&lt;li&gt;要求 Hugo ≥ 0.157.0 extended，正好顺带升级&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="三改动清单"&gt;三、改动清单
&lt;/h2&gt;&lt;h3 id="1-替换主题-submodule"&gt;1. 替换主题 submodule
&lt;/h3&gt;&lt;p&gt;移除 MemE，新增 Stack 并锁定到稳定 tag：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git submodule deinit -f themes/meme
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git rm -f themes/meme
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rm -rf .git/modules/themes/meme
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git submodule add -b master https://github.com/CaiJimmy/hugo-theme-stack.git themes/stack
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git -C themes/stack checkout v4.0.3
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="2-重写-configtoml"&gt;2. 重写 config.toml
&lt;/h3&gt;&lt;p&gt;从 1432 行的 MemE 配置精简到约 210 行。关键调整：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;theme = &amp;quot;stack&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mainSections = [&amp;quot;zh&amp;quot;]&lt;/code&gt;：核心，让首页读 &lt;code&gt;content/zh/&lt;/code&gt;（Notion Action 同步目录，不改 Action 也不改清理脚本）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;[permalinks] zh = &amp;quot;/p/:slug/&amp;quot;&lt;/code&gt;：用 Stack 默认 URL 风格，文章 URL 从 &lt;code&gt;/zh/xxx/&lt;/code&gt; 变 &lt;code&gt;/p/xxx/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;[menu]&lt;/code&gt; 改成 Stack 的 &lt;code&gt;main&lt;/code&gt; + &lt;code&gt;social&lt;/code&gt; 格式&lt;/li&gt;
&lt;li&gt;删除 MemE 专属的 &lt;code&gt;[params]&lt;/code&gt;、&lt;code&gt;[outputFormats]&lt;/code&gt;、&lt;code&gt;[outputs]&lt;/code&gt; 等几百行&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="3-重写-archetypesnotionmd"&gt;3. 重写 archetypes/notion.md
&lt;/h3&gt;&lt;p&gt;Notion Action 同步时套这个模板。改成 Stack 的 front matter 字段，两个关键点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;draft: false&lt;/code&gt;：Stack 默认 archetype 是 &lt;code&gt;draft: true&lt;/code&gt;，不显式改 false 的话同步出的文章会被当草稿隐藏&lt;/li&gt;
&lt;li&gt;&lt;code&gt;category&lt;/code&gt; → &lt;code&gt;categories&lt;/code&gt;（复数）：Stack 模板用 &lt;code&gt;.Params.categories&lt;/code&gt; 判断分类，单数 key 不会显示分类徽章&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="4-升级-hugo"&gt;4. 升级 Hugo
&lt;/h3&gt;&lt;p&gt;工作流里 &lt;code&gt;0.112.7&lt;/code&gt; → &lt;code&gt;0.163.3&lt;/code&gt;，&lt;code&gt;extended: true&lt;/code&gt; 保留。&lt;/p&gt;
&lt;h2 id="四踩坑记录"&gt;四、踩坑记录
&lt;/h2&gt;&lt;p&gt;整个过程走了三轮 CI 迭代，每个坑都是一次失败构建。&lt;/p&gt;
&lt;h3 id="坑-1计划里的-hugo-01572-根本不存在"&gt;坑 1：计划里的 Hugo 0.157.2 根本不存在
&lt;/h3&gt;&lt;p&gt;第一轮按计划填 &lt;code&gt;hugo-version: '0.157.2'&lt;/code&gt;，&lt;code&gt;peaceiris/actions-hugo&lt;/code&gt; 直接报错：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Unable to find a compatible Hugo release asset for this runner.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;查 Hugo releases 才发现：0.157 线&lt;strong&gt;只有 0.157.0&lt;/strong&gt;，之后直接跳到 0.160+，根本不存在 0.157.1/0.157.2。改成实际存在的 &lt;code&gt;0.163.3&lt;/code&gt;（成熟 .3 补丁版本，远高于 Stack 的 min 0.157.0）解决。&lt;/p&gt;
&lt;p&gt;教训：版本号要查 releases 确认存在，别想当然填补丁号。&lt;/p&gt;
&lt;h3 id="坑-2菜单图标不在-stack-内置集"&gt;坑 2：菜单图标不在 Stack 内置集
&lt;/h3&gt;&lt;p&gt;第二轮 Hugo 装上了，但构建报：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ERROR Error: icon &amp;#39;code.svg&amp;#39; is not found under &amp;#39;assets/icons&amp;#39; folder
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ERROR Error: icon &amp;#39;notes.svg&amp;#39; is not found under &amp;#39;assets/icons&amp;#39; folder
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;菜单里 &lt;code&gt;技术&lt;/code&gt; 用了 &lt;code&gt;icon = &amp;quot;code&amp;quot;&lt;/code&gt;、&lt;code&gt;随笔&lt;/code&gt; 用了 &lt;code&gt;icon = &amp;quot;notes&amp;quot;&lt;/code&gt;，但 Stack 只内置 24 个 SVG（&lt;code&gt;themes/stack/assets/icons/&lt;/code&gt;），不含 code/notes。改成内置图标：技术→&lt;code&gt;categories&lt;/code&gt;、随笔→&lt;code&gt;archives&lt;/code&gt;、关于→&lt;code&gt;user&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;教训：主题里引用的资源（图标、图片）要先确认主题是否自带，没有就得自己往 &lt;code&gt;assets/&lt;/code&gt; 放。&lt;/p&gt;
&lt;h3 id="坑-3languagecode-弃用警告"&gt;坑 3：languageCode 弃用警告
&lt;/h3&gt;&lt;p&gt;第三轮构建成功，但有 WARN：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;WARN deprecated: project config key languageCode was deprecated in Hugo v0.158.0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;修这个又踩了一层：顶层 &lt;code&gt;languageCode&lt;/code&gt; 在 0.158 弃用，移到 &lt;code&gt;[languages.zh].languageCode&lt;/code&gt; 后，0.163 又把这个键改名为 &lt;code&gt;locale&lt;/code&gt;（连同 &lt;code&gt;languageName&lt;/code&gt; → &lt;code&gt;label&lt;/code&gt;）。最终用最新键名：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-toml" data-lang="toml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;languages&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;languages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;zh&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;locale&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;zh-CN&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;label&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;中文&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;weight&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;额外风险：显式加 &lt;code&gt;[languages.zh]&lt;/code&gt; 后，Hugo 可能把 &lt;code&gt;content/zh/&lt;/code&gt; 当成 zh 语言根目录（而非 section），导致 &lt;code&gt;mainSections=[&amp;quot;zh&amp;quot;]&lt;/code&gt; 失配、首页变空。本地用下载的 hugo 二进制构建验证过：仍是 section，首页 2 篇文章、&lt;code&gt;/p/&lt;/code&gt; URL 都没变，才敢推 CI。&lt;/p&gt;
&lt;h2 id="五验证方法"&gt;五、验证方法
&lt;/h2&gt;&lt;p&gt;这次没用本地 &lt;code&gt;hugo server&lt;/code&gt; 预览，直接靠 CI 验证：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;git push&lt;/code&gt; 后用 GitHub API 手动触发 &lt;code&gt;workflow_dispatch&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;轮询 run 状态到 completed&lt;/li&gt;
&lt;li&gt;失败就下载日志 zip，定位报错步骤，修复重推&lt;/li&gt;
&lt;li&gt;成功后抓线上首页 HTML，核对 Stack 标记、文章链接、CSS/JS 资源是否 200&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;三轮迭代，每轮约 2–3 分钟，比反复起本地服务更快也更接近真实部署环境。&lt;/p&gt;
&lt;h2 id="六最终效果"&gt;六、最终效果
&lt;/h2&gt;&lt;p&gt;线上 &lt;a class="link" href="https://notion.dongxiaoqi.top/" target="_blank" rel="noopener"
 &gt;https://notion.dongxiaoqi.top/&lt;/a&gt; 已确认：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Stack 外观：左侧边栏、卡片式文章列表、暗色模式切换&lt;/li&gt;
&lt;li&gt;首页正常显示 2 篇文章，URL 是 &lt;code&gt;/p/xxx/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;文章页正文、标题、代码块、标签、阅读时长都正常&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/tags/&lt;/code&gt; 三个标签（Hugo / Notion / GitHub-Pages）正常&lt;/li&gt;
&lt;li&gt;CSS（55KB）/ JS（8KB）资源都 200，无样式崩坏&lt;/li&gt;
&lt;li&gt;旧 &lt;code&gt;/zh/xxx/&lt;/code&gt; URL 已 404（符合预期，文章少无外链，可接受）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="七语言切换器的实现"&gt;七、语言切换器的实现
&lt;/h2&gt;&lt;p&gt;主题切换上线后，照着 demo 站（demo.stack.cai.im）加了侧边栏的语言切换下拉框。这一节记录实现机制和一个非标准目录结构下踩的坑。&lt;/p&gt;
&lt;h3 id="机制hugoismultilingual"&gt;机制：hugo.IsMultilingual
&lt;/h3&gt;&lt;p&gt;Stack 的切换器在 themes/stack/layouts/_partials/sidebar/left.html，是一个 &lt;select&gt; 下拉框，遍历 .Site.Home.AllTranslations 生成 option，每个指向对应语言首页 URL、label 用 .Language.Label。但它被包在一个前置条件里：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;hugo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;IsMultilingual&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;li&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;i18n-switch&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;select&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;end&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;也就是说，只有 Hugo 处于多语言模式（[languages] 里定义了 ≥2 种语言）时切换器才渲染。demo 站每种语言都有真实翻译内容，多语言模式天然开启，切换器自然出现。单语博客要显示它，就得显式加第二种语言。&lt;/p&gt;
&lt;h3 id="坑contentzh-当-section-用contenten-进不了英语语言"&gt;坑：content/zh 当 section 用，content/en 进不了英语语言
&lt;/h3&gt;&lt;p&gt;本站的内容目录结构是非标准的：文章在 content/zh/，靠 mainSections=[&amp;quot;zh&amp;quot;] + permalinks zh=&amp;quot;/p/:slug/&amp;quot; 让首页读到它、文章落在 /p/。这是为了不动 Notion Action 硬编码的 contentFolder。&lt;/p&gt;
&lt;p&gt;加第二种语言时本能地想建 content/en/ 放英语内容——但本地 hugo 实测发现行不通：默认语言 zh 且 defaultContentLanguageInSubdir=false 时，Hugo 从 content/ 根扫描，把 content/ 下所有子目录（含 content/en/）都当成 zh 的 section。结果 content/en/ 永远成不了英语语言根，英语首页 RegularPages=0，空列表。&lt;/p&gt;
&lt;p&gt;换成 defaultContentLanguageInSubdir=true 也没用，content/en/ 依旧被默认语言吞成 section（变成 /zh/en/posts/...）。这个坑用调试 partial 打印 .Site.RegularPages 的 type/url 才定位到。&lt;/p&gt;
&lt;h3 id="解法by-filename-后缀-enmd"&gt;解法：by-filename 后缀 .en.md
&lt;/h3&gt;&lt;p&gt;改用 Hugo 的 by-filename 机制：文件名带 .&lt;lang&gt;.md 后缀的会归对应语言，且继承所在目录的 section。英文欢迎页放在 content/zh/welcome.en.md——.en 后缀让它归英语语言，content/zh/ 目录让它共享 section &amp;quot;zh&amp;quot;，于是 mainSections 和 permalinks 完全不用改。&lt;/p&gt;
&lt;p&gt;效果：中文文章仍在 /p/:slug/（URL 零变化），英文欢迎页在 /en/p/welcome/，切换器选项 中文(/) ↔ English(/en/)。&lt;/p&gt;
&lt;h3 id="配套改动"&gt;配套改动
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;config.toml 加 [languages.en]（locale=&amp;quot;en-US&amp;quot;, label=&amp;quot;English&amp;quot;, weight=2），开启 IsMultilingual，切换器自动渲染。&lt;/li&gt;
&lt;li&gt;新建 content/zh/welcome.en.md：英文欢迎页，说明本站主语言为中文、英文版建设中，附返回中文首页的链接。&lt;/li&gt;
&lt;li&gt;工作流清理脚本加 TRANSLATION_SUFFIXES=(&amp;quot;.en.md&amp;quot;,) 跳过翻译文件——否则每次 CI 会 git rm 掉欢迎页（Notion Action 不产生 .en.md，它不在 expected 集合里）。已实测：found 2 .md file(s); 0 to delete，欢迎页安全。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="后续加英文内容"&gt;后续加英文内容
&lt;/h3&gt;&lt;p&gt;想加英文文章，按同样规则放 content/zh/&lt;name&gt;.en.md 即可，自动出现在 /en/ 列表、URL 为 /en/p/&lt;name&gt;/。若英文文章多了，建议重新评估是否把 Notion 同步改成真正的多语言结构（那是另一个项目）。&lt;/p&gt;
&lt;h2 id="八遗留事项"&gt;八、遗留事项
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;分类徽章不显示&lt;/strong&gt;：现有两篇文章 front matter 是 &lt;code&gt;category: 首页&lt;/code&gt;（单数 key），Stack 读 &lt;code&gt;categories&lt;/code&gt;（复数）。新 archetype 已改复数，下次 Notion 重新同步时自动修好。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Notion token 安全&lt;/strong&gt;：集成 token 曾在对话中明文出现，建议去 Notion 重新生成并更新 GitHub 仓库的 &lt;code&gt;NOTION_TOKEN&lt;/code&gt; secret。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="九关键命令速查"&gt;九、关键命令速查
&lt;/h2&gt;&lt;p&gt;触发 CI 构建（用仓库存储的 GitHub 凭据，无需 gh CLI）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 取 git credential 里的 token&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;protocol=https\nhost=github.com\n\n&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; git credential fill &lt;span class="p"&gt;|&lt;/span&gt; grep &lt;span class="s1"&gt;&amp;#39;^password=&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sed &lt;span class="s1"&gt;&amp;#39;s/^password=//&amp;#39;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 手动触发 workflow&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -X POST -H &lt;span class="s2"&gt;&amp;#34;Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$TOKEN&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -d &lt;span class="s1"&gt;&amp;#39;{&amp;#34;ref&amp;#34;:&amp;#34;master&amp;#34;}&amp;#39;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; https://api.github.com/repos/vamViolet/notion-hugo-meme/actions/workflows/notion-blog.yml/dispatches
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;下载某次 run 的日志（API 返回 302 到 S3，要跟跳转）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;REDIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;curl -D - -o /dev/null -H &lt;span class="s2"&gt;&amp;#34;Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$TOKEN&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; https://api.github.com/repos/vamViolet/notion-hugo-meme/actions/runs/&amp;lt;RUN_ID&amp;gt;/logs &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; grep -i &lt;span class="s1"&gt;&amp;#39;^location:&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sed &lt;span class="s1"&gt;&amp;#39;s/^[Ll]ocation: //&amp;#39;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -o logs.zip &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$REDIR&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;unzip logs.zip
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>notion-hugo-meme 操作手册</title><link>https://notion.dongxiaoqi.top/p/notion-hugo-meme-%E6%93%8D%E4%BD%9C%E6%89%8B%E5%86%8C/</link><pubDate>Wed, 29 Jul 2026 03:05:00 +0800</pubDate><guid>https://notion.dongxiaoqi.top/p/notion-hugo-meme-%E6%93%8D%E4%BD%9C%E6%89%8B%E5%86%8C/</guid><description>&lt;h1 id="notion-hugo-meme-操作手册"&gt;notion-hugo-meme 操作手册
&lt;/h1&gt;&lt;p&gt;本项目把 Notion 数据库作为内容源，通过 GitHub Actions 自动同步为 Markdown，再用 Hugo 构建成静态博客并部署到 GitHub Pages。本文档梳理项目结构，并给出从「写文章」到「上线/下线」的完整操作流程。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;仓库地址：https://github.com/vamViolet/notion-hugo-meme 博客地址：https://notion.dongxiaoqi.top/&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="一整体架构"&gt;一、整体架构
&lt;/h2&gt;&lt;p&gt;数据流是单向的、全自动的（每 2 小时触发一次，也可手动触发）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Notion 数据库 ──(rxrw/notion-blog Action)──&amp;gt; content/zh/*.md ──(Hugo build)──&amp;gt; GitHub Pages
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └─ 把 Status=Finished 的文章拉成 md └─ https://notion.dongxiaoqi.top/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └─ 同步成功后把 Status 改成 Published
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └─ 清理步骤：删除已下线文章的 md
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;三个关键角色：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Notion 数据库&lt;/strong&gt;：唯一的内容编辑入口。每篇文章是一条记录，&lt;code&gt;Status&lt;/code&gt; 控制是否上线。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GitHub 仓库&lt;/strong&gt;：存放 Hugo 站点源码、同步出来的 md、以及自动化工作流。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GitHub Pages&lt;/strong&gt;：托管构建产物，对外提供博客访问。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="二项目结构"&gt;二、项目结构
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;notion-hugo-meme/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── .github/workflows/notion-blog.yml # 核心：同步 + 清理 + 构建 + 部署 的工作流
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── config.toml # Hugo 站点配置（站名、域名、主题、菜单等）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── notionblog.config.json # notion-blog Action 的配置（数据库 ID、字段映射、过滤规则）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── archetypes/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── default.md # `hugo new` 默认模板
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ └── notion.md # Notion 同步时套用的 front matter 模板
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── content/zh/ # 同步出来的文章 md（按 Category 分子目录）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ └── 建筑服务能力开发.md
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── static/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── CNAME # 自定义域名（notion.dongxiaoqi.top）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ └── images/ # 文章图片（Action 自动下载到这里）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── themes/meme/ # MemE 主题（git submodule，指向 rxrw/hugo-theme-meme）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── resources/ # Hugo 构建缓存
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└── README.md
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="关键配置文件"&gt;关键配置文件
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;notionblog.config.json&lt;/code&gt;&lt;/strong&gt; —— 决定 Action 怎么从 Notion 拉文章：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;字段&lt;/th&gt;
					&lt;th&gt;含义&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;filterProp&lt;/code&gt; / &lt;code&gt;filterValue&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;只同步 &lt;code&gt;Status&lt;/code&gt; 为 &lt;code&gt;Finished&lt;/code&gt; 的文章&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;publishedValue&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;同步成功后把 Status 改成 &lt;code&gt;Published&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;propertyCategories&lt;/code&gt; / &lt;code&gt;categoryMap&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;Category&lt;/code&gt; 字段映射：技术→tech、随笔→essay、关于→about，首页→根目录&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;contentFolder&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;同步到的目录：&lt;code&gt;content/zh&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;imagesFolder&lt;/code&gt; / &lt;code&gt;imagesLink&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;图片下载到 &lt;code&gt;static/images/&lt;/code&gt;，链接前缀 &lt;code&gt;/images&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;config.toml&lt;/code&gt;&lt;/strong&gt; —— Hugo 站点配置要点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;baseURL = &amp;quot;https://notion.dongxiaoqi.top/&amp;quot;&lt;/code&gt;：自定义域名，构建时不能用 github.io URL 覆盖，否则内链全 404。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;title = &amp;quot;dongxiaoqi's Blog&amp;quot;&lt;/code&gt;：站点名。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;theme = &amp;quot;meme&amp;quot;&lt;/code&gt;：使用 MemE 主题（submodule，v5.0.0，2022 年版）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;.github/workflows/notion-blog.yml&lt;/code&gt;&lt;/strong&gt; —— 两个 Job：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;auto-sync-from-notion-to-github&lt;/code&gt;：checkout → 跑 notion-blog Action 拉文章 → 清理已下线文章 → 提交推送。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;build-and-deploy&lt;/code&gt;：拉最新提交 → Hugo 0.112.7 extended 构建 → 部署到 GitHub Pages。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="三notion-数据库字段"&gt;三、Notion 数据库字段
&lt;/h2&gt;&lt;p&gt;每篇文章（一条记录）需要这些属性：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;属性&lt;/th&gt;
					&lt;th&gt;类型&lt;/th&gt;
					&lt;th&gt;作用&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;Status&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;状态（status）&lt;/td&gt;
					&lt;td&gt;控制上线：&lt;code&gt;Finished&lt;/code&gt;/&lt;code&gt;Published&lt;/code&gt; = 在线，其余 = 下线&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;Category&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;单选（select）&lt;/td&gt;
					&lt;td&gt;分类目录：&lt;code&gt;首页&lt;/code&gt;/&lt;code&gt;技术&lt;/code&gt;/&lt;code&gt;随笔&lt;/code&gt;/&lt;code&gt;关于&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;Tags&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;多选（multi_select）&lt;/td&gt;
					&lt;td&gt;标签&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;Created by&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;创建者（created_by）&lt;/td&gt;
					&lt;td&gt;Action 读取作者名（硬编码依赖，缺了会报错）&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="status-状态机"&gt;Status 状态机
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Status&lt;/th&gt;
					&lt;th&gt;含义&lt;/th&gt;
					&lt;th&gt;博客上是否可见&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;In progress&lt;/code&gt;（进行中）&lt;/td&gt;
					&lt;td&gt;写到一半&lt;/td&gt;
					&lt;td&gt;否&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;Finished&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;写完待发布 → 下次同步会拉取并上线&lt;/td&gt;
					&lt;td&gt;是（同步后）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;Published&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;已上线（同步后 Action 自动置为此状态）&lt;/td&gt;
					&lt;td&gt;是&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;Offline&lt;/code&gt;（已下线）&lt;/td&gt;
					&lt;td&gt;主动下线 → 清理步骤会删掉对应 md&lt;/td&gt;
					&lt;td&gt;否&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;

 &lt;blockquote&gt;
 &lt;p&gt;注意：博客是纯静态站点，没有登录鉴权，所以「私密」等价于「下线」——只要 Status 不是 Finished/Published，文章就不会出现在博客上。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="四日常操作"&gt;四、日常操作
&lt;/h2&gt;&lt;h3 id="41-发布一篇新文章"&gt;4.1 发布一篇新文章
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;在 Notion 数据库里 &lt;strong&gt;New&lt;/strong&gt; 一条记录，填好 &lt;code&gt;Name&lt;/code&gt;（标题）、&lt;code&gt;Category&lt;/code&gt;、&lt;code&gt;Tags&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;在正文里写内容（支持 Markdown 风格、代码块、表格、图片）。&lt;/li&gt;
&lt;li&gt;把 &lt;code&gt;Status&lt;/code&gt; 设为 &lt;strong&gt;&lt;code&gt;Finished&lt;/code&gt;&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;等待下次 workflow 触发（最多 2 小时），或去 GitHub 仓库 Actions 页面手动 &lt;code&gt;Run workflow&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;同步成功后，文章出现在博客，Status 自动变成 &lt;code&gt;Published&lt;/code&gt;。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="42-修改已发布文章"&gt;4.2 修改已发布文章
&lt;/h3&gt;&lt;p&gt;直接在 Notion 改正文/标题/分类，保持 &lt;code&gt;Status&lt;/code&gt; 为 &lt;code&gt;Finished&lt;/code&gt; 或 &lt;code&gt;Published&lt;/code&gt;，下次同步会更新对应 md。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;想立即触发同步，又不想等 2 小时：GitHub 仓库 → Actions → &lt;code&gt;notion-blog&lt;/code&gt; → &lt;code&gt;Run workflow&lt;/code&gt;。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="43-下线一篇文章"&gt;4.3 下线一篇文章
&lt;/h3&gt;&lt;p&gt;把 &lt;code&gt;Status&lt;/code&gt; 从 &lt;code&gt;Finished&lt;/code&gt;/&lt;code&gt;Published&lt;/code&gt; 改成 &lt;strong&gt;&lt;code&gt;Offline&lt;/code&gt;&lt;/strong&gt;（或 &lt;code&gt;Todo&lt;/code&gt;/&lt;code&gt;In progress&lt;/code&gt;）即可。下次 run 的清理步骤会自动 &lt;code&gt;git rm&lt;/code&gt; 掉对应 md，文章从博客消失。&lt;/p&gt;
&lt;h3 id="44-改分类--改标题"&gt;4.4 改分类 / 改标题
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;改分类&lt;/strong&gt;：在 Notion 改 &lt;code&gt;Category&lt;/code&gt;。注意：旧分类目录下的旧 md 不会自动删除，需手动清理或等清理步骤处理（清理是按「当前 Notion 里 Finished/Published 的文章」对账的）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;改标题&lt;/strong&gt;：会生成新文件名的 md，旧文件名的 md 会成为孤儿，下次清理步骤会自动删除。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="五首次部署--排错清单"&gt;五、首次部署 / 排错清单
&lt;/h2&gt;&lt;p&gt;如果同步或部署出问题，按这个顺序排查：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Notion 数据库是否关联了 Integration&lt;/strong&gt;：数据库右上角 &lt;code&gt;...&lt;/code&gt; → &lt;code&gt;Connections&lt;/code&gt; → 添加你创建的 Integration。没关联会 404。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GitHub Secret 是否正确&lt;/strong&gt;：仓库 Settings → Secrets and variables → Actions，需有 &lt;code&gt;NOTION_TOKEN&lt;/code&gt;（值是 Notion Integration token，&lt;code&gt;ntn_&lt;/code&gt; 开头）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Notion 字段是否齐全&lt;/strong&gt;：&lt;code&gt;Name&lt;/code&gt;/&lt;code&gt;Status&lt;/code&gt;/&lt;code&gt;Category&lt;/code&gt;/&lt;code&gt;Created by&lt;/code&gt; 必须存在且类型正确，缺了 Action 会报错（但 Action 会吞掉错误、显示成功，要看 Actions 日志才能发现）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GitHub Pages 源是否设为 Actions&lt;/strong&gt;：仓库 Settings → Pages → Source 选 &lt;code&gt;GitHub Actions&lt;/code&gt;（不是 gh-pages 分支）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;域名/CNAME&lt;/strong&gt;：&lt;code&gt;static/CNAME&lt;/code&gt; 必须是裸域名 &lt;code&gt;notion.dongxiaoqi.top&lt;/code&gt;，不能带 &lt;code&gt;http://&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hugo 版本&lt;/strong&gt;：工作流固定用 &lt;code&gt;0.112.7 extended&lt;/code&gt;。MemE v5.0.0 与新版 Hugo 的 &lt;code&gt;resources.ToCSS&lt;/code&gt; 不兼容，&lt;strong&gt;不要升到 latest&lt;/strong&gt;，除非先升主题 submodule。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="六已知限制"&gt;六、已知限制
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Action 只增不删&lt;/strong&gt;：rxrw/notion-blog 只会新增/更新 md，不会删除。下线靠本仓库自加的清理步骤实现。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;正文只取前 100 个 block&lt;/strong&gt;：Action 不做 block 分页，超长文章（&amp;gt;100 个 Notion block）会被截断。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;错误被吞&lt;/strong&gt;：Action 内部出错只 &lt;code&gt;log.Println&lt;/code&gt; 后 &lt;code&gt;exit 0&lt;/code&gt;，永远显示「成功」。排查要看 Actions 的完整日志。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;属性名硬编码&lt;/strong&gt;：Action 代码里写死了 &lt;code&gt;Name&lt;/code&gt;/&lt;code&gt;Category&lt;/code&gt;/&lt;code&gt;Created by&lt;/code&gt; 等英文字段名，改不了。&lt;/li&gt;
&lt;li&gt;**Tags 渲染缺陷：**rxrw/notion-blog 用 &lt;strong&gt;tags : {{.Tags}}&lt;/strong&gt; 渲染多选标签，Go 切片默认输出 &lt;strong&gt;[a b c]&lt;/strong&gt;（空格分隔无逗号），Hugo 会当成一个名为 “a b c” 的畸形标签。本仓库工作流加了 Fix tags front-matter format 步骤，同步后自动改成逗号分隔 &lt;strong&gt;[a, b, c]&lt;/strong&gt;，博客 /tags/ 页和文章页才能正确显示多个独立标签。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tag 命名约束：&lt;strong&gt;Notion 的 tag 名&lt;/strong&gt;不要含空格&lt;/strong&gt;（如用 GitHub-Pages 而非 GitHub Pages）。Action 输出端是空格分隔，含空格的标签名无法无损还原，会被错误拆成多个。中文标签不受影响（如 生产力）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="七相关链接"&gt;七、相关链接
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;仓库：https://github.com/vamViolet/notion-hugo-meme&lt;/li&gt;
&lt;li&gt;博客：https://notion.dongxiaoqi.top/&lt;/li&gt;
&lt;li&gt;主题：https://github.com/rxrw/hugo-theme-meme&lt;/li&gt;
&lt;li&gt;Action：https://github.com/rxrw/notion-blog&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>