<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Icicn</title><description>学习 · 记录 · 整理</description><link>https://uuicicn.top/</link><language>zh_CN</language><item><title>从 0 搭建 self-built-space：开发、部署与 Obsidian 发布工作流复盘</title><link>https://uuicicn.top/posts/self-built-space-development-history/</link><guid isPermaLink="true">https://uuicicn.top/posts/self-built-space-development-history/</guid><description>基于项目文档和 Git 提交记录，复盘 self-built-space 从 Fuwari 骨架到个人内容空间、自动部署和 Obsidian 发布工作流的完整搭建过程。</description><pubDate>Thu, 25 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;这篇文章是 self-built-space 的一次工程复盘。我把仓库里的设计文档、开发计划、部署文档、运维手册、Obsidian 工作流文档和 Git 提交记录重新读了一遍，按时间线把这个站点从空目录走到当前状态的过程整理出来。&lt;/p&gt;
&lt;p&gt;一开始我想做的并不是“再搭一个博客”。更准确地说，我想要一个能长期放东西的自建空间。学习文章放技术笔记和工程实践，点点滴滴放日常记录，资源页放工具、模板、链接和可复制的本地资料，关于页则负责说明我是谁、我在关注什么。&lt;/p&gt;
&lt;h2&gt;起点：先弄清楚这个站点要解决什么&lt;/h2&gt;
&lt;p&gt;最早的设计文档里，self-built-space 的定位很明确：它要承载内容，也要承载整理动作。这个判断影响了后面几乎所有技术选择。&lt;/p&gt;
&lt;p&gt;我没有从零写一套博客系统，而是选了 Fuwari 做底座。它已经有 Astro 静态站、Markdown、标签分类、归档、RSS、Sitemap、Pagefind 搜索、代码块增强和响应式布局。自己要做的部分集中在另外几件事上：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;首页的信息结构和视觉识别。&lt;/li&gt;
&lt;li&gt;学习、点滴、资源三类内容的区分。&lt;/li&gt;
&lt;li&gt;资源页的独立数据模型。&lt;/li&gt;
&lt;li&gt;更适合中文阅读的排版。&lt;/li&gt;
&lt;li&gt;从写作到发布的长期维护流程。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这个选择挺务实。Fuwari 负责那些已经成熟的博客能力，我把精力放在“这个站点为什么存在”和“以后怎么继续写”上。&lt;/p&gt;
&lt;h2&gt;Sprint 0：把 Fuwari 项目骨架迁进来&lt;/h2&gt;
&lt;p&gt;第一个提交是 &lt;code&gt;a59d758 chore: init Fuwari project skeleton&lt;/code&gt;。这一阶段做的是项目启动。&lt;/p&gt;
&lt;p&gt;当时工作区里已经有 &lt;code&gt;docs/&lt;/code&gt; 文档，所以开发计划里没有建议直接在当前目录初始化项目。更稳的做法是先在临时目录生成 Fuwari 项目，确认结构和依赖没问题，再迁移到当前仓库。这样不会把已有设计文档冲掉。&lt;/p&gt;
&lt;p&gt;迁移完成后，仓库里有了这些基础能力：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;src/pages/&lt;/code&gt; 路由。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;src/content/&lt;/code&gt; 内容集合。&lt;/li&gt;
&lt;li&gt;文章详情页、归档页、RSS、搜索组件。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pnpm dev&lt;/code&gt; 和 &lt;code&gt;pnpm build&lt;/code&gt; 等命令。&lt;/li&gt;
&lt;li&gt;Astro 的静态构建输出。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这个阶段看起来只是“把模板放进来”，但它给后续所有定制提供了一个可以跑、可以构建、可以回滚的起点。没有这个起点，后面的内容模型和视觉调整都会变成一堆散落的实验。&lt;/p&gt;
&lt;h2&gt;Sprint 1：先把模板改成自己的站点&lt;/h2&gt;
&lt;p&gt;第二个提交是 &lt;code&gt;ae5b662 chore: sprint 1 - 基础配置&lt;/code&gt;。这一阶段处理站点身份。&lt;/p&gt;
&lt;p&gt;主要改动包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;站点标题改成 Icicn。&lt;/li&gt;
&lt;li&gt;副标题改成「学习 · 记录 · 整理」。&lt;/li&gt;
&lt;li&gt;语言切到 &lt;code&gt;zh_CN&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;导航改成：首页、学习、点点滴滴、资源、关于我。&lt;/li&gt;
&lt;li&gt;作者昵称、社交链接和站点地址换成自己的配置。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;到这里，站点还没有自己的复杂页面，但已经不是默认模板了。导航名称、语言、作者信息和基础 SEO 都指向同一个内容方向：这是一个中文个人站，而不是 Fuwari 的演示项目。&lt;/p&gt;
&lt;h2&gt;Sprint 2：先定内容模型&lt;/h2&gt;
&lt;p&gt;第三个提交是 &lt;code&gt;5515672 feat: sprint 2 - 内容模型&lt;/code&gt;。这一步很影响后面的结构。&lt;/p&gt;
&lt;p&gt;文章没有被拆成两套 collection。学习文章和点滴文章仍然共用 &lt;code&gt;posts&lt;/code&gt;，只是在 frontmatter 里增加了一个 &lt;code&gt;kind&lt;/code&gt; 字段：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;kind: learning
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;或者：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;kind: moments
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样做的好处很直接。文章详情页、Markdown 渲染、RSS、搜索、标签、分类、目录和代码块都能继续复用。列表页只需要按 &lt;code&gt;kind&lt;/code&gt; 过滤。&lt;/p&gt;
&lt;p&gt;资源则单独建了 &lt;code&gt;resources&lt;/code&gt; collection。资源卡片和文章不一样，它更像一个索引条目，需要 &lt;code&gt;title&lt;/code&gt;、&lt;code&gt;type&lt;/code&gt;、&lt;code&gt;url&lt;/code&gt;、&lt;code&gt;description&lt;/code&gt;、&lt;code&gt;category&lt;/code&gt;、&lt;code&gt;tags&lt;/code&gt;、&lt;code&gt;featured&lt;/code&gt;、&lt;code&gt;updated&lt;/code&gt; 这些字段。把它单独建模，比硬塞进文章系统里更干净。&lt;/p&gt;
&lt;p&gt;这个阶段也加入了学习、点滴和资源示例数据，方便后面做页面时有真实数据可以跑。&lt;/p&gt;
&lt;h2&gt;Sprint 3：把核心页面串起来&lt;/h2&gt;
&lt;p&gt;第四个提交是 &lt;code&gt;41431ec feat: sprint 3 - 页面结构&lt;/code&gt;。这一阶段把设计文档里的核心路由落到了代码里。&lt;/p&gt;
&lt;p&gt;新增或调整的页面包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/&lt;/code&gt;：首页，负责个人定位和内容分发。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/learning/&lt;/code&gt;：只显示 &lt;code&gt;kind: learning&lt;/code&gt; 的文章。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/moments/&lt;/code&gt;：只显示 &lt;code&gt;kind: moments&lt;/code&gt; 的文章。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/resources/&lt;/code&gt;：读取资源 collection。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/about/&lt;/code&gt;：展示个人介绍。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;content-utils.ts&lt;/code&gt; 也在这个阶段变得更有用。它开始负责按 &lt;code&gt;kind&lt;/code&gt; 取文章、按 featured 和更新时间排资源。页面本身不用关心太多内容读取细节。&lt;/p&gt;
&lt;p&gt;这一阶段完成后，站点终于有了清楚的信息架构。学习和点滴不再只是导航上的两个词，资源页也不再只是一个未来计划。&lt;/p&gt;
&lt;h2&gt;Sprint 4：首页视觉和中文阅读体验&lt;/h2&gt;
&lt;p&gt;第五个大阶段是 &lt;code&gt;ef78326 feat: sprint 4 - landing page visual customization complete&lt;/code&gt;。这一步给站点加上了更强的视觉记忆点。&lt;/p&gt;
&lt;p&gt;参考 Dala 和 Refero 风格后，首页选择了暗色画布、紫色强调和粒子宇宙的路线。技术上引入了 Three.js，包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;旋涡星系粒子场。&lt;/li&gt;
&lt;li&gt;鼠标视差和粒子扰动。&lt;/li&gt;
&lt;li&gt;星空背景和闪烁动画。&lt;/li&gt;
&lt;li&gt;shader 与 Three.js 场景代码。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/&lt;/code&gt; landing page 和 &lt;code&gt;/home/&lt;/code&gt; 内容聚合页的双页面结构。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Dala 的原始技术路线很复杂，里面有 GLB 实例粒子、EXR 数据贴图、FBO/GPGPU 模拟和滚动驱动。self-built-space 第一版没有照搬这些。它先用程序生成粒子和 Three.js 场景做出氛围，把实现复杂度压在可维护范围内。&lt;/p&gt;
&lt;p&gt;后面几个提交继续调整站点气质：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;62bec48&lt;/code&gt; 精简 &lt;code&gt;/home/&lt;/code&gt;，让内容区更快进入正文。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;f4467f7&lt;/code&gt; 修复 Astro check 报错。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;25ba7bd&lt;/code&gt; 打磨关于页。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;6e440e1&lt;/code&gt; 调整字体系统和中文排版。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;8b13e9c&lt;/code&gt; 增加沉浸式主题。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;76bfe50&lt;/code&gt; 增加首页轮播 banner。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ceed658&lt;/code&gt; 改善内容页可读性。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这里我比较喜欢的一点是，首页可以有强视觉，但文章页没有跟着变得浮夸。正文页一直在往可读性靠，字号、行高、卡片边界和移动端布局都比“炫”更优先。&lt;/p&gt;
&lt;h2&gt;资源系统：从外链列表到本地资源合集&lt;/h2&gt;
&lt;p&gt;资源页最开始只是外部链接卡片。后来 &lt;code&gt;8afda30 feat: add local resource collections&lt;/code&gt; 把资源系统扩了一层。&lt;/p&gt;
&lt;p&gt;新增的模型有两个：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;resourceCollections&lt;/code&gt;：资源合集，比如提示词模板、代码片段。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;localResources&lt;/code&gt;：具体条目，通过 &lt;code&gt;collection&lt;/code&gt; 绑定到某个合集。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;页面上也增加了 &lt;code&gt;/resources/&amp;lt;slug&amp;gt;/&lt;/code&gt;，用来展示某个本地资源合集。&lt;code&gt;LocalResourceGallery.svelte&lt;/code&gt; 负责卡片、弹窗和详情展示，&lt;code&gt;ResourceCopyButton.svelte&lt;/code&gt; 负责复制资源主体内容。&lt;/p&gt;
&lt;p&gt;这样一来，资源页就不只是“我收藏了一些链接”。它可以放真正能复用的东西，比如代码片段、提示词、配置模板、素材说明。外部资源、本地合集、本地条目各自有自己的模型，后面维护起来也不会混在一起。&lt;/p&gt;
&lt;h2&gt;搜索、RSS 和项目文档&lt;/h2&gt;
&lt;p&gt;上线准备阶段主要看两个提交。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;e17bcf1 feat: sprint 5 - prepare production deployment&lt;/code&gt; 加入了 GitHub Actions 部署 workflow，调整 schema，更新 favicon，也处理了 RSS、资源页、首页和搜索相关细节。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;2422ebe feat: refine search architecture and project docs&lt;/code&gt; 重构了搜索相关代码，新增 &lt;code&gt;src/lib/search/site-search.ts&lt;/code&gt;，同时整理 README，移除一些不再需要的默认项目文档和导航逻辑。&lt;/p&gt;
&lt;p&gt;搜索使用 Pagefind。构建命令实际会做两步：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;astro build &amp;amp;&amp;amp; pagefind --site dist
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;所以搜索不能只靠 &lt;code&gt;pnpm dev&lt;/code&gt; 判断。要看真实搜索索引，需要先构建，再用 &lt;code&gt;pnpm preview&lt;/code&gt; 检查。这个提醒后来也写进了维护文档。&lt;/p&gt;
&lt;h2&gt;部署：让服务器只做服务器该做的事&lt;/h2&gt;
&lt;p&gt;部署文档和运维文档最后确定了发布方式：CI 构建，加 SSH/rsync 发布。&lt;/p&gt;
&lt;p&gt;整体流程是：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;本地修改内容或代码
-&amp;gt; git commit
-&amp;gt; git push
-&amp;gt; GitHub Actions 安装依赖并构建
-&amp;gt; rsync 上传 dist/
-&amp;gt; 服务器 release 目录
-&amp;gt; current 软链接切换
-&amp;gt; Nginx 对外提供静态站点
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里有几个取舍我觉得是对的。&lt;/p&gt;
&lt;p&gt;第一，Git 仓库是源码、内容和配置的来源。服务器上不直接改文章，也不直接改 &lt;code&gt;dist/&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;第二，CI 负责安装依赖、检查、构建和生成搜索索引。服务器不承担构建任务，只托管静态文件。&lt;/p&gt;
&lt;p&gt;第三，服务器目录用 &lt;code&gt;releases/&lt;/code&gt; 和 &lt;code&gt;current&lt;/code&gt; 软链接。每次部署都是一个独立 release，出问题时可以把 &lt;code&gt;current&lt;/code&gt; 指回旧版本。&lt;/p&gt;
&lt;p&gt;第四，部署用户是单独的 &lt;code&gt;deploy&lt;/code&gt; 用户，不用 root。SSH key、GitHub Secrets、Nginx root、release 清理这些细节都在部署文档里有记录。&lt;/p&gt;
&lt;p&gt;GitHub Actions workflow 位于 &lt;code&gt;.github/workflows/deploy.yml&lt;/code&gt;。它在 push 到 &lt;code&gt;main&lt;/code&gt; 时触发，也支持手动 &lt;code&gt;workflow_dispatch&lt;/code&gt;。CI 会依次执行 &lt;code&gt;pnpm check&lt;/code&gt;、&lt;code&gt;pnpm type-check&lt;/code&gt;、&lt;code&gt;pnpm build&lt;/code&gt;，然后用 rsync 上传 &lt;code&gt;dist/&lt;/code&gt;，切换服务器上的 &lt;code&gt;current&lt;/code&gt;，最后保留最近 5 个 release。&lt;/p&gt;
&lt;h2&gt;启用后的日常维护&lt;/h2&gt;
&lt;p&gt;站点启用后，维护手册把日常流程写得很朴素：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pnpm check
pnpm type-check
pnpm build
git status
git add &amp;lt;files&amp;gt;
git commit -m &quot;&amp;lt;type&amp;gt;: &amp;lt;summary&amp;gt;&quot;
git push
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果改到了视觉、搜索、首页动效或移动端布局，再额外跑：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pnpm preview
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;内容目录也固定下来：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;src/content/posts/                学习文章和点滴文章
src/content/resources/            外部资源条目
src/content/resourceCollections/  本地资源集合
src/content/localResources/       本地资源内容
src/content/spec/about.md         关于页内容
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这个阶段的重点不是多一个命令，而是形成习惯：本地验证，提交，推送，CI 部署，线上验收。内容更新和代码更新走同一条路径。&lt;/p&gt;
&lt;h2&gt;Obsidian：把写作入口移到更舒服的地方&lt;/h2&gt;
&lt;p&gt;最近两个提交把 Obsidian 工作流接了进来：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;f372731 feat: add obsidian content workflow&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;0985b65 docs: update obsidian workflow readme&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这个方案没有让 Astro 直接读取 Obsidian vault。它加了一个同步脚本，把 Obsidian 当写作源，把网站仓库当发布源。&lt;/p&gt;
&lt;p&gt;默认 vault 是：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/Volumes/raw/knowledge/self-built
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;发布目录约定为：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;posts/learning/          学习文章
posts/moments/           点点滴滴文章
resources/external/      外部资源卡片
resources/collections/   本地资源合集
resources/local/         本地资源条目
_attachments/            共享附件
templates/               Obsidian 写作模板
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;同步脚本是：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;scripts/sync-content-from-obsidian.js
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;常用命令是：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pnpm content:sync
pnpm content:publish-check
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;同步关系是：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;posts/learning/          -&amp;gt; src/content/posts/&amp;lt;slug&amp;gt;/index.md
posts/moments/           -&amp;gt; src/content/posts/&amp;lt;slug&amp;gt;/index.md
resources/external/      -&amp;gt; src/content/resources/&amp;lt;slug&amp;gt;.md
resources/collections/   -&amp;gt; src/content/resourceCollections/&amp;lt;slug&amp;gt;.md
resources/local/         -&amp;gt; src/content/localResources/&amp;lt;slug&amp;gt;.md
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;脚本还处理了一些 Obsidian 和 Astro 之间的小差异：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;学习文章自动写入 &lt;code&gt;kind: learning&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;点滴文章自动写入 &lt;code&gt;kind: moments&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;通过 frontmatter &lt;code&gt;slug&lt;/code&gt; 控制输出路径。&lt;/li&gt;
&lt;li&gt;支持 Obsidian 图片语法 &lt;code&gt;![[image.png]]&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;本地附件会复制到网站仓库。&lt;/li&gt;
&lt;li&gt;远程图片和普通外链保持原样。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这层同步适配很值得保留。直接让网站读 vault 听起来更省事，但 CI、路径、附件、草稿和私有笔记都会变麻烦。现在的方式更清楚：Obsidian 负责写，网站仓库负责发布。&lt;/p&gt;
&lt;h2&gt;回头看，这条路线学到了什么&lt;/h2&gt;
&lt;p&gt;第一，内容模型要尽早定下来。&lt;code&gt;kind&lt;/code&gt; 字段和资源 collection 很早就出现，所以后面的学习页、点滴页、资源页都有稳定的数据来源。&lt;/p&gt;
&lt;p&gt;第二，首页可以做得有记忆点，正文页要收着点。粒子宇宙适合放在入口，长文阅读还是要靠字号、行高、间距和清晰的层级。&lt;/p&gt;
&lt;p&gt;第三，部署和内容发布最好走同一条路。这个项目没有单独搞一个“只发文章”的临时流程。文章、资源、配置、页面修改都经过 Git、CI、构建和部署。&lt;/p&gt;
&lt;p&gt;第四，资源值得单独建模。链接、合集、可复制条目不是同一种东西。分开之后，资源页才有继续扩展的空间。&lt;/p&gt;
&lt;p&gt;第五，Obsidian 工作流真正解决的是写作摩擦。同步脚本把 frontmatter、附件、图片语法和输出目录这些琐碎问题藏起来，写文章时就不用一直切回 &lt;code&gt;src/content/&lt;/code&gt; 里手动对齐格式。&lt;/p&gt;
&lt;h2&gt;当前状态&lt;/h2&gt;
&lt;p&gt;到目前为止，self-built-space 已经能支撑一条完整的内容生产链路：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;用 Astro/Fuwari 承载文章、资源、RSS、Sitemap 和搜索。&lt;/li&gt;
&lt;li&gt;用自定义页面区分首页、学习、点滴、资源和关于页。&lt;/li&gt;
&lt;li&gt;用 Three.js 给首页提供视觉识别。&lt;/li&gt;
&lt;li&gt;用 GitHub Actions 构建并发布到服务器。&lt;/li&gt;
&lt;li&gt;用 release 目录和 &lt;code&gt;current&lt;/code&gt; 软链接保留回滚能力。&lt;/li&gt;
&lt;li&gt;用 Obsidian 写作，再通过 &lt;code&gt;pnpm content:sync&lt;/code&gt; 同步到网站内容仓库。&lt;/li&gt;
&lt;li&gt;用 &lt;code&gt;pnpm content:publish-check&lt;/code&gt; 在本地一次跑完同步、诊断、类型检查和构建。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这个项目现在最有价值的部分，不是某个单独页面，也不是某个视觉效果。它更像一条已经接起来的管线：想法先进 Obsidian，发布内容进入 Astro，Git 记录每次变化，CI 负责构建和部署，服务器只安静地托管静态结果。这个状态不华丽，但很适合长期写下去。&lt;/p&gt;
</content:encoded></item><item><title>Fuwari 主题搭建记录</title><link>https://uuicicn.top/posts/learning-example/</link><guid isPermaLink="true">https://uuicicn.top/posts/learning-example/</guid><description>使用 Fuwari 模板搭建个人站点的过程和笔记</description><pubDate>Sun, 21 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;为什么选择 Fuwari&lt;/h2&gt;
&lt;p&gt;Fuwari 是一个基于 Astro 的静态博客模板，内置了暗色主题、代码块增强、搜索和 RSS 等功能。&lt;/p&gt;
&lt;p&gt;选择它的原因：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;开箱即用的博客能力&lt;/li&gt;
&lt;li&gt;暗色主题符合设计方向&lt;/li&gt;
&lt;li&gt;支持 Markdown 写作&lt;/li&gt;
&lt;li&gt;构建速度快&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;搭建过程&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;使用 &lt;code&gt;create fuwari&lt;/code&gt; 初始化项目&lt;/li&gt;
&lt;li&gt;迁移到已有工作区&lt;/li&gt;
&lt;li&gt;修改站点配置&lt;/li&gt;
&lt;li&gt;调整导航和路由&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;后续计划&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;自定义首页视觉&lt;/li&gt;
&lt;li&gt;建立内容分类体系&lt;/li&gt;
&lt;li&gt;配置资源页面&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>关于自建空间的一些想法</title><link>https://uuicicn.top/posts/moments-example/</link><guid isPermaLink="true">https://uuicicn.top/posts/moments-example/</guid><description>为什么想要一个自己的内容空间，以及对记录和整理的思考</description><pubDate>Sun, 21 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;起因&lt;/h2&gt;
&lt;p&gt;一直想有一个属于自己的空间，不是社交媒体上的碎片，而是可以沉淀、可以回看、可以慢慢长出来的地方。&lt;/p&gt;
&lt;h2&gt;想要什么样的空间&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;技术学习有地方放&lt;/li&gt;
&lt;li&gt;生活想法有地方写&lt;/li&gt;
&lt;li&gt;好用的资源有地方整理&lt;/li&gt;
&lt;li&gt;不被平台规则限制&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;现在的状态&lt;/h2&gt;
&lt;p&gt;站点刚刚搭好，框架有了，内容还是空的。但这本身就是一个开始。&lt;/p&gt;
&lt;p&gt;接下来就是慢慢写，不急。&lt;/p&gt;
</content:encoded></item><item><title>Markdown Extended Features</title><link>https://uuicicn.top/posts/markdown-extended/</link><guid isPermaLink="true">https://uuicicn.top/posts/markdown-extended/</guid><description>Read more about Markdown features in Fuwari</description><pubDate>Wed, 01 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;GitHub Repository Cards&lt;/h2&gt;
&lt;p&gt;You can add dynamic cards that link to GitHub repositories, on page load, the repository information is pulled from the GitHub API.&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;Fabrizz/MMM-OnSpotify&quot;}&lt;/p&gt;
&lt;p&gt;Create a GitHub repository card with the code &lt;code&gt;::github{repo=&quot;&amp;lt;owner&amp;gt;/&amp;lt;repo&amp;gt;&quot;}&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;::github{repo=&quot;saicaca/fuwari&quot;}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Admonitions&lt;/h2&gt;
&lt;p&gt;Following types of admonitions are supported: &lt;code&gt;note&lt;/code&gt; &lt;code&gt;tip&lt;/code&gt; &lt;code&gt;important&lt;/code&gt; &lt;code&gt;warning&lt;/code&gt; &lt;code&gt;caution&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;:::note
Highlights information that users should take into account, even when skimming.
:::&lt;/p&gt;
&lt;p&gt;:::tip
Optional information to help a user be more successful.
:::&lt;/p&gt;
&lt;p&gt;:::important
Crucial information necessary for users to succeed.
:::&lt;/p&gt;
&lt;p&gt;:::warning
Critical content demanding immediate user attention due to potential risks.
:::&lt;/p&gt;
&lt;p&gt;:::caution
Negative potential consequences of an action.
:::&lt;/p&gt;
&lt;h3&gt;Basic Syntax&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;:::note
Highlights information that users should take into account, even when skimming.
:::

