<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <id>https://drings.im/</id>
  <title type="text">dringsim&apos;s blog</title>
  <subtitle type="text"></subtitle>
  <updated>2026-09-09T00:00:00.000Z</updated>
  <author><name>dringsim</name></author>
  <link rel="alternate" href="https://drings.im/"/>
  <link rel="self" href="https://drings.im/atom.xml"/>
  <generator uri="https://github.com/CuteLeaf/Firefly">Firefly v6.16.8</generator>
    <entry>
      <id>https://drings.im/posts/blog-startup/</id>
      <title type="text">使用Firefly主题在Cloudflare Pages搭建个人博客</title>
      <published>2026-09-09T00:00:00.000Z</published>
      <updated>2026-09-09T00:00:00.000Z</updated>
      <author><name>dringsim</name></author>
      <link rel="alternate" href="https://drings.im/posts/blog-startup/"/>
      <summary type="text">使用Firefly astro主题搭建个人博客并在Cloudflare Pages部署，配置域名，以及在Firefly上进行自定义修改的记录。</summary>
      <content type="html"><![CDATA[<section><h2>安装博客主题<a href="#安装博客主题"><span>#</span></a></h2><p>按<a href="https://docs-firefly.cuteleaf.cn/zh/guide/getting-started.html" target="_blank">Firefly文档</a>的说明操作：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 克隆仓库</span></div></div><div><div><div>2</div></div><div><span>git</span><span> </span><span>clone</span><span> </span><span>https://github.com/CuteLeaf/Firefly.git</span><span> </span><span>blog</span></div></div><div><div><div>3</div></div><div><span>cd</span><span> </span><span>blog</span></div></div><div><div><div>4</div></div><div><span># 安装依赖</span></div></div><div><div><div>5</div></div><div><span>pnpm</span><span> </span><span>install</span></div></div><div><div><div>6</div></div><div><span># 构建</span></div></div><div><div><div>7</div></div><div><span>pnpm</span><span> </span><span>build</span></div></div><div><div><div>8</div></div><div><span># 预览</span></div></div><div><div><div>9</div></div><div><span>pnpm</span><span> </span><span>preview</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span># 设置远程仓库</span></div></div><div><div><div>12</div></div><div><span>git</span><span> </span><span>remote</span><span> </span><span>set-url</span><span> </span><span>origin</span><span> </span><span>https://github.com/dringsim/blog</span></div></div><div><div><div>13</div></div><div><span># 推送</span></div></div><div><div><div>14</div></div><div><span>git</span><span> </span><span>push</span><span> </span><span>-u</span><span> </span><span>origin</span><span> </span><span>main</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>如果需要拉取上游更新：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 添加上游仓库</span></div></div><div><div><div>2</div></div><div><span>git</span><span> </span><span>remote</span><span> </span><span>add</span><span> </span><span>upstream</span><span> </span><span>https://github.com/CuteLeaf/Firefly.git</span></div></div><div><div><div>3</div></div><div><span># 拉取更新</span></div></div><div><div><div>4</div></div><div><span>git</span><span> </span><span>fetch</span><span> </span><span>upstream</span></div></div><div><div><div>5</div></div><div><span># 合并</span></div></div><div><div><div>6</div></div><div><span>git</span><span> </span><span>merge</span><span> </span><span>upstream/master</span></div></div><div><div><div>7</div></div><div><span># 如果出现合并冲突，手动解决冲突后commit</span></div></div><div><div><div>8</div></div><div><span>git</span><span> </span><span>add</span><span> </span><span>.</span></div></div><div><div><div>9</div></div><div><span>git</span><span> </span><span>commit</span><span> </span><span>-m</span><span> </span><span>"merge: update Firefly theme"</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>部署在Cloudflare Pages<a href="#部署在cloudflare-pages"><span>#</span></a></h2><p>打开<a href="https://dash.cloudflare.com/" target="_blank">Cloudflare Dashboard</a>，在左侧“计算”中选择“Workers和Pages”，点击“创建应用程序”，再点击“想要部署Pages？”之后的“开始使用”，选择“导入现有Git存储库”，然后账号授权并选择仓库。</p><p></p><figure><img alt="选择存储库" loading="lazy" width="2544" height="1710" src="/_astro/cf1.D0S72IEx_Z75el.webp" /><figcaption>选择存储库</figcaption></figure><p></p><p>填写项目名称，构建命令填写<span><code><span><span>pnpm</span><span> build</span></span></code></span>，构建输出目录填写<code>dist</code>，点击“保存并部署”。</p><p></p><figure><img alt="设置构建和部署" loading="lazy" width="2544" height="1710" src="/_astro/cf2.Dytogcsp_Zw6vSm.webp" /><figcaption>设置构建和部署</figcaption></figure><p></p><p>后续向仓库生产分支的推送都会自动部署。</p></section>
<section><h2>自定义域名<a href="#自定义域名"><span>#</span></a></h2><section><h3>绑定域名<a href="#绑定域名"><span>#</span></a></h3><p>可以在<a href="https://www.spaceship.com/" target="_blank">Spaceship</a>购买到较为廉价的域名。</p><p>在“Workers和Pages”中选择之前创建的Pages项目，点击“自定义域”。如果输入的自定义域名不是在Cloudflare购买的，Cloudflare会提示“需要将DNS转移到Cloudflare”，此时需要到域名服务商处（例如Spaceship的<a href="https://www.spaceship.com/zh/application/domain-list-application/" target="_blank">域名管理器</a>）将域名的名称服务器修改为Cloudflare的名称服务器。</p><p></p><figure><img alt="开始DNS转移" loading="lazy" width="2544" height="1710" src="/_astro/cf3.DAzOsWMJ_1oDzFC.webp" /><figcaption>开始DNS转移</figcaption></figure><p></p><p></p><figure><img alt="修改名称服务器的步骤" loading="lazy" width="2544" height="1708" src="/_astro/cf4.BpZA1VCo_ZVgYRK.webp" /><figcaption>修改名称服务器的步骤</figcaption></figure><p></p><p></p><figure><img alt="更新域名的名称服务器" loading="lazy" width="2544" height="1710" src="/_astro/ss1.ChH2ZqzT_1HhTXD.webp" /><figcaption>更新域名的名称服务器</figcaption></figure><p></p><p>待新的名称服务器传播到全球后，就可以在Cloudflare管理DNS记录了。</p><p></p><figure><img alt="DNS记录传播状态" loading="lazy" width="2544" height="1710" src="/_astro/ss2.BTDvvHhz_1yVux4.webp" /><figcaption>DNS记录传播状态</figcaption></figure><p></p><p>之后回到Pages项目设置自定义域名。Cloudflare会添加下述DNS记录：</p>

<table><thead><tr><th>名称</th><th>类型</th><th>内容</th><th>代理状态</th><th>TTL</th></tr></thead><tbody><tr><td><code>@</code></td><td>CNAME</td><td><code>&lt;YOUR_SITE&gt;.pages.dev</code>（项目默认域名）</td><td>已代理</td><td>自动</td></tr></tbody></table><p>可以用<span><code><span><span>nslookup</span></span></code></span>命令检查DNS是否生效。</p><p>绑定域名后，还需将<code>src/config/siteConfig.ts</code>的<span><code><span><span>siteConfig</span><span>.</span><span>site_url</span></span></code></span>字段修改为实际的域名。</p></section><section><h3>防止电子邮件欺骗<a href="#防止电子邮件欺骗"><span>#</span></a></h3><p>建议添加限制性DNS记录以防止电子邮件欺骗。在Cloudflare Dashboard左侧“域名”下的“概览”选择自己的域名，在左侧“DNS”下的“记录”中管理DNS记录。按照“推荐”拦的提示添加限制性记录。</p><p></p><figure><img alt="管理DNS记录" loading="lazy" width="2544" height="1710" src="/_astro/cf5.DbLDnjQk_ISM9E.webp" /><figcaption>管理DNS记录</figcaption></figure><p></p>

<table><thead><tr><th>名称</th><th>类型</th><th>内容</th><th>TTL</th></tr></thead><tbody><tr><td><code>@</code></td><td>TXT</td><td><code>"v=spf1 -all"</code></td><td>自动</td></tr><tr><td><code>*._domainkey</code></td><td>TXT</td><td><code>"v=DKIM1; p="</code></td><td>自动</td></tr><tr><td><code>_dmarc</code></td><td>TXT</td><td><code>"v=DMARC1; p=reject; sp=reject; adkim=s; aspf=s;"</code></td><td>自动</td></tr></tbody></table><p>这些记录会通知接收邮件服务器丢弃从该域名发送的所有传入电子邮件。</p><p></p><figure><img alt="DMARC管理" loading="lazy" width="2544" height="1710" src="/_astro/cf6.UHdzTNm7_Zz7urm.webp" /><figcaption>DMARC管理</figcaption></figure><p></p></section><section><h3>配置重定向<a href="#配置重定向"><span>#</span></a></h3><p>Cloudflare提供了规则模板，可以创建从HTTP重定向到HTTPS以及从WWW子域重定向到根域名的重定向规则。在Cloudflare域名管理页面左侧“规则”下的“概述”添加重定向规则。</p><p></p><figure><img alt="Cloudflare的重定向规则模板" loading="lazy" width="2544" height="1710" src="/_astro/cf7.D6cqmvgm_ZCC4MO.webp" /><figcaption>Cloudflare的重定向规则模板</figcaption></figure><p></p><p>要使WWW重定向到根的规则生效，还需添加一条DNS记录：</p>

<table><thead><tr><th>名称</th><th>类型</th><th>内容</th><th>代理状态</th><th>TTL</th></tr></thead><tbody><tr><td><code>www</code></td><td>A</td><td><code>192.0.2.1</code>（放弃请求）</td><td>已代理</td><td>自动</td></tr></tbody></table></section></section>
<section><h2>魔改<a href="#魔改"><span>#</span></a></h2><section><h3>自定义样式<a href="#自定义样式"><span>#</span></a></h3><p>在<code>src/layouts/MainGridLayout.astro</code>加入一行<span><code><span><span>import</span><span> "@/styles/custom/custom.css"</span><span>;</span></span></code></span>，接下来就可以加料了，例如<span><code><span><span>text-autospace</span><span>: normal</span></span></code></span>：</p><div><div><div><figure><figcaption><span>src/styles/custom/custom.css</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>/* https://zh.wikipedia.org/wiki/MediaWiki:Gadget-text-spacing.css */</span></div></div><div><div><div>2</div></div><div><span>:root</span><span> {</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>text-autospace: </span><span>normal</span><span>;</span></div></div><div><div><div>4</div></div><div><span>}</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>/* Firefox &amp; Safari bug: https://github.com/w3c/csswg-drafts/issues/9979 */</span></div></div><div><div><div>7</div></div><div><span>:lang</span><span>(</span><span>ko</span><span><span>)</span><span>,</span></span></div></div><div><div><div>8</div></div><div><span>/* Monospace (and likely monospace) elements */</span></div></div><div><div><div>9</div></div><div><span>code</span><span><span>,</span><span> </span></span><span>kbd</span><span><span>,</span><span> </span></span><span>pre</span><span><span>,</span><span> </span></span><span>rp</span><span><span>,</span><span> </span></span><span>rt</span><span><span>,</span><span> </span></span><span>samp</span><span><span>,</span><span> </span></span><span>textarea</span><span><span>,</span><span> </span></span><span>var</span><span>,</span></div></div><div><div><div>10</div></div><div><span>/* Elements with this class are excluded */</span></div></div><div><div><div>11</div></div><div><span>.nospace</span><span>,</span></div></div><div><div><div>12</div></div><div><span>/* Editable elements */</span></div></div><div><div><div>13</div></div><div><span>[</span><span>contenteditable</span><span>=</span><span>"true"</span><span>]</span><span> {</span></div></div><div><div><div>14</div></div><div><span><span>  </span></span><span>text-autospace: no-autospace;</span></div></div><div><div><div>15</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>还有IPA（<span>/ˌaɪ.piːˈeɪ/</span>）的字体样式：</p><div><figure><figcaption><span>src/styles/custom/custom.css</span></figcaption><pre><code><div><div><div>1</div></div><div><span>/* https://en.wiktionary.org/wiki/MediaWiki:Gadget-LanguagesAndScripts.css */</span></div></div><div><div><div>2</div></div><div><span>.IPA</span><span> {</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>font-family: Gentium, </span><span>'Gentium Plus'</span><span>, GentiumAlt, </span><span>'DejaVu Sans'</span><span>, </span><span>'Segoe UI'</span><span>, </span><span>'Lucida Grande'</span><span>, </span><span>'Charis SIL'</span><span>, </span><span>'Doulos SIL'</span><span>, </span><span>'TITUS Cyberbit Basic'</span><span>, </span><span>'Code2000'</span><span>, </span><span>'Lucida Sans Unicode'</span><span>, </span><span>sans-serif</span><span>;</span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>font-size: </span><span><span>110</span><span>%</span></span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>  </span></span><span>font-variant-ligatures: </span><span>no-common-ligatures</span><span>;</span></div></div><div><div><div>6</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>导入其它样式表：</p><div><figure><figcaption><span>src/styles/custom/custom.css</span></figcaption><pre><code><div><div><div>1</div></div><div><span>@import</span><span> </span><span>'./rehype-pretty.css'</span><span>;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>行内代码高亮<a href="#行内代码高亮"><span>#</span></a></h3><p>Firefly使用<a href="https://expressive-code.com/" target="_blank">Expressive Code</a>提供代码高亮，而Expressive Code<a href="https://github.com/expressive-code/expressive-code/discussions/395" target="_blank">尚不支持这一功能</a>。<a href="https://rehype-pretty.pages.dev/" target="_blank">Rehype Pretty Code</a>提供了这一功能。<a href="https://github.com/expressive-code/expressive-code/discussions/395" target="_blank">可以将这两者联用</a>，但要注意Expressive Code必须先于Rehype Pretty Code加载。此时，已通过Astro集成加载Expressive Code时，就不能把<span><code><span>rehypePrettyCode</span></code></span>直接塞进<span><code><span>rehypePlugins</span></code></span>了，要用Astro集成包装一下，再放到<span><code><span><span>expressiveCode</span><span>()</span></span></code></span>之后。这里拿<a href="https://github.com/expressive-code/expressive-code/tree/main/packages/astro-expressive-code/src" target="_blank">astro-expressive-code</a>的代码改一下，并同时加入对应的样式：</p><div><div>src/plugins/custom/astro-rehype-pretty.tssrc/styles/custom/rehype-pretty.css</div><div><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>import</span><span> </span><span>type</span><span> { </span><span>AstroIntegration</span><span> } </span><span>from</span><span> </span><span>"astro"</span><span>;</span></div></div><div><div><div>2</div></div><div><span>import</span><span> </span><span>rehypePrettyCode</span><span> </span><span>from</span><span> </span><span>"rehype-pretty-code"</span><span>;</span></div></div><div><div><div>3</div></div><div><span>import</span><span> </span><span>type</span><span> { </span><span>BuiltinTheme</span><span> } </span><span>from</span><span> </span><span>"shiki"</span><span>;</span></div></div><div><div><div>4</div></div><div><span>import</span><span> { </span><span>expressiveCodeConfig</span><span> } </span><span>from</span><span> </span><span>"../../config/"</span><span>;</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>type</span><span> </span><span>ConfigSetupHookArgs</span><span> </span><span>=</span><span> </span><span>Parameters</span><span>&lt;</span></div></div><div><div><div>7</div></div><div><span>  </span><span>NonNullable</span><span>&lt;</span><span>AstroIntegration</span><span>[</span><span>"hooks"</span><span>][</span><span>"astro:config:setup"</span><span>]&gt;</span></div></div><div><div><div>8</div></div><div><span>&gt;[</span><span>0</span><span>];</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>export</span><span> </span><span>default</span><span> </span><span>function</span><span> </span><span>astroRehypePretty</span><span>() {</span></div></div><div><div><div>11</div></div><div><span>  </span><span>return</span><span> {</span></div></div><div><div><div>12</div></div><div><span>    </span><span>name</span><span>:</span><span> </span><span>"astro-rehype-pretty"</span><span>,</span></div></div><div><div><div>13</div></div><div><span>    </span><span>hooks</span><span>:</span><span> {</span></div></div><div><div><div>14</div></div><div><span>      </span><span>"astro:config:setup"</span><span>:</span><span> </span><span>async</span><span><span> (</span><span>args</span></span><span>:</span><span> </span><span>unknown</span><span>) </span><span>=&gt;</span><span> {</span></div></div><div><div><div>15</div></div><div><span>        </span><span>const</span><span> { </span><span>config</span><span>: </span><span>astroConfig</span><span> } </span><span>=</span><span> </span><span>args</span><span><span> </span><span>as</span><span> </span></span><span>ConfigSetupHookArgs</span><span>;</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>        </span><span>const</span><span> </span><span>markdownProcessorOptions</span><span> </span><span>=</span><span><span> </span><span>astroConfig</span><span>.</span></span><span>markdown</span><span>.</span><span>processor</span></div></div><div><div><div>18</div></div><div><span><span>          </span></span><span>.</span><span>options</span><span><span> </span><span>as</span><span> { </span><span>rehypePlugins</span></span><span>:</span><span> </span><span>unknown</span><span>[] };</span></div></div><div><div><div>19</div></div><div><span><span>        </span></span><span>markdownProcessorOptions</span><span>.</span><span>rehypePlugins</span><span>.</span><span>push</span><span>(() </span><span>=&gt;</span></div></div><div><div><div>20</div></div><div><span>          </span><span>rehypePrettyCode</span><span>({</span></div></div><div><div><div>21</div></div><div><span>            </span><span>theme</span><span>:</span><span> {</span></div></div><div><div><div>22</div></div><div><span>              </span><span>light</span><span>:</span><span><span> </span><span>expressiveCodeConfig</span><span>.</span></span><span>lightTheme</span><span><span> </span><span>as</span><span> </span></span><span>BuiltinTheme</span><span>,</span></div></div><div><div><div>23</div></div><div><span>              </span><span>dark</span><span>:</span><span><span> </span><span>expressiveCodeConfig</span><span>.</span></span><span>darkTheme</span><span><span> </span><span>as</span><span> </span></span><span>BuiltinTheme</span><span>,</span></div></div><div><div><div>24</div></div><div><span><span>            </span></span><span>},</span></div></div><div><div><div>25</div></div><div><span><span>          </span></span><span>}),</span></div></div><div><div><div>26</div></div><div><span><span>        </span></span><span>);</span></div></div><div><div><div>27</div></div><div><span><span>      </span></span><span>},</span></div></div><div><div><div>28</div></div><div><span><span>    </span></span><span>},</span></div></div><div><div><div>29</div></div><div><span><span>  </span></span><span>} </span><span>satisfies</span><span> </span><span>AstroIntegration</span><span>;</span></div></div><div><div><div>30</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>code</span><span>[</span><span>data-theme</span><span>*=</span><span>" "</span><span><span>]</span><span>,</span></span></div></div><div><div><div>2</div></div><div><span>code</span><span>[</span><span>data-theme</span><span>*=</span><span>" "</span><span>] </span><span>span</span><span> {</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>color: </span><span>var</span><span>(</span><span>--shiki-light</span><span>);</span></div></div><div><div><div>4</div></div><div><span>}</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span><span>:root</span><span>.dark</span></span><span> {</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>code[data-theme*=" "],</span></div></div><div><div><div>8</div></div><div><span><span>    </span></span><span>code[data-theme*=" "] span {</span></div></div><div><div><div>9</div></div><div><span><span>        </span></span><span>color: </span><span>var</span><span>(</span><span>--shiki-dark</span><span>);</span></div></div><div><div><div>10</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>11</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></div></div></section><section><h3>着重号<a href="#着重号"><span>#</span></a></h3><p>Linca<a href="https://lhcfl.github.io/blog/2026-06-22-%E4%BB%8E%E5%8D%9A%E5%AE%A2%E7%BE%8E%E5%8C%96%E5%BC%80%E5%A7%8B%E7%9A%84%E6%8E%92%E7%89%88%E5%AD%A6%E7%AC%94%E8%AE%B0/" target="_blank">写了个rehype插件</a>来处理中西文混排的强调样式。这个插件会给含有汉字的<span><code><span><span>&lt;</span><span>em</span><span>&gt;</span></span></code></span>都加上<span><code><span><span>lang="zh"</span></span></code></span>。但是呢，有汉字的文本<em>不一定是中文</em>……</p><p><a href="https://www.w3.org/TR/clreq/#id84" target="_blank">《中文排版需求》</a>规定“当中文与日文文本相互嵌入时，着重号的使用需遵循文本的主要语言风格”。这里我们对插件稍作修改，对含有汉字、注音符号、假名或谚文的文本都使用在文本下方的圆形中黑点作为着重号：</p><div><div>src/plugins/custom/rehype-em-cjk.tssrc/styles/custom/custom.css</div><div><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>import</span><span> </span><span>type</span><span> { </span><span>Root</span><span> } </span><span>from</span><span> </span><span>"hast"</span><span>;</span></div></div><div><div><div>2</div></div><div><span>import</span><span><span> { </span><span>toString</span><span> </span><span>as</span><span> </span></span><span>hastToString</span><span> } </span><span>from</span><span> </span><span>"hast-util-to-string"</span><span>;</span></div></div><div><div><div>3</div></div><div><span>import</span><span> { </span><span>visit</span><span> } </span><span>from</span><span> </span><span>"unist-util-visit"</span><span>;</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>export</span><span> </span><span>default</span><span> </span><span>function</span><span> </span><span>rehypeEmCJK</span><span>() {</span></div></div><div><div><div>6</div></div><div><span>  </span><span>return</span><span><span> (</span><span>tree</span></span><span>:</span><span> </span><span>Root</span><span>) </span><span>=&gt;</span><span> {</span></div></div><div><div><div>7</div></div><div><span>    </span><span>visit</span><span>(</span><span>tree</span><span>, </span><span>"element"</span><span><span>, (</span><span>node</span><span>) </span></span><span>=&gt;</span><span> {</span></div></div><div><div><div>8</div></div><div><span>      </span><span>if</span><span> ([</span><span>"em"</span><span>].</span><span>includes</span><span><span>(</span><span>node</span><span>.</span></span><span>tagName</span><span>)) {</span></div></div><div><div><div>9</div></div><div><span>        </span><span>const</span><span> </span><span>textContent</span><span> </span><span>=</span><span> </span><span>hastToString</span><span>(</span><span>node</span><span>);</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>        </span><span>if</span><span> (</span></div></div><div><div><div>12</div></div><div><span><span>          </span></span><span>textContent</span><span>.</span><span>match</span><span>(</span></div></div><div><div><div>13</div></div><div><span>            </span><span>/</span><span>[</span><span>\p</span><span>{Script=Hani}</span><span>\p</span><span>{Script=Hira}</span><span>\p</span><span>{Script=Kana}</span><span>\p</span><span>{Script=Hang}</span><span>\p</span><span>{Script=Bopo}]</span><span><span>+</span><span>/</span></span><span>gu</span><span>,</span></div></div><div><div><div>14</div></div><div><span><span>          </span></span><span>)</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>) {</span></div></div><div><div><div>16</div></div><div><span><span>          </span></span><span>node</span><span>.</span><span>properties</span><span>.</span><span>className</span><span> </span><span>=</span><span><span> </span><span>node</span><span>.</span></span><span>properties</span><span>.</span><span>className</span><span> </span><span>??</span><span> [];</span></div></div><div><div><div>17</div></div><div><span><span>          </span></span><span>node</span><span>.</span><span>properties</span><span>.</span><span>className</span><span>.</span><span>push</span><span>(</span><span>"em-cjk"</span><span>);</span></div></div><div><div><div>18</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>19</div></div><div><span><span>      </span></span><span>}</span></div></div><div><div><div>20</div></div><div><span><span>    </span></span><span>});</span></div></div><div><div><div>21</div></div><div><span><span>  </span></span><span>};</span></div></div><div><div><div>22</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>em</span><span>.em-cjk</span><span> {</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>border-bottom: </span><span>inherit</span><span>;</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>padding-bottom: </span><span>0</span><span>;</span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>font-style: </span><span>normal</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>text-emphasis: </span><span>filled</span><span> </span><span>dot</span><span>;</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>text-emphasis-position: </span><span>under</span><span> </span><span>right</span><span>;</span></div></div><div><div><div>7</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></div></div></section><section><h3>CSS class和注音标记<a href="#css-class和注音标记"><span>#</span></a></h3><p>用从<a href="https://github.com/cosZone/astro-koharu" target="_blank">koharu主题</a>搬来的<a href="https://github.com/cosZone/astro-koharu/blob/main/src/lib/markdown/rehype-shoka-attrs.ts" target="_blank">rehype-shoka-attrs.ts</a>和<a href="https://github.com/cosZone/astro-koharu/blob/main/src/lib/markdown/remark-shoka-ruby.ts" target="_blank">remark-shoka-ruby.ts</a>实现CSS class和<ruby>注<rp>(</rp><rt>zhù</rt><rp>)</rp></ruby><ruby>音<rp>(</rp><rt>yīn</rt><rp>)</rp></ruby>标记。</p></section></section>]]></content>
    </entry>
    <entry>
      <id>https://drings.im/posts/hello-world/</id>
      <title type="text">Hello, world!</title>
      <published>2026-08-29T00:00:00.000Z</published>
      <updated>2026-08-29T00:00:00.000Z</updated>
      <author><name>dringsim</name></author>
      <link rel="alternate" href="https://drings.im/posts/hello-world/"/>
      <summary type="text">Hello, world!</summary>
      <content type="html"><![CDATA[<p>Hello, world!</p>]]></content>
    </entry>
</feed>