:::tip
Optional information to help a user be more successful.
:::
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Custom Titles&lt;/h3&gt;
&lt;p&gt;The title of the admonition can be customized.&lt;/p&gt;
&lt;p&gt;:::note[MY CUSTOM TITLE]
This is a note with a custom title.
:::&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;:::note[MY CUSTOM TITLE]
This is a note with a custom title.
:::
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;GitHub Syntax&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
&lt;a href=&quot;https://github.com/orgs/community/discussions/16925&quot;&gt;The GitHub syntax&lt;/a&gt; is also supported.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt; [!NOTE]
&amp;gt; The GitHub syntax is also supported.

&amp;gt; [!TIP]
&amp;gt; The GitHub syntax is also supported.
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Spoiler&lt;/h3&gt;
&lt;p&gt;You can add spoilers to your text. The text also supports &lt;strong&gt;Markdown&lt;/strong&gt; syntax.&lt;/p&gt;
&lt;p&gt;The content :spoiler[is hidden &lt;strong&gt;ayyy&lt;/strong&gt;]!&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;The content :spoiler[is hidden **ayyy**]!

&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>Expressive Code Example</title><link>https://uuicicn.top/posts/expressive-code/</link><guid isPermaLink="true">https://uuicicn.top/posts/expressive-code/</guid><description>How code blocks look in Markdown using Expressive Code.</description><pubDate>Wed, 10 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Here, we&apos;ll explore how code blocks look using &lt;a href=&quot;https://expressive-code.com/&quot;&gt;Expressive Code&lt;/a&gt;. The provided examples are based on the official documentation, which you can refer to for further details.&lt;/p&gt;
&lt;h2&gt;Expressive Code&lt;/h2&gt;
&lt;h3&gt;Syntax Highlighting&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://expressive-code.com/key-features/syntax-highlighting/&quot;&gt;Syntax Highlighting&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;Regular syntax highlighting&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;console.log(&apos;This code is syntax highlighted!&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Rendering ANSI escape sequences&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;ANSI colors:
- Regular: [31mRed[0m [32mGreen[0m [33mYellow[0m [34mBlue[0m [35mMagenta[0m [36mCyan[0m
- Bold:    [1;31mRed[0m [1;32mGreen[0m [1;33mYellow[0m [1;34mBlue[0m [1;35mMagenta[0m [1;36mCyan[0m
- Dimmed:  [2;31mRed[0m [2;32mGreen[0m [2;33mYellow[0m [2;34mBlue[0m [2;35mMagenta[0m [2;36mCyan[0m

256 colors (showing colors 160-177):
[38;5;160m160 [38;5;161m161 [38;5;162m162 [38;5;163m163 [38;5;164m164 [38;5;165m165[0m
[38;5;166m166 [38;5;167m167 [38;5;168m168 [38;5;169m169 [38;5;170m170 [38;5;171m171[0m
[38;5;172m172 [38;5;173m173 [38;5;174m174 [38;5;175m175 [38;5;176m176 [38;5;177m177[0m

Full RGB colors:
[38;2;34;139;34mForestGreen - RGB(34, 139, 34)[0m

Text formatting: [1mBold[0m [2mDimmed[0m [3mItalic[0m [4mUnderline[0m
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Editor &amp;amp; Terminal Frames&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://expressive-code.com/key-features/frames/&quot;&gt;Editor &amp;amp; Terminal Frames&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;Code editor frames&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;console.log(&apos;Title attribute example&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!-- src/content/index.html --&amp;gt;
&amp;lt;div&amp;gt;File name comment example&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Terminal frames&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;echo &quot;This terminal frame has no title&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;pre&gt;&lt;code&gt;Write-Output &quot;This one has a title!&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Overriding frame types&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;echo &quot;Look ma, no frame!&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;pre&gt;&lt;code&gt;# Without overriding, this would be a terminal frame
function Watch-Tail { Get-Content -Tail 20 -Wait $args }
New-Alias tail Watch-Tail
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Text &amp;amp; Line Markers&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://expressive-code.com/key-features/text-markers/&quot;&gt;Text &amp;amp; Line Markers&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;Marking full lines &amp;amp; line ranges&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;// Line 1 - targeted by line number
// Line 2
// Line 3
// Line 4 - targeted by line number
// Line 5
// Line 6
// Line 7 - targeted by range &quot;7-8&quot;
// Line 8 - targeted by range &quot;7-8&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Selecting line marker types (mark, ins, del)&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;function demo() {
  console.log(&apos;this line is marked as deleted&apos;)
  // This line and the next one are marked as inserted
  console.log(&apos;this is the second inserted line&apos;)

  return &apos;this line uses the neutral default marker type&apos;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Adding labels to line markers&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;// labeled-line-markers.jsx
&amp;lt;button
  role=&quot;button&quot;
  {...props}
  value={value}
  className={buttonClassName}
  disabled={disabled}
  active={active}
&amp;gt;
  {children &amp;amp;&amp;amp;
    !active &amp;amp;&amp;amp;
    (typeof children === &apos;string&apos; ? &amp;lt;span&amp;gt;{children}&amp;lt;/span&amp;gt; : children)}
&amp;lt;/button&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Adding long labels on their own lines&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;// labeled-line-markers.jsx
&amp;lt;button
  role=&quot;button&quot;
  {...props}

  value={value}
  className={buttonClassName}

  disabled={disabled}
  active={active}
&amp;gt;

  {children &amp;amp;&amp;amp;
    !active &amp;amp;&amp;amp;
    (typeof children === &apos;string&apos; ? &amp;lt;span&amp;gt;{children}&amp;lt;/span&amp;gt; : children)}
&amp;lt;/button&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Using diff-like syntax&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;+this line will be marked as inserted
-this line will be marked as deleted
this is a regular line
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;pre&gt;&lt;code&gt;--- a/README.md
+++ b/README.md
@@ -1,3 +1,4 @@
+this is an actual diff file
-all contents will remain unmodified
 no whitespace will be removed either
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Combining syntax highlighting with diff-like syntax&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;  function thisIsJavaScript() {
    // This entire block gets highlighted as JavaScript,
    // and we can still add diff markers to it!
-   console.log(&apos;Old code to be removed&apos;)
+   console.log(&apos;New and shiny code!&apos;)
  }
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Marking individual text inside lines&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;function demo() {
  // Mark any given text inside lines
  return &apos;Multiple matches of the given text are supported&apos;;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Regular expressions&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;console.log(&apos;The words yes and yep will be marked.&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Escaping forward slashes&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;echo &quot;Test&quot; &amp;gt; /home/test.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Selecting inline marker types (mark, ins, del)&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;function demo() {
  console.log(&apos;These are inserted and deleted marker types&apos;);
  // The return statement uses the default marker type
  return true;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Word Wrap&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://expressive-code.com/key-features/word-wrap/&quot;&gt;Word Wrap&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;Configuring word wrap per block&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;// Example with wrap
function getLongString() {
  return &apos;This is a very long string that will most probably not fit into the available space unless the container is extremely wide&apos;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;pre&gt;&lt;code&gt;// Example with wrap=false
function getLongString() {
  return &apos;This is a very long string that will most probably not fit into the available space unless the container is extremely wide&apos;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Configuring indentation of wrapped lines&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;// Example with preserveIndent (enabled by default)
function getLongString() {
  return &apos;This is a very long string that will most probably not fit into the available space unless the container is extremely wide&apos;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;pre&gt;&lt;code&gt;// Example with preserveIndent=false
function getLongString() {
  return &apos;This is a very long string that will most probably not fit into the available space unless the container is extremely wide&apos;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Collapsible Sections&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://expressive-code.com/plugins/collapsible-sections/&quot;&gt;Collapsible Sections&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// All this boilerplate setup code will be collapsed
import { someBoilerplateEngine } from &apos;@example/some-boilerplate&apos;
import { evenMoreBoilerplate } from &apos;@example/even-more-boilerplate&apos;

const engine = someBoilerplateEngine(evenMoreBoilerplate())

// This part of the code will be visible by default
engine.doSomething(1, 2, 3, calcFn)

function calcFn() {
  // You can have multiple collapsed sections
  const a = 1
  const b = 2
  const c = a + b

  // This will remain visible
  console.log(`Calculation result: ${a} + ${b} = ${c}`)
  return c
}

// All this code until the end of the block will be collapsed again
engine.closeConnection()
engine.freeMemory()
engine.shutdown({ reason: &apos;End of example boilerplate code&apos; })
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Line Numbers&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://expressive-code.com/plugins/line-numbers/&quot;&gt;Line Numbers&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Displaying line numbers per block&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;// This code block will show line numbers
console.log(&apos;Greetings from line 2!&apos;)
console.log(&apos;I am on line 3&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;pre&gt;&lt;code&gt;// Line numbers are disabled for this block
console.log(&apos;Hello?&apos;)
console.log(&apos;Sorry, do you know what line I am on?&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Changing the starting line number&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;console.log(&apos;Greetings from line 5!&apos;)
console.log(&apos;I am on line 6&apos;)
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>Simple Guides for Fuwari</title><link>https://uuicicn.top/posts/guide/</link><guid isPermaLink="true">https://uuicicn.top/posts/guide/</guid><description>How to use this blog template.</description><pubDate>Mon, 01 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;Cover image source: &lt;a href=&quot;https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/208fc754-890d-4adb-9753-2c963332675d/width=2048/01651-1456859105-(colour_1.5),girl,_Blue,yellow,green,cyan,purple,red,pink,_best,8k,UHD,masterpiece,male%20focus,%201boy,gloves,%20ponytail,%20long%20hair,.jpeg&quot;&gt;Source&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This blog template is built with &lt;a href=&quot;https://astro.build/&quot;&gt;Astro&lt;/a&gt;. For the things that are not mentioned in this guide, you may find the answers in the &lt;a href=&quot;https://docs.astro.build/&quot;&gt;Astro Docs&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Front-matter of Posts&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;---
title: My First Blog Post
published: 2023-09-09
description: This is the first post of my new Astro blog.
image: ./cover.jpg
tags: [Foo, Bar]
category: Front-end
draft: false
---
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Attribute&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;title&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The title of the post.&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;The date the post was published.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;description&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A short description of the post. Displayed on index page.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;image&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The cover image path of the post.&amp;lt;br/&amp;gt;1. Start with &lt;code&gt;http://&lt;/code&gt; or &lt;code&gt;https://&lt;/code&gt;: Use web image&amp;lt;br/&amp;gt;2. Start with &lt;code&gt;/&lt;/code&gt;: For image in &lt;code&gt;public&lt;/code&gt; dir&amp;lt;br/&amp;gt;3. With none of the prefixes: Relative to the markdown file&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;The tags of the post.&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;The category of the post.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;draft&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;If this post is still a draft, which won&apos;t be displayed.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;Where to Place the Post Files&lt;/h2&gt;
&lt;p&gt;Your post files should be placed in &lt;code&gt;src/content/posts/&lt;/code&gt; directory. You can also create sub-directories to better organize your posts and assets.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;src/content/posts/
├── post-1.md
└── post-2/
    ├── cover.png
    └── index.md
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>Markdown Example</title><link>https://uuicicn.top/posts/markdown/</link><guid isPermaLink="true">https://uuicicn.top/posts/markdown/</guid><description>A simple example of a Markdown blog post.</description><pubDate>Sun, 01 Oct 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;An h1 header&lt;/h1&gt;
&lt;p&gt;Paragraphs are separated by a blank line.&lt;/p&gt;
&lt;p&gt;2nd paragraph. &lt;em&gt;Italic&lt;/em&gt;, &lt;strong&gt;bold&lt;/strong&gt;, and &lt;code&gt;monospace&lt;/code&gt;. Itemized lists
look like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;this one&lt;/li&gt;
&lt;li&gt;that one&lt;/li&gt;
&lt;li&gt;the other one&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Note that --- not considering the asterisk --- the actual text
content starts at 4-columns in.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Block quotes are
written like so.&lt;/p&gt;
&lt;p&gt;They can span multiple paragraphs,
if you like.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Use 3 dashes for an em-dash. Use 2 dashes for ranges (ex., &quot;it&apos;s all
in chapters 12--14&quot;). Three dots ... will be converted to an ellipsis.
Unicode is supported. ☺&lt;/p&gt;
&lt;h2&gt;An h2 header&lt;/h2&gt;
&lt;p&gt;Here&apos;s a numbered list:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;first item&lt;/li&gt;
&lt;li&gt;second item&lt;/li&gt;
&lt;li&gt;third item&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Note again how the actual text starts at 4 columns in (4 characters
from the left side). Here&apos;s a code sample:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Let me re-iterate ...
for i in 1 .. 10 { do-something(i) }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;As you probably guessed, indented 4 spaces. By the way, instead of
indenting the block, you can use delimited blocks, if you like:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;define foobar() {
    print &quot;Welcome to flavor country!&quot;;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;(which makes copying &amp;amp; pasting easier). You can optionally mark the
delimited block for Pandoc to syntax highlight it:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import time
# Quick, count to ten!
for i in range(10):
    # (but not *too* quick)
    time.sleep(0.5)
    print i
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;An h3 header&lt;/h3&gt;
&lt;p&gt;Now a nested list:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;First, get these ingredients:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;carrots&lt;/li&gt;
&lt;li&gt;celery&lt;/li&gt;
&lt;li&gt;lentils&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Boil some water.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Dump everything in the pot and follow
this algorithm:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; find wooden spoon
 uncover pot
 stir
 cover pot
 balance wooden spoon precariously on pot handle
 wait 10 minutes
 goto first step (or shut off burner when done)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Do not bump wooden spoon or it will fall.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Notice again how text always lines up on 4-space indents (including
that last line which continues item 3 above).&lt;/p&gt;
&lt;p&gt;Here&apos;s a link to &lt;a href=&quot;http://foo.bar&quot;&gt;a website&lt;/a&gt;, to a &lt;a href=&quot;local-doc.html&quot;&gt;local
doc&lt;/a&gt;, and to a &lt;a href=&quot;#an-h2-header&quot;&gt;section heading in the current
doc&lt;/a&gt;. Here&apos;s a footnote [^1].&lt;/p&gt;
&lt;p&gt;[^1]: Footnote text goes here.&lt;/p&gt;
&lt;p&gt;Tables can look like this:&lt;/p&gt;
&lt;p&gt;size material color&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;9 leather brown
10 hemp canvas natural
11 glass transparent&lt;/p&gt;
&lt;p&gt;Table: Shoes, their sizes, and what they&apos;re made of&lt;/p&gt;
&lt;p&gt;(The above is the caption for the table.) Pandoc also supports
multi-line tables:&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;keyword text&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;red Sunsets, apples, and
other red or reddish
things.&lt;/p&gt;
&lt;p&gt;green Leaves, grass, frogs
and other things it&apos;s
not easy being.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;A horizontal rule follows.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Here&apos;s a definition list:&lt;/p&gt;
&lt;p&gt;apples
: Good for making applesauce.
oranges
: Citrus!
tomatoes
: There&apos;s no &quot;e&quot; in tomatoe.&lt;/p&gt;
&lt;p&gt;Again, text is indented 4 spaces. (Put a blank line between each
term/definition pair to spread things out more.)&lt;/p&gt;
&lt;p&gt;Here&apos;s a &quot;line block&quot;:&lt;/p&gt;
&lt;p&gt;| Line one
| Line too
| Line tree&lt;/p&gt;
&lt;p&gt;and images can be specified like so:&lt;/p&gt;
&lt;p&gt;Inline math equations go in like so: $\omega = d\phi / dt$. Display
math should get its own line and be put in in double-dollarsigns:&lt;/p&gt;
&lt;p&gt;$$I = \int \rho R^{2} dV$$&lt;/p&gt;
&lt;p&gt;$$
\begin{equation*}
\pi
=3.1415926535
;8979323846;2643383279;5028841971;6939937510;5820974944
;5923078164;0628620899;8628034825;3421170679;\ldots
\end{equation*}
$$&lt;/p&gt;
&lt;p&gt;And note that you can backslash-escape any punctuation characters
which you wish to be displayed literally, ex.: `foo`, *bar*, etc.&lt;/p&gt;
</content:encoded></item><item><title>Include Video in the Posts</title><link>https://uuicicn.top/posts/video/</link><guid isPermaLink="true">https://uuicicn.top/posts/video/</guid><description>This post demonstrates how to include embedded video in a blog post.</description><pubDate>Tue, 01 Aug 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Just copy the embed code from YouTube or other platforms, and paste it in the markdown file.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;---
title: Include Video in the Post
published: 2023-10-19
// ...
---

&amp;lt;iframe width=&quot;100%&quot; height=&quot;468&quot; src=&quot;https://www.youtube.com/embed/5gIf0_xpFPI?si=N1WTorLKL0uwLsU_&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;YouTube&lt;/h2&gt;
&lt;p&gt;&amp;lt;iframe width=&quot;100%&quot; height=&quot;468&quot; src=&quot;https://www.youtube.com/embed/5gIf0_xpFPI?si=N1WTorLKL0uwLsU_&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/p&gt;
&lt;h2&gt;Bilibili&lt;/h2&gt;
&lt;p&gt;&amp;lt;iframe width=&quot;100%&quot; height=&quot;468&quot; src=&quot;//player.bilibili.com/player.html?bvid=BV1fK4y1s7Qf&amp;amp;p=1&quot; scrolling=&quot;no&quot; border=&quot;0&quot; frameborder=&quot;no&quot; framespacing=&quot;0&quot; allowfullscreen=&quot;true&quot;&amp;gt; &amp;lt;/iframe&amp;gt;&lt;/p&gt;
</content:encoded></item></channel></rss>