<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
  xmlns:atom="http://www.w3.org/2005/Atom"
  xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>璜珀的小屋</title>
    <link>https://blog.hpcesia.com/</link>
    
    <atom:link href="https://blog.hpcesia.com/rss2.xml" rel="self" type="application/rss+xml"/>
    
    <description>一个普通的个人博客网站，记录了个人的一些互联网使用、数学、编程的学习经验</description>
    <pubDate>Tue, 11 Feb 2025 11:53:11 GMT</pubDate>
    <generator>http://hexo.io/</generator>
    
    <item>
      <title>月寄（三）</title>
      <link>https://blog.hpcesia.com/posts/a77e8b62/</link>
      <guid>https://blog.hpcesia.com/posts/a77e8b62/</guid>
      <pubDate>Tue, 11 Feb 2025 11:43:43 GMT</pubDate>
      
        
        
          
          
      <description>&lt;h2 id=&quot;ai-辅助开发&quot;&gt;AI 辅助开发&lt;/h2&gt;
&lt;p&gt;最近，我在使用 Astro
给自己开发一个全新的主题，同时也第一次尝试了新一代的 AI
辅助开发。此前，我主要都是在使用 VSCode 的 Continue 插件，使用</description>
          
        
      
      
      
      <content:encoded><![CDATA[<h2 id="ai-辅助开发">AI 辅助开发</h2><p>最近，我在使用 Astro给自己开发一个全新的主题，同时也第一次尝试了新一代的 AI辅助开发。此前，我主要都是在使用 VSCode 的 Continue 插件，使用 AI进行代码补全，以及使用对话功能来问问题。随着 Cursor、DeepSeek的火爆，我决定也尝试一下新一代的 AI 辅助编程。</p><p>出于某种 VSCode 情结，我没有选择去试用 Cursor，而是选择了 VSCode的插件 Roo Cline。选择 Cline 的分支 Roo Cline 是因为这个分支版本可以调用VSCode 自己的大模型接口，即调用 GitHub Copilot，而 GitHub Copilot只限制对话次数，不限制每次对话使用的 token 量，Pro 版本不限次数，10刀每月的价格也还算负担得起。</p><p>使用体验下来，用来写一些简单的脚本，或者使用 AI来进行「重复性」的修改，比如相似的两个代码，改完一个，让 AI参考已有修改帮忙改另一个代码，这类工作 AI做的还是很不错的。但是，对于一些复杂的逻辑，或者小众一点的插件，AI的表现就不尽如人意了。很多时候 AI会生成一些完全不可用的代码，与其慢慢通过对话让 AI调整，还不如我自己直接看文档和其他开源代码自己手搓。</p><h2 id="新主题">新主题</h2><p>经过大半个月的爆肝开发，目前我的 Astro新主题已经基本可用了。新主题基本就是缝的 <ahref="https://github.com/saicaca/fuwari">Fuwari</a> 和现在用的Solitude，而且因为用了比较新的包，比如 Tailwind4，所以浏览器兼容性也比较悲惨。目前，新主题还处于开发阶段，我个人想要的功能还差一些没实现，但基本的功能已经差不多了，所以我就先把它开源并上线了一个<a href="https://astral-halo.netlify.app/" rel="external nofollow noreferrer">Demo</a>。</p><p>新主题名字叫「Astral Halo」，从「Moon Halo」根据开发框架的名字 Astro变化而来，和 Halo框架没啥关系就是了。等搓好了就可以切换到新主题了，这篇文章大概是最后一篇使用Solitude 主题的文章了。</p><h2 id="初试-deepseek">初试 DeepSeek</h2><p>初试 DeepSeekR1，我选择让它来从我的过往周/月记来分析我在这个博客中的人设。得到的结果，让我亲身体验了一把什么叫“作者本人做阅读理解都及不了格”（笑）。比如在周寄（三） 中，我聊到了我的保温杯迭代史。DeepSeek R1分析认为，保温杯这节“是作者生存焦虑的具象化，反映了作者对完美容器的追寻，最终选择将博客作为自己的精神容器”。</p><p>嗯，分析得很好，要是我自己写的时候也是这么想的就好了。事实只是我只是没啥好写的了，就拿保温杯来说事。</p><h2 id="游戏">游戏</h2><p>最近又把《辐射：新维加斯》（以下简称FONV）捡回来了。之前因为这游戏翻来覆去玩了太多遍有些腻，外加上游戏原先使用的内核汉化（翻译游戏内部的文本字符串）会和我喜欢的mod 起冲突，直接玩英文原版看着又太费劲，所以弃了半年。</p><p>最近翻到之前知乎上对我配置畅玩 FONV 的 mod配置帮助极大的《游骑兵指南》更新了，将汉化换成了外挂汉化（直接翻译游戏时屏幕显示文本）。外挂汉化除去一些文字位置和大小的问题外，与各种mod 都算兼容相当良好的。简单尝试了一下后，我对 FONV的激情又重新点燃了，这些天基本就是肝论文学习进度、肝新主题和打FONV，顺便穿插一下几个米哈游游戏的活动和日常<del>（然后因为春节活动相比惯例提前一天结束，错过了好多剧情和奖励，死线战士大失败）</del>。</p><h2 id="轻功">轻功</h2><p>起因是我最近做的一个梦，梦里我被人追杀，跑着跑着就开始飘了起来，追逐直接变成了皇牌空战。这种飘起来的感觉我很熟悉——在记忆里，我小时候经常在回家路上走着走着就飘起来，一开始是一步能跨上两三米才落地，然后越飘越高，直接飘到和家里阳台齐平。理性告诉我，这应当是我将自己的梦境和小时候的记忆混淆了，但这种印象却如此真实，让我难以否定这种飘起来的感觉只是臆想。</p><p>过了两天，和我爸在吃完饭后闲聊，聊到我妈最近在学习中医，顺带着就聊到了一些比较「封建迷信」的东西。我爸说，他以前会做梦梦到自己飘了起来，就像小说里的轻功一般。我听了这话，心里一惊，这不就是我梦里的感觉吗？很好奇，这种感觉是不是人人都有的。此前我从没想过会有人与我有相同的「飘起来」的感受，如果这种感受是普遍存在的，那这可能就是所谓轻功的源头之一吧。</p><h2 id="中医与科学迷信">中医与「科学迷信」</h2><p>既然上文提到了我妈在学中医，那就顺便聊聊这个可能有点争议的点吧。我对中医的看法，很长一段时间都是「中医作为一种经验医学，应当通过科学的方式现代化」，具体到治疗手段，我对中药基本是嗤之以鼻的，对理疗则还算接受。</p><p>而转折点则是我妈，在当了几十年医生以后，选择自学中医，并自费报名中医院的中医课程（正规课程，学习完可以开中药处方，但不能以中医身份行医）。这种中医学习名额，在不少医院都是免费拉人都难，但我妈却选择交钱也要学，还会通宵背书考试。本来在一开始，看到我妈买了一堆中药熬汤喝、拉住我去中医院看病的时候，我还觉得只是她人老了开始搞迷信了，直到我开始思考。</p><p>我意识到一个问题：我有什么资格，来认为一个当了几十年医生，还会偶尔去任教医学生的人，她学习中医就是「封建迷信」？我自己又有什么资格，来认为中医是「迷信」？我对中医是「迷信」的认知，来源于网络上各种评论、文章对中医、中药的攻击，但我自己又有多少了解中医呢？我只有对中医是「迷信」的认知，却对这些认知的来源没有足够的了解，这不就是「科学迷信」吗？</p>]]></content:encoded>
      
      
      <category domain="https://blog.hpcesia.com/categories/%E7%94%9F%E6%B4%BB%E7%82%B9%E6%BB%B4/">生活点滴</category>
      
      
      <category domain="https://blog.hpcesia.com/tags/%E5%91%A8-%E6%9C%88%E8%AE%B0/">周/月记</category>
      
      
      <comments>https://blog.hpcesia.com/posts/a77e8b62/#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>Hello, PyTorch (1.5) | 环境配置（非 Docker 版)</title>
      <link>https://blog.hpcesia.com/posts/78d7e501/</link>
      <guid>https://blog.hpcesia.com/posts/78d7e501/</guid>
      <pubDate>Fri, 31 Jan 2025 15:30:36 GMT</pubDate>
      
        
        
          
          
      <description>&lt;h2 id=&quot;安装-pixi&quot;&gt;安装 pixi&lt;/h2&gt;
&lt;p&gt;pixi 是一个跨平台的、与 conda 兼容的、通过 lock 文件保证可移植性的
python 管理工具。在终端中执行如下命令安装
pixi，其中进行了一次字符串替换，以使用 github</description>
          
        
      
      
      
      <content:encoded><![CDATA[<h2 id="安装-pixi">安装 pixi</h2><p>pixi 是一个跨平台的、与 conda 兼容的、通过 lock 文件保证可移植性的python 管理工具。在终端中执行如下命令安装pixi，其中进行了一次字符串替换，以使用 github 镜像站点进行下载： -<strong>Windows</strong>： <figure class="highlight shell"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">powershell</span><span style="color:#986801;--shiki-dark:#D19A66"> -ExecutionPolicy</span><span style="color:#50A14F;--shiki-dark:#98C379"> ByPass</span><span style="color:#986801;--shiki-dark:#D19A66"> -c</span><span style="color:#50A14F;--shiki-dark:#98C379"> "(irm -useb https://pixi.sh/install.ps1).Replace('https://github.com', 'https://github.site') | iex"</span></span></code></pre></td></tr></tbody></table></figure> -<strong>Linux/macOS</strong>： <figure class="highlight shell"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">curl</span><span style="color:#986801;--shiki-dark:#D19A66"> -sSL</span><span style="color:#50A14F;--shiki-dark:#98C379"> https://pixi.sh/install.sh</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> | </span><span style="color:#4078F2;--shiki-dark:#61AFEF">sed</span><span style="color:#50A14F;--shiki-dark:#98C379"> 's|https://github.com|https://github.site|g'</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> | </span><span style="color:#4078F2;--shiki-dark:#61AFEF">bash</span></span></code></pre></td></tr></tbody></table></figure></p><p>安装完成后，可以使用 <code>pixi</code> 命令进行包管理。建议参考<ahref="https://pixi.sh/latest/#autocompletion">官网</a>为 pixi添加命令补全。还需要为 pixi添加国内镜像源，以加速包的下载。在终端中执行如下命令： <figure class="highlight shell"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">pixi</span><span style="color:#50A14F;--shiki-dark:#98C379"> config</span><span style="color:#50A14F;--shiki-dark:#98C379"> edit</span><span style="color:#986801;--shiki-dark:#D19A66"> --global</span></span></code></pre></td></tr></tbody></table></figure>此时会用系统自带的文本编辑器打开一个文件，在其中粘贴如下内容：<figure class="highlight toml"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">[</span><span style="color:#4078F2;--shiki-dark:#61AFEF">pypi-config</span><span style="color:#383A42;--shiki-dark:#ABB2BF">]</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">index-url</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> = </span><span style="color:#50A14F;--shiki-dark:#98C379">"https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple"</span></span></code></pre></td></tr></tbody></table></figure></p><h2 id="使用-pixi-安装-pytorch-环境">使用 pixi 安装 Pytorch 环境</h2><p>新建一个目录，例如 ~/workspace/python，用于存放所有新的 Python项目的文件夹。在终端中进入该文件夹后执行如下命令： <figure class="highlight shell"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">pixi</span><span style="color:#50A14F;--shiki-dark:#98C379"> init</span><span style="color:#50A14F;--shiki-dark:#98C379"> any_name</span><span style="color:#986801;--shiki-dark:#D19A66"> --format</span><span style="color:#50A14F;--shiki-dark:#98C379"> pyproject</span></span></code></pre></td></tr></tbody></table></figure>这会创建一个 ~/workspace/python/any_name 文件夹，目录结构为：<figure class="highlight text"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span>any_name/</span></span><span class="line"><span>├── src/</span></span><span class="line"><span>│   └── any_name/</span></span><span class="line"><span>│       └── __init__.py</span></span><span class="line"><span>└── pyproject.toml</span></span></code></pre></td></tr></tbody></table></figure> 其中 <code>pyproject.toml</code>是项目的配置文件，<code>src/</code> 是项目的源代码目录。打开<code>pyproject.toml</code> 文件，添加如下内容： <figure class="highlight toml"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">[</span><span style="color:#4078F2;--shiki-dark:#61AFEF">tool</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">pixi</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">feature</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">gpu</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">system-requirements</span><span style="color:#383A42;--shiki-dark:#ABB2BF">]</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">cuda</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> = </span><span style="color:#50A14F;--shiki-dark:#98C379">"12.0"</span></span><span class="line"></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">[</span><span style="color:#4078F2;--shiki-dark:#61AFEF">tool</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">pixi</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">feature</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">gpu</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">dependencies</span><span style="color:#383A42;--shiki-dark:#ABB2BF">]</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">cuda-version</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> = </span><span style="color:#50A14F;--shiki-dark:#98C379">"12.6"</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">pytorch-gpu</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> = </span><span style="color:#50A14F;--shiki-dark:#98C379">"*"</span></span><span class="line"></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">[</span><span style="color:#4078F2;--shiki-dark:#61AFEF">tool</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">pixi</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">feature</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">cpu</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">dependencies</span><span style="color:#383A42;--shiki-dark:#ABB2BF">]</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">pytorch-cpu</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> = </span><span style="color:#50A14F;--shiki-dark:#98C379">"*"</span></span><span class="line"></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">[</span><span style="color:#4078F2;--shiki-dark:#61AFEF">tool</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">pixi</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">environments</span><span style="color:#383A42;--shiki-dark:#ABB2BF">]</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">cpu</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> = [</span><span style="color:#50A14F;--shiki-dark:#98C379">"cpu"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">]</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">default</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> = [</span><span style="color:#50A14F;--shiki-dark:#98C379">"gpu"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">]</span></span></code></pre></td></tr></tbody></table></figure></p><p>接着在终端中执行如下命令： <figure class="highlight shell"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">pixi</span><span style="color:#50A14F;--shiki-dark:#98C379"> add</span><span style="color:#50A14F;--shiki-dark:#98C379"> scipy</span><span style="color:#50A14F;--shiki-dark:#98C379"> matplotlib</span><span style="color:#50A14F;--shiki-dark:#98C379"> deepxde</span></span></code></pre></td></tr></tbody></table></figure></p><p>安装 pyproject.toml 中列出的依赖和新增的绘图库和深度学习库依赖，其中DeepXDE 是一个多后端的深度学习库，主要用于数学求解。</p>]]></content:encoded>
      
      
      <category domain="https://blog.hpcesia.com/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/">学习笔记</category>
      
      
      <category domain="https://blog.hpcesia.com/tags/Python/">Python</category>
      
      <category domain="https://blog.hpcesia.com/tags/PyTorch/">PyTorch</category>
      
      
      <comments>https://blog.hpcesia.com/posts/78d7e501/#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>周寄（四）</title>
      <link>https://blog.hpcesia.com/posts/1ec6f507/</link>
      <guid>https://blog.hpcesia.com/posts/1ec6f507/</guid>
      <pubDate>Thu, 16 Jan 2025 14:01:22 GMT</pubDate>
      
      <description>昼夜颠倒的拖延症废宅也能写点东西出来吗？</description>
      
      
      
      <content:encoded><![CDATA[<p>本次周记为期两周，记录时间：2024 年 12 月 30 日至 2025 年 1 月 16日。拖了两周半才发，主要是因为我太懒狗了，写不动（悲）。</p><h2 id="和论文搏斗">和论文搏斗</h2><p>这一周，除去刷社交媒体、打游戏、写博客等阶段性考试结束后必备的娱乐生活外，我还在干正事——开始为写毕业论文做准备。虽然跟导师说好了每周汇报一下进度，不过这周还是没跟导师汇报。主要原因是写一个配置环境的文档比我想象中要麻烦不少，花了不少功夫才把论文的学习进度笔记写了个大概出来。好在导师没有太在意，问题不大。</p><p>顺便期末成绩也出来了，我自己预估期末卷面只有 15分不到的多复变函数论，最终成绩是 61分刚刚过线，只能说感谢老师不杀之恩了（笑）。</p><figure><img src= "" data-lazy-src="https://bu.dusays.com/2025/01/16/67891032d4010.webp"alt="老师太能捞人了，我哭死" /><figcaption aria-hidden="true">老师太能捞人了，我哭死</figcaption></figure><h2 id="足部保暖">足部保暖</h2><p>现在已经是完全入冬了，虽然厦门的温度其实不算冷——白天 18°C 上下，晚上10°C上下，但很不幸，学校宿舍的空调没有暖风功能，所以即便平时都待在宿舍，也只能硬抗冷空气。而我又不想买一双一年只能用一个月的保暖拖鞋，所以我得想其他办法来熬过冬天。我的选择是：多穿点袜子。我买了两双迪卡侬的滑雪长袜穿在外面，负责保暖和挡住漏进来冷风，内层则是一直在穿的五指袜（注：好的五指袜穿着真的很舒服，对脚汗很多的人很友好，就是30+/双的价格还是有点不友好）。虽然长时间在宿舍坐着还是很冷，但只要喝点热水，或者出去走走，脚就会相当暖和。</p><h2 id="阴间作息">阴间作息</h2><p>自从期末考完后，我便开始了每天的阴间作息：凌晨 4-5 点才睡觉，中午 12点以后才起床，伴有偶尔通宵。就连这段字都是我在凌晨 3点半的时候，既不想睡觉又不想打游戏，躺在床上用手机码的（自从写作工作流更新，手机与电脑可以无感同步写的博客文章以后，躺床上码字就成了我写博客的重要组成部分）。然后饮食也相当混乱，经常下午三四点去吃午饭，然后晚上十点左右吃顿夜宵。</p><p>制约我熬夜时长的唯一要素是手机的电量，通常在夜间的高强度使用下，我这用了3年半、电池健康只剩77%的手机的电量就只剩20%不到了，如果再多玩一会儿，等早上起来，我就会收获一个没电关机的手机。甚至这点制约，只要我愿意下床拿一下充电宝，也不是不能解决。</p><p>不过回家以后，为了省自己的零花钱和给家里省事，我每天早上都会开车跟我爸一起去他公司（顺便练练车技），我在我爸的房间里看文献/打游戏/鼓捣博客，中午蹭一顿饭。出于对汽车的力量的敬畏，我在家里的这几天都是至少保证7 小时睡眠，作息多少调整得正常了一点。</p><h2 id="新手机">新手机</h2><p>一放假回到家，我便拿到了我的新手机（如果考研没过，就是家里买的最后一个了）：华为Mate 70 RS。由于需要玩一些手游、使用Syncthing、Obsidian，我没有选择升级到鸿蒙 Next，而是使用了鸿蒙4.3。使用了一周下来，对比我之前用的 Mate 40 RS，感觉还是不错的。</p><p>芯片性能方面，自华为被制裁以来，我就从来没对华为新手机的芯片性能有多大的指望，比麒麟9000 强就算胜利。实际游戏体验也和 Mate 40差距不大，稍微流畅一点。拍照和录像感觉效果还是可以的，麦克风收音效果不错，微距拍照很舒服，比40一凑近就糊完了强太多了。续航算是最惊喜的方面了，个人体感目前轻度使用一整天不充电是完全没问题的，相当持久。总体来说，还算是一次满意的手机换代体验。</p><h2 id="新手办">新手办</h2><p>顺便地，我买的手办也到了。其实早在上个月初，商家就已经发货了，只是我因为快毕业了，所以选择将手办寄到了家里，现在放假回家，才将其拆箱检视。由于造型比较复杂，加上网上看有不少翻车的情况，所以我拆箱的时候还是有点提心吊胆的，不过好在没有断件，粗看下来颜色也没啥问题，算是没翻车。</p><figure><img src= "" data-lazy-src="https://bu.dusays.com/2025/01/16/67890dff1f5c1.webp"alt="她真好看" /><figcaption aria-hidden="true">她真好看</figcaption></figure><p>这算是我买的第二个比例手办了，上一个还是 21年买的可莉。由于可莉的体形比较小，加上坐姿降了高度，导致我对最近到的这个爱莉的手办的大小产生了误判——直到我回家，发现床边那个跟床头柜一样大的箱子装着的是我的手办。虽然实际盒子大小没那么离谱，但也差不多有半个床头柜大小了。</p><figure><img src= "" data-lazy-src="https://bu.dusays.com/2025/01/16/67890ed909a1f.webp"alt="她真可爱" /><figcaption aria-hidden="true">她真可爱</figcaption></figure><p>不幸的是，拆开检查过以后，我也只能请手办回盒子里吃灰了，因为家里已经被我妈的衣服堆满了（悲）。只有等家里的新房装修完毕，我大概才有地方用来展示这个大手办。</p><h2 id="听歌">听歌</h2><p>不知道从什么时候开始，HOYO-MiX就成为了我曲库中新歌几乎唯一的来源。目前我手机里共存有 3810 首歌曲，其中2039 首来自 HOYO-MiX。一方面，是我个人很喜欢将音乐存到本地，这意味着 QQ音乐、网易云音乐、Apple Music等在线音乐软件的会员显得几乎没有必要（反正开了会员，下的歌也得把加密格式转换为普通的格式），因此我很少有其他渠道去听新歌；另一方面，HOYO-MiX的歌真的是量大管饱、质量还好、风格多变，对我这种喜欢纯音乐的人来说，HOYO-MiX创作的游戏配乐中大量的纯音乐正合适。</p><p>这里推荐一些 HOYO-MiX的歌里，我个人最喜欢的一部分歌曲（此处列出的均为我本地的歌曲信息）：</p><ul><li><strong>中文歌</strong>：<ul><li>《Rage Beneath the Mountains 岩壑之崩》-陈致逸/HOYO-MiX（这首不放在纯音乐是因为确实有不少中文歌词）</li><li>《不眠之夜》- 张杰/HOYO-MiX</li><li>《一颗方糖悬滞的时间》- 阿兰/HOYO-MiX</li></ul></li><li><strong>英文歌</strong>：<ul><li>《Rubia》- 周深</li><li>《Oracle》- 黄霄雲/HOYO-MiX</li><li>《No Ceiling》- HOYO-MiX</li><li>《烬火 Emberfire》- 希林娜依高/HOYO-MiX</li><li>《未行之路 The Road Not Taken》- HOYO-MiX/Aimer</li><li>《踏上旅途 Take the Journey》- HOYO-MiX/Anthony Lynch</li><li>《野火 Wildfire》- HOYO-MiX/Jonathan Steingard</li><li>《WHITE NIGHT》- Jake Miller/HOYO-MiX</li><li>《使一颗心免于哀伤》- 知更鸟/HOYO-MiX/Chevy</li><li>《希望有羽毛和翅膀》- 知更鸟/HOYO-MiX/Chevy</li><li>《pinKing》- ChiliChill/三Z-STUDIO/HOYO-MiX</li><li>《火狱骑行》- 三Z-STUDIO/HOYO-MiX</li><li>《Fearless》- 三Z-STUDIO/HOYO-MiX</li></ul></li><li><strong>其他语言歌曲</strong>：<ul><li>《轻涟 La vaguelette》- HOYO-MiX</li><li>《纳塔 Natlan》- HOYO-MiX</li><li>《崩坏世界的歌姬 (Movie Ver.)》- 小林未郁</li><li>《不乱不破》- HOYO-MiX/Reol</li><li>《小停再出发》- 三Z-STUDIO/HOYO-MiX</li></ul></li><li><strong>纯音乐</strong>：<ul><li>《For Kevin》- HOYO-MiX</li><li>《Fantasy Note》- HOYO-MiX</li><li>《Caelestinum Finale Termini 终天的闭幕曲》- 陈致逸/HOYO-MiX</li><li>《璃月 Liyue》- 陈致逸/HOYO-MiX</li><li>《皎洁的笑颜 Moonlike Smile》- 陈致逸/HOYO-MiX</li><li>《浪沫起舞 Dance of Aphros》- HOYO-MiX</li><li>《Innocent Age 无虑无猜的岁月》- 陈致逸/HOYO-MiX</li><li>《无虑的应许 Pledge of Peace》- HOYO-MiX</li><li>《Inevitable Conflict 激扬的韧战》- HOYO-MiX</li><li>《寒光裂涛 Combat Beneath the Waves》- HOYO-MiX</li><li>《仲夏夜绮思 Die Mittsommernacht-Fantasie》- HOYO-MiX</li><li>《水仙十字安眠曲 A Narcissus Lullaby》- HOYO-MiX</li><li>《夜诞的花冠 Night’s Crown of Flowers》- HOYO-MiX</li><li>《绝命舞曲 Acoustic.》- 三Z-STUDIO/HOYO-MiX</li></ul></li></ul>]]></content:encoded>
      
      
      <category domain="https://blog.hpcesia.com/categories/%E7%94%9F%E6%B4%BB%E7%82%B9%E6%BB%B4/">生活点滴</category>
      
      
      <category domain="https://blog.hpcesia.com/tags/%E5%91%A8-%E6%9C%88%E8%AE%B0/">周/月记</category>
      
      
      <comments>https://blog.hpcesia.com/posts/1ec6f507/#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>Hello, PyTorch (1) | 环境配置</title>
      <link>https://blog.hpcesia.com/posts/63c8a3ae/</link>
      <guid>https://blog.hpcesia.com/posts/63c8a3ae/</guid>
      <pubDate>Wed, 08 Jan 2025 16:50:49 GMT</pubDate>
      
        
        
          
          
      <description>&lt;h2 id=&quot;安装-docker&quot;&gt;安装 Docker&lt;/h2&gt;
&lt;h3 id=&quot;windows&quot;&gt;Windows&lt;/h3&gt;
&lt;p&gt;Windows 系统不能直接安装使用 Docker，需要先安装 WSL2（Windows
Subsystem Linux 2）。以下以</description>
          
        
      
      
      
      <content:encoded><![CDATA[<h2 id="安装-docker">安装 Docker</h2><h3 id="windows">Windows</h3><p>Windows 系统不能直接安装使用 Docker，需要先安装 WSL2（WindowsSubsystem Linux 2）。以下以 x86 架构的 Windows 10 系统为例，进行 WSL2的安装流程说明。</p><ul><li><p><strong>检查系统版本</strong>（Windows 11无需进行此步骤）：打开设置→系统→关于页面，检查 Windows 版本号，应为2004、20H2、21H1、21H2、22H2 中的任意一个，否则需要更新 Windows版本。</p></li><li><p><strong>安装 Windows Terminal</strong>（Windows 11无需进行此步骤。此步骤非必须，但建议进行）：访问 <ahref="https://aka.ms/terminal">Windows Terminal | 微软应用商店</a>并下载 Windows Terminal 安装器，运行该安装器即可安装 WindowsTerminal。</p></li><li><p><strong>安装 WSL2</strong>：在开始菜单中找到上一步安装的 WindowsTerminal（或「终端」），右键→更多→以管理员身份运行，然后在其中输入并按回车执行如下命令：<figure class="highlight shell"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">wsl</span><span style="color:#986801;--shiki-dark:#D19A66"> --install</span></span></code></pre></td></tr></tbody></table></figure> 等待自动安装完成即可，过程中可能需要重启计算机。</p></li><li><p><strong>设置WSL2</strong>：打开开始菜单，找到上一步安装的「Ubuntu」并打开，初次使用会要求设置用户名与密码（输入密码时，屏幕不会显示任何字符，这称为「盲人键入」，是完全正常的现象），密码建议妥善保管（如果忘记密码，可以在PowerShell 中使用 <code>wsl -u root</code> 进入 root 账户，然后使用<code>passwd &lt;username&gt;</code> 命令为账户设置新密码。）。</p></li><li><p><strong>设置软件仓库镜像源</strong>：由于国内大陆地区网络问题，需要为Ubuntu 的软件仓库设置国内镜像源。以清华镜像源为例，在 Ubuntu中执行如下指令： <figure class="highlight shell"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">cat</span><span style="color:#50A14F;--shiki-dark:#98C379"> /etc/os-release</span></span></code></pre></td></tr></tbody></table></figure> 查看 Ubuntu 的版本号，在<ahref="https://mirror.tuna.tsinghua.edu.cn/help/ubuntu/">清华镜像站</a>中找到并复制对应版本的代码。接着执行如下指令（注意Ubuntu 24.04版本及以上，需要将下面指令中的地址安装清华镜像源中的说明进行对应的替换）：<figure class="highlight shell"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">sudo</span><span style="color:#50A14F;--shiki-dark:#98C379"> cp</span><span style="color:#50A14F;--shiki-dark:#98C379"> /etc/apt/sources.list</span><span style="color:#50A14F;--shiki-dark:#98C379"> /etc/apt/sources.list.bak</span><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> # 备份</span></span><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">sudo</span><span style="color:#50A14F;--shiki-dark:#98C379"> vi</span><span style="color:#50A14F;--shiki-dark:#98C379"> /etc/apt/sources.list</span></span></code></pre></td></tr></tbody></table></figure> 使用 vi 打开文件，直接输入 ggdG（区分大小写）删除全部内容，接着按 i键进入插入模式，单击右键将复制的代码粘贴进去，随后按 ESC键退出插入模式，再输入 :wq，按回车保存并退出 vi。镜像源配置完成后，在Ubuntu 中执行如下命令更新软件。 <figure class="highlight shell"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">sudo</span><span style="color:#50A14F;--shiki-dark:#98C379"> apt</span><span style="color:#50A14F;--shiki-dark:#98C379"> update</span></span><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">sudo</span><span style="color:#50A14F;--shiki-dark:#98C379"> apt</span><span style="color:#50A14F;--shiki-dark:#98C379"> upgrade</span></span></code></pre></td></tr></tbody></table></figure></p></li><li><p><strong>安装 Docker</strong>：按照 Linux 系统的安装步骤，在 WSL2中安装 Docker 即可。</p></li></ul><h3 id="linux">Linux</h3><p>Linux 系统可以直接安装使用docker-ce，由于国内大陆地区网络问题，需要通过国内镜像源安装。下面以清华镜像源与Ubuntu 系统（其他 Linux 发行版可参考 <ahref="https://mirrors.tuna.tsinghua.edu.cn/help/docker-ce/">docker-ce |清华大学开源软件镜像站</a>进行相关配置）为例，进行安装流程说明。</p><ul><li><strong>卸载旧版本（如有）</strong>：在 bash中输入并执行如下命令，下同： <figure class="highlight shell"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">sudo</span><span style="color:#50A14F;--shiki-dark:#98C379"> apt-get</span><span style="color:#50A14F;--shiki-dark:#98C379"> remove</span><span style="color:#50A14F;--shiki-dark:#98C379"> docker.io</span><span style="color:#50A14F;--shiki-dark:#98C379"> docker-doc</span><span style="color:#50A14F;--shiki-dark:#98C379"> docker-compose</span><span style="color:#50A14F;--shiki-dark:#98C379"> podman-docker</span><span style="color:#50A14F;--shiki-dark:#98C379"> containerd</span><span style="color:#50A14F;--shiki-dark:#98C379"> runc</span></span></code></pre></td></tr></tbody></table></figure></li><li><strong>安装依赖</strong>： <figure class="highlight shell"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">sudo</span><span style="color:#50A14F;--shiki-dark:#98C379"> apt-get</span><span style="color:#50A14F;--shiki-dark:#98C379"> update</span></span><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">sudo</span><span style="color:#50A14F;--shiki-dark:#98C379"> apt-get</span><span style="color:#50A14F;--shiki-dark:#98C379"> install</span><span style="color:#50A14F;--shiki-dark:#98C379"> ca-certificates</span><span style="color:#50A14F;--shiki-dark:#98C379"> curl</span><span style="color:#50A14F;--shiki-dark:#98C379"> gnupg</span></span></code></pre></td></tr></tbody></table></figure></li><li><strong>下载 GPG key</strong>： <figure class="highlight shell"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">sudo</span><span style="color:#50A14F;--shiki-dark:#98C379"> mkdir</span><span style="color:#986801;--shiki-dark:#D19A66"> -m</span><span style="color:#986801;--shiki-dark:#D19A66"> 0755</span><span style="color:#986801;--shiki-dark:#D19A66"> -p</span><span style="color:#50A14F;--shiki-dark:#98C379"> /etc/apt/keyrings</span></span><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">curl</span><span style="color:#986801;--shiki-dark:#D19A66"> -fsSL</span><span style="color:#50A14F;--shiki-dark:#98C379"> https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu/gpg</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> | </span><span style="color:#4078F2;--shiki-dark:#61AFEF">sudo</span><span style="color:#50A14F;--shiki-dark:#98C379"> gpg</span><span style="color:#986801;--shiki-dark:#D19A66"> --dearmor</span><span style="color:#986801;--shiki-dark:#D19A66"> -o</span><span style="color:#50A14F;--shiki-dark:#98C379"> /etc/apt/keyrings/docker.gpg</span></span></code></pre></td></tr></tbody></table></figure></li><li><strong>添加镜像源软件仓库</strong>： <figure class="highlight shell"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span style="color:#0184BC;--shiki-dark:#56B6C2">echo</span><span style="color:#50A14F;--shiki-dark:#98C379"> "deb [arch=$(</span><span style="color:#4078F2;--shiki-dark:#61AFEF">dpkg</span><span style="color:#986801;--shiki-dark:#D19A66"> --print-architecture</span><span style="color:#50A14F;--shiki-dark:#98C379">) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">$(</span><span style="color:#0184BC;--shiki-dark:#56B6C2">.</span><span style="color:#50A14F;--shiki-dark:#98C379"> /etc/os-release</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#x26;&#x26; </span><span style="color:#0184BC;--shiki-dark:#56B6C2">echo</span><span style="color:#50A14F;--shiki-dark:#98C379"> "</span><span style="color:#E45649;--shiki-dark:#E06C75">$VERSION_CODENAME</span><span style="color:#50A14F;--shiki-dark:#98C379">"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span><span style="color:#50A14F;--shiki-dark:#98C379">" stable"</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> | </span><span style="color:#4078F2;--shiki-dark:#61AFEF">sudo</span><span style="color:#50A14F;--shiki-dark:#98C379"> tee</span><span style="color:#50A14F;--shiki-dark:#98C379"> /etc/apt/sources.list.d/docker.list</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> > </span><span style="color:#50A14F;--shiki-dark:#98C379">/dev/null</span></span></code></pre></td></tr></tbody></table></figure></li><li><strong>安装 docker-ce</strong>： <figure class="highlight shell"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">sudo</span><span style="color:#50A14F;--shiki-dark:#98C379"> apt-get</span><span style="color:#50A14F;--shiki-dark:#98C379"> update</span></span><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">sudo</span><span style="color:#50A14F;--shiki-dark:#98C379"> apt-get</span><span style="color:#50A14F;--shiki-dark:#98C379"> install</span><span style="color:#50A14F;--shiki-dark:#98C379"> docker-ce</span><span style="color:#50A14F;--shiki-dark:#98C379"> docker-ce-cli</span><span style="color:#50A14F;--shiki-dark:#98C379"> containerd.io</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> \</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">  docker-buildx-plugin</span><span style="color:#50A14F;--shiki-dark:#98C379"> docker-compose-plugin</span></span></code></pre></td></tr></tbody></table></figure></li><li><strong>配置 Docker镜像仓库的镜像</strong>：由于国内大陆地区网络问题，需要为 Docker Hub配置镜像或代理。目前较正规的镜像（即各大高校或腾讯、阿里、字节等大企业建立的镜像源）均已关停，需要自行寻找可用镜像源，此处使用目前可用的一个镜像https://docker.1panel.live/ 讲解如何配置 Docker Hub镜像。对于其他来源的镜像，如 nvcr.io、ghcr.io等来源的镜像，目前南京大学仍有可用<ahref="https://doc.nju.edu.cn/books/e1654">镜像源</a>。同时也可参考<ahref="#自建-docker-镜像">附录</a>自建 Docker 镜像使用。同样使用 vi 打开docker 的配置文件 /etc/docker/daemon.json <figure class="highlight shell"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">sudo</span><span style="color:#50A14F;--shiki-dark:#98C379"> vi</span><span style="color:#50A14F;--shiki-dark:#98C379"> /etc/docker/daemon.json</span></span></code></pre></td></tr></tbody></table></figure>通过方向键将光标移动到最外层的大括号对（<code>&#123;&#125;</code>）之间，按 i键进入插入模式，输入如下内容（如果已有<code>"registry-mirrors"</code>，则换成修改）： <figure class="highlight json"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">"registry-mirrors"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: [</span><span style="color:#50A14F;--shiki-dark:#98C379">"https://docker.1panel.live"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">]</span></span></code></pre></td></tr></tbody></table></figure> 随后按ESC 键退出插入模式，再输入 :wq，按回车保存并退出。</li></ul><h2 id="安装-pytorch">安装 PyTorch</h2><p>安装完成 Docker 后，就可以开始配置 PyTorch环境了。创建一个合适的目录用于存放 Docker 镜像，以下以 ~/workspace/pinn作为示例目录进行讲解。</p><p>在 Docker 中进行 Python开发需要一个可以连接到容器内进行开发的集成开发环境（IDE），如VSCode(Visual Studio Code) 或Pycharm。如果不想安装集成开发环境，也可使用 Jupyter Lab在浏览器中进行开发（但建议使用集成开发环境，而非 Jupyter）。</p><h3 id="安装-cuda-与-cudnn">安装 CUDA 与 CuDNN</h3><p>本节仅 Nvidia 显卡需要进行，默认系统已安装 Nvidia显卡驱动。在终端中执行 <figure class="highlight shell"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">nvidia-smi</span></span></code></pre></td></tr></tbody></table></figure>可以看到一个报告显卡驱动状态的表格，找到「CUDAVersion」，记下后面的版本号。打开 Nvidia 的 CUDA 下载网站 <ahref="https://developer.nvidia.com/cuda-toolkit-archive">CUDA ToolkitArchive | NVIDIA Developer</a>，根据之前记下的版本号，点击进入对应版本的CUDA 下载页面。下载界面会有 Linux/Windows的版本选项，尽量选择下载本地（locally）版本。Windows 系统是一个 .exe格式的安装器，下载后执行安装即可；Linux版本是几行命令，复制到终端中执行即可，注意最新驱动下 Windows系统无需额外为 WSL 安装 CUDA。</p><p>如果 CUDA 为最新版（目前最新版为 12.6），可以直接在 <ahref="https://developer.nvidia.com/cudnn-downloads">cuDNN Downloads |NVIDIA Developer</a> 下载最新版的 CuDNN，否则需要在 <ahref="https://developer.nvidia.com/rdp/cudnn-archive">cuDNN Archive |NVIDIA Developer</a> 处下载对应 CUDA 版本的CuDNN，注意需要注册一个账号才能下载。与 CUDA相同，下载页面也提供了不同系统的不同版本安装下载方式。</p><p>对 Windows 系统来说，此时在 WSL 中就已经可以使用<code>nvidia-smi</code> 命令显示穿透到 WSL 中的显卡信息了。</p><h3 id="构建镜像">构建镜像</h3><p>新建一个文件 ~/workspace/pytorch/dockerfile，由于此时不再有 Linux系统权限限制，Windows 系统可以使用 <figure class="highlight shell"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">notepad.exe</span><span style="color:#50A14F;--shiki-dark:#98C379"> ~/workspace/pytorch/dockerfile</span></span></code></pre></td></tr></tbody></table></figure> 调用 Windows系统自带记事本进行编辑（如果安装了 VSCode，则 <code>notepad.exe</code>改为 <code>code</code>）；Linux 系统仍可使用 vi 或 vim 进行编辑。</p><p>由于不同的电脑配置需要使用不同的镜像，因此以下将分类讲解 Nvidia显卡、AMD 显卡与纯 CPU 三种不同配置下构建镜像的方式。此处使用<ahref="https://github.com/cnstark/pytorch-docker">前人已构建好的镜像</a>。</p><ul><li><strong>Nvidia 显卡</strong>：Nvidia 显卡可以直接使用 PyTorch 提供的docker 镜像作为基础进行开发。在 dockerfile 文件中输入如下内容：<figure class="highlight docker"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">FROM</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> cnstark/pytorch:2.3.1-py3.10.15-cuda12.1.0-ubuntu22.04</span></span><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">WORKDIR</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> /workspace</span></span><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">COPY</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> requirements.txt requirements.txt</span></span><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">RUN</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> pip install -r requirements.txt -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple</span></span><span class="line"></span><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">RUN</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> rm -r /temp &#x26;&#x26; rm -r /root/.cache/pip</span></span></code></pre></td></tr></tbody></table></figure></li><li><strong>AMD 显卡</strong>：AMD 显卡可以使用 ROCm 来进行 PyTorch开发（需要参考 <ahref="https://rocm.docs.amd.com/projects/radeon/en/latest/docs/install/wsl/howto_wsl.html">WSLHow to guide - Use ROCm on Radeon GPUs — Use ROCm on Radeon GPUs</a>进行相关配置）。对上文中 dockerfile 文件中 <code>FROM</code>部分修改为： <figure class="highlight docker"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">FROM</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> rocm/pytorch:rocm6.1.3_ubuntu22.04_py3.10_pytorch_release-2.1.2</span></span></code></pre></td></tr></tbody></table></figure></li><li><strong>纯 CPU</strong>：将 dockerfile 文件中 FROM 修改为：<figure class="highlight docker"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">FROM</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> cnstark/pytorch:2.3.1-py3.10.15-ubuntu22.04</span></span></code></pre></td></tr></tbody></table></figure></li></ul><p>如果使用 Jupyter Lab，则需要在 dockerfile 末尾添加两行：</p><figure class="highlight docker"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">EXPOSE</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> 8888</span></span><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">ENTRYPOINT</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> [</span><span style="color:#50A14F;--shiki-dark:#98C379">"jupyter"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span><span style="color:#50A14F;--shiki-dark:#98C379">"lab"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span><span style="color:#50A14F;--shiki-dark:#98C379">"--ip=0.0.0.0"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span><span style="color:#50A14F;--shiki-dark:#98C379">"--allow-root"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span><span style="color:#50A14F;--shiki-dark:#98C379">"--no-browser"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">]</span></span></code></pre></td></tr></tbody></table></figure><p>接着在同一目录下新建 requirements.txt 文件，这个文件里是其他需要的Python 包，例如：</p><figure class="highlight text"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span># Jupyter Lab 配置</span></span><span class="line"><span># 使用 Pycharm/VSCode/其他 IDE 编辑代码，这部分可以全部注释掉</span></span><span class="line"><span>jupyterlab # Jupyter Lab 本体</span></span><span class="line"><span>jupyterlab-language-pack-zh-CN # Jupyter Lab 中文语言包</span></span><span class="line"><span>jupyterlab-lsp # Jupyter Lab 语言服务器（LSP）支持</span></span><span class="line"><span>jedi-language-server # Jedi 语言服务器</span></span><span class="line"><span></span></span><span class="line"><span># 其他需要的包</span></span><span class="line"><span>ipykernel # 运行 Jupyter Notebook 的核心包，使用 VSCode 时需要</span></span><span class="line"><span>scipy # 提供一些实用函数</span></span><span class="line"><span>pandas # 数据处理包，可以注释掉</span></span><span class="line"><span>matplotlib # 绘图包，如果需要导出数据用其他软件绘图，可以注释掉</span></span></code></pre></td></tr></tbody></table></figure><p>最后再在统一目录下创建 docker-compose.yaml，根据创建 dockerfile时的不同，分别填入如下内容：</p><ul><li><strong>Nvidia 显卡</strong>： <figure class="highlight yaml"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">services</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">  nvidia-pytorch</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">    build</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">.</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">    ipc</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">host</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">    volumes</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">      - </span><span style="color:#50A14F;--shiki-dark:#98C379">./data:/workspace</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">    deploy</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">      resources</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">        reservations</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">          devices</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">            - </span><span style="color:#E45649;--shiki-dark:#E06C75">driver</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">nvidia</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">              count</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">1</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">              capabilities</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: [</span><span style="color:#50A14F;--shiki-dark:#98C379">gpu</span><span style="color:#383A42;--shiki-dark:#ABB2BF">]</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">    tty</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">true</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">    stdin_open</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">true</span></span></code></pre></td></tr></tbody></table></figure></li><li><strong>AMD 显卡</strong>： <figure class="highlight yaml"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">services</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">  rocm-pytorch</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">    build</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">.</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">    cap_add</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">      - </span><span style="color:#50A14F;--shiki-dark:#98C379">SYS_PTRACE</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">    security_opt</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">      - </span><span style="color:#50A14F;--shiki-dark:#98C379">seccomp=unconfined</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">    ipc</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">host</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">    shm_size</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">8G</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">    devices</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">      - </span><span style="color:#50A14F;--shiki-dark:#98C379">/dev/dxg</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">    volumes</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">      - </span><span style="color:#50A14F;--shiki-dark:#98C379">./data:/workspace</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">      - </span><span style="color:#50A14F;--shiki-dark:#98C379">/usr/lib/wsl/lib/libdxcore.so:/usr/lib/libdxcore.so</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">      - </span><span style="color:#50A14F;--shiki-dark:#98C379">/opt/rocm/lib/libhsa-runtime64.so.1:/opt/rocm/lib/libhsa-runtime64.so.1</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">    tty</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">true</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">    stdin_open</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">true</span></span></code></pre></td></tr></tbody></table></figure> 需要注意的是以上为Windows 系统下的 docker-compose.ymal 文件，如果是 Linux，则需删除volumes 中 workspace 以外的两项，同时将 devices 修改为：<figure class="highlight yaml"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">devices</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  - </span><span style="color:#50A14F;--shiki-dark:#98C379">/dev/kfd</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  - </span><span style="color:#50A14F;--shiki-dark:#98C379">/dev/dri</span></span></code></pre></td></tr></tbody></table></figure></li><li><strong>纯 CPU</strong>： <figure class="highlight yaml"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">services</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">  pytorch</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">    build</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">.</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">    volumes</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">      - </span><span style="color:#50A14F;--shiki-dark:#98C379">./data:/workspace</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">    tty</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">true</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">    stdin_open</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">true</span></span></code></pre></td></tr></tbody></table></figure></li></ul><p>如果使用 Jupyter Lab，则需要在 volumes 前新增两行：<figure class="highlight yaml"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">ports</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  - </span><span style="color:#50A14F;--shiki-dark:#98C379">"8888:8888"</span></span></code></pre></td></tr></tbody></table></figure></p><p>最后在 Linux/WSL 终端中执行 <figure class="highlight shell"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">docker-compose</span><span style="color:#50A14F;--shiki-dark:#98C379"> up</span><span style="color:#986801;--shiki-dark:#D19A66"> -d</span></span></code></pre></td></tr></tbody></table></figure> 即可启动容器，如果使用Jupyter Lab，此时在浏览器中访问 https://127.0.0.1:8888/ 即可进入 JupyterLab 页面。对 VSCode，需要安装 Docker扩展，在扩展侧边栏中右键刚刚建立的容器，启动并附加 VSCode 页面；对Pycharm 或其他 IDE，请参考对应的官方文档。</p><h2 id="附录">附录</h2><h3 id="自建-docker-镜像">自建 Docker 镜像</h3><p>Cloudflare Worker 搭建 Github 与 Docker 加速，来自<ahref="https://linux.do/t/topic/107428">用GPT融了一个CloudflareWorkers的github下载 + Docke pull加速 - 开发调优 - LINUXDO</a>。建议自行修改部分代码（比如用 LLM 洗一遍），以防有大量相似代码的Worker 导致被 Cloudflare 认定为滥用 Worker。</p><figure class="highlight javascript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">'use strict'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">;</span></span><span class="line"></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">const</span><span style="color:#986801;--shiki-dark:#E5C07B"> HUB_HOST</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#50A14F;--shiki-dark:#98C379"> 'registry-1.docker.io'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">const</span><span style="color:#986801;--shiki-dark:#E5C07B"> AUTH_URL</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#50A14F;--shiki-dark:#98C379"> 'https://auth.docker.io'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">const</span><span style="color:#986801;--shiki-dark:#E5C07B"> WORKERS_URL</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#50A14F;--shiki-dark:#98C379"> 'https://你的域名'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">const</span><span style="color:#986801;--shiki-dark:#E5C07B"> ASSET_URL</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#50A14F;--shiki-dark:#98C379"> 'https://hunshcn.github.io/gh-proxy/'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">const</span><span style="color:#986801;--shiki-dark:#E5C07B"> PREFIX</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#50A14F;--shiki-dark:#98C379"> '/'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">const</span><span style="color:#986801;--shiki-dark:#E5C07B"> Config</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#123; </span><span style="color:#E45649;--shiki-dark:#E06C75">jsdelivr</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">:</span><span style="color:#986801;--shiki-dark:#D19A66"> 0</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#125;;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">const</span><span style="color:#986801;--shiki-dark:#E5C07B"> whiteList</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> [];</span></span><span class="line"></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">const</span><span style="color:#986801;--shiki-dark:#E5C07B"> exp1</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#0184BC;--shiki-dark:#E06C75"> /</span><span style="color:#A626A4;--shiki-dark:#C678DD">^</span><span style="color:#0184BC;--shiki-dark:#E06C75">(?:https</span><span style="color:#0184BC;--shiki-dark:#D19A66">?</span><span style="color:#0184BC;--shiki-dark:#E06C75">:</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\/\/</span><span style="color:#0184BC;--shiki-dark:#E06C75">)</span><span style="color:#0184BC;--shiki-dark:#D19A66">?</span><span style="color:#0184BC;--shiki-dark:#E06C75">github</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\.</span><span style="color:#0184BC;--shiki-dark:#E06C75">com</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\/</span><span style="color:#986801;--shiki-dark:#E06C75">.</span><span style="color:#0184BC;--shiki-dark:#D19A66">+?</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\/</span><span style="color:#986801;--shiki-dark:#E06C75">.</span><span style="color:#0184BC;--shiki-dark:#D19A66">+?</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\/</span><span style="color:#0184BC;--shiki-dark:#E06C75">(?:releases</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">|</span><span style="color:#0184BC;--shiki-dark:#E06C75">archive)</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\/</span><span style="color:#986801;--shiki-dark:#E06C75">.</span><span style="color:#0184BC;--shiki-dark:#D19A66">*</span><span style="color:#A626A4;--shiki-dark:#C678DD">$</span><span style="color:#0184BC;--shiki-dark:#E06C75">/</span><span style="color:#A626A4;--shiki-dark:#C678DD">i</span><span style="color:#383A42;--shiki-dark:#ABB2BF">;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">const</span><span style="color:#986801;--shiki-dark:#E5C07B"> exp2</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#0184BC;--shiki-dark:#E06C75"> /</span><span style="color:#A626A4;--shiki-dark:#C678DD">^</span><span style="color:#0184BC;--shiki-dark:#E06C75">(?:https</span><span style="color:#0184BC;--shiki-dark:#D19A66">?</span><span style="color:#0184BC;--shiki-dark:#E06C75">:</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\/\/</span><span style="color:#0184BC;--shiki-dark:#E06C75">)</span><span style="color:#0184BC;--shiki-dark:#D19A66">?</span><span style="color:#0184BC;--shiki-dark:#E06C75">github</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\.</span><span style="color:#0184BC;--shiki-dark:#E06C75">com</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\/</span><span style="color:#986801;--shiki-dark:#E06C75">.</span><span style="color:#0184BC;--shiki-dark:#D19A66">+?</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\/</span><span style="color:#986801;--shiki-dark:#E06C75">.</span><span style="color:#0184BC;--shiki-dark:#D19A66">+?</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\/</span><span style="color:#0184BC;--shiki-dark:#E06C75">(?:blob</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">|</span><span style="color:#0184BC;--shiki-dark:#E06C75">raw)</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\/</span><span style="color:#986801;--shiki-dark:#E06C75">.</span><span style="color:#0184BC;--shiki-dark:#D19A66">*</span><span style="color:#A626A4;--shiki-dark:#C678DD">$</span><span style="color:#0184BC;--shiki-dark:#E06C75">/</span><span style="color:#A626A4;--shiki-dark:#C678DD">i</span><span style="color:#383A42;--shiki-dark:#ABB2BF">;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">const</span><span style="color:#986801;--shiki-dark:#E5C07B"> exp3</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#0184BC;--shiki-dark:#E06C75"> /</span><span style="color:#A626A4;--shiki-dark:#C678DD">^</span><span style="color:#0184BC;--shiki-dark:#E06C75">(?:https</span><span style="color:#0184BC;--shiki-dark:#D19A66">?</span><span style="color:#0184BC;--shiki-dark:#E06C75">:</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\/\/</span><span style="color:#0184BC;--shiki-dark:#E06C75">)</span><span style="color:#0184BC;--shiki-dark:#D19A66">?</span><span style="color:#0184BC;--shiki-dark:#E06C75">github</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\.</span><span style="color:#0184BC;--shiki-dark:#E06C75">com</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\/</span><span style="color:#986801;--shiki-dark:#E06C75">.</span><span style="color:#0184BC;--shiki-dark:#D19A66">+?</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\/</span><span style="color:#986801;--shiki-dark:#E06C75">.</span><span style="color:#0184BC;--shiki-dark:#D19A66">+?</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\/</span><span style="color:#0184BC;--shiki-dark:#E06C75">(?:info</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">|</span><span style="color:#0184BC;--shiki-dark:#E06C75">git-)</span><span style="color:#986801;--shiki-dark:#E06C75">.</span><span style="color:#0184BC;--shiki-dark:#D19A66">*</span><span style="color:#A626A4;--shiki-dark:#C678DD">$</span><span style="color:#0184BC;--shiki-dark:#E06C75">/</span><span style="color:#A626A4;--shiki-dark:#C678DD">i</span><span style="color:#383A42;--shiki-dark:#ABB2BF">;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">const</span><span style="color:#986801;--shiki-dark:#E5C07B"> exp4</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#0184BC;--shiki-dark:#E06C75"> /</span><span style="color:#A626A4;--shiki-dark:#C678DD">^</span><span style="color:#0184BC;--shiki-dark:#E06C75">(?:https</span><span style="color:#0184BC;--shiki-dark:#D19A66">?</span><span style="color:#0184BC;--shiki-dark:#E06C75">:</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\/\/</span><span style="color:#0184BC;--shiki-dark:#E06C75">)</span><span style="color:#0184BC;--shiki-dark:#D19A66">?</span><span style="color:#0184BC;--shiki-dark:#E06C75">raw</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\.</span><span style="color:#0184BC;--shiki-dark:#E06C75">(?:githubusercontent</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">|</span><span style="color:#0184BC;--shiki-dark:#E06C75">github)</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\.</span><span style="color:#0184BC;--shiki-dark:#E06C75">com</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\/</span><span style="color:#986801;--shiki-dark:#E06C75">.</span><span style="color:#0184BC;--shiki-dark:#D19A66">+?</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\/</span><span style="color:#986801;--shiki-dark:#E06C75">.</span><span style="color:#0184BC;--shiki-dark:#D19A66">+?</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\/</span><span style="color:#986801;--shiki-dark:#E06C75">.</span><span style="color:#0184BC;--shiki-dark:#D19A66">+?</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\/</span><span style="color:#986801;--shiki-dark:#E06C75">.</span><span style="color:#0184BC;--shiki-dark:#D19A66">+</span><span style="color:#A626A4;--shiki-dark:#C678DD">$</span><span style="color:#0184BC;--shiki-dark:#E06C75">/</span><span style="color:#A626A4;--shiki-dark:#C678DD">i</span><span style="color:#383A42;--shiki-dark:#ABB2BF">;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">const</span><span style="color:#986801;--shiki-dark:#E5C07B"> exp5</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#0184BC;--shiki-dark:#E06C75"> /</span><span style="color:#A626A4;--shiki-dark:#C678DD">^</span><span style="color:#0184BC;--shiki-dark:#E06C75">(?:https</span><span style="color:#0184BC;--shiki-dark:#D19A66">?</span><span style="color:#0184BC;--shiki-dark:#E06C75">:</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\/\/</span><span style="color:#0184BC;--shiki-dark:#E06C75">)</span><span style="color:#0184BC;--shiki-dark:#D19A66">?</span><span style="color:#0184BC;--shiki-dark:#E06C75">gist</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\.</span><span style="color:#0184BC;--shiki-dark:#E06C75">(?:githubusercontent</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">|</span><span style="color:#0184BC;--shiki-dark:#E06C75">github)</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\.</span><span style="color:#0184BC;--shiki-dark:#E06C75">com</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\/</span><span style="color:#986801;--shiki-dark:#E06C75">.</span><span style="color:#0184BC;--shiki-dark:#D19A66">+?</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\/</span><span style="color:#986801;--shiki-dark:#E06C75">.</span><span style="color:#0184BC;--shiki-dark:#D19A66">+?</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\/</span><span style="color:#986801;--shiki-dark:#E06C75">.</span><span style="color:#0184BC;--shiki-dark:#D19A66">+</span><span style="color:#A626A4;--shiki-dark:#C678DD">$</span><span style="color:#0184BC;--shiki-dark:#E06C75">/</span><span style="color:#A626A4;--shiki-dark:#C678DD">i</span><span style="color:#383A42;--shiki-dark:#ABB2BF">;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">const</span><span style="color:#986801;--shiki-dark:#E5C07B"> exp6</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#0184BC;--shiki-dark:#E06C75"> /</span><span style="color:#A626A4;--shiki-dark:#C678DD">^</span><span style="color:#0184BC;--shiki-dark:#E06C75">(?:https</span><span style="color:#0184BC;--shiki-dark:#D19A66">?</span><span style="color:#0184BC;--shiki-dark:#E06C75">:</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\/\/</span><span style="color:#0184BC;--shiki-dark:#E06C75">)</span><span style="color:#0184BC;--shiki-dark:#D19A66">?</span><span style="color:#0184BC;--shiki-dark:#E06C75">github</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\.</span><span style="color:#0184BC;--shiki-dark:#E06C75">com</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\/</span><span style="color:#986801;--shiki-dark:#E06C75">.</span><span style="color:#0184BC;--shiki-dark:#D19A66">+?</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\/</span><span style="color:#986801;--shiki-dark:#E06C75">.</span><span style="color:#0184BC;--shiki-dark:#D19A66">+?</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\/</span><span style="color:#0184BC;--shiki-dark:#E06C75">tags</span><span style="color:#986801;--shiki-dark:#E06C75">.</span><span style="color:#0184BC;--shiki-dark:#D19A66">*</span><span style="color:#A626A4;--shiki-dark:#C678DD">$</span><span style="color:#0184BC;--shiki-dark:#E06C75">/</span><span style="color:#A626A4;--shiki-dark:#C678DD">i</span><span style="color:#383A42;--shiki-dark:#ABB2BF">;</span></span><span class="line"></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">/** </span><span style="color:#383A42;font-style:italic;--shiki-dark:#C678DD;--shiki-dark-font-style:italic">@</span><span style="color:#A626A4;font-style:italic;--shiki-dark:#C678DD;--shiki-dark-font-style:italic">type</span><span style="color:#C18401;font-style:italic;--shiki-dark:#E5C07B;--shiki-dark-font-style:italic"> &#123;RequestInit&#125;</span><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> */</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">const</span><span style="color:#986801;--shiki-dark:#E5C07B"> PREFLIGHT_INIT</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#123;</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">    // @ts-ignore</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">    status</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">:</span><span style="color:#986801;--shiki-dark:#D19A66"> 204</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">    headers</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">:</span><span style="color:#A626A4;--shiki-dark:#C678DD"> new</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> Headers</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(&#123;</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">        'access-control-allow-origin'</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">:</span><span style="color:#50A14F;--shiki-dark:#98C379"> '*'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">        'access-control-allow-methods'</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">:</span><span style="color:#50A14F;--shiki-dark:#98C379"> 'GET, POST, PUT, PATCH, TRACE, DELETE, HEAD, OPTIONS'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">        'access-control-max-age'</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">:</span><span style="color:#50A14F;--shiki-dark:#98C379"> '1728000'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    &#125;),</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">&#125;;</span></span><span class="line"></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">/**</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> * Create a new response.</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> * </span><span style="color:#383A42;font-style:italic;--shiki-dark:#C678DD;--shiki-dark-font-style:italic">@</span><span style="color:#A626A4;font-style:italic;--shiki-dark:#C678DD;--shiki-dark-font-style:italic">param</span><span style="color:#C18401;font-style:italic;--shiki-dark:#E5C07B;--shiki-dark-font-style:italic"> &#123;any&#125;</span><span style="color:#E45649;font-style:italic;--shiki-dark:#E06C75;--shiki-dark-font-style:italic"> body</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> * </span><span style="color:#383A42;font-style:italic;--shiki-dark:#C678DD;--shiki-dark-font-style:italic">@</span><span style="color:#A626A4;font-style:italic;--shiki-dark:#C678DD;--shiki-dark-font-style:italic">param</span><span style="color:#C18401;font-style:italic;--shiki-dark:#E5C07B;--shiki-dark-font-style:italic"> &#123;number&#125;</span><span style="color:#E45649;font-style:italic;--shiki-dark:#E06C75;--shiki-dark-font-style:italic"> [status</span><span style="color:#0184BC;font-style:italic;--shiki-dark:#56B6C2;--shiki-dark-font-style:italic">=</span><span style="color:#E45649;font-style:italic;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">200]</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> * </span><span style="color:#383A42;font-style:italic;--shiki-dark:#C678DD;--shiki-dark-font-style:italic">@</span><span style="color:#A626A4;font-style:italic;--shiki-dark:#C678DD;--shiki-dark-font-style:italic">param</span><span style="color:#C18401;font-style:italic;--shiki-dark:#E5C07B;--shiki-dark-font-style:italic"> &#123;Object&#x3C;string, string>&#125;</span><span style="color:#E45649;font-style:italic;--shiki-dark:#E06C75;--shiki-dark-font-style:italic"> headers</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> * </span><span style="color:#383A42;font-style:italic;--shiki-dark:#C678DD;--shiki-dark-font-style:italic">@</span><span style="color:#A626A4;font-style:italic;--shiki-dark:#C678DD;--shiki-dark-font-style:italic">returns</span><span style="color:#C18401;font-style:italic;--shiki-dark:#E5C07B;--shiki-dark-font-style:italic"> &#123;Response&#125;</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> */</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">function</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> makeResponse</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">body</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">status</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#986801;--shiki-dark:#D19A66"> 200</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">headers</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#123;&#125;) &#123;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E06C75">    headers</span><span style="color:#383A42;--shiki-dark:#ABB2BF">[</span><span style="color:#50A14F;--shiki-dark:#98C379">'access-control-allow-origin'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">] </span><span style="color:#0184BC;--shiki-dark:#56B6C2">=</span><span style="color:#50A14F;--shiki-dark:#98C379"> '*'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">    return</span><span style="color:#A626A4;--shiki-dark:#C678DD"> new</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> Response</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E06C75">body</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, &#123; </span><span style="color:#383A42;--shiki-dark:#E06C75">status</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#383A42;--shiki-dark:#E06C75">headers</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#125;);</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">&#125;</span></span><span class="line"></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">/**</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> * Create a new URL object.</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> * </span><span style="color:#383A42;font-style:italic;--shiki-dark:#C678DD;--shiki-dark-font-style:italic">@</span><span style="color:#A626A4;font-style:italic;--shiki-dark:#C678DD;--shiki-dark-font-style:italic">param</span><span style="color:#C18401;font-style:italic;--shiki-dark:#E5C07B;--shiki-dark-font-style:italic"> &#123;string&#125;</span><span style="color:#E45649;font-style:italic;--shiki-dark:#E06C75;--shiki-dark-font-style:italic"> urlStr</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> * </span><span style="color:#383A42;font-style:italic;--shiki-dark:#C678DD;--shiki-dark-font-style:italic">@</span><span style="color:#A626A4;font-style:italic;--shiki-dark:#C678DD;--shiki-dark-font-style:italic">returns</span><span style="color:#C18401;font-style:italic;--shiki-dark:#E5C07B;--shiki-dark-font-style:italic"> &#123;URL|null&#125;</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> */</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">function</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> createURL</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">urlStr</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) &#123;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">    try</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#123;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">        return</span><span style="color:#A626A4;--shiki-dark:#C678DD"> new</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> URL</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E06C75">urlStr</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    &#125; </span><span style="color:#A626A4;--shiki-dark:#C678DD">catch</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="color:#383A42;--shiki-dark:#E06C75">err</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) &#123;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">        return</span><span style="color:#986801;--shiki-dark:#D19A66"> null</span><span style="color:#383A42;--shiki-dark:#ABB2BF">;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    &#125;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">&#125;</span></span><span class="line"></span><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">addEventListener</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">'fetch'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, (</span><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">event</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) </span><span style="color:#A626A4;--shiki-dark:#C678DD">=></span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#123;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E5C07B">    event</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">respondWith</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#4078F2;--shiki-dark:#61AFEF">handleFetchEvent</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E06C75">event</span><span style="color:#383A42;--shiki-dark:#ABB2BF">).</span><span style="color:#4078F2;--shiki-dark:#61AFEF">catch</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">err</span><span style="color:#A626A4;--shiki-dark:#C678DD"> =></span><span style="color:#4078F2;--shiki-dark:#61AFEF"> makeResponse</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">`cfworker error:</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\n</span><span style="color:#CA1243;--shiki-dark:#C678DD">$&#123;</span><span style="color:#383A42;--shiki-dark:#E5C07B">err</span><span style="color:#50A14F;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">stack</span><span style="color:#CA1243;--shiki-dark:#C678DD">&#125;</span><span style="color:#50A14F;--shiki-dark:#98C379">`</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#986801;--shiki-dark:#D19A66">502</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)));</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">&#125;);</span></span><span class="line"></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">/**</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> * Handle the fetch event.</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> * </span><span style="color:#383A42;font-style:italic;--shiki-dark:#C678DD;--shiki-dark-font-style:italic">@</span><span style="color:#A626A4;font-style:italic;--shiki-dark:#C678DD;--shiki-dark-font-style:italic">param</span><span style="color:#C18401;font-style:italic;--shiki-dark:#E5C07B;--shiki-dark-font-style:italic"> &#123;FetchEvent&#125;</span><span style="color:#E45649;font-style:italic;--shiki-dark:#E06C75;--shiki-dark-font-style:italic"> event</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> * </span><span style="color:#383A42;font-style:italic;--shiki-dark:#C678DD;--shiki-dark-font-style:italic">@</span><span style="color:#A626A4;font-style:italic;--shiki-dark:#C678DD;--shiki-dark-font-style:italic">returns</span><span style="color:#C18401;font-style:italic;--shiki-dark:#E5C07B;--shiki-dark-font-style:italic"> &#123;Promise&#x3C;Response>&#125;</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> */</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">async</span><span style="color:#A626A4;--shiki-dark:#C678DD"> function</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> handleFetchEvent</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">event</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) &#123;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">    const</span><span style="color:#986801;--shiki-dark:#E5C07B"> req</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#E5C07B"> event</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">request</span><span style="color:#383A42;--shiki-dark:#ABB2BF">;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">    const</span><span style="color:#986801;--shiki-dark:#E5C07B"> url</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#A626A4;--shiki-dark:#C678DD"> new</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> URL</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E5C07B">req</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">url</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">    if</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="color:#383A42;--shiki-dark:#E5C07B">url</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E5C07B">pathname</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">startsWith</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">'/token'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) </span><span style="color:#0184BC;--shiki-dark:#56B6C2">||</span><span style="color:#383A42;--shiki-dark:#E5C07B"> url</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E5C07B">pathname</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">startsWith</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">'/v2'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)) &#123;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">        return</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> handleDockerProxy</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E06C75">req</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#383A42;--shiki-dark:#E06C75">url</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    &#125;</span></span><span class="line"></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">    if</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="color:#383A42;--shiki-dark:#E5C07B">url</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E5C07B">pathname</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">startsWith</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#986801;--shiki-dark:#E5C07B">PREFIX</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)) &#123;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">        return</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> handleGitHubProxy</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E06C75">req</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#383A42;--shiki-dark:#E06C75">url</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    &#125;</span></span><span class="line"></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">    return</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> makeResponse</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">'Not Found'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#986801;--shiki-dark:#D19A66">404</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">&#125;</span></span><span class="line"></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">/**</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> * Handle token requests and Docker proxy.</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> * </span><span style="color:#383A42;font-style:italic;--shiki-dark:#C678DD;--shiki-dark-font-style:italic">@</span><span style="color:#A626A4;font-style:italic;--shiki-dark:#C678DD;--shiki-dark-font-style:italic">param</span><span style="color:#C18401;font-style:italic;--shiki-dark:#E5C07B;--shiki-dark-font-style:italic"> &#123;Request&#125;</span><span style="color:#E45649;font-style:italic;--shiki-dark:#E06C75;--shiki-dark-font-style:italic"> req</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> * </span><span style="color:#383A42;font-style:italic;--shiki-dark:#C678DD;--shiki-dark-font-style:italic">@</span><span style="color:#A626A4;font-style:italic;--shiki-dark:#C678DD;--shiki-dark-font-style:italic">param</span><span style="color:#C18401;font-style:italic;--shiki-dark:#E5C07B;--shiki-dark-font-style:italic"> &#123;URL&#125;</span><span style="color:#E45649;font-style:italic;--shiki-dark:#E06C75;--shiki-dark-font-style:italic"> url</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> * </span><span style="color:#383A42;font-style:italic;--shiki-dark:#C678DD;--shiki-dark-font-style:italic">@</span><span style="color:#A626A4;font-style:italic;--shiki-dark:#C678DD;--shiki-dark-font-style:italic">returns</span><span style="color:#C18401;font-style:italic;--shiki-dark:#E5C07B;--shiki-dark-font-style:italic"> &#123;Promise&#x3C;Response>&#125;</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> */</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">async</span><span style="color:#A626A4;--shiki-dark:#C678DD"> function</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> handleDockerProxy</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">req</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">url</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) &#123;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">    if</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="color:#383A42;--shiki-dark:#E5C07B">url</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">pathname</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> ===</span><span style="color:#50A14F;--shiki-dark:#98C379"> '/token'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) &#123;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">        const</span><span style="color:#986801;--shiki-dark:#E5C07B"> tokenURL</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#986801;--shiki-dark:#E5C07B"> AUTH_URL</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> +</span><span style="color:#383A42;--shiki-dark:#E5C07B"> url</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">pathname</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> +</span><span style="color:#383A42;--shiki-dark:#E5C07B"> url</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">search</span><span style="color:#383A42;--shiki-dark:#ABB2BF">;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">        const</span><span style="color:#986801;--shiki-dark:#E5C07B"> headers</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#A626A4;--shiki-dark:#C678DD"> new</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> Headers</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(&#123;</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">            'Host'</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">:</span><span style="color:#50A14F;--shiki-dark:#98C379"> 'auth.docker.io'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">            'User-Agent'</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">:</span><span style="color:#383A42;--shiki-dark:#E5C07B"> req</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E5C07B">headers</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">get</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">'User-Agent'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">),</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">            'Accept'</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">:</span><span style="color:#383A42;--shiki-dark:#E5C07B"> req</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E5C07B">headers</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">get</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">'Accept'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">),</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">            'Accept-Language'</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">:</span><span style="color:#383A42;--shiki-dark:#E5C07B"> req</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E5C07B">headers</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">get</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">'Accept-Language'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">),</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">            'Accept-Encoding'</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">:</span><span style="color:#383A42;--shiki-dark:#E5C07B"> req</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E5C07B">headers</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">get</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">'Accept-Encoding'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">),</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">            'Connection'</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">:</span><span style="color:#50A14F;--shiki-dark:#98C379"> 'keep-alive'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">            'Cache-Control'</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">:</span><span style="color:#50A14F;--shiki-dark:#98C379"> 'max-age=0'</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">        &#125;);</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">        return</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> fetch</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#A626A4;--shiki-dark:#C678DD">new</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> Request</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E06C75">tokenURL</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#383A42;--shiki-dark:#E06C75">req</span><span style="color:#383A42;--shiki-dark:#ABB2BF">), &#123; </span><span style="color:#383A42;--shiki-dark:#E06C75">headers</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#125;);</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    &#125;</span></span><span class="line"></span><span class="line"><span style="color:#383A42;--shiki-dark:#E5C07B">    url</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">hostname</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#986801;--shiki-dark:#E5C07B"> HUB_HOST</span><span style="color:#383A42;--shiki-dark:#ABB2BF">;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">    const</span><span style="color:#986801;--shiki-dark:#E5C07B"> headers</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#A626A4;--shiki-dark:#C678DD"> new</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> Headers</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(&#123;</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">        'Host'</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">:</span><span style="color:#986801;--shiki-dark:#E5C07B"> HUB_HOST</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">        'User-Agent'</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">:</span><span style="color:#383A42;--shiki-dark:#E5C07B"> req</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E5C07B">headers</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">get</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">'User-Agent'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">),</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">        'Accept'</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">:</span><span style="color:#383A42;--shiki-dark:#E5C07B"> req</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E5C07B">headers</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">get</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">'Accept'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">),</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">        'Accept-Language'</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">:</span><span style="color:#383A42;--shiki-dark:#E5C07B"> req</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E5C07B">headers</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">get</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">'Accept-Language'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">),</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">        'Accept-Encoding'</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">:</span><span style="color:#383A42;--shiki-dark:#E5C07B"> req</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E5C07B">headers</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">get</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">'Accept-Encoding'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">),</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">        'Connection'</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">:</span><span style="color:#50A14F;--shiki-dark:#98C379"> 'keep-alive'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">        'Cache-Control'</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">:</span><span style="color:#50A14F;--shiki-dark:#98C379"> 'max-age=0'</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    &#125;);</span></span><span class="line"></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">    if</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="color:#383A42;--shiki-dark:#E5C07B">req</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E5C07B">headers</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">has</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">'Authorization'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)) &#123;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E5C07B">        headers</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">set</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">'Authorization'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#383A42;--shiki-dark:#E5C07B">req</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E5C07B">headers</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">get</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">'Authorization'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">));</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    &#125;</span></span><span class="line"></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">    const</span><span style="color:#986801;--shiki-dark:#E5C07B"> response</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#A626A4;--shiki-dark:#C678DD"> await</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> fetch</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#A626A4;--shiki-dark:#C678DD">new</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> Request</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E06C75">url</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#383A42;--shiki-dark:#E06C75">req</span><span style="color:#383A42;--shiki-dark:#ABB2BF">), &#123; </span><span style="color:#383A42;--shiki-dark:#E06C75">headers</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#125;);</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">    const</span><span style="color:#986801;--shiki-dark:#E5C07B"> responseHeaders</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#A626A4;--shiki-dark:#C678DD"> new</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> Headers</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E5C07B">response</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">headers</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">    const</span><span style="color:#986801;--shiki-dark:#E5C07B"> status</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#E5C07B"> response</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">status</span><span style="color:#383A42;--shiki-dark:#ABB2BF">;</span></span><span class="line"></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">    if</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="color:#383A42;--shiki-dark:#E5C07B">responseHeaders</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">get</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">'Www-Authenticate'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)) &#123;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">        const</span><span style="color:#986801;--shiki-dark:#E5C07B"> authHeader</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#E5C07B"> responseHeaders</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">get</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">'Www-Authenticate'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">        const</span><span style="color:#986801;--shiki-dark:#E5C07B"> re</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#A626A4;--shiki-dark:#C678DD"> new</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> RegExp</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#986801;--shiki-dark:#E5C07B">AUTH_URL</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#50A14F;--shiki-dark:#98C379">'g'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E5C07B">        responseHeaders</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">set</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">'Www-Authenticate'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#383A42;--shiki-dark:#E5C07B">authHeader</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">replace</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E06C75">re</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#986801;--shiki-dark:#E5C07B">WORKERS_URL</span><span style="color:#383A42;--shiki-dark:#ABB2BF">));</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    &#125;</span></span><span class="line"></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">    if</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="color:#383A42;--shiki-dark:#E5C07B">responseHeaders</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">get</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">'Location'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)) &#123;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">        return</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> handleHttpRedirect</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E06C75">req</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#383A42;--shiki-dark:#E5C07B">responseHeaders</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">get</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">'Location'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">));</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    &#125;</span></span><span class="line"></span><span class="line"><span style="color:#383A42;--shiki-dark:#E5C07B">    responseHeaders</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">set</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">'access-control-expose-headers'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#50A14F;--shiki-dark:#98C379">'*'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E5C07B">    responseHeaders</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">set</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">'access-control-allow-origin'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#50A14F;--shiki-dark:#98C379">'*'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E5C07B">    responseHeaders</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">set</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">'Cache-Control'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#50A14F;--shiki-dark:#98C379">'max-age=1500'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E5C07B">    responseHeaders</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">delete</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">'Content-Security-Policy'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E5C07B">    responseHeaders</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">delete</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">'Content-Security-Policy-Report-Only'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E5C07B">    responseHeaders</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">delete</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">'Clear-Site-Data'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">    return</span><span style="color:#A626A4;--shiki-dark:#C678DD"> new</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> Response</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E5C07B">response</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">body</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, &#123; </span><span style="color:#383A42;--shiki-dark:#E06C75">status</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#E45649;--shiki-dark:#E06C75">headers</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">:</span><span style="color:#383A42;--shiki-dark:#E06C75"> responseHeaders</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#125;);</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">&#125;</span></span><span class="line"></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">/**</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> * Handle GitHub proxy requests.</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> * </span><span style="color:#383A42;font-style:italic;--shiki-dark:#C678DD;--shiki-dark-font-style:italic">@</span><span style="color:#A626A4;font-style:italic;--shiki-dark:#C678DD;--shiki-dark-font-style:italic">param</span><span style="color:#C18401;font-style:italic;--shiki-dark:#E5C07B;--shiki-dark-font-style:italic"> &#123;Request&#125;</span><span style="color:#E45649;font-style:italic;--shiki-dark:#E06C75;--shiki-dark-font-style:italic"> req</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> * </span><span style="color:#383A42;font-style:italic;--shiki-dark:#C678DD;--shiki-dark-font-style:italic">@</span><span style="color:#A626A4;font-style:italic;--shiki-dark:#C678DD;--shiki-dark-font-style:italic">param</span><span style="color:#C18401;font-style:italic;--shiki-dark:#E5C07B;--shiki-dark-font-style:italic"> &#123;URL&#125;</span><span style="color:#E45649;font-style:italic;--shiki-dark:#E06C75;--shiki-dark-font-style:italic"> url</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> * </span><span style="color:#383A42;font-style:italic;--shiki-dark:#C678DD;--shiki-dark-font-style:italic">@</span><span style="color:#A626A4;font-style:italic;--shiki-dark:#C678DD;--shiki-dark-font-style:italic">returns</span><span style="color:#C18401;font-style:italic;--shiki-dark:#E5C07B;--shiki-dark-font-style:italic"> &#123;Promise&#x3C;Response>&#125;</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> */</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">async</span><span style="color:#A626A4;--shiki-dark:#C678DD"> function</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> handleGitHubProxy</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">req</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">url</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) &#123;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">    let</span><span style="color:#383A42;--shiki-dark:#E06C75"> path</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#E5C07B"> url</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E5C07B">searchParams</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">get</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">'q'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">    if</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="color:#383A42;--shiki-dark:#E06C75">path</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) &#123;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">        return</span><span style="color:#383A42;--shiki-dark:#E5C07B"> Response</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">redirect</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">'https://'</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> +</span><span style="color:#383A42;--shiki-dark:#E5C07B"> url</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">host</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> +</span><span style="color:#986801;--shiki-dark:#E5C07B"> PREFIX</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> +</span><span style="color:#383A42;--shiki-dark:#E06C75"> path</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#986801;--shiki-dark:#D19A66">301</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    &#125;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E06C75">    path</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#E5C07B"> url</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E5C07B">href</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">substr</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E5C07B">url</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E5C07B">origin</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">length</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> +</span><span style="color:#986801;--shiki-dark:#E5C07B"> PREFIX</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">length</span><span style="color:#383A42;--shiki-dark:#ABB2BF">).</span><span style="color:#4078F2;--shiki-dark:#61AFEF">replace</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#0184BC;--shiki-dark:#E06C75">/</span><span style="color:#A626A4;--shiki-dark:#C678DD">^</span><span style="color:#0184BC;--shiki-dark:#E06C75">https</span><span style="color:#0184BC;--shiki-dark:#D19A66">?</span><span style="color:#0184BC;--shiki-dark:#E06C75">:</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\/</span><span style="color:#0184BC;--shiki-dark:#D19A66">+</span><span style="color:#0184BC;--shiki-dark:#E06C75">/</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#50A14F;--shiki-dark:#98C379">'https://'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">    if</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="color:#4078F2;--shiki-dark:#61AFEF">checkUrl</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E06C75">path</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)) &#123;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">        return</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> httpHandler</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E06C75">req</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#383A42;--shiki-dark:#E06C75">path</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    &#125; </span><span style="color:#A626A4;--shiki-dark:#C678DD">else</span><span style="color:#A626A4;--shiki-dark:#C678DD"> if</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="color:#383A42;--shiki-dark:#E5C07B">path</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">search</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E06C75">exp2</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) </span><span style="color:#0184BC;--shiki-dark:#56B6C2">===</span><span style="color:#986801;--shiki-dark:#D19A66"> 0</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) &#123;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">        if</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="color:#383A42;--shiki-dark:#E5C07B">Config</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">jsdelivr</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) &#123;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">            const</span><span style="color:#986801;--shiki-dark:#E5C07B"> newUrl</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#E5C07B"> path</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">replace</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">'/blob/'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#50A14F;--shiki-dark:#98C379">'@'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">).</span><span style="color:#4078F2;--shiki-dark:#61AFEF">replace</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#0184BC;--shiki-dark:#E06C75">/</span><span style="color:#A626A4;--shiki-dark:#C678DD">^</span><span style="color:#0184BC;--shiki-dark:#E06C75">(?:https</span><span style="color:#0184BC;--shiki-dark:#D19A66">?</span><span style="color:#0184BC;--shiki-dark:#E06C75">:</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\/\/</span><span style="color:#0184BC;--shiki-dark:#E06C75">)</span><span style="color:#0184BC;--shiki-dark:#D19A66">?</span><span style="color:#0184BC;--shiki-dark:#E06C75">github</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\.</span><span style="color:#0184BC;--shiki-dark:#E06C75">com/</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#50A14F;--shiki-dark:#98C379">'https://cdn.jsdelivr.net/gh'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">            return</span><span style="color:#383A42;--shiki-dark:#E5C07B"> Response</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">redirect</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E06C75">newUrl</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#986801;--shiki-dark:#D19A66">302</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">        &#125; </span><span style="color:#A626A4;--shiki-dark:#C678DD">else</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#123;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E06C75">            path</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#E5C07B"> path</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">replace</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">'/blob/'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#50A14F;--shiki-dark:#98C379">'/raw/'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">            return</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> httpHandler</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E06C75">req</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#383A42;--shiki-dark:#E06C75">path</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">        &#125;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    &#125; </span><span style="color:#A626A4;--shiki-dark:#C678DD">else</span><span style="color:#A626A4;--shiki-dark:#C678DD"> if</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="color:#383A42;--shiki-dark:#E5C07B">path</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">search</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E06C75">exp4</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) </span><span style="color:#0184BC;--shiki-dark:#56B6C2">===</span><span style="color:#986801;--shiki-dark:#D19A66"> 0</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) &#123;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">        const</span><span style="color:#986801;--shiki-dark:#E5C07B"> newUrl</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#E5C07B"> path</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">replace</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#0184BC;--shiki-dark:#E06C75">/(?&#x3C;=com</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\/</span><span style="color:#986801;--shiki-dark:#E06C75">.</span><span style="color:#0184BC;--shiki-dark:#D19A66">+?</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\/</span><span style="color:#986801;--shiki-dark:#E06C75">.</span><span style="color:#0184BC;--shiki-dark:#D19A66">+?</span><span style="color:#0184BC;--shiki-dark:#E06C75">)</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\/</span><span style="color:#0184BC;--shiki-dark:#E06C75">(</span><span style="color:#986801;--shiki-dark:#E06C75">.</span><span style="color:#0184BC;--shiki-dark:#D19A66">+?</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\/</span><span style="color:#0184BC;--shiki-dark:#E06C75">)/</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#50A14F;--shiki-dark:#98C379">'@$1'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">).</span><span style="color:#4078F2;--shiki-dark:#61AFEF">replace</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#0184BC;--shiki-dark:#E06C75">/</span><span style="color:#A626A4;--shiki-dark:#C678DD">^</span><span style="color:#0184BC;--shiki-dark:#E06C75">(?:https</span><span style="color:#0184BC;--shiki-dark:#D19A66">?</span><span style="color:#0184BC;--shiki-dark:#E06C75">:</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\/\/</span><span style="color:#0184BC;--shiki-dark:#E06C75">)</span><span style="color:#0184BC;--shiki-dark:#D19A66">?</span><span style="color:#0184BC;--shiki-dark:#E06C75">raw</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\.</span><span style="color:#0184BC;--shiki-dark:#E06C75">(?:githubusercontent</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">|</span><span style="color:#0184BC;--shiki-dark:#E06C75">github)</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\.</span><span style="color:#0184BC;--shiki-dark:#E06C75">com/</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#50A14F;--shiki-dark:#98C379">'https://cdn.jsdelivr.net/gh'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">        return</span><span style="color:#383A42;--shiki-dark:#E5C07B"> Response</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">redirect</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E06C75">newUrl</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#986801;--shiki-dark:#D19A66">302</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    &#125; </span><span style="color:#A626A4;--shiki-dark:#C678DD">else</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#123;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">        return</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> fetch</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#986801;--shiki-dark:#E5C07B">ASSET_URL</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> +</span><span style="color:#383A42;--shiki-dark:#E06C75"> path</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    &#125;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">&#125;</span></span><span class="line"></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">/**</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> * Check if the URL matches GitHub patterns.</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> * </span><span style="color:#383A42;font-style:italic;--shiki-dark:#C678DD;--shiki-dark-font-style:italic">@</span><span style="color:#A626A4;font-style:italic;--shiki-dark:#C678DD;--shiki-dark-font-style:italic">param</span><span style="color:#C18401;font-style:italic;--shiki-dark:#E5C07B;--shiki-dark-font-style:italic"> &#123;string&#125;</span><span style="color:#E45649;font-style:italic;--shiki-dark:#E06C75;--shiki-dark-font-style:italic"> url</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> * </span><span style="color:#383A42;font-style:italic;--shiki-dark:#C678DD;--shiki-dark-font-style:italic">@</span><span style="color:#A626A4;font-style:italic;--shiki-dark:#C678DD;--shiki-dark-font-style:italic">returns</span><span style="color:#C18401;font-style:italic;--shiki-dark:#E5C07B;--shiki-dark-font-style:italic"> &#123;boolean&#125;</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> */</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">function</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> checkUrl</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">url</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) &#123;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">    return</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> [</span><span style="color:#383A42;--shiki-dark:#E06C75">exp1</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#383A42;--shiki-dark:#E06C75">exp2</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#383A42;--shiki-dark:#E06C75">exp3</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#383A42;--shiki-dark:#E06C75">exp4</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#383A42;--shiki-dark:#E06C75">exp5</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#383A42;--shiki-dark:#E06C75">exp6</span><span style="color:#383A42;--shiki-dark:#ABB2BF">].</span><span style="color:#4078F2;--shiki-dark:#61AFEF">some</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">exp</span><span style="color:#A626A4;--shiki-dark:#C678DD"> =></span><span style="color:#383A42;--shiki-dark:#E5C07B"> url</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">search</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E06C75">exp</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) </span><span style="color:#0184BC;--shiki-dark:#56B6C2">===</span><span style="color:#986801;--shiki-dark:#D19A66"> 0</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">&#125;</span></span><span class="line"></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">/**</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> * Handle HTTP redirects.</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> * </span><span style="color:#383A42;font-style:italic;--shiki-dark:#C678DD;--shiki-dark-font-style:italic">@</span><span style="color:#A626A4;font-style:italic;--shiki-dark:#C678DD;--shiki-dark-font-style:italic">param</span><span style="color:#C18401;font-style:italic;--shiki-dark:#E5C07B;--shiki-dark-font-style:italic"> &#123;Request&#125;</span><span style="color:#E45649;font-style:italic;--shiki-dark:#E06C75;--shiki-dark-font-style:italic"> req</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> * </span><span style="color:#383A42;font-style:italic;--shiki-dark:#C678DD;--shiki-dark-font-style:italic">@</span><span style="color:#A626A4;font-style:italic;--shiki-dark:#C678DD;--shiki-dark-font-style:italic">param</span><span style="color:#C18401;font-style:italic;--shiki-dark:#E5C07B;--shiki-dark-font-style:italic"> &#123;string&#125;</span><span style="color:#E45649;font-style:italic;--shiki-dark:#E06C75;--shiki-dark-font-style:italic"> location</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> * </span><span style="color:#383A42;font-style:italic;--shiki-dark:#C678DD;--shiki-dark-font-style:italic">@</span><span style="color:#A626A4;font-style:italic;--shiki-dark:#C678DD;--shiki-dark-font-style:italic">returns</span><span style="color:#C18401;font-style:italic;--shiki-dark:#E5C07B;--shiki-dark-font-style:italic"> &#123;Promise&#x3C;Response>&#125;</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> */</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">async</span><span style="color:#A626A4;--shiki-dark:#C678DD"> function</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> handleHttpRedirect</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">req</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">location</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) &#123;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">    const</span><span style="color:#986801;--shiki-dark:#E5C07B"> url</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> createURL</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E06C75">location</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">    if</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="color:#0184BC;--shiki-dark:#56B6C2">!</span><span style="color:#383A42;--shiki-dark:#E06C75">url</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) &#123;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">        return</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> makeResponse</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">'Invalid URL'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#986801;--shiki-dark:#D19A66">400</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    &#125;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">    return</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> proxyRequest</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E06C75">url</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#383A42;--shiki-dark:#E06C75">req</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">&#125;</span></span><span class="line"></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">/**</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> * Handle HTTP requests.</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> * </span><span style="color:#383A42;font-style:italic;--shiki-dark:#C678DD;--shiki-dark-font-style:italic">@</span><span style="color:#A626A4;font-style:italic;--shiki-dark:#C678DD;--shiki-dark-font-style:italic">param</span><span style="color:#C18401;font-style:italic;--shiki-dark:#E5C07B;--shiki-dark-font-style:italic"> &#123;Request&#125;</span><span style="color:#E45649;font-style:italic;--shiki-dark:#E06C75;--shiki-dark-font-style:italic"> req</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> * </span><span style="color:#383A42;font-style:italic;--shiki-dark:#C678DD;--shiki-dark-font-style:italic">@</span><span style="color:#A626A4;font-style:italic;--shiki-dark:#C678DD;--shiki-dark-font-style:italic">param</span><span style="color:#C18401;font-style:italic;--shiki-dark:#E5C07B;--shiki-dark-font-style:italic"> &#123;string&#125;</span><span style="color:#E45649;font-style:italic;--shiki-dark:#E06C75;--shiki-dark-font-style:italic"> pathname</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> * </span><span style="color:#383A42;font-style:italic;--shiki-dark:#C678DD;--shiki-dark-font-style:italic">@</span><span style="color:#A626A4;font-style:italic;--shiki-dark:#C678DD;--shiki-dark-font-style:italic">returns</span><span style="color:#C18401;font-style:italic;--shiki-dark:#E5C07B;--shiki-dark-font-style:italic"> &#123;Promise&#x3C;Response>&#125;</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> */</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">async</span><span style="color:#A626A4;--shiki-dark:#C678DD"> function</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> httpHandler</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">req</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">pathname</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) &#123;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">    if</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="color:#383A42;--shiki-dark:#E5C07B">req</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">method</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> ===</span><span style="color:#50A14F;--shiki-dark:#98C379"> 'OPTIONS'</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> &#x26;&#x26;</span><span style="color:#383A42;--shiki-dark:#E5C07B"> req</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E5C07B">headers</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">has</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">'access-control-request-headers'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)) &#123;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">        return</span><span style="color:#A626A4;--shiki-dark:#C678DD"> new</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> Response</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#986801;--shiki-dark:#D19A66">null</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#986801;--shiki-dark:#E5C07B">PREFLIGHT_INIT</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    &#125;</span></span><span class="line"></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">    const</span><span style="color:#986801;--shiki-dark:#E5C07B"> headers</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#A626A4;--shiki-dark:#C678DD"> new</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> Headers</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E5C07B">req</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">headers</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">    let</span><span style="color:#383A42;--shiki-dark:#E06C75"> flag</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> !</span><span style="color:#383A42;--shiki-dark:#E5C07B">whiteList</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">length</span><span style="color:#383A42;--shiki-dark:#ABB2BF">;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">    for</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="color:#A626A4;--shiki-dark:#C678DD">const</span><span style="color:#986801;--shiki-dark:#E5C07B"> i</span><span style="color:#A626A4;--shiki-dark:#C678DD"> of</span><span style="color:#383A42;--shiki-dark:#E06C75"> whiteList</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) &#123;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">        if</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="color:#383A42;--shiki-dark:#E5C07B">pathname</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">includes</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E06C75">i</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)) &#123;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E06C75">            flag</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#986801;--shiki-dark:#D19A66"> true</span><span style="color:#383A42;--shiki-dark:#ABB2BF">;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">            break</span><span style="color:#383A42;--shiki-dark:#ABB2BF">;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">        &#125;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    &#125;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">    if</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="color:#0184BC;--shiki-dark:#56B6C2">!</span><span style="color:#383A42;--shiki-dark:#E06C75">flag</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) &#123;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">        return</span><span style="color:#A626A4;--shiki-dark:#C678DD"> new</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> Response</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">'blocked'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, &#123; </span><span style="color:#E45649;--shiki-dark:#E06C75">status</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">:</span><span style="color:#986801;--shiki-dark:#D19A66"> 403</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#125;);</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    &#125;</span></span><span class="line"></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">    if</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="color:#383A42;--shiki-dark:#E5C07B">pathname</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">search</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#0184BC;--shiki-dark:#E06C75">/</span><span style="color:#A626A4;--shiki-dark:#C678DD">^</span><span style="color:#0184BC;--shiki-dark:#E06C75">https</span><span style="color:#0184BC;--shiki-dark:#D19A66">?</span><span style="color:#0184BC;--shiki-dark:#E06C75">:</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\/\/</span><span style="color:#0184BC;--shiki-dark:#E06C75">/</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) </span><span style="color:#0184BC;--shiki-dark:#56B6C2">!==</span><span style="color:#986801;--shiki-dark:#D19A66"> 0</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) &#123;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E06C75">        pathname</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#50A14F;--shiki-dark:#98C379"> 'https://'</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> +</span><span style="color:#383A42;--shiki-dark:#E06C75"> pathname</span><span style="color:#383A42;--shiki-dark:#ABB2BF">;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    &#125;</span></span><span class="line"></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">    const</span><span style="color:#986801;--shiki-dark:#E5C07B"> url</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> createURL</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E06C75">pathname</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">    return</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> proxyRequest</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E06C75">url</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, &#123; </span><span style="color:#E45649;--shiki-dark:#E06C75">method</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">:</span><span style="color:#383A42;--shiki-dark:#E5C07B"> req</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">method</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#383A42;--shiki-dark:#E06C75">headers</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#E45649;--shiki-dark:#E06C75">body</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">:</span><span style="color:#383A42;--shiki-dark:#E5C07B"> req</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">body</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#125;);</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">&#125;</span></span><span class="line"></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">/**</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> * Proxy a request.</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> * </span><span style="color:#383A42;font-style:italic;--shiki-dark:#C678DD;--shiki-dark-font-style:italic">@</span><span style="color:#A626A4;font-style:italic;--shiki-dark:#C678DD;--shiki-dark-font-style:italic">param</span><span style="color:#C18401;font-style:italic;--shiki-dark:#E5C07B;--shiki-dark-font-style:italic"> &#123;URL&#125;</span><span style="color:#E45649;font-style:italic;--shiki-dark:#E06C75;--shiki-dark-font-style:italic"> url</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> * </span><span style="color:#383A42;font-style:italic;--shiki-dark:#C678DD;--shiki-dark-font-style:italic">@</span><span style="color:#A626A4;font-style:italic;--shiki-dark:#C678DD;--shiki-dark-font-style:italic">param</span><span style="color:#C18401;font-style:italic;--shiki-dark:#E5C07B;--shiki-dark-font-style:italic"> &#123;RequestInit&#125;</span><span style="color:#E45649;font-style:italic;--shiki-dark:#E06C75;--shiki-dark-font-style:italic"> reqInit</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> * </span><span style="color:#383A42;font-style:italic;--shiki-dark:#C678DD;--shiki-dark-font-style:italic">@</span><span style="color:#A626A4;font-style:italic;--shiki-dark:#C678DD;--shiki-dark-font-style:italic">returns</span><span style="color:#C18401;font-style:italic;--shiki-dark:#E5C07B;--shiki-dark-font-style:italic"> &#123;Promise&#x3C;Response>&#125;</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> */</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">async</span><span style="color:#A626A4;--shiki-dark:#C678DD"> function</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> proxyRequest</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">url</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">reqInit</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) &#123;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">    const</span><span style="color:#986801;--shiki-dark:#E5C07B"> response</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#A626A4;--shiki-dark:#C678DD"> await</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> fetch</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E5C07B">url</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">href</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#383A42;--shiki-dark:#E06C75">reqInit</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">    const</span><span style="color:#986801;--shiki-dark:#E5C07B"> responseHeaders</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#A626A4;--shiki-dark:#C678DD"> new</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> Headers</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E5C07B">response</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">headers</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">    if</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="color:#383A42;--shiki-dark:#E5C07B">responseHeaders</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">has</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">'location'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)) &#123;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">        const</span><span style="color:#986801;--shiki-dark:#E5C07B"> location</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#E5C07B"> responseHeaders</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">get</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">'location'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">        if</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="color:#4078F2;--shiki-dark:#61AFEF">checkUrl</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E06C75">location</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)) &#123;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E5C07B">            responseHeaders</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">set</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">'location'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#986801;--shiki-dark:#E5C07B">PREFIX</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> +</span><span style="color:#383A42;--shiki-dark:#E06C75"> location</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">        &#125; </span><span style="color:#A626A4;--shiki-dark:#C678DD">else</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#123;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E5C07B">            reqInit</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">redirect</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#50A14F;--shiki-dark:#98C379"> 'follow'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">            return</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> proxyRequest</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#4078F2;--shiki-dark:#61AFEF">createURL</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E06C75">location</span><span style="color:#383A42;--shiki-dark:#ABB2BF">), </span><span style="color:#383A42;--shiki-dark:#E06C75">reqInit</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">        &#125;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    &#125;</span></span><span class="line"></span><span class="line"><span style="color:#383A42;--shiki-dark:#E5C07B">    responseHeaders</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">set</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">'access-control-expose-headers'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#50A14F;--shiki-dark:#98C379">'*'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E5C07B">    responseHeaders</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">set</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">'access-control-allow-origin'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#50A14F;--shiki-dark:#98C379">'*'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E5C07B">    responseHeaders</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">delete</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">'content-security-policy'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E5C07B">    responseHeaders</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">delete</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">'content-security-policy-report-only'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E5C07B">    responseHeaders</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">delete</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">'clear-site-data'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">    return</span><span style="color:#A626A4;--shiki-dark:#C678DD"> new</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> Response</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E5C07B">response</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">body</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, &#123;</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">        status</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">:</span><span style="color:#383A42;--shiki-dark:#E5C07B"> response</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">status</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">        headers</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">:</span><span style="color:#383A42;--shiki-dark:#E06C75"> responseHeaders</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    &#125;);</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">&#125;</span></span></code></pre></td></tr></tbody></table></figure><h3 id="参考资料">参考资料</h3><ul><li><ahref="https://zhuanlan.zhihu.com/p/621142457">2023最新WSL搭建深度学习平台教程（适用于Docker-gpu、tensorflow-gpu、pytorch-gpu）- 知乎</a></li><li><ahref="https://blog.csdn.net/anmin8888/article/details/127910084">CUDA与cuDNN安装教程（超详细）-CSDN博客</a></li><li><a href="https://zhuanlan.zhihu.com/p/471484611" rel="external nofollow noreferrer">PytorchDocker镜像构建教程（不同系统、CUDA、Python版本） - 知乎</a></li><li><ahref="https://rocm.docs.amd.com/projects/radeon/en/latest/docs/install/wsl/install-pytorch.html">InstallPyTorch for ROCm — Use ROCm on Radeon GPUs</a></li></ul>]]></content:encoded>
      
      
      <category domain="https://blog.hpcesia.com/categories/%E7%BB%8F%E9%AA%8C%E8%AE%B0%E5%BD%95/">经验记录</category>
      
      
      <category domain="https://blog.hpcesia.com/tags/Python/">Python</category>
      
      <category domain="https://blog.hpcesia.com/tags/Docker/">Docker</category>
      
      <category domain="https://blog.hpcesia.com/tags/Linux/">Linux</category>
      
      <category domain="https://blog.hpcesia.com/tags/PyTorch/">PyTorch</category>
      
      
      <comments>https://blog.hpcesia.com/posts/63c8a3ae/#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>为 WSL 中的 Docker 配置 systemd 以使用宿主机代理</title>
      <link>https://blog.hpcesia.com/posts/f363aaf1/</link>
      <guid>https://blog.hpcesia.com/posts/f363aaf1/</guid>
      <pubDate>Sat, 04 Jan 2025 11:19:35 GMT</pubDate>
      
      <description>为 Windows 10 上的 WSL2 安装的原生 Docker 配置代理</description>
      
      
      
      <content:encoded><![CDATA[<h2 id="wsl-中使用-systemd-为-docker-配置代理">WSL 中使用 Systemd 为Docker 配置代理</h2><p>对于 Windows 11 22H2 以上版本来说，为 WSL2 里的 Docker配置代理，只需要将 WSL2 的网络切换为镜像模式，即可像配置原生 Linux一样配置代理。但对 Windows 10 用户来说，配置代理就会麻烦一点。由于 WSL2每次宿主机开机时，分配的虚拟网卡地址不一样，因此不能直接使用 127.0.0.1访问宿主机上的代理。同时 Docker 使用 systemd启动，写在终端中的代理配置，如 <figure class="highlight fish"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span style="color:#0184BC;--shiki-dark:#56B6C2">export</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> hostip=(</span><span style="color:#0184BC;--shiki-dark:#56B6C2">cat</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> /etc/resolv.conf | </span><span style="color:#0184BC;--shiki-dark:#56B6C2">grep</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> -oP </span><span style="color:#50A14F;--shiki-dark:#98C379">'(?&#x3C;=nameserver\ ).*'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"><span style="color:#0184BC;--shiki-dark:#56B6C2">export</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> https_proxy=</span><span style="color:#50A14F;--shiki-dark:#98C379">"http://</span><span style="color:#50A14F;--shiki-dark:#E06C75">$</span><span style="color:#E45649;--shiki-dark:#E06C75">hostip</span><span style="color:#50A14F;--shiki-dark:#98C379">:7890"</span></span><span class="line"><span style="color:#0184BC;--shiki-dark:#56B6C2">export</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> http_proxy=</span><span style="color:#50A14F;--shiki-dark:#98C379">"http://</span><span style="color:#50A14F;--shiki-dark:#E06C75">$</span><span style="color:#E45649;--shiki-dark:#E06C75">hostip</span><span style="color:#50A14F;--shiki-dark:#98C379">:7890"</span></span></code></pre></td></tr></tbody></table></figure> 是不能正常生效的。</p><p>网络上的相关教程基本都使用的是固定 ip，这样每次开机都需要改动ip，或者写脚本固定分配给 WSL2的ip。我研究了一段时间后，发现可以直接通过修改 systemd 配置来让 Docker也使用宿主机的代理。</p><p>以下以 Clash 为例，代理端口为 7890，WSL2 中用户名称为hpcesia，请自行改动相关内容。首先创建配置文件：</p><figure class="highlight shell"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">sudo</span><span style="color:#50A14F;--shiki-dark:#98C379"> mkdir</span><span style="color:#986801;--shiki-dark:#D19A66"> -p</span><span style="color:#50A14F;--shiki-dark:#98C379"> /etc/systemd/system/docker.service.d</span></span><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">sudo</span><span style="color:#50A14F;--shiki-dark:#98C379"> vim</span><span style="color:#50A14F;--shiki-dark:#98C379"> /etc/systemd/system/docker.service.d/proxy.conf</span></span></code></pre></td></tr></tbody></table></figure><p>在其中输入如下内容，注意替换端口号：</p><figure class="highlight ini"><figcaption><span>/etc/systemd/system/docker.service.d/proxy.conf</span></figcaption><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">[Service]</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#C678DD">ExecStartPre</span><span style="color:#383A42;--shiki-dark:#ABB2BF">=</span><span style="color:#383A42;--shiki-dark:#98C379">sudo /bin/bash -c </span><span style="color:#50A14F;--shiki-dark:#98C379">"echo http_proxy=http://$(cat /etc/resolv.conf | grep -oP '(?&#x3C;=nameserver\\ ).*'):7890 > /tmp/docker_env"</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#C678DD">ExecStartPre</span><span style="color:#383A42;--shiki-dark:#ABB2BF">=</span><span style="color:#383A42;--shiki-dark:#98C379">sudo /bin/bash -c </span><span style="color:#50A14F;--shiki-dark:#98C379">"echo https_proxy=http://$(cat /etc/resolv.conf | grep -oP '(?&#x3C;=nameserver\\ ).*'):7890 >> /tmp/docker_env"</span></span><span class="line"></span><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">[Service]</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#C678DD">EnvironmentFile</span><span style="color:#383A42;--shiki-dark:#ABB2BF">=</span><span style="color:#383A42;--shiki-dark:#98C379">-/tmp/docker_env</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#C678DD">Environment</span><span style="color:#383A42;--shiki-dark:#ABB2BF">=</span><span style="color:#E45649;--shiki-dark:#C678DD">no_proxy</span><span style="color:#383A42;--shiki-dark:#ABB2BF">=</span><span style="color:#50A14F;--shiki-dark:#98C379">"127.0.0.1,localhost"</span></span></code></pre></td></tr></tbody></table></figure><p>再重启 docker 即可。</p><figure class="highlight shell"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">sudo</span><span style="color:#50A14F;--shiki-dark:#98C379"> systemctl</span><span style="color:#50A14F;--shiki-dark:#98C379"> daemon-reload</span></span><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">sudo</span><span style="color:#50A14F;--shiki-dark:#98C379"> systemctl</span><span style="color:#50A14F;--shiki-dark:#98C379"> restart</span><span style="color:#50A14F;--shiki-dark:#98C379"> docker</span></span></code></pre></td></tr></tbody></table></figure><p>使用 hello-world 镜像进行测试，可以正常拉取，说明配置成功。</p><h2 id="参考资料">参考资料</h2><ul><li><ahref="https://www.jinbuguo.com/systemd/systemd.exec.html#%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F">systemd.exec中文手册 [金步国]</a></li><li><ahref="https://www.jinbuguo.com/systemd/systemd.service.html#ExecStartPre=">systemd.service中文手册 [金步国]</a></li></ul>]]></content:encoded>
      
      
      <category domain="https://blog.hpcesia.com/categories/%E7%BB%8F%E9%AA%8C%E8%AE%B0%E5%BD%95/">经验记录</category>
      
      
      <category domain="https://blog.hpcesia.com/tags/Windows/">Windows</category>
      
      <category domain="https://blog.hpcesia.com/tags/Docker/">Docker</category>
      
      <category domain="https://blog.hpcesia.com/tags/WSL/">WSL</category>
      
      <category domain="https://blog.hpcesia.com/tags/Linux/">Linux</category>
      
      
      <comments>https://blog.hpcesia.com/posts/f363aaf1/#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>月寄（二）| 自食其果</title>
      <link>https://blog.hpcesia.com/posts/75352449/</link>
      <guid>https://blog.hpcesia.com/posts/75352449/</guid>
      <pubDate>Sun, 29 Dec 2024 04:01:02 GMT</pubDate>
      
        
        
          
          
      <description>&lt;p&gt;许久不见，上次更新博客已是一个月前的事情了。到现在，随着考研和期末考试的结束，这个学期的所有事情也算是告一段落了，只剩一个时间还算充裕的毕业论文需要忙，所以我赶紧码了一篇文章，以免整个
12 月都没一篇新博文。&lt;/p&gt;
&lt;p&gt;12</description>
          
        
      
      
      
      <content:encoded><![CDATA[<p>许久不见，上次更新博客已是一个月前的事情了。到现在，随着考研和期末考试的结束，这个学期的所有事情也算是告一段落了，只剩一个时间还算充裕的毕业论文需要忙，所以我赶紧码了一篇文章，以免整个12 月都没一篇新博文。</p><p>12 月事情比较多，所以把周记改成了月记，本次月记记录时长为 5 周：11.25- 12.29。</p><h2 id="非典型考研">非典型考研</h2><p>今年的考研时间比以往提前了些许，是 12 月 21-22日。为什么说是「非典型考研」呢？因为我自己的考研复习安排，现在回顾起来，我自己看着都想笑。</p><p>我决定要考研并开始复习的时间其实还是蛮早的，今年春节时便已经决定要考研跨考到计算机，并开始学习408（计算机综合统考科目）了。但是我在 12月以前的复习，都可以用「随缘」来形容。一直到了 9 月，我才磨磨蹭蹭地把408的四门课程全部看了一遍，然后发现根本记不住那么多知识点，只能赶紧找到了专业课考自命题，只用学408 中两门的西交。</p><p>从9月开始，我就按考试顺序挨个说说自己各个科目的备考情况吧。</p><p>首先是政治，我从 9月开始磨磨蹭蹭地看徐涛老师的考研政治强化班，顺便做做《肖1000》。中间分心于各种闲事，譬如鼓捣这个博客，直到 11月底（本次月记开始的时间）强化班也才看了一半。感觉时间来不及了，于是我紧赶慢赶心不在焉地把剩下一半的课程在12 月初《肖四》出来之前看完了。拿到《肖四》时，已是 12 月 13日，当天我就开始背《肖四》分析题答案的提纲，顺便把四套卷子的选择题都做了一遍。（顺带一提，政治分析题的复习方式——背押题卷的答案——我是等肖四到了才在和一起备考的舍友那里知道的。）背一会儿玩一会儿地背了一个白天，我只背完了一道题（即四套押题卷的同一题的答案），但却感觉有些生理性的恶心想吐，完全背不下去也记不住，之后几天便换成了背诵提纲的提纲，即B站上带背视频总结的答案要点。（还是刚才那个舍友，他直接背了前两套卷的完整答案和后两套卷的提纲，我是真佩服。）</p><p>政治今年卷子难度算是最近十几年来最难的一次了，表现就是《肖四》中押的考点，要么背的答案都写在材料里，要么压根不沾边，能用上的东西很少。不过对我这种没好好背《肖四》答案的人来说，倒算是一个利好，大伙都只能在考场上「守正创新」——抄材料和瞎编，背没背好押题卷的答案就不重要了（笑）。</p><p>然后是英语。这科其实没什么好说的，在去年 6 月考完 4级，发现自己单词量相当匮乏、试卷上有大量没见过的单词时，我便开始用「不背单词」这个应用来每天背单词，一直到上考场时，背过的单词数量是5000 左右，记得比较熟的单词大概在 3500 左右，基本覆盖了考研考纲词汇。9月初，我再 burningvocabulary上下载了过往三年的英语一真题做了一下，发现难度并不高，于是便没有复习英语，只在临考的时候稍微看了下作文模板，记了下各种文章格式要求。</p><p>英语一今年的考试难度据说也是近十年最难的了，试题难度仅次于 2010年。我自己的做题感受就是：完形填空知道这个空该填什么意思的单词，但四个选项的短语都不知道是啥意思，单词本意看起来填上去基本都说得过去；阅读理解的文章自说自话逻辑不清，需要先帮作者厘清逻辑才能回答问题；段落排序虽然难度不大，但是也需要花不少时间仔细读一遍才能做出来；翻译中的长难句各种从句修饰相互嵌套好几层，费劲功夫厘清嵌套关系后（最想要编程语言的「{}」来清楚标识嵌套层级的一集），直译出来的中文语序过于怪异，还需要绞尽脑汁安排语序，让翻译出来的东西不至于变成「好小众的语言，长得和汉字好像」。作文就很凄惨了，前面花费太多时间，加上完全没背作文模板，硬着头皮写的东西自己都看不下去。</p><p>接着是数学。这科是我最意外的一科，毕竟我是数学系的，对数学功底多少还有点自信。于是我就只在十一月底做了四五套往年的数学一真题练练手并检查一下自己遗忘较多的知识点，接着做了点遗忘知识点的题目，就去考试了。</p><p>但是今年的数学一考研试题给了我一个迎头痛击：我能看出来题目本身不难，但要么需要花很多时间计算，要么涉及的解题技巧比较偏门。我压根没复习到。很多题目我知道只要我多刷点题，肯定能刷到类似题目，到了考场上自然也解得出来，可我仗着自己是数学系，没有多刷题，于是考场上就麻爪了。结果就是，数学系带给我的优势，只在唯一的一道证明题上体现了出来——那道题基本属于数分期末考试最前面的送分题水平。但这点优势又被没刷题导致的劣势拉回去了（悲）。与前两科不同的是，我考完出来时在社交媒体上看到的却是「这次数学一挺简单的」，吐槽难度的没多少，让我汗流浃背了。</p><p>最后是专业课。直到 12 月 8日，离考试还有两周的时候，我打算做点自命题考试的往年真题，才发现西交的自命题考的和408 统考并不完全相同，于是紧急开始用西交的教材复习，以及写课后题。</p><p>从考试体感来看，这最后一门自命题专业课，反倒是最简单、最眉清目秀的。基本全考的常规题，即便有些东西记得不清也能瞎扯上几句相关的蹭点分。</p><p>对于上岸，估计是没啥指望了，数学给我拉下来了太多的分数。目前预估分数是政治60 + 英语 70 + 数学 90 + 专业课 110，总计 330 分，而西交去年的复试线是350 分，即使算上今年考研政治英语难度增加，分数线也大概在 340上下，所以基本是没啥希望了，属于是这种吊儿郎当的学习态度应得的结果。</p><h2 id="喝水">喝水</h2><p>不知各位平时喜欢喝什么水呢？我个人最喜欢喝的是怡宝的纯净水。虽然网上不少认为各种水并没有多少区别，但就我个人体验来说，不同品种的水口感是相当不同的：纯净水是口感最好的，入口清冽甘甜，喝完不会有多余的味道停留在口中；矿泉水入口亦有微甘，但稍稍有些发涩，喝完后喉头回苦，不宜多喝；自来水烧的白开水当属口感最差的，入口苦涩，难以下咽，喝完舌根与喉咙都是苦的。</p><p>水的温度也会影响口感。冰水和热水都会掩盖住口感差异，常温的冷水口感差异则会非常显著。所以只有白开水可喝时，我通常会喝50℃左右的热水，否则根本喝不下去。做成饮品也不失为一种掩盖异味的选择，或是泡茶，或是煮咖啡，或是加些蜂蜜，总之都能让水变得可以入口。</p><p>11月底的时候，我在网上图便宜买了 4 桶 5L装的怡宝饮用水，但入口时才发现这个「饮用水」并非纯净水，入口一股涩味，大概是用的天然水。但买都买了，这种东西又不好退货，而且天然水的涩味也不算很难入口，于是也就这样喝着了。</p><h2 id="写作工作流优化">写作工作流优化</h2><p>本节还可以叫作「Hello, Syncthing」。</p><p>这个月剩下的一点空闲时间里，我将编写文章的工作流进行了一些优化。最开始，我写文章全程都在VSCode内部进行。但很快我就发现了一个问题：坐在电脑前得来的灵感并不多，而灵感转瞬即逝，需要尽快记录下来，于是我开始研究如何多端同步编辑文章。此前，我是通过Gitea 的在线编辑功能（小屋的源码托管在自建 Gitea 上）与安卓端的Obsidian，使用手动复制的方式来多端同步编写文章。但这样做既不优雅，还有个问题：我必须在切换设备前提交文章更新并上传，这实在是太麻烦了。所以我开始研究一个更优雅的工作流。</p><p>最近，由于对多端同步本地音乐库有了需求，我找到了 Syncthing用于同步手机与 PC 上的音乐库。利用手上的香港 VPS搭了一个发现服务器和中继服务器后，实现了音乐库的同步。在此之后，文档的同步自然也提上了日程。正好Syncthing 可以自定义同步文件夹存储位置，而 Obsidian也可以自定义存储库位置，一个同步工作流就此建成，终于不用每次换设备就commit，污染 git 记录了。目前用起来感觉还算不错，虽然 Syncthing的同步速度有点堪忧，例如对于上面提到的音乐库的同步来说，半天都同步不了几首歌，但胜在不需要额外关注，等哪天想在电脑上听歌的时候，音乐库就已经同步完成了。</p><h2 id="hello-wsl2">Hello, WSL2</h2><p>毕业论文需要使用到深度学习，需要使用 PyTorch，但是 Python的环境管理又是个老大难的问题。为了不被虚拟环境和包管理气晕，再加上导师此前没做过深度学习方向，想让我留下一份论文学习开发笔记，方便未来他让其他人跟着我的经验来做这方向的项目，我决定直接使用Docker 来开发，节省包管理的时间，也方便多系统移植环境。需要用Docker，自然就得请出<del>最好的 Linux 发行版</del> WSL2 了。</p><p>在此之前，我虽然已经装了 WSL2，但也只是出于折腾工具的心理，配置了一下zsh就放着吃灰了。不幸的是，当时折腾的时候还没建博客，没想着留笔记，现在只剩下一份看不懂的.zshrc 了，动不了一点配置。由于看不懂之前折腾的 .zshrc配置，我选择换一个轻松，不用花过多精力配置的 Shell来进行开发——Fish。Fish 的优势就是自带代码补全、高亮、提示等 zsh需要花时间配置的功能（oh-my-zsh配置起来很快，但性能堪忧，我自己花时间配置的性能高的 zsh又没留笔记），且有可视化的配置网页，但缺点就是和 bash、zsh不兼容，不能直接运行一些 shell 脚本。</p><h2 id="hello-starship">Hello, Starship</h2><p><a href="https://starship.rs/" rel="external nofollow noreferrer">Starship</a> 是一个 rust编写的轻量、迅速、客制化的终端美化软件，Windows/Linux/macOS三端适配，bash/zsh/cmd/fish/posh等等终端均可使用，是美化中的强者。多系统、多 Shell通用的好处就是高一致性，不同系统上的不同 Shell可以使用同一个配置文件，比如我在 WSL 中同时安装了省心的 fish和通用兼容的 zsh，加上自带的 bash，三个 Shell 外加 Windows 里的PowerShell，都可以使用同一套配置文件（PowerShell 需要复制一份配置文件到Windows 文件系统里），达成外观上的一致性。</p><h2 id="hello-floorp">Hello, Floorp</h2><p>在 B 站上看 Firefox 相关优化视频的时候，偶然看到了 Floorp 这个基于Firefox的浏览器，外观美观，自带功能丰富，适合我这种不想花太多时间折腾浏览器的懒人。缺点大概就是魔改的东西比较多，内核更新速度会比较慢。</p><p>这段时间使用下来，个人觉得比较好用的几个功能：折叠侧边标签页可以方便地同时浏览更多网页；保存侧边栏网页应用可以在浏览网页的时候快速打开OpenWebUI 来调用本地 Ollama 模型聊天；内置了一些方便的修改，就不用去翻Firefox 的 config 页面了。</p>]]></content:encoded>
      
      
      <category domain="https://blog.hpcesia.com/categories/%E7%94%9F%E6%B4%BB%E7%82%B9%E6%BB%B4/">生活点滴</category>
      
      
      <category domain="https://blog.hpcesia.com/tags/%E5%91%A8-%E6%9C%88%E8%AE%B0/">周/月记</category>
      
      
      <comments>https://blog.hpcesia.com/posts/75352449/#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>周寄（三）| 又是一篇无聊的碎碎念</title>
      <link>https://blog.hpcesia.com/posts/aa60fb25/</link>
      <guid>https://blog.hpcesia.com/posts/aa60fb25/</guid>
      <pubDate>Wed, 27 Nov 2024 10:55:03 GMT</pubDate>
      
      <description>写博客无聊吗？或许吧。但我愿意，这就够了。</description>
      
      
      
      <content:encoded><![CDATA[<p>本次周记记录时间为：11.18 - 11.24</p><h2 id="碎碎念">碎碎念</h2><p>本次周记其实本来打算鸽了的，因为确实没多少好写的东西，而且离考研只剩一个月了，也完全抽不出多少时间来写东西，最近的文章基本都是存稿补全<del>（是的，那篇塞尔维亚的旅游回忆已经在草稿箱里待了三个月了）</del>。不过休息时间看了点东西，总算是有的写了，于是这篇周记还是发了出来<del>（不鸽掉原先说好要鸽的文章，这何尝不是一种鸽）</del>。下个月的周记大概率是直接鸽了，真没时间了，估计会等到12 月月底写个月记。</p><p>有时挺羡慕<ahref="https://www.yoghurtlee.com/">小氯</a>的，每周周报都能写五六千字，或许是我自己阅读量确实太少了？大学以来，没再读过严肃文学了，只读网络小说。等考研与毕业论文结束后，兴许应该读点书了，哲学也好历史也好，总之多吸收点东西，才不至于写周记时无话可讲，写旅游回忆时只有流水账。虽然目前小屋的文章多是技术类，可技术类虽然文笔重要性不高，但需要有大量干货才能动笔，而获取干货并不比读书简单。</p><p>目前暂定后续会读的大概是各地神话故事与一些哲学书籍。其实感觉这个想读的书的取向属于是玩游戏玩的，在玩的游戏都有些剧情在探讨一些哲学，虽然B站上也有剧情解析，但只看别人的观点总归不是啥好事，需要自己得出观点，才不至于别人说啥我信啥。</p><h2 id="最近喜欢的小说">最近喜欢的小说</h2><p>既然谈到读书，虽然正经书没啥可分享的，但也可以在此处推荐几本比较喜欢的网络小说：</p><ul><li>《<ahref="https://www.qidian.com/book/1036504904/">谁让他修仙的！</a>》：轻松搞笑的修仙爽文。作者喜欢写反套路的搞笑桥段，相当欢乐。但作者似乎不善感情描写，上本小说写到最后好几个暧昧对象，但却无女主；这本小说暧昧对象虽然也多，至少还有两个比较明显的女主，希望感情线写到后面不会太拉胯。</li><li>《<ahref="https://www.qidian.com/book/1039807042/">万历明君</a>》：明末历史小说，非爽文。主角是白手起家的高官魂穿幼年万历，政治斗争和谋略写得很精彩。作者古文功底也相当精悍<del>（就是读者看大量文言文会有点费劲）</del>，至少写得出举人级别的古文水平。</li><li>《<ahref="https://www.qidian.com/book/1037095853/">牧者密续</a>》：琥珀流奇幻小说，偏二次元风格。智斗谋略为主，主角的性格成长刻画得很好。感情线也写得不错，就是中期会有点作者个人二次元XP 问题，但合我 XP 所以还是极力推荐。</li></ul><h2 id="保温杯">保温杯</h2><p>我大学三年下来，换过 4 个保温杯。第一个是从高中带过来的 1.2L容量大杯子，用起来还算不错，但有一个问题：太大了，我新背包的侧兜完全装不下。</p><p>为此，我在淘宝上买了个 450mL容量、方便携带的黑色保温杯，用来日常喝水。买来后的前几个月，这个新的保温杯用起来还是不错的；但是没过多久，保温杯外侧就开始掉漆了，一片片的黑色涂层脱落，经常附在杯口，实在膈应，只能丢掉，改为复用喝剩的饮料瓶子装水喝。</p><p>过了一段时间，我在逛淘宝时发现哈尔斯的翻盖款智能保温杯叠劵后价格还算不错，和华为智慧生活连接的喝水量统计功能看起来也挺新奇，果断买下。但买来后饮水量统计和杯中水温的功能基本没用到过，反而充电是个麻烦。这个保温杯用到刚过保没多久时，水杯翻盖的锁舌就突然断裂，很难让人不怀疑是计划报废。锁舌断裂，水杯就合不上盖了，自然只能丢了。</p><p>至于最后一个水杯，也是我现在用的水杯，在购买它时我吸取了前几个水杯的教训，选择了一个金属原色（不会掉漆）的旋盖（没有锁舌断裂风险）普通（没有用不上的智能）水杯。使用到现在，确实没有掉漆的问题，但旋盖与杯口的摩擦导致杯口有些诡异的黑色物质，也不知是因为杯盖质量不行、没有使用好的不锈钢导致的，还是摩擦刮下来的金属碎屑。看来再下一个保温杯，得选择塑料盖子的才行。</p><h2 id="无聊的博客">无聊的博客</h2><p>想了一下，还是把这一节调整到了最后。</p><p>最近读到了<a href="https://onojyun.com/" rel="external nofollow noreferrer">莫比乌斯</a>的《<ahref="https://onojyun.com/2024/11/22/%E6%97%A0%E8%81%8A%E7%9A%84%E4%B8%AD%E6%96%87%E5%8D%9A%E5%AE%A2%E5%9C%88/">无聊的中文博客圈</a>》。莫比乌斯写在他的博客内的不少观点我无法苟同，但这篇文章多多少少让我有些思考。</p><hr /><blockquote><p>挺无聊的。</p></blockquote><p>中文博客圈里多是技术类博客，而技术这东西是很无聊的——在你用不上的时候。譬如我博客里的几篇数学相关的文章，相信大多数来到我博客并看到这段文字的人都不会有细看那几篇文章的想法。技术类的文章水字数简单，但没人看，因为「挺无聊的」。</p><p>不过我还是会写技术类文章——但仅当这篇文章拥有充分的独创性。一篇东拼西凑整合教程的文章有多少用处呢？想必能从搜索引擎里看到这种「缝合怪」文章的人，也有能力自己找到哪些被引用的文章吧。</p><p>写完上面一段后，我审视了一下小屋里已有的文章，看到了不少毫无独创性的「缝合怪」。譬如，还是上面说的那几篇数学文章，除去第一篇有限差分的文章，里面的证明均由我自己推导外，其余几篇多复变函数论「笔记」，其本质就是把老师给的PPT 又抄了一遍，除去自我感动外，毫无用处。</p><p>不过这些文章还是会先留着，等未来切换到Astro（目前已有计划，但碍于空闲时间极少，无力实施）后会精简一次博客文章，届时再丢掉这些文章，连同那时的整个Hexo 博客一起保留在一个存档站点中。</p><hr /><blockquote><p>独立博客的「人设」功能，迫使它需要按照某种「姿态」去表达自我。</p></blockquote><p>网上冲浪，谁还没个人设啊。在这个小屋，我是一个普通的二次元「萌萌人」，会多给点情绪价值，大伙一起和和气气交流<del>（虽然实际上没几个人）</del>。在别的地方，我也可以是别的人设，和和气气的地方我也和和气气，戾气较重的地方，我也多少带点戾气。即便在现实中，我又何尝不是带着面具说话呢？</p><p>更何况小屋作为一个可公开浏览的地方，我并不愿意在这里写一些牵扯隐私的东西。对于一个在互联网暗区混过一段时间，现在时不时看一眼暗区边缘的我来说，被「开盒」是一个切实存在的风险。虽然对于有社工库的人来说，我在小屋里写不写这些牵扯隐私的东西并无区别——因为我全网同ID。但通过搜索引擎获取公开信息进行推理的开盒方式还是要预防一下的。</p><p>我也不愿在这里写太多敏感话题。一方面是上面说的锁定现实身份问题，既然公开信息都有可能锁定我了，那么网安要锁定我本人就更简单了；另一方面是我也自认为阅历和文笔还不足以在这些敏感话题上写出言之有物的文章。但莫比乌斯的一些敏感话题相关文章也提醒我了，既然我压根不打算备案，又何必费尽心思去严格地自我审查呢？写<a href="/posts/45a2901b/" title="周寄（二）">上次周记</a>中「BitWarden客户端这种需求量不大的开源软件，短时间内肯定没人移植到鸿蒙，不像 Clash这种刚需级软件，早早地就有人移植到鸿蒙 Next 上。」这段话时，我考虑过将Clash 更换为 Clxxh以规避审查，现在想来多少是有些搞笑了。在社交平台上要自我审查严防违规，到了不备案的独立博客上还得自我审查严防违规，那我这博客不就白搭了吗？</p><p>当然，这不是说我真就完全不自我审查想说啥说啥了，虽然没啥人看，但是我还是要给国内用户提供一个较好的浏览速度的。因此我会保持自我审查与评论审查的限度，保证小屋不会被GFW 掉即可。</p><hr /><blockquote><p>不需要为写博客这个行为找一个合理正当的理由，喜欢写博客就像不喜欢吃香菜一样，天生的。</p></blockquote><p>上面这句引用自那篇文章的一个<ahref="https://onojyun.com/2024/11/22/%e6%97%a0%e8%81%8a%e7%9a%84%e4%b8%ad%e6%96%87%e5%8d%9a%e5%ae%a2%e5%9c%88/comment-page-1/#comment-3986">匿名评论</a>。这句话说得难听且粗俗点，就是最近网上较为流行的一个对话模板：</p><blockquote><p>「我埃及吧写博客就写博客。」</p><p>「太好了是法老，我们有救了！」</p></blockquote>]]></content:encoded>
      
      
      <category domain="https://blog.hpcesia.com/categories/%E7%94%9F%E6%B4%BB%E7%82%B9%E6%BB%B4/">生活点滴</category>
      
      
      <category domain="https://blog.hpcesia.com/tags/%E5%91%A8-%E6%9C%88%E8%AE%B0/">周/月记</category>
      
      
      <comments>https://blog.hpcesia.com/posts/aa60fb25/#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>塞尔维亚旅游回忆 - 上篇 - Day 1-3</title>
      <link>https://blog.hpcesia.com/posts/841b8c27/</link>
      <guid>https://blog.hpcesia.com/posts/841b8c27/</guid>
      <pubDate>Sat, 23 Nov 2024 15:28:47 GMT</pubDate>
      
      <description>记录 2024 春节进行的为期 7 天的塞尔维亚旅行。由于篇幅过多，分为三篇进行发布，此为上篇。本篇主要记录在塞尔维亚与波黑交界处附近的旅行。</description>
      
      
      
      <content:encoded><![CDATA[<div class="note info no-icon modern"><p>本次旅游时间：2024 年 2 月 13 日 - 2024 年 2 月 21日（北京时间）。</p></div><h2 id="day1---启程">Day1 - 启程</h2><p>Day1 路线：重庆 → 卡塔尔 → 贝尔格莱德 → 兹拉蒂博尔</p><p>一整天都基本在赶路，不是在飞机上就是在汽车上。</p><h3 id="重庆-卡塔尔">重庆 → 卡塔尔</h3><p>这次旅游是我爸拉着我去的，我们在卡塔尔航空上买了两张往返塞尔维亚的经济舱机票。由于重庆无直达航线，需经卡塔尔中转（理论上去北京中转也行，但是好像一周就一次航班），购买的是凌晨起飞，上午（当地时间）到达的机票。</p><figure><img src= "" data-lazy-src="https://bu.dusays.com/2024/10/28/671f2b03450d2.webp"alt="航班信息" /><figcaption aria-hidden="true">航班信息</figcaption></figure><p>2 月 12 日晚上 22点整，我们到达了江北机场的国际候机室，等待登机。由于候机室的饮料实在太贵<del>（一罐可乐45块，你怎么不去抢啊）</del>，我爸又爱喝饮料，于是用了他的信用卡权益换了两个贵宾休息室的位置爽喝饮料爽恰零食。</p><p>2 月 13 日凌晨 0 点 15分，我们于江北机场坐上了前往卡塔尔的飞机。因为是春节期间，起飞后空姐给每个人都塞了个小红包，里面是两个金币巧克力：</p><p><img src= "" data-lazy-src="https://bu.dusays.com/2024/10/28/671f2af83071f.webp"alt="飞机上的小红包" /> <imgsrc="https://bu.dusays.com/2024/10/28/671f2af952ea8.webp"alt="金币巧克力" /></p><p>经济舱的环境实在是难受，整整 10小时的飞行时间完全睡不着一点（悲）。而且我坐在靠窗位置，导致想去上厕所得先把我爸喊醒，就更麻烦了。</p><h3 id="卡塔尔-贝尔格莱德">卡塔尔 → 贝尔格莱德</h3><p>经过 10小时的经济舱折磨，我们终于到达了中东土豪卡塔尔的多哈机场。整个候机楼到处都是奢侈品免税店，比迪拜的机场还让人眼花缭乱。</p><p><img src= "" data-lazy-src="https://bu.dusays.com/2024/10/28/671f2afe9b614.webp"alt="卡塔尔多哈机场候机楼" /> <imgsrc="https://bu.dusays.com/2024/10/28/671f2b0cd9a61.webp"alt="免税店里摆豪车" /></p><p>在候机楼煎熬等待了两个小时一行，我们总算是坐上了前往贝尔格莱德的飞机。</p><figure><img src= "" data-lazy-src="https://bu.dusays.com/2024/10/28/671f2b0da864c.webp"alt="航班信息" /><figcaption aria-hidden="true">航班信息</figcaption></figure><h3 id="贝尔格莱德-兹拉蒂博尔">贝尔格莱德 → 兹拉蒂博尔</h3><h4 id="中午">中午</h4><p>经过 5 小时的旅程，我们总算是到达了塞尔维亚境内。</p><figure><img src= "" data-lazy-src="https://bu.dusays.com/2024/10/28/671f2b027933f.webp"alt="贝尔格莱德机场" /><figcaption aria-hidden="true">贝尔格莱德机场</figcaption></figure><p>刚出机场，我就注意到了机场顶部的大字「BELGRADE AIRPORT NIKOLATESLA」：</p><figure><img src= "" data-lazy-src="https://bu.dusays.com/2024/10/28/671f2b0e9402a.webp"alt="特斯拉机场" /><figcaption aria-hidden="true">特斯拉机场</figcaption></figure><p>这时候我才知道原来特斯拉是塞尔维亚裔人😂。</p><p>离开机场后，我跟着我爸在附近的租车点，提走了提前预订的车，开始塞尔维亚自驾游。不幸的是，我放假时忘记带驾照回家，因此只有拥有国际驾照的我爸能开车，我只能待在副驾驶位聊天、拍照和玩手机。</p><p>贝尔格莱德机场附近全是农村小房子，最显眼的大概是成片打着中文标牌的赌场。不过我对赌博不感兴趣，我爸则锐评：真想玩赌博，这地方太掉价了，不如去澳门或者拉斯维加斯。刚进入贝尔格莱德市区，我看到的是成片的老旧居民楼：</p><figure><img src= "" data-lazy-src="https://bu.dusays.com/2024/10/28/671f2b0fbab06.webp"alt="老小区" /><figcaption aria-hidden="true">老小区</figcaption></figure><p>说实话，和国内三四线小城里的小区给我的感觉差不多。掉色的外墙看着颇为破旧。正好已是当地时间中午，我们找了个居民楼楼下的比萨店，照着菜单上的图片点了一份看着还行的比萨作为午饭。</p><figure><img src= "" data-lazy-src="https://bu.dusays.com/2024/10/28/671f2af1795ff.webp"alt="午餐" /><figcaption aria-hidden="true">午餐</figcaption></figure><h4 id="下午">下午</h4><p>吃过午饭，便该离开贝尔格莱德市区，一路向西南出发前往兹拉蒂博尔。一路上风景都还不错，也遇到了不少欧洲特色建筑（教堂和城堡）。</p><details><summary>多图折叠</summary><p><img src= "" data-lazy-src="https://bu.dusays.com/2024/10/28/671f2b097274a.webp"alt="不知名教堂" /> <imgsrc="https://bu.dusays.com/2024/10/28/671f2b10c5b81.webp"alt="不知名城堡" /> <imgsrc="https://bu.dusays.com/2024/10/28/671f2b05cd936.webp"alt="路上风景" /></p></details><p>到达兹拉蒂博尔后，我们在预定好的民宿处安顿下来，然后出去觅食。</p><figure><img src= "" data-lazy-src="https://bu.dusays.com/2024/10/28/671f2b0a8f7b2.webp"alt="民宿一角" /><figcaption aria-hidden="true">民宿一角</figcaption></figure><figure><img src= "" data-lazy-src="https://bu.dusays.com/2024/10/28/671f2af6eaafd.webp"alt="晚餐" /><figcaption aria-hidden="true">晚餐</figcaption></figure><p>晚上散步的时候看到了一个军官的雕像，上面写着「КАЈМАКЧАЛАН АРМИЈСКИЂЕНЕРАЛ КРСТА СМИЉАНИЋ 1868·1944」。</p><figure><img src= "" data-lazy-src="https://bu.dusays.com/2024/10/28/671f2af47b414.webp"alt="纪念当地陆军将领的雕像" /><figcaption aria-hidden="true">纪念当地陆军将领的雕像</figcaption></figure><details><summary>关于这个将领的信息</summary><p>写这个博客的时候查了下维基，原来是南斯拉夫在一战时期的的陆军将军，名字可以翻译为「克尔斯塔·斯米尔贾尼奇」，照片长这样：</p><figure><img src= "" data-lazy-src="https://bu.dusays.com/2024/10/28/671f2b0442826.webp"alt="克尔斯塔·斯米尔贾尼奇照片" /><figcaption aria-hidden="true">克尔斯塔·斯米尔贾尼奇照片</figcaption></figure><p>这个雕像是为了纪念这个将军在凯马克查伦（Kaymakchalan 或Кајмакчалана）战役上带领德里纳（Drina 或 Дринска）师的成就而设立的。</p></details><p>散完步，买了点饮料和零食，我们就回到民宿，准备第二天的旅程。</p><h2 id="day2---索道与雪山">Day2 - 索道与雪山</h2><h3 id="上午">上午</h3><p>一大早，我们就起床出发，徒步前往不远处的兹拉蒂博尔缆车的出发点。一路上有不少售卖当地特产的商店，如果忽略掉招牌上的西里尔字母，似乎与国内一些古镇并无多少区别。</p><figure><img src= "" data-lazy-src="https://bu.dusays.com/2024/11/08/672dbd310976c.webp"alt="卖腌制肉品的店" /><figcaption aria-hidden="true">卖腌制肉品的店</figcaption></figure><p>兹拉蒂博尔拥有目前世界最长的空中索道缆车，全长 9公里，将兹拉蒂博尔城与 Tornik山峰相连，一路上的风景基本都是草原与牧场。票价已经忘记是多少了，当时也没拍照片，但是印象里不算贵。包车会更贵一点，但是我们起得够早，此时缆车的出发点并没有人在排队，所以我们只需要正常购票就能事实上地达成包厢的目的。事实证明开头那段旅游景点介绍是真实的，路上的风景是相当美丽，一路上只会疯狂拍照了：</p><details><summary>多图折叠</summary><p><img src= "" data-lazy-src="https://bu.dusays.com/2024/11/08/672dbd297f292.webp"alt="索道途中的草原" /> <imgsrc="https://bu.dusays.com/2024/11/08/672dc010071ec.webp"alt="湖边风景" /> <imgsrc="https://bu.dusays.com/2024/10/28/671f2b3fcd348.webp"alt="索道途中的湖" /> <imgsrc="https://bu.dusays.com/2024/11/08/672dc03a8c8b2.webp"alt="山脚风景" /> <imgsrc="https://bu.dusays.com/2024/11/08/672dc03867e76.webp"alt="山上的滑雪道" /></p></details><p>美妙的时光总算过得很快，一转眼，缆车就到达了此行的终点：山顶。对于常年居住在南方的我来说，雪景确实是个稀罕玩意儿，基本只有出去旅游才见得到。就是山上的温度实在是有点冷了，我在准备行李的时候不知道要到雪山上，只准备了适合山脚下温度的衣服，到了山上只能瑟瑟发抖（悲）。</p><details><summary>多图折叠</summary><p><img src= "" data-lazy-src="https://bu.dusays.com/2024/11/08/672dbd2b07f90.webp"alt="山顶风光" /> <imgsrc="https://bu.dusays.com/2024/11/08/672dc36a83976.webp"alt="山顶风光" /> <imgsrc="https://bu.dusays.com/2024/11/23/674162710fa5f.webp"alt="山顶风光" /> <imgsrc="https://bu.dusays.com/2024/11/08/672dc36d46e6c.webp"alt="山顶风光" /></p></details><p>这座山也是一个滑雪的好去处，除去我们所坐的观光缆车外，还有一个专为滑雪者提供服务的缆车，可以穿着滑雪板直达山顶，源源不断地有滑雪者坐着缆车到达山顶，然后沿着滑雪道飞驰。</p><figure><img src= "" data-lazy-src="https://bu.dusays.com/2024/10/28/671f2b77efea7.webp"alt="滑雪者" /><figcaption aria-hidden="true">滑雪者</figcaption></figure><p>由于我实在是扛不住山上的气温，只在山顶待了不到一个小时，我们便乘坐缆车回到了山下。回到山下的时候虽然才当地时间十点，但因为出门时没吃早饭，我和我爸都已经有些饿了，于是我们找了个路边的店，一人买了一个欧洲版肉夹馍作为今天的午餐。</p><figure><img src= "" data-lazy-src="https://bu.dusays.com/2024/10/28/671f2b762df34.webp"alt="午餐" /><figcaption aria-hidden="true">午餐</figcaption></figure><h3 id="中午-1">中午</h3><p>边走边吃地吃完了午饭后，我们决定先好好逛一下这个镇子，毕竟昨晚虽然也散步走了一小圈，但天色太黑看不真切。</p><figure><img src= "" data-lazy-src="https://bu.dusays.com/2024/11/08/672dc5cd7f08a.webp"alt="镇上风光" /><figcaption aria-hidden="true">镇上风光</figcaption></figure><p>镇上大部分其实只是看个新鲜，也就是常规的欧洲民居罢了，唯一值得放在文章里的是一个小教堂。教堂虽小，里面的装饰却不含糊，金碧辉煌<del>（虽然见识过阿联酋的宫殿后已经不稀奇了）</del>。说实话，我对这些教堂并不怎么感兴趣，尤其是这种小的，只是随便拍了几张照片。我爸倒是对此相当感兴趣，各种角度拍了半天。</p><details><summary>多图折叠</summary><p><img src= "" data-lazy-src="https://bu.dusays.com/2024/11/08/672dc5d1ccd79.webp"alt="教堂一侧" /> <imgsrc="https://bu.dusays.com/2024/11/08/672dc5dbbd8f4.webp"alt="教堂正门" /> <imgsrc="https://bu.dusays.com/2024/11/08/672dc5c9ebd17.webp"alt="教堂内部" /></p></details><h3 id="下午-1">下午</h3><p>下午，依旧是我爸开车，去参观一个非常偏僻的教堂。一路基本都是乡间小路，虽然我爸几十年老司机技艺娴熟，但还是让我有些担心我们租的这辆奥迪轿车能否撑得住路上的颠簸。</p><p><img src= "" data-lazy-src="https://bu.dusays.com/2024/11/23/67416148ce238.webp"alt="不知名教堂" /> <imgsrc="https://bu.dusays.com/2024/10/28/671f2b82e130b.webp"alt="不知名教堂" /></p><p>结果到了教堂，我们才发现今天教堂关门了，于是只能在外面拍几张照作罢。</p><p>回民宿的路上，我爸突然发现有一条支路可以开到早上坐缆车到的山顶上，而我们租的这辆车的轮胎和性能都足够在较浅的雪地里行驶，因此我们又开着车前往山顶。</p><figure><img src= "" data-lazy-src="https://bu.dusays.com/2024/11/23/67416096e30c9.webp"alt="上山路上" /><figcaption aria-hidden="true">上山路上</figcaption></figure><p>此时的山顶，在下午的阳光照耀下，雪相比早上少了不少，露出了下面的土地。气温也暖和了不少，至少不用在寒风中瑟瑟发抖了。</p><figure><img src= "" data-lazy-src="https://bu.dusays.com/2024/11/23/6741609a50574.webp"alt="下午的山顶风光" /><figcaption aria-hidden="true">下午的山顶风光</figcaption></figure><p>在山顶又拍了些照，我们便返回了民宿，买了些零食和饮料，为第三天的旅程做准备。</p><figure><img src= "" data-lazy-src="https://bu.dusays.com/2024/11/23/6741ef5461d15.webp"alt="杂货店" /><figcaption aria-hidden="true">杂货店</figcaption></figure><h2 id="day3---古桥">Day3 - 古桥</h2><h3 id="上午-1">上午</h3><p>一大早，我们便收拾好东西，退掉民宿，驱车前往波黑的莫斯塔尔。路上倒是没多少好说的，唯一值得一提的是手机信号。在塞尔维亚境内，一路上基本都是4G 信号，至少是可以正常水群聊天的。但一到波黑境内，手机信号立马降到2G，时不时会直接无信号。由于没料想到手机信号会那么差，我手机上没有多少适合消磨时间的东西，只能玩玩数独解闷。</p><p>我们一直开到一个服务区才有手机信号，这时候也差不多该吃饭了。</p><figure><img src= "" data-lazy-src="https://bu.dusays.com/2024/10/28/671f2b7a2927e.webp"alt="服务区的午餐" /><figcaption aria-hidden="true">服务区的午餐</figcaption></figure><p>但服务区的手机信号仍然值得吐槽：只有在外面信号才是能正常使用的，餐厅里面只有2G信号，相当难绷了。而我爸又要到餐厅外面抽烟，我只能待在餐厅里面空欢喜一场。</p><h3 id="下午-2">下午</h3><p>一路奔波到了莫斯塔尔，我们入住了一个离莫斯塔尔古桥不远的民宿，稍微休整了一下，便步行出来前往古桥。</p><p>在民宿门口，正对着的是一个教堂。这个教堂比昨天小镇上的教堂要大上少许，放了一大排椅子，更符合我心中对教堂的印象。</p><p><img src= "" data-lazy-src="https://bu.dusays.com/2024/10/28/671f2b853abf5.webp"alt="民宿门口的教堂" /> <imgsrc="https://bu.dusays.com/2024/10/28/671f2b9091a93.webp"alt="教堂内部" /></p><p>在教堂里拍了些照，我们便继续前往古桥。古桥位于莫斯塔尔老城当中，不过我更愿意称之为古镇，毕竟老城城区大小也就一个镇子左右，城里都是些狭窄的石子路，若是将石子换成青石板，白墙黑瓦换成木柱青瓦，倒是与国内古镇别无二致。</p><figure><img src= "" data-lazy-src="https://bu.dusays.com/2024/11/23/6741ef4cda505.webp"alt="老城小道" /><figcaption aria-hidden="true">老城小道</figcaption></figure><p>穿过一小段老城的道路，便是著名的莫斯塔尔古桥。说是古桥，其实这桥修成也才20 年。1993 年，原先的古桥在波黑战争中被炸毁，直到 8年后才重建，虽然新桥仿照原先古桥的样式修建，使用的材料大部分是被炸毁的古桥的石料，但确确实实是一座新桥了，只是在文化上仍是一座古桥。</p><figure><img src= "" data-lazy-src="https://bu.dusays.com/2024/11/23/6741ef5100b3b.webp"alt="古桥一侧岸边" /><figcaption aria-hidden="true">古桥一侧岸边</figcaption></figure><p>桥上游客不少，能听到一些中文的交流声音，毕竟古桥是世界文化遗产，有我们之外的国人来此地一游也不奇怪。桥的两侧设有高高的铁栏杆，以防游客不慎跌落。据说几年前，这个桥上是没有额外布设铁栏杆的，兴许是近几年出现了一些游客跌落事件，这才加装了更高的栏杆吧。在古桥上可以拍到两侧的风景，远处还有一座更现代的桥，那也是我们来时驱车经过的桥梁。在晚上，古桥还会在两侧打上灯光，照亮桥拱。</p><p><img src= "" data-lazy-src="https://bu.dusays.com/2024/10/28/671f2b88b24b7.webp"alt="古桥两侧风景" /> <imgsrc="https://bu.dusays.com/2024/10/28/671f2b8d76941.webp"alt="晚上的古桥" /></p><p>在老城里逛了一圈，人乏马困，于是便在回民宿的路上找了一家餐厅用餐。今天的晚餐是烤肉大餐，算是我这个肉食爱好者的福音了。</p><figure><img src= "" data-lazy-src="https://bu.dusays.com/2024/10/28/671f2b7d6d711.webp"alt="老城晚餐" /><figcaption aria-hidden="true">老城晚餐</figcaption></figure><p>吃饱喝足，下楼时偶遇从北京过来旅游的一家三口，难得有缘遇见同胞，相互聊了五六分钟，便回了民宿休息，备战第四天的旅程了。</p><div class="note info no-icon modern"><p>中篇和下篇还处于只有图片占坑的草稿状态，等以后有时间会写完发出来的<del>（在写了在写了）</del>。</p></div>]]></content:encoded>
      
      
      <category domain="https://blog.hpcesia.com/categories/%E6%97%85%E8%A1%8C%E5%9B%9E%E5%BF%86/">旅行回忆</category>
      
      
      <category domain="https://blog.hpcesia.com/tags/%E5%A1%9E%E5%B0%94%E7%BB%B4%E4%BA%9A/">塞尔维亚</category>
      
      <category domain="https://blog.hpcesia.com/tags/%E6%AC%A7%E6%B4%B2/">欧洲</category>
      
      
      <comments>https://blog.hpcesia.com/posts/841b8c27/#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>周寄（二）</title>
      <link>https://blog.hpcesia.com/posts/45a2901b/</link>
      <guid>https://blog.hpcesia.com/posts/45a2901b/</guid>
      <pubDate>Sun, 17 Nov 2024 11:22:17 GMT</pubDate>
      
      <description>一些闲聊与思考</description>
      
      
      
      <content:encoded><![CDATA[<p>这次周记其实主要都是些闲聊，一周的时间里，想到什么就在写什么，最后再整理一下，兴许这才是周记的正确打开方式？但想不出一个好名字用来总结了，想到了再说，现在先用着没名字的标题吧。本次周记记录时间为：11.09- 11.17。</p><h2 id="体测">体测</h2><p>这周的体测是霉好的一千米跑和坐位体前屈，而我这学期就跑过三四次长跑，体能下降严重。再加上经常熬夜，结果就是，我成功打破了我大学以来的一千米跑最差记录，用时五分零二秒，妥妥的不及格（悲）。</p><h2 id="第一台-vps">第一台 VPS</h2><p>这周，我拿下了年轻人的第一台 VPS，买的是香港 2H2G 的轻量云，首年110，价格还算能接受<del>（两张大月卡的钱）</del>。我馋 VPS也有段时间了，主要是馋密码管理，也就是 <ahref="https://github.com/dani-garcia/vaultwarden">VaultWarden</a>。</p><p>火狐的密码管理其实用起来也还行，毕竟我现在用的不能网页登录的软件，基本都是用密码登录也要再输一遍手机验证码的。国内厂商的软件大都这样，123456和 20位的大小写字母数字符号混合密码没有本质区别，因为最后都要发一遍手机验证码。但是密码存火狐那里总归不是个事，还是存自己手上舒服。</p><p>VPS 还部署了一些其他东西，截止本文发布时，除去上文提到的VaultWarden，我在 VPS 上还部署了 <ahref="https://github.com/louislam/uptime-kuma">UptimeKuma</a>（部署的网站状态监测，未来可能也会给友链做一下监测）、<ahref="https://github.com/usememos/memos">Memos</a>说说（用于替换我博客原来使用的静态说说）、<ahref="https://github.com/go-gitea/gitea">Gitea</a>（用于存储博客源码与持续部署，不用受制于GitHub Action 的免费额度）、<ahref="https://github.com/AlistGo/alist">Alist</a>（统一各个网盘，得益于服务器位置，可以直接访问谷歌云盘）、<ahref="https://github.com/searxng/searxng">SearXNG</a>（搜索引擎聚合，同样得益于服务器位置，可以直接用谷歌搜索）、<ahref="https://github.com/FreshRSS">FreshRSS</a>，还有个 <ahref="https://github.com/gethomepage/homepage/">Homepage</a>（个人导航页）。虽然部署了不少东西，不过目前服务器内存只占用了55%，CPU 更是占用不超过20%，所以还可以再部署点别的东西，如果有好用的项目欢迎各位在评论区推荐一下。</p><figure><img src= "" data-lazy-src="https://bu.dusays.com/2024/11/15/67375a70a0fd3.webp"alt="个人仪表盘" /><figcaption aria-hidden="true">个人仪表盘</figcaption></figure><p>这里避雷一下 <ahref="https://github.com/Lissy93/dashy">Dashy</a>，这个项目作为仪表盘来说，实在是有点太重了——部署时需要本地编译网页而非拉取预编译文件，导致只有4H8G 以上配置的实例才能正常使用。我逝了一次，直接 CPU和内存双双爆满，等了五分钟还是没反应，1Panel直接卡死，只能去服务商那里重启服务器后卸载 Dashy。如果是性能不错的NAS，倒是可以考虑用这个项目作为仪表盘。Dashy虽然还可以无服务器部署，但这样就丧失了 Dashy最大的优势：可视化配置界面，只能慢慢改 yaml，所以我选择放弃， <ahref="https://gethomepage.dev/">Homepage</a>也就是不能可视化配置，又不是不能用。不过 Homepage有个问题，那就是不支持设置密码，需要我使用反向代理提供的密码功能，但这样就会导致每次重新打开浏览器都需要重新输入密码，而且Bitwarden 的浏览器扩展也不能自动填充，需要手动复制，有点麻烦。</p><p>说到 <ahref="https://github.com/1Panel-dev/1Panel">1Panel</a>，这里还要吐槽一下1Panel 应用商店里的 Gitea，强制要求数据库从 MySQL 和 PostgreSQL里二选一，而这两尊大神光是部署就能吃掉我 1/4 的内存。Gitea本身是支持使用 SQLite的，对于我这种仅限个人小项目使用的需求是完全够用的。好在 1Panel支持从本地导入应用，我把应用商店里的 Gitea下到本地删掉选择数据库相关的内容后，上传回服务器，顺利安装运行。</p><p>另外 Gitea 的手机端编辑体验，相比 GitHub也差了不少。比如这段文字就是在 Gitea的网页端用手机码的，而这节上面的几段文字则是在手机端的 Obsidian上码完再复制过来的。Gitea在文本框内似乎只能唤起一次输入法界面，导致我换个地方点一下就不能正常输入，需要点一下文本框外面再点回来才能再次唤起输入法。不过手机端编辑代码的舒适度应该不是Gitea 的重点，也就将就了。但是自部署的 Gitea就不需要在同步的时候科学上网了，再在 Gitea 上配置一下仓库镜像推送到GitHub，对写代码的体验提升还是不错的。</p><h2 id="关于鸿蒙的一点担忧">关于鸿蒙的一点担忧</h2><p>我个人是确定在年底会入手华为的 Mate70作为时隔三年半的新手机了（据说是 11.26 发布），现在手上用的 Mate40虽然还能用，但总归是有些不顺心的地方。Mate70 使用鸿蒙 Next这个新系统，不顺心的地方肯定会更多，但我毕竟没有自己的收入，换新手机只能全力倚父，而家里出钱就只能换家里选定的华为手机，所以只能是我去适应一下系统了。而且到时候我自己还会把省下来的生活费拿出一部分买台方便折腾的安卓做备用机，弥补这么多年用华为所缺失的折腾手机的快乐。</p><p>鸿蒙 Next 最让我担心的还是生态问题。虽然国内的软件大都在积极适配鸿蒙Next，期间也闹了不少笑话（比如 QQ 忘记加密接口造福一众 QQ机器人开发者，微信里的升级按钮会跳转到 App Store <del>怎么全是 TX的</del>），但待到年底 Mate70发布时，鸿蒙的生态真的能满足我的日常使用需求吗？我对此深感怀疑。</p><p>首先就是上面提到的 VaultWarden 了，BitWarden客户端这种需求量不大的开源软件，短时间内肯定没人移植到鸿蒙，不像 Clash这种刚需级软件，早早地就有人移植到鸿蒙 Next 上。</p><p>VaultWarden主要是我确实真金白银花在上面了，所以排在最前，但我日常使用最频繁的还是火狐的跨端同步功能。那么问题来了：Mozilla今年都两次裁员了，真的还有人力来开发鸿蒙端的火狐吗？华为和 Mozilla最大的关系大概是同为 Rust基金会的董事，但是这层关系应该管不到浏览器适配。更何况鸿蒙 Next的卖点之一就是只有系统自带的 WebView，其他非 Chromium内核的浏览器真的有机会上鸿蒙吗？其他浏览器的同步能力大概是比不上火狐的，而且Windows端的对应浏览器使用体验肯定也远不如火狐，所以这对我影响也很大。</p><p>接着是几个安卓的 Xpose 模块和功能软件，主要是优化QQ、B站、知乎使用体验（<del>他宝贝的</del> B站<del>小可爱</del>天天给我贴脸推送低质逆天视频来吸引争议带来的流量，所以我用模块把推荐视频和评论区全屏蔽了）的模块，和跳开屏广告的软件。没了它们，手机用起来就不那么丝滑了。</p><p>最后是几个米哈游的游戏。虽然我大部分时间都是在电脑上打这几个游戏，手机就起个收菜清日常任务的作用，但少了他们，多少会不习惯一阵子。虽说米哈游早早就宣布要进行鸿蒙适配，但目前还是毫无音讯。虽然原神和星铁也有网页版的云游戏，但是使用体验只能说，比没有强。希望等到Mate70 发布的时候，至少官方的云游戏能适配鸿蒙。</p><p>担忧说完了，总归是得有点好消息才行。好消息是，虽然华为学苹果搞封闭应用商店，但是在侧载安装上留的口子比苹果大：鸿蒙目前应用自签名有效期是一年，侧载安装的开源软件可以过很长时间才重新签名一遍，比苹果只有七天好不少。</p><h2 id="国产虫豸软件">国产虫豸软件</h2><p>上文提到我在用 Xpose模块精简软件界面，事实上，我对某些国产虫豸软件的臃肿界面诟病已久。我用过界面最舒适的正版在线音乐软件，居然是安卓端的Apple Music，国内的软件，像 Q音、网易、酷狗等，一个二个都是恨不得在音乐软件里再塞个直播软件，太难绷了。在线听歌其实也有开源的<a href="https://github.com/listen1" rel="external nofollow noreferrer">Listen 1</a>可用，但是我还是更喜欢本地听歌，所以没有用这个软件。</p><p>刚才只是针对了音乐软件，事实上，大部分国产商业软件，都喜欢在一个本职功能很简单的软件上塞上视频直播、小游戏、借贷等功能，每个软件都在试图接管一切娱乐需求，这只让我极度恶心。</p><p>但国产软件的界面还是有救的，那就是——关怀模式/大字模式/长辈模式。没错，给看不清屏幕的长辈用的界面，才是我这个年轻人最喜欢的界面：干净清爽，大部分花里胡哨没用的功能都不见了，但是厂商认为的核心功能绝对会保留。当然，也有像某宝这种虫豸，长辈模式依旧塞一堆垃圾功能，除了字大点没别的区别，不过大部分情况下使用长辈模式能够极大优化某些国产软件的使用体验。有的软件还会提供英文模式，可能比长辈模式还要简洁，例如中国移动APP 的英文模式就只有话费、流量、通话时长和充值这几个功能。</p><figure><img src= "" data-lazy-src="https://bu.dusays.com/2024/11/15/67372b5cae80e.webp"alt="中国移动的英文版" /><figcaption aria-hidden="true">中国移动的英文版</figcaption></figure><p>使用体验上英文版 &gt;&gt;中文版属于是国产虫豸软件的常态了。包括像各种功能也是一到英文版、一到国外，就开始收敛了。例如Google Play Store上的微信，在国外网络环境下就不会自己后台保活烧电量，而是走正常的消息推送路径；但只要让它发现使用者其实处于国内环境，各种妖魔鬼怪招式又会轮番上阵。</p><h2 id="聊天分寸">聊天分寸</h2><p>这周在好几个 QQ群水群的时候都遇到了一些聊天分寸的问题，所以想在周记里聊聊。</p><p>首先需要明确的是，不同的地方有不同的聊天氛围，有各自需要注意的分寸，就像星铁的这段剧情对话一样：</p><figure><img src= "" data-lazy-src="https://bu.dusays.com/2024/11/15/67375cdb3580c.webp"alt="星穹铁道剧情截图" /><figcaption aria-hidden="true">星穹铁道剧情截图</figcaption></figure><p>在我活跃过的 QQ群里，有以发百草枯表情包为乐的群，满屏都是绿色农药图片乱飞；有全是老司机发车验车，满屏都是磁链种子的群；有每天话题在emo→涩涩→文爱→学术→emo 之间循环的群；有专注技术讨论，闲聊超过三句就会因ot(off topic) 被叫停的群，每个群都有不一样的聊天分寸。</p><p>如果聊天环境完全陌生或者完全熟悉，我自然是不怕掌握不到分寸的，因为前者我基本不说话，自然不会冒犯他人；后者大家都熟悉聊天氛围，哪些冒犯的话并无恶意大家心里有数，即使稍微冒犯到了对方，也有沟通的余地。我最怕应对的是熟悉环境里的陌生人：熟悉意味着我会说些带有一定冒犯性质，但熟人不会在意的话；陌生人意味着他会在意我说的冒犯的话，结果就是我会无意间冒犯到他，然后吵起来（悲）。</p><h2 id="小学生春游综合症">小学生春游综合症</h2><p>其实就是「明明第二天有事需要早起，却辗转反侧难以入睡」的情况。虽然心情和原因大不相同，但我还是更喜欢称之为小学生春游综合症，听起来会更有乐趣一些。</p><p>我经常会在第二天需要早起——通常是六七点——的时候，在床上闭着眼睛躺一两个小时就是睡不着。很明显，这和我的生物钟有关，常年累月的熬夜已经让我无法突然早睡了。我也尝试过前一天只睡四五个小时来强迫自己早睡，但结果往往是身体非常困，精神却很清醒，也不知道为什么。</p>]]></content:encoded>
      
      
      <category domain="https://blog.hpcesia.com/categories/%E7%94%9F%E6%B4%BB%E7%82%B9%E6%BB%B4/">生活点滴</category>
      
      
      <category domain="https://blog.hpcesia.com/tags/%E5%91%A8-%E6%9C%88%E8%AE%B0/">周/月记</category>
      
      
      <comments>https://blog.hpcesia.com/posts/45a2901b/#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>在 Hexo 博客中接入新版 Memos</title>
      <link>https://blog.hpcesia.com/posts/a604572f/</link>
      <guid>https://blog.hpcesia.com/posts/a604572f/</guid>
      <pubDate>Tue, 12 Nov 2024 14:11:01 GMT</pubDate>
      
      <description>在 Hexo 博客中接入最新版本的 Memos (0.22.4) 的个人经验。Memos 的 API 经常变化，导致老教程通常会有不适用的地方，因此记录当前最新版本的部署方式。</description>
      
      
      
      <content:encoded><![CDATA[<p>部署 <a href="https://www.usememos.com/" rel="external nofollow noreferrer">Memos</a>网络上已经有很多教程了，本文就不在此赘述了，直接说正题。</p><h2 id="利用-cloudflare-worker-制作-api-接口">利用 Cloudflare Worker制作 API 接口</h2><p>Memos 的 <a href="https://memos.apidocumentation.com/" rel="external nofollow noreferrer">API</a>有个问题，那就是几乎所有 API 都需要传入 token，但是 Memos 并没有精细化的token 管理，例如限定 token 的权限等，所以直接在 js 中写入 token是极度不安全的，通过 token，其他人可以随意修改你的Memos，无论内容还是账户还是资源。因此我们需要一个只向外提供部分 API的包装。</p><p>这里我选择的是赛博大善人 <ahref="https://www.cloudflare.com/zh-cn/">Cloudflare</a> 的 <ahref="https://developers.cloudflare.com/workers/">Worker</a> 作为 API的包装，免费 Worker 足以应对博客的小流量了。我在此提供一个 Worker实现，只向外暴露了获取公开 Memos 与按 uid 获取 Memo 的接口。该 Worker部署时需要在 Worker 的设置中添加一个机密，键为 <code>TOKEN</code>，值为Memos 设置页面的 token 字符串。</p><figure class="highlight javascript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">const</span><span style="color:#986801;--shiki-dark:#E5C07B"> API_BASE_URL</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#50A14F;--shiki-dark:#98C379"> "https://your.memos.domain"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">const</span><span style="color:#986801;--shiki-dark:#E5C07B"> BANNED_MEMO_KEY_LIST</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> [</span><span style="color:#50A14F;--shiki-dark:#98C379">"keys"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#50A14F;--shiki-dark:#98C379">"you"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#50A14F;--shiki-dark:#98C379">"don't"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#50A14F;--shiki-dark:#98C379">"want"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#50A14F;--shiki-dark:#98C379">"to"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#50A14F;--shiki-dark:#98C379">"expose"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">];</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">const</span><span style="color:#986801;--shiki-dark:#E5C07B"> BANNED_RESOURCE_KEY_LIST</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> [</span><span style="color:#50A14F;--shiki-dark:#98C379">"keys"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#50A14F;--shiki-dark:#98C379">"you"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#50A14F;--shiki-dark:#98C379">"don't"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#50A14F;--shiki-dark:#98C379">"want"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#50A14F;--shiki-dark:#98C379">"to"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#50A14F;--shiki-dark:#98C379">"expose"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">];</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">const</span><span style="color:#986801;--shiki-dark:#E5C07B"> EXTERNAL_LINK</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#123;</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">  base</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">:</span><span style="color:#50A14F;--shiki-dark:#98C379"> "https://bucket-name.cloudflare-id.r2.cloudflarestorage.com/"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">  replace</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">:</span><span style="color:#50A14F;--shiki-dark:#98C379"> "https://your.bucket.domain/"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">&#125;;</span></span><span class="line"></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">export</span><span style="color:#E45649;--shiki-dark:#C678DD"> default</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#123;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">  async</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> fetch</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">request</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">env</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">ctx</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) &#123;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">    function</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> formatMemo</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">memo</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) &#123;</span></span><span class="line"><span style="color:#986801;--shiki-dark:#E5C07B">      BANNED_MEMO_KEY_LIST</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">map</span><span style="color:#383A42;--shiki-dark:#ABB2BF">((</span><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">key</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) </span><span style="color:#A626A4;--shiki-dark:#C678DD">=></span><span style="color:#0184BC;--shiki-dark:#C678DD"> delete</span><span style="color:#E45649;--shiki-dark:#E06C75"> memo</span><span style="color:#383A42;--shiki-dark:#ABB2BF">[</span><span style="color:#E45649;--shiki-dark:#E06C75">key</span><span style="color:#383A42;--shiki-dark:#ABB2BF">]);</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">      if</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="color:#383A42;--shiki-dark:#E5C07B">memo</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">resources</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) </span><span style="color:#383A42;--shiki-dark:#E5C07B">memo</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">resources</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#E5C07B"> memo</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E5C07B">resources</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">map</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#E45649;--shiki-dark:#E06C75">formatResource</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">      return</span><span style="color:#E45649;--shiki-dark:#E06C75"> memo</span><span style="color:#383A42;--shiki-dark:#ABB2BF">;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    &#125;</span></span><span class="line"></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">    function</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> formatResource</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">resource</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) &#123;</span></span><span class="line"><span style="color:#986801;--shiki-dark:#E5C07B">      BANNED_RESOURCE_KEY_LIST</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">map</span><span style="color:#383A42;--shiki-dark:#ABB2BF">((</span><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">key</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) </span><span style="color:#A626A4;--shiki-dark:#C678DD">=></span><span style="color:#0184BC;--shiki-dark:#C678DD"> delete</span><span style="color:#E45649;--shiki-dark:#E06C75"> resource</span><span style="color:#383A42;--shiki-dark:#ABB2BF">[</span><span style="color:#E45649;--shiki-dark:#E06C75">key</span><span style="color:#383A42;--shiki-dark:#ABB2BF">]);</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">      if</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="color:#383A42;--shiki-dark:#E5C07B">resource</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">externalLink</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E5C07B">        resource</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">externalLink</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#E5C07B"> resource</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">externalLink</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">          .</span><span style="color:#4078F2;--shiki-dark:#61AFEF">split</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">"?"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)[</span><span style="color:#986801;--shiki-dark:#D19A66">0</span><span style="color:#383A42;--shiki-dark:#ABB2BF">]</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">          .</span><span style="color:#4078F2;--shiki-dark:#61AFEF">replace</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#986801;--shiki-dark:#E5C07B">EXTERNAL_LINK</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">base</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#986801;--shiki-dark:#E5C07B">EXTERNAL_LINK</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">replace</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">      return</span><span style="color:#E45649;--shiki-dark:#E06C75"> resource</span><span style="color:#383A42;--shiki-dark:#ABB2BF">;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    &#125;</span></span><span class="line"></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">    async</span><span style="color:#A626A4;--shiki-dark:#C678DD"> function</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> getApi</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">url</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) &#123;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">      const</span><span style="color:#986801;--shiki-dark:#E5C07B"> response</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#A626A4;--shiki-dark:#C678DD"> await</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> fetch</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#E45649;--shiki-dark:#E06C75">url</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, &#123;</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">        method</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">:</span><span style="color:#50A14F;--shiki-dark:#98C379"> "GET"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">        headers</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">:</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#123;</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">          Authorization</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">:</span><span style="color:#50A14F;--shiki-dark:#98C379"> `Bearer </span><span style="color:#CA1243;--shiki-dark:#C678DD">$&#123;</span><span style="color:#383A42;--shiki-dark:#E5C07B">env</span><span style="color:#50A14F;--shiki-dark:#ABB2BF">.</span><span style="color:#986801;--shiki-dark:#E06C75">TOKEN</span><span style="color:#CA1243;--shiki-dark:#C678DD">&#125;</span><span style="color:#50A14F;--shiki-dark:#98C379">`</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">          "Content-Type"</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">:</span><span style="color:#50A14F;--shiki-dark:#98C379"> "application/json"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">        &#125;,</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">      &#125;);</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">      if</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="color:#0184BC;--shiki-dark:#56B6C2">!</span><span style="color:#383A42;--shiki-dark:#E5C07B">response</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">ok</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) &#123;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E5C07B">        console</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">error</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">`Error fetching data: </span><span style="color:#CA1243;--shiki-dark:#C678DD">$&#123;</span><span style="color:#383A42;--shiki-dark:#E5C07B">response</span><span style="color:#50A14F;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">statusText</span><span style="color:#CA1243;--shiki-dark:#C678DD">&#125;</span><span style="color:#50A14F;--shiki-dark:#98C379">`</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">        return</span><span style="color:#986801;--shiki-dark:#D19A66"> null</span><span style="color:#383A42;--shiki-dark:#ABB2BF">;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">      &#125;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">      return</span><span style="color:#383A42;--shiki-dark:#E5C07B"> response</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">json</span><span style="color:#383A42;--shiki-dark:#ABB2BF">();</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    &#125;</span></span><span class="line"></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">    async</span><span style="color:#A626A4;--shiki-dark:#C678DD"> function</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> getMemos</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">searchParams</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) &#123;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">      const</span><span style="color:#986801;--shiki-dark:#E5C07B"> num</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#E5C07B"> searchParams</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">get</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">"pageSize"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) </span><span style="color:#0184BC;--shiki-dark:#56B6C2">||</span><span style="color:#986801;--shiki-dark:#D19A66"> 15</span><span style="color:#383A42;--shiki-dark:#ABB2BF">;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">      const</span><span style="color:#986801;--shiki-dark:#E5C07B"> pageToken</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#E5C07B"> searchParams</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">get</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">"pageToken"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">      const</span><span style="color:#986801;--shiki-dark:#E5C07B"> url</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#50A14F;--shiki-dark:#98C379"> `</span><span style="color:#CA1243;--shiki-dark:#C678DD">$&#123;</span><span style="color:#986801;--shiki-dark:#E5C07B">API_BASE_URL</span><span style="color:#CA1243;--shiki-dark:#C678DD">&#125;</span><span style="color:#50A14F;--shiki-dark:#98C379">/api/v1/memos?pageSize=</span><span style="color:#CA1243;--shiki-dark:#C678DD">$&#123;</span><span style="color:#E45649;--shiki-dark:#E06C75">num</span><span style="color:#CA1243;--shiki-dark:#C678DD">&#125;</span><span style="color:#50A14F;--shiki-dark:#98C379">&#x26;</span><span style="color:#CA1243;--shiki-dark:#C678DD">$&#123;</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">        pageToken</span><span style="color:#0184BC;--shiki-dark:#C678DD"> ?</span><span style="color:#50A14F;--shiki-dark:#98C379"> `pageToken=</span><span style="color:#CA1243;--shiki-dark:#C678DD">$&#123;</span><span style="color:#E45649;--shiki-dark:#E06C75">pageToken</span><span style="color:#CA1243;--shiki-dark:#C678DD">&#125;</span><span style="color:#50A14F;--shiki-dark:#98C379">&#x26;`</span><span style="color:#0184BC;--shiki-dark:#C678DD"> :</span><span style="color:#CA1243;--shiki-dark:#98C379"> ""</span></span><span class="line"><span style="color:#CA1243;--shiki-dark:#C678DD">      &#125;</span><span style="color:#50A14F;--shiki-dark:#98C379">filter=visibilities==['PUBLIC']`</span><span style="color:#383A42;--shiki-dark:#ABB2BF">;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">      return</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> getApi</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#E45649;--shiki-dark:#E06C75">url</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    &#125;</span></span><span class="line"></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">    async</span><span style="color:#A626A4;--shiki-dark:#C678DD"> function</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> getMemosByUid</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">uid</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) &#123;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">      const</span><span style="color:#986801;--shiki-dark:#E5C07B"> url</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#50A14F;--shiki-dark:#98C379"> `</span><span style="color:#CA1243;--shiki-dark:#C678DD">$&#123;</span><span style="color:#986801;--shiki-dark:#E5C07B">API_BASE_URL</span><span style="color:#CA1243;--shiki-dark:#C678DD">&#125;</span><span style="color:#50A14F;--shiki-dark:#98C379">/api/v1/memos:by-uid/</span><span style="color:#CA1243;--shiki-dark:#C678DD">$&#123;</span><span style="color:#E45649;--shiki-dark:#E06C75">uid</span><span style="color:#CA1243;--shiki-dark:#C678DD">&#125;</span><span style="color:#50A14F;--shiki-dark:#98C379">`</span><span style="color:#383A42;--shiki-dark:#ABB2BF">;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">      return</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> getApi</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#E45649;--shiki-dark:#E06C75">url</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    &#125;</span></span><span class="line"></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">    let</span><span style="color:#E45649;--shiki-dark:#E06C75"> responseData</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#123;&#125;;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">    let</span><span style="color:#E45649;--shiki-dark:#E06C75"> status</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#986801;--shiki-dark:#D19A66"> 200</span><span style="color:#383A42;--shiki-dark:#ABB2BF">;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">    if</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="color:#383A42;--shiki-dark:#E5C07B">request</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">method</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> !==</span><span style="color:#50A14F;--shiki-dark:#98C379"> "GET"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) &#123;</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">      status</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#986801;--shiki-dark:#D19A66"> 501</span><span style="color:#383A42;--shiki-dark:#ABB2BF">;</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">      responseData</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#123;</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">        code</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">:</span><span style="color:#986801;--shiki-dark:#D19A66"> 12</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">        message</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">:</span><span style="color:#50A14F;--shiki-dark:#98C379"> "Method Not Allowed"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">        details</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">:</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> [],</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">      &#125;;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    &#125;</span></span><span class="line"></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">    const</span><span style="color:#986801;--shiki-dark:#E5C07B"> apiRoute</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#E5C07B"> request</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E5C07B">url</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">split</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">"?"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)[</span><span style="color:#986801;--shiki-dark:#D19A66">0</span><span style="color:#383A42;--shiki-dark:#ABB2BF">].</span><span style="color:#4078F2;--shiki-dark:#61AFEF">split</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">"/"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">).</span><span style="color:#4078F2;--shiki-dark:#61AFEF">slice</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#986801;--shiki-dark:#D19A66">4</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">    const</span><span style="color:#986801;--shiki-dark:#E5C07B"> urlParams</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#A626A4;--shiki-dark:#C678DD"> new</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> URLSearchParams</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E5C07B">request</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E5C07B">url</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">split</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">"?"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)[</span><span style="color:#986801;--shiki-dark:#D19A66">1</span><span style="color:#383A42;--shiki-dark:#ABB2BF">] </span><span style="color:#0184BC;--shiki-dark:#56B6C2">||</span><span style="color:#50A14F;--shiki-dark:#98C379"> ""</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">    switch</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="color:#E45649;--shiki-dark:#E06C75">apiRoute</span><span style="color:#383A42;--shiki-dark:#ABB2BF">[</span><span style="color:#986801;--shiki-dark:#D19A66">0</span><span style="color:#383A42;--shiki-dark:#ABB2BF">]) &#123;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">      case</span><span style="color:#50A14F;--shiki-dark:#98C379"> ""</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">        responseData</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#A626A4;--shiki-dark:#C678DD"> await</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> getMemos</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#E45649;--shiki-dark:#E06C75">urlParams</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">        if</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="color:#E45649;--shiki-dark:#E06C75">responseData</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) </span><span style="color:#383A42;--shiki-dark:#E5C07B">responseData</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">memos</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#E5C07B"> responseData</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E5C07B">memos</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">map</span><span style="color:#383A42;--shiki-dark:#ABB2BF">((</span><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">m</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) </span><span style="color:#A626A4;--shiki-dark:#C678DD">=></span><span style="color:#4078F2;--shiki-dark:#61AFEF"> formatMemo</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#E45649;--shiki-dark:#E06C75">m</span><span style="color:#383A42;--shiki-dark:#ABB2BF">));</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">        break</span><span style="color:#383A42;--shiki-dark:#ABB2BF">;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">      case</span><span style="color:#50A14F;--shiki-dark:#98C379"> "by-uid"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">        responseData</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#A626A4;--shiki-dark:#C678DD"> await</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> getMemosByUid</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#E45649;--shiki-dark:#E06C75">apiRoute</span><span style="color:#383A42;--shiki-dark:#ABB2BF">[</span><span style="color:#986801;--shiki-dark:#D19A66">1</span><span style="color:#383A42;--shiki-dark:#ABB2BF">]);</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">        if</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="color:#E45649;--shiki-dark:#E06C75">responseData</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) </span><span style="color:#E45649;--shiki-dark:#E06C75">responseData</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> formatMemo</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#E45649;--shiki-dark:#E06C75">responseData</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">        break</span><span style="color:#383A42;--shiki-dark:#ABB2BF">;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">      default</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">        if</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="color:#0184BC;--shiki-dark:#56B6C2">!</span><span style="color:#4078F2;--shiki-dark:#61AFEF">isNaN</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#4078F2;--shiki-dark:#61AFEF">parseInt</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#E45649;--shiki-dark:#E06C75">apiRoute</span><span style="color:#383A42;--shiki-dark:#ABB2BF">[</span><span style="color:#986801;--shiki-dark:#D19A66">0</span><span style="color:#383A42;--shiki-dark:#ABB2BF">]))) &#123;</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">          status</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#986801;--shiki-dark:#D19A66"> 400</span><span style="color:#383A42;--shiki-dark:#ABB2BF">;</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">          responseData</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#123;</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">            code</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">:</span><span style="color:#986801;--shiki-dark:#D19A66"> 5</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">            message</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">:</span><span style="color:#50A14F;--shiki-dark:#98C379"> "get memo by id is not supported"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">            details</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">:</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> [],</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">          &#125;;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">        &#125; </span><span style="color:#A626A4;--shiki-dark:#C678DD">else</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#123;</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">          status</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#986801;--shiki-dark:#D19A66"> 404</span><span style="color:#383A42;--shiki-dark:#ABB2BF">;</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">          responseData</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#123;</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">            code</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">:</span><span style="color:#986801;--shiki-dark:#D19A66"> 5</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">            message</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">:</span><span style="color:#50A14F;--shiki-dark:#98C379"> "interface not found"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">            details</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">:</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> [],</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">          &#125;;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">        &#125;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    &#125;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">    const</span><span style="color:#986801;--shiki-dark:#E5C07B"> jsonResponse</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#A626A4;--shiki-dark:#C678DD"> new</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> Response</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#986801;--shiki-dark:#E5C07B">JSON</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">stringify</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#E45649;--shiki-dark:#E06C75">responseData</span><span style="color:#383A42;--shiki-dark:#ABB2BF">), &#123;</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">      status</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">:</span><span style="color:#E45649;--shiki-dark:#E06C75"> status</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">      headers</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">:</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#123;</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">        "Content-Type"</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">:</span><span style="color:#50A14F;--shiki-dark:#98C379"> "application/json"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">        "Access-Control-Allow-Origin"</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">:</span><span style="color:#50A14F;--shiki-dark:#98C379"> "*"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">        "Access-Control-Allow-Methods"</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">:</span><span style="color:#50A14F;--shiki-dark:#98C379"> "GET"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">        "Access-Control-Allow-Headers"</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">:</span><span style="color:#50A14F;--shiki-dark:#98C379"> "Content-Type, Authorization"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">      &#125;,</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    &#125;);</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">    return</span><span style="color:#E45649;--shiki-dark:#E06C75"> jsonResponse</span><span style="color:#383A42;--shiki-dark:#ABB2BF">;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  &#125;,</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">&#125;;</span></span></code></pre></td></tr></tbody></table></figure><h2 id="在-hexo-中接入-memos">在 Hexo 中接入 Memos</h2><p>这里我主要针对的是我正在使用的 Solitude主题进行，主要参考的是这篇文章：</p><a class="tag-link" href="https://blog.meuicat.cn/posts/d525bbc8.html" rel="external nofollow noreferrer" target="_blank"><div class="tag-link-tips">引用站外链接</div><div class="tag-link-bottom"><div class="tag-link-left"><i class="solitude fas fa-link"></i></div><div class="tag-link-right"><div class="tag-link-title">Solitude魔改教程：动态即刻短文</div><div class="tag-link-sitename">亦小封</div></div><i class="solitude fas fa-chevron-right"></i></div></a><p>根据 0.22 的 API变化，做了一些简单的修改，同时修了一下主题版本变化导致的Bug，修改如下：</p><figure class="highlight yaml"><figcaption><span>solitude/_config.yml</span></figcaption><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro has-diff"><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">says</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">  enable</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">false</span></span><span class="line diff add"><span style="color:#E45649;--shiki-dark:#E06C75">  mode</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">local</span><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> # local | memos</span></span><span class="line diff add"><span style="color:#E45649;--shiki-dark:#E06C75">  api</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 填部署的 Cloudflare api 地址</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">  home_mini</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">false</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">  page</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">/essay/</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">  style</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">1</span></span></code></pre></td></tr></tbody></table></figure><figure class="highlight javascript"><figcaption><span>solitude/scripts/event/merge_config.js</span></figcaption><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro has-diff"><span class="line"><span style="color:#383A42;--shiki-dark:#E06C75">says</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: &#123;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E06C75">  enable</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">false</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line diff add"><span style="color:#383A42;--shiki-dark:#E06C75">  mode</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">"local"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span></span><span class="line diff add"><span style="color:#383A42;--shiki-dark:#E06C75">  api</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">null</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E06C75">  home_mini</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">false</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E06C75">  style</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">1</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E06C75">  strip</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">30</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">&#125;,</span></span></code></pre></td></tr></tbody></table></figure><figure class="highlight javascript"><figcaption><span>solitude/scripts/filter/checkThemeConfig.js</span></figcaption><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro has-diff"><span class="line"><span style="color:#383A42;--shiki-dark:#E5C07B">hexo</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E5C07B">extend</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E5C07B">filter</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">register</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">'before_post_render'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, () </span><span style="color:#A626A4;--shiki-dark:#C678DD">=></span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#123;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">  const</span><span style="color:#986801;--shiki-dark:#E5C07B"> data</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#E5C07B"> hexo</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E5C07B">locals</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">get</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">'data'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">  const</span><span style="color:#986801;--shiki-dark:#E5C07B"> logger</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#E5C07B"> hexo</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">log</span><span style="color:#383A42;--shiki-dark:#ABB2BF">;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">  const</span><span style="color:#986801;--shiki-dark:#E5C07B"> theme</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#E5C07B"> hexo</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E5C07B">theme</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">config</span><span style="color:#383A42;--shiki-dark:#ABB2BF">;</span></span><span class="line diff remove"><span style="color:#A626A4;--shiki-dark:#C678DD">  if</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="color:#383A42;--shiki-dark:#E5C07B">theme</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E5C07B">says</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">enable</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> &#x26;&#x26;</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> !</span><span style="color:#383A42;--shiki-dark:#E5C07B">data</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">essay</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) &#123; </span></span><span class="line diff add"><span style="color:#A626A4;--shiki-dark:#C678DD">  if</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="color:#383A42;--shiki-dark:#E5C07B">theme</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E5C07B">says</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">enable</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> &#x26;&#x26;</span><span style="color:#383A42;--shiki-dark:#E5C07B"> theme</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E5C07B">says</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">mode</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> ===</span><span style="color:#50A14F;--shiki-dark:#98C379"> 'local'</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> &#x26;&#x26;</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> !</span><span style="color:#383A42;--shiki-dark:#E5C07B">data</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">essay</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) &#123; </span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E5C07B">    logger</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">error</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">'</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\n</span><span style="color:#50A14F;--shiki-dark:#98C379"> 启用即刻短文的情况下，请新建 essay.yaml。'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E5C07B">    logger</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">error</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">'</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\n</span><span style="color:#50A14F;--shiki-dark:#98C379"> If says is enabled, essay data must be supplied! </span><span style="color:#0184BC;--shiki-dark:#56B6C2">\n</span><span style="color:#50A14F;--shiki-dark:#98C379"> Please create essay.yaml.'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E5C07B">    process</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">exit</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#0184BC;--shiki-dark:#56B6C2">-</span><span style="color:#986801;--shiki-dark:#D19A66">1</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  &#125;</span></span></code></pre></td></tr></tbody></table></figure><figure class="highlight pug"><figcaption><span>solitude/layout/includes/widgets/home/bbTimeList.pug</span></figcaption><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro has-diff"><span class="line"><span style="color:#986801;--shiki-dark:#D19A66">.bbTimeList.container</span><span style="color:#4078F2;--shiki-dark:#61AFEF">#bbTimeList</span><span style="color:#986801;--shiki-dark:#D19A66">(class</span><span style="color:#383A42;--shiki-dark:#ABB2BF">=</span><span style="color:#4078F2;--shiki-dark:#61AFEF">is_home_first_page</span><span style="color:#383A42;--shiki-dark:#ABB2BF">() </span><span style="color:#383A42;--shiki-dark:#C678DD">?</span><span style="color:#50A14F;--shiki-dark:#98C379"> ''</span><span style="color:#383A42;--shiki-dark:#C678DD"> :</span><span style="color:#50A14F;--shiki-dark:#98C379"> 'more-page'</span><span style="color:#986801;--shiki-dark:#D19A66">)</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">    i</span><span style="color:#986801;--shiki-dark:#D19A66">.bber-logo.solitude.fa-solid.fa-newspaper(onclick</span><span style="color:#383A42;--shiki-dark:#ABB2BF">=</span><span style="color:#50A14F;--shiki-dark:#98C379">`pjax.loadUrl('</span><span style="color:#CA1243;--shiki-dark:#C678DD">$&#123;</span><span style="color:#4078F2;--shiki-dark:#61AFEF">url_for</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E5C07B">theme</span><span style="color:#50A14F;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E5C07B">says</span><span style="color:#50A14F;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">page</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span><span style="color:#CA1243;--shiki-dark:#C678DD">&#125;</span><span style="color:#50A14F;--shiki-dark:#98C379">')`</span><span style="color:#986801;--shiki-dark:#D19A66">)</span></span><span class="line"><span style="color:#986801;--shiki-dark:#D19A66">    .swiper-container.swiper-no-swiping.swiper-container-initialized.swiper-container-vertical.swiper-container-pointer-events</span><span style="color:#4078F2;--shiki-dark:#61AFEF">#bbtalk</span><span style="color:#986801;--shiki-dark:#D19A66">(tabindex</span><span style="color:#383A42;--shiki-dark:#ABB2BF">=</span><span style="color:#50A14F;--shiki-dark:#98C379">"-1"</span><span style="color:#986801;--shiki-dark:#D19A66"> onclick</span><span style="color:#383A42;--shiki-dark:#ABB2BF">=</span><span style="color:#50A14F;--shiki-dark:#98C379">`pjax.loadUrl('</span><span style="color:#CA1243;--shiki-dark:#C678DD">$&#123;</span><span style="color:#4078F2;--shiki-dark:#61AFEF">url_for</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E5C07B">theme</span><span style="color:#50A14F;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E5C07B">says</span><span style="color:#50A14F;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">page</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span><span style="color:#CA1243;--shiki-dark:#C678DD">&#125;</span><span style="color:#50A14F;--shiki-dark:#98C379">')`</span><span style="color:#986801;--shiki-dark:#D19A66">)</span></span><span class="line"><span style="color:#986801;--shiki-dark:#D19A66">        .swiper-wrapper</span><span style="color:#4078F2;--shiki-dark:#61AFEF">#bber-talk</span></span><span class="line diff add"><span style="color:#A626A4;--shiki-dark:#C678DD">            if</span><span style="color:#383A42;--shiki-dark:#E5C07B"> theme</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E5C07B">says</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">mode</span><span style="color:#383A42;--shiki-dark:#56B6C2"> ===</span><span style="color:#50A14F;--shiki-dark:#98C379"> 'local'</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">                each</span><span style="color:#E45649;--shiki-dark:#E06C75"> item, i</span><span style="color:#A626A4;--shiki-dark:#C678DD"> in</span><span style="color:#383A42;--shiki-dark:#E5C07B"> site</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E5C07B">data</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E5C07B">essay</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E5C07B">essay_list</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">slice</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#986801;--shiki-dark:#D19A66">0</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#986801;--shiki-dark:#D19A66">10</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"><span style="color:#986801;--shiki-dark:#D19A66">                    .li-style.swiper-slide</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">                        | </span><span style="color:#50A14F;--shiki-dark:#98C379">#&#123;</span><span style="color:#383A42;--shiki-dark:#E5C07B">item</span><span style="color:#50A14F;--shiki-dark:#98C379">.</span><span style="color:#E45649;--shiki-dark:#E06C75">content</span><span style="color:#50A14F;--shiki-dark:#98C379">&#125;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">                        if</span><span style="color:#383A42;--shiki-dark:#E5C07B"> item</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">image</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">                            i</span><span style="color:#986801;--shiki-dark:#D19A66">.solitude.fa-solid.fa-image</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">                        else if</span><span style="color:#383A42;--shiki-dark:#E5C07B"> item</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">aplayer</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">                            i</span><span style="color:#986801;--shiki-dark:#D19A66">.solitude.fa-solid.fa-disc</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">                        else if</span><span style="color:#383A42;--shiki-dark:#E5C07B"> item</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">video</span><span style="color:#383A42;--shiki-dark:#56B6C2"> ||</span><span style="color:#383A42;--shiki-dark:#E5C07B"> item</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">bilibili</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">                            i</span><span style="color:#986801;--shiki-dark:#D19A66">.solitude.fa-solid.fa-video</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">                        else if</span><span style="color:#383A42;--shiki-dark:#E5C07B"> item</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">link</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">                            i</span><span style="color:#986801;--shiki-dark:#D19A66">.solitude.fa-solid.fa-link</span></span><span class="line diff add"><span style="color:#A626A4;--shiki-dark:#C678DD">            else</span></span><span class="line diff add"><span style="color:#986801;--shiki-dark:#D19A66">                .li-style.bber-loading(style</span><span style="color:#383A42;--shiki-dark:#ABB2BF">=</span><span style="color:#50A14F;--shiki-dark:#98C379">"text-align: center"</span><span style="color:#986801;--shiki-dark:#D19A66">)</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> Loading...</span></span><span class="line diff add"><span style="color:#E45649;--shiki-dark:#E06C75">                script</span><span style="color:#986801;--shiki-dark:#D19A66">.</span></span><span class="line diff add"><span style="color:#383A42;--shiki-dark:#ABB2BF">                    (async function () &#123;</span></span><span class="line diff add"><span style="color:#E45649;--shiki-dark:#E06C75">                        const</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> response = await fetch('</span><span style="color:#50A14F;--shiki-dark:#98C379">!&#123;</span><span style="color:#4078F2;--shiki-dark:#61AFEF">url_for</span><span style="color:#383A42;--shiki-dark:#98C379">(</span><span style="color:#383A42;--shiki-dark:#E5C07B">theme</span><span style="color:#50A14F;--shiki-dark:#98C379">.</span><span style="color:#E45649;--shiki-dark:#E5C07B">says</span><span style="color:#50A14F;--shiki-dark:#98C379">.</span><span style="color:#E45649;--shiki-dark:#E06C75">api</span><span style="color:#383A42;--shiki-dark:#98C379">)</span><span style="color:#50A14F;--shiki-dark:#98C379">&#125;</span><span style="color:#383A42;--shiki-dark:#ABB2BF">');</span></span><span class="line diff add"><span style="color:#E45649;--shiki-dark:#E06C75">                        const</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> data = await response.json();</span></span><span class="line diff add"><span style="color:#E45649;--shiki-dark:#E06C75">                        const</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> list = data.memos.slice(0, 10).map(item =</span><span style="color:white;--shiki-dark:#FFFFFF">></span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#123;</span></span><span class="line diff add"><span style="color:#E45649;--shiki-dark:#E06C75">                            let</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> type = item.image ? '【图片】' : item.aplayer ? '【音乐】' : item.video ? '【视频】' : '';</span></span><span class="line diff add"><span style="color:#E45649;--shiki-dark:#E06C75">                            return</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> `&#x3C;</span><span style="color:#E45649;--shiki-dark:#E06C75">div</span><span style="color:#986801;--shiki-dark:#D19A66"> class</span><span style="color:#383A42;--shiki-dark:#ABB2BF">=</span><span style="color:#50A14F;--shiki-dark:#98C379">"li-style swiper-slide"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">>$&#123;item.content + type&#125;&#x3C;/</span><span style="color:#E45649;--shiki-dark:#E06C75">div</span><span style="color:#383A42;--shiki-dark:#ABB2BF">>`</span></span><span class="line diff add"><span style="color:#383A42;--shiki-dark:#ABB2BF">                        &#125;);</span></span><span class="line diff add"><span style="color:#E45649;--shiki-dark:#E06C75">                        document</span><span style="color:#986801;--shiki-dark:#D19A66">.querySelector('#bber-talk').innerHTML</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> = list.join(' ');</span></span><span class="line diff add"><span style="color:#383A42;--shiki-dark:#ABB2BF">                    &#125;)()</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">    i</span><span style="color:#986801;--shiki-dark:#D19A66">.bber-gotobb.solitude.fa-solid.fa-circle-chevron-right(title</span><span style="color:#383A42;--shiki-dark:#ABB2BF">=</span><span style="color:#4078F2;--shiki-dark:#61AFEF">_p</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">'home.bbtime.text'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) </span><span style="color:#986801;--shiki-dark:#D19A66">onclick</span><span style="color:#383A42;--shiki-dark:#ABB2BF">=</span><span style="color:#50A14F;--shiki-dark:#98C379">`pjax.loadUrl('</span><span style="color:#CA1243;--shiki-dark:#C678DD">$&#123;</span><span style="color:#4078F2;--shiki-dark:#61AFEF">url_for</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E5C07B">theme</span><span style="color:#50A14F;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E5C07B">says</span><span style="color:#50A14F;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">page</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span><span style="color:#CA1243;--shiki-dark:#C678DD">&#125;</span><span style="color:#50A14F;--shiki-dark:#98C379">')`</span><span style="color:#986801;--shiki-dark:#D19A66">)</span></span></code></pre></td></tr></tbody></table></figure><figure class="highlight pug"><figcaption><span>solitude/layout/includes/page/says.pug</span></figcaption><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro has-diff"><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">include</span><span style="color:#E45649;--shiki-dark:#E06C75"> ../widgets/page/banner</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">if</span><span style="color:#383A42;--shiki-dark:#E5C07B"> theme</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E5C07B">says</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">enable</span></span><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">    #bber</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">        section</span><span style="color:#986801;--shiki-dark:#D19A66">.timeline.page-1</span></span><span class="line diff add"><span style="color:#A626A4;--shiki-dark:#C678DD">            if</span><span style="color:#383A42;--shiki-dark:#E5C07B"> theme</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E5C07B">says</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">mode</span><span style="color:#383A42;--shiki-dark:#56B6C2"> ===</span><span style="color:#50A14F;--shiki-dark:#98C379"> 'local'</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">                ul</span><span style="color:#986801;--shiki-dark:#D19A66">.list.waterfall</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">                    // 原封不动的代码太多，省略了</span></span><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">                #bber-tips</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">                    if</span><span style="color:#383A42;--shiki-dark:#E5C07B"> theme</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E5C07B">says</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">strip</span><span style="color:#383A42;--shiki-dark:#56B6C2"> ===</span><span style="color:#383A42;--shiki-dark:#56B6C2"> -</span><span style="color:#986801;--shiki-dark:#D19A66">1</span></span><span class="line"><span style="color:#986801;--shiki-dark:#D19A66">                        =</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> _p</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">'essay.tip0'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">                    else</span></span><span class="line"><span style="color:#986801;--shiki-dark:#D19A66">                        =</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> _p</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">'essay.tip1'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">).</span><span style="color:#4078F2;--shiki-dark:#61AFEF">replace</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">'&#123;count&#125;'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#383A42;--shiki-dark:#E5C07B">theme</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E5C07B">says</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">strip</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line diff add"><span style="color:#A626A4;--shiki-dark:#C678DD">            else</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">                // 下面全是新加的，我就不标记了</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">                ul</span><span style="color:#986801;--shiki-dark:#D19A66">.list.waterfall</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">                script</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">                    (</span><span style="color:#A626A4;--shiki-dark:#C678DD">async</span><span style="color:#A626A4;--shiki-dark:#C678DD"> function</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> () &#123;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">                        const</span><span style="color:#986801;--shiki-dark:#E5C07B"> strip</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#56B6C2"> !</span><span style="color:#383A42;--shiki-dark:#ABB2BF">&#123; theme.says.</span><span style="color:#383A42;--shiki-dark:#E06C75">strip</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#125;;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">                        let</span><span style="color:#383A42;--shiki-dark:#E06C75"> url</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span><span style="color:#50A14F;--shiki-dark:#98C379"> `!&#123;url_for(theme.says.api)&#125;?pageSize=</span><span style="color:#CA1243;--shiki-dark:#C678DD">$&#123;</span><span style="color:#383A42;--shiki-dark:#E06C75">strip</span><span style="color:#383A42;--shiki-dark:#56B6C2"> ===</span><span style="color:#383A42;--shiki-dark:#56B6C2"> -</span><span style="color:#986801;--shiki-dark:#D19A66">1</span><span style="color:#383A42;--shiki-dark:#C678DD"> ?</span><span style="color:#986801;--shiki-dark:#D19A66"> 65535</span><span style="color:#383A42;--shiki-dark:#C678DD"> :</span><span style="color:#383A42;--shiki-dark:#E06C75"> strip</span><span style="color:#CA1243;--shiki-dark:#C678DD">&#125;</span><span style="color:#50A14F;--shiki-dark:#98C379">`</span><span style="color:#383A42;--shiki-dark:#ABB2BF">;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">                        const</span><span style="color:#986801;--shiki-dark:#E5C07B"> baseUrl</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#E5C07B"> url</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">substring</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#986801;--shiki-dark:#D19A66">0</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#383A42;--shiki-dark:#E5C07B">url</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">indexOf</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">"/"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#383A42;--shiki-dark:#E5C07B">url</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">indexOf</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">"//"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) </span><span style="color:#383A42;--shiki-dark:#56B6C2">+</span><span style="color:#986801;--shiki-dark:#D19A66"> 2</span><span style="color:#383A42;--shiki-dark:#ABB2BF">));</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">                        const</span><span style="color:#986801;--shiki-dark:#E5C07B"> response</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span><span style="color:#A626A4;--shiki-dark:#C678DD"> await</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> fetch</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E06C75">url</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">                        const</span><span style="color:#986801;--shiki-dark:#E5C07B"> data</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span><span style="color:#A626A4;--shiki-dark:#C678DD"> await</span><span style="color:#383A42;--shiki-dark:#E5C07B"> response</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">json</span><span style="color:#383A42;--shiki-dark:#ABB2BF">();</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">                        let</span><span style="color:#383A42;--shiki-dark:#E06C75"> items</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> [],</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E06C75">                            topitem</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> [],</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E06C75">                            essayTips</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span><span style="color:#50A14F;--shiki-dark:#98C379"> ""</span><span style="color:#383A42;--shiki-dark:#ABB2BF">;</span></span><span class="line"></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">                        await</span><span style="color:#C18401;--shiki-dark:#E5C07B"> Promise</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">all</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E5C07B">                            data</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E5C07B">memos</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">map</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#A626A4;--shiki-dark:#C678DD">async</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">item</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) </span><span style="color:#A626A4;--shiki-dark:#C678DD">=></span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#123;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">                                const</span><span style="color:#986801;--shiki-dark:#E5C07B"> formatdata</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span><span style="color:#A626A4;--shiki-dark:#C678DD"> await</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> essayFormat</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E06C75">item</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#383A42;--shiki-dark:#E06C75">baseUrl</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">                                if</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="color:#383A42;--shiki-dark:#56B6C2">!</span><span style="color:#383A42;--shiki-dark:#E06C75">formatdata</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) </span><span style="color:#A626A4;--shiki-dark:#C678DD">return</span><span style="color:#986801;--shiki-dark:#D19A66"> null</span><span style="color:#383A42;--shiki-dark:#ABB2BF">;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">                                if</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="color:#383A42;--shiki-dark:#E5C07B">item</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E5C07B">content</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">includes</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">"#top"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)) &#123;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E5C07B">                                    topitem</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">push</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E06C75">formatdata</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">                                &#125; </span><span style="color:#A626A4;--shiki-dark:#C678DD">else</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#123;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E5C07B">                                    items</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">push</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E06C75">formatdata</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">                                &#125;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">                                return</span><span style="color:#383A42;--shiki-dark:#E06C75"> formatdata</span><span style="color:#383A42;--shiki-dark:#ABB2BF">;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">                            &#125;)</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">                        );</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E06C75">                        essayTips</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E06C75">                            strip</span><span style="color:#383A42;--shiki-dark:#56B6C2"> ===</span><span style="color:#383A42;--shiki-dark:#56B6C2"> -</span><span style="color:#986801;--shiki-dark:#D19A66">1</span><span style="color:#383A42;--shiki-dark:#56B6C2"> ||</span><span style="color:#383A42;--shiki-dark:#E06C75"> strip</span><span style="color:#383A42;--shiki-dark:#56B6C2"> >=</span><span style="color:#383A42;--shiki-dark:#E5C07B"> items</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">length</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#C678DD">                                ?</span><span style="color:#50A14F;--shiki-dark:#98C379"> `&#x3C;div id="bber-tips">- 已展开所有短文 -&#x3C;/div>`</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#C678DD">                                :</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> ((</span><span style="color:#383A42;--shiki-dark:#E06C75">items</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#E5C07B"> items</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">slice</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#986801;--shiki-dark:#D19A66">0</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#383A42;--shiki-dark:#E06C75">strip</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)),</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">                                    `&#x3C;div id="bber-tips">- 只展示最近 </span><span style="color:#CA1243;--shiki-dark:#C678DD">$&#123;</span><span style="color:#383A42;--shiki-dark:#E06C75">strip</span><span style="color:#CA1243;--shiki-dark:#C678DD">&#125;</span><span style="color:#50A14F;--shiki-dark:#98C379"> 条短文 -&#x3C;/div>`</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E5C07B">                        document</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">getElementsByClassName</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">"list"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)[</span><span style="color:#986801;--shiki-dark:#D19A66">0</span><span style="color:#383A42;--shiki-dark:#ABB2BF">].</span><span style="color:#E45649;--shiki-dark:#E06C75">innerHTML</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#E06C75"> topitem</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">                            .</span><span style="color:#4078F2;--shiki-dark:#61AFEF">concat</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E06C75">items</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">                            .</span><span style="color:#4078F2;--shiki-dark:#61AFEF">filter</span><span style="color:#383A42;--shiki-dark:#ABB2BF">((</span><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">item</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) </span><span style="color:#A626A4;--shiki-dark:#C678DD">=></span><span style="color:#383A42;--shiki-dark:#E06C75"> item</span><span style="color:#383A42;--shiki-dark:#56B6C2"> !==</span><span style="color:#986801;--shiki-dark:#D19A66"> null</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">                            .</span><span style="color:#4078F2;--shiki-dark:#61AFEF">join</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">""</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E5C07B">                        document</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">querySelector</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">"#bber"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">).</span><span style="color:#4078F2;--shiki-dark:#61AFEF">insertAdjacentHTML</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">"beforeend"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#383A42;--shiki-dark:#E06C75">essayTips</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">                        (</span><span style="color:#A626A4;--shiki-dark:#C678DD">function</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> wait</span><span style="color:#383A42;--shiki-dark:#ABB2BF">() &#123;</span></span><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">                            setTimeout</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(() </span><span style="color:#A626A4;--shiki-dark:#C678DD">=></span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#123;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">                                if</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="color:#383A42;--shiki-dark:#E06C75">sco</span><span style="color:#383A42;--shiki-dark:#56B6C2"> &#x26;&#x26;</span><span style="color:#383A42;--shiki-dark:#E06C75"> utils</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) &#123;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E5C07B">                                    sco</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">changeTimeFormat</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E5C07B">document</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">querySelectorAll</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">'time'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">));</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E5C07B">                                    utils</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">lightbox</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E5C07B">document</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">querySelectorAll</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">'img'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">))</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">                                &#125;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">                                else</span></span><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">                                    wait</span><span style="color:#383A42;--shiki-dark:#ABB2BF">()</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">                            &#125;, </span><span style="color:#986801;--shiki-dark:#D19A66">500</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">                        &#125;)()</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">                    &#125;)()</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">                case</span><span style="color:#383A42;--shiki-dark:#E5C07B"> theme</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E5C07B">says</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">style</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">                    when</span><span style="color:#986801;--shiki-dark:#D19A66"> 1</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">                        script</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">                            async</span><span style="color:#A626A4;--shiki-dark:#C678DD"> function</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> essayFormat</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">item</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">baseUrl</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) &#123;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">                                const</span><span style="color:#986801;--shiki-dark:#E5C07B"> contentRegex</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span><span style="color:#0184BC;--shiki-dark:#E06C75"> /#(</span><span style="color:#986801;--shiki-dark:#E06C75">.</span><span style="color:#383A42;--shiki-dark:#D19A66">*?</span><span style="color:#0184BC;--shiki-dark:#E06C75">)</span><span style="color:#986801;--shiki-dark:#E06C75">\s</span><span style="color:#383A42;--shiki-dark:#ABB2BF">|</span><span style="color:#986801;--shiki-dark:#E06C75">\n</span><span style="color:#0184BC;--shiki-dark:#E06C75">/</span><span style="color:#A626A4;--shiki-dark:#C678DD">g</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#986801;--shiki-dark:#E5C07B">                                    imageRegex</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span><span style="color:#0184BC;--shiki-dark:#E06C75"> /</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\!\[</span><span style="color:#0184BC;--shiki-dark:#E06C75">(</span><span style="color:#986801;--shiki-dark:#E06C75">.</span><span style="color:#383A42;--shiki-dark:#D19A66">*?</span><span style="color:#0184BC;--shiki-dark:#E06C75">)</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\]\(</span><span style="color:#0184BC;--shiki-dark:#E06C75">(</span><span style="color:#986801;--shiki-dark:#E06C75">.</span><span style="color:#383A42;--shiki-dark:#D19A66">*?</span><span style="color:#0184BC;--shiki-dark:#E06C75">)</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\)</span><span style="color:#0184BC;--shiki-dark:#E06C75">/</span><span style="color:#A626A4;--shiki-dark:#C678DD">g</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#986801;--shiki-dark:#E5C07B">                                    playerRegex</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span><span style="color:#0184BC;--shiki-dark:#E06C75"> /&#123;</span><span style="color:#986801;--shiki-dark:#E06C75">\s</span><span style="color:#383A42;--shiki-dark:#D19A66">*</span><span style="color:#0184BC;--shiki-dark:#E06C75">player</span><span style="color:#986801;--shiki-dark:#E06C75">\s</span><span style="color:#383A42;--shiki-dark:#D19A66">*</span><span style="color:#0184BC;--shiki-dark:#E06C75">(</span><span style="color:#986801;--shiki-dark:#E06C75">.</span><span style="color:#383A42;--shiki-dark:#D19A66">*</span><span style="color:#0184BC;--shiki-dark:#E06C75">)</span><span style="color:#986801;--shiki-dark:#E06C75">\s</span><span style="color:#383A42;--shiki-dark:#D19A66">*</span><span style="color:#0184BC;--shiki-dark:#E06C75">&#125;/</span><span style="color:#A626A4;--shiki-dark:#C678DD">g</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#986801;--shiki-dark:#E5C07B">                                    linkRegex</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span><span style="color:#0184BC;--shiki-dark:#E06C75"> /(?&#x3C;!</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\!</span><span style="color:#0184BC;--shiki-dark:#E06C75">)</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\[</span><span style="color:#0184BC;--shiki-dark:#E06C75">(</span><span style="color:#986801;--shiki-dark:#E06C75">.</span><span style="color:#383A42;--shiki-dark:#D19A66">*?</span><span style="color:#0184BC;--shiki-dark:#E06C75">)</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\]\(</span><span style="color:#0184BC;--shiki-dark:#E06C75">(</span><span style="color:#986801;--shiki-dark:#E06C75">.</span><span style="color:#383A42;--shiki-dark:#D19A66">*?</span><span style="color:#0184BC;--shiki-dark:#E06C75">)</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\)</span><span style="color:#0184BC;--shiki-dark:#E06C75">/</span><span style="color:#A626A4;--shiki-dark:#C678DD">g</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#986801;--shiki-dark:#E5C07B">                                    topRegex</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span><span style="color:#0184BC;--shiki-dark:#E06C75"> /#top/</span><span style="color:#A626A4;--shiki-dark:#C678DD">g</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#986801;--shiki-dark:#E5C07B">                                    fromRegex</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span><span style="color:#0184BC;--shiki-dark:#E06C75"> /(?&#x3C;!</span><span style="color:#986801;--shiki-dark:#D19A66">[</span><span style="color:#986801;--shiki-dark:#E06C75">\w</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\/</span><span style="color:#986801;--shiki-dark:#D19A66">]</span><span style="color:#0184BC;--shiki-dark:#E06C75">)(?&#x3C;!</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\&#123;</span><span style="color:#0184BC;--shiki-dark:#E06C75">)</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\&#123;</span><span style="color:#0184BC;--shiki-dark:#E06C75">(</span><span style="color:#986801;--shiki-dark:#D19A66">[</span><span style="color:#383A42;--shiki-dark:#ABB2BF">^</span><span style="color:#986801;--shiki-dark:#D19A66">&#123;&#125;</span><span style="color:#986801;--shiki-dark:#E06C75">\s</span><span style="color:#986801;--shiki-dark:#D19A66">]</span><span style="color:#383A42;--shiki-dark:#D19A66">+</span><span style="color:#0184BC;--shiki-dark:#E06C75">)</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\&#125;</span><span style="color:#0184BC;--shiki-dark:#E06C75">(?!</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\&#125;</span><span style="color:#0184BC;--shiki-dark:#E06C75">)(?!</span><span style="color:#986801;--shiki-dark:#D19A66">[</span><span style="color:#986801;--shiki-dark:#E06C75">\w</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\/</span><span style="color:#986801;--shiki-dark:#D19A66">]</span><span style="color:#0184BC;--shiki-dark:#E06C75">)/</span><span style="color:#A626A4;--shiki-dark:#C678DD">g</span><span style="color:#383A42;--shiki-dark:#ABB2BF">;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">                                let</span><span style="color:#383A42;--shiki-dark:#E06C75"> time</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#E5C07B"> item</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">displayTime</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E06C75">                                    content</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#E5C07B"> item</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">content</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E06C75">                                    image</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span><span style="color:#50A14F;--shiki-dark:#98C379"> ""</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E06C75">                                    img</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#E5C07B"> content</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">match</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E06C75">imageRegex</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">                                (</span><span style="color:#383A42;--shiki-dark:#E06C75">aplayer</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#E5C07B"> content</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">match</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#0184BC;--shiki-dark:#E06C75">/&#123;</span><span style="color:#986801;--shiki-dark:#E06C75">\s</span><span style="color:#383A42;--shiki-dark:#D19A66">*</span><span style="color:#0184BC;--shiki-dark:#E06C75">music</span><span style="color:#986801;--shiki-dark:#E06C75">\s</span><span style="color:#383A42;--shiki-dark:#D19A66">*</span><span style="color:#0184BC;--shiki-dark:#E06C75">(</span><span style="color:#986801;--shiki-dark:#E06C75">.</span><span style="color:#383A42;--shiki-dark:#D19A66">*?</span><span style="color:#0184BC;--shiki-dark:#E06C75">)</span><span style="color:#986801;--shiki-dark:#E06C75">\s</span><span style="color:#383A42;--shiki-dark:#D19A66">*</span><span style="color:#0184BC;--shiki-dark:#E06C75">(</span><span style="color:#986801;--shiki-dark:#E06C75">.</span><span style="color:#383A42;--shiki-dark:#D19A66">*?</span><span style="color:#0184BC;--shiki-dark:#E06C75">)</span><span style="color:#986801;--shiki-dark:#E06C75">\s</span><span style="color:#383A42;--shiki-dark:#D19A66">*</span><span style="color:#0184BC;--shiki-dark:#E06C75">&#125;/</span><span style="color:#A626A4;--shiki-dark:#C678DD">g</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)),</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">                                    (</span><span style="color:#383A42;--shiki-dark:#E06C75">video</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#E5C07B"> content</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">match</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E06C75">playerRegex</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)),</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">                                    (</span><span style="color:#383A42;--shiki-dark:#E06C75">link</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#E5C07B"> content</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">match</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E06C75">linkRegex</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)),</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">                                    (</span><span style="color:#383A42;--shiki-dark:#E06C75">type</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span><span style="color:#50A14F;--shiki-dark:#98C379"> ""</span><span style="color:#383A42;--shiki-dark:#ABB2BF">),</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">                                    (</span><span style="color:#383A42;--shiki-dark:#E06C75">from</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#E5C07B"> content</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">match</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E06C75">fromRegex</span><span style="color:#383A42;--shiki-dark:#ABB2BF">));</span></span><span class="line"></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">                                if</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="color:#383A42;--shiki-dark:#E5C07B">item</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E5C07B">resources</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">length</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) &#123;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">                                    if</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="color:#383A42;--shiki-dark:#56B6C2">!</span><span style="color:#383A42;--shiki-dark:#E06C75">img</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) </span><span style="color:#383A42;--shiki-dark:#E06C75">img</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> [];</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E5C07B">                                    item</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E5C07B">resources</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">forEach</span><span style="color:#383A42;--shiki-dark:#ABB2BF">((</span><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">e</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) </span><span style="color:#A626A4;--shiki-dark:#C678DD">=></span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#123;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">                                        if</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="color:#383A42;--shiki-dark:#E5C07B">e</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">externalLink</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) </span><span style="color:#383A42;--shiki-dark:#E5C07B">img</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">push</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">`![</span><span style="color:#CA1243;--shiki-dark:#C678DD">$&#123;</span><span style="color:#383A42;--shiki-dark:#E5C07B">e</span><span style="color:#50A14F;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">filename</span><span style="color:#CA1243;--shiki-dark:#C678DD">&#125;</span><span style="color:#50A14F;--shiki-dark:#98C379">](</span><span style="color:#CA1243;--shiki-dark:#C678DD">$&#123;</span><span style="color:#383A42;--shiki-dark:#E5C07B">e</span><span style="color:#50A14F;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">externalLink</span><span style="color:#CA1243;--shiki-dark:#C678DD">&#125;</span><span style="color:#50A14F;--shiki-dark:#98C379">)`</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">                                        else</span><span style="color:#383A42;--shiki-dark:#E5C07B"> img</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">push</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">`![</span><span style="color:#CA1243;--shiki-dark:#C678DD">$&#123;</span><span style="color:#383A42;--shiki-dark:#E5C07B">e</span><span style="color:#50A14F;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">filename</span><span style="color:#CA1243;--shiki-dark:#C678DD">&#125;</span><span style="color:#50A14F;--shiki-dark:#98C379">](</span><span style="color:#CA1243;--shiki-dark:#C678DD">$&#123;</span><span style="color:#383A42;--shiki-dark:#E06C75">baseUrl</span><span style="color:#CA1243;--shiki-dark:#C678DD">&#125;</span><span style="color:#50A14F;--shiki-dark:#98C379">/o/r/</span><span style="color:#CA1243;--shiki-dark:#C678DD">$&#123;</span><span style="color:#383A42;--shiki-dark:#E5C07B">e</span><span style="color:#50A14F;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">uid</span><span style="color:#CA1243;--shiki-dark:#C678DD">&#125;</span><span style="color:#50A14F;--shiki-dark:#98C379">)`</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">                                    &#125;);</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">                                &#125;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">                                if</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="color:#383A42;--shiki-dark:#E06C75">img</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E06C75">                                    image</span><span style="color:#383A42;--shiki-dark:#56B6C2"> +=</span><span style="color:#383A42;--shiki-dark:#E5C07B"> img</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">map</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">                                        (</span><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">e</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) </span><span style="color:#A626A4;--shiki-dark:#C678DD">=></span><span style="color:#50A14F;--shiki-dark:#98C379"> `&#x3C;img src="</span><span style="color:#CA1243;--shiki-dark:#C678DD">$&#123;</span><span style="color:#383A42;--shiki-dark:#E5C07B">e</span><span style="color:#50A14F;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">replace</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E06C75">imageRegex</span><span style="color:#50A14F;--shiki-dark:#ABB2BF">, </span><span style="color:#CA1243;--shiki-dark:#98C379">"</span><span style="color:#50A14F;--shiki-dark:#98C379">$2</span><span style="color:#CA1243;--shiki-dark:#98C379">"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span><span style="color:#CA1243;--shiki-dark:#C678DD">&#125;</span><span style="color:#50A14F;--shiki-dark:#98C379">" alt="</span><span style="color:#CA1243;--shiki-dark:#C678DD">$&#123;</span><span style="color:#383A42;--shiki-dark:#E5C07B">e</span><span style="color:#50A14F;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">replace</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E06C75">imageRegex</span><span style="color:#50A14F;--shiki-dark:#ABB2BF">, </span><span style="color:#CA1243;--shiki-dark:#98C379">"</span><span style="color:#50A14F;--shiki-dark:#98C379">$1</span><span style="color:#CA1243;--shiki-dark:#98C379">"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span><span style="color:#CA1243;--shiki-dark:#C678DD">&#125;</span><span style="color:#50A14F;--shiki-dark:#98C379">" />`</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">                                    ).</span><span style="color:#4078F2;--shiki-dark:#61AFEF">join</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">""</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E06C75">                                aplayer</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#E06C75"> aplayer</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#C678DD">                                    ?</span><span style="color:#50A14F;--shiki-dark:#98C379"> `&#x3C;div class="bber-music">&#x3C;meting-js server="</span><span style="color:#CA1243;--shiki-dark:#C678DD">$&#123;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E06C75">                                        aplayer</span><span style="color:#383A42;--shiki-dark:#ABB2BF">[</span><span style="color:#986801;--shiki-dark:#D19A66">0</span><span style="color:#383A42;--shiki-dark:#ABB2BF">]</span><span style="color:#50A14F;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">match</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#CA1243;--shiki-dark:#E06C75">/</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\&#123;</span><span style="color:#986801;--shiki-dark:#E06C75">\s</span><span style="color:#383A42;--shiki-dark:#D19A66">*</span><span style="color:#0184BC;--shiki-dark:#E06C75">music</span><span style="color:#986801;--shiki-dark:#E06C75">\s</span><span style="color:#383A42;--shiki-dark:#D19A66">*</span><span style="color:#CA1243;--shiki-dark:#E06C75">(</span><span style="color:#986801;--shiki-dark:#E06C75">.</span><span style="color:#383A42;--shiki-dark:#D19A66">*?</span><span style="color:#CA1243;--shiki-dark:#E06C75">)</span><span style="color:#986801;--shiki-dark:#E06C75">\s</span><span style="color:#383A42;--shiki-dark:#D19A66">*</span><span style="color:#986801;--shiki-dark:#E06C75">\d</span><span style="color:#383A42;--shiki-dark:#D19A66">+</span><span style="color:#986801;--shiki-dark:#E06C75">\s</span><span style="color:#383A42;--shiki-dark:#D19A66">*</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\&#125;</span><span style="color:#CA1243;--shiki-dark:#E06C75">/</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)[</span><span style="color:#986801;--shiki-dark:#D19A66">1</span><span style="color:#383A42;--shiki-dark:#ABB2BF">]</span></span><span class="line"><span style="color:#CA1243;--shiki-dark:#C678DD">                                    &#125;</span><span style="color:#50A14F;--shiki-dark:#98C379">" type="song" id="</span><span style="color:#CA1243;--shiki-dark:#C678DD">$&#123;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E06C75">                                        aplayer</span><span style="color:#383A42;--shiki-dark:#ABB2BF">[</span><span style="color:#986801;--shiki-dark:#D19A66">0</span><span style="color:#383A42;--shiki-dark:#ABB2BF">]</span><span style="color:#50A14F;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">match</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#CA1243;--shiki-dark:#E06C75">/</span><span style="color:#986801;--shiki-dark:#E06C75">\d</span><span style="color:#383A42;--shiki-dark:#D19A66">+</span><span style="color:#CA1243;--shiki-dark:#E06C75">/</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)[</span><span style="color:#986801;--shiki-dark:#D19A66">0</span><span style="color:#383A42;--shiki-dark:#ABB2BF">]</span></span><span class="line"><span style="color:#CA1243;--shiki-dark:#C678DD">                                    &#125;</span><span style="color:#50A14F;--shiki-dark:#98C379">" mutex="true" preload="none" theme="var(--efu-main)" data-lrctype="0">&#x3C;/meting-js>&#x3C;/div>`</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#C678DD">                                    :</span><span style="color:#50A14F;--shiki-dark:#98C379"> ""</span><span style="color:#383A42;--shiki-dark:#ABB2BF">;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E06C75">                                video</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#E06C75"> video</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#C678DD">                                    ?</span><span style="color:#50A14F;--shiki-dark:#98C379"> `&#x3C;div class="bber-video">&#x3C;video src="</span><span style="color:#CA1243;--shiki-dark:#C678DD">$&#123;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E06C75">                                        video</span><span style="color:#383A42;--shiki-dark:#ABB2BF">[</span><span style="color:#986801;--shiki-dark:#D19A66">0</span><span style="color:#383A42;--shiki-dark:#ABB2BF">]</span><span style="color:#50A14F;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">replace</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E06C75">playerRegex</span><span style="color:#50A14F;--shiki-dark:#ABB2BF">, </span><span style="color:#CA1243;--shiki-dark:#98C379">"</span><span style="color:#50A14F;--shiki-dark:#98C379">$1</span><span style="color:#CA1243;--shiki-dark:#98C379">"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span><span style="color:#50A14F;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">trim</span><span style="color:#383A42;--shiki-dark:#ABB2BF">()</span></span><span class="line"><span style="color:#CA1243;--shiki-dark:#C678DD">                                    &#125;</span><span style="color:#50A14F;--shiki-dark:#98C379">" controls="controls" style="object-fit: cover;">&#x3C;/video>&#x3C;/div>`</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#C678DD">                                    :</span><span style="color:#383A42;--shiki-dark:#E5C07B"> content</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">match</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#0184BC;--shiki-dark:#E06C75">/&#123;</span><span style="color:#986801;--shiki-dark:#E06C75">\s</span><span style="color:#383A42;--shiki-dark:#D19A66">*</span><span style="color:#0184BC;--shiki-dark:#E06C75">bilibili</span><span style="color:#986801;--shiki-dark:#E06C75">\s</span><span style="color:#383A42;--shiki-dark:#D19A66">*</span><span style="color:#0184BC;--shiki-dark:#E06C75">(</span><span style="color:#986801;--shiki-dark:#E06C75">.</span><span style="color:#383A42;--shiki-dark:#D19A66">*?</span><span style="color:#0184BC;--shiki-dark:#E06C75">)</span><span style="color:#986801;--shiki-dark:#E06C75">\s</span><span style="color:#383A42;--shiki-dark:#D19A66">*</span><span style="color:#0184BC;--shiki-dark:#E06C75">&#125;/</span><span style="color:#A626A4;--shiki-dark:#C678DD">g</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E06C75">                                video</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#E5C07B"> Array</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">isArray</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E06C75">video</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#C678DD">                                    ?</span><span style="color:#50A14F;--shiki-dark:#98C379"> `&#x3C;div class="bber-video">&#x3C;iframe src="//player.bilibili.com/player.html?bvid=</span><span style="color:#CA1243;--shiki-dark:#C678DD">$&#123;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E06C75">                                        video</span><span style="color:#383A42;--shiki-dark:#ABB2BF">[</span><span style="color:#986801;--shiki-dark:#D19A66">0</span><span style="color:#383A42;--shiki-dark:#ABB2BF">]</span><span style="color:#50A14F;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">match</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#CA1243;--shiki-dark:#E06C75">/(</span><span style="color:#0184BC;--shiki-dark:#E06C75">BV</span><span style="color:#986801;--shiki-dark:#E06C75">\w</span><span style="color:#383A42;--shiki-dark:#D19A66">+</span><span style="color:#CA1243;--shiki-dark:#E06C75">)/</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)[</span><span style="color:#986801;--shiki-dark:#D19A66">1</span><span style="color:#383A42;--shiki-dark:#ABB2BF">]</span></span><span class="line"><span style="color:#CA1243;--shiki-dark:#C678DD">                                    &#125;$&#123;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E06C75">                                        video</span><span style="color:#383A42;--shiki-dark:#ABB2BF">[</span><span style="color:#986801;--shiki-dark:#D19A66">0</span><span style="color:#383A42;--shiki-dark:#ABB2BF">]</span><span style="color:#50A14F;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">match</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#CA1243;--shiki-dark:#E06C75">/</span><span style="color:#0184BC;--shiki-dark:#E06C75">&#123;</span><span style="color:#986801;--shiki-dark:#E06C75">\s</span><span style="color:#383A42;--shiki-dark:#D19A66">*</span><span style="color:#0184BC;--shiki-dark:#E06C75">bilibili</span><span style="color:#986801;--shiki-dark:#E06C75">\s</span><span style="color:#383A42;--shiki-dark:#D19A66">*</span><span style="color:#CA1243;--shiki-dark:#E06C75">(</span><span style="color:#986801;--shiki-dark:#E06C75">.</span><span style="color:#383A42;--shiki-dark:#D19A66">*?</span><span style="color:#CA1243;--shiki-dark:#E06C75">)</span><span style="color:#986801;--shiki-dark:#E06C75">\s</span><span style="color:#383A42;--shiki-dark:#D19A66">*</span><span style="color:#0184BC;--shiki-dark:#E06C75">true</span><span style="color:#986801;--shiki-dark:#E06C75">\s</span><span style="color:#383A42;--shiki-dark:#D19A66">*</span><span style="color:#0184BC;--shiki-dark:#E06C75">&#125;</span><span style="color:#CA1243;--shiki-dark:#E06C75">/</span><span style="color:#A626A4;--shiki-dark:#C678DD">g</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span><span style="color:#383A42;--shiki-dark:#C678DD"> ?</span><span style="color:#CA1243;--shiki-dark:#98C379"> "</span><span style="color:#50A14F;--shiki-dark:#98C379">&#x26;autoplay=1</span><span style="color:#CA1243;--shiki-dark:#98C379">"</span><span style="color:#383A42;--shiki-dark:#C678DD"> :</span><span style="color:#CA1243;--shiki-dark:#98C379"> "</span><span style="color:#50A14F;--shiki-dark:#98C379">&#x26;autoplay=0</span><span style="color:#CA1243;--shiki-dark:#98C379">"</span></span><span class="line"><span style="color:#CA1243;--shiki-dark:#C678DD">                                    &#125;</span><span style="color:#50A14F;--shiki-dark:#98C379">" scrolling="no" bozrder="0" frameborder="no" framespacing="0" allowfullscreen="true">&#x3C;/iframe>&#x3C;/div>`</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#C678DD">                                    :</span><span style="color:#50A14F;--shiki-dark:#98C379"> ""</span><span style="color:#383A42;--shiki-dark:#ABB2BF">;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E06C75">                                link</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#E06C75"> link</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#C678DD">                                    ?</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> ((</span><span style="color:#383A42;--shiki-dark:#E06C75">type</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#E06C75"> link</span><span style="color:#383A42;--shiki-dark:#ABB2BF">[</span><span style="color:#986801;--shiki-dark:#D19A66">0</span><span style="color:#383A42;--shiki-dark:#ABB2BF">].</span><span style="color:#4078F2;--shiki-dark:#61AFEF">replace</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E06C75">linkRegex</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#50A14F;--shiki-dark:#98C379">"$2"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)),</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">                                    `&#x3C;a class="bber-content-link" href='</span><span style="color:#CA1243;--shiki-dark:#C678DD">$&#123;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E5C07B">                                        type</span><span style="color:#50A14F;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">startsWith</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#CA1243;--shiki-dark:#98C379">"</span><span style="color:#50A14F;--shiki-dark:#98C379">/</span><span style="color:#CA1243;--shiki-dark:#98C379">"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span><span style="color:#383A42;--shiki-dark:#C678DD"> ?</span><span style="color:#383A42;--shiki-dark:#E06C75"> type</span><span style="color:#383A42;--shiki-dark:#C678DD"> :</span><span style="color:#383A42;--shiki-dark:#E5C07B"> type</span><span style="color:#50A14F;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">startsWith</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#CA1243;--shiki-dark:#98C379">"</span><span style="color:#50A14F;--shiki-dark:#98C379">http</span><span style="color:#CA1243;--shiki-dark:#98C379">"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span><span style="color:#383A42;--shiki-dark:#C678DD"> ?</span><span style="color:#383A42;--shiki-dark:#E06C75"> type</span><span style="color:#383A42;--shiki-dark:#C678DD"> :</span><span style="color:#CA1243;--shiki-dark:#98C379"> "</span><span style="color:#50A14F;--shiki-dark:#98C379">https://</span><span style="color:#CA1243;--shiki-dark:#98C379">"</span><span style="color:#383A42;--shiki-dark:#56B6C2"> +</span><span style="color:#383A42;--shiki-dark:#E06C75"> type</span></span><span class="line"><span style="color:#CA1243;--shiki-dark:#C678DD">                                    &#125;</span><span style="color:#50A14F;--shiki-dark:#98C379">' title="</span><span style="color:#CA1243;--shiki-dark:#C678DD">$&#123;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E06C75">                                        link</span><span style="color:#383A42;--shiki-dark:#ABB2BF">[</span><span style="color:#986801;--shiki-dark:#D19A66">0</span><span style="color:#383A42;--shiki-dark:#ABB2BF">]</span><span style="color:#50A14F;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">replace</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E06C75">linkRegex</span><span style="color:#50A14F;--shiki-dark:#ABB2BF">, </span><span style="color:#CA1243;--shiki-dark:#98C379">"</span><span style="color:#50A14F;--shiki-dark:#98C379">$1</span><span style="color:#CA1243;--shiki-dark:#98C379">"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span><span style="color:#383A42;--shiki-dark:#C678DD"> ?</span><span style="color:#383A42;--shiki-dark:#E06C75"> link</span><span style="color:#383A42;--shiki-dark:#ABB2BF">[</span><span style="color:#986801;--shiki-dark:#D19A66">0</span><span style="color:#383A42;--shiki-dark:#ABB2BF">]</span><span style="color:#50A14F;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">replace</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E06C75">linkRegex</span><span style="color:#50A14F;--shiki-dark:#ABB2BF">, </span><span style="color:#CA1243;--shiki-dark:#98C379">"</span><span style="color:#50A14F;--shiki-dark:#98C379">$1</span><span style="color:#CA1243;--shiki-dark:#98C379">"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span><span style="color:#383A42;--shiki-dark:#C678DD"> :</span><span style="color:#CA1243;--shiki-dark:#98C379"> "</span><span style="color:#50A14F;--shiki-dark:#98C379">跳转到短文指引的链接</span><span style="color:#CA1243;--shiki-dark:#98C379">"</span></span><span class="line"><span style="color:#CA1243;--shiki-dark:#C678DD">                                    &#125;</span><span style="color:#50A14F;--shiki-dark:#98C379">" target="_blank">&#x3C;i class="solitude fa-solid fa-link">&#x3C;/i>链接&#x3C;/a>`</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#C678DD">                                    :</span><span style="color:#50A14F;--shiki-dark:#98C379"> ""</span><span style="color:#383A42;--shiki-dark:#ABB2BF">;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E06C75">                                from</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#E06C75"> from</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#C678DD">                                    ?</span><span style="color:#50A14F;--shiki-dark:#98C379"> `&#x3C;div class="bber-info-from">&#x3C;span></span><span style="color:#CA1243;--shiki-dark:#C678DD">$&#123;</span><span style="color:#383A42;--shiki-dark:#E06C75">from</span><span style="color:#383A42;--shiki-dark:#ABB2BF">[</span><span style="color:#986801;--shiki-dark:#D19A66">0</span><span style="color:#383A42;--shiki-dark:#ABB2BF">]</span><span style="color:#50A14F;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">replace</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E06C75">fromRegex</span><span style="color:#50A14F;--shiki-dark:#ABB2BF">, </span><span style="color:#CA1243;--shiki-dark:#98C379">"</span><span style="color:#50A14F;--shiki-dark:#98C379">$1</span><span style="color:#CA1243;--shiki-dark:#98C379">"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span><span style="color:#CA1243;--shiki-dark:#C678DD">&#125;</span><span style="color:#50A14F;--shiki-dark:#98C379">&#x3C;/span>&#x3C;/div>`</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#C678DD">                                    :</span><span style="color:#50A14F;--shiki-dark:#98C379"> ""</span><span style="color:#383A42;--shiki-dark:#ABB2BF">;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E06C75">                                content</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#E06C75"> content</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">                                    .</span><span style="color:#4078F2;--shiki-dark:#61AFEF">replace</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E06C75">contentRegex</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#50A14F;--shiki-dark:#98C379">""</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">                                    .</span><span style="color:#4078F2;--shiki-dark:#61AFEF">replace</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E06C75">imageRegex</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#50A14F;--shiki-dark:#98C379">""</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">                                    .</span><span style="color:#4078F2;--shiki-dark:#61AFEF">replace</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#0184BC;--shiki-dark:#E06C75">/</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\&#123;</span><span style="color:#0184BC;--shiki-dark:#E06C75">(</span><span style="color:#986801;--shiki-dark:#E06C75">.</span><span style="color:#383A42;--shiki-dark:#D19A66">*?</span><span style="color:#0184BC;--shiki-dark:#E06C75">)</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\&#125;</span><span style="color:#0184BC;--shiki-dark:#E06C75">/</span><span style="color:#A626A4;--shiki-dark:#C678DD">g</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#50A14F;--shiki-dark:#98C379">""</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">                                    .</span><span style="color:#4078F2;--shiki-dark:#61AFEF">replace</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E06C75">linkRegex</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#50A14F;--shiki-dark:#98C379">""</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">                                    .</span><span style="color:#4078F2;--shiki-dark:#61AFEF">trim</span><span style="color:#383A42;--shiki-dark:#ABB2BF">();</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">                                return</span><span style="color:#50A14F;--shiki-dark:#98C379"> `&#x3C;li class="item"></span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">                                    &#x3C;div id="bber-content"></span></span><span class="line"><span style="color:#CA1243;--shiki-dark:#C678DD">                                        $&#123;</span><span style="color:#383A42;--shiki-dark:#E06C75">content</span><span style="color:#383A42;--shiki-dark:#C678DD"> ?</span><span style="color:#50A14F;--shiki-dark:#98C379"> `&#x3C;p class="bber-content"></span><span style="color:#CA1243;--shiki-dark:#C678DD">$&#123;</span><span style="color:#383A42;--shiki-dark:#E06C75">content</span><span style="color:#CA1243;--shiki-dark:#C678DD">&#125;</span><span style="color:#50A14F;--shiki-dark:#98C379">&#x3C;/p>`</span><span style="color:#383A42;--shiki-dark:#C678DD"> :</span><span style="color:#CA1243;--shiki-dark:#98C379"> ""</span><span style="color:#CA1243;--shiki-dark:#C678DD">&#125;</span></span><span class="line"><span style="color:#CA1243;--shiki-dark:#C678DD">                                        $&#123;</span><span style="color:#383A42;--shiki-dark:#E06C75">image</span><span style="color:#383A42;--shiki-dark:#C678DD"> ?</span><span style="color:#50A14F;--shiki-dark:#98C379"> `&#x3C;div class="bber-content-img"></span><span style="color:#CA1243;--shiki-dark:#C678DD">$&#123;</span><span style="color:#383A42;--shiki-dark:#E06C75">image</span><span style="color:#CA1243;--shiki-dark:#C678DD">&#125;</span><span style="color:#50A14F;--shiki-dark:#98C379">&#x3C;/div>`</span><span style="color:#383A42;--shiki-dark:#C678DD"> :</span><span style="color:#CA1243;--shiki-dark:#98C379"> ""</span><span style="color:#CA1243;--shiki-dark:#C678DD">&#125;</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">                                    &#x3C;/div></span></span><span class="line"><span style="color:#CA1243;--shiki-dark:#C678DD">                                    $&#123;</span><span style="color:#383A42;--shiki-dark:#E06C75">aplayer</span><span style="color:#CA1243;--shiki-dark:#C678DD">&#125;</span></span><span class="line"><span style="color:#CA1243;--shiki-dark:#C678DD">                                    $&#123;</span><span style="color:#383A42;--shiki-dark:#E06C75">video</span><span style="color:#CA1243;--shiki-dark:#C678DD">&#125;</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">                                    &#x3C;hr></span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">                                    &#x3C;div class="bber-bottom"></span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">                                        &#x3C;div class="bber-info"></span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">                                            &#x3C;div class="bber-info-time"></span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">                                                &#x3C;i class="solitude fa-solid fa-calendar-day">&#x3C;/i></span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">                                                &#x3C;time class="datatime" datetime="</span><span style="color:#CA1243;--shiki-dark:#C678DD">$&#123;</span><span style="color:#383A42;--shiki-dark:#E06C75">time</span><span style="color:#CA1243;--shiki-dark:#C678DD">&#125;</span><span style="color:#50A14F;--shiki-dark:#98C379">">&#x3C;/time></span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">                                            &#x3C;/div></span></span><span class="line"><span style="color:#CA1243;--shiki-dark:#C678DD">                                            $&#123;</span><span style="color:#383A42;--shiki-dark:#E06C75">link</span><span style="color:#CA1243;--shiki-dark:#C678DD">&#125;</span></span><span class="line"><span style="color:#CA1243;--shiki-dark:#C678DD">                                            $&#123;</span><span style="color:#383A42;--shiki-dark:#E06C75">from</span><span style="color:#CA1243;--shiki-dark:#C678DD">&#125;</span></span><span class="line"><span style="color:#CA1243;--shiki-dark:#C678DD">                                            $&#123;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E5C07B">                                                item</span><span style="color:#50A14F;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E5C07B">content</span><span style="color:#50A14F;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">includes</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#CA1243;--shiki-dark:#98C379">"</span><span style="color:#50A14F;--shiki-dark:#98C379">#top</span><span style="color:#CA1243;--shiki-dark:#98C379">"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#C678DD">                                                ?</span><span style="color:#50A14F;--shiki-dark:#98C379"> `&#x3C;div class="bber-info-top">&#x3C;i class="solitude fa-solid fa-thumbtack">&#x3C;/i>置顶&#x3C;/div>`</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#C678DD">                                                :</span><span style="color:#CA1243;--shiki-dark:#98C379"> ""</span></span><span class="line"><span style="color:#CA1243;--shiki-dark:#C678DD">                                            &#125;</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">                                        &#x3C;/div></span></span><span class="line"><span style="color:#CA1243;--shiki-dark:#C678DD">                                        $&#123;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E06C75">                                            content</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#C678DD">                                            ?</span><span style="color:#50A14F;--shiki-dark:#98C379"> `&#x3C;a class="bber-reply" onclick="sco.toTalk('</span><span style="color:#CA1243;--shiki-dark:#C678DD">$&#123;</span><span style="color:#383A42;--shiki-dark:#E06C75">content</span><span style="color:#CA1243;--shiki-dark:#C678DD">&#125;</span><span style="color:#50A14F;--shiki-dark:#98C379">')">&#x3C;i class="solitude fa-solid fa-comment" style="font-size: 1rem;">&#x3C;/i>&#x3C;/a>`</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#C678DD">                                            :</span><span style="color:#CA1243;--shiki-dark:#98C379"> ""</span></span><span class="line"><span style="color:#CA1243;--shiki-dark:#C678DD">                                        &#125;</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">                                    &#x3C;/div></span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">                                &#x3C;/li>`</span><span style="color:#383A42;--shiki-dark:#ABB2BF">;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">                            &#125;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">                    when</span><span style="color:#986801;--shiki-dark:#D19A66"> 2</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">                        script</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">                            async</span><span style="color:#A626A4;--shiki-dark:#C678DD"> function</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> essayFormat</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">item</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">baseUrl</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) &#123;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">                                const</span><span style="color:#986801;--shiki-dark:#E5C07B"> contentRegex</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span><span style="color:#0184BC;--shiki-dark:#E06C75"> /#(</span><span style="color:#986801;--shiki-dark:#E06C75">.</span><span style="color:#383A42;--shiki-dark:#D19A66">*?</span><span style="color:#0184BC;--shiki-dark:#E06C75">)</span><span style="color:#986801;--shiki-dark:#E06C75">\s</span><span style="color:#383A42;--shiki-dark:#ABB2BF">|</span><span style="color:#986801;--shiki-dark:#E06C75">\n</span><span style="color:#0184BC;--shiki-dark:#E06C75">/</span><span style="color:#A626A4;--shiki-dark:#C678DD">g</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#986801;--shiki-dark:#E5C07B">                                    imageRegex</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span><span style="color:#0184BC;--shiki-dark:#E06C75"> /</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\!\[</span><span style="color:#0184BC;--shiki-dark:#E06C75">(</span><span style="color:#986801;--shiki-dark:#E06C75">.</span><span style="color:#383A42;--shiki-dark:#D19A66">*?</span><span style="color:#0184BC;--shiki-dark:#E06C75">)</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\]\(</span><span style="color:#0184BC;--shiki-dark:#E06C75">(</span><span style="color:#986801;--shiki-dark:#E06C75">.</span><span style="color:#383A42;--shiki-dark:#D19A66">*?</span><span style="color:#0184BC;--shiki-dark:#E06C75">)</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\)</span><span style="color:#0184BC;--shiki-dark:#E06C75">/</span><span style="color:#A626A4;--shiki-dark:#C678DD">g</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#986801;--shiki-dark:#E5C07B">                                    playerRegex</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span><span style="color:#0184BC;--shiki-dark:#E06C75"> /&#123;</span><span style="color:#986801;--shiki-dark:#E06C75">\s</span><span style="color:#383A42;--shiki-dark:#D19A66">*</span><span style="color:#0184BC;--shiki-dark:#E06C75">player</span><span style="color:#986801;--shiki-dark:#E06C75">\s</span><span style="color:#383A42;--shiki-dark:#D19A66">*</span><span style="color:#0184BC;--shiki-dark:#E06C75">(</span><span style="color:#986801;--shiki-dark:#E06C75">.</span><span style="color:#383A42;--shiki-dark:#D19A66">*</span><span style="color:#0184BC;--shiki-dark:#E06C75">)</span><span style="color:#986801;--shiki-dark:#E06C75">\s</span><span style="color:#383A42;--shiki-dark:#D19A66">*</span><span style="color:#0184BC;--shiki-dark:#E06C75">&#125;/</span><span style="color:#A626A4;--shiki-dark:#C678DD">g</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#986801;--shiki-dark:#E5C07B">                                    linkRegex</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span><span style="color:#0184BC;--shiki-dark:#E06C75"> /(?&#x3C;!</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\!</span><span style="color:#0184BC;--shiki-dark:#E06C75">)</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\[</span><span style="color:#0184BC;--shiki-dark:#E06C75">(</span><span style="color:#986801;--shiki-dark:#E06C75">.</span><span style="color:#383A42;--shiki-dark:#D19A66">*?</span><span style="color:#0184BC;--shiki-dark:#E06C75">)</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\]\(</span><span style="color:#0184BC;--shiki-dark:#E06C75">(</span><span style="color:#986801;--shiki-dark:#E06C75">.</span><span style="color:#383A42;--shiki-dark:#D19A66">*?</span><span style="color:#0184BC;--shiki-dark:#E06C75">)</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\)</span><span style="color:#0184BC;--shiki-dark:#E06C75">/</span><span style="color:#A626A4;--shiki-dark:#C678DD">g</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#986801;--shiki-dark:#E5C07B">                                    topRegex</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span><span style="color:#0184BC;--shiki-dark:#E06C75"> /#top/</span><span style="color:#A626A4;--shiki-dark:#C678DD">g</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#986801;--shiki-dark:#E5C07B">                                    fromRegex</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span><span style="color:#0184BC;--shiki-dark:#E06C75"> /(?&#x3C;!</span><span style="color:#986801;--shiki-dark:#D19A66">[</span><span style="color:#986801;--shiki-dark:#E06C75">\w</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\/</span><span style="color:#986801;--shiki-dark:#D19A66">]</span><span style="color:#0184BC;--shiki-dark:#E06C75">)(?&#x3C;!</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\&#123;</span><span style="color:#0184BC;--shiki-dark:#E06C75">)</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\&#123;</span><span style="color:#0184BC;--shiki-dark:#E06C75">(</span><span style="color:#986801;--shiki-dark:#D19A66">[</span><span style="color:#383A42;--shiki-dark:#ABB2BF">^</span><span style="color:#986801;--shiki-dark:#D19A66">&#123;&#125;</span><span style="color:#986801;--shiki-dark:#E06C75">\s</span><span style="color:#986801;--shiki-dark:#D19A66">]</span><span style="color:#383A42;--shiki-dark:#D19A66">+</span><span style="color:#0184BC;--shiki-dark:#E06C75">)</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\&#125;</span><span style="color:#0184BC;--shiki-dark:#E06C75">(?!</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\&#125;</span><span style="color:#0184BC;--shiki-dark:#E06C75">)(?!</span><span style="color:#986801;--shiki-dark:#D19A66">[</span><span style="color:#986801;--shiki-dark:#E06C75">\w</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\/</span><span style="color:#986801;--shiki-dark:#D19A66">]</span><span style="color:#0184BC;--shiki-dark:#E06C75">)/</span><span style="color:#A626A4;--shiki-dark:#C678DD">g</span><span style="color:#383A42;--shiki-dark:#ABB2BF">;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">                                let</span><span style="color:#383A42;--shiki-dark:#E06C75"> time</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#E5C07B"> item</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">displayTime</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E06C75">                                    content</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#E5C07B"> item</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">content</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E06C75">                                    image</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span><span style="color:#50A14F;--shiki-dark:#98C379"> ""</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E06C75">                                    img</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#E5C07B"> content</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">match</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E06C75">imageRegex</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">                                (</span><span style="color:#383A42;--shiki-dark:#E06C75">aplayer</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#E5C07B"> content</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">match</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#0184BC;--shiki-dark:#E06C75">/&#123;</span><span style="color:#986801;--shiki-dark:#E06C75">\s</span><span style="color:#383A42;--shiki-dark:#D19A66">*</span><span style="color:#0184BC;--shiki-dark:#E06C75">music</span><span style="color:#986801;--shiki-dark:#E06C75">\s</span><span style="color:#383A42;--shiki-dark:#D19A66">*</span><span style="color:#0184BC;--shiki-dark:#E06C75">(</span><span style="color:#986801;--shiki-dark:#E06C75">.</span><span style="color:#383A42;--shiki-dark:#D19A66">*?</span><span style="color:#0184BC;--shiki-dark:#E06C75">)</span><span style="color:#986801;--shiki-dark:#E06C75">\s</span><span style="color:#383A42;--shiki-dark:#D19A66">*</span><span style="color:#0184BC;--shiki-dark:#E06C75">(</span><span style="color:#986801;--shiki-dark:#E06C75">.</span><span style="color:#383A42;--shiki-dark:#D19A66">*?</span><span style="color:#0184BC;--shiki-dark:#E06C75">)</span><span style="color:#986801;--shiki-dark:#E06C75">\s</span><span style="color:#383A42;--shiki-dark:#D19A66">*</span><span style="color:#0184BC;--shiki-dark:#E06C75">&#125;/</span><span style="color:#A626A4;--shiki-dark:#C678DD">g</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)),</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">                                    (</span><span style="color:#383A42;--shiki-dark:#E06C75">video</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#E5C07B"> content</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">match</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E06C75">playerRegex</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)),</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">                                    (</span><span style="color:#383A42;--shiki-dark:#E06C75">link</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#E5C07B"> content</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">match</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E06C75">linkRegex</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)),</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">                                    (</span><span style="color:#383A42;--shiki-dark:#E06C75">type</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span><span style="color:#50A14F;--shiki-dark:#98C379"> ""</span><span style="color:#383A42;--shiki-dark:#ABB2BF">),</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">                                    (</span><span style="color:#383A42;--shiki-dark:#E06C75">from</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#E5C07B"> content</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">match</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E06C75">fromRegex</span><span style="color:#383A42;--shiki-dark:#ABB2BF">));</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">                                if</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="color:#383A42;--shiki-dark:#E5C07B">item</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E5C07B">resources</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">length</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) &#123;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">                                    if</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="color:#383A42;--shiki-dark:#56B6C2">!</span><span style="color:#383A42;--shiki-dark:#E06C75">img</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) </span><span style="color:#383A42;--shiki-dark:#E06C75">img</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> [];</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E5C07B">                                    item</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E5C07B">resources</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">forEach</span><span style="color:#383A42;--shiki-dark:#ABB2BF">((</span><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">e</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) </span><span style="color:#A626A4;--shiki-dark:#C678DD">=></span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#123;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">                                        if</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="color:#383A42;--shiki-dark:#E5C07B">e</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">externalLink</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) </span><span style="color:#383A42;--shiki-dark:#E5C07B">img</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">push</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">`![</span><span style="color:#CA1243;--shiki-dark:#C678DD">$&#123;</span><span style="color:#383A42;--shiki-dark:#E5C07B">e</span><span style="color:#50A14F;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">filename</span><span style="color:#CA1243;--shiki-dark:#C678DD">&#125;</span><span style="color:#50A14F;--shiki-dark:#98C379">](</span><span style="color:#CA1243;--shiki-dark:#C678DD">$&#123;</span><span style="color:#383A42;--shiki-dark:#E5C07B">e</span><span style="color:#50A14F;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">externalLink</span><span style="color:#CA1243;--shiki-dark:#C678DD">&#125;</span><span style="color:#50A14F;--shiki-dark:#98C379">)`</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">                                        else</span><span style="color:#383A42;--shiki-dark:#E5C07B"> img</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">push</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">`![</span><span style="color:#CA1243;--shiki-dark:#C678DD">$&#123;</span><span style="color:#383A42;--shiki-dark:#E5C07B">e</span><span style="color:#50A14F;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">filename</span><span style="color:#CA1243;--shiki-dark:#C678DD">&#125;</span><span style="color:#50A14F;--shiki-dark:#98C379">](</span><span style="color:#CA1243;--shiki-dark:#C678DD">$&#123;</span><span style="color:#383A42;--shiki-dark:#E06C75">baseUrl</span><span style="color:#CA1243;--shiki-dark:#C678DD">&#125;</span><span style="color:#50A14F;--shiki-dark:#98C379">/o/r/</span><span style="color:#CA1243;--shiki-dark:#C678DD">$&#123;</span><span style="color:#383A42;--shiki-dark:#E5C07B">e</span><span style="color:#50A14F;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">uid</span><span style="color:#CA1243;--shiki-dark:#C678DD">&#125;</span><span style="color:#50A14F;--shiki-dark:#98C379">)`</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">                                    &#125;);</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">                                &#125;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">                                if</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="color:#383A42;--shiki-dark:#E06C75">img</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E06C75">                                    image</span><span style="color:#383A42;--shiki-dark:#56B6C2"> +=</span><span style="color:#383A42;--shiki-dark:#E06C75"> img</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">                                    .</span><span style="color:#4078F2;--shiki-dark:#61AFEF">map</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">                                        (</span><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">e</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) </span><span style="color:#A626A4;--shiki-dark:#C678DD">=></span><span style="color:#50A14F;--shiki-dark:#98C379"> `&#x3C;img src="</span><span style="color:#CA1243;--shiki-dark:#C678DD">$&#123;</span><span style="color:#383A42;--shiki-dark:#E5C07B">e</span><span style="color:#50A14F;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">replace</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E06C75">imageRegex</span><span style="color:#50A14F;--shiki-dark:#ABB2BF">, </span><span style="color:#CA1243;--shiki-dark:#98C379">"</span><span style="color:#50A14F;--shiki-dark:#98C379">$2</span><span style="color:#CA1243;--shiki-dark:#98C379">"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span><span style="color:#CA1243;--shiki-dark:#C678DD">&#125;</span><span style="color:#50A14F;--shiki-dark:#98C379">" alt="</span><span style="color:#CA1243;--shiki-dark:#C678DD">$&#123;</span><span style="color:#383A42;--shiki-dark:#E5C07B">e</span><span style="color:#50A14F;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">replace</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E06C75">imageRegex</span><span style="color:#50A14F;--shiki-dark:#ABB2BF">, </span><span style="color:#CA1243;--shiki-dark:#98C379">"</span><span style="color:#50A14F;--shiki-dark:#98C379">$1</span><span style="color:#CA1243;--shiki-dark:#98C379">"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span><span style="color:#CA1243;--shiki-dark:#C678DD">&#125;</span><span style="color:#50A14F;--shiki-dark:#98C379">" />`</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">                                    )</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">                                    .</span><span style="color:#4078F2;--shiki-dark:#61AFEF">join</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">""</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E06C75">                                aplayer</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#E06C75"> aplayer</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#C678DD">                                    ?</span><span style="color:#50A14F;--shiki-dark:#98C379"> `&#x3C;div class="bber-music">&#x3C;meting-js server="</span><span style="color:#CA1243;--shiki-dark:#C678DD">$&#123;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E06C75">                                        aplayer</span><span style="color:#383A42;--shiki-dark:#ABB2BF">[</span><span style="color:#986801;--shiki-dark:#D19A66">0</span><span style="color:#383A42;--shiki-dark:#ABB2BF">]</span><span style="color:#50A14F;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">match</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#CA1243;--shiki-dark:#E06C75">/</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\&#123;</span><span style="color:#986801;--shiki-dark:#E06C75">\s</span><span style="color:#383A42;--shiki-dark:#D19A66">*</span><span style="color:#0184BC;--shiki-dark:#E06C75">music</span><span style="color:#986801;--shiki-dark:#E06C75">\s</span><span style="color:#383A42;--shiki-dark:#D19A66">*</span><span style="color:#CA1243;--shiki-dark:#E06C75">(</span><span style="color:#986801;--shiki-dark:#E06C75">.</span><span style="color:#383A42;--shiki-dark:#D19A66">*?</span><span style="color:#CA1243;--shiki-dark:#E06C75">)</span><span style="color:#986801;--shiki-dark:#E06C75">\s</span><span style="color:#383A42;--shiki-dark:#D19A66">*</span><span style="color:#986801;--shiki-dark:#E06C75">\d</span><span style="color:#383A42;--shiki-dark:#D19A66">+</span><span style="color:#986801;--shiki-dark:#E06C75">\s</span><span style="color:#383A42;--shiki-dark:#D19A66">*</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\&#125;</span><span style="color:#CA1243;--shiki-dark:#E06C75">/</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)[</span><span style="color:#986801;--shiki-dark:#D19A66">1</span><span style="color:#383A42;--shiki-dark:#ABB2BF">]</span></span><span class="line"><span style="color:#CA1243;--shiki-dark:#C678DD">                                    &#125;</span><span style="color:#50A14F;--shiki-dark:#98C379">" type="song" id="</span><span style="color:#CA1243;--shiki-dark:#C678DD">$&#123;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E06C75">                                        aplayer</span><span style="color:#383A42;--shiki-dark:#ABB2BF">[</span><span style="color:#986801;--shiki-dark:#D19A66">0</span><span style="color:#383A42;--shiki-dark:#ABB2BF">]</span><span style="color:#50A14F;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">match</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#CA1243;--shiki-dark:#E06C75">/</span><span style="color:#986801;--shiki-dark:#E06C75">\d</span><span style="color:#383A42;--shiki-dark:#D19A66">+</span><span style="color:#CA1243;--shiki-dark:#E06C75">/</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)[</span><span style="color:#986801;--shiki-dark:#D19A66">0</span><span style="color:#383A42;--shiki-dark:#ABB2BF">]</span></span><span class="line"><span style="color:#CA1243;--shiki-dark:#C678DD">                                    &#125;</span><span style="color:#50A14F;--shiki-dark:#98C379">" mutex="true" preload="none" theme="var(--efu-main)" data-lrctype="0">&#x3C;/meting-js>&#x3C;/div>`</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#C678DD">                                    :</span><span style="color:#50A14F;--shiki-dark:#98C379"> ""</span><span style="color:#383A42;--shiki-dark:#ABB2BF">;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E06C75">                                video</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#E06C75"> video</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#C678DD">                                    ?</span><span style="color:#50A14F;--shiki-dark:#98C379"> `&#x3C;div class="bber-video">&#x3C;video src="</span><span style="color:#CA1243;--shiki-dark:#C678DD">$&#123;</span><span style="color:#383A42;--shiki-dark:#E06C75">video</span><span style="color:#383A42;--shiki-dark:#ABB2BF">[</span><span style="color:#986801;--shiki-dark:#D19A66">0</span><span style="color:#383A42;--shiki-dark:#ABB2BF">]</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#ABB2BF">                                        .</span><span style="color:#4078F2;--shiki-dark:#61AFEF">replace</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E06C75">playerRegex</span><span style="color:#50A14F;--shiki-dark:#ABB2BF">, </span><span style="color:#CA1243;--shiki-dark:#98C379">"</span><span style="color:#50A14F;--shiki-dark:#98C379">$1</span><span style="color:#CA1243;--shiki-dark:#98C379">"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#ABB2BF">                                        .</span><span style="color:#4078F2;--shiki-dark:#61AFEF">trim</span><span style="color:#383A42;--shiki-dark:#ABB2BF">()</span><span style="color:#CA1243;--shiki-dark:#C678DD">&#125;</span><span style="color:#50A14F;--shiki-dark:#98C379">" controls="controls" style="object-fit: cover;">&#x3C;/video>&#x3C;/div>`</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#C678DD">                                    :</span><span style="color:#383A42;--shiki-dark:#E5C07B"> content</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">match</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#0184BC;--shiki-dark:#E06C75">/&#123;</span><span style="color:#986801;--shiki-dark:#E06C75">\s</span><span style="color:#383A42;--shiki-dark:#D19A66">*</span><span style="color:#0184BC;--shiki-dark:#E06C75">bilibili</span><span style="color:#986801;--shiki-dark:#E06C75">\s</span><span style="color:#383A42;--shiki-dark:#D19A66">*</span><span style="color:#0184BC;--shiki-dark:#E06C75">(</span><span style="color:#986801;--shiki-dark:#E06C75">.</span><span style="color:#383A42;--shiki-dark:#D19A66">*?</span><span style="color:#0184BC;--shiki-dark:#E06C75">)</span><span style="color:#986801;--shiki-dark:#E06C75">\s</span><span style="color:#383A42;--shiki-dark:#D19A66">*</span><span style="color:#0184BC;--shiki-dark:#E06C75">&#125;/</span><span style="color:#A626A4;--shiki-dark:#C678DD">g</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E06C75">                                video</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#E5C07B"> Array</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">isArray</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E06C75">video</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#C678DD">                                    ?</span><span style="color:#50A14F;--shiki-dark:#98C379"> `&#x3C;div class="bber-video">&#x3C;iframe src="//player.bilibili.com/player.html?bvid=</span><span style="color:#CA1243;--shiki-dark:#C678DD">$&#123;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E06C75">                                        video</span><span style="color:#383A42;--shiki-dark:#ABB2BF">[</span><span style="color:#986801;--shiki-dark:#D19A66">0</span><span style="color:#383A42;--shiki-dark:#ABB2BF">]</span><span style="color:#50A14F;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">match</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#CA1243;--shiki-dark:#E06C75">/(</span><span style="color:#0184BC;--shiki-dark:#E06C75">BV</span><span style="color:#986801;--shiki-dark:#E06C75">\w</span><span style="color:#383A42;--shiki-dark:#D19A66">+</span><span style="color:#CA1243;--shiki-dark:#E06C75">)/</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)[</span><span style="color:#986801;--shiki-dark:#D19A66">1</span><span style="color:#383A42;--shiki-dark:#ABB2BF">]</span></span><span class="line"><span style="color:#CA1243;--shiki-dark:#C678DD">                                    &#125;$&#123;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E06C75">                                        video</span><span style="color:#383A42;--shiki-dark:#ABB2BF">[</span><span style="color:#986801;--shiki-dark:#D19A66">0</span><span style="color:#383A42;--shiki-dark:#ABB2BF">]</span><span style="color:#50A14F;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">match</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#CA1243;--shiki-dark:#E06C75">/</span><span style="color:#0184BC;--shiki-dark:#E06C75">&#123;</span><span style="color:#986801;--shiki-dark:#E06C75">\s</span><span style="color:#383A42;--shiki-dark:#D19A66">*</span><span style="color:#0184BC;--shiki-dark:#E06C75">bilibili</span><span style="color:#986801;--shiki-dark:#E06C75">\s</span><span style="color:#383A42;--shiki-dark:#D19A66">*</span><span style="color:#CA1243;--shiki-dark:#E06C75">(</span><span style="color:#986801;--shiki-dark:#E06C75">.</span><span style="color:#383A42;--shiki-dark:#D19A66">*?</span><span style="color:#CA1243;--shiki-dark:#E06C75">)</span><span style="color:#986801;--shiki-dark:#E06C75">\s</span><span style="color:#383A42;--shiki-dark:#D19A66">*</span><span style="color:#0184BC;--shiki-dark:#E06C75">true</span><span style="color:#986801;--shiki-dark:#E06C75">\s</span><span style="color:#383A42;--shiki-dark:#D19A66">*</span><span style="color:#0184BC;--shiki-dark:#E06C75">&#125;</span><span style="color:#CA1243;--shiki-dark:#E06C75">/</span><span style="color:#A626A4;--shiki-dark:#C678DD">g</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span><span style="color:#383A42;--shiki-dark:#C678DD"> ?</span><span style="color:#CA1243;--shiki-dark:#98C379"> "</span><span style="color:#50A14F;--shiki-dark:#98C379">&#x26;autoplay=1</span><span style="color:#CA1243;--shiki-dark:#98C379">"</span><span style="color:#383A42;--shiki-dark:#C678DD"> :</span><span style="color:#CA1243;--shiki-dark:#98C379"> "</span><span style="color:#50A14F;--shiki-dark:#98C379">&#x26;autoplay=0</span><span style="color:#CA1243;--shiki-dark:#98C379">"</span></span><span class="line"><span style="color:#CA1243;--shiki-dark:#C678DD">                                    &#125;</span><span style="color:#50A14F;--shiki-dark:#98C379">" scrolling="no" bozrder="0" frameborder="no" framespacing="0" allowfullscreen="true">&#x3C;/iframe>&#x3C;/div>`</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#C678DD">                                    :</span><span style="color:#50A14F;--shiki-dark:#98C379"> ""</span><span style="color:#383A42;--shiki-dark:#ABB2BF">;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E06C75">                                link</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#E06C75"> link</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#C678DD">                                    ?</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> ((</span><span style="color:#383A42;--shiki-dark:#E06C75">type</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#E06C75"> link</span><span style="color:#383A42;--shiki-dark:#ABB2BF">[</span><span style="color:#986801;--shiki-dark:#D19A66">0</span><span style="color:#383A42;--shiki-dark:#ABB2BF">].</span><span style="color:#4078F2;--shiki-dark:#61AFEF">replace</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E06C75">linkRegex</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#50A14F;--shiki-dark:#98C379">"$2"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)),</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">                                    `&#x3C;a class="bber-content-link" href='</span><span style="color:#CA1243;--shiki-dark:#C678DD">$&#123;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E5C07B">                                        type</span><span style="color:#50A14F;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">startsWith</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#CA1243;--shiki-dark:#98C379">"</span><span style="color:#50A14F;--shiki-dark:#98C379">/</span><span style="color:#CA1243;--shiki-dark:#98C379">"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span><span style="color:#383A42;--shiki-dark:#C678DD"> ?</span><span style="color:#383A42;--shiki-dark:#E06C75"> type</span><span style="color:#383A42;--shiki-dark:#C678DD"> :</span><span style="color:#383A42;--shiki-dark:#E5C07B"> type</span><span style="color:#50A14F;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">startsWith</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#CA1243;--shiki-dark:#98C379">"</span><span style="color:#50A14F;--shiki-dark:#98C379">http</span><span style="color:#CA1243;--shiki-dark:#98C379">"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span><span style="color:#383A42;--shiki-dark:#C678DD"> ?</span><span style="color:#383A42;--shiki-dark:#E06C75"> type</span><span style="color:#383A42;--shiki-dark:#C678DD"> :</span><span style="color:#CA1243;--shiki-dark:#98C379"> "</span><span style="color:#50A14F;--shiki-dark:#98C379">https://</span><span style="color:#CA1243;--shiki-dark:#98C379">"</span><span style="color:#383A42;--shiki-dark:#56B6C2"> +</span><span style="color:#383A42;--shiki-dark:#E06C75"> type</span></span><span class="line"><span style="color:#CA1243;--shiki-dark:#C678DD">                                    &#125;</span><span style="color:#50A14F;--shiki-dark:#98C379">' target="_blank"></span><span style="color:#CA1243;--shiki-dark:#C678DD">$&#123;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E06C75">                                        link</span><span style="color:#383A42;--shiki-dark:#ABB2BF">[</span><span style="color:#986801;--shiki-dark:#D19A66">0</span><span style="color:#383A42;--shiki-dark:#ABB2BF">]</span><span style="color:#50A14F;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">replace</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E06C75">linkRegex</span><span style="color:#50A14F;--shiki-dark:#ABB2BF">, </span><span style="color:#CA1243;--shiki-dark:#98C379">"</span><span style="color:#50A14F;--shiki-dark:#98C379">$1</span><span style="color:#CA1243;--shiki-dark:#98C379">"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#C678DD">                                        ?</span><span style="color:#CA1243;--shiki-dark:#98C379"> "</span><span style="color:#50A14F;--shiki-dark:#98C379">@</span><span style="color:#CA1243;--shiki-dark:#98C379">"</span><span style="color:#383A42;--shiki-dark:#56B6C2"> +</span><span style="color:#383A42;--shiki-dark:#E06C75"> link</span><span style="color:#383A42;--shiki-dark:#ABB2BF">[</span><span style="color:#986801;--shiki-dark:#D19A66">0</span><span style="color:#383A42;--shiki-dark:#ABB2BF">]</span><span style="color:#50A14F;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">replace</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E06C75">linkRegex</span><span style="color:#50A14F;--shiki-dark:#ABB2BF">, </span><span style="color:#CA1243;--shiki-dark:#98C379">"</span><span style="color:#50A14F;--shiki-dark:#98C379">$1</span><span style="color:#CA1243;--shiki-dark:#98C379">"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#C678DD">                                        :</span><span style="color:#CA1243;--shiki-dark:#98C379"> "</span><span style="color:#50A14F;--shiki-dark:#98C379">跳转到短文指引的链接</span><span style="color:#CA1243;--shiki-dark:#98C379">"</span></span><span class="line"><span style="color:#CA1243;--shiki-dark:#C678DD">                                    &#125;</span><span style="color:#50A14F;--shiki-dark:#98C379">&#x3C;/a>`</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#C678DD">                                    :</span><span style="color:#50A14F;--shiki-dark:#98C379"> ""</span><span style="color:#383A42;--shiki-dark:#ABB2BF">;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E06C75">                                from</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#E06C75"> from</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#C678DD">                                    ?</span><span style="color:#50A14F;--shiki-dark:#98C379"> `&#x3C;div class="bber-info-from">&#x3C;i class="solitude fa-solid fa-hashtag">&#x3C;/i></span><span style="color:#CA1243;--shiki-dark:#C678DD">$&#123;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E06C75">                                    from</span><span style="color:#383A42;--shiki-dark:#ABB2BF">[</span><span style="color:#986801;--shiki-dark:#D19A66">0</span><span style="color:#383A42;--shiki-dark:#ABB2BF">]</span><span style="color:#50A14F;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">replace</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E06C75">fromRegex</span><span style="color:#50A14F;--shiki-dark:#ABB2BF">, </span><span style="color:#CA1243;--shiki-dark:#98C379">"</span><span style="color:#50A14F;--shiki-dark:#98C379">$1</span><span style="color:#CA1243;--shiki-dark:#98C379">"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"><span style="color:#CA1243;--shiki-dark:#C678DD">                                    &#125;</span><span style="color:#50A14F;--shiki-dark:#98C379">&#x3C;/div>`</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#C678DD">                                    :</span><span style="color:#50A14F;--shiki-dark:#98C379"> ""</span><span style="color:#383A42;--shiki-dark:#ABB2BF">;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E06C75">                                content</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#E06C75"> content</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">                                    .</span><span style="color:#4078F2;--shiki-dark:#61AFEF">replace</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E06C75">contentRegex</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#50A14F;--shiki-dark:#98C379">""</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">                                    .</span><span style="color:#4078F2;--shiki-dark:#61AFEF">replace</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E06C75">imageRegex</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#50A14F;--shiki-dark:#98C379">""</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">                                    .</span><span style="color:#4078F2;--shiki-dark:#61AFEF">replace</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#0184BC;--shiki-dark:#E06C75">/</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\&#123;</span><span style="color:#0184BC;--shiki-dark:#E06C75">(</span><span style="color:#986801;--shiki-dark:#E06C75">.</span><span style="color:#383A42;--shiki-dark:#D19A66">*?</span><span style="color:#0184BC;--shiki-dark:#E06C75">)</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\&#125;</span><span style="color:#0184BC;--shiki-dark:#E06C75">/</span><span style="color:#A626A4;--shiki-dark:#C678DD">g</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#50A14F;--shiki-dark:#98C379">""</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">                                    .</span><span style="color:#4078F2;--shiki-dark:#61AFEF">replace</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E06C75">linkRegex</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#50A14F;--shiki-dark:#98C379">""</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">                                    .</span><span style="color:#4078F2;--shiki-dark:#61AFEF">trim</span><span style="color:#383A42;--shiki-dark:#ABB2BF">();</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">                                return</span><span style="color:#50A14F;--shiki-dark:#98C379"> `&#x3C;li class="item"></span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">                                    &#x3C;div class="meta"></span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">                                        &#x3C;img class="no-lightbox nolazyload avatar" src="!&#123;theme.aside.card.author.img&#125;"></span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">                                        &#x3C;div class="info"></span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">                                            &#x3C;span class="bber_nick">#&#123;config.author&#125;&#x3C;/span></span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">                                            &#x3C;time class="datetime bber_date" datetime="</span><span style="color:#CA1243;--shiki-dark:#C678DD">$&#123;</span><span style="color:#383A42;--shiki-dark:#E06C75">time</span><span style="color:#CA1243;--shiki-dark:#C678DD">&#125;</span><span style="color:#50A14F;--shiki-dark:#98C379">">&#x3C;/time></span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">                                        &#x3C;/div></span></span><span class="line"><span style="color:#CA1243;--shiki-dark:#C678DD">                                        $&#123;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E06C75">                                        content</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#C678DD">                                            ?</span><span style="color:#50A14F;--shiki-dark:#98C379"> `&#x3C;a class="bber-reply" onclick="sco.toTalk('</span><span style="color:#CA1243;--shiki-dark:#C678DD">$&#123;</span><span style="color:#383A42;--shiki-dark:#E06C75">content</span><span style="color:#CA1243;--shiki-dark:#C678DD">&#125;</span><span style="color:#50A14F;--shiki-dark:#98C379">')">&#x3C;i class="solitude fa-solid fa-comment" style="font-size: 1rem;">&#x3C;/i>&#x3C;/a>`</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#C678DD">                                            :</span><span style="color:#CA1243;--shiki-dark:#98C379"> ""</span></span><span class="line"><span style="color:#CA1243;--shiki-dark:#C678DD">                                        &#125;</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">                                    &#x3C;/div></span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">                                    &#x3C;div id="bber-content"></span></span><span class="line"><span style="color:#CA1243;--shiki-dark:#C678DD">                                        $&#123;</span><span style="color:#383A42;--shiki-dark:#E06C75">content</span><span style="color:#383A42;--shiki-dark:#C678DD"> ?</span><span style="color:#50A14F;--shiki-dark:#98C379"> `&#x3C;p class="bber-content">&#x3C;span></span><span style="color:#CA1243;--shiki-dark:#C678DD">$&#123;</span><span style="color:#383A42;--shiki-dark:#E06C75">content</span><span style="color:#CA1243;--shiki-dark:#C678DD">&#125;</span><span style="color:#50A14F;--shiki-dark:#98C379">&#x3C;/span></span><span style="color:#CA1243;--shiki-dark:#C678DD">$&#123;</span><span style="color:#383A42;--shiki-dark:#E06C75">link</span><span style="color:#CA1243;--shiki-dark:#C678DD">&#125;</span><span style="color:#50A14F;--shiki-dark:#98C379">&#x3C;/p>`</span><span style="color:#383A42;--shiki-dark:#C678DD"> :</span><span style="color:#CA1243;--shiki-dark:#98C379"> ""</span><span style="color:#CA1243;--shiki-dark:#C678DD">&#125;</span></span><span class="line"><span style="color:#CA1243;--shiki-dark:#C678DD">                                        $&#123;</span><span style="color:#383A42;--shiki-dark:#E06C75">image</span><span style="color:#383A42;--shiki-dark:#C678DD"> ?</span><span style="color:#50A14F;--shiki-dark:#98C379"> `&#x3C;div class="bber-content-img"></span><span style="color:#CA1243;--shiki-dark:#C678DD">$&#123;</span><span style="color:#383A42;--shiki-dark:#E06C75">image</span><span style="color:#CA1243;--shiki-dark:#C678DD">&#125;</span><span style="color:#50A14F;--shiki-dark:#98C379">&#x3C;/div>`</span><span style="color:#383A42;--shiki-dark:#C678DD"> :</span><span style="color:#CA1243;--shiki-dark:#98C379"> ""</span><span style="color:#CA1243;--shiki-dark:#C678DD">&#125;</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">                                    &#x3C;/div></span></span><span class="line"><span style="color:#CA1243;--shiki-dark:#C678DD">                                    $&#123;</span><span style="color:#383A42;--shiki-dark:#E06C75">aplayer</span><span style="color:#CA1243;--shiki-dark:#C678DD">&#125;</span></span><span class="line"><span style="color:#CA1243;--shiki-dark:#C678DD">                                    $&#123;</span><span style="color:#383A42;--shiki-dark:#E06C75">video</span><span style="color:#CA1243;--shiki-dark:#C678DD">&#125;</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">                                    &#x3C;div class="bber-bottom"></span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">                                        &#x3C;div class="bber-info"></span></span><span class="line"><span style="color:#CA1243;--shiki-dark:#C678DD">                                            $&#123;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E5C07B">                                            item</span><span style="color:#50A14F;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E5C07B">content</span><span style="color:#50A14F;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">includes</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#CA1243;--shiki-dark:#98C379">"</span><span style="color:#50A14F;--shiki-dark:#98C379">#top</span><span style="color:#CA1243;--shiki-dark:#98C379">"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#C678DD">                                                ?</span><span style="color:#50A14F;--shiki-dark:#98C379"> `&#x3C;div class="bber-info-top">&#x3C;i class="solitude fa-solid fa-thumbtack">&#x3C;/i>置顶&#x3C;/div>`</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#C678DD">                                                :</span><span style="color:#CA1243;--shiki-dark:#98C379"> ""</span></span><span class="line"><span style="color:#CA1243;--shiki-dark:#C678DD">                                            &#125;</span></span><span class="line"><span style="color:#CA1243;--shiki-dark:#C678DD">                                            $&#123;</span><span style="color:#383A42;--shiki-dark:#E06C75">from</span><span style="color:#CA1243;--shiki-dark:#C678DD">&#125;</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">                                        &#x3C;/div></span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">                                    &#x3C;/div></span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">                                &#x3C;/li>`</span><span style="color:#383A42;--shiki-dark:#ABB2BF">;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">                            &#125;</span></span></code></pre></td></tr></tbody></table></figure><p>主要的东西就是 solitude/layout/includes/page/says.pug里的内嵌脚本，因为有两种风格所以只能写在 pug 里，非 Solitude主题基本只需要改一下最后生成的 HTML 片段即可。</p>]]></content:encoded>
      
      
      <category domain="https://blog.hpcesia.com/categories/%E5%B0%8F%E5%B1%8B%E7%9B%B8%E5%85%B3/">小屋相关</category>
      
      
      <category domain="https://blog.hpcesia.com/tags/Hexo/">Hexo</category>
      
      <category domain="https://blog.hpcesia.com/tags/%E5%8D%9A%E5%AE%A2/">博客</category>
      
      <category domain="https://blog.hpcesia.com/tags/Solitude/">Solitude</category>
      
      <category domain="https://blog.hpcesia.com/tags/Memos/">Memos</category>
      
      
      <comments>https://blog.hpcesia.com/posts/a604572f/#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>优化扫描版电子书指北</title>
      <link>https://blog.hpcesia.com/posts/2dcf5c58/</link>
      <guid>https://blog.hpcesia.com/posts/2dcf5c58/</guid>
      <pubDate>Sun, 10 Nov 2024 06:44:07 GMT</pubDate>
      
        
        
          
          
      <description>&lt;h2 id=&quot;什么是优化的电子书&quot;&gt;什么是优化的电子书&lt;/h2&gt;
&lt;p&gt;如果不看内容，只看阅读的方便程度，一本优秀的电子书应该是怎样的？最优秀的自然是由制作优良的
&lt;span class=&quot;math inline&quot;&gt;&#92;(&#92;LaTeX&#92;)&lt;/span&gt; 或 Typst</description>
          
        
      
      
      
      <content:encoded><![CDATA[<h2 id="什么是优化的电子书">什么是优化的电子书</h2><p>如果不看内容，只看阅读的方便程度，一本优秀的电子书应该是怎样的？最优秀的自然是由制作优良的<span class="math inline">\(\LaTeX\)</span> 或 Typst 源码直接编译生成的PDF文件，有可跳转的目录，有目录书签，有可搜索文本。但这种电子书除非是开源的，否则只会在制作者的小圈子内流通，不会轻易流通。次一级，便是制作优良的扫描版电子书了。</p><p>一个制作优良的扫描版电子书应该是怎样的？文字图片清晰，有目录书签与可搜索文本，这是我对制作优良的扫描版电子书的定义。我在学习一些专业课程、获取某些专业资料时，经常会遇到一些扫描版的电子书，这些电子书有一部分已经制作好了正确的目录书签，方便进行阅读，但文本不可搜索；更多的只有页码作为书签，甚至完全没有任何书签。这样的电子书显然是不方便阅读的，会极大降低学习效率，因此，我选择自力更生，对这些扫描版电子书进行优化。</p><h2 id="怎么优化扫描版电子书">怎么优化扫描版电子书</h2><p>考虑到可能的版权问题，我选择使用我自己的课程作业pdf，通过开源在线项目 <a href="https://lookscanned.io/zh/" rel="external nofollow noreferrer">LookScanned</a> 将其变成扫描件来演示。</p><div class="repo-card"><a class='name-lw0xmk750 repo-title fancybox' href="https://github.com/rwv/lookscanned.io" rel="external nofollow noreferrer"></a><p class='desc-lw0xmk750 repo-desc'></p><div class="repo-gist"><i class="fas fa-star"></i><span class='star-lw0xmk750'></span><i class="fas fa-code-branch"></i><span class='fork-lw0xmk750'></span></div><img class='lang-lw0xmk750 repo-language no-lightbox' /><script>    fetch('https://api.github.com/repos/rwv/lookscanned.io')      .then(res => res.json())      .then(data => {        document.querySelector('.name-lw0xmk750').innerText = data.name;        document.querySelector('.desc-lw0xmk750').innerText = data.description;        document.querySelector('.star-lw0xmk750').innerText = data.stargazers_count;        document.querySelector('.fork-lw0xmk750').innerText = data.forks_count;        document.querySelector('.lang-lw0xmk750').src = 'https://skillicons.dev/icons?i=' + data.language.toLowerCase();    });  </script></div><h3 id="图像处理">图像处理</h3><p>首先，需要将 PDF 的图像全部提取出来，这里 Windows 用户可以使用维护了12 年、近两年开源的老牌免费 PDF 处理工具箱「PDF 补丁丁」：</p><div class="repo-card"><a class='name-8h72po95w repo-title fancybox' href="https://github.com/wmjordan/PDFPatcher" rel="external nofollow noreferrer"></a><p class='desc-8h72po95w repo-desc'></p><div class="repo-gist"><i class="fas fa-star"></i><span class='star-8h72po95w'></span><i class="fas fa-code-branch"></i><span class='fork-8h72po95w'></span></div><img class='lang-8h72po95w repo-language no-lightbox' /><script>    fetch('https://api.github.com/repos/wmjordan/PDFPatcher')      .then(res => res.json())      .then(data => {        document.querySelector('.name-8h72po95w').innerText = data.name;        document.querySelector('.desc-8h72po95w').innerText = data.description;        document.querySelector('.star-8h72po95w').innerText = data.stargazers_count;        document.querySelector('.fork-8h72po95w').innerText = data.forks_count;        document.querySelector('.lang-8h72po95w').src = 'https://skillicons.dev/icons?i=' + data.language.toLowerCase();    });  </script></div><p>macOS 与 Linux 用户可以使用下面的项目作为替代品：</p><div class="repo-card"><a class='name-201du00u4 repo-title fancybox' href="https://github.com/Stirling-Tools/Stirling-PDF" rel="external nofollow noreferrer"></a><p class='desc-201du00u4 repo-desc'></p><div class="repo-gist"><i class="fas fa-star"></i><span class='star-201du00u4'></span><i class="fas fa-code-branch"></i><span class='fork-201du00u4'></span></div><img class='lang-201du00u4 repo-language no-lightbox' /><script>    fetch('https://api.github.com/repos/Stirling-Tools/Stirling-PDF')      .then(res => res.json())      .then(data => {        document.querySelector('.name-201du00u4').innerText = data.name;        document.querySelector('.desc-201du00u4').innerText = data.description;        document.querySelector('.star-201du00u4').innerText = data.stargazers_count;        document.querySelector('.fork-201du00u4').innerText = data.forks_count;        document.querySelector('.lang-201du00u4').src = 'https://skillicons.dev/icons?i=' + data.language.toLowerCase();    });  </script></div><p>Stirling-PDF的图像提取功能似乎不够完善，不能直接提取扫描件的图像，需要使用 PDF转图像功能才能正常导出图像，速度慢不少。</p><p>提取出全部图像后，就该对其进行处理了。Scantailor Advanced是一个开源的扫描件处理软件，虽然其基于的 Scantailor 已经 Public Archive了，但是依旧好用。</p><div class="repo-card"><a class='name-4gmam8das repo-title fancybox' href="https://github.com/4lex4/scantailor-advanced" rel="external nofollow noreferrer"></a><p class='desc-4gmam8das repo-desc'></p><div class="repo-gist"><i class="fas fa-star"></i><span class='star-4gmam8das'></span><i class="fas fa-code-branch"></i><span class='fork-4gmam8das'></span></div><img class='lang-4gmam8das repo-language no-lightbox' /><script>    fetch('https://api.github.com/repos/4lex4/scantailor-advanced')      .then(res => res.json())      .then(data => {        document.querySelector('.name-4gmam8das').innerText = data.name;        document.querySelector('.desc-4gmam8das').innerText = data.description;        document.querySelector('.star-4gmam8das').innerText = data.stargazers_count;        document.querySelector('.fork-4gmam8das').innerText = data.forks_count;        document.querySelector('.lang-4gmam8das').src = 'https://skillicons.dev/icons?i=' + data.language.toLowerCase();    });  </script></div><p>在软件中新建项目，选择之前导出的图片，就可以开始图片处理了。</p><figure><img src= "" data-lazy-src="https://bu.dusays.com/2024/11/10/67303cbd62a87.webp"alt="Scantailor Advanced 页面" /><figcaption aria-hidden="true">Scantailor Advanced 页面</figcaption></figure><p>页面是全英文，没有中文翻译，但是看懂难度不大。点击右上角栏目右边的小绿三角就可以对所有页面执行当前的操作了，基本全部使用auto即可，效果相当不错。需要注意，右侧的选项调整默认只对当前页面生效，需要使用「Applyto」按钮来应用到全部页面。</p><figure><img src= "" data-lazy-src="https://bu.dusays.com/2024/11/10/67303e796cf0a.webp"alt="Scantailor Advanced 页面" /><figcaption aria-hidden="true">Scantailor Advanced 页面</figcaption></figure><p>需要注意的是，中文文档可能需要在 output 中关闭「Savitzky-Golaysmoothing」，不然文字会糊成一团。DPI可以调高一点，不然容易看不清，全是黑白页面的话 DPI拉高，文件大小也不会太大。</p><p>一路优化完成后，只要 output中处理了全部页面且效果满意，就可以关闭软件了，输出的图片会保存在 out目录中。接着使用 PDFPatcher 或 Stirling-PDF 合并导出的图片为PDF，第一步处理大功告成。</p><p><img src= "" data-lazy-src="https://bu.dusays.com/2024/11/10/673050598911e.webp"alt="效果 1" /> <imgsrc="https://bu.dusays.com/2024/11/10/6730509a54c01.webp"alt="效果 2" /></p><p>可以看出文字效果不错，图像效果有点差。</p><h3 id="ocr">OCR</h3><p>第二步，是对 PDF 做 OCR 处理，这里需要用到一个开源项目：</p><div class="repo-card"><a class='name-2foek88vj repo-title fancybox' href="https://github.com/hiroi-sora/Umi-OCR" rel="external nofollow noreferrer"></a><p class='desc-2foek88vj repo-desc'></p><div class="repo-gist"><i class="fas fa-star"></i><span class='star-2foek88vj'></span><i class="fas fa-code-branch"></i><span class='fork-2foek88vj'></span></div><img class='lang-2foek88vj repo-language no-lightbox' /><script>    fetch('https://api.github.com/repos/hiroi-sora/Umi-OCR')      .then(res => res.json())      .then(data => {        document.querySelector('.name-2foek88vj').innerText = data.name;        document.querySelector('.desc-2foek88vj').innerText = data.description;        document.querySelector('.star-2foek88vj').innerText = data.stargazers_count;        document.querySelector('.fork-2foek88vj').innerText = data.forks_count;        document.querySelector('.lang-2foek88vj').src = 'https://skillicons.dev/icons?i=' + data.language.toLowerCase();    });  </script></div><p>这是一个支持多种开源 OCR 模型的开源项目，支持 Windows 7 及以上的Windows x64 平台与 Linux x64 平台，可以方便地将扫描版的 PDF转换为带有可搜索图像文本的 PDF，同时使用了嵌入 Python解释器，可以让小白开箱即用。</p><p><img src= "" data-lazy-src="https://bu.dusays.com/2024/11/09/672f74141753d.webp"alt="Umi-OCR 页面展示" /> <imgsrc="https://bu.dusays.com/2024/11/10/673052ab0ee80.webp"alt="Umi-OCR 页面展示" /></p><p>对于 macOS 用户，由于该项目作者没钱买mac<del>（好真实的理由）</del>，所以目前只能通过 Docker或虚拟机的方式来使用。</p><p>由于该软件界面一目了然，因此不做过多说明，选择批量文档，内容提取模式选择「混合OCR/原文本」即可。</p><h3 id="目录书签制作">目录书签制作</h3><p>第三步，则是制作目录书签。这里同样需要用到一个开源项目：</p><div class="repo-card"><a class='name-xiw7izvi2 repo-title fancybox' href="https://github.com/chroming/pdfdir" rel="external nofollow noreferrer"></a><p class='desc-xiw7izvi2 repo-desc'></p><div class="repo-gist"><i class="fas fa-star"></i><span class='star-xiw7izvi2'></span><i class="fas fa-code-branch"></i><span class='fork-xiw7izvi2'></span></div><img class='lang-xiw7izvi2 repo-language no-lightbox' /><script>    fetch('https://api.github.com/repos/chroming/pdfdir')      .then(res => res.json())      .then(data => {        document.querySelector('.name-xiw7izvi2').innerText = data.name;        document.querySelector('.desc-xiw7izvi2').innerText = data.description;        document.querySelector('.star-xiw7izvi2').innerText = data.stargazers_count;        document.querySelector('.fork-xiw7izvi2').innerText = data.forks_count;        document.querySelector('.lang-xiw7izvi2').src = 'https://skillicons.dev/icons?i=' + data.language.toLowerCase();    });  </script></div><p>该项目可以将给定的目录作为书签嵌入到 PDF当中。目录的获取有几种办法，首先是去一些有该电子书信息的的网站上查找是否有目录信息，有的话用网站上的最好；如果找不到现成信息，则可以使用刚才OCR 好的 PDF，利用书里的目录来制作，但由于 OCR识别的不稳定性，这种方式通常需要手动修正文本。</p><figure><img src= "" data-lazy-src="https://bu.dusays.com/2024/11/10/6730548cd7346.png"alt="制作目录" /><figcaption aria-hidden="true">制作目录</figcaption></figure><p>如图所示，该工具支持自定义正则表达式来匹配目录层级，也支持设置页差，可以方便快捷地将目录书签注入到PDF 中。</p><h3 id="效果演示">效果演示</h3><p>将源文件和制作的优化版扫描文件进行对比，可以看出效果还是不错的：</p><p><img src= "" data-lazy-src="https://bu.dusays.com/2024/11/10/6730556110ae3.webp"alt="扫描版" /> <imgsrc="https://bu.dusays.com/2024/11/10/673055b354a10.webp"alt="源文件" /></p>]]></content:encoded>
      
      
      <category domain="https://blog.hpcesia.com/categories/%E7%BB%8F%E9%AA%8C%E8%AE%B0%E5%BD%95/">经验记录</category>
      
      
      <category domain="https://blog.hpcesia.com/tags/%E7%94%B5%E5%AD%90%E4%B9%A6/">电子书</category>
      
      <category domain="https://blog.hpcesia.com/tags/PDF/">PDF</category>
      
      
      <comments>https://blog.hpcesia.com/posts/2dcf5c58/#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>周寄（一）| 忙里偷闲</title>
      <link>https://blog.hpcesia.com/posts/ae952b18/</link>
      <guid>https://blog.hpcesia.com/posts/ae952b18/</guid>
      <pubDate>Sat, 09 Nov 2024 07:27:11 GMT</pubDate>
      
      <description>本次周记记录了在 11 月的个人博客优化工作与生活日常。</description>
      
      
      
      <content:encoded><![CDATA[<p>上回的月记还说自己没那信心周更，但这周事情不少，所以还是可以写一篇出来的。</p><p>为了与之前的月记无缝衔接，本次周记记录时间为：11.01 - 11.08</p><h2 id="小屋装修">小屋装修</h2><h3 id="更换网站部署">更换网站部署</h3><p>这周我把网站部署从 GitHub Page 切换到 Netlify 了。GitHub Page用的好好的，为什么要换呢？因为 Netlify速度确实快。得益于较高的审核门槛，Netlify 不像 Vercel那样默认域名被完全屏蔽，挂上自己域名以后更是速度相当不错，比 GitHub Page走 Cloudflare CDN 速度要快一些： <imgsrc="https://bu.dusays.com/2024/11/04/6728b30a4e18b.webp"alt="GitHub Page + Cloudflare CDN 测速" /> <imgsrc="https://bu.dusays.com/2024/11/04/6728b4497b071.webp"alt="Netlify 测速" /> 效果可以说是相当明显了。我还听了<ahref="https://www.yoghurtlee.com/">小氯</a>的建议，挂了一下<ahref="https://github.com/xingpingcn/enhanced-FaaS-in-China">优选线路</a>，速度更快了：<img src= "" data-lazy-src="https://bu.dusays.com/2024/11/05/6729d69e32209.webp"alt="优选线路 Netlify 测速" /></p><p>另一方面则是，我认为 GitHub Page应该留给更正经的项目的页面，而不是我的个人博客。由于我之前一段时间使用的是github.io 域名，且做过 SEO，因此我现在将 GitHub Page 指向了 blog-backup域名，该域名又会 301重定向到主域名，以保证搜索结果正确跳转。等到我有合适的项目主页放到GitHub Page 的时候，大概就不需要再考虑之前博客做的 SEO 了。</p><h3 id="友链朋友圈">友链朋友圈</h3><p>我看友链朋友圈这东西眼馋不少时间了<del>（主要是我没服务器不能部署RSS）</del>，所以这周也花了点时间整了一个<ahref="https://github.com/willow-god/Friend-Circle-Lite">轻量友链朋友圈</a>，目前姑且是作为我个人的丐版RSS 来使用，等后续下定决心买云服务器了再自建一个 RSS 来用。</p><h3 id="其他琐碎的装修">其他琐碎的装修</h3><p>剩下的就是一些琐碎的装修内容了，比如改了下右键菜单「引用到评论」的逻辑，改了改游戏页面，往页脚加了只<ahref="https://bu.dusays.com/2024/11/05/6729fd1e96b9d.webp">探头的七七</a>。</p><h3 id="排版">排版</h3><h4 id="markdown-标题">Markdown 标题</h4><p>最近闲来无事，打开 Bing 的站点管理工具看了一眼，提示我页面中<code>&lt;h1&gt;</code> 标签过多。我发现这是我的 Markdown书写风格不太好导致的。知名 Markdown 语法检查器 <ahref="https://github.com/DavidAnson/markdownlint">markdownlint</a> 的<ahref="https://github.com/DavidAnson/markdownlint/blob/main/doc/Rules.md#md025---multiple-top-level-headings-in-the-same-document">第25 条规则</a>指出，一个 Markdown 文件中，一级标题<code># Heading 1</code>应该用作文章标题，有且只有一个，因此正文中最高的标题层级只能是二级标题<code>## Heading 2</code>。但是我自己在写文章的时候，文章分段标题都是使用的一级标题，所以我需要对其进行修改。</p><p>最开始我打算使用正则表达式，批量修改所有文章的标题层级。但是经过一番尝试，由于代码块中的代码注释也可能以<code>#</code>开头，正则表达式要考虑的东西有点多，果断放弃了。但幸运的是，我渲染文章使用的引擎是<ahref="https://github.com/hexojs/hexo-renderer-pandoc">hexo-renderer-pandoc</a>，而pandoc显然考虑到了这一问题，提供了一个选项来控制标题层级：<code>--shift-heading-level-by=NUMBER</code>，于是我愉快的避免了为此花时间搓一个重复的轮子。</p><h4 id="行内公式与中文混排">行内公式与中文混排</h4><p>我在翻看自己博客的时候，总有一点让我非常在意，那就是行间公式和中文的混排效果：<img src= "" data-lazy-src="https://bu.dusays.com/2024/11/06/672b07ea23dc0.png"alt="之前行内公式与中文混排效果" />可以发现，行间公式与中文混排时，右边是没有间距的，看着非常难受。但是当我在本地使用<code>hexo server</code>时，混排效果却是正常的两边都有间距，而按正常步骤生成静态页面后使用<code>hexo server --static</code>，则是没有右边间距的混排效果。</p><p>那么问题来了，是什么影响了这个混排效果？思来想去，发现是因为我使用了Gulp 来压缩 html文件，结果把正常的间距给压缩没了。翻了下文档，选择在使用gulp-html-minifier-terser 压缩 html 时加上<code>conservativeCollapse: true</code> 这个参数来解决问题。</p><h4 id="hello-autocorrect-and-goodbye">Hello, AutoCorrect, andGoodbye</h4><p>我在<ahref="https://www.eallion.com/cjk-punctuation/">到处乱逛</a>的时候，发现了<a href="https://github.com/huacnlee/autocorrect" rel="external nofollow noreferrer">AutoCorrect</a>这个好东西。这个工具可以自动提示文章中英文混排的一些错误，并且可以使用命令行或VSCode 插件进行自动格式化。</p><p>这听起来相当诱人——尤其是我写文章的时候一般都会手动在中英文之间加上空格，而使用这个插件以后，我就不用再花费时间来手打空格了。但是只使用了十分钟，我便卸载了AutoCorrect 的 VSCode 插件。这是因为 AutoCorrect的自动格式化在各式各样的 Markdown 方言面前有些发力。例如 Hexo支持文章中以 <code>&#123;% tag_name ..args %&#125;</code> 的方式来使用<ahref="https://hexo.io/zh-cn/docs/tag-plugins">标签插件</a>，但是AutoCorrect 的自定义 <code>textRules</code>不支持使用正则匹配来忽略这些特殊方言语法，而我又经常需要使用这些标签插件，因此我最终还是卸载了这个插件。</p><h4 id="hello-赫蹏">Hello, 赫蹏</h4><p><ahref="https://github.com/sivan/heti">赫蹏</a>（hètí）是专为中文内容展示设计的排版样式增强样式/脚本。因为我博客不需要使用赫蹏的字体，因此我按照下面这篇文章，提取了赫蹏的标点压缩和自动中英混排间距功能放到了博客里。</p><a class="tag-link" href="https://www.eallion.com/cjk-punctuation/" rel="external nofollow noreferrer" target="_blank"><div class="tag-link-tips">引用站外链接</div><div class="tag-link-bottom"><div class="tag-link-left"><i class="solitude fas fa-link"></i></div><div class="tag-link-right"><div class="tag-link-title">博客排版 - 挤压中文标点符号</div><div class="tag-link-sitename">大大的小蜗牛</div></div><i class="solitude fas fa-chevron-right"></i></div></a><p>效果还是不错的： <imgsrc="https://bu.dusays.com/2024/11/06/672b1602b5f55.png"alt="对比效果" /></p><p>结果到了手机端一看，括号和逗号直接连在一起了，排查后发现，是因为霞鹜文楷最近支持了OpenType 的 <code>halt</code>特性。不知道为什么只有移动端的字体应用了该特性，导致 PC端检查的时候没问题，移动端一看标点重叠，于是用 CSS 的<code>@supports</code> 规则把这个 bug 修复了。希望火狐后续能支持<code>text-spacing-trim</code> 特性吧。</p><p>另外，不知道为什么，自从我开始用赫蹏以后，手机端就不能正确显示霞鹜文楷的字体了，很怪。</p><h2 id="体测">体测</h2><p>非常不幸的，我这周要进行体测。厦大的体测规则是，只要本学期选修了体育课，就要参加该体育课老师所组织的体测，而我这学期选修了羽毛球课，因此必须参加。上次的<a href="/posts/41922e15/" title="月寄 | 无事发生…吗？">月记</a>里说过，我的膝盖受了擦伤。虽然不算严重，恢复得也还不错，但在周一的体测的时候，擦伤是没有完全恢复的。幸运的是，这周的体测不用考一千米——下周才考，所以我至少不会因为大量流汗感受伤口撒盐的痛苦了。</p><h2 id="期中">期中</h2><p>这周正好还是期中周，虽然大四基本没啥课了，但是为了凑够学分，我还是选了两门据说比较水的课：《经济学基础》和《多复变函数论》。</p><p>《多复变函数论》课程本身并不水，老师讲的很好，每节课都是黑板哗哗写，但是——我听不懂（悲）。说这门课「水」，其实是因为这门课是选修课，一般不会卡人，而且老师也知道这门课难度比较大，所以考的基本都是PPT上的东西，而且期中并没有考试，而是布置了整个课程唯一一次作业，内容也都是PPT 上的东西，只要看懂 PPT上的定理证明，自己写一遍就行了。唯一比较花时间的是老师的 PPT 没用 XeTaX生成，导致中文复制出来全是乱码，OCR 又不好处理公式，只能慢慢手打了。</p><p>《经济学基础》倒是真水课，课程基本全念PPT，作业也简单——导致我整个上半学期的课要么摸鱼要么翘了。因为保研已经结束了，绩点没啥用，所以这门课只需要不挂科，拿到学分就算成功。因此，直到考试前一天，我才开始突击复习<del>（预习）</del>，在B站上看一些经济学基础速成的视频，做一下往年的试卷，确保不会挂科。事实证明速成确实不靠谱，考试的时候一堆东西都是完全不清楚，不过靠着一点常识和推理，多少还是把大部分的题都做了，应该能及格……吧。</p>]]></content:encoded>
      
      
      <category domain="https://blog.hpcesia.com/categories/%E7%94%9F%E6%B4%BB%E7%82%B9%E6%BB%B4/">生活点滴</category>
      
      
      <category domain="https://blog.hpcesia.com/tags/%E5%91%A8-%E6%9C%88%E8%AE%B0/">周/月记</category>
      
      
      <comments>https://blog.hpcesia.com/posts/ae952b18/#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>月寄 | 无事发生…吗？</title>
      <link>https://blog.hpcesia.com/posts/41922e15/</link>
      <guid>https://blog.hpcesia.com/posts/41922e15/</guid>
      <pubDate>Fri, 01 Nov 2024 08:31:20 GMT</pubDate>
      
      <description>本次月记记录了生日、寻找毕业论文导师的经历以及笔记本风扇损坏等问题。通过自学和开源项目改进了博客代码高亮功能，并探讨了构建多端同步编写博文的工作流方案。</description>
      
      
      
      <content:encoded><![CDATA[<p>因为看到一些好看的周记，所以也打算自己写点类似的东西。但是我实在是没有周更的信心（无论是从更新文字量还是从每周可写的经历量来说都是如此），因此决定先写个月记试试水。</p><p>本次月记记录时长为 5 周：9.27 - 10.31。</p><h2 id="生日">生日</h2><p>是的，其实记录时长为五周就是为醋包的饺子——这样才能包含我的 21岁生日。</p><p>今年的生日似乎并没有什么特别的，仍然是自己一个人过，已经习惯如此了。回望整个大学生活，我似乎都没有多少社交，平日总是待在宿舍打游戏、写代码、赶作业，偶尔出去骑车也是独自一人默默骑行；出去旅游要么是为了参加漫展，要么是被父母拉着一起；除了舍友外，只有寥寥几个点头之交的同学，甚至三年来没有一个交流超过五句话的同龄异性。但我却没觉得缺了什么，或许是性格使然？只是每次父母半开玩笑地问我有没有耍朋友时只能尬笑着糊弄过去。</p><p>其实本来是打算看场电影的，因为那几天正好要去万达影城，线下取原神和万达联动里买的一些周边。但可惜的是，翻了一圈当天的电影，没一个感兴趣的，唯一感兴趣的流浪地球2 的 3D版，也只有离得很远的几个影城还在上映，所以只能拿了周边就走人。但好歹是生日，总得犒劳一下自己吧。于是我在去万达影城的路上顺便在B站刷了刷厦门的各种自助餐厅的视频，选定了一家顺路的牛肉自助，准备拿完周边就去吃顿饱的。<img src= "" data-lazy-src="https://bu.dusays.com/2024/10/28/671f2ba2934b1.webp"alt="牛肉自助" /></p><p>说实话，自助味道不错——至少对得起价格。我吃得挺撑，炫了差不多二十盘现切牛肉，不知道算不算给老板上课？不过厦门能人这么多，我这点食量大抵是算不上号的吧（笑）。</p><h2 id="毕业论文导师">毕业论文导师</h2><p>在国庆假期前几天，我们年级的教秘在通知群里发了个通知：该找自己的本科毕业论文导师了！</p><p>这实在是个晴天霹雳——我完全没有任何找导师的准备。更何况，这个毕业论文导师还是双向选择的，而我，一个专业课常年在挂科边缘试探的摆烂人，真的不会找一个导师就被拒一个吗（悲）。</p><p>但咨询了下消息灵通的同学，毕业论文导师貌似没有保底分配的机制，所以只能硬着头皮去找导师了。从同学那里抄了份邮件模板，我便用学校的邮箱给数院唯一一个研究方向涉及计算机应用，也是唯一一个研究方向我感兴趣的教授发了封申请的邮件。</p><p>显然，如果事情进展顺利，就不会有接下来这几段了。等到十一假期刚开始时，我收到了教授的回复：名额满了。看来你虾数院唯一和方向和计算机密切相关的教授真的很受欢迎（悲）。整理了下心态，我就找了个研究方向起码是计算数学的教授又发了份邮件，等待教授的回复。<img src= "" data-lazy-src="https://bu.dusays.com/2024/11/01/6724928bb4559.webp"alt="噔噔咚" /></p><p>这一等，就是一整个国庆假期。每天我都打开邮箱，期待有教授的回复，但是等到的都只有毫无变化的收件箱。待到十一假期结束，我也算是死了心了——大抵这位教授确实是不看邮箱吧。毕业论文导师的申报到16号就截止了，还有一周时间，我必须抓紧再找一个教授问问了。</p><p>这次我选择想办法找个冷门的老师。我对照着我们学院的官网上的师资名单和可选择的导师列表，选择了一个看起来应该不会有多少人专门去选的导师，再次发了一封模板式的邮件过去。第二天，我就得到了老师的回复——CanCan Need 成绩单。</p><p>好在我虽然大部分偏理论的课程绩点都是 1 和 2开头，但总归是有那么一两个满绩的偏应用的专业课撑场面的，至少没让我再次被拒。很快，我便与预备导师约好了时间面谈。</p><p>到了面谈的时候，略过一小段客套话，我便又听到了了一个噩耗：这位预备导师主要做的是理论分析——而从我的成绩单上就能看出，我对理论分析是一窍不通。好在我的预备导师也研究过我的成绩单，知道我“代码的课分都贼高，理论的课分就不怎么样”，于是为我找了个只要花时间啃代码就能做的题目（具体内容就不透露了）。</p><p>就此，可喜可贺，我至少在申报截止前成功找到了本科毕业论文导师，并且导师看起来人还不错，实在是可喜可贺呐。</p><h2 id="国庆">国庆</h2><p>不知道看这篇文章的朋友们，国庆假期都去哪玩了呢？</p><p>我……哪里也没去，整个假期都待在宿舍里折腾博客和备战考研。国庆假期里宿舍晚上不会断电，而我的舍友都出去玩去了，这也就意味着——我可以尽情通宵辣！</p><p>整个国庆假期，我通宵搓博客代码搓了三次<del>（你见过凌晨四点的厦大校园吗）</del>，属实是昼夜颠倒了<del>（其实这段文字在码下来的时候正是凌晨四点，我躺床上半天睡不着，于是怒而编写本文）</del>。</p><p>值得一提的是，由于国庆假期玩得太疯，导致我完全忘了国庆假期什么时候结束。于是在国庆假期的最后一天，星期一的早晨，我怀揣着对舍友全体翘课的震惊，背着羽毛球拍到了室内羽毛球馆门口——然后看到了紧闭的大门。这时候我才反应过来：woc，该不会还在放假吧！（乐）</p><p>在常冒泡的 QQ群分享了这一发现，并收获了十几个「🐷？」的回复后，我终于确认现在确实还在放假的事实——我白早起白通勤了（悲）。</p><h2 id="受伤">受伤</h2><p>作为偶尔出去环岛骑行的单车佬，受点擦伤属于是家常便饭了。但这次不一样——我是在宿舍楼下推车的时候摔的。当时正是下课回宿舍，我把自行车推进宿舍大门，想着单脚踩在踏板上滑行大概会更快<del>（也更帅）</del>，于是就把一只脚踩在自行车上开始滑行——然后就直直地摔了下去。</p><p>于是我就喜提了膝盖擦伤，图就不在这篇文章里发了，目前草稿箱里放了一篇擦伤恢复记录，后续大概会发出来，用于记录我自己的表浅擦伤处理经验<del>（摔车摔多了导致的）</del>。</p><h2 id="考研">考研</h2><p>说实话，我自己对考研准备并不充分。一直到开始报名的时候，我都没想好到底要考什么学校，考什么科目。但是时间上已经来不及了，于是我选择了少数计算机还在考自命题而不是408 的学校——虽然他复试还是会考 408，但总归是能多点时间复习了。</p><h2 id="风扇">风扇</h2><p>最近，我的笔记本风扇突然坏了——大概是我平时喜欢把笔记本竖起来当副屏使导致的。在这之前我的桌面是这样的<del>（口瓜，是二次元，大家快退啊）</del>：<img src= "" data-lazy-src="https://bu.dusays.com/2024/11/01/672493e71d4d5.webp"alt="曾经的桌面" /></p><p>总之，风扇就是这么突然的坏了。其实影响本身不算特别大：时不时会发出很大声的嗡嗡异响，没异响的时候长时间打游戏容易直接过热关机。不长时间打游戏的话，还可以凑合着用——直到有一天我带着笔记本去了教室，然后风扇正好在上课的时候响起来了（万众瞩目.webp）。于是我赶紧关机，并开始在某宝上搜索我的笔记本的替换风扇。</p><p>不幸的是，我的笔记本是一个小众的型号，所以我花了半节课的时间也没搜到我的型号对应的风扇。但办法总比困难多：按某宝商品介绍的说法，一些风扇只是颜色不一样，但是电压、形状和孔位是一致的，也就是说只要找到和我的笔记本风扇除了颜色外一模一样的其他型号的风扇，也可以拿来作为替换。于是待到下课回宿舍，我便拿出螺丝刀开始拆机，查看风扇的外观，顺便清了一下陈年老灰。又花了半个多小时，总算是找到了合适的风扇，进行一个单的下。</p><h2 id="hello-shiki">Hello, Shiki</h2><p>这一节的标题是仿照的<ahref="https://www.yoghurtlee.com/">小氯</a>的一个文章分类。（事实上，小氯的博客上也有<ahref="https://www.yoghurtlee.com/hello-shiki/">相同标题的文章</a>）</p><p>我最近一年一直在使用 <a href="https://typst.app/" rel="external nofollow noreferrer">Typst</a>来完成各种专业课程的作业，现在建了博客，自然也需要在分享一些 Typst代码片段。但这时候，问题出现了：Hexo 自带的 highlight.js 和 prismjs均不支持比较新的 Typst 的语法高亮。</p><p>最开始，我是参考 <ahref="https://foolishfox.cn/posts/202402-typst-block.html">Foolish Fox的文章</a>，利用纸夜姐姐的 <ahref="https://github.com/Myriad-Dreamin/typst.ts">typst.ts</a> 解析Typst 代码并利用 Hexo的标签插件进行渲染，这也是这位大佬的博客出现在我的友链里的原因。但是这样总归不是一个一劳永逸的方法——未来还可能有新语言，但每个新语言都这样适配也太累了。于是我将目光转向了<a href="https://shiki.tmrs.site/" rel="external nofollow noreferrer">Shiki</a>。</p><p>第一步自然是先去找有没有现成的轮子可用。通过 GitHub 搜索 「hexoshiki」，我成功找到了适用于 <ahref="https://github.com/fluid-dev/hexo-theme-fluid">Fluid 主题</a>的 <ahref="https://github.com/nova1751/hexo-shiki-plugin">hexo-shiki-plugin</a>、做了djot 适配的 <ahref="https://github.com/Pcrab/hexo-highlight-shiki">hexo-highlight-shiki</a>以及使用 TypeScript 编写的 <ahref="https://github.com/ArcticLampyrid/hexo-shiki-highlighter">hexo-shiki-highlighter</a>。但很可惜，这些轮子都不适合在我的主题上直接使用，于是我选择——开缝！</p><p>由于我事实上并没有任何 TypeScript 和 JavaScript的开发经验，所以我选择 IDE 的提示更完善的 TypeScript 进行开发。基于 <ahref="https://github.com/ArcticLampyrid/hexo-shiki-highlighter">hexo-shiki-highlighter</a>，我靠着AI 摸索着写了个还算能用的插件：</p><div class="repo-card"><a class='name-cm9gs4y1y repo-title fancybox' href="https://github.com/HPCesia/hexo-highlighter-shiki" rel="external nofollow noreferrer"></a><p class='desc-cm9gs4y1y repo-desc'></p><div class="repo-gist"><i class="fas fa-star"></i><span class='star-cm9gs4y1y'></span><i class="fas fa-code-branch"></i><span class='fork-cm9gs4y1y'></span></div><img class='lang-cm9gs4y1y repo-language no-lightbox' /><script>    fetch('https://api.github.com/repos/HPCesia/hexo-highlighter-shiki')      .then(res => res.json())      .then(data => {        document.querySelector('.name-cm9gs4y1y').innerText = data.name;        document.querySelector('.desc-cm9gs4y1y').innerText = data.description;        document.querySelector('.star-cm9gs4y1y').innerText = data.stargazers_count;        document.querySelector('.fork-cm9gs4y1y').innerText = data.forks_count;        document.querySelector('.lang-cm9gs4y1y').src = 'https://skillicons.dev/icons?i=' + data.language.toLowerCase();    });  </script></div><p>里面所有功能基本都是我自己用得上的功能，所以一些我没用上的功能可能会有BUG，如果看到这段话的朋友愿意使用我的插件，并发现了一些 BUG，欢迎给我提issue。</p><h2 id="工作流">工作流</h2><p>上文提到，我电脑的风扇坏了，而我在拆机检查完风扇后选择了偷懒：大部分螺丝都没有装回去，只装了必要的几颗螺丝，方便过几天拆机。这也意味着我不能长时间使用我的笔记本了——不然因为少装螺丝导致电脑坏了就麻烦了。但博客总得写啊！于是我开始思考，如何构建一个多端同步编写博文的工作流。</p><p>我的博客源码同时上传到了 GitHub的私有仓库上，所以最简单的工作流大概是使用 GitHub Action了。但这就牵扯到了一个问题：正如上文所说，我同时还在开发 Hexo插件，因此我的博客用到了一些 npm 本地包，这些包是不能直接在 GitHubAction 上使用的。</p><p>当然了，实际上我也并不需要随时随地改博客的源码。对我来说，只需要多端同步我的博文就能满足需求了。但问题又出现了：我使用的是华为手机，而且年底估计会换搭载鸿蒙Next 的 mate70，因此基于软件的同步方案就显得不靠谱了。</p><p>目前想到的解决方案，是使用带 Markdown编辑功能，且可以随意设置同步位置的同步云盘来管理博文，但目前还没找到合适的云盘（悲）。现阶段我暂时使用安卓端Obsidian码字，然后手动把写了一半的文章发给电脑，来达成随时编写文章的目的。</p>]]></content:encoded>
      
      
      <category domain="https://blog.hpcesia.com/categories/%E7%94%9F%E6%B4%BB%E7%82%B9%E6%BB%B4/">生活点滴</category>
      
      
      <category domain="https://blog.hpcesia.com/tags/%E5%91%A8-%E6%9C%88%E8%AE%B0/">周/月记</category>
      
      
      <comments>https://blog.hpcesia.com/posts/41922e15/#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>多复变函数论学习笔记 - 第一章 全纯函数 - 第四节 幂级数</title>
      <link>https://blog.hpcesia.com/posts/ba26509c/</link>
      <guid>https://blog.hpcesia.com/posts/ba26509c/</guid>
      <pubDate>Mon, 28 Oct 2024 11:34:46 GMT</pubDate>
      
      <description>多复变函数论学习笔记 - 重复数项幂级数与其导数级数的收敛域</description>
      
      
      
      <content:encoded><![CDATA[<h2 id="定义">定义</h2><ul><li><p><strong>重级数</strong>：<span class="math inline">\(n\)</span>重复数项级数与以 <span class="math inline">\(a \in{\mathbb{C}}^{n}\)</span> 为中心的 <spanclass="math inline">\(n\)</span> 重幂级数定义分别为： <spanclass="math display">\[\sum_{\nu \in{\mathbb{N}}^{n}}b_{\nu};\quad\sum_{\nu \in {\mathbb{N}}^{n}}b_{\nu}(z -a)^{\nu}，\quad\left( b_{\nu} \in {\mathbb{C}} \right).\]</span>以下简称为级数与幂级数。</p></li><li><p><strong>收敛</strong>：若存在双射 <spanclass="math inline">\(\lambda:{\mathbb{N}} \rightarrow{\mathbb{N}}^{n}\)</span> 使得 <span class="math inline">\(\sum_{k =0}^{\infty}b_{\lambda(k)}\)</span> 收敛，则称级数 <spanclass="math inline">\(\sum_{\nu \in {\mathbb{N}}^{n}}b_{\nu}\)</span><strong>收敛</strong>。</p><p>若存在双射 <span class="math inline">\(\lambda:{\mathbb{N}}\rightarrow {\mathbb{N}}^{n}\)</span> 使得 <spanclass="math inline">\(\sum_{k = 0}^{\infty}\left| b_{\lambda(k)}\right|\)</span> 收敛，则称级数 <span class="math inline">\(\sum_{\nu\in {\mathbb{N}}^{n}}b_{\nu}\)</span> <strong>绝对收敛</strong>。</p><p>若级数绝对收敛，则收敛的极限与级数排列次序 <spanclass="math inline">\(\nu\)</span> 无关。</p></li><li><p><strong>收敛域</strong>：称使得幂级数 <spanclass="math inline">\(\sum_{\nu \in{\mathbb{N}}^{n}}c_{\nu}z^{\nu}\)</span> 收敛的全部 <spanclass="math inline">\(z \in {\mathbb{C}}^{n}\)</span>构成的点集的<strong>内部</strong> <span class="math inline">\(\Omega =\Omega(\left\{ c_{\nu} \right\})\)</span>为该级数的<strong>收敛域</strong>。</p></li></ul><h2 id="abel-引理">Abel 引理</h2><p><strong>引理</strong> (Abel): 设 <span class="math inline">\(c_{\nu}\in {\mathbb{C}}\)</span>，<span class="math inline">\(\nu \in{\mathbb{N}}^{n}\)</span>，且对某个 <span class="math inline">\(w \in{\mathbb{C}}^{n}\)</span> 有 <span id="equation_Abel_引理_条件"><spanclass="math display">\[\sup\limits_{\nu \in {\mathbb{N}}^{n}}\left|{c_{\nu}w^{\nu}} \right| = M &lt; + \infty.\]</span></span> 令 <spanclass="math inline">\(r = \tau(w) = \left( \left| w_{1}\right|,\cdots,\left| w_{n} \right| \right)\)</span>，则</p><ol type="1"><li><p>幂级数 <span class="math inline">\({\sum_{\nu \in{\mathbb{N}}^{n}}c_{\nu}}z^{\nu}\)</span> 在多圆柱 <spanclass="math inline">\(P(0,r)\)</span> 上收敛。</p></li><li><p>上述收敛在以下意义下是<strong>正规的</strong>：</p><p>若 <span class="math inline">\(K \subset P(0,r)\)</span>是一个紧子集，<span class="math inline">\(\varepsilon &gt; 0\)</span>是任一常数，则存在一个有限集 <span class="math inline">\(\Lambda =\Lambda(K,\varepsilon) \in {\mathbb{N}}^{n}\)</span> 使得 <spanclass="math display">\[\sum_{\nu \notin \Lambda}\left| {c_{\nu}z^{\nu}}\right| &lt; \varepsilon,\quad\forall z \in K.\]</span></p></li></ol><p><em>证明</em>: 给定 <span class="math inline">\(K \subset \subsetP(0,r)\)</span>，选取 <span class="math inline">\(0 &lt; \lambda &lt;1\)</span>，使得 <span class="math inline">\(K \subset P(0,\lambdar)\)</span>。对 <span class="math inline">\(z \in P(0,\lambdar)\)</span>，由<a href="#equation_Abel_引理_条件" class="ref">公式</a>有 <span class="math display">\[\left| {c_{\nu}z^{\nu}} \right| \leq\left| {c_{\nu}w^{\nu}} \right|\lambda^{|\nu|} \leqM\lambda^{|\nu|},\quad\forall\nu \in \mathbb{N}^{n},\]</span> 其中 <spanclass="math inline">\(|\nu| = \sum_{i = 1}^{n}\nu_{i}\)</span>。由于<span class="math display">\[\sum_{\nu \in\mathbb{N}^{n}}\lambda^{|\nu|} = \left( \sum_{j = 0}^{\infty}\lambda^{j}\right)^{n} &lt; + \infty,\]</span> 从而结论成立。</p><p><span id="corollary_Abel_引理_1"><strong>推论</strong>:</span> 幂级数<span class="math inline">\(\sum_{\nu \in\mathbb{N}^{n}}c_{\nu}z^{\nu}\)</span> 的收敛域 <spanclass="math inline">\(\Omega\)</span>是一个（可能为空集）完备的Reinhardt域，且 <spanclass="math inline">\(\Omega\)</span> 是所有满足<ahref="#equation_Abel_引理_条件" class="ref">公式</a> 的点 <spanclass="math inline">\(w \in {\mathbb{C}}^{n}\)</span>构成的集合的内部。在 <span class="math inline">\(\Omega\)</span>内的收敛性是正规的。</p><h2 id="导数级数的收敛域">导数级数的收敛域</h2><p><strong>定理</strong>: 一个幂级数 <spanclass="math inline">\(\sum_{\nu \in\mathbb{N}^{n}}c_{\nu}z^{\nu}\)</span>，若它具有非空的收敛域 <spanclass="math inline">\(\Omega\)</span>，则它定义一个全纯函数 <spanclass="math inline">\(f \in \mathcal{O}(\Omega)\)</span>。此外，对任意的<span class="math inline">\(\alpha \in{\mathbb{N}}^{n}\)</span>，导数级数 <spanclass="math inline">\(\sum_{\nu \in \mathbb{N}^{n}}c_{\nu}\left(D^{\alpha}z^{\nu} \right)\)</span> 在 <spanclass="math inline">\(\Omega\)</span> 上紧收敛于 <spanclass="math inline">\(D^{\alpha}f\)</span>，且有 <spanclass="math display">\[D^{\alpha}f(0) = \alpha!c_{\alpha}.\]</span></p><p><em>证明</em>: 选取一个固定的双射 <spanclass="math inline">\(\sigma:{\mathbb{N}} \rightarrow{\mathbb{N}}^{n}\)</span>，则 <span class="math display">\[f(z) =\lim\limits_{k \rightarrow \infty}\sum_{j =0}^{k}c_{\sigma(j)}z^{\sigma(j)}\]</span> 在 <spanclass="math inline">\(\Omega\)</span> 内紧收敛。由于部分和是全纯的，故有<span class="math inline">\(f \in \mathcal{O}(\Omega)\)</span>，且 <spanclass="math display">\[D^{\alpha}f(z) = \lim\limits_{k \rightarrow\infty}\sum_{j = 0}^{k}c_{\sigma(j)}\left( D^{\alpha}z^{\sigma(j)}\right),\quad\forall z \in \Omega.\]</span> 从而对固定的 <spanclass="math inline">\(\alpha \in {\mathbb{N}}^{n}\)</span> 和 <spanclass="math inline">\(w \in \Omega\)</span> 有 <spanclass="math display">\[\sup\limits_{\nu \in \mathbb{N}^{n}}\left\{\left| {c_{\nu}\left( D^{\alpha}z^{\nu} \right)} \right|_{z = w}\right\} &lt; + \infty.\]</span> 由<a href="#corollary_Abel_引理_1"class="ref">推论</a> 可知 <span class="math inline">\(\Omega\)</span>包含于幂级数 <span class="math inline">\(\sum_{\nu \in\mathbb{N}^{n}}c_{\nu}\left( D^{\alpha}z^{\nu} \right)\)</span>的收敛域。在 <span class="math display">\[D^{\alpha}f(z) = \sum_{\nu \in\mathbb{N}^{n}}c_{\nu}\left( D^{\alpha}z^{\nu} \right)\]</span> 中令<span class="math inline">\(z = 0\)</span> 即得 <spanclass="math inline">\(D^{\alpha}f(0) = \alpha!c_{\alpha}\)</span>。</p><p>事实上，<span class="math inline">\(\sum_{\nu \in\mathbb{N}^{n}}c_{\nu}z^{\nu}\)</span> 和 <spanclass="math inline">\(\sum_{\nu \in \mathbb{N}^{n}}c_{\nu}\left(D^{\alpha}z^{\nu} \right)\)</span> 具有相同的收敛域。</p>]]></content:encoded>
      
      
      <category domain="https://blog.hpcesia.com/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/">学习笔记</category>
      
      
      <category domain="https://blog.hpcesia.com/tags/%E6%95%B0%E5%AD%A6/">数学</category>
      
      <category domain="https://blog.hpcesia.com/tags/%E5%A4%9A%E5%A4%8D%E5%8F%98%E5%87%BD%E6%95%B0/">多复变函数</category>
      
      
      <comments>https://blog.hpcesia.com/posts/ba26509c/#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>多复变函数论学习笔记 - 第一章 全纯函数 - 第三节 多圆柱上的 Cauchy 积分公式</title>
      <link>https://blog.hpcesia.com/posts/af3287de/</link>
      <guid>https://blog.hpcesia.com/posts/af3287de/</guid>
      <pubDate>Fri, 25 Oct 2024 12:56:16 GMT</pubDate>
      
      <description>多复变函数论学习笔记 - 多圆柱上的 Cauchy 积分公式与 Cauchy 估计</description>
      
      
      
      <content:encoded><![CDATA[<h2 id="多圆柱上的-cauchy-积分公式">多圆柱上的 Cauchy 积分公式</h2><p>在单复变函数中，有如下的 Cauchy 积分公式：</p><p><strong>定理</strong> (单复变下的 Cauchy 积分公式): 设 <spanclass="math inline">\(D \subset {\mathbb{C}}\)</span> 为一有界域，边界<span class="math inline">\(\mathfrak{b}D\)</span> 是逐段光滑的，<spanclass="math inline">\(f \in \mathcal{O}(D)\)</span>，<spanclass="math inline">\(f \in C\left( \overline{D} \right)\)</span>，则有<span class="math display">\[f(z) = \frac{1}{2\pii}\int_{\mathfrak{b}D}\frac{f(\zeta)d\zeta}{\zeta - z},\quad\forall z\in D.\]</span></p><p>在多复变中，没有这样统一的 Cauchy积分公式，但对某些特殊的区域，如多圆柱，有：</p><p><span id="theorem_多圆柱上的_Cauchy_积分公式"><strong>定理</strong>(多圆柱上的 Cauchy 积分公式)</span>: 设 <span class="math inline">\(P ≔P(a,r)\)</span> 为 <span class="math inline">\({\mathbb{C}}^{n}\)</span>中的多圆柱，其中 <span class="math inline">\(a = \left(a_{1},\cdots,a_{n} \right)\)</span>，<span class="math inline">\(r =\left( r_{1},\cdots,r_{n} \right)\)</span>。设 <spanclass="math inline">\(f \in \mathcal{O}(P)\)</span>，<spanclass="math inline">\(f \in C\left( \overline{P} \right)\)</span>，则有<span id="equation_多圆柱上的_Cauchy_积分公式"><spanclass="math display">\[f(z) = \left( \frac{1}{2\pi i}\right)^{n}\int_{\mathfrak{b}_{0}P}\frac{f(\zeta)d\zeta_{1}\cdotsd\zeta_{n}}{\left( \zeta_{1} - z_{1} \right)\cdots\left( \zeta_{n} -z_{n} \right)},\quad\forall z \in P,\]</span></span> 其中 <spanclass="math inline">\(\mathfrak{b}_{0}P = \left\{ \zeta \in{\mathbb{C}}^{n}:\left| {\zeta_{j} - a_{j}} \right| = r_{j},1 \leq j\leq n \right\}\)</span> 为 <span class="math inline">\(P\)</span>的<strong>特征边界</strong>。</p><p><em>证明</em>: 对复变量个数 <span class="math inline">\(n\)</span>采用数学归纳法。</p><p><span class="math inline">\(n = 1\)</span> 时，<ahref="#equation_多圆柱上的_Cauchy_积分公式"class="ref">公式</a>为单复变的单位圆盘上的 Cauchy 积分公式，显然成立。当<span class="math inline">\(n &gt; 1\)</span>，且定理对 <spanclass="math inline">\(n - 1\)</span> 个复变量的情形成立，对固定 <spanclass="math inline">\(z = \left( z_{1},\cdots,z_{n} \right) \inP\)</span>，在 <span class="math inline">\(n - 1\)</span> 个复变量 <spanclass="math inline">\(\left( z_{2},\cdots,z_{n} \right)\)</span>应用归纳假设，得 <spanid="equation_多圆柱上的_Cauchy_积分公式_证明中间公式"><spanclass="math display">\[f\left( z_{1},\cdots,z_{n} \right) = \left(\frac{1}{2\pi i} \right)^{n -1}\int_{\mathfrak{b}_{0}P(a&#39;,r&#39;)}\frac{f\left(z_{1},\zeta_{2},\cdots,\zeta_{n} \right)d\zeta_{2}\cdotsd\zeta_{n}}{\left( \zeta_{2} - z_{2} \right)\cdots,\left( \zeta_{n} -z_{n} \right)},\]</span></span> 其中 <span class="math inline">\(a&#39;= \left( a_{2},\cdots,a_{n} \right)\)</span>，<spanclass="math inline">\(r&#39; = \left( r_{2},\cdots,r_{n}\right)\)</span>。对固定的 <spanclass="math inline">\(\zeta_{2},\cdots,\zeta_{n}\)</span>，由 <spanclass="math inline">\(n = 1\)</span> 的结果有 <spanclass="math display">\[f\left( z_{1},\cdots,z_{n} \right) =\frac{1}{2\pi i}\int_{\left| {\zeta_{1} - a_{1}} \right| =r_{1}}\frac{f\left( \zeta_{1},\cdots,\zeta_{n}\right)d\zeta_{1}}{\zeta_{1} - z_{1}}.\]</span> 由 <spanclass="math inline">\(f\)</span> 连续性，将上式代入<ahref="#equation_多圆柱上的_Cauchy_积分公式_证明中间公式"class="ref">公式</a>，并将累次积分转为沿 <spanclass="math inline">\(\mathfrak{b}_{0}P\)</span> 上的积分，得证。</p><p><strong>推论</strong>: 设 <span class="math inline">\(f \inC(D)\)</span>（或在 <span class="math inline">\(D\)</span>上有界）且分别关于每一复变量全纯，则有 <span class="math inline">\(f \inC^{(\infty)(D)}\)</span>，<span class="math inline">\(f \in\mathcal{O}(D)\)</span>，且对任意 <span class="math inline">\(\alpha \in{\mathbb{N}}^{n}\)</span> 有 <span class="math inline">\(D^{\alpha}f \in\mathcal{O}(D)\)</span>。</p><p><em>证明</em>: <span class="math inline">\(\forall a \inD\)</span>，<span class="math inline">\(\exists r &gt; 0\)</span>，使得<span class="math inline">\(P(a,r) \subset \subsetD\)</span>，由推论假设，<span class="math inline">\(f \in C\left(\overline{P(a,r)} \right)\)</span> 且分别关于每一复变量全纯。对多圆柱<span class="math inline">\(P(a,r)\)</span> 应用<ahref="#theorem_多圆柱上的_Cauchy_积分公式" class="ref">定理</a>，得<span class="math display">\[f(z) = \left( \frac{1}{2\pi i}\right)^{n}\int_{\mathfrak{b}_{0}P}\frac{f(\zeta)d\zeta_{1}\cdotsd\zeta_{n}}{\left( \zeta_{1} - z_{1} \right)\cdots\left( \zeta_{n} -z_{n} \right)},\quad\forall z \in P(a,r),\]</span>上式可在积分号内分别关于 <spanclass="math inline">\(z_{1},\cdots,z_{n}\)</span> 求导任意次，所以 <spanclass="math inline">\(f \in C^{\infty}\left( P(a,r)\right)\)</span>，<span class="math inline">\(f \in \mathcal{O}(\left\{a \right\})\)</span>。由 <span class="math inline">\(a\)</span>的任意性得 <span class="math inline">\(f \in\mathcal{O}(D)\)</span>。</p><h2 id="cauchy-估计">Cauchy 估计</h2><p><strong>定理</strong> (Cauchy 估计): 设 <span class="math inline">\(f\in \mathcal{O}(P(a,r))\)</span>，则对任意 <spanclass="math inline">\(\alpha \in {\mathbb{N}}^{n}\)</span> 有 <spanid="equation_Cauchy_估计_1"><span class="math display">\[\left|{D^{\alpha}f(a)} \right| \leq\frac{\alpha!}{r^{\alpha}}|f|_{\mathfrak{b}_{0}P(a,r)};\]</span></span><span id="equation_Cauchy_估计_2"><span class="math display">\[\left|{D^{\alpha}f(a)} \right| \leq \frac{\alpha!\left( \alpha_{1} + 2\right)\cdots\left( \alpha_{n} + 2 \right)}{(2\pi)^{n}r^{\alpha +2}}\left\| f \right\|_{L^{1}\left( P(a,r) \right)}.\]</span></span> 其中<span class="math inline">\(\left\| \cdot \right\|_{L^{p}(D)}\)</span>表示 <span class="math inline">\(L^{p}(D)\)</span>（满足 <spanclass="math inline">\(|f|^{p}\)</span> 在 <spanclass="math inline">\(D\)</span> 上 Lebesgue 可积的函数 <spanclass="math inline">\(f\)</span> 全体构成的赋范空间）上的范数，而 <spanclass="math inline">\(|f|_{D} ≔ \sup\limits_{z \in D}|f|\)</span>。</p><p><em>证明</em>: 固定 <span class="math inline">\(0 &lt; \rho &lt;r\)</span>，对 <span class="math inline">\(P(a,\rho) \subset \subsetP(a,r)\)</span> 应用<a href="#theorem_多圆柱上的_Cauchy_积分公式"class="ref">定理</a> 并在积分号下求导得 <spanid="equation_Cauchy_估计_proof_1"><spanclass="math display">\[D^{\alpha}f(a) = \frac{\alpha!}{(2\pii)^{n}}\int_{\mathfrak{b}_{0}P(a,\rho)}\frac{f(\zeta)d\zeta_{1}\cdotsd\zeta_{n}}{(\zeta - a)^{\alpha + 1}}.\]</span></span> 由此有 <spanclass="math display">\[\left| {D^{\alpha}f(a)} \right| \leq \left|\frac{\alpha!}{(2\pi i)^{n}}\right|\frac{(2\pi)^{n}}{r^{\alpha}}|f|_{\mathfrak{b}_{0}P(a,\rho)} \leq\frac{\alpha!}{r^{\alpha}}|f|_{\mathfrak{b}_{0}P(a,\rho)},\]</span> 令<span class="math inline">\(\rho \rightarrow r\)</span> 即得<ahref="#equation_Cauchy_估计_1" class="ref">公式</a>。</p><p>在<a href="#equation_Cauchy_估计_proof_1"class="ref">公式</a>中将积分边界转换为参数形式，两边同乘 <spanclass="math inline">\(\rho^{\alpha + 1}\)</span> 有 <spanclass="math display">\[D^{\alpha}f(a)\rho^{\alpha + 1} =\frac{\alpha!}{(2\pi i)^{n}}\int_{\lbrack0,2\pi\rbrack^{n}}i^{n}e^{i\theta}f\left( \zeta(\theta)\right)\rho_{1}\cdots\rho_{n}d\theta_{1}\cdots d\theta_{n},\]</span>由此有 <span class="math display">\[\begin{aligned}&amp;\int_{0}^{r_{1}}\mspace{-15mu}\cdots\mspace{-4mu}\int_{0}^{r_{n}}\left|{D^{\alpha}f(a)} \right|\rho^{\alpha + 1}d\rho_{n}\cdots d\rho_{1} \\\leq &amp;\frac{\alpha!}{(2\pi)^{n}}\int_{0}^{r_{1}}\mspace{-15mu}\cdots\mspace{-4mu}\int_{0}^{r_{n}}\mspace{-9mu}\int_{\lbrack0,2\pi\rbrack^{n}}\left| {f\left( \zeta(\theta) \right)}\right|\rho_{1}\cdots\rho_{n}d\theta_{1}\cdotsd\theta_{n}d\rho_{n}\cdots d\rho_{1}, \\\Longrightarrow &amp; \left| {D^{\alpha}f(a)} \right| \leq\frac{\alpha!\left( \alpha_{1} + 2 \right)\cdots\left( \alpha_{n} + 2\right)}{(2\pi)^{n}r^{\alpha + 2}}\int_{P(a,r)}\left| {f(\zeta)}\right|d\zeta.\end{aligned}\]</span> 即<a href="#equation_Cauchy_估计_2"class="ref">公式</a>。</p><p>Cauchy 估计的另一个结果是以下版本的极大模原理：</p><p><strong>定理</strong>: 设 <span class="math inline">\(f \in\mathcal{O}(P) \subset C\left( \overline{P} \right)\)</span>，其中 <spanclass="math inline">\(P ≔ P(a,r)\)</span> 为 <spanclass="math inline">\({\mathbb{C}}^{n}\)</span> 上多圆柱，则有 <spanclass="math display">\[\left| {f(z)} \right| \leq|f|_{\mathfrak{b}_{0}P},\quad\forall z \in P.\]</span></p><p><em>证明</em>: 只需对任意固定 <span class="math inline">\(z \inP\)</span> 证明上式即可。由<a href="#theorem_多圆柱上的_Cauchy_积分公式"class="ref">定理</a>与<a href="#equation_Cauchy_估计_1"class="ref">公式</a>可知存在常数 <spanclass="math inline">\(C\)</span>，使得 <spanclass="math inline">\(\left| {f(z)} \right| \leqC|f|_{\mathfrak{b}_{0}P}\)</span>。对任意 <span class="math inline">\(k= 1,2,\cdots\)</span>，<span class="math inline">\(f^{k} \in\mathcal{O}(P) \cap C\left( \overline{P} \right)\)</span>，于是有 <spanclass="math display">\[\left| {f(z)} \right|^{k} = \left| f^{(k)(z)}\right| \leq C\left| f^{k} \right|_{\mathfrak{b}_{0}P} \leq C\left(|f|_{\mathfrak{b}_{0}P} \right)^{k} \Rightarrow \left| {f(z)} \right|\leq C^{1/k}|f|_{\mathfrak{b}_{0}P}.\]</span> 上式右边令 <spanclass="math inline">\(k \rightarrow + \infty\)</span>，即得 <spanclass="math inline">\(\left| {f(z)} \right| \leq|f|_{\mathfrak{b}_{0}P}\)</span>。</p>]]></content:encoded>
      
      
      <category domain="https://blog.hpcesia.com/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/">学习笔记</category>
      
      
      <category domain="https://blog.hpcesia.com/tags/%E6%95%B0%E5%AD%A6/">数学</category>
      
      <category domain="https://blog.hpcesia.com/tags/%E5%A4%9A%E5%A4%8D%E5%8F%98%E5%87%BD%E6%95%B0/">多复变函数</category>
      
      
      <comments>https://blog.hpcesia.com/posts/af3287de/#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>Solitude 主题改造记录</title>
      <link>https://blog.hpcesia.com/posts/4ca8244b/</link>
      <guid>https://blog.hpcesia.com/posts/4ca8244b/</guid>
      <pubDate>Sun, 20 Oct 2024 14:54:51 GMT</pubDate>
      
      <description>简单记录自己对 Solitude 主题进行的部分较复杂的改造。</description>
      
      
      
      <content:encoded><![CDATA[<details><summary>更新日志</summary><div class="timeline"><span class="timeline-title"><div class="timenode"><div class="meta"><p>2024-11-12</p></div><div class="body"><p>新增 Memos 说说接入相关修改</p></div></div><div class="timenode"><div class="meta"><p>2024-11-07</p></div><div class="body"><p>新增中文排版相关修改</p></div></div><div class="timenode"><div class="meta"><p>2024-11-05</p></div><div class="body"><p>新增底栏图片修改</p></div></div><div class="timenode"><div class="meta"><p>2024-11-04</p></div><div class="body"><p>新增游戏界面修改</p></div></div><div class="timenode"><div class="meta"><p>2024-11-03</p></div><div class="body"><p>更新引用段落到右键菜单相关修改</p></div></div><div class="timenode"><div class="meta"><p>2024-11-02</p></div><div class="body"><p>更新 Umami 统计的部署</p></div></div><div class="timenode"><div class="meta"><p>2024-11-01</p></div><div class="body"><p>更新轻量友链朋友圈的部署</p></div></div><div class="timenode"><div class="meta"><p>2024-10-26</p></div><div class="body"><p>更新一些琐碎的修改</p></div></div><div class="timenode"><div class="meta"><p>2024-10-25</p></div><div class="body"><p>更新参考其他博客教程的改造</p></div></div><div class="timenode"><div class="meta"><p>2024-10-23</p></div><div class="body"><p>更新 MathJax 与 Shiki 的适配方式</p></div></div><div class="timenode"><div class="meta"><p>2024-10-20</p></div><div class="body"><p>发布文章</p></div></div></div></details><p>本文章将会持续更新，所有使用 Solitude期间对网站的修改都会在此进行总结。</p><h2 id="数学公式">数学公式</h2><p>博主作为数学系的学生，在博客中分享部分数学学习笔记算是半个刚需了。<ahref="https://solitude.js.org/zh/">Solitude</a> 主题自带 <ahref="https://solitude.js.org/zh/config/extend#%E6%95%B0%E5%AD%A6%E5%85%AC%E5%BC%8F">KaTeX支持</a>，如果只是简单的数学公式数学需求，是完全够用的。但是 KaTeX的数学支持比较弱，且移动端的多行公式浏览体验不佳，因此我把博客的公式渲染引擎换成了<a href="https://www.mathjax.org/" rel="external nofollow noreferrer">MathJax</a>。</p><p>最开始博客是直接引入了 MathJax 的 js文件，在客户端进行公式渲染。但是很快我就发现该方式和 pjax不合，尝试在引入 js 的标签中添加 <code>pjax</code>也无效，因此改为在服务端渲染。</p><p>服务端渲染最简单的办法就是去使用 NexT 主题的一个插件 <ahref="https://github.com/next-theme/hexo-filter-mathjax">hexo-filter-mathjax</a>。首先安装该插件、卸载原先的Markdown 渲染引擎并安装对 MathJax 支持更好的 <ahref="https://github.com/hexojs/hexo-renderer-pandoc">hexo-renderer-pandoc</a>，最后清除Hexo 缓存：</p><figure class="highlight shell"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">npm</span><span style="color:#50A14F;--shiki-dark:#98C379"> uninstall</span><span style="color:#50A14F;--shiki-dark:#98C379"> hexo-renderer-marked</span><span style="color:#986801;--shiki-dark:#D19A66"> --save</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># npm uninstall hexo-renderer-kramed --save # 根据此前安装的 Markdown 渲染引擎来卸载</span></span><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">npm</span><span style="color:#50A14F;--shiki-dark:#98C379"> install</span><span style="color:#50A14F;--shiki-dark:#98C379"> hexo-renderer-pandoc</span><span style="color:#986801;--shiki-dark:#D19A66"> --save</span></span><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">npm</span><span style="color:#50A14F;--shiki-dark:#98C379"> install</span><span style="color:#50A14F;--shiki-dark:#98C379"> hexo-filter-mathjax</span><span style="color:#986801;--shiki-dark:#D19A66"> --save</span></span><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">hexo</span><span style="color:#50A14F;--shiki-dark:#98C379"> clean</span></span></code></pre></td></tr></tbody></table></figure><p>接着在 <code>_config.yml</code> 中添加 MathJax 与 Pandoc相关配置即可。 <figure class="highlight yaml"><figcaption><span>_config.yml</span></figcaption><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">mathjax</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">  tags</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">none</span><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> # or 'ams' or 'all'</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">  single_dollars</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">true</span><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> # enable single dollar signs as in-line math delimiters</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">  cjk_width</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">0.9</span><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> # relative CJK char width</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">  normal_width</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">0.6</span><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> # relative normal (monospace) width</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">  append_css</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">true</span><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> # add CSS to pages rendered by MathJax</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">  every_page</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">false</span><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> # if true, every page will be rendered by MathJax regardless the `mathjax` setting in Front-matter</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">  packages</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># extra packages to load</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">  extension_options</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: &#123;&#125;</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">    # you can put your extension options here</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">    # see http://docs.mathjax.org/en/latest/options/input/tex.html#tex-extension-options for more detail</span></span><span class="line"></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">pandoc</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">  args</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    - </span><span style="color:#50A14F;--shiki-dark:#98C379">"-f"</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    - </span><span style="color:#50A14F;--shiki-dark:#98C379">"markdown"</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    - </span><span style="color:#50A14F;--shiki-dark:#98C379">"-t"</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    - </span><span style="color:#50A14F;--shiki-dark:#98C379">"html"</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    - </span><span style="color:#50A14F;--shiki-dark:#98C379">"--mathjax"</span></span></code></pre></td></tr></tbody></table></figure></p><h2 id="代码高亮">代码高亮</h2><p>博主还在使用 <a href="https://typst.app/" rel="external nofollow noreferrer">Typst</a>进行部分课程笔记与作业的书写，也会在博客中分享一些 Typst使用经验。不幸的是，Hexo 自带的两个代码语法高亮引擎——<ahref="https://highlightjs.org/">highlight.js</a> 和 <ahref="https://prismjs.com/">Prismjs</a> 都不支持对比较新的 Typst生成语法高亮。</p><p>解决办法之一是使用 <ahref="https://github.com/Myriad-Dreamin/typst.ts">Typst.ts</a> 在 Node环境中解析 Typst 代码语法，并发送给 highlight.js。Typst.ts 的子项目 <ahref="https://github.com/Myriad-Dreamin/typst.ts/tree/main/projects/highlighter">highlighter</a>提供了一个实现，而下面这篇文章则给出了在 Hexo上的使用方法与实现思路。这也是我最开始使用的方法。</p><a class="tag-link" href="https://yihui-liu.github.io/posts/202402-typst-block.html" rel="external nofollow noreferrer" target="_blank"><div class="tag-link-tips">引用站外链接</div><div class="tag-link-bottom"><div class="tag-link-left"><i class="solitude fas fa-link"></i></div><div class="tag-link-right"><div class="tag-link-title">Hexo 配置 Typst 代码高亮</div><div class="tag-link-sitename">Fox Home</div></div><i class="solitude fas fa-chevron-right"></i></div></a><p>另一个办法则是改用 <a href="https://shiki.style/" rel="external nofollow noreferrer">Shiki</a>进行公式渲染。Shiki的优点在于它支持导入自定义的主题与语言，因此不需要担心语言支持问题。我在几个已有项目的基础上花了点时间开发了一个更适合Solitude 主题使用的 Shiki 插件：</p><div class="repo-card"><a class='name-tc060rqd6 repo-title fancybox' href="https://github.com/HPCesia/hexo-highlighter-shiki" rel="external nofollow noreferrer"></a><p class='desc-tc060rqd6 repo-desc'></p><div class="repo-gist"><i class="fas fa-star"></i><span class='star-tc060rqd6'></span><i class="fas fa-code-branch"></i><span class='fork-tc060rqd6'></span></div><img class='lang-tc060rqd6 repo-language no-lightbox' /><script>    fetch('https://api.github.com/repos/HPCesia/hexo-highlighter-shiki')      .then(res => res.json())      .then(data => {        document.querySelector('.name-tc060rqd6').innerText = data.name;        document.querySelector('.desc-tc060rqd6').innerText = data.description;        document.querySelector('.star-tc060rqd6').innerText = data.stargazers_count;        document.querySelector('.fork-tc060rqd6').innerText = data.forks_count;        document.querySelector('.lang-tc060rqd6').src = 'https://skillicons.dev/icons?i=' + data.language.toLowerCase();    });  </script></div><p>目前本博客也在使用该插件进行代码语法高亮渲染。</p><h3 id="主题适配">主题适配</h3><div class="note info modern"><i class="solitude fas fa-info-circle"></i><p>正在整理这部分代码，准备提 PR</p></div><p>在 Solitude 上使用该插件需要对主题的部分代码进行修改：</p><figure class="highlight javascript"><figcaption><span>scripts/helper/stylus.js</span><a href="https://github.com/everfu/hexo-theme-solitude/blob/b29911baab44687782e84032214aca34e991b300/scripts/helper/stylus.js#L10" rel="external nofollow noreferrer">line 10</a></figcaption><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro has-diff"><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// highlight</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">const</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#123;</span><span style="color:#E45649;--shiki-dark:#E06C75">syntax_highlighter</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#E5C07B">syntaxHighlighter</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#986801;--shiki-dark:#E5C07B">highlight</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#986801;--shiki-dark:#E5C07B">prismjs</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#986801;--shiki-dark:#E5C07B">shiki</span><span style="color:#383A42;--shiki-dark:#ABB2BF">&#125; </span><span style="color:#0184BC;--shiki-dark:#56B6C2">=</span><span style="color:#383A42;--shiki-dark:#E5C07B"> hexo</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">config</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">let</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#123;</span><span style="color:#E45649;--shiki-dark:#E06C75">enable</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#383A42;--shiki-dark:#E06C75">highlightEnable</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#E45649;--shiki-dark:#E06C75">line_number</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#383A42;--shiki-dark:#E06C75">highlightLineNumber</span><span style="color:#383A42;--shiki-dark:#ABB2BF">&#125; </span><span style="color:#0184BC;--shiki-dark:#56B6C2">=</span><span style="color:#383A42;--shiki-dark:#E06C75"> highlight</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">let</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#123;</span><span style="color:#E45649;--shiki-dark:#E06C75">enable</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#383A42;--shiki-dark:#E06C75">prismjsEnable</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#E45649;--shiki-dark:#E06C75">line_number</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#383A42;--shiki-dark:#E06C75">prismjsLineNumber</span><span style="color:#383A42;--shiki-dark:#ABB2BF">&#125; </span><span style="color:#0184BC;--shiki-dark:#56B6C2">=</span><span style="color:#383A42;--shiki-dark:#E06C75"> prismjs</span></span><span class="line diff add"><span style="color:#A626A4;--shiki-dark:#C678DD">let</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#123;</span><span style="color:#E45649;--shiki-dark:#E06C75">enable</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#383A42;--shiki-dark:#E06C75">shikiEnable</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#E45649;--shiki-dark:#E06C75">line_number</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#383A42;--shiki-dark:#E06C75">shikiLineNumber</span><span style="color:#383A42;--shiki-dark:#ABB2BF">&#125; </span><span style="color:#0184BC;--shiki-dark:#56B6C2">=</span><span style="color:#383A42;--shiki-dark:#E06C75"> shiki</span></span><span class="line"></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// for hexo > 7.0</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">if</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="color:#383A42;--shiki-dark:#E06C75">syntaxHighlighter</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) &#123;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E06C75">    highlightEnable</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#E06C75"> syntaxHighlighter</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> ===</span><span style="color:#50A14F;--shiki-dark:#98C379"> 'highlight.js'</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E06C75">    prismjsEnable</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#E06C75"> syntaxHighlighter</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> ===</span><span style="color:#50A14F;--shiki-dark:#98C379"> 'prismjs'</span></span><span class="line diff add"><span style="color:#383A42;--shiki-dark:#E06C75">    shikiEnable</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#E06C75"> syntaxHighlighter</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> ===</span><span style="color:#50A14F;--shiki-dark:#98C379"> 'shiki'</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">&#125;</span></span><span class="line"></span><span class="line"><span style="color:#383A42;--shiki-dark:#E5C07B">style</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">define</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">'$highlight_enable'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#383A42;--shiki-dark:#E06C75">highlightEnable</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E5C07B">style</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">define</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">'$highlight_line_number'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#383A42;--shiki-dark:#E06C75">highlightLineNumber</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E5C07B">style</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">define</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">'$prismjs_enable'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#383A42;--shiki-dark:#E06C75">prismjsEnable</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E5C07B">style</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">define</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">'$prismjs_line_number'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#383A42;--shiki-dark:#E06C75">prismjsLineNumber</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line diff add"><span style="color:#383A42;--shiki-dark:#E5C07B">style</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">define</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">'$shiki_enable'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#383A42;--shiki-dark:#E06C75">shikiEnable</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)          </span></span><span class="line diff add"><span style="color:#383A42;--shiki-dark:#E5C07B">style</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">define</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">'$shiki_line_number'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#383A42;--shiki-dark:#E06C75">shikiLineNumber</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) </span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E5C07B">style</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">define</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">'$language'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#383A42;--shiki-dark:#E5C07B">config</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">language</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span></code></pre></td></tr></tbody></table></figure><figure class="highlight javascript"><figcaption><span>source/js/main.js</span><a href="https://github.com/everfu/hexo-theme-solitude/blob/b29911baab44687782e84032214aca34e991b300/source/js/main.js#L495" rel="external nofollow noreferrer">line 495</a></figcaption><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro has-diff"><span class="line diff remove"><span style="color:#A626A4;--shiki-dark:#C678DD">const</span><span style="color:#986801;--shiki-dark:#E5C07B"> $syntaxHighlight</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#E06C75"> syntax</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> ===</span><span style="color:#50A14F;--shiki-dark:#98C379"> 'highlight.js'</span><span style="color:#0184BC;--shiki-dark:#C678DD"> ?</span><span style="color:#383A42;--shiki-dark:#E5C07B"> document</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">querySelectorAll</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">'figure.highlight'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) </span><span style="color:#0184BC;--shiki-dark:#C678DD">:</span><span style="color:#383A42;--shiki-dark:#E5C07B"> document</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">querySelectorAll</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">'pre[class*="language-"]'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) </span></span><span class="line diff add"><span style="color:#A626A4;--shiki-dark:#C678DD">const</span><span style="color:#986801;--shiki-dark:#E5C07B"> $syntaxHighlight</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#E06C75"> syntax</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> ===</span><span style="color:#50A14F;--shiki-dark:#98C379"> 'highlight.js'</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> ||</span><span style="color:#383A42;--shiki-dark:#E06C75"> syntax</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> ===</span><span style="color:#50A14F;--shiki-dark:#98C379"> 'shiki'</span><span style="color:#0184BC;--shiki-dark:#C678DD"> ?</span><span style="color:#383A42;--shiki-dark:#E5C07B"> document</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">querySelectorAll</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">'figure.highlight'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) </span><span style="color:#0184BC;--shiki-dark:#C678DD">:</span><span style="color:#383A42;--shiki-dark:#E5C07B"> document</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">querySelectorAll</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">'pre[class*="language-"]'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) </span></span></code></pre></td></tr></tbody></table></figure><figure class="highlight stylus"><figcaption><span>source/css/_highlight/index.styl</span><a href="https://github.com/everfu/hexo-theme-solitude/blob/b29911baab44687782e84032214aca34e991b300/source/css/_highlight/index.styl#L5" rel="external nofollow noreferrer">line 5</a></figcaption><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro has-diff"><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">if</span><span style="color:#E45649;--shiki-dark:#E06C75"> $highlight_enable</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">  @require</span><span style="color:#50A14F;--shiki-dark:#98C379"> "highlight/index.styl"</span></span><span class="line"></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">if</span><span style="color:#E45649;--shiki-dark:#E06C75"> $prismjs_enable</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">  @require</span><span style="color:#50A14F;--shiki-dark:#98C379"> "prismjs/index.styl"</span></span><span class="line"></span><span class="line diff add"><span style="color:#A626A4;--shiki-dark:#C678DD">if</span><span style="color:#E45649;--shiki-dark:#E06C75"> $shiki_enable</span></span><span class="line diff add"><span style="color:#A626A4;--shiki-dark:#C678DD">  @require</span><span style="color:#50A14F;--shiki-dark:#98C379"> "shiki/index.styl"</span></span></code></pre></td></tr></tbody></table></figure><figure class="highlight stylus"><figcaption><span>source/css/_highlight/shiki/index.styl</span></figcaption><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">if</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> hexo-config</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">'highlight.enable'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">  @import</span><span style="color:#50A14F;--shiki-dark:#98C379"> "diff"</span></span><span class="line"></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">figure</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">  pre</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    margin </span><span style="color:#986801;--shiki-dark:#D19A66">0</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    padding </span><span style="color:#986801;--shiki-dark:#D19A66">8</span><span style="color:#986801;--shiki-dark:#E06C75">px</span><span style="color:#986801;--shiki-dark:#D19A66"> 0</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    border </span><span style="color:#383A42;--shiki-dark:#D19A66">none</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">  table</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    display </span><span style="color:#383A42;--shiki-dark:#D19A66">block</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    border </span><span style="color:#383A42;--shiki-dark:#D19A66">none</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    overflow-y </span><span style="color:#383A42;--shiki-dark:#D19A66">hidden</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    overflow-x </span><span style="color:#383A42;--shiki-dark:#D19A66">auto</span></span><span class="line"></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">    td</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">      padding </span><span style="color:#986801;--shiki-dark:#D19A66">0</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">      border </span><span style="color:#383A42;--shiki-dark:#D19A66">none</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">      height </span><span style="color:#986801;--shiki-dark:#D19A66">100</span><span style="color:#986801;--shiki-dark:#E06C75">%</span></span><span class="line"></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">      &#x26;</span><span style="color:#986801;--shiki-dark:#D19A66">.gutter</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">        opacity </span><span style="color:#986801;--shiki-dark:#D19A66">.6</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">        user-select </span><span style="color:#383A42;--shiki-dark:#D19A66">none</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">        min-width initial</span></span><span class="line"></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">        pre</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">          overflow </span><span style="color:#383A42;--shiki-dark:#D19A66">auto</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">          line-height </span><span style="color:#986801;--shiki-dark:#D19A66">1.6</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">          margin </span><span style="color:#986801;--shiki-dark:#D19A66">0</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">          padding </span><span style="color:#986801;--shiki-dark:#D19A66">8</span><span style="color:#986801;--shiki-dark:#E06C75">px</span><span style="color:#986801;--shiki-dark:#D19A66"> .5</span><span style="color:#986801;--shiki-dark:#E06C75">rem</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">          border </span><span style="color:#383A42;--shiki-dark:#D19A66">none</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">          color </span><span style="color:#4078F2;--shiki-dark:#61AFEF">var</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#E45649;--shiki-dark:#E06C75">--efu-secondtext</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">          background </span><span style="color:#4078F2;--shiki-dark:#61AFEF">var</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#E45649;--shiki-dark:#E06C75">--efu-secondbg</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">          border-right </span><span style="color:#4078F2;--shiki-dark:#61AFEF">var</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#E45649;--shiki-dark:#E06C75">--style-border-always</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">          text-align </span><span style="color:#383A42;--shiki-dark:#D19A66">center</span></span><span class="line"></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">      &#x26;</span><span style="color:#986801;--shiki-dark:#D19A66">.code</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">        width </span><span style="color:#986801;--shiki-dark:#D19A66">100</span><span style="color:#986801;--shiki-dark:#E06C75">%</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">        display </span><span style="color:#383A42;--shiki-dark:#D19A66">flex</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">        position </span><span style="color:#383A42;--shiki-dark:#D19A66">relative</span></span><span class="line"></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">        pre</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">          padding-right </span><span style="color:#986801;--shiki-dark:#D19A66">.5</span><span style="color:#986801;--shiki-dark:#E06C75">rem</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">          padding-left </span><span style="color:#986801;--shiki-dark:#D19A66">.5</span><span style="color:#986801;--shiki-dark:#E06C75">rem</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">          line-height </span><span style="color:#986801;--shiki-dark:#D19A66">1.6</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">          width </span><span style="color:#986801;--shiki-dark:#D19A66">100</span><span style="color:#986801;--shiki-dark:#E06C75">%</span></span><span class="line"></span><span class="line"><span style="color:#986801;--shiki-dark:#D19A66">  .line</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">    &#x26;</span><span style="color:#986801;--shiki-dark:#D19A66">.marked</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">      background-color: </span><span style="color:#4078F2;--shiki-dark:#61AFEF">rgba</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#986801;--shiki-dark:#D19A66">97</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#986801;--shiki-dark:#D19A66">97</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#986801;--shiki-dark:#D19A66">97</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#986801;--shiki-dark:#D19A66">.314</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span></code></pre></td></tr></tbody></table></figure><figure class="highlight stylus"><figcaption><span>source/css/_highlight/shiki/diff.styl</span></figcaption><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">figure</span><span style="color:#986801;--shiki-dark:#D19A66">.highlight</span></span><span class="line"><span style="color:#0184BC;--shiki-dark:#56B6C2">  table</span><span style="color:#383A42;--shiki-dark:#ABB2BF">::-webkit-scrollbar</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    color </span><span style="color:#4078F2;--shiki-dark:#61AFEF">var</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#E45649;--shiki-dark:#E06C75">--efu-secondbg</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    height </span><span style="color:#986801;--shiki-dark:#D19A66">6</span><span style="color:#986801;--shiki-dark:#E06C75">px</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    background </span><span style="color:#4078F2;--shiki-dark:#61AFEF">var</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#E45649;--shiki-dark:#E06C75">--efu-hl-bg</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    border-radius </span><span style="color:#986801;--shiki-dark:#D19A66">6</span><span style="color:#986801;--shiki-dark:#E06C75">px</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    display initial</span></span><span class="line"></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  [</span><span style="color:#986801;--shiki-dark:#D19A66">data-theme</span><span style="color:#383A42;--shiki-dark:#ABB2BF">=</span><span style="color:#50A14F;--shiki-dark:#98C379">dark</span><span style="color:#383A42;--shiki-dark:#ABB2BF">]</span><span style="color:#A626A4;--shiki-dark:#C678DD"> &#x26;</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">    td</span><span style="color:#986801;--shiki-dark:#D19A66">.code</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">      span</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">        color </span><span style="color:#4078F2;--shiki-dark:#61AFEF">var</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#E45649;--shiki-dark:#E06C75">--shiki-dark</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span><span style="color:#A626A4;--shiki-dark:#C678DD"> !important</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">        // background-color var(--shiki-dark-bg) !important // 不建议使用</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">        font-style </span><span style="color:#4078F2;--shiki-dark:#61AFEF">var</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#E45649;--shiki-dark:#E06C75">--shiki-dark-font-style</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span><span style="color:#A626A4;--shiki-dark:#C678DD"> !important</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">        font-weight </span><span style="color:#4078F2;--shiki-dark:#61AFEF">var</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#E45649;--shiki-dark:#E06C75">--shiki-dark-font-weight</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span><span style="color:#A626A4;--shiki-dark:#C678DD"> !important</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">        text-decoration </span><span style="color:#4078F2;--shiki-dark:#61AFEF">var</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#E45649;--shiki-dark:#E06C75">--shiki-dark-text-decoration</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span><span style="color:#A626A4;--shiki-dark:#C678DD"> !important</span></span></code></pre></td></tr></tbody></table></figure><p>这样就可以适配 Solitude 主题了。</p><h3 id="mathjax-适配">MathJax 适配</h3><p>此外，使用 Shiki 进行代码高亮渲染会导致 MathJax 的 LiteDOM adaptor解析文档失败，因此需要把 <ahref="https://github.com/next-theme/hexo-filter-mathjax">hexo-filter-mathjax</a>的代码进行部分修改。</p><p>新建 <code>mathjax.js</code>，放到博客的 <code>scripts</code>目录下： <figure class="highlight javascript"><figcaption><span>./scripts/mathjax.js</span></figcaption><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">"use strict"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">const</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#123; </span><span style="color:#986801;--shiki-dark:#E5C07B">mathjax</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#125; </span><span style="color:#0184BC;--shiki-dark:#56B6C2">=</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> require</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">"mathjax-full/js/mathjax.js"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">const</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#123; </span><span style="color:#986801;--shiki-dark:#E5C07B">TeX</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#125; </span><span style="color:#0184BC;--shiki-dark:#56B6C2">=</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> require</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">"mathjax-full/js/input/tex.js"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">const</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#123; </span><span style="color:#986801;--shiki-dark:#E5C07B">SVG</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#125; </span><span style="color:#0184BC;--shiki-dark:#56B6C2">=</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> require</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">"mathjax-full/js/output/svg.js"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">const</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#123; </span><span style="color:#986801;--shiki-dark:#E5C07B">LiteAdaptor</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#125; </span><span style="color:#0184BC;--shiki-dark:#56B6C2">=</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> require</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">"mathjax-full/js/adaptors/liteAdaptor.js"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">const</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#123; </span><span style="color:#986801;--shiki-dark:#E5C07B">RegisterHTMLHandler</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#125; </span><span style="color:#0184BC;--shiki-dark:#56B6C2">=</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> require</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">"mathjax-full/js/handlers/html.js"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">const</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#123; </span><span style="color:#986801;--shiki-dark:#E5C07B">escapeHTML</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#125; </span><span style="color:#0184BC;--shiki-dark:#56B6C2">=</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> require</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">"hexo-util"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">let</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#123; </span><span style="color:#383A42;--shiki-dark:#E06C75">AllPackages</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#125; </span><span style="color:#0184BC;--shiki-dark:#56B6C2">=</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> require</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">"mathjax-full/js/input/tex/AllPackages.js"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">const</span><span style="color:#986801;--shiki-dark:#E5C07B"> config</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="color:#383A42;--shiki-dark:#E5C07B">hexo</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E5C07B">config</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">mathjax</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#E5C07B"> Object</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">assign</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  &#123;</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">    tags</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">:</span><span style="color:#50A14F;--shiki-dark:#98C379"> "none"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">    single_dollars</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">:</span><span style="color:#986801;--shiki-dark:#D19A66"> true</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">    cjk_width</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">:</span><span style="color:#986801;--shiki-dark:#D19A66"> 0.9</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">    normal_width</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">:</span><span style="color:#986801;--shiki-dark:#D19A66"> 0.6</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">    append_css</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">:</span><span style="color:#986801;--shiki-dark:#D19A66"> true</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">    every_page</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">:</span><span style="color:#986801;--shiki-dark:#D19A66"> false</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">    extension_options</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">:</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#123;&#125;,</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  &#125;,</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E5C07B">  hexo</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E5C07B">config</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">mathjax</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">));</span></span><span class="line"></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">const</span><span style="color:#986801;--shiki-dark:#E5C07B"> adaptor</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#A626A4;--shiki-dark:#C678DD"> new</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> LiteAdaptor</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(&#123;</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">  fontSize</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">:</span><span style="color:#986801;--shiki-dark:#D19A66"> 16</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">  cjkCharWidth</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">:</span><span style="color:#383A42;--shiki-dark:#E5C07B"> config</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">cjk_width</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">  unknownCharWidth</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">:</span><span style="color:#383A42;--shiki-dark:#E5C07B"> config</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">normal_width</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">&#125;);</span></span><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">RegisterHTMLHandler</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E06C75">adaptor</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">const</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> render</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">content</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) </span><span style="color:#A626A4;--shiki-dark:#C678DD">=></span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#123;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">  if</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="color:#383A42;--shiki-dark:#E5C07B">Array</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">isArray</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E5C07B">config</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">packages</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)) &#123;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E06C75">    AllPackages</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#E5C07B"> AllPackages</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">concat</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E5C07B">config</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">packages</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  &#125;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">  const</span><span style="color:#986801;--shiki-dark:#E5C07B"> tex</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#A626A4;--shiki-dark:#C678DD"> new</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> TeX</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E5C07B">    Object</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">assign</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">      &#123;</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">        packages</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">:</span><span style="color:#383A42;--shiki-dark:#E06C75"> AllPackages</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">        tags</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">:</span><span style="color:#383A42;--shiki-dark:#E5C07B"> config</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">tags</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">      &#125;,</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E5C07B">      config</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">extension_options</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    )</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  );</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">  const</span><span style="color:#986801;--shiki-dark:#E5C07B"> svg</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#A626A4;--shiki-dark:#C678DD"> new</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> SVG</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(&#123;</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">    fontCache</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">:</span><span style="color:#50A14F;--shiki-dark:#98C379"> "none"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  &#125;);</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">  const</span><span style="color:#986801;--shiki-dark:#E5C07B"> html</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#E5C07B"> mathjax</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">document</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E06C75">content</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, &#123;</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">    InputJax</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">:</span><span style="color:#383A42;--shiki-dark:#E06C75"> tex</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">    OutputJax</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">:</span><span style="color:#383A42;--shiki-dark:#E06C75"> svg</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  &#125;);</span></span><span class="line"></span><span class="line"><span style="color:#383A42;--shiki-dark:#E5C07B">  html</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">render</span><span style="color:#383A42;--shiki-dark:#ABB2BF">();</span></span><span class="line"></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">  const</span><span style="color:#986801;--shiki-dark:#E5C07B"> htmlContent</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#E5C07B"> adaptor</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">innerHTML</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E5C07B">adaptor</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">body</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E5C07B">html</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">document</span><span style="color:#383A42;--shiki-dark:#ABB2BF">));</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">  if</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="color:#383A42;--shiki-dark:#E5C07B">html</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E5C07B">outputJax</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E5C07B">math</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">display</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) &#123;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">    const</span><span style="color:#986801;--shiki-dark:#E5C07B"> latexContent</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#E5C07B"> html</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E5C07B">outputJax</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E5C07B">math</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">math</span><span style="color:#383A42;--shiki-dark:#ABB2BF">;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">    const</span><span style="color:#986801;--shiki-dark:#E5C07B"> outputHtml</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#E5C07B"> htmlContent</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">replace</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">      "&#x3C;/mjx-container>"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">      `&#x3C;button class="copy-button" onclick="rm.copyText(</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\`</span><span style="color:#CA1243;--shiki-dark:#C678DD">$&#123;</span><span style="color:#4078F2;--shiki-dark:#61AFEF">escapeHTML</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E5C07B">        latexContent</span><span style="color:#50A14F;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">replace</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#CA1243;--shiki-dark:#E06C75">/</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\\</span><span style="color:#CA1243;--shiki-dark:#E06C75">/</span><span style="color:#A626A4;--shiki-dark:#C678DD">g</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span><span style="color:#CA1243;--shiki-dark:#98C379"> "</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\\\\</span><span style="color:#CA1243;--shiki-dark:#98C379">"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">      )</span><span style="color:#CA1243;--shiki-dark:#C678DD">&#125;</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\`</span><span style="color:#50A14F;--shiki-dark:#98C379">)">&#x3C;i class="solitude fas fa-copy">&#x3C;/i>&#x3C;/button>&#x3C;/mjx-container>`</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    );</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">    return</span><span style="color:#383A42;--shiki-dark:#E06C75"> outputHtml</span><span style="color:#383A42;--shiki-dark:#ABB2BF">;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  &#125;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">  return</span><span style="color:#383A42;--shiki-dark:#E06C75"> htmlContent</span><span style="color:#383A42;--shiki-dark:#ABB2BF">;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">&#125;;</span></span><span class="line"></span><span class="line"><span style="color:#383A42;--shiki-dark:#E5C07B">hexo</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E5C07B">extend</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E5C07B">filter</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">register</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">"after_render:html"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, (</span><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">html</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, &#123; </span><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">page</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#125;) </span><span style="color:#A626A4;--shiki-dark:#C678DD">=></span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#123;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">  if</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> (</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E5C07B">    config</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">every_page</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> ||</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E5C07B">    page</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">mathjax</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> ||</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    (</span><span style="color:#383A42;--shiki-dark:#E5C07B">page</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">__index</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> &#x26;&#x26;</span><span style="color:#383A42;--shiki-dark:#E5C07B"> page</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E5C07B">posts</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">toArray</span><span style="color:#383A42;--shiki-dark:#ABB2BF">().</span><span style="color:#4078F2;--shiki-dark:#61AFEF">find</span><span style="color:#383A42;--shiki-dark:#ABB2BF">((</span><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">post</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) </span><span style="color:#A626A4;--shiki-dark:#C678DD">=></span><span style="color:#383A42;--shiki-dark:#E5C07B"> post</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">mathjax</span><span style="color:#383A42;--shiki-dark:#ABB2BF">))</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  ) &#123;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">    return</span><span style="color:#383A42;--shiki-dark:#E06C75"> html</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">      .</span><span style="color:#4078F2;--shiki-dark:#61AFEF">replace</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#0184BC;--shiki-dark:#E06C75">/&#x3C;span</span><span style="color:#986801;--shiki-dark:#E06C75">\s</span><span style="color:#0184BC;--shiki-dark:#D19A66">+</span><span style="color:#0184BC;--shiki-dark:#E06C75">class="math</span><span style="color:#986801;--shiki-dark:#E06C75">\s</span><span style="color:#0184BC;--shiki-dark:#D19A66">+</span><span style="color:#986801;--shiki-dark:#D19A66">[</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">^</span><span style="color:#986801;--shiki-dark:#D19A66">"]</span><span style="color:#0184BC;--shiki-dark:#D19A66">*</span><span style="color:#0184BC;--shiki-dark:#E06C75">"></span><span style="color:#0184BC;--shiki-dark:#56B6C2">\\</span><span style="color:#986801;--shiki-dark:#D19A66">[</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\(\[</span><span style="color:#986801;--shiki-dark:#D19A66">]</span><span style="color:#986801;--shiki-dark:#E06C75">.</span><span style="color:#0184BC;--shiki-dark:#D19A66">*?</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\\</span><span style="color:#986801;--shiki-dark:#D19A66">[</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\)\]</span><span style="color:#986801;--shiki-dark:#D19A66">]</span><span style="color:#0184BC;--shiki-dark:#E06C75">&#x3C;</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\/</span><span style="color:#0184BC;--shiki-dark:#E06C75">span>/</span><span style="color:#A626A4;--shiki-dark:#C678DD">gs</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#383A42;--shiki-dark:#E06C75">render</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">      .</span><span style="color:#4078F2;--shiki-dark:#61AFEF">replace</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">'&#x3C;div id="post">'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#50A14F;--shiki-dark:#98C379">'&#x3C;div id="post">&#x3C;link rel="stylesheet" href="/css/mathjax.css">'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  &#125;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">  return</span><span style="color:#383A42;--shiki-dark:#E06C75"> html</span><span style="color:#383A42;--shiki-dark:#ABB2BF">;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">&#125;);</span></span></code></pre></td></tr></tbody></table></figure></p><p>接着在 <code>source</code> 目录下新建 <code>css/mathjax.styl</code>文件： <figure class="highlight stylus"><figcaption><span>./source/css/mathjax.styl</span></figcaption><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">mjx-container[</span><span style="color:#986801;--shiki-dark:#D19A66">jax</span><span style="color:#383A42;--shiki-dark:#ABB2BF">=</span><span style="color:#50A14F;--shiki-dark:#98C379">'SVG'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">]</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  direction </span><span style="color:#383A42;--shiki-dark:#D19A66">ltr</span></span><span class="line"></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  > </span><span style="color:#E45649;--shiki-dark:#E06C75">svg</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    overflow </span><span style="color:#383A42;--shiki-dark:#D19A66">visible</span></span><span class="line"></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  + </span><span style="color:#E45649;--shiki-dark:#E06C75">br</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    display </span><span style="color:#383A42;--shiki-dark:#D19A66">none</span></span><span class="line"></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">  &#x26;</span><span style="color:#383A42;--shiki-dark:#ABB2BF">[</span><span style="color:#986801;--shiki-dark:#D19A66">display</span><span style="color:#383A42;--shiki-dark:#ABB2BF">=</span><span style="color:#50A14F;--shiki-dark:#98C379">'true'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">]</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    overflow </span><span style="color:#383A42;--shiki-dark:#D19A66">auto</span><span style="color:#383A42;--shiki-dark:#D19A66"> hidden</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    display </span><span style="color:#383A42;--shiki-dark:#D19A66">block</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    text-align </span><span style="color:#383A42;--shiki-dark:#D19A66">center</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    margin </span><span style="color:#986801;--shiki-dark:#D19A66">1</span><span style="color:#986801;--shiki-dark:#E06C75">em</span><span style="color:#986801;--shiki-dark:#D19A66"> 0</span></span><span class="line"></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">  &#x26;</span><span style="color:#383A42;--shiki-dark:#ABB2BF">[</span><span style="color:#986801;--shiki-dark:#D19A66">justify</span><span style="color:#383A42;--shiki-dark:#ABB2BF">=</span><span style="color:#50A14F;--shiki-dark:#98C379">'left'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">]</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    text-align </span><span style="color:#383A42;--shiki-dark:#D19A66">left</span></span><span class="line"></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">  &#x26;</span><span style="color:#383A42;--shiki-dark:#ABB2BF">[</span><span style="color:#986801;--shiki-dark:#D19A66">justify</span><span style="color:#383A42;--shiki-dark:#ABB2BF">=</span><span style="color:#50A14F;--shiki-dark:#98C379">'right'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">]</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    text-align </span><span style="color:#383A42;--shiki-dark:#D19A66">right</span></span><span class="line"></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">[</span><span style="color:#986801;--shiki-dark:#D19A66">jax</span><span style="color:#383A42;--shiki-dark:#ABB2BF">=</span><span style="color:#50A14F;--shiki-dark:#98C379">'SVG'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">]</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  mjx-tool</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    display </span><span style="color:#383A42;--shiki-dark:#D19A66">inline-block</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    position </span><span style="color:#383A42;--shiki-dark:#D19A66">relative</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    width </span><span style="color:#986801;--shiki-dark:#D19A66">0</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    height </span><span style="color:#986801;--shiki-dark:#D19A66">0</span></span><span class="line"></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    > mjx-tip</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">      position </span><span style="color:#383A42;--shiki-dark:#D19A66">absolute</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">      top </span><span style="color:#986801;--shiki-dark:#D19A66">0</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">      left </span><span style="color:#986801;--shiki-dark:#D19A66">0</span></span><span class="line"></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">mjx-tool</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  > mjx-tip</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    display </span><span style="color:#383A42;--shiki-dark:#D19A66">inline-block</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    padding </span><span style="color:#986801;--shiki-dark:#D19A66">0.2</span><span style="color:#986801;--shiki-dark:#E06C75">em</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    border </span><span style="color:#986801;--shiki-dark:#D19A66">1</span><span style="color:#986801;--shiki-dark:#E06C75">px</span><span style="color:#383A42;--shiki-dark:#D19A66"> solid</span><span style="color:#986801;--shiki-dark:#D19A66"> #</span><span style="color:#0184BC;--shiki-dark:#D19A66">888</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    font-size </span><span style="color:#986801;--shiki-dark:#D19A66">70</span><span style="color:#986801;--shiki-dark:#E06C75">%</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    background-color </span><span style="color:#986801;--shiki-dark:#D19A66">#</span><span style="color:#0184BC;--shiki-dark:#D19A66">f8f8f8</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    color </span><span style="color:#986801;--shiki-dark:#D19A66">black</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    box-shadow </span><span style="color:#986801;--shiki-dark:#D19A66">2</span><span style="color:#986801;--shiki-dark:#E06C75">px</span><span style="color:#986801;--shiki-dark:#D19A66"> 2</span><span style="color:#986801;--shiki-dark:#E06C75">px</span><span style="color:#986801;--shiki-dark:#D19A66"> 5</span><span style="color:#986801;--shiki-dark:#E06C75">px</span><span style="color:#986801;--shiki-dark:#D19A66"> #</span><span style="color:#0184BC;--shiki-dark:#D19A66">aaaaaa</span></span><span class="line"></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">g</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">  &#x26;</span><span style="color:#383A42;--shiki-dark:#ABB2BF">[</span><span style="color:#986801;--shiki-dark:#D19A66">data-mml-node</span><span style="color:#383A42;--shiki-dark:#ABB2BF">=</span><span style="color:#50A14F;--shiki-dark:#98C379">'merror'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">]</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    > </span><span style="color:#E45649;--shiki-dark:#E06C75">g</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">      fill </span><span style="color:#986801;--shiki-dark:#D19A66">red</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">      stroke </span><span style="color:#986801;--shiki-dark:#D19A66">red</span></span><span class="line"></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    > </span><span style="color:#E45649;--shiki-dark:#E06C75">rect</span><span style="color:#383A42;--shiki-dark:#ABB2BF">[</span><span style="color:#986801;--shiki-dark:#D19A66">data-background</span><span style="color:#383A42;--shiki-dark:#ABB2BF">]</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">      fill </span><span style="color:#986801;--shiki-dark:#D19A66">yellow</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">      stroke </span><span style="color:#383A42;--shiki-dark:#D19A66">none</span></span><span class="line"></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">  &#x26;</span><span style="color:#383A42;--shiki-dark:#ABB2BF">[</span><span style="color:#986801;--shiki-dark:#D19A66">data-mml-node</span><span style="color:#383A42;--shiki-dark:#ABB2BF">=</span><span style="color:#50A14F;--shiki-dark:#98C379">'mtable'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">]</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    > </span><span style="color:#E45649;--shiki-dark:#E06C75">line</span><span style="color:#383A42;--shiki-dark:#ABB2BF">[</span><span style="color:#986801;--shiki-dark:#D19A66">data-line</span><span style="color:#383A42;--shiki-dark:#ABB2BF">]</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">      stroke-width </span><span style="color:#986801;--shiki-dark:#D19A66">70</span><span style="color:#986801;--shiki-dark:#E06C75">px</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">      fill </span><span style="color:#383A42;--shiki-dark:#D19A66">none</span></span><span class="line"></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    > </span><span style="color:#E45649;--shiki-dark:#E06C75">rect</span><span style="color:#383A42;--shiki-dark:#ABB2BF">[</span><span style="color:#986801;--shiki-dark:#D19A66">data-frame</span><span style="color:#383A42;--shiki-dark:#ABB2BF">]</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">      stroke-width </span><span style="color:#986801;--shiki-dark:#D19A66">70</span><span style="color:#986801;--shiki-dark:#E06C75">px</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">      fill </span><span style="color:#383A42;--shiki-dark:#D19A66">none</span></span><span class="line"></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    > </span><span style="color:#986801;--shiki-dark:#D19A66">.mjx-dashed</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">      stroke-dasharray </span><span style="color:#986801;--shiki-dark:#D19A66">140</span></span><span class="line"></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    > </span><span style="color:#986801;--shiki-dark:#D19A66">.mjx-dotted</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">      stroke-linecap </span><span style="color:#383A42;--shiki-dark:#D19A66">round</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">      stroke-dasharray </span><span style="color:#986801;--shiki-dark:#D19A66">0</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#986801;--shiki-dark:#D19A66">140</span></span><span class="line"></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    > </span><span style="color:#E45649;--shiki-dark:#E06C75">svg</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">      overflow </span><span style="color:#383A42;--shiki-dark:#D19A66">visible</span></span><span class="line"></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">  &#x26;</span><span style="color:#383A42;--shiki-dark:#ABB2BF">[</span><span style="color:#986801;--shiki-dark:#D19A66">data-mml-node</span><span style="color:#383A42;--shiki-dark:#ABB2BF">=</span><span style="color:#50A14F;--shiki-dark:#98C379">'maction'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">][</span><span style="color:#986801;--shiki-dark:#D19A66">data-toggle</span><span style="color:#383A42;--shiki-dark:#ABB2BF">]</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    cursor </span><span style="color:#383A42;--shiki-dark:#D19A66">pointer</span></span><span class="line"></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">mjx-status</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  display </span><span style="color:#383A42;--shiki-dark:#D19A66">block</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  position </span><span style="color:#383A42;--shiki-dark:#D19A66">fixed</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  left </span><span style="color:#986801;--shiki-dark:#D19A66">1</span><span style="color:#986801;--shiki-dark:#E06C75">em</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  bottom </span><span style="color:#986801;--shiki-dark:#D19A66">1</span><span style="color:#986801;--shiki-dark:#E06C75">em</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  min-width </span><span style="color:#986801;--shiki-dark:#D19A66">25</span><span style="color:#986801;--shiki-dark:#E06C75">%</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  padding </span><span style="color:#986801;--shiki-dark:#D19A66">0.2</span><span style="color:#986801;--shiki-dark:#E06C75">em</span><span style="color:#986801;--shiki-dark:#D19A66"> 0.4</span><span style="color:#986801;--shiki-dark:#E06C75">em</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  border </span><span style="color:#986801;--shiki-dark:#D19A66">1</span><span style="color:#986801;--shiki-dark:#E06C75">px</span><span style="color:#383A42;--shiki-dark:#D19A66"> solid</span><span style="color:#986801;--shiki-dark:#D19A66"> #</span><span style="color:#0184BC;--shiki-dark:#D19A66">888</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  font-size </span><span style="color:#986801;--shiki-dark:#D19A66">90</span><span style="color:#986801;--shiki-dark:#E06C75">%</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  background-color </span><span style="color:#986801;--shiki-dark:#D19A66">#</span><span style="color:#0184BC;--shiki-dark:#D19A66">f8f8f8</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  color </span><span style="color:#986801;--shiki-dark:#D19A66">black</span></span><span class="line"></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">foreignObject</span><span style="color:#383A42;--shiki-dark:#ABB2BF">[</span><span style="color:#986801;--shiki-dark:#D19A66">data-mjx-xml</span><span style="color:#383A42;--shiki-dark:#ABB2BF">]</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  font-family initial</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  line-height </span><span style="color:#383A42;--shiki-dark:#D19A66">normal</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  overflow </span><span style="color:#383A42;--shiki-dark:#D19A66">visible</span></span><span class="line"></span><span class="line"><span style="color:#986801;--shiki-dark:#D19A66">.MathJax</span><span style="color:#E45649;--shiki-dark:#E06C75"> path</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  stroke-width </span><span style="color:#986801;--shiki-dark:#D19A66">3</span></span><span class="line"></span><span class="line"><span style="color:#986801;--shiki-dark:#D19A66">.math.display</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  display </span><span style="color:#383A42;--shiki-dark:#D19A66">block</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  position </span><span style="color:#383A42;--shiki-dark:#D19A66">relative</span></span><span class="line"></span><span class="line"><span style="color:#986801;--shiki-dark:#D19A66">  .copy-button</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    display </span><span style="color:#383A42;--shiki-dark:#D19A66">inline</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    position </span><span style="color:#383A42;--shiki-dark:#D19A66">relative</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    right </span><span style="color:#986801;--shiki-dark:#D19A66">-1</span><span style="color:#986801;--shiki-dark:#E06C75">em</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    top </span><span style="color:#986801;--shiki-dark:#D19A66">0</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    opacity </span><span style="color:#986801;--shiki-dark:#D19A66">0</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    width </span><span style="color:#986801;--shiki-dark:#D19A66">0</span></span><span class="line"></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">  &#x26;</span><span style="color:#986801;--shiki-dark:#56B6C2">:hover</span></span><span class="line"><span style="color:#986801;--shiki-dark:#D19A66">    .copy-button</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">      opacity </span><span style="color:#986801;--shiki-dark:#D19A66">1</span></span></code></pre></td></tr></tbody></table></figure></p><p>然后就可以把 hexo-filter-mathjax给卸载掉了。由于改为了生成后渲染，Hexo 生成的 db.json也更加友好——这意味着本地搜索的 xml 可以大幅压缩，Algolia 搜索则可以使用TeX 语法来搜索数学公式。</p><h2 id="其他修改">其他修改</h2><p>这部分的改造比较琐碎，因此集中在一节。</p><h3 id="pandoc-markdown-引用支持">Pandoc Markdown 引用支持</h3><p>本站使用 <ahref="https://github.com/hexojs/hexo-renderer-pandoc">hexo-renderer-pandoc</a>进行文章渲染，这也意味着可以使用 <ahref="https://pandoc.org/MANUAL.html#pandocs-markdown">Pandoc 版本的扩展Markdown 格式</a>来书写文章。 我的<ahref="/tags/多复变函数">多复变函数论学习笔记</a>原文均为 Typst编写，每隔一段时间会使用 Pandoc 转换部分笔记到Markdown，进行简单修改后放到博客上。我的笔记包含许多的引用，这些引用转换到Markdown 格式时会像这样： <figure class="highlight markdown"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span style="color:#986801;font-weight:bold;--shiki-dark:#D19A66;--shiki-dark-font-weight:inherit">**定理**</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> (多圆柱上的 Cauchy 积分公式):</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">...</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">[]&#123;#theorem_多圆柱上的_Cauchy_积分公式&#125;</span></span><span class="line"></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">...</span></span><span class="line"></span><span class="line"><span style="color:#986801;font-weight:bold;--shiki-dark:#D19A66;--shiki-dark-font-weight:inherit">**推论**</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:</span></span><span class="line"></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">...</span></span><span class="line"></span><span class="line"><span style="color:#A626A4;font-style:italic;--shiki-dark:#C678DD;--shiki-dark-font-style:italic">_证明_</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:</span></span><span class="line"></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">对 ... 应用</span><span style="color:#986801;--shiki-dark:#ABB2BF">[</span><span style="color:#4078F2;--shiki-dark:#61AFEF">\[theorem_多圆柱上的_Cauchy_积分公式\]</span><span style="color:#986801;--shiki-dark:#ABB2BF">]</span><span style="color:#A626A4;--shiki-dark:#E06C75">(</span><span style="color:#A626A4;text-decoration:inherit;--shiki-dark:#C678DD;--shiki-dark-text-decoration:underline">#theorem_多圆柱上的_Cauchy_积分公式</span><span style="color:#A626A4;--shiki-dark:#E06C75">)</span><span style="color:#383A42;--shiki-dark:#ABB2BF">&#123;.ref&#125;，得</span></span><span class="line"></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">...</span></span></code></pre></td></tr></tbody></table></figure></p><p>进行简单修改（修改引用的位置和引用文本）后，Pandoc 渲染出的 html是这样的： <figure class="highlight html"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">&#x3C;</span><span style="color:#E45649;--shiki-dark:#E06C75">span</span><span style="color:#986801;--shiki-dark:#D19A66"> id</span><span style="color:#383A42;--shiki-dark:#ABB2BF">=</span><span style="color:#50A14F;--shiki-dark:#98C379">"theorem_多圆柱上的_Cauchy_积分公式"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="color:#E45649;--shiki-dark:#E06C75">strong</span><span style="color:#383A42;--shiki-dark:#ABB2BF">>定理&#x3C;/</span><span style="color:#E45649;--shiki-dark:#E06C75">strong</span><span style="color:#383A42;--shiki-dark:#ABB2BF">></span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">(多圆柱上的 Cauchy 积分公式)&#x3C;/</span><span style="color:#E45649;--shiki-dark:#E06C75">span</span><span style="color:#383A42;--shiki-dark:#ABB2BF">></span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">&#x3C;</span><span style="color:#E45649;--shiki-dark:#E06C75">a</span><span style="color:#986801;--shiki-dark:#D19A66"> href</span><span style="color:#383A42;--shiki-dark:#ABB2BF">=</span><span style="color:#50A14F;--shiki-dark:#98C379">"#theorem_多圆柱上的_Cauchy_积分公式"</span><span style="color:#986801;--shiki-dark:#D19A66"> class</span><span style="color:#383A42;--shiki-dark:#ABB2BF">=</span><span style="color:#50A14F;--shiki-dark:#98C379">"ref"</span><span style="color:#986801;--shiki-dark:#D19A66"> data-pjax-state</span><span style="color:#383A42;--shiki-dark:#ABB2BF">=</span><span style="color:#50A14F;--shiki-dark:#98C379">""</span><span style="color:#383A42;--shiki-dark:#ABB2BF">>定理 1&#x3C;/</span><span style="color:#E45649;--shiki-dark:#E06C75">a</span><span style="color:#383A42;--shiki-dark:#ABB2BF">></span></span></code></pre></td></tr></tbody></table></figure></p><p>显然，我需要为这个引用块添加跳转功能以方便阅读，这里我选择直接在主题的<code>main.js</code> 里加上 ref 跳转的功能。</p><figure class="highlight javascript"><figcaption><span>solitude/source/main.js</span></figcaption><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro has-diff"><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">class</span><span style="color:#C18401;--shiki-dark:#E5C07B"> toc</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#123;</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// ...</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">&#125;</span></span><span class="line"></span><span class="line diff add"><span style="color:#A626A4;--shiki-dark:#C678DD">class</span><span style="color:#C18401;--shiki-dark:#E5C07B"> ref</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#123; </span></span><span class="line diff add"><span style="color:#A626A4;--shiki-dark:#C678DD">  static</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> init</span><span style="color:#383A42;--shiki-dark:#ABB2BF">() &#123; </span></span><span class="line diff add"><span style="color:#A626A4;--shiki-dark:#C678DD">    const</span><span style="color:#986801;--shiki-dark:#E5C07B"> el</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#E5C07B"> document</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">querySelectorAll</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">'a.ref'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) </span></span><span class="line diff add"><span style="color:#383A42;--shiki-dark:#E5C07B">    el</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">forEach</span><span style="color:#383A42;--shiki-dark:#ABB2BF">((</span><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">e</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) </span><span style="color:#A626A4;--shiki-dark:#C678DD">=></span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#123; </span></span><span class="line diff add"><span style="color:#383A42;--shiki-dark:#E5C07B">      e</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">addEventListener</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">'click'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, (</span><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">event</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) </span><span style="color:#A626A4;--shiki-dark:#C678DD">=></span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#123; </span></span><span class="line diff add"><span style="color:#383A42;--shiki-dark:#E5C07B">        event</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">preventDefault</span><span style="color:#383A42;--shiki-dark:#ABB2BF">() </span></span><span class="line diff add"><span style="color:#383A42;--shiki-dark:#E5C07B">        utils</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">scrollToDest</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E5C07B">utils</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">getEleTop</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E5C07B">document</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">getElementById</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#4078F2;--shiki-dark:#61AFEF">decodeURI</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E5C07B">event</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E5C07B">target</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E5C07B">hash</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">replace</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">'#'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#50A14F;--shiki-dark:#98C379">''</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)))), </span><span style="color:#986801;--shiki-dark:#D19A66">300</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) </span></span><span class="line diff add"><span style="color:#383A42;--shiki-dark:#ABB2BF">      &#125;) </span></span><span class="line diff add"><span style="color:#383A42;--shiki-dark:#ABB2BF">    &#125;) </span></span><span class="line diff add"><span style="color:#383A42;--shiki-dark:#ABB2BF">  &#125; </span></span><span class="line diff add"><span style="color:#383A42;--shiki-dark:#ABB2BF">&#125; </span></span><span class="line"></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// ...</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E5C07B">window</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">refreshFn</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> () </span><span style="color:#A626A4;--shiki-dark:#C678DD">=></span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#123;</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// ...</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">  if</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="color:#383A42;--shiki-dark:#E06C75">is_post</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> ||</span><span style="color:#383A42;--shiki-dark:#E06C75"> is_page</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) &#123;</span></span><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">    addHighlight</span><span style="color:#383A42;--shiki-dark:#ABB2BF">();</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E5C07B">    tabs</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">init</span><span style="color:#383A42;--shiki-dark:#ABB2BF">();</span></span><span class="line diff add"><span style="color:#383A42;--shiki-dark:#E5C07B">    ref</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">init</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(); </span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  &#125;</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">  // ...</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">&#125;</span></span></code></pre></td></tr></tbody></table></figure><h3id="防止友链的随机访问跳转到非博客友链">防止友链的随机访问跳转到非博客友链</h3><p>修改主题中关于随机友链的 pug： <figure class="highlight pug"><figcaption><span>layout/includes/widgets/randomlink.pug</span></figcaption><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro has-diff"><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">- </span><span style="color:#A626A4;--shiki-dark:#C678DD">var</span><span style="color:#383A42;--shiki-dark:#E06C75"> datalinks</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> []</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">- </span><span style="color:#A626A4;--shiki-dark:#C678DD">var</span><span style="color:#383A42;--shiki-dark:#E06C75"> data</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#E5C07B"> site</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E5C07B">data</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E5C07B">links</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">links</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">if</span><span style="color:#986801;--shiki-dark:#D19A66">(data)</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">    each</span><span style="color:#E45649;--shiki-dark:#E06C75"> item</span><span style="color:#A626A4;--shiki-dark:#C678DD"> in</span><span style="color:#383A42;--shiki-dark:#E06C75"> data</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">            each</span><span style="color:#E45649;--shiki-dark:#E06C75"> y</span><span style="color:#A626A4;--shiki-dark:#C678DD"> in</span><span style="color:#383A42;--shiki-dark:#E5C07B"> item</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">link_list</span></span><span class="line diff remove"><span style="color:#383A42;--shiki-dark:#ABB2BF">                - </span><span style="color:#383A42;--shiki-dark:#E5C07B">datalinks</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">push</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(&#123; </span><span style="color:#E45649;--shiki-dark:#E06C75">name</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">:</span><span style="color:#383A42;--shiki-dark:#E5C07B"> y</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">name</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span><span style="color:#E45649;--shiki-dark:#E06C75">link</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">:</span><span style="color:#383A42;--shiki-dark:#E5C07B"> y</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">link</span><span style="color:#383A42;--shiki-dark:#ABB2BF">&#125;) </span></span><span class="line diff add"><span style="color:#A626A4;--shiki-dark:#C678DD">                if</span><span style="color:#383A42;--shiki-dark:#E5C07B"> y</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">noTravel</span></span><span class="line diff add"><span style="color:#383A42;--shiki-dark:#ABB2BF">                    - </span><span style="color:#383A42;--shiki-dark:#E5C07B">datalinks</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">push</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(&#123; </span><span style="color:#E45649;--shiki-dark:#E06C75">name</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">:</span><span style="color:#383A42;--shiki-dark:#E5C07B"> y</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">name</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#E45649;--shiki-dark:#E06C75">link</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">:</span><span style="color:#383A42;--shiki-dark:#E5C07B"> y</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">link</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#E45649;--shiki-dark:#E06C75">noTravel</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">:</span><span style="color:#383A42;--shiki-dark:#E5C07B"> y</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">noTravel</span><span style="color:#383A42;--shiki-dark:#ABB2BF">&#125;) </span></span><span class="line diff add"><span style="color:#A626A4;--shiki-dark:#C678DD">                else</span></span><span class="line diff add"><span style="color:#383A42;--shiki-dark:#ABB2BF">                    - </span><span style="color:#383A42;--shiki-dark:#E5C07B">datalinks</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">push</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(&#123; </span><span style="color:#E45649;--shiki-dark:#E06C75">name</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">:</span><span style="color:#383A42;--shiki-dark:#E5C07B"> y</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">name</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#E45649;--shiki-dark:#E06C75">link</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">:</span><span style="color:#383A42;--shiki-dark:#E5C07B"> y</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">link</span><span style="color:#383A42;--shiki-dark:#ABB2BF">&#125;) </span></span><span class="line"></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">script</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">    const</span><span style="color:#986801;--shiki-dark:#E5C07B"> links</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#56B6C2"> !</span><span style="color:#383A42;--shiki-dark:#ABB2BF">&#123;JSON.stringify(datalinks)&#125;</span></span><span class="line diff add"><span style="color:#A626A4;--shiki-dark:#C678DD">    const</span><span style="color:#986801;--shiki-dark:#E5C07B"> travelLinks</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#E5C07B"> links</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">filter</span><span style="color:#383A42;--shiki-dark:#ABB2BF">((</span><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">i</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) </span><span style="color:#A626A4;--shiki-dark:#C678DD">=></span><span style="color:#383A42;--shiki-dark:#56B6C2"> !</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">'noTravel'</span><span style="color:#A626A4;--shiki-dark:#C678DD"> in</span><span style="color:#383A42;--shiki-dark:#E06C75"> i</span><span style="color:#383A42;--shiki-dark:#56B6C2"> &#x26;&#x26;</span><span style="color:#383A42;--shiki-dark:#E5C07B"> i</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">noTravel</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)) </span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">    const</span><span style="color:#986801;--shiki-dark:#E5C07B"> randomText</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span><span style="color:#50A14F;--shiki-dark:#98C379"> '!&#123;_p('</span><span style="color:#383A42;--shiki-dark:#E5C07B">link</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">random</span><span style="color:#50A14F;--shiki-dark:#98C379">')&#125;'</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">    function</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> travelling</span><span style="color:#383A42;--shiki-dark:#ABB2BF">() &#123;</span></span><span class="line diff remove"><span style="color:#A626A4;--shiki-dark:#C678DD">        const</span><span style="color:#986801;--shiki-dark:#E5C07B"> link</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#E06C75"> links</span><span style="color:#383A42;--shiki-dark:#ABB2BF">[</span><span style="color:#383A42;--shiki-dark:#E5C07B">utils</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">randomNum</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E5C07B">links</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">length</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)]; </span></span><span class="line diff add"><span style="color:#A626A4;--shiki-dark:#C678DD">        const</span><span style="color:#986801;--shiki-dark:#E5C07B"> link</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#E06C75"> travelLinks</span><span style="color:#383A42;--shiki-dark:#ABB2BF">[</span><span style="color:#383A42;--shiki-dark:#E5C07B">utils</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">randomNum</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E5C07B">travelLinks</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">length</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)]; </span></span></code></pre></td></tr></tbody></table></figure></p><p>然后在 <code>links.yml</code> 中为不应该跳转的友链添加上<code>noTravel: true</code> 即可。 <figure class="highlight yaml"><figcaption><span>links.yml</span></figcaption><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro has-diff"><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">- </span><span style="color:#E45649;--shiki-dark:#E06C75">name</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">Hexo</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">  link</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">https://hexo.io/</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">  descr</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">快速、简洁且高效的博客框架</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">  avatar</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">https://hexo.io/icon/favicon-196x196.png</span></span><span class="line diff add"><span style="color:#E45649;--shiki-dark:#E06C75">  noTravel</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">true</span></span></code></pre></td></tr></tbody></table></figure></p><h3 id="增加背景图片切换开关">增加背景图片切换开关</h3><p>改的东西太多太琐碎了，直接看 <ahref="https://github.com/HPCesia/hexo-theme-solitude/commit/43db0e2b942924eaa444d8e91f1b62ecdea47d79">commit</a>。</p><h3 id="修改页脚友链数量">修改页脚友链数量</h3><p>一样，改的东西琐碎了点，直接看 <ahref="https://github.com/HPCesia/hexo-theme-solitude/commit/eb126afade06f26c640a74c22d9d0316e2384526">commit</a></p><h3 id="修改评论区样式">修改评论区样式</h3><p><ahref="https://github.com/HPCesia/hexo-theme-solitude/blob/myself/source/css/_comments/twikoo.styl">样式文件</a>直接拿走即可。基于Solitude 主题自带 Twikoo 样式进行修改，主要改了： -把头像预览加回来了（仅限评论区顶部编辑栏） - 把 Markdown预览和取消回复加回来了 - 补充了管理面板样式</p><h3 id="删除无用-css">删除无用 css</h3><p>说是删除，其实是避免渲染，把主题 source/css 目录下的 var.styl 和third_party 文件夹，名字前面都加上一个下划线来避免渲染，同时修改index.styl 中对应的路径即可。</p><h3 id="修改引用到评论右键菜单">修改引用到评论右键菜单</h3><p>这个改起来简单，直接放代码： <figure class="highlight javascript"><figcaption><span>solitude/source/main.js</span></figcaption><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">const</span><span style="color:#986801;--shiki-dark:#E5C07B"> sco</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#123;</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">  // ...</span></span><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">  toTalk</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">txt</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) &#123;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E5C07B">    utils</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">scrollToDest</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E5C07B">utils</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">getEleTop</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E5C07B">document</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">getElementById</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">'post-comment'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)), </span><span style="color:#986801;--shiki-dark:#D19A66">300</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">    const</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> toTalkFn</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> () </span><span style="color:#A626A4;--shiki-dark:#C678DD">=></span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#123;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">      const</span><span style="color:#986801;--shiki-dark:#E5C07B"> inputs</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> [</span><span style="color:#50A14F;--shiki-dark:#98C379">"#wl-edit"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#50A14F;--shiki-dark:#98C379">".el-textarea__inner"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#50A14F;--shiki-dark:#98C379">"#veditor"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#50A14F;--shiki-dark:#98C379">".atk-textarea"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">];</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E5C07B">      inputs</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">forEach</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">selector</span><span style="color:#A626A4;--shiki-dark:#C678DD"> =></span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#123;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">        const</span><span style="color:#986801;--shiki-dark:#E5C07B"> el</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#E5C07B"> document</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">querySelector</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E06C75">selector</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">        if</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="color:#383A42;--shiki-dark:#E06C75">el</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) &#123;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E5C07B">          el</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">dispatchEvent</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#A626A4;--shiki-dark:#C678DD">new</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> Event</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">'input'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, &#123; </span><span style="color:#E45649;--shiki-dark:#E06C75">bubble</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">:</span><span style="color:#986801;--shiki-dark:#D19A66"> true</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#E45649;--shiki-dark:#E06C75">cancelable</span><span style="color:#0184BC;--shiki-dark:#ABB2BF">:</span><span style="color:#986801;--shiki-dark:#D19A66"> true</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#125;));</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E5C07B">          el</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">value</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#50A14F;--shiki-dark:#98C379"> '> '</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> +</span><span style="color:#383A42;--shiki-dark:#E5C07B"> txt</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">replace</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#0184BC;--shiki-dark:#E06C75">/</span><span style="color:#986801;--shiki-dark:#E06C75">\n</span><span style="color:#0184BC;--shiki-dark:#E06C75">/</span><span style="color:#A626A4;--shiki-dark:#C678DD">g</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#50A14F;--shiki-dark:#98C379">'</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\n</span><span style="color:#50A14F;--shiki-dark:#98C379">> '</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) </span><span style="color:#0184BC;--shiki-dark:#56B6C2">+</span><span style="color:#50A14F;--shiki-dark:#98C379"> '</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\n\n</span><span style="color:#50A14F;--shiki-dark:#98C379">'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E5C07B">          el</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">focus</span><span style="color:#383A42;--shiki-dark:#ABB2BF">();</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E5C07B">          el</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">setSelectionRange</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#0184BC;--shiki-dark:#56B6C2">-</span><span style="color:#986801;--shiki-dark:#D19A66">1</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#0184BC;--shiki-dark:#56B6C2">-</span><span style="color:#986801;--shiki-dark:#D19A66">1</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">        &#125;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">      &#125;);</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E5C07B">      utils</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">snackbarShow</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#986801;--shiki-dark:#E5C07B">GLOBAL_CONFIG</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E5C07B">lang</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">totalk</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#986801;--shiki-dark:#D19A66">false</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#986801;--shiki-dark:#D19A66">2000</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    &#125;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E5C07B">    hpcesia</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">waitTwikoo</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E06C75">toTalkFn</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  &#125;,</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">  // ...</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">&#125;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">const</span><span style="color:#986801;--shiki-dark:#E5C07B"> hpcesia</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#123;</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">  // ...</span></span><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">  waitTwikoo</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">callback</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">scale</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#986801;--shiki-dark:#D19A66"> 100</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)&#123;</span></span><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">    setTimeout</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(() </span><span style="color:#A626A4;--shiki-dark:#C678DD">=></span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#123;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">      if</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="color:#383A42;--shiki-dark:#E5C07B">window</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">twikoo</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">        callback</span><span style="color:#383A42;--shiki-dark:#ABB2BF">()</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">      else</span></span><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">        waitTwikoo</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E06C75">callback</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    &#125;, </span><span style="color:#383A42;--shiki-dark:#E06C75">scale</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  &#125;</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">  // ...</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">&#125;</span></span></code></pre></td></tr></tbody></table></figure> 直接滑动到底部，然后等待twikoo 加载完成即可。</p><h3 id="新增游戏界面">新增游戏界面</h3><p>其实本质是把原本的 equipment 页面套个壳。你也可以直接查看 <ahref="https://github.com/HPCesia/hexo-theme-solitude/commit/1102fc37130c9460a89ae6c23cd75c11002b384b">commit</a>快速了解我的改动。</p><p>在 solitude/layout/includes/page 目录中新建 games.pug文件，写入如下内容： <figure class="highlight pug"><figcaption><span>solitude/layout/includes/page/games.pug</span></figcaption><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">include</span><span style="color:#E45649;--shiki-dark:#E06C75"> ../widgets/page/banner</span></span><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">#games</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">    if</span><span style="color:#383A42;--shiki-dark:#E5C07B"> site</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E5C07B">data</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">games</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">        each</span><span style="color:#E45649;--shiki-dark:#E06C75"> cls</span><span style="color:#A626A4;--shiki-dark:#C678DD"> in</span><span style="color:#383A42;--shiki-dark:#E5C07B"> site</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E5C07B">data</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">games</span></span><span class="line"><span style="color:#986801;--shiki-dark:#D19A66">            .game-group</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">                h2</span><span style="color:#986801;--shiki-dark:#D19A66">.game-group-title=</span><span style="color:#383A42;--shiki-dark:#E5C07B"> cls</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">name</span></span><span class="line"><span style="color:#986801;--shiki-dark:#D19A66">                .game-group-desc=</span><span style="color:#383A42;--shiki-dark:#E5C07B"> cls</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">desc</span></span><span class="line"><span style="color:#986801;--shiki-dark:#D19A66">                .game-group-content</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">                    each</span><span style="color:#E45649;--shiki-dark:#E06C75"> item</span><span style="color:#A626A4;--shiki-dark:#C678DD"> in</span><span style="color:#383A42;--shiki-dark:#E5C07B"> cls</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">list</span></span><span class="line"><span style="color:#986801;--shiki-dark:#D19A66">                        .game-item</span></span><span class="line"><span style="color:#986801;--shiki-dark:#D19A66">                            .game-item-cover</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">                                img</span><span style="color:#986801;--shiki-dark:#D19A66">.game-item-image(src</span><span style="color:#383A42;--shiki-dark:#ABB2BF">=</span><span style="color:#383A42;--shiki-dark:#E5C07B">item</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">image</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#986801;--shiki-dark:#D19A66">alt</span><span style="color:#383A42;--shiki-dark:#ABB2BF">=</span><span style="color:#383A42;--shiki-dark:#E5C07B">item</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">name</span><span style="color:#986801;--shiki-dark:#D19A66">)</span></span><span class="line"><span style="color:#986801;--shiki-dark:#D19A66">                            .game-item-info</span></span><span class="line"><span style="color:#986801;--shiki-dark:#D19A66">                                .game-item-name(onclick</span><span style="color:#383A42;--shiki-dark:#ABB2BF">=</span><span style="color:#50A14F;--shiki-dark:#98C379">'utils.copy("'</span><span style="color:#383A42;--shiki-dark:#56B6C2"> +</span><span style="color:#383A42;--shiki-dark:#E5C07B"> item</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">name</span><span style="color:#383A42;--shiki-dark:#56B6C2"> +</span><span style="color:#50A14F;--shiki-dark:#98C379"> '")'</span><span style="color:#986801;--shiki-dark:#D19A66">)=</span><span style="color:#383A42;--shiki-dark:#E5C07B"> item</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">name</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">                                if</span><span style="color:#383A42;--shiki-dark:#E5C07B"> item</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">score</span></span><span class="line"><span style="color:#986801;--shiki-dark:#D19A66">                                    .game-item-score=</span><span style="color:#50A14F;--shiki-dark:#98C379"> "评分: "</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> +</span><span style="color:#383A42;--shiki-dark:#E5C07B"> item</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">score</span></span><span class="line"><span style="color:#986801;--shiki-dark:#D19A66">                                .game-item-spec=</span><span style="color:#383A42;--shiki-dark:#E5C07B"> item</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">spec</span></span><span class="line"><span style="color:#986801;--shiki-dark:#D19A66">                                .game-item-desc=</span><span style="color:#383A42;--shiki-dark:#E5C07B"> item</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">desc</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">                                if</span><span style="color:#383A42;--shiki-dark:#E5C07B"> item</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">link</span></span><span class="line"><span style="color:#986801;--shiki-dark:#D19A66">                                    .game-item-toolbar</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">                                        a</span><span style="color:#986801;--shiki-dark:#D19A66">.game-item-link(href</span><span style="color:#383A42;--shiki-dark:#ABB2BF">=</span><span style="color:#383A42;--shiki-dark:#E5C07B">item</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">link</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#986801;--shiki-dark:#D19A66">target</span><span style="color:#383A42;--shiki-dark:#ABB2BF">=</span><span style="color:#50A14F;--shiki-dark:#98C379">"_blank"</span><span style="color:#986801;--shiki-dark:#D19A66">)</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> 详情</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">                                        a</span><span style="color:#986801;--shiki-dark:#D19A66">.bber-reply(onclick</span><span style="color:#383A42;--shiki-dark:#ABB2BF">=</span><span style="color:#50A14F;--shiki-dark:#98C379">`sco.toTalk('</span><span style="color:#CA1243;--shiki-dark:#C678DD">$&#123;</span><span style="color:#383A42;--shiki-dark:#E5C07B">item</span><span style="color:#50A14F;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">name</span><span style="color:#CA1243;--shiki-dark:#C678DD">&#125;</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\\</span><span style="color:#50A14F;--shiki-dark:#98C379">n</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\\</span><span style="color:#50A14F;--shiki-dark:#98C379">n</span><span style="color:#CA1243;--shiki-dark:#C678DD">$&#123;</span><span style="color:#383A42;--shiki-dark:#E5C07B">item</span><span style="color:#50A14F;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">spec</span><span style="color:#CA1243;--shiki-dark:#C678DD">&#125;</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\\</span><span style="color:#50A14F;--shiki-dark:#98C379">n</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\\</span><span style="color:#50A14F;--shiki-dark:#98C379">n</span><span style="color:#CA1243;--shiki-dark:#C678DD">$&#123;</span><span style="color:#383A42;--shiki-dark:#E5C07B">item</span><span style="color:#50A14F;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">desc</span><span style="color:#CA1243;--shiki-dark:#C678DD">&#125;</span><span style="color:#50A14F;--shiki-dark:#98C379">')`</span><span style="color:#986801;--shiki-dark:#D19A66">)</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">                                            i</span><span style="color:#986801;--shiki-dark:#D19A66">.solitude.fa-solid.fa-comment(style</span><span style="color:#383A42;--shiki-dark:#ABB2BF">=</span><span style="color:#50A14F;--shiki-dark:#98C379">"font-size: 1rem;"</span><span style="color:#986801;--shiki-dark:#D19A66">)</span></span></code></pre></td></tr></tbody></table></figure> 然后修改solitude/layout/page.pug，加上引入 games.pug 的代码： <figure class="highlight pug"><figcaption><span>solitude/layout/page.pug</span></figcaption><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro has-diff"><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">block</span><span style="color:#E45649;--shiki-dark:#E06C75"> content</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">    main</span><span style="color:#986801;--shiki-dark:#D19A66">.layout</span><span style="color:#4078F2;--shiki-dark:#61AFEF">#content-inner</span><span style="color:#986801;--shiki-dark:#D19A66">(class</span><span style="color:#383A42;--shiki-dark:#ABB2BF">=</span><span style="color:#383A42;--shiki-dark:#E5C07B">page</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">aside</span><span style="color:#383A42;--shiki-dark:#C678DD"> ?</span><span style="color:#50A14F;--shiki-dark:#98C379"> ''</span><span style="color:#383A42;--shiki-dark:#C678DD"> :</span><span style="color:#50A14F;--shiki-dark:#98C379"> 'hide-aside'</span><span style="color:#986801;--shiki-dark:#D19A66">)</span></span><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">        #page</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">            case</span><span style="color:#383A42;--shiki-dark:#E5C07B"> page</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">type</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">                //- ...</span></span><span class="line diff add"><span style="color:#A626A4;--shiki-dark:#C678DD">                when</span><span style="color:#50A14F;--shiki-dark:#98C379"> 'games'</span></span><span class="line diff add"><span style="color:#A626A4;--shiki-dark:#C678DD">                    include</span><span style="color:#E45649;--shiki-dark:#E06C75"> includes/page/games</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">                //- ...</span></span></code></pre></td></tr></tbody></table></figure>最后在 ./source/_data 目录下新建 games.yml 文件，写入如下格式的内容：<figure class="highlight yaml"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">- </span><span style="color:#E45649;--shiki-dark:#E06C75">name</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">好游戏</span><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> # 分类名称</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">  desc</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">比较喜欢的游戏</span><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> # 分类描述</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">  list</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 游戏列表</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    - </span><span style="color:#E45649;--shiki-dark:#E06C75">name</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">Mincraft</span><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> # 游戏名称</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">      score</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">9/10</span><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> # 游戏评分，可选</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">      spec</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">神作，无需多言</span><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> # 副标题</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">      desc</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">"探索随机生成的世界，建造从最简单的住宅到最宏伟的城堡等一切不可思议之物。您可以在创造模式中享用无限资源，也可以在生存模式中挖掘整个世界，合成武器和盔甲，抵御各种危险生物。攀登崎岖的群山，探明复杂的洞穴，挖掘大型矿脉。探索错综的洞穴与石笋洞穴生物群系。用蜡烛照亮世界，展示出自己作为知识渊博的地下冒险者和登山大师的风采！"</span><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> # 游戏描述</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">      link</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">http://www.minecraft.net/</span><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> # 游戏链接</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">      image</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">https://bu.dusays.com/2024/11/04/672882a184cb7.webp</span><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> # 游戏封面</span></span></code></pre></td></tr></tbody></table></figure> 此时使用 <code>hexo generate</code>，游戏页面的 HTML已可正确渲染。如果发现不能正常渲染请使用 <code>hexo clean</code>清除缓存后重试。</p><p>接着来为该界面添加样式。在 solitude/scripts/helper/stylus.js 中定义games 页面样式引入所需的 stylus 变量： <figure class="highlight javascript"><figcaption><span>solitude/scripts/helper/stylus.js</span></figcaption><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro has-diff"><span class="line"><span style="color:#383A42;--shiki-dark:#E5C07B">hexo</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E5C07B">extend</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E5C07B">filter</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">register</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">'stylus:renderer'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#A626A4;--shiki-dark:#C678DD">function</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">style</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) &#123;</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">    // ...</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E5C07B">    style</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">define</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">'$equipment'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#0184BC;--shiki-dark:#56B6C2">!!</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E06C75">data</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> &#x26;&#x26;</span><span style="color:#383A42;--shiki-dark:#E5C07B"> data</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">equipment</span><span style="color:#383A42;--shiki-dark:#ABB2BF">))</span></span><span class="line diff add"><span style="color:#383A42;--shiki-dark:#E5C07B">    style</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">define</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">'$games'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#0184BC;--shiki-dark:#56B6C2">!!</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E06C75">data</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> &#x26;&#x26;</span><span style="color:#383A42;--shiki-dark:#E5C07B"> data</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">games</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)) </span></span><span class="line"></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">    // highlight</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">    const</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#123;</span><span style="color:#E45649;--shiki-dark:#E06C75">syntax_highlighter</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#E5C07B">syntaxHighlighter</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#986801;--shiki-dark:#E5C07B">highlight</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#986801;--shiki-dark:#E5C07B">prismjs</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#986801;--shiki-dark:#E5C07B">shiki</span><span style="color:#383A42;--shiki-dark:#ABB2BF">&#125; </span><span style="color:#0184BC;--shiki-dark:#56B6C2">=</span><span style="color:#383A42;--shiki-dark:#E5C07B"> hexo</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">config</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">    // ...</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">&#125;);</span></span></code></pre></td></tr></tbody></table></figure> 再在solitude/source/css/_page/index.styl 中添加引入样式的代码：<figure class="highlight stylus"><figcaption><span>solitude/source/css/_page/index.styl</span></figcaption><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro has-diff"><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// ...</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">if</span><span style="color:#E45649;--shiki-dark:#E06C75"> $about</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">  @import</span><span style="color:#50A14F;--shiki-dark:#98C379"> "_about/about"</span></span><span class="line"></span><span class="line diff add"><span style="color:#A626A4;--shiki-dark:#C678DD">if</span><span style="color:#E45649;--shiki-dark:#E06C75"> $games</span></span><span class="line diff add"><span style="color:#A626A4;--shiki-dark:#C678DD">  @import</span><span style="color:#50A14F;--shiki-dark:#98C379"> "games.styl"</span></span><span class="line"></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// ...</span></span></code></pre></td></tr></tbody></table></figure> 最后新建solitude/source/css/_page/games.styl，写入如下内容： <figure class="highlight stylus"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">#games</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  margin-top </span><span style="color:#986801;--shiki-dark:#D19A66">26</span><span style="color:#986801;--shiki-dark:#E06C75">px</span></span><span class="line"></span><span class="line"><span style="color:#986801;--shiki-dark:#D19A66">  .game-group</span></span><span class="line"><span style="color:#986801;--shiki-dark:#D19A66">    .game-group-title</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">      line-height </span><span style="color:#986801;--shiki-dark:#D19A66">1</span></span><span class="line"></span><span class="line"><span style="color:#986801;--shiki-dark:#D19A66">    .game-group-desc</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">      line-height </span><span style="color:#986801;--shiki-dark:#D19A66">1</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">      margin </span><span style="color:#986801;--shiki-dark:#D19A66">4</span><span style="color:#986801;--shiki-dark:#E06C75">px</span><span style="color:#986801;--shiki-dark:#D19A66"> 0</span><span style="color:#986801;--shiki-dark:#D19A66"> 8</span><span style="color:#986801;--shiki-dark:#E06C75">px</span><span style="color:#986801;--shiki-dark:#D19A66"> 0</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">      color </span><span style="color:#4078F2;--shiki-dark:#61AFEF">var</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#E45649;--shiki-dark:#E06C75">--efu-secondtext</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"></span><span class="line"><span style="color:#986801;--shiki-dark:#D19A66">    .game-group-content</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">      display </span><span style="color:#383A42;--shiki-dark:#D19A66">flex</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">      flex-direction </span><span style="color:#383A42;--shiki-dark:#D19A66">row</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">      flex-wrap </span><span style="color:#383A42;--shiki-dark:#D19A66">wrap</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">      margin </span><span style="color:#986801;--shiki-dark:#D19A66">0</span><span style="color:#986801;--shiki-dark:#D19A66"> -8</span><span style="color:#986801;--shiki-dark:#E06C75">px</span></span><span class="line"></span><span class="line"><span style="color:#986801;--shiki-dark:#D19A66">      .game-item</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">        width </span><span style="color:#0184BC;--shiki-dark:#56B6C2">calc</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#986801;--shiki-dark:#D19A66">33</span><span style="color:#986801;--shiki-dark:#E06C75">%</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> - </span><span style="color:#986801;--shiki-dark:#D19A66">12</span><span style="color:#986801;--shiki-dark:#E06C75">px</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">        border-radius </span><span style="color:#986801;--shiki-dark:#D19A66">12</span><span style="color:#986801;--shiki-dark:#E06C75">px</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">        border </span><span style="color:#4078F2;--shiki-dark:#61AFEF">var</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#E45649;--shiki-dark:#E06C75">--style-border-always</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">        overflow </span><span style="color:#383A42;--shiki-dark:#D19A66">hidden</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">        margin </span><span style="color:#986801;--shiki-dark:#D19A66">8</span><span style="color:#986801;--shiki-dark:#E06C75">px</span><span style="color:#986801;--shiki-dark:#D19A66"> 6</span><span style="color:#986801;--shiki-dark:#E06C75">px</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">        background </span><span style="color:#4078F2;--shiki-dark:#61AFEF">var</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#E45649;--shiki-dark:#E06C75">--efu-card-bg</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">        box-shadow </span><span style="color:#4078F2;--shiki-dark:#61AFEF">var</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#E45649;--shiki-dark:#E06C75">--efu-shadow-border</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">        min-height </span><span style="color:#986801;--shiki-dark:#D19A66">400</span><span style="color:#986801;--shiki-dark:#E06C75">px</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">        position </span><span style="color:#383A42;--shiki-dark:#D19A66">relative</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">        user-select </span><span style="color:#383A42;--shiki-dark:#D19A66">none</span></span><span class="line"></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">        +</span><span style="color:#4078F2;--shiki-dark:#61AFEF">maxWidth1200</span><span style="color:#383A42;--shiki-dark:#ABB2BF">()</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">          width </span><span style="color:#0184BC;--shiki-dark:#56B6C2">calc</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#986801;--shiki-dark:#D19A66">50</span><span style="color:#986801;--shiki-dark:#E06C75">%</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> - </span><span style="color:#986801;--shiki-dark:#D19A66">12</span><span style="color:#986801;--shiki-dark:#E06C75">px</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">        +</span><span style="color:#4078F2;--shiki-dark:#61AFEF">maxWidth768</span><span style="color:#383A42;--shiki-dark:#ABB2BF">()</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">          width </span><span style="color:#986801;--shiki-dark:#D19A66">100</span><span style="color:#986801;--shiki-dark:#E06C75">%</span></span><span class="line"></span><span class="line"><span style="color:#986801;--shiki-dark:#D19A66">        .game-item-cover</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">          width </span><span style="color:#986801;--shiki-dark:#D19A66">100</span><span style="color:#986801;--shiki-dark:#E06C75">%</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">          height </span><span style="color:#986801;--shiki-dark:#D19A66">200</span><span style="color:#986801;--shiki-dark:#E06C75">px</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">          background </span><span style="color:#4078F2;--shiki-dark:#61AFEF">var</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#E45649;--shiki-dark:#E06C75">--efu-secondbg</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">          display </span><span style="color:#383A42;--shiki-dark:#D19A66">flex</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">          justify-content </span><span style="color:#383A42;--shiki-dark:#D19A66">center</span></span><span class="line"></span><span class="line"><span style="color:#986801;--shiki-dark:#D19A66">          .game-item-image</span></span><span class="line"><span style="color:#0184BC;--shiki-dark:#56B6C2">            object-fit</span><span style="color:#383A42;--shiki-dark:#D19A66"> cover</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">            width </span><span style="color:#986801;--shiki-dark:#D19A66">100</span><span style="color:#986801;--shiki-dark:#E06C75">%</span></span><span class="line"></span><span class="line"><span style="color:#986801;--shiki-dark:#D19A66">        .game-item-info</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">          padding </span><span style="color:#986801;--shiki-dark:#D19A66">8</span><span style="color:#986801;--shiki-dark:#E06C75">px</span><span style="color:#986801;--shiki-dark:#D19A66"> 16</span><span style="color:#986801;--shiki-dark:#E06C75">px</span><span style="color:#986801;--shiki-dark:#D19A66"> 16</span><span style="color:#986801;--shiki-dark:#E06C75">px</span><span style="color:#986801;--shiki-dark:#D19A66"> 16</span><span style="color:#986801;--shiki-dark:#E06C75">px</span></span><span class="line"></span><span class="line"><span style="color:#986801;--shiki-dark:#D19A66">          .game-item-name</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">            font-size </span><span style="color:#986801;--shiki-dark:#D19A66">18</span><span style="color:#986801;--shiki-dark:#E06C75">px</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">            font-weight </span><span style="color:#986801;--shiki-dark:#D19A66">700</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">            line-height </span><span style="color:#986801;--shiki-dark:#D19A66">1</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">            margin-bottom </span><span style="color:#986801;--shiki-dark:#D19A66">8</span><span style="color:#986801;--shiki-dark:#E06C75">px</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">            white-space </span><span style="color:#383A42;--shiki-dark:#D19A66">nowrap</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">            text-overflow </span><span style="color:#383A42;--shiki-dark:#D19A66">ellipsis</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">            width fit-content</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">            display </span><span style="color:#383A42;--shiki-dark:#D19A66">inline</span></span><span class="line"></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">            &#x26;</span><span style="color:#986801;--shiki-dark:#56B6C2">:hover</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">              color </span><span style="color:#4078F2;--shiki-dark:#61AFEF">var</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#E45649;--shiki-dark:#E06C75">--efu-vip</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">              cursor </span><span style="color:#383A42;--shiki-dark:#D19A66">pointer</span></span><span class="line"></span><span class="line"><span style="color:#986801;--shiki-dark:#D19A66">          .game-item-score</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">            display </span><span style="color:#383A42;--shiki-dark:#D19A66">inline</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">            position </span><span style="color:#383A42;--shiki-dark:#D19A66">absolute</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">            right </span><span style="color:#986801;--shiki-dark:#D19A66">1</span><span style="color:#986801;--shiki-dark:#E06C75">em</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">            font-size </span><span style="color:#986801;--shiki-dark:#D19A66">0.8</span><span style="color:#986801;--shiki-dark:#E06C75">em</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">            color </span><span style="color:#4078F2;--shiki-dark:#61AFEF">var</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#E45649;--shiki-dark:#E06C75">--efu-secondtext</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"></span><span class="line"><span style="color:#986801;--shiki-dark:#D19A66">          .game-item-spec</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">            font-size </span><span style="color:#986801;--shiki-dark:#D19A66">12</span><span style="color:#986801;--shiki-dark:#E06C75">px</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">            color </span><span style="color:#4078F2;--shiki-dark:#61AFEF">var</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#E45649;--shiki-dark:#E06C75">--efu-secondtext</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">            line-height </span><span style="color:#986801;--shiki-dark:#D19A66">1</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">            margin-bottom </span><span style="color:#986801;--shiki-dark:#D19A66">12</span><span style="color:#986801;--shiki-dark:#E06C75">px</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">            white-space </span><span style="color:#383A42;--shiki-dark:#D19A66">nowrap</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">            overflow </span><span style="color:#383A42;--shiki-dark:#D19A66">hidden</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">            text-overflow </span><span style="color:#383A42;--shiki-dark:#D19A66">ellipsis</span></span><span class="line"></span><span class="line"><span style="color:#986801;--shiki-dark:#D19A66">          .game-item-desc</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">            line-height </span><span style="color:#986801;--shiki-dark:#D19A66">1.4</span><span style="color:#986801;--shiki-dark:#E06C75">em</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">            color </span><span style="color:#4078F2;--shiki-dark:#61AFEF">var</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#E45649;--shiki-dark:#E06C75">--efu-secondtext</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">            height </span><span style="color:#986801;--shiki-dark:#D19A66">5.6</span><span style="color:#986801;--shiki-dark:#E06C75">em</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">            display -webkit-box</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">            overflow </span><span style="color:#383A42;--shiki-dark:#D19A66">hidden</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">            -webkit-line-clamp </span><span style="color:#986801;--shiki-dark:#D19A66">4</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">            -webkit-box-orient vertical</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">            font-size </span><span style="color:#986801;--shiki-dark:#D19A66">14</span><span style="color:#986801;--shiki-dark:#E06C75">px</span></span><span class="line"></span><span class="line"><span style="color:#986801;--shiki-dark:#D19A66">          .game-item-toolbar</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">            display </span><span style="color:#383A42;--shiki-dark:#D19A66">flex</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">            justify-content </span><span style="color:#383A42;--shiki-dark:#D19A66">space-between</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">            position </span><span style="color:#383A42;--shiki-dark:#D19A66">absolute</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">            bottom </span><span style="color:#986801;--shiki-dark:#D19A66">9</span><span style="color:#986801;--shiki-dark:#E06C75">px</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">            left </span><span style="color:#986801;--shiki-dark:#D19A66">0</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">            width </span><span style="color:#986801;--shiki-dark:#D19A66">100</span><span style="color:#986801;--shiki-dark:#E06C75">%</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">            padding </span><span style="color:#986801;--shiki-dark:#D19A66">0</span><span style="color:#986801;--shiki-dark:#D19A66"> 16</span><span style="color:#986801;--shiki-dark:#E06C75">px</span></span><span class="line"></span><span class="line"><span style="color:#986801;--shiki-dark:#D19A66">            .game-item-link</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">              font-size </span><span style="color:#986801;--shiki-dark:#D19A66">12</span><span style="color:#986801;--shiki-dark:#E06C75">px</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">              background </span><span style="color:#4078F2;--shiki-dark:#61AFEF">var</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#E45649;--shiki-dark:#E06C75">--efu-gray-op</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">              padding </span><span style="color:#986801;--shiki-dark:#D19A66">4</span><span style="color:#986801;--shiki-dark:#E06C75">px</span><span style="color:#986801;--shiki-dark:#D19A66"> 8</span><span style="color:#986801;--shiki-dark:#E06C75">px</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">              border-radius </span><span style="color:#986801;--shiki-dark:#D19A66">8</span><span style="color:#986801;--shiki-dark:#E06C75">px</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">              cursor </span><span style="color:#383A42;--shiki-dark:#D19A66">pointer</span></span><span class="line"></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">              &#x26;</span><span style="color:#986801;--shiki-dark:#56B6C2">:hover</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">                background </span><span style="color:#4078F2;--shiki-dark:#61AFEF">var</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#E45649;--shiki-dark:#E06C75">--efu-main</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">                color </span><span style="color:#4078F2;--shiki-dark:#61AFEF">var</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#E45649;--shiki-dark:#E06C75">--efu-white</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span></code></pre></td></tr></tbody></table></figure>至此，大功告成。</p><h3 id="中英混排间距与标点压缩">中英混排间距与标点压缩</h3><p>我使用的是<ahref="https://github.com/sivan/heti">赫蹏</a>（hètí）来进行标点压缩与中英文间距调整，参考：</p><a class="tag-link" href="https://www.eallion.com/cjk-punctuation/" rel="external nofollow noreferrer" target="_blank"><div class="tag-link-tips">引用站外链接</div><div class="tag-link-bottom"><div class="tag-link-left"><i class="solitude fas fa-link"></i></div><div class="tag-link-right"><div class="tag-link-title">博客排版 - 挤压中文标点符号</div><div class="tag-link-sitename">大大的小蜗牛</div></div><i class="solitude fas fa-chevron-right"></i></div></a><p>因为直接改的主题，因此要改的东西多了点，可以参看 <ahref="https://github.com/HPCesia/hexo-theme-solitude/commit/73074b6f85d980b626de6db97b12e65f6394ca13">commit</a>了解我的修改。</p><h2 id="非原创修改">非原创修改</h2><p>这部分的改造主要是参考其他博客的教程进行的，且不需要对 Solitude主题做出较大的改动，因此只放教程博文链接和少量的修改。</p><h3 id="访问统计">访问统计</h3><a class="tag-link" href="https://blog.elykia.cn/posts/8.html" rel="external nofollow noreferrer" target="_blank"><div class="tag-link-tips">引用站外链接</div><div class="tag-link-bottom"><div class="tag-link-left"><i class="solitude fas fa-link"></i></div><div class="tag-link-right"><div class="tag-link-title">Vercount：不蒜子的完美替代方案</div><div class="tag-link-sitename">致以无暇之人</div></div><i class="solitude fas fa-chevron-right"></i></div></a><p>直接照着做就行，Solitude 主题配置方法一模一样。</p><h3 id="侧边栏来访者卡片">侧边栏来访者卡片</h3><a class="tag-link" href="https://blog.qjqq.cn/posts/834f.html" rel="external nofollow noreferrer" target="_blank"><div class="tag-link-tips">引用站外链接</div><div class="tag-link-bottom"><div class="tag-link-left"><i class="solitude fas fa-link"></i></div><div class="tag-link-right"><div class="tag-link-title">添加来访者卡片</div><div class="tag-link-sitename">青桔气球</div></div><i class="solitude fas fa-chevron-right"></i></div></a><p>直接照着做就行。</p><h3 id="友链朋友圈">友链朋友圈</h3><p>我这边使用的是 <a href="https://blog.liushen.fun/" rel="external nofollow noreferrer">LiuShen</a>大佬的<ahref="https://github.com/willow-god/Friend-Circle-Lite">轻量友链朋友圈</a>，使用GitHub Action + Netlify 的方式进行部署。</p><p>本身没什么好说的，大部分都是直接照着部署即可，不过针对 Solitude主题需要进行少量修改。</p><p>首先是 link.js，也就是用来生成 friend.json的代码，我根据自己对主题的修改和主题本身的 links.yml文件结构做了小小的修改： <figure class="highlight javascript"><figcaption><span>link.js</span></figcaption><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro has-diff"><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">const</span><span style="color:#986801;--shiki-dark:#E5C07B"> YML</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> require</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">"yamljs"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">const</span><span style="color:#986801;--shiki-dark:#E5C07B"> fs</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> require</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">"fs"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">let</span><span style="color:#383A42;--shiki-dark:#E06C75"> friends</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> [];</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">let</span><span style="color:#383A42;--shiki-dark:#E06C75"> data_f</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#986801;--shiki-dark:#E5C07B"> YML</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">parse</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E5C07B">  fs</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">readFileSync</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">"source/_data/links.yml"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    .</span><span style="color:#4078F2;--shiki-dark:#61AFEF">toString</span><span style="color:#383A42;--shiki-dark:#ABB2BF">()</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    .</span><span style="color:#4078F2;--shiki-dark:#61AFEF">replace</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#0184BC;--shiki-dark:#E06C75">/(?&#x3C;=rss:)</span><span style="color:#986801;--shiki-dark:#E06C75">\s</span><span style="color:#0184BC;--shiki-dark:#D19A66">*</span><span style="color:#986801;--shiki-dark:#E06C75">\n</span><span style="color:#0184BC;--shiki-dark:#E06C75">/</span><span style="color:#A626A4;--shiki-dark:#C678DD">g</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#50A14F;--shiki-dark:#98C379">' ""</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\n</span><span style="color:#50A14F;--shiki-dark:#98C379">'</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line diff add"><span style="color:#383A42;--shiki-dark:#ABB2BF">).</span><span style="color:#E45649;--shiki-dark:#E06C75">links</span><span style="color:#383A42;--shiki-dark:#ABB2BF">; </span></span><span class="line"></span><span class="line"><span style="color:#383A42;--shiki-dark:#E5C07B">data_f</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">forEach</span><span style="color:#383A42;--shiki-dark:#ABB2BF">((</span><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">entry</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">index</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) </span><span style="color:#A626A4;--shiki-dark:#C678DD">=></span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#123;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">  let</span><span style="color:#383A42;--shiki-dark:#E06C75"> lastIndex</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#986801;--shiki-dark:#D19A66"> 3</span><span style="color:#383A42;--shiki-dark:#ABB2BF">;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">  if</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="color:#383A42;--shiki-dark:#E06C75">index</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> &#x3C;</span><span style="color:#383A42;--shiki-dark:#E06C75"> lastIndex</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) &#123;</span></span><span class="line diff add"><span style="color:#A626A4;--shiki-dark:#C678DD">    const</span><span style="color:#986801;--shiki-dark:#E5C07B"> filteredLinkList</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#E5C07B"> entry</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E5C07B">link_list</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">filter</span><span style="color:#383A42;--shiki-dark:#ABB2BF">((</span><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">i</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) </span><span style="color:#A626A4;--shiki-dark:#C678DD">=></span><span style="color:#0184BC;--shiki-dark:#56B6C2"> !</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">"noTravel"</span><span style="color:#A626A4;--shiki-dark:#C678DD"> in</span><span style="color:#383A42;--shiki-dark:#E06C75"> i</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> &#x26;&#x26;</span><span style="color:#383A42;--shiki-dark:#E5C07B"> i</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">noTravel</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)); </span></span><span class="line"><span style="color:#383A42;--shiki-dark:#E06C75">    friends</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#E5C07B"> friends</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">concat</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#E06C75">filteredLinkList</span><span style="color:#383A42;--shiki-dark:#ABB2BF">);</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  &#125;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">&#125;);</span></span><span class="line"></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// ...</span></span></code></pre></td></tr></tbody></table></figure></p><p>还有就是 Netlify 部署静态网页所需的一点小改动。因为我博客是部署在GitHub Page 上的，所以需要配置一下跨域。在 main 分支的 static 目录下新建netlify.toml 文件，里面写上 <figure class="highlight toml"><figcaption><span>netlify.toml</span></figcaption><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">[[</span><span style="color:#4078F2;--shiki-dark:#61AFEF">headers</span><span style="color:#383A42;--shiki-dark:#ABB2BF">]]</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">  for</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> = </span><span style="color:#50A14F;--shiki-dark:#98C379">"/*"</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  [</span><span style="color:#4078F2;--shiki-dark:#61AFEF">headers</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">values</span><span style="color:#383A42;--shiki-dark:#ABB2BF">]</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">    access-control-allow-origin</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> = </span><span style="color:#50A14F;--shiki-dark:#98C379">"https://blog.hpcesia.com"</span><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> # 改成你自己的博客地址</span></span></code></pre></td></tr></tbody></table></figure></p><p>同时修改 .github/workflow/friend_circle_lite.yml，commit 中加上netlify.toml： <figure class="highlight yaml"><figcaption><span>.github/workflow/friend_circle_lite.yml</span></figcaption><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">- </span><span style="color:#E45649;--shiki-dark:#E06C75">name</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">Commit changes</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">     run</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#A626A4;--shiki-dark:#C678DD">|</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">       mkdir pages</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">       cp -r main ./static/netlify.toml ./static/index.html ./static/readme.md ./static/favicon.ico ./static/bg-light.webp ./static/bg-dark.webp all.json errors.json pages/</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">       cd pages</span></span></code></pre></td></tr></tbody></table></figure></p><p>然后再运行 Action 即可。</p><h3 id="umami-统计">Umami 统计</h3><p><a href="https://umami.is/" rel="external nofollow noreferrer">Umami</a>是一个可以自部署的开源网站统计工具，可以代替 51LA 进行网站统计。</p><p>我自己选择的部署方式是 Vercel + Supabase + CloudflareWorker，全免费部署。首先需要将 Umami 部署到 Vercel上，这里我参考的是一篇英文的保姆级教程：</p><a class="tag-link" href="https://route360.dev/en/post/umami-supabase/" rel="external nofollow noreferrer" target="_blank"><div class="tag-link-tips">引用站外链接</div><div class="tag-link-bottom"><div class="tag-link-left"><i class="solitude fas fa-link"></i></div><div class="tag-link-right"><div class="tag-link-title">How to run Umami Analytics + Supabase + Vercel for free - Route360</div><div class="tag-link-sitename">Mayumi Hara</div></div><i class="solitude fas fa-chevron-right"></i></div></a><p>然后需要利用 Cloudflare Worker 来将 Umami 的 API暴露出来，这里我参考的是<ahref="https://blog.bsgun.cn/">梦爱吃鱼</a>大佬的文章：</p><a class="tag-link" href="https://blog.bsgun.cn/posts/d0612c0e/" rel="external nofollow noreferrer" target="_blank"><div class="tag-link-tips">引用站外链接</div><div class="tag-link-bottom"><div class="tag-link-left"><i class="solitude fas fa-link"></i></div><div class="tag-link-right"><div class="tag-link-title">CF Worker部署Umami的API</div><div class="tag-link-sitename">梦爱吃鱼</div></div><i class="solitude fas fa-chevron-right"></i></div></a><p>最后是在 Solitude 主题中接入，翻看<ahref="%5Blayout/includes/widgets/page/about/other.pug%5D(https://github.com/everfu/hexo-theme-solitude/blob/6e05f09edd0bf7f9287d7624cd12b886aa88a4f4/layout/includes/widgets/page/about/other.pug#L39)">源码</a>可以发现关于页面的统计卡片事实上是实现了Umami 统计的接入的（但是主题文档压根没提），于是我们只需要修改一下about.yml 即可：</p><figure class="highlight yaml"><figcaption><span>_data/about.yml</span></figcaption><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">tj</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">  provider</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">custom</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">  url</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">https://umami-api.hpcesia.com/</span><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> # 换成你自己部署的 API 入口</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">  img</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">https://7.isyangs.cn/1/65eb2e9109826-1.png</span></span></code></pre></td></tr></tbody></table></figure><h3 id="底栏图片">底栏图片</h3><p>我参考的是下面这篇文章的修改方法：</p><a class="tag-link" href="https://blog.qjqq.cn/posts/f69c.html" rel="external nofollow noreferrer" target="_blank"><div class="tag-link-tips">引用站外链接</div><div class="tag-link-bottom"><div class="tag-link-left"><i class="solitude fas fa-link"></i></div><div class="tag-link-right"><div class="tag-link-title">给你的博客底部添加一排宠物</div><div class="tag-link-sitename">青桔气球</div></div><i class="solitude fas fa-chevron-right"></i></div></a><p>因为我不准备放小动物（目前放的是<ahref="https://bu.dusays.com/2024/11/05/6729fd1e96b9d.webp"><code>七七探头.webp</code></a>），因此稍微修改了一下，你可以直接看<ahref="https://github.com/HPCesia/hexo-theme-solitude/commit/7ab6caeec4506de7257ac7ab5a4bae2a7464eb9b">commit</a>来查看我的修改方式。</p><h3 id="memos-说说接入">Memos 说说接入</h3><p>参考的是：</p><a class="tag-link" href="https://blog.meuicat.cn/posts/d525bbc8.html" rel="external nofollow noreferrer" target="_blank"><div class="tag-link-tips">引用站外链接</div><div class="tag-link-bottom"><div class="tag-link-left"><i class="solitude fas fa-link"></i></div><div class="tag-link-right"><div class="tag-link-title">Solitude魔改教程：动态即刻短文</div><div class="tag-link-sitename">亦小封</div></div><i class="solitude fas fa-chevron-right"></i></div></a><p>根据 0.22 版本 Memos 的 API 变化和 Solitude主题的更新，做了一些修改，篇幅较长，单独开了一篇文章：</p><a class="tag-link" href="https://blog.hpcesia.com/posts/a604572f" target="_blank"><div class="tag-link-tips">引用站外链接</div><div class="tag-link-bottom"><div class="tag-link-left"><i class="solitude fas fa-link"></i></div><div class="tag-link-right"><div class="tag-link-title">在 Hexo 博客中接入新版 Memos</div><div class="tag-link-sitename">璜珀的小屋</div></div><i class="solitude fas fa-chevron-right"></i></div></a>]]></content:encoded>
      
      
      <category domain="https://blog.hpcesia.com/categories/%E5%B0%8F%E5%B1%8B%E7%9B%B8%E5%85%B3/">小屋相关</category>
      
      
      <category domain="https://blog.hpcesia.com/tags/Hexo/">Hexo</category>
      
      <category domain="https://blog.hpcesia.com/tags/%E5%8D%9A%E5%AE%A2/">博客</category>
      
      <category domain="https://blog.hpcesia.com/tags/Solitude/">Solitude</category>
      
      
      <comments>https://blog.hpcesia.com/posts/4ca8244b/#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>VSCode + MSYS2 + Clang + Clangd + Xmake 配置优雅的 Windows C++ 开发环境</title>
      <link>https://blog.hpcesia.com/posts/ba9eeffb/</link>
      <guid>https://blog.hpcesia.com/posts/ba9eeffb/</guid>
      <pubDate>Sun, 13 Oct 2024 07:21:27 GMT</pubDate>
      
      <description>使用 VSCode + MSYS2 + Clang + Clangd + Xmake 搭建优雅的 Windows C++ 开发环境。</description>
      
      
      
      <content:encoded><![CDATA[<details><summary>更新日志</summary><div class="timeline"><span class="timeline-title"><div class="timenode"><div class="meta"><p>2024-10-13</p></div><div class="body"><p>发布文章。</p></div></div></div></details><h2 id="准备工作">准备工作</h2><p>由于我们最终是要使用 VSCode 而非 Visual Studio 进行 C++开发，因此本节 Clang 的安装将使用 MSYS2 + mingw-w64 进行。</p><h3 id="安装-msys2">安装 MSYS2</h3><p>在 <a href="https://github.com/msys2/msys2-installer/releases" rel="external nofollow noreferrer">GitHubRelease</a> 上下载最新版的 MSYS2 安装包。如果访问 GitHub有困难，也可以使用<ahref="https://mirrors.tuna.tsinghua.edu.cn/msys2/distrib/">清华镜像源</a>进行下载。</p><p>下载后打开安装程序，选择一个合适的路径，然后一路点 next即可安装完成。</p><p>打开 Windows Terminal，在设置中选择打开 JSON文件，然后将下列配置添加到打开的 JSON 文件中，注意更换 MSYS2路径为自己的安装路径： <figure class="highlight json"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">"profiles"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: &#123;</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">  "list"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  [</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">    // ...</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    &#123;</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">      "guid"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">"&#123;17da3cac-b318-431e-8a3e-7fcdefe6d114&#125;"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">      "name"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">"Clang64 / MSYS2"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">      "commandline"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">"C:/msys64/msys2_shell.cmd -defterm -here -no-start -clang64"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">      "startingDirectory"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">"C:/msys64/home/%USERNAME%"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">      "icon"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">"C:/msys64/Clang64.ico"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    &#125;,</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    &#123;</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">      "guid"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">"&#123;71160544-14d8-4194-af25-d05feeac7233&#125;"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">      "name"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">"MSYS / MSYS2"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">      "commandline"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">"C:/msys64/msys2_shell.cmd -defterm -here -no-start -msys"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">      "startingDirectory"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">"C:/msys64/home/%USERNAME%"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">      "icon"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">"C:/msys64/msys2.ico"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    &#125;,</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">    // ...</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  ]</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">&#125;</span></span></code></pre></td></tr></tbody></table></figure> 接着在 Windows Terminal中打开刚刚设置的 Clang64 / MSYS2 界面，在终端中输入 <figure class="highlight shell"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">sed</span><span style="color:#986801;--shiki-dark:#D19A66"> -i</span><span style="color:#50A14F;--shiki-dark:#98C379"> "s#https\?://mirror.msys2.org/#https://mirrors.tuna.tsinghua.edu.cn/msys2/#g"</span><span style="color:#50A14F;--shiki-dark:#98C379"> /etc/pacman.d/mirrorlist</span><span style="color:#E45649;--shiki-dark:#E5C07B">*</span></span></code></pre></td></tr></tbody></table></figure> 将MSYS2 的包仓库更换为清华镜像源，然后输入 <figure class="highlight shell"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">pacman</span><span style="color:#986801;--shiki-dark:#D19A66"> -Syu</span></span></code></pre></td></tr></tbody></table></figure> 更新系统。</p><h3 id="安装-clang-工具链">安装 Clang 工具链</h3><div class="note warning modern"><i class="solitude fas fa-info-circle"></i><p>clang 应当安装在 clang64 环境下，否则会导致 clangd 识别头文件出错</p></div><p>在 Clang64 / MSYS2 命令行中输入 <figure class="highlight shell"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">pacman</span><span style="color:#986801;--shiki-dark:#D19A66"> -S</span><span style="color:#50A14F;--shiki-dark:#98C379"> mingw-w64-clang-x86_64-toolchain</span></span></code></pre></td></tr></tbody></table></figure> 即可安装 clang工具链。</p><h3 id="安装-xmake">安装 Xmake</h3><div class="tabs" id="xmake安装,"><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#xmake安装,-0">Windows 安装包</button></li><li class="tab"><button type="button" data-href="#xmake安装,-1">winget</button></li><li class="tab"><button type="button" data-href="#xmake安装,-2">msys2</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="xmake安装,-0"><p>在 <a href="https://github.com/xmake-io/xmake/releases" rel="external nofollow noreferrer">Release</a>上下载最新版的 xmake-master.win64.exe，安装即可。</p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="solitude fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="xmake安装,-1"><p>在终端输入 <figure class="highlight shell"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">winget</span><span style="color:#50A14F;--shiki-dark:#98C379"> install</span><span style="color:#50A14F;--shiki-dark:#98C379"> xmake</span></span></code></pre></td></tr></tbody></table></figure> 即可安装 Xmake。</p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="solitude fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="xmake安装,-2"><p>在 Clang64 / MSYS2 命令行中输入 <figure class="highlight shell"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">pacman</span><span style="color:#986801;--shiki-dark:#D19A66"> -Sy</span><span style="color:#50A14F;--shiki-dark:#98C379"> mingw-w64-x86_64-xmake</span></span></code></pre></td></tr></tbody></table></figure> 即可安装 Xmake。</p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="solitude fas fa-arrow-up"></i></button></div></div></div><h3 id="安装-vscode-插件">安装 VSCode 插件</h3><p>在 VSCode 的扩展选项卡搜索 Clangd、CodeLLDB、Xmake 并安装。</p><p>CodeLLDB的安装过程中会下载一个文件，国内网络大概率下载失败，可以点击弹出消息的手动下载按钮，然后再从VSIX 安装下载的包。</p><h2 id="配置">配置</h2><h3 id="vscode-配置">VSCode 配置</h3><p>在 VSCode 的 setting.json 中添加如下内容： <figure class="highlight json"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// Xmake</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">"xmake.debugConfigType"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">"codelldb"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 使用 codelldb 插件而非 cpptools 进行调试</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">"xmake.runMode"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">"buildRun"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 运行前自动 build</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">"xmake.buildLevel"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">"verbose"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 设置编译时输出信息级别,默认是warnings级别,仅输出编译警告信息以及正常信息,verbose级别输出完整的编译命令行参数,debug级别对应 xmake -vD 的诊断信息，会打印出错的栈信息</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">"xmake.customDebugConfig"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: &#123;</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">    "console"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">"integratedTerminal"</span><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> // XMake调试时使用集成终端而非 debug console,也可以使用 externalTerminal</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">&#125;,</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// Clangd</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">"clangd.path"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">"C:/msys64/clang64/bin/clangd.exe"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// Clangd 文件位置</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">"clangd.arguments"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: [</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">  "--all-scopes-completion"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 全局补全(补全建议会给出在当前作用域不可见的索引,插入后自动补充作用域标识符),例如在main()中直接写cout,即使没有`#include &#x3C;iostream>`,也会给出`std::cout`的建议,配合"--header-insertion=iwyu",还可自动插入缺失的头文件</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">  "--background-index"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 后台分析并保存索引文件</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">  "--clang-tidy"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 启用 Clang-Tidy 以提供「静态检查」</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">  "--clang-tidy-checks=performance-*, bugprone-*, misc-*, google-*, modernize-*, readability-*, portability-*"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">  "--compile-commands-dir=$&#123;workspaceFolder&#125;/.vscode"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 编译数据库(compile_commands.json 文件)的目录位置</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">  "--completion-parse=auto"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 当 clangd 准备就绪时，用它来分析建议</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">  "--completion-style=detailed"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 建议风格：打包(重载函数只会给出一个建议);还可以设置为 detailed</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">  "--enable-config"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 启用配置文件(YAML格式)</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">  "--fallback-style=LLVM"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 默认格式化风格: 在没找到 .clang-format 文件时采用,可用的有 LLVM, Google, Chromium, Mozilla, Webkit, Microsoft, GNU</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">  "--function-arg-placeholders=true"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 补全函数时，将会给参数提供占位符，键入后按 Tab 可以切换到下一占位符，乃至函数末</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">  "--header-insertion-decorators"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 输入建议中，已包含头文件的项与还未包含头文件的项会以圆点加以区分</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">  "--header-insertion=never"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 插入建议时不自动引入头文件</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">  "--log=verbose"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 让 Clangd 生成更详细的日志</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">  "--pch-storage=memory"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// pch 优化的位置(Memory 或 Disk,前者会增加内存开销，但会提升性能)</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">  "--pretty"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 输出的 JSON 文件更美观</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">  "--ranking-model=decision_forest"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 建议的排序方案：hueristics (启发式), decision_forest (决策树)</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">  "-j=12"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 同时开启的任务数量</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">  "--query-driver=C:/msys64/clang64/bin/clang*"</span><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> // clang 编译器的路径（设置错误会导致 clangd 无法识别标准库）</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">],</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">"clangd.checkUpdates"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#0184BC;--shiki-dark:#D19A66">true</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 自动检测 clangd 更新</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">"clangd.onConfigChanged"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">"restart"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 借助网上的信息排序建议</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">"clangd.detectExtensionConflicts"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#0184BC;--shiki-dark:#D19A66">true</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 当其它拓展与 clangd 冲突时警告并建议禁用</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">"editor.suggest.snippetsPreventQuickSuggestions"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#0184BC;--shiki-dark:#D19A66">false</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// clangd的snippets有很多的跳转点，不用这个就必须手动触发Intellisense了</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// LLDB</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">"lldb.commandCompletions"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#0184BC;--shiki-dark:#D19A66">true</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// LLDB 指令自动补全</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">"lldb.dereferencePointers"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#0184BC;--shiki-dark:#D19A66">true</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// LLDB 指针显示解引用内容</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">"lldb.evaluateForHovers"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#0184BC;--shiki-dark:#D19A66">true</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// LLDB 鼠标悬停在变量上时预览变量值</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">"lldb.launch.expressions"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">"native"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// LLDB 监视表达式的默认类型</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">"lldb.showDisassembly"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">"never"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// LLDB 不显示汇编代码</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">"lldb.verboseLogging"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#0184BC;--shiki-dark:#D19A66">true</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span></code></pre></td></tr></tbody></table></figure>接下来，就可以创建一个空文件夹，作为自己的一个 C++ 测试项目了。</p><h3 id="项目配置文件">项目配置文件</h3><p>在项目根目录下新建 <code>.clangd</code>、<code>.clang-tidy</code> 和<code>.clang-format</code> 三个文件，分别填入如下内容：</p><ul><li><p><code>.clangd</code> 文件： 文件中<code>readability-identifier-naming</code> 部分请参阅<ahref="https://clang.llvm.org/extra/clang-tidy/checks/readability/identifier-naming.html">官方文档</a>进行个性化修改。<figure class="highlight yaml"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">Diagnostics</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">  ClangTidy</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">    Add</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">      [</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">        readability-identifier*</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">      ]</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">    CheckOptions</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">      # 变量命名规则</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">      # 详细请参考官方文档 https://clang.llvm.org/extra/clang-tidy/checks/readability/identifier-naming.html</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">      readability-identifier-naming.VariableCase</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">lower_case</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">      readability-identifier-naming.GlobalVariableCase</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">lower_case</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">      readability-identifier-naming.GlobalVariablePrefix</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">g_</span></span><span class="line"></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">      readability-identifier-naming.MemberPrefix</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">m_</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">      readability-identifier-naming.MemberCase</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">lower_case</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">      readability-identifier-naming.ClassMemberPrefix</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">m_</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">      readability-identifier-naming.ClassMemberCase</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">lower_case</span></span><span class="line"></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">      readability-identifier-naming.EnumCase</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">UPPER_CASE</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">      readability-identifier-naming.EnumConstantCase</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">UPPER_CASE</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">      readability-identifier-naming.MacroDefinitionCase</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">UPPER_CASE</span></span><span class="line"></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">      readability-identifier-naming.ClassCase</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">CamelCase</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">      readability-identifier-naming.StructCase</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">Camelcase</span></span><span class="line"></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">      readability-identifier-naming.FunctionCase</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">camelCase</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">      readability-identifier-naming.ClassMethodCase</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">camelCase</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">      readability-identifier-naming.MethodCase</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">camelCase</span></span><span class="line"></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">      readability-identifier-naming.ConstantCase</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">UPPER_CASE</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">      readability-identifier-naming.ConstantParameterCase</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">camel_Snake_Back</span></span><span class="line"></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">CompileFlags</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">  Add</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    - </span><span style="color:#50A14F;--shiki-dark:#98C379">"-pedantic"</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    - </span><span style="color:#50A14F;--shiki-dark:#98C379">"-Wall"</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    - </span><span style="color:#50A14F;--shiki-dark:#98C379">"-Wextra"</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    - </span><span style="color:#50A14F;--shiki-dark:#98C379">"-Wcast-align"</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    - </span><span style="color:#50A14F;--shiki-dark:#98C379">"-Wdouble-promotion"</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    - </span><span style="color:#50A14F;--shiki-dark:#98C379">"-Wformat=2"</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    - </span><span style="color:#50A14F;--shiki-dark:#98C379">"-Wimplicit-fallthrough"</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    - </span><span style="color:#50A14F;--shiki-dark:#98C379">"-Wmisleading-indentation"</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    - </span><span style="color:#50A14F;--shiki-dark:#98C379">"-Wnon-virtual-dtor"</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    - </span><span style="color:#50A14F;--shiki-dark:#98C379">"-Wnull-dereference"</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    - </span><span style="color:#50A14F;--shiki-dark:#98C379">"-Wold-style-cast"</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    - </span><span style="color:#50A14F;--shiki-dark:#98C379">"-Woverloaded-virtual"</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    - </span><span style="color:#50A14F;--shiki-dark:#98C379">"-Wpedantic"</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    - </span><span style="color:#50A14F;--shiki-dark:#98C379">"-Wshadow"</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    - </span><span style="color:#50A14F;--shiki-dark:#98C379">"-Wunused"</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    - </span><span style="color:#50A14F;--shiki-dark:#98C379">"-pthread"</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    - </span><span style="color:#50A14F;--shiki-dark:#98C379">"-fuse-ld=lld"</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    - </span><span style="color:#50A14F;--shiki-dark:#98C379">"-fsanitize=address"</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    - </span><span style="color:#50A14F;--shiki-dark:#98C379">"-fsanitize=undefined"</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    - </span><span style="color:#50A14F;--shiki-dark:#98C379">"-stdlib=libc++"</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    - </span><span style="color:#50A14F;--shiki-dark:#98C379">"-std=c++20"</span><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> # 根据实际需要填写</span></span></code></pre></td></tr></tbody></table></figure></p></li><li><p><code>.clang-tidy</code> 文件： <figure class="highlight yaml"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">---</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">Checks</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">"bugprone-*,</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">google-*,</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">misc-*,</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">modernize-*,</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">performance-*,</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">readability-*,</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">portability-*,</span><span style="color:#0184BC;--shiki-dark:#56B6C2">\</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">"</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">HeaderFilterRegex</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">'Source/cm[^/]*\.(h|hxx|cxx)$'</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">CheckOptions</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  - </span><span style="color:#E45649;--shiki-dark:#E06C75">key</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:   </span><span style="color:#50A14F;--shiki-dark:#98C379">modernize-use-default-member-init.UseAssignment</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">    value</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">'1'</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  - </span><span style="color:#E45649;--shiki-dark:#E06C75">key</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:   </span><span style="color:#50A14F;--shiki-dark:#98C379">modernize-use-equals-default.IgnoreMacros</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">    value</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">'0'</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  - </span><span style="color:#E45649;--shiki-dark:#E06C75">key</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:   </span><span style="color:#50A14F;--shiki-dark:#98C379">modernize-use-auto.MinTypeNameLength</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">    value</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">'80'</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">...</span></span></code></pre></td></tr></tbody></table></figure></p></li><li><p><code>.clang-format</code> 文件： 可以取消<code>BasedOnStyle</code> 项的注释，然后只保留少数自定义修改。<figure class="highlight yaml"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br><span class="line">267</span><br><span class="line">268</span><br><span class="line">269</span><br><span class="line">270</span><br><span class="line">271</span><br><span class="line">272</span><br><span class="line">273</span><br><span class="line">274</span><br><span class="line">275</span><br><span class="line">276</span><br><span class="line">277</span><br><span class="line">278</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">---</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 语言: None, Cpp, Java, JavaScript, ObjC, Proto, TableGen, TextProto</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">Language</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:        </span><span style="color:#50A14F;--shiki-dark:#98C379">Cpp</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 基础风格</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># BasedOnStyle:  LLVM</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 访问说明符(public、private等)的偏移</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">AccessModifierOffset</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">-4</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 开括号(开圆括号、开尖括号、开方括号)后的对齐: Align, DontAlign, AlwaysBreak(总是在开括号后换行)</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">AlignAfterOpenBracket</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">Align</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 对齐数组列</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">AlignArrayOfStructures</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">None</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 对齐连续宏定义</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">AlignConsecutiveMacros</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">None</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 连续赋值时，对齐所有等号</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">AlignConsecutiveAssignments</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">None</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 对齐连续位字段</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">AlignConsecutiveBitFields</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">None</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 连续声明时，对齐所有声明的变量名</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">AlignConsecutiveDeclarations</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">None</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 左对齐逃脱换行(使用反斜杠换行)的反斜杠</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">AlignEscapedNewlines</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">Left</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 水平对齐二元和三元表达式的操作数</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">AlignOperands</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:   </span><span style="color:#50A14F;--shiki-dark:#98C379">Align</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 对齐连续的尾随的注释</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">AlignTrailingComments</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">true</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 允许函数声明的所有参数在放在下一行</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">AllowAllParametersOfDeclarationOnNextLine</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">true</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 允许短的枚举放在同一行</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">AllowShortEnumsOnASingleLine</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">true</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 允许短的块放在同一行</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">AllowShortBlocksOnASingleLine</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">Never</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 允许短的case标签放在同一行</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">AllowShortCaseLabelsOnASingleLine</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">false</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 允许短的函数放在同一行</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">AllowShortFunctionsOnASingleLine</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">All</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 允许短的匿名函数放在同一行</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">AllowShortLambdasOnASingleLine</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">All</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 允许短的if语句保持在同一行</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">AllowShortIfStatementsOnASingleLine</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">Never</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 允许短的循环保持在同一行</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">AllowShortLoopsOnASingleLine</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">false</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 总是在返回类型后换行</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">AlwaysBreakAfterReturnType</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">None</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 总是在多行string字面量前换行</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">AlwaysBreakBeforeMultilineStrings</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">false</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 总是在template声明后换行</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">AlwaysBreakTemplateDeclarations</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">MultiLine</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">AttributeMacros</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  - </span><span style="color:#50A14F;--shiki-dark:#98C379">__capability</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># false表示函数实参要么都在同一行，要么都各自一行</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">BinPackArguments</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">true</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># false表示所有形参要么都在同一行，要么都各自一行</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">BinPackParameters</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">true</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 大括号换行，只有当BreakBeforeBraces设置为Custom时才有效</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">BraceWrapping</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">  AfterCaseLabel</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:  </span><span style="color:#986801;--shiki-dark:#D19A66">false</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">  AfterClass</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:      </span><span style="color:#986801;--shiki-dark:#D19A66">false</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">  AfterControlStatement</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">Never</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">  AfterEnum</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:       </span><span style="color:#986801;--shiki-dark:#D19A66">false</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">  AfterFunction</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:   </span><span style="color:#986801;--shiki-dark:#D19A66">false</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">  AfterNamespace</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:  </span><span style="color:#986801;--shiki-dark:#D19A66">false</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">  AfterObjCDeclaration</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">false</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">  AfterStruct</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:     </span><span style="color:#986801;--shiki-dark:#D19A66">false</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">  AfterUnion</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:      </span><span style="color:#986801;--shiki-dark:#D19A66">false</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">  AfterExternBlock</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">false</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">  BeforeCatch</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:     </span><span style="color:#986801;--shiki-dark:#D19A66">false</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">  BeforeElse</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:      </span><span style="color:#986801;--shiki-dark:#D19A66">false</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">  BeforeLambdaBody</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">false</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">  BeforeWhile</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:     </span><span style="color:#986801;--shiki-dark:#D19A66">false</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">  IndentBraces</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:    </span><span style="color:#986801;--shiki-dark:#D19A66">false</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">  SplitEmptyFunction</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">true</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">  SplitEmptyRecord</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">true</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">  SplitEmptyNamespace</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">true</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 在二元运算符前换行</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">BreakBeforeBinaryOperators</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">None</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 在concept前换行</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">BreakBeforeConceptDeclarations</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">true</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 在大括号前换行: Attach(始终将大括号附加到周围的上下文)</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">BreakBeforeBraces</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">Attach</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 继承列表样式</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">BreakInheritanceList</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">AfterComma</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 在三元运算符前换行</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">BreakBeforeTernaryOperators</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">true</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 构造函数初始值设定项换行样式</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">BreakConstructorInitializers</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">BeforeComma</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 在java字段的注释后换行</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">BreakAfterJavaFieldAnnotations</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">false</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 每行字符的限制，0表示没有限制</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">ColumnLimit</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:     </span><span style="color:#986801;--shiki-dark:#D19A66">96</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 描述具有特殊意义的注释的正则表达式，它不应该被分割为多行或以其它方式改变</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">CommentPragmas</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:  </span><span style="color:#50A14F;--shiki-dark:#98C379">'^ IWYU pragma:'</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 在新行上声明每个命名空间</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">CompactNamespaces</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">false</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 构造函数的初始化列表的缩进宽度</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">ConstructorInitializerIndentWidth</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">4</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 延续的行的缩进宽度</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">ContinuationIndentWidth</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">4</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 去除C++11的列表初始化的大括号&#123;后和&#125;前的空格</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">Cpp11BracedListStyle</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">true</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 继承最常用的换行方式</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">DeriveLineEnding</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">true</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 继承最常用的指针和引用的对齐方式</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">DerivePointerAlignment</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">false</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 关闭格式化</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">DisableFormat</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:   </span><span style="color:#986801;--shiki-dark:#D19A66">false</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 删除访问修饰符后的所有空行</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">EmptyLineAfterAccessModifier</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">Never</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 仅当访问修饰符开始一个新的逻辑块时才添加空行</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">EmptyLineBeforeAccessModifier</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">LogicalBlock</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 自动检测函数的调用和定义是否被格式为每行一个参数(Experimental)</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">ExperimentalAutoDetectBinPacking</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">false</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 自动补充namespace注释</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">FixNamespaceComments</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">true</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 需要被解读为foreach循环而不是函数调用的宏</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">ForEachMacros</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  - </span><span style="color:#50A14F;--shiki-dark:#98C379">foreach</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  - </span><span style="color:#50A14F;--shiki-dark:#98C379">Q_FOREACH</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  - </span><span style="color:#50A14F;--shiki-dark:#98C379">BOOST_FOREACH</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">IfMacros</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  - </span><span style="color:#50A14F;--shiki-dark:#98C379">KJ_IF_MAYBE</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 多个#include块合并在一起并排序为一个</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">IncludeBlocks</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:   </span><span style="color:#50A14F;--shiki-dark:#98C379">Merge</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 可以定义负数优先级从而保证某些#include永远在最前面</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">IncludeCategories</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  - </span><span style="color:#E45649;--shiki-dark:#E06C75">Regex</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:           </span><span style="color:#50A14F;--shiki-dark:#98C379">'^"(llvm|llvm-c|clang|clang-c)/'</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">    Priority</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:        </span><span style="color:#986801;--shiki-dark:#D19A66">2</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">    SortPriority</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:    </span><span style="color:#986801;--shiki-dark:#D19A66">0</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">    CaseSensitive</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:   </span><span style="color:#986801;--shiki-dark:#D19A66">false</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  - </span><span style="color:#E45649;--shiki-dark:#E06C75">Regex</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:           </span><span style="color:#50A14F;--shiki-dark:#98C379">'^(&#x3C;|"(gtest|gmock|isl|json)/)'</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">    Priority</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:        </span><span style="color:#986801;--shiki-dark:#D19A66">3</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">    SortPriority</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:    </span><span style="color:#986801;--shiki-dark:#D19A66">0</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">    CaseSensitive</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:   </span><span style="color:#986801;--shiki-dark:#D19A66">false</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  - </span><span style="color:#E45649;--shiki-dark:#E06C75">Regex</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:           </span><span style="color:#50A14F;--shiki-dark:#98C379">'.*'</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">    Priority</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:        </span><span style="color:#986801;--shiki-dark:#D19A66">1</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">    SortPriority</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:    </span><span style="color:#986801;--shiki-dark:#D19A66">0</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">    CaseSensitive</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:   </span><span style="color:#986801;--shiki-dark:#D19A66">false</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">IncludeIsMainRegex</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">'(Test)?$'</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">IncludeIsMainSourceRegex</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">''</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 缩进访问修饰符</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">IndentAccessModifiers</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">false</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 缩进case标签</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">IndentCaseLabels</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">false</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># case 标签后面的块使用与 case 标签相同的缩进级别</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">IndentCaseBlocks</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">false</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 缩进goto标签。</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">IndentGotoLabels</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">false</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 缩进预处理器指令</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">IndentPPDirectives</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">None</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 向后兼容缩进外部块</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">IndentExternBlock</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">AfterExternBlock</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 缩进模板中的requires子句</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">IndentRequires</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:  </span><span style="color:#986801;--shiki-dark:#D19A66">false</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 缩进宽度</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">IndentWidth</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:     </span><span style="color:#986801;--shiki-dark:#D19A66">4</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 函数返回类型换行时，缩进函数声明或函数定义的函数名</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">IndentWrappedFunctionNames</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">false</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 插入尾随逗号</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">InsertTrailingCommas</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">None</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 保留JavaScript字符串引号</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">JavaScriptQuotes</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">Leave</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 包装 JavaScript 导入/导出语句</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">JavaScriptWrapImports</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">true</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 保留在块开始处的空行</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">KeepEmptyLinesAtTheStartOfBlocks</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">true</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 相对于 lambda 签名对齐 lambda 主体</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">LambdaBodyIndentation</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">Signature</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 开始一个块的宏的正则表达式</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">MacroBlockBegin</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">''</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 结束一个块的宏的正则表达式</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">MacroBlockEnd</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:   </span><span style="color:#50A14F;--shiki-dark:#98C379">''</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 连续空行的最大数量</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">MaxEmptyLinesToKeep</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">1</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 命名空间的缩进</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">NamespaceIndentation</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">Inner</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">ObjCBinPackProtocolList</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">Auto</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 使用ObjC块时缩进宽度</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">ObjCBlockIndentWidth</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">4</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">ObjCBreakBeforeNestedBlockParam</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">true</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 在ObjC的@property后添加一个空格</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">ObjCSpaceAfterProperty</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">false</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 在ObjC的protocol列表前添加一个空格</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">ObjCSpaceBeforeProtocolList</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">true</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">PenaltyBreakAssignment</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">2</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">PenaltyBreakBeforeFirstCallParameter</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">19</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">PenaltyBreakComment</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">300</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">PenaltyBreakFirstLessLess</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">120</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">PenaltyBreakString</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">1000</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">PenaltyBreakTemplateDeclaration</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">10</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">PenaltyExcessCharacter</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">1000000</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">PenaltyReturnTypeOnItsOwnLine</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">60</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">PenaltyIndentedWhitespace</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">0</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 指针的对齐: Left, Right, Middle</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">PointerAlignment</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">Left</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 缩进预处理器语句的列数</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">PPIndentWidth</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:   </span><span style="color:#986801;--shiki-dark:#D19A66">-1</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 引用的对齐</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">ReferenceAlignment</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">Pointer</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 允许重新排版注释</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">ReflowComments</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:  </span><span style="color:#986801;--shiki-dark:#D19A66">true</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 短命名空间跨越的最大展开行数</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">ShortNamespaceLines</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">1</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 允许排序#include</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">SortIncludes</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:    </span><span style="color:#986801;--shiki-dark:#D19A66">false</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># java静态导入放在非静态导入之前</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">SortJavaStaticImport</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">Before</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 对using声明排序</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">SortUsingDeclarations</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">true</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 在C风格类型转换后添加空格</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">SpaceAfterCStyleCast</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">false</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 在!后添加空格</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">SpaceAfterLogicalNot</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">false</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 在Template关键字后添加空格</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">SpaceAfterTemplateKeyword</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">true</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 在赋值运算符之前添加空格</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">SpaceBeforeAssignmentOperators</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">true</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 不在case冒号之前添加空格</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">SpaceBeforeCaseColon</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">false</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 不在C++11大括号列表之前添加空格</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">SpaceBeforeCpp11BracedList</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">false</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 在构造函数初始化器冒号之前添加空格</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">SpaceBeforeCtorInitializerColon</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">true</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 在继承冒号前添加空格</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">SpaceBeforeInheritanceColon</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">true</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 开圆括号之前添加一个空格: Never, ControlStatements, Always</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">SpaceBeforeParens</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">ControlStatements</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 不要确保指针限定符周围有空格，而是使用 PointerAlignment</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">SpaceAroundPointerQualifiers</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">Default</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 在基于范围的for循环冒号之前添加空格</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">SpaceBeforeRangeBasedForLoopColon</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">true</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># &#123;&#125;中间不添加空格</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">SpaceInEmptyBlock</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">false</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 在空的圆括号中添加空格</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">SpaceInEmptyParentheses</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">false</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 在尾随的评论前添加的空格数(只适用于//)</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">SpacesBeforeTrailingComments</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">1</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 在尖括号的&#x3C;后和>前添加空格</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">SpacesInAngles</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:  </span><span style="color:#50A14F;--shiki-dark:#98C379">Never</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 不在if/for/switch/while条件周围插入空格</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">SpacesInConditionalStatement</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">false</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 在容器(ObjC和JavaScript的数组和字典等)字面量中添加空格</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">SpacesInContainerLiterals</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">true</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 在C风格类型转换的括号中添加空格</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">SpacesInCStyleCastParentheses</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">false</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 行注释开头允许有多少个空格。要禁用最大值，请将其设置为-1，除此之外，最大值优先于最小值</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">SpacesInLineCommentPrefix</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">  Minimum</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:         </span><span style="color:#986801;--shiki-dark:#D19A66">1</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">  Maximum</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:         </span><span style="color:#986801;--shiki-dark:#D19A66">-1</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 在圆括号的(后和)前添加空格</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">SpacesInParentheses</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">false</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 在方括号的[后和]前添加空格，lamda表达式和未指明大小的数组的声明不受影响</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">SpacesInSquareBrackets</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">false</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 不在[前添加空格</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">SpaceBeforeSquareBrackets</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">false</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 位域:每边都添加空格</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">BitFieldColonSpacing</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">Both</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 标准</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">Standard</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:        </span><span style="color:#50A14F;--shiki-dark:#98C379">Auto</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 在语句前面被忽略的宏定义，就好像它们是一个属性一样</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">StatementAttributeLikeMacros</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  - </span><span style="color:#50A14F;--shiki-dark:#98C379">Q_EMIT</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 应该被解释为完整语句的宏定义</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">StatementMacros</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  - </span><span style="color:#50A14F;--shiki-dark:#98C379">Q_UNUSED</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  - </span><span style="color:#50A14F;--shiki-dark:#98C379">QT_REQUIRE_VERSION</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># tab宽度</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">TabWidth</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:        </span><span style="color:#986801;--shiki-dark:#D19A66">4</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 使用\n换行</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">UseCRLF</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:         </span><span style="color:#986801;--shiki-dark:#D19A66">false</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 使用tab字符：ForIndentation——仅将制表符用于缩进</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">UseTab</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:          </span><span style="color:#50A14F;--shiki-dark:#98C379">Never</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 对空格敏感的宏定义</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">WhitespaceSensitiveMacros</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  - </span><span style="color:#50A14F;--shiki-dark:#98C379">STRINGIZE</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  - </span><span style="color:#50A14F;--shiki-dark:#98C379">PP_STRINGIZE</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  - </span><span style="color:#50A14F;--shiki-dark:#98C379">BOOST_PP_STRINGIZE</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  - </span><span style="color:#50A14F;--shiki-dark:#98C379">NS_SWIFT_NAME</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  - </span><span style="color:#50A14F;--shiki-dark:#98C379">CF_SWIFT_NAME</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">...</span></span></code></pre></td></tr></tbody></table></figure></p></li></ul><h3 id="xmake-配置">Xmake 配置</h3><p>首先新建一个 <code>hello_world.cpp</code>文件，然后在其中输入一个基础的 Hello world 程序： <figure class="highlight cpp"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">#include</span><span style="color:#50A14F;--shiki-dark:#98C379"> &#x3C;iostream></span></span><span class="line"></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">int</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> main</span><span style="color:#383A42;--shiki-dark:#ABB2BF">() &#123;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    std::cout </span><span style="color:#A626A4;--shiki-dark:#C678DD">&#x3C;&#x3C;</span><span style="color:#50A14F;--shiki-dark:#98C379"> "Hello, world!"</span><span style="color:#A626A4;--shiki-dark:#C678DD"> &#x3C;&#x3C;</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> std::endl;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">    return</span><span style="color:#986801;--shiki-dark:#D19A66"> 0</span><span style="color:#383A42;--shiki-dark:#ABB2BF">;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">&#125;</span></span></code></pre></td></tr></tbody></table></figure></p><p>然后在项目根目录下新建 <code>xmake.lua</code> 文件，这会激活 Xmake扩展。在文件中输入： <figure class="highlight lua"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">add_defines</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">"ROOT"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">add_rules</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">"mode.debug"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#50A14F;--shiki-dark:#98C379">"mode.release"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">set_toolchains</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">"clang"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">set_languages</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">"cxx17"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span><span style="color:#50A14F;--shiki-dark:#98C379">"c11"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">set_optimize</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">"fastest"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">set_warnings</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">"all"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">-- 添加工程</span></span><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">target</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">"Hello world!"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">    set_kind</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">"binary"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">    add_files</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">"hello_world.cpp"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">target_end</span><span style="color:#383A42;--shiki-dark:#ABB2BF">()</span></span></code></pre></td></tr></tbody></table></figure> 此时 VSCode 的底栏会出现 Xmake的一系列选项，直接点击下方的 ▶️ 按钮，Xmake 就会调用 Clang编译刚刚新建的 hello world 程序了。</p><p>至此，一个优雅好用的 C++ 开发环境就算搭建完成了。更多相关配置请参考<a href="https://xmake.io/#/zh-cn/about/introduction" rel="external nofollow noreferrer">Xmake文档</a>。</p><h2 id="参考资料">参考资料</h2><p>本文的编写参考了下列文章：</p><ul><li><a href="https://zhuanlan.zhihu.com/p/398790625" rel="external nofollow noreferrer">[万字长文]VisualStudio Code 配置 C/C++ 开发环境的最佳实践(VSCode + Clangd + XMake) -知乎</a></li><li><ahref="https://zhuanlan.zhihu.com/p/566365173">几乎无痛的VSCode+clangd+lldb+cmake配置C/C++开发环境指南- 知乎</a></li><li><ahref="https://quadnucyard.github.io/posts/cpp/clang-std-modules.html">使用VSCode + XMake + LLVM 开发现代 C++！（llvm-mingw + clangd +modules）</a></li><li><a href="https://lazy-phosphorus.com/post/msys2-cmake-guide/" rel="external nofollow noreferrer">MSYS2与 CMake 编程综合指引 | 惰性磷的博客</a></li></ul>]]></content:encoded>
      
      
      <category domain="https://blog.hpcesia.com/categories/%E7%BB%8F%E9%AA%8C%E8%AE%B0%E5%BD%95/">经验记录</category>
      
      
      <category domain="https://blog.hpcesia.com/tags/VSCode/">VSCode</category>
      
      <category domain="https://blog.hpcesia.com/tags/C/">C++</category>
      
      <category domain="https://blog.hpcesia.com/tags/Xmake/">Xmake</category>
      
      <category domain="https://blog.hpcesia.com/tags/Windows/">Windows</category>
      
      
      <comments>https://blog.hpcesia.com/posts/ba9eeffb/#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>Twikoo 评论区利用 Python 脚本自动化导入米游社表情包</title>
      <link>https://blog.hpcesia.com/posts/8c78f339/</link>
      <guid>https://blog.hpcesia.com/posts/8c78f339/</guid>
      <pubDate>Mon, 30 Sep 2024 07:54:16 GMT</pubDate>
      
      <description>利用 Pythopn 脚本实现自动化获取米游社表情包并添加到本地 Twikoo 表情包 json 中。</description>
      
      
      
      <content:encoded><![CDATA[<details><summary>更新日志</summary><div class="timeline"><span class="timeline-title">更新日志</span><div class="timenode"><div class="meta"><p>2024-10-28</p></div><div class="body"><p>修复了脚本 bug</p></div></div><div class="timenode"><div class="meta"><p>2024-09-30</p></div><div class="body"><p>发布文章</p></div></div></div></details><h2 id="twikoo-评论系统表情包设置">Twikoo 评论系统表情包设置</h2><p>打开 Twikoo 设置面板，打开「配置管理」 - 「插件」 -「EMOTION_CDN」，输入你自己的 emotion.json 路径即可。</p><h2 id="python-脚本">Python 脚本</h2><p>找个地方创建一个 <code>.py</code>文件，填入以下内容（为了开箱即用，使用的是 <code>urllib</code>库，可自行换成 <code>request</code> 库或 <code>httpx</code> 库）：<figure class="highlight python"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">import</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> json</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">import</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> urllib.request</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">from</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> pathlib </span><span style="color:#A626A4;--shiki-dark:#C678DD">import</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> Path</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">import</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> re</span></span><span class="line"></span><span class="line"></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">def</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> miyousheEmoticonsJsonToTwikooJson</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span></span><span class="line"><span style="color:#986801;font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic">    api_url</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> str</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#986801;font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic">    output_path</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> str</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#986801;font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic">    groups</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:</span><span style="color:#986801;--shiki-dark:#ABB2BF"> list[</span><span style="color:#0184BC;--shiki-dark:#56B6C2">str</span><span style="color:#986801;--shiki-dark:#ABB2BF">] </span><span style="color:#383A42;--shiki-dark:#56B6C2">=</span><span style="color:#986801;--shiki-dark:#D19A66"> None</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#986801;font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic">    use_index_img</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> bool</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span><span style="color:#986801;--shiki-dark:#D19A66"> False</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#986801;font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic">    clean_output</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> bool</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span><span style="color:#986801;--shiki-dark:#D19A66"> False</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">):</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">    """</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">    将米游社表情包的JSON数据转换为Twikoo格式的JSON数据。</span></span><span class="line"></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">    该函数从指定的API URL获取米游社表情包数据，并将其转换为Twikoo格式的JSON文件。</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">    可以选择性地指定要处理的表情包分组，是否使用索引图片，以及是否清理输出文件。</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">    Args:</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">        api_url (str): 米游社表情包 API 的 URL。</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">        output_path (str): 输出 JSON 文件的路径。</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">        groups (list[str], optional): 要处理的表情包分组列表。如果为 `None`，则处理所有分组。默认为 `None`。</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">        use_index_img (bool, optional): 是否使用索引图片作为分组名称。默认为 `False`。</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">        clean_output (bool, optional): 是否清理输出文件。如果为 `True`，则覆盖输出文件。默认为 `False`。</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">    """</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    data </span><span style="color:#383A42;--shiki-dark:#56B6C2">=</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> urllib.request.</span><span style="color:#383A42;--shiki-dark:#61AFEF">urlopen</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(api_url).</span><span style="color:#383A42;--shiki-dark:#61AFEF">read</span><span style="color:#383A42;--shiki-dark:#ABB2BF">().</span><span style="color:#383A42;--shiki-dark:#61AFEF">decode</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">"utf-8"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    data </span><span style="color:#383A42;--shiki-dark:#56B6C2">=</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> json.</span><span style="color:#383A42;--shiki-dark:#61AFEF">loads</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(data)</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    output_dict </span><span style="color:#383A42;--shiki-dark:#56B6C2">=</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#123;&#125;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">    if</span><span style="color:#383A42;--shiki-dark:#61AFEF"> Path</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(output_path).</span><span style="color:#383A42;--shiki-dark:#61AFEF">exists</span><span style="color:#383A42;--shiki-dark:#ABB2BF">() </span><span style="color:#A626A4;--shiki-dark:#C678DD">and</span><span style="color:#A626A4;--shiki-dark:#C678DD"> not</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> clean_output:</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">        with</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> open</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#61AFEF">Path</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(output_path), </span><span style="color:#50A14F;--shiki-dark:#98C379">"r"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#986801;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">encoding</span><span style="color:#383A42;--shiki-dark:#56B6C2">=</span><span style="color:#50A14F;--shiki-dark:#98C379">"utf-8"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) </span><span style="color:#A626A4;--shiki-dark:#C678DD">as</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> f:</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">            output_dict </span><span style="color:#383A42;--shiki-dark:#56B6C2">=</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> json.</span><span style="color:#383A42;--shiki-dark:#61AFEF">load</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(f)</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">    if</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> use_index_img:</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#D19A66">        STYLE</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span><span style="color:#50A14F;--shiki-dark:#98C379"> "height: 20px;top: 4px;position: relative;"</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">        pattern </span><span style="color:#383A42;--shiki-dark:#56B6C2">=</span><span style="color:#A626A4;--shiki-dark:#C678DD"> r</span><span style="color:#0184BC;--shiki-dark:#E06C75">"&#x3C;img src='.</span><span style="color:#383A42;--shiki-dark:#D19A66">*?</span><span style="color:#0184BC;--shiki-dark:#E06C75">' style='.</span><span style="color:#383A42;--shiki-dark:#D19A66">*?</span><span style="color:#0184BC;--shiki-dark:#E06C75">' title='</span><span style="color:#0184BC;--shiki-dark:#D19A66">(</span><span style="color:#0184BC;--shiki-dark:#E06C75">.</span><span style="color:#383A42;--shiki-dark:#D19A66">*?</span><span style="color:#0184BC;--shiki-dark:#D19A66">)</span><span style="color:#0184BC;--shiki-dark:#E06C75">'>"</span></span><span class="line"></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">        def</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> sameTitle</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#986801;font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic">key</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span><span style="color:#986801;font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic"> title</span><span style="color:#383A42;--shiki-dark:#ABB2BF">):</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">            match </span><span style="color:#383A42;--shiki-dark:#56B6C2">=</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> re.</span><span style="color:#383A42;--shiki-dark:#61AFEF">match</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(pattern, key)</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">            return</span><span style="color:#A626A4;--shiki-dark:#C678DD"> not</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> bool</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(match </span><span style="color:#A626A4;--shiki-dark:#C678DD">and</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> match.</span><span style="color:#383A42;--shiki-dark:#61AFEF">group</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#986801;--shiki-dark:#D19A66">1</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) </span><span style="color:#383A42;--shiki-dark:#56B6C2">==</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> title)</span></span><span class="line"></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">    for</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> emoticon_group </span><span style="color:#A626A4;--shiki-dark:#C678DD">in</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> data[</span><span style="color:#50A14F;--shiki-dark:#98C379">"data"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">][</span><span style="color:#50A14F;--shiki-dark:#98C379">"list"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">]:</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">        if</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> emoticon_group[</span><span style="color:#50A14F;--shiki-dark:#98C379">"status"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">] </span><span style="color:#383A42;--shiki-dark:#56B6C2">==</span><span style="color:#50A14F;--shiki-dark:#98C379"> "draft"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">            continue</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">        group_name: </span><span style="color:#0184BC;--shiki-dark:#56B6C2">str</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> emoticon_group[</span><span style="color:#50A14F;--shiki-dark:#98C379">"name"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">]</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">        if</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> groups </span><span style="color:#A626A4;--shiki-dark:#C678DD">is</span><span style="color:#A626A4;--shiki-dark:#C678DD"> not</span><span style="color:#986801;--shiki-dark:#D19A66"> None</span><span style="color:#A626A4;--shiki-dark:#C678DD"> and</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> group_name </span><span style="color:#A626A4;--shiki-dark:#C678DD">not</span><span style="color:#A626A4;--shiki-dark:#C678DD"> in</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> groups:</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">            continue</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">        if</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> use_index_img:</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">            index_url </span><span style="color:#383A42;--shiki-dark:#56B6C2">=</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> emoticon_group[</span><span style="color:#50A14F;--shiki-dark:#98C379">"icon"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">]</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">            origin_group_name </span><span style="color:#383A42;--shiki-dark:#56B6C2">=</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> group_name</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">            group_name </span><span style="color:#383A42;--shiki-dark:#56B6C2">=</span><span style="color:#A626A4;--shiki-dark:#C678DD"> f</span><span style="color:#50A14F;--shiki-dark:#98C379">"&#x3C;img src='</span><span style="color:#986801;--shiki-dark:#D19A66">&#123;</span><span style="color:#383A42;--shiki-dark:#ABB2BF">index_url</span><span style="color:#986801;--shiki-dark:#D19A66">&#125;</span><span style="color:#50A14F;--shiki-dark:#98C379">' style='</span><span style="color:#986801;--shiki-dark:#D19A66">&#123;</span><span style="color:#383A42;--shiki-dark:#D19A66">STYLE</span><span style="color:#986801;--shiki-dark:#D19A66">&#125;</span><span style="color:#50A14F;--shiki-dark:#98C379">' title='</span><span style="color:#986801;--shiki-dark:#D19A66">&#123;</span><span style="color:#383A42;--shiki-dark:#ABB2BF">group_name</span><span style="color:#986801;--shiki-dark:#D19A66">&#125;</span><span style="color:#50A14F;--shiki-dark:#98C379">'>"</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">            output_dict </span><span style="color:#383A42;--shiki-dark:#56B6C2">=</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#123;k: v </span><span style="color:#A626A4;--shiki-dark:#C678DD">for</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> k, v </span><span style="color:#A626A4;--shiki-dark:#C678DD">in</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> output_dict.</span><span style="color:#383A42;--shiki-dark:#61AFEF">items</span><span style="color:#383A42;--shiki-dark:#ABB2BF">() </span><span style="color:#A626A4;--shiki-dark:#C678DD">if</span><span style="color:#383A42;--shiki-dark:#61AFEF"> sameTitle</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(k, origin_group_name)&#125;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">        output_dict[group_name] </span><span style="color:#383A42;--shiki-dark:#56B6C2">=</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#123;</span><span style="color:#50A14F;--shiki-dark:#98C379">"type"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">"image"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">&#125;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">        container </span><span style="color:#383A42;--shiki-dark:#56B6C2">=</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> []</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">        for</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> emoticon </span><span style="color:#A626A4;--shiki-dark:#C678DD">in</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> emoticon_group[</span><span style="color:#50A14F;--shiki-dark:#98C379">"list"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">]:</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">            if</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> emoticon[</span><span style="color:#50A14F;--shiki-dark:#98C379">"status"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">] </span><span style="color:#383A42;--shiki-dark:#56B6C2">==</span><span style="color:#50A14F;--shiki-dark:#98C379"> "draft"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">:</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">                continue</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">            url </span><span style="color:#383A42;--shiki-dark:#56B6C2">=</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> emoticon[</span><span style="color:#50A14F;--shiki-dark:#98C379">"icon"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">]</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">            name </span><span style="color:#383A42;--shiki-dark:#56B6C2">=</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> emoticon[</span><span style="color:#50A14F;--shiki-dark:#98C379">"name"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">].</span><span style="color:#383A42;--shiki-dark:#61AFEF">replace</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">" "</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#50A14F;--shiki-dark:#98C379">"-"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">            name </span><span style="color:#383A42;--shiki-dark:#56B6C2">=</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> (</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">                origin_group_name.</span><span style="color:#383A42;--shiki-dark:#61AFEF">replace</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">" "</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#50A14F;--shiki-dark:#98C379">"-"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) </span><span style="color:#383A42;--shiki-dark:#56B6C2">+</span><span style="color:#50A14F;--shiki-dark:#98C379"> "-"</span><span style="color:#383A42;--shiki-dark:#56B6C2"> +</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> name</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">                if</span><span style="color:#50A14F;--shiki-dark:#98C379"> "origin_group_name"</span><span style="color:#A626A4;--shiki-dark:#C678DD"> in</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> locals</span><span style="color:#383A42;--shiki-dark:#ABB2BF">()</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">                else</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> group_name.</span><span style="color:#383A42;--shiki-dark:#61AFEF">replace</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">" "</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#50A14F;--shiki-dark:#98C379">"-"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) </span><span style="color:#383A42;--shiki-dark:#56B6C2">+</span><span style="color:#50A14F;--shiki-dark:#98C379"> "-"</span><span style="color:#383A42;--shiki-dark:#56B6C2"> +</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> name</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">            )</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">            container.</span><span style="color:#383A42;--shiki-dark:#61AFEF">append</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(&#123;</span><span style="color:#50A14F;--shiki-dark:#98C379">"text"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: name, </span><span style="color:#50A14F;--shiki-dark:#98C379">"icon"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#A626A4;--shiki-dark:#C678DD">f</span><span style="color:#50A14F;--shiki-dark:#98C379">"&#x3C;img src='</span><span style="color:#986801;--shiki-dark:#D19A66">&#123;</span><span style="color:#383A42;--shiki-dark:#ABB2BF">url</span><span style="color:#986801;--shiki-dark:#D19A66">&#125;</span><span style="color:#50A14F;--shiki-dark:#98C379">'>"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">&#125;)</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">        output_dict[group_name][</span><span style="color:#50A14F;--shiki-dark:#98C379">"container"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">] </span><span style="color:#383A42;--shiki-dark:#56B6C2">=</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> container</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">    with</span><span style="color:#0184BC;--shiki-dark:#56B6C2"> open</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#61AFEF">Path</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(output_path), </span><span style="color:#50A14F;--shiki-dark:#98C379">"w"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#986801;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">encoding</span><span style="color:#383A42;--shiki-dark:#56B6C2">=</span><span style="color:#50A14F;--shiki-dark:#98C379">"utf-8"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) </span><span style="color:#A626A4;--shiki-dark:#C678DD">as</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> f:</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">        json.</span><span style="color:#383A42;--shiki-dark:#61AFEF">dump</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(output_dict, f, </span><span style="color:#986801;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">ensure_ascii</span><span style="color:#383A42;--shiki-dark:#56B6C2">=</span><span style="color:#986801;--shiki-dark:#D19A66">False</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#986801;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">indent</span><span style="color:#383A42;--shiki-dark:#56B6C2">=</span><span style="color:#986801;--shiki-dark:#D19A66">2</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"></span><span class="line"></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 使用示例</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">api_url </span><span style="color:#383A42;--shiki-dark:#56B6C2">=</span><span style="color:#50A14F;--shiki-dark:#98C379"> "https://bbs-api.mihoyo.com/misc/api/emoticon_set"</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">output </span><span style="color:#383A42;--shiki-dark:#56B6C2">=</span><span style="color:#50A14F;--shiki-dark:#98C379"> "path/to/your/output.json"</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">emoticons_list </span><span style="color:#383A42;--shiki-dark:#56B6C2">=</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> [</span><span style="color:#50A14F;--shiki-dark:#98C379">"原神 V官方"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#50A14F;--shiki-dark:#98C379">"崩坏RPG"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#50A14F;--shiki-dark:#98C379">"崩坏 星穹铁道"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">] </span><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 你想要的表情包列表</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#61AFEF">miyousheEmoticonsJsonToTwikooJson</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    api_url, output, </span><span style="color:#986801;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">use_index_img</span><span style="color:#383A42;--shiki-dark:#56B6C2">=</span><span style="color:#986801;--shiki-dark:#D19A66">True</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#986801;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">groups</span><span style="color:#383A42;--shiki-dark:#56B6C2">=</span><span style="color:#383A42;--shiki-dark:#ABB2BF">emoticons_list</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span></code></pre></td></tr></tbody></table></figure> 只需要修改 <code>output</code> 为自己的表情包路径，使用<figure class="highlight shell"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">python</span><span style="color:#50A14F;--shiki-dark:#98C379"> path/to/your/file.py</span></span></code></pre></td></tr></tbody></table></figure> 即可。</p><h2 id="自动部署">自动部署</h2><p>修改 <code>package.json</code> 的 <code>scripts</code> 项，将<code>build</code> 改为<code>python path/to/your/file.py &amp;&amp; hexo generate</code>，使用<code>npm run build</code> 即可。</p>]]></content:encoded>
      
      
      <category domain="https://blog.hpcesia.com/categories/%E5%B0%8F%E5%B1%8B%E7%9B%B8%E5%85%B3/">小屋相关</category>
      
      
      <category domain="https://blog.hpcesia.com/tags/Hexo/">Hexo</category>
      
      <category domain="https://blog.hpcesia.com/tags/Twikoo/">Twikoo</category>
      
      <category domain="https://blog.hpcesia.com/tags/%E7%B1%B3%E6%B8%B8%E7%A4%BE/">米游社</category>
      
      <category domain="https://blog.hpcesia.com/tags/Python/">Python</category>
      
      
      <comments>https://blog.hpcesia.com/posts/8c78f339/#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>Typst 使用经验记录</title>
      <link>https://blog.hpcesia.com/posts/5252cfe9/</link>
      <guid>https://blog.hpcesia.com/posts/5252cfe9/</guid>
      <pubDate>Fri, 27 Sep 2024 15:14:17 GMT</pubDate>
      
      <description>关于 Typst 排版的使用经验，以及使用 Pandoc 转换为 Markdown 格式的经验</description>
      
      
      
      <content:encoded><![CDATA[<details><summary>更新日志</summary><div class="timeline"><span class="timeline-title"><div class="timenode"><div class="meta"><p>2024-10-20</p></div><div class="body"><p>更新文章中部分链接</p></div></div><div class="timenode"><div class="meta"><p>2024-10-08</p></div><div class="body"><p>更新「在文本中使用美观的大括号分类」</p></div></div><div class="timenode"><div class="meta"><p>2024-10-02</p></div><div class="body"><p>更新「结合 showybox 与 ctheorems 包制作美观定理环境」</p></div></div><div class="timenode"><div class="meta"><p>2024-10-01</p></div><div class="body"><p>更新「目录不同层级标题使用不同样式」</p></div></div><div class="timenode"><div class="meta"><p>2024-09-27</p></div><div class="body"><p>发布文章。</p></div></div></div></details><div class="note primary modern"><i class="solitude fas fa-info-circle"></i><p>文章中 Typst 代码高亮设置方法：<ahref="https://yihui-liu.github.io/posts/202402-typst-block.html">Hexo配置 Typst 代码高亮 | Fox Home</a></p><p>或改为使用 <a href="https://shiki.tmrs.site" rel="external nofollow noreferrer">Shiki</a>进行代码高亮渲染。</p></div><h2 id="怎么找解决方案">怎么找解决方案</h2><p>多翻翻别人趟过的坑：</p><ul><li>翻文档<ul><li><a href="https://typst-doc-cn.github.io/docs/" rel="external nofollow noreferrer">Typst中文文档</a></li><li><a href="https://typst.app/docs" rel="external nofollow noreferrer">Typst Documentation</a></li></ul></li><li>翻示例<ul><li><a href="https://typst-doc-cn.github.io/guide/FAQ.html" rel="external nofollow noreferrer">常见问题 |Typst 中文社区导航</a></li><li><ahref="https://typst-doc-cn.github.io/tutorial/introduction.html">TheRaindrop-Blue Book (Typst中文教程)</a></li><li><a href="https://sitandr.github.io/typst-examples-book/book/" rel="external nofollow noreferrer">TypstExamples Book</a></li></ul></li></ul><h2 id="排版经验">排版经验</h2><h3 id="不同层级标题使用不同序号格式">不同层级标题使用不同序号格式</h3><p>其实是<ahref="https://typst-doc-cn.github.io/guide/FAQ/heading-formats.html">如何为每一级标题指定不同的编号格式？- 常见问题 | Typst中文社区导航</a>的重复造轮子，但是造轮子的时候没看到这个东西，造都造了就发出来算了。（用Typst 群群友的说法，在 numbly 包出来之前，人人都有自己的 numbly轮子（笑））</p><figure class="highlight typst"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">#let</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> diff_numbering</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(..</span><span style="color:#E45649;--shiki-dark:#E06C75">schemes</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) </span><span style="color:#383A42;--shiki-dark:#56B6C2">=</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#123;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  (..</span><span style="color:#E45649;--shiki-dark:#E06C75">nums</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) => &#123;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">    let</span><span style="color:#E45649;--shiki-dark:#E06C75"> nums_arr</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span><span style="color:#E45649;--shiki-dark:#E06C75"> nums</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">pos</span><span style="color:#383A42;--shiki-dark:#ABB2BF">()</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">    let</span><span style="color:#E45649;--shiki-dark:#E06C75"> schemes_arr</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span><span style="color:#E45649;--shiki-dark:#E06C75"> schemes</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">pos</span><span style="color:#383A42;--shiki-dark:#ABB2BF">()</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">    if</span><span style="color:#E45649;--shiki-dark:#E06C75"> nums_arr</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">len</span><span style="color:#383A42;--shiki-dark:#ABB2BF">() </span><span style="color:#383A42;--shiki-dark:#56B6C2">>=</span><span style="color:#E45649;--shiki-dark:#E06C75"> schemes_arr</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">len</span><span style="color:#383A42;--shiki-dark:#ABB2BF">() &#123;</span></span><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">      numbering</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#E45649;--shiki-dark:#E06C75">schemes_arr</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">at</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;--shiki-dark:#56B6C2">-</span><span style="color:#986801;--shiki-dark:#D19A66">1</span><span style="color:#383A42;--shiki-dark:#ABB2BF">), ..</span><span style="color:#E45649;--shiki-dark:#E06C75">nums</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    &#125; </span><span style="color:#A626A4;--shiki-dark:#C678DD">else</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#123;</span></span><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">      numbering</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#E45649;--shiki-dark:#E06C75">schemes_arr</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">at</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#E45649;--shiki-dark:#E06C75">nums_arr</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">len</span><span style="color:#383A42;--shiki-dark:#ABB2BF">() </span><span style="color:#383A42;--shiki-dark:#56B6C2">-</span><span style="color:#986801;--shiki-dark:#D19A66"> 1</span><span style="color:#383A42;--shiki-dark:#ABB2BF">), ..</span><span style="color:#E45649;--shiki-dark:#E06C75">nums</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    &#125;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  &#125;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">&#125;</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 使用</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">#set</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> heading</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">numbering</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#4078F2;--shiki-dark:#61AFEF">diff_numbering</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">"第一章"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#50A14F;--shiki-dark:#98C379">"1.1"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#50A14F;--shiki-dark:#98C379">"1-1-1"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">))</span></span><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">= 一个章节</span></span><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">== 一个小节</span></span><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">=== 一个小节的小节</span></span><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">= 第二个章节</span></span><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">== 第二个章节的小节</span></span><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">=== 第二个章节的小节的小节</span></span></code></pre></td></tr></tbody></table></figure><p>效果： <img src= "" data-lazy-src="https://bu.dusays.com/2024/10/28/671f2b97f17a1.webp"alt="效果" /></p><p>使用 numbly 包可以达到更好的效果： <figure class="highlight typst"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">#import</span><span style="color:#50A14F;--shiki-dark:#98C379"> "@preview/numbly:0.1.0"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#E45649;--shiki-dark:#E06C75">numbly</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">#set</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> heading</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">numbering</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#4078F2;--shiki-dark:#61AFEF">numbly</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">"一|&#123;1:一&#125;章"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#50A14F;--shiki-dark:#98C379">"a&#123;1:1&#125;.&#123;2:1&#125;"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#50A14F;--shiki-dark:#98C379">"1?&#123;1:1&#125;-&#123;2:1&#125;.&#123;3:1&#125;"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">))</span></span><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">= #lorem(</span><span style="color:#986801;--shiki-dark:#D19A66">1</span><span style="color:#4078F2;--shiki-dark:#61AFEF">)</span></span><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">== #lorem(</span><span style="color:#986801;--shiki-dark:#D19A66">2</span><span style="color:#4078F2;--shiki-dark:#61AFEF">)</span></span><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">=== #lorem(</span><span style="color:#986801;--shiki-dark:#D19A66">3</span><span style="color:#4078F2;--shiki-dark:#61AFEF">)</span></span><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">== #lorem(</span><span style="color:#986801;--shiki-dark:#D19A66">2</span><span style="color:#4078F2;--shiki-dark:#61AFEF">)</span></span><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">=== #lorem(</span><span style="color:#986801;--shiki-dark:#D19A66">3</span><span style="color:#4078F2;--shiki-dark:#61AFEF">)</span></span><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">=== #lorem(</span><span style="color:#986801;--shiki-dark:#D19A66">3</span><span style="color:#4078F2;--shiki-dark:#61AFEF">)</span></span><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">= #lorem(</span><span style="color:#986801;--shiki-dark:#D19A66">1</span><span style="color:#4078F2;--shiki-dark:#61AFEF">)</span></span><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">== #lorem(</span><span style="color:#986801;--shiki-dark:#D19A66">2</span><span style="color:#4078F2;--shiki-dark:#61AFEF">)</span></span><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">=== #lorem(</span><span style="color:#986801;--shiki-dark:#D19A66">3</span><span style="color:#4078F2;--shiki-dark:#61AFEF">)</span></span></code></pre></td></tr></tbody></table></figure> 效果： <imgsrc="https://bu.dusays.com/2024/10/28/671f2b9e68433.webp"alt="效果" /></p><h3 id="填空栏">填空栏</h3><figure class="highlight typst"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">#let</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> grid_blanks</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">cell</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#E45649;--shiki-dark:#E06C75">grid</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">cell</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">blank-width</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">2em</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">line-width</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">0.05em</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">colon</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: [: ], ..</span><span style="color:#E45649;--shiki-dark:#E06C75">args</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) </span><span style="color:#383A42;--shiki-dark:#56B6C2">=</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> grid</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  ..</span><span style="color:#E45649;--shiki-dark:#E06C75">args</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">named</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(),</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  ..</span><span style="color:#E45649;--shiki-dark:#E06C75">args</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">pos</span><span style="color:#383A42;--shiki-dark:#ABB2BF">().</span><span style="color:#4078F2;--shiki-dark:#61AFEF">map</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#E45649;--shiki-dark:#E06C75">label</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> => (</span><span style="color:#4078F2;--shiki-dark:#61AFEF">cell</span><span style="color:#383A42;--shiki-dark:#ABB2BF">([#label#colon</span><span style="color:#4078F2;--shiki-dark:#61AFEF">#box</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">width</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#E45649;--shiki-dark:#E06C75">blank-width</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">stroke</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: (</span><span style="color:#E45649;--shiki-dark:#E06C75">bottom</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#E45649;--shiki-dark:#E06C75">line-width</span><span style="color:#383A42;--shiki-dark:#ABB2BF">))])))</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 使用</span></span><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">#grid_blanks</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span></span><span class="line"><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">  columns</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: (</span><span style="color:#986801;--shiki-dark:#D19A66">auto</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#986801;--shiki-dark:#D19A66">auto</span><span style="color:#383A42;--shiki-dark:#ABB2BF">),</span></span><span class="line"><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">  align</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#E45649;--shiki-dark:#E06C75">right</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">  row-gutter</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">1.5em</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">  column-gutter</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">1em</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">  blank-width</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">3cm</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">  "姓名"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">  "班级"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">  "学号"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">  "学校"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"></span><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">#grid_blanks</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span></span><span class="line"><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">  columns</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: (</span><span style="color:#986801;--shiki-dark:#D19A66">auto</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#986801;--shiki-dark:#D19A66">auto</span><span style="color:#383A42;--shiki-dark:#ABB2BF">),</span></span><span class="line"><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">  align</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#E45649;--shiki-dark:#E06C75">right</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">  row-gutter</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">1.5em</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">  column-gutter</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">1em</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">  blank-width</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">3cm</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">  colon</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: [ </span><span style="color:#50A14F;--shiki-dark:#98C379">$==>  integral_0^1 pi - 1$</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> ],</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">  "Name"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">  "Class"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">  "Id"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">  "Grade"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span></code></pre></td></tr></tbody></table></figure><p>效果： <imgsrc="https://bu.dusays.com/2024/10/28/671f2b98b6c2e.webp" /> <imgsrc="https://bu.dusays.com/2024/10/28/671f2b9976496.webp" /></p><h3 id="页眉使用当前页面标题">页眉使用当前页面标题</h3><p>使用 <a href="https://github.com/tingerrr/hydra" rel="external nofollow noreferrer">hydra</a>包。需要其他设置可以参考 hydra 包的<ahref="https://github.com/tingerrr/hydra/blob/main/doc/manual.pdf">文档</a><figure class="highlight typst"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">#import</span><span style="color:#50A14F;--shiki-dark:#98C379"> "@preview/hydra:0.5.1"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#E45649;--shiki-dark:#E06C75">hydra</span></span><span class="line"></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">#set</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> page</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span></span><span class="line"><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">  header</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#E45649;--shiki-dark:#E06C75">context</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> align</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    &#123;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">      if</span><span style="color:#E45649;--shiki-dark:#E06C75"> calc</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">odd</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#4078F2;--shiki-dark:#61AFEF">here</span><span style="color:#383A42;--shiki-dark:#ABB2BF">().</span><span style="color:#4078F2;--shiki-dark:#61AFEF">page</span><span style="color:#383A42;--shiki-dark:#ABB2BF">()) &#123;</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">        right</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">      &#125; </span><span style="color:#A626A4;--shiki-dark:#C678DD">else</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#123;</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">        left</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">      &#125;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    &#125;,</span></span><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">    emph</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#4078F2;--shiki-dark:#61AFEF">hydra</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#986801;--shiki-dark:#D19A66">1</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">skip-starting</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">false</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)),</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  ),</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span></code></pre></td></tr></tbody></table></figure> 效果： <imgsrc="https://bu.dusays.com/2024/10/28/671f2b9b2f2ec.webp" /><div class="note default modern"><i class="solitude fas fa-info-circle"></i><p>效果演示使用的是我的<a href="/posts/d6f83120/" title="多复变函数论笔记 - 第一章 全纯函数 - 第一节 复欧氏空间">多复变函数论笔记</a>的Typst 版本。</p></div></p><h3 id="目录不同层级标题使用不同样式">目录不同层级标题使用不同样式</h3><h4 id="简易版">简易版</h4><figure class="highlight typst"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">#show</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> outline</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">entry</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#E45649;--shiki-dark:#E06C75">it</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> => &#123;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">  if</span><span style="color:#E45649;--shiki-dark:#E06C75"> it</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">level</span><span style="color:#383A42;--shiki-dark:#56B6C2"> ==</span><span style="color:#986801;--shiki-dark:#D19A66"> 1</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#123;</span></span><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">    strong</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#E45649;--shiki-dark:#E06C75">it</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  &#125; </span><span style="color:#A626A4;--shiki-dark:#C678DD">else</span><span style="color:#A626A4;--shiki-dark:#C678DD"> if</span><span style="color:#E45649;--shiki-dark:#E06C75"> it</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">level</span><span style="color:#383A42;--shiki-dark:#56B6C2"> >=</span><span style="color:#986801;--shiki-dark:#D19A66"> 3</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#123;</span></span><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">    emph</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#E45649;--shiki-dark:#E06C75">it</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  &#125; </span><span style="color:#A626A4;--shiki-dark:#C678DD">else</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#123;</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">    it</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  &#125;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">&#125;</span></span></code></pre></td></tr></tbody></table></figure><p>效果如下： <imgsrc="https://bu.dusays.com/2024/10/28/671f2b9cc5a92.webp" alt="效果" />可以发现，页码也变得歪七倒八的。如果不介意，那么用这个简易版即可；反之，可以看下面的复杂版</p><h4 id="复杂版">复杂版</h4><figure class="highlight typst"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">#show</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> outline</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">entry</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#E45649;--shiki-dark:#E06C75">it</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> => &#123;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">  let</span><span style="color:#E45649;--shiki-dark:#E06C75"> loc</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span><span style="color:#E45649;--shiki-dark:#E06C75"> it</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">element</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">location</span><span style="color:#383A42;--shiki-dark:#ABB2BF">()</span></span><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">  link</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">    loc</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">    if</span><span style="color:#E45649;--shiki-dark:#E06C75"> it</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">level</span><span style="color:#383A42;--shiki-dark:#56B6C2"> ==</span><span style="color:#986801;--shiki-dark:#D19A66"> 1</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#123;</span></span><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">      strong</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#E45649;--shiki-dark:#E06C75">it</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">body</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    &#125; </span><span style="color:#A626A4;--shiki-dark:#C678DD">else</span><span style="color:#A626A4;--shiki-dark:#C678DD"> if</span><span style="color:#E45649;--shiki-dark:#E06C75"> it</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">level</span><span style="color:#383A42;--shiki-dark:#56B6C2"> >=</span><span style="color:#986801;--shiki-dark:#D19A66"> 3</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#123;</span></span><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">      emph</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#E45649;--shiki-dark:#E06C75">it</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">body</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    &#125; </span><span style="color:#A626A4;--shiki-dark:#C678DD">else</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#123;</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">      it</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">body</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    &#125;,</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  )</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">  sym</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">space</span></span><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">  box</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">width</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">1fr</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#E45649;--shiki-dark:#E06C75">it</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">fill</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">  sym</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">space</span></span><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">  link</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#E45649;--shiki-dark:#E06C75">loc</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#E45649;--shiki-dark:#E06C75">it</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#E45649;--shiki-dark:#E06C75">page</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">&#125;</span></span></code></pre></td></tr></tbody></table></figure><p>复杂版是直接照着 Typst 的 <code>outline</code> 函数<ahref="https://github.com/typst/typst/blob/main/crates/typst/src/model/outline.rs#L486">源码</a>来写的，只有标题的文字部分会修改样式，效果如下：<img src= "" data-lazy-src="https://bu.dusays.com/2024/10/28/671f2b9d989f5.webp"alt="效果" /></p><h3 id="结合-showybox-与-ctheorems-包制作美观定理环境">结合 showybox 与ctheorems 包制作美观定理环境</h3><p>本节内容参考了 <ahref="https://github.com/sahasatvik/typst-theorems/issues/15">showyboxand ctheorems? · Issue #15 · sahasatvik/typst-theorems</a>的内容并进行了部分修改。 <figure class="highlight typst"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// --------- 定义函数 ---------</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">#import</span><span style="color:#50A14F;--shiki-dark:#98C379"> "@preview/ctheorems:1.1.2"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#383A42;--shiki-dark:#56B6C2">*</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">#import</span><span style="color:#50A14F;--shiki-dark:#98C379"> "@preview/showybox:2.0.1"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#E45649;--shiki-dark:#E06C75">showybox</span></span><span class="line"></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">#let</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> showy-thm</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">  identifier</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">  head</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">  color</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#E45649;--shiki-dark:#E06C75">blue</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  ..</span><span style="color:#E45649;--shiki-dark:#E06C75">showy-args</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">  supplement</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">auto</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">  base</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">"heading"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">  base_level</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">none</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">) </span><span style="color:#383A42;--shiki-dark:#56B6C2">=</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#123;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">  let</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> showy-fmt</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#E45649;--shiki-dark:#E06C75">name</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#E45649;--shiki-dark:#E06C75">number</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#E45649;--shiki-dark:#E06C75">body</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, ..</span><span style="color:#E45649;--shiki-dark:#E06C75">args</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) </span><span style="color:#383A42;--shiki-dark:#56B6C2">=</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#123;</span></span><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">    showybox</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span></span><span class="line"><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">      title</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: &#123;</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">        head</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">        number</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">        if</span><span style="color:#E45649;--shiki-dark:#E06C75"> name</span><span style="color:#383A42;--shiki-dark:#56B6C2"> !=</span><span style="color:#986801;--shiki-dark:#D19A66"> none</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#123;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">          [（#name）]</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">        &#125;</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">      &#125;,</span></span><span class="line"><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">      frame</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: (</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">        border-color</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#E45649;--shiki-dark:#E06C75">color</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">        title-color</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#E45649;--shiki-dark:#E06C75">color</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">lighten</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#986801;--shiki-dark:#D19A66">30%</span><span style="color:#383A42;--shiki-dark:#ABB2BF">),</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">        body-color</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#E45649;--shiki-dark:#E06C75">color</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">lighten</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#986801;--shiki-dark:#D19A66">95%</span><span style="color:#383A42;--shiki-dark:#ABB2BF">),</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">        footer-color</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#E45649;--shiki-dark:#E06C75">color</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">lighten</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#986801;--shiki-dark:#D19A66">80%</span><span style="color:#383A42;--shiki-dark:#ABB2BF">),</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">        radius</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: (</span><span style="color:#E45649;--shiki-dark:#E06C75">top-left</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">7pt</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#E45649;--shiki-dark:#E06C75">bottom-right</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">7pt</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#E45649;--shiki-dark:#E06C75">rest</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">2pt</span><span style="color:#383A42;--shiki-dark:#ABB2BF">),</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">      ),</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">      ..</span><span style="color:#E45649;--shiki-dark:#E06C75">args</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">named</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(),</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">      body</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    )</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  &#125;</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">  if</span><span style="color:#E45649;--shiki-dark:#E06C75"> supplement</span><span style="color:#383A42;--shiki-dark:#56B6C2"> ==</span><span style="color:#986801;--shiki-dark:#D19A66"> auto</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> &#123;</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">    supplement</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span><span style="color:#E45649;--shiki-dark:#E06C75"> head</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  &#125;</span></span><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">  thmenv</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">    identifier</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">    "heading"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#986801;--shiki-dark:#D19A66">    none</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    (</span><span style="color:#E45649;--shiki-dark:#E06C75">name</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#E45649;--shiki-dark:#E06C75">number</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#E45649;--shiki-dark:#E06C75">body</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) => </span><span style="color:#4078F2;--shiki-dark:#61AFEF">showy-fmt</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#E45649;--shiki-dark:#E06C75">name</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#E45649;--shiki-dark:#E06C75">number</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#E45649;--shiki-dark:#E06C75">body</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, ..</span><span style="color:#E45649;--shiki-dark:#E06C75">showy-args</span><span style="color:#383A42;--shiki-dark:#ABB2BF">),</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  ).</span><span style="color:#4078F2;--shiki-dark:#61AFEF">with</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">supplement</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#E45649;--shiki-dark:#E06C75">supplement</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">&#125;</span></span><span class="line"></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">#let</span><span style="color:#E45649;--shiki-dark:#E06C75"> theorem</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> showy-thm</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">  "theorem"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#50A14F;--shiki-dark:#98C379">  "定理"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">  title-style</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: (</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">    weight</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">"bold"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">    boxed-style</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: (</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">      anchor</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: (</span><span style="color:#E45649;--shiki-dark:#E06C75">x</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#E45649;--shiki-dark:#E06C75">left</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#E45649;--shiki-dark:#E06C75">y</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#E45649;--shiki-dark:#E06C75">horizon</span><span style="color:#383A42;--shiki-dark:#ABB2BF">),</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">      offset</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: (</span><span style="color:#E45649;--shiki-dark:#E06C75">x</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">0pt</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#E45649;--shiki-dark:#E06C75">t</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">0pt</span><span style="color:#383A42;--shiki-dark:#ABB2BF">),</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">      radius</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: (</span><span style="color:#E45649;--shiki-dark:#E06C75">top-left</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">7pt</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#E45649;--shiki-dark:#E06C75">bottom-right</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">7pt</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#E45649;--shiki-dark:#E06C75">rest</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">2pt</span><span style="color:#383A42;--shiki-dark:#ABB2BF">),</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    ),</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  ),</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">).</span><span style="color:#4078F2;--shiki-dark:#61AFEF">with</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">numbering</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">"1.1"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">#let</span><span style="color:#E45649;--shiki-dark:#E06C75"> lemma</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> showy-thm</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">"lemma"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#50A14F;--shiki-dark:#98C379">"引理"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">color</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#E45649;--shiki-dark:#E06C75">green</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">darken</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#986801;--shiki-dark:#D19A66">25%</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)).</span><span style="color:#4078F2;--shiki-dark:#61AFEF">with</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">numbering</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#50A14F;--shiki-dark:#98C379">"1.1"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">#let</span><span style="color:#E45649;--shiki-dark:#E06C75"> proof</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span><span style="color:#4078F2;--shiki-dark:#61AFEF"> thmproof</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">"proof"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#50A14F;--shiki-dark:#98C379">"证明"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">inset</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: (</span><span style="color:#E45649;--shiki-dark:#E06C75">x</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">0em</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#E45649;--shiki-dark:#E06C75">top</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">0em</span><span style="color:#383A42;--shiki-dark:#ABB2BF">))</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// --------- 定义函数 ---------</span></span><span class="line"></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// --------- 使用演示 ---------</span></span><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">#show</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#E45649;--shiki-dark:#E06C75">thmrules</span></span><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">#theorem</span><span style="color:#383A42;--shiki-dark:#ABB2BF">[</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  对任何子集 </span><span style="color:#50A14F;--shiki-dark:#98C379">$Omega subset CC^n$</span><span style="color:#383A42;--shiki-dark:#ABB2BF">，</span><span style="color:#50A14F;--shiki-dark:#98C379">$cal(O)(Omega)$</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> 在逐点加法和数乘意义下封闭。</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  任一关于 </span><span style="color:#50A14F;--shiki-dark:#98C379">$z_1, dots.c, z_n$</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> 的复系数多项式在 </span><span style="color:#50A14F;--shiki-dark:#98C379">$CC^n$</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> 上是全纯的，从而在 </span><span style="color:#50A14F;--shiki-dark:#98C379">$cal(O)(Omega)$</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> 里。</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  若 </span><span style="color:#50A14F;--shiki-dark:#98C379">$f, g in cal(O)(Omega)$</span><span style="color:#383A42;--shiki-dark:#ABB2BF">，且 </span><span style="color:#50A14F;--shiki-dark:#98C379">$g(z) eq.not 0, forall z in Omega$</span><span style="color:#383A42;--shiki-dark:#ABB2BF">，则 </span><span style="color:#50A14F;--shiki-dark:#98C379">$f slash g in cal(O)(Omega)$</span><span style="color:#383A42;--shiki-dark:#ABB2BF">。</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">]</span></span><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">#theorem</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">"F. Hartogs, 1906"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">numbering</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">none</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)[</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  设 </span><span style="color:#50A14F;--shiki-dark:#98C379">$D subset CC^n$</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> 为一区域，</span><span style="color:#50A14F;--shiki-dark:#98C379">$f: D -> CC$</span><span style="color:#383A42;--shiki-dark:#ABB2BF">。若 </span><span style="color:#50A14F;--shiki-dark:#98C379">$f$</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> 分别关于每一单复变量 </span><span style="color:#50A14F;--shiki-dark:#98C379">$z_j (1 &#x3C;= j &#x3C;= n)$</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  全纯，则 </span><span style="color:#50A14F;--shiki-dark:#98C379">$f in cal(O)(D)$</span><span style="color:#383A42;--shiki-dark:#ABB2BF">。</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">]</span></span><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">#lemma</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#50A14F;--shiki-dark:#98C379">"Osgood"</span><span style="color:#383A42;--shiki-dark:#ABB2BF">, </span><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">numbering</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">none</span><span style="color:#383A42;--shiki-dark:#ABB2BF">)[</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  设 </span><span style="color:#50A14F;--shiki-dark:#98C379">$D subset CC$</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> 为一区域，</span><span style="color:#50A14F;--shiki-dark:#98C379">$f: D -> CC$</span><span style="color:#383A42;--shiki-dark:#ABB2BF">。若 </span><span style="color:#50A14F;--shiki-dark:#98C379">$f in C(D)$</span><span style="color:#383A42;--shiki-dark:#ABB2BF">，且 </span><span style="color:#50A14F;--shiki-dark:#98C379">$f$</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  分别关于每一单复变量 </span><span style="color:#50A14F;--shiki-dark:#98C379">$z_j (1 &#x3C;= j &#x3C;= n)$</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> 全纯，则 </span><span style="color:#50A14F;--shiki-dark:#98C379">$f in cal(O)(D)$</span><span style="color:#383A42;--shiki-dark:#ABB2BF">。</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">]</span></span><span class="line"><span style="color:#A0A1A7;font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// --------- 使用演示 ---------</span></span></code></pre></td></tr></tbody></table></figure></p><p>效果： <imgsrc="https://bu.dusays.com/2024/10/28/671f2b9f49a8c.webp" /></p><h3 id="在文本中使用美观的大括号分类">在文本中使用美观的大括号分类</h3><figure class="highlight typst"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span style="color:#A626A4;--shiki-dark:#C678DD">#let</span><span style="color:#E45649;--shiki-dark:#E06C75"> my-cases</span><span style="color:#383A42;--shiki-dark:#56B6C2"> =</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> (..</span><span style="color:#E45649;--shiki-dark:#E06C75">items</span><span style="color:#383A42;--shiki-dark:#ABB2BF">) => </span><span style="color:#4078F2;--shiki-dark:#61AFEF">box</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span></span><span class="line"><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">  baseline</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">50%</span><span style="color:#383A42;--shiki-dark:#56B6C2"> -</span><span style="color:#986801;--shiki-dark:#D19A66"> 0.5em</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#383A42;font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">  width</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#986801;--shiki-dark:#D19A66">1fr</span><span style="color:#383A42;--shiki-dark:#ABB2BF">,</span></span><span class="line"><span style="color:#E45649;--shiki-dark:#E06C75">  math</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">cases</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">    ..</span><span style="color:#E45649;--shiki-dark:#E06C75">items</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">pos</span><span style="color:#383A42;--shiki-dark:#ABB2BF">().</span><span style="color:#4078F2;--shiki-dark:#61AFEF">map</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#E45649;--shiki-dark:#E06C75">item</span><span style="color:#383A42;--shiki-dark:#ABB2BF"> => </span><span style="color:#E45649;--shiki-dark:#E06C75">math</span><span style="color:#383A42;--shiki-dark:#ABB2BF">.</span><span style="color:#4078F2;--shiki-dark:#61AFEF">display</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#4078F2;--shiki-dark:#61AFEF">block</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#E45649;--shiki-dark:#E06C75">item</span><span style="color:#383A42;--shiki-dark:#ABB2BF">))),</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">  ),</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span><span class="line"></span><span class="line"><span style="color:#C18401;font-weight:bold;--shiki-dark:#E5C07B;--shiki-dark-font-weight:inherit">*</span><span style="color:#986801;font-weight:bold;--shiki-dark:#D19A66;--shiki-dark-font-weight:inherit">TEST</span><span style="color:#C18401;font-weight:bold;--shiki-dark:#E5C07B;--shiki-dark-font-weight:inherit">*</span><span style="color:#383A42;--shiki-dark:#ABB2BF">: </span><span style="color:#4078F2;--shiki-dark:#61AFEF">#my-cases</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span></span><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">  lorem</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#986801;--shiki-dark:#D19A66">20</span><span style="color:#383A42;--shiki-dark:#ABB2BF">),</span></span><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">  lorem</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#986801;--shiki-dark:#D19A66">20</span><span style="color:#383A42;--shiki-dark:#ABB2BF">),</span></span><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">  lorem</span><span style="color:#383A42;--shiki-dark:#ABB2BF">(</span><span style="color:#986801;--shiki-dark:#D19A66">20</span><span style="color:#383A42;--shiki-dark:#ABB2BF">),</span></span><span class="line"><span style="color:#383A42;--shiki-dark:#ABB2BF">)</span></span></code></pre></td></tr></tbody></table></figure><p>效果： <imgsrc="https://bu.dusays.com/2024/10/28/671f2ba7b79a1.webp" /></p><h3 id="在-typst-中绘制-latex-符号">在 Typst 中绘制 LaTeX 符号</h3><p>Typst Universe 上有一个现成的包 <ahref="https://typst.app/universe/package/metalogo">metalogo</a>，提供了各种TeX 徽标的绘制函数</p><figure><img src= "" data-lazy-src="https://bu.dusays.com/2025/02/28/67c1bd573c0e4.webp"alt="metalogo manual" /><figcaption aria-hidden="true">metalogo manual</figcaption></figure><h3 id="其他">其他</h3><ul><li>对齐 <code>enum</code> / <code>list</code> 环境中的文本与标号：<ahref="https://github.com/typst/typst/issues/1204">List and enum markersare not aligned with the baseline of the item’s contents · Issue #1204 ·typst/typst</a></li></ul><h2 id="转换为-markdown">转换为 Markdown</h2><p>我使用 Pandoc 将 Typst 转换为 Markdown 文件，方便放在博客。<div class="note default modern"><i class="solitude fas fa-info-circle"></i><p>如果你愿意折腾，可以尝试使用 <ahref="https://github.com/Myriad-Dreamin/typst.ts/tree/main/projects/hexo-renderer-typst">hexo-renderer-typst</a>直接在 Hexo 上渲染 Typst 文档。</p></div></p><h3 id="基础操作">基础操作</h3><p>下载 <a href="https://github.com/jgm/pandoc/releases" rel="external nofollow noreferrer">Pandoc</a>的最新版本，配置相应环境变量（如果有需要的话），然后就可以开始了。</p><figure class="highlight shell"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre class="shiki shiki-themes one-light one-dark-pro"><span class="line"><span style="color:#4078F2;--shiki-dark:#61AFEF">pandoc</span><span style="color:#986801;--shiki-dark:#D19A66"> --from=typst</span><span style="color:#986801;--shiki-dark:#D19A66"> --to=markdown</span><span style="color:#986801;--shiki-dark:#D19A66"> --output=path/to/your/blog/source/_draft/post_name.md</span><span style="color:#986801;--shiki-dark:#D19A66"> --wrap=preserve</span><span style="color:#50A14F;--shiki-dark:#98C379"> "path/to/your/typst_file.typ"</span></span></code></pre></td></tr></tbody></table></figure><h3 id="不能转换的情形">不能转换的情形</h3><div class="note warning modern"><i class="solitude fas fa-info-circle"></i><p>以下内容基于 pandoc 3.4 说明</p></div><ul><li><code>import</code> 和 <code>include</code> pandoc会报错：<code>&lt;stderr&gt;: hPutChar: invalid argument</code>，因此本地包、本地文件和远程包都不能使用。</li><li><code>context</code> pandoc会报错：<code>&lt;stderr&gt;: hPutChar: invalid argument</code></li></ul><p>可能有更多转换失败的情形，欢迎在本文评论区留言告诉我。</p><h3 id="转换可能出现的错误">转换可能出现的错误</h3><ul><li>与标签相关的内容，转换可能出错</li><li>数学公式中未使用括号限制范围的嵌套上下标，转换可能出错，如<code>a_b^c_d</code>（<spanclass="math inline">\(a_b^{c_d}\)</span>）转换为 <spanclass="math inline">\({a_b^c}_d\)</span> 等</li></ul><p>可能有更多转换错误的情形，欢迎在本文评论区留言告诉我。</p><h2 id="实用工具">实用工具</h2><ul><li>在线 Typst 公式识别：<ahref="https://typress-web.vercel.app/">Typress</a></li></ul>]]></content:encoded>
      
      
      <category domain="https://blog.hpcesia.com/categories/%E7%BB%8F%E9%AA%8C%E8%AE%B0%E5%BD%95/">经验记录</category>
      
      
      <category domain="https://blog.hpcesia.com/tags/Typst/">Typst</category>
      
      <category domain="https://blog.hpcesia.com/tags/Pandoc/">Pandoc</category>
      
      <category domain="https://blog.hpcesia.com/tags/Markdown/">Markdown</category>
      
      
      <comments>https://blog.hpcesia.com/posts/5252cfe9/#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>多复变函数论学习笔记 - 第一章 全纯函数 - 第二节 Cauchy-Riemann 方程组</title>
      <link>https://blog.hpcesia.com/posts/ef7d6a4/</link>
      <guid>https://blog.hpcesia.com/posts/ef7d6a4/</guid>
      <pubDate>Fri, 27 Sep 2024 15:04:16 GMT</pubDate>
      
      <description>多复变函数论学习笔记 - 复欧氏空间上的 Cauchy-Riemann 方程组</description>
      
      
      
      <content:encoded><![CDATA[<h2 id="多重指标记号">多重指标记号</h2><p>定义如下<strong>多重指标记号</strong>：</p><ul><li>设 <span class="math inline">\(\alpha = \left(\alpha_{1},\cdots,\alpha_{n} \right) \in{\mathbb{N}}^{n}\)</span>，<span class="math inline">\(x = \left(x_{1},\cdots,x_{n} \right) \in {\mathbb{R}}^{n}\)</span>，记</li></ul><p><span class="math display">\[|\alpha| = \sum_{j =1}^{n}\alpha_{j},\quad\alpha! = \prod_{j = 1}^{n}\alpha_{j}!,\quadx^{\alpha} = \prod_{j = 1}^{n}{x_{j}^{\alpha_{j}}}.\]</span></p><ul><li><p>记 <span class="math inline">\(\alpha \geq 0\)</span> 为 <spanclass="math inline">\(\forall 1 \leq j \leq n\)</span>，<spanclass="math inline">\(\alpha_{j} \geq 0\)</span>。</p></li><li><p>记</p></li></ul><p><span class="math display">\[D^{\alpha} ≔\frac{\partial^{|\alpha|}}{\partial x_{1}^{\alpha_{1}}\cdots\partialx_{n}^{\alpha_{n}}}.\]</span></p><h2 id="复值连续可微空间">复值连续可微空间</h2><p>对开集 <span class="math inline">\(D \subset{\mathbb{R}}^{n}\)</span> 与 <span class="math inline">\(k \in{\mathbb{N}} \cup \left\{ + \infty \right\}\)</span>，<spanclass="math inline">\(C^{k}(D)\)</span> 表示在 <spanclass="math inline">\(D\)</span> 内 <spanclass="math inline">\(k\)</span> 次连续可微的的复值函数全体，并记 <spanclass="math inline">\(C(D) = C^{0}(D)\)</span>。</p><p>设 <span class="math inline">\(f \in C^{k}(D)\)</span>，<spanclass="math inline">\(k &lt; + \infty\)</span>，定义 <spanclass="math inline">\(f\)</span> 在 <spanclass="math inline">\(D\)</span> 上的 <spanclass="math inline">\(C^{k}\)</span> 范数为 <spanclass="math display">\[\left\| f \right\|_{k,D} = \sum_{\begin{array}{r}\alpha \in {\mathbb{N}}^{n} \\|\alpha| \leq k\end{array}}\sup\limits_{x \in D}\left| {D^{\alpha}f(x)}\right|.\]</span> 记 <span class="math inline">\(\left\| f \right\|_{D}≔ \left\| f \right\|_{0,D}\)</span>，<span class="math inline">\(\left\|f \right\|_{k} ≔ \left\| f \right\|_{k,D}\)</span>，空间 <spanclass="math display">\[B^{k}(D) = \left\{ f \in C^{k}(D):\left\| f\right\|_{k} &lt; \infty \right\}\]</span> 关于 <spanclass="math inline">\(C^{k}\)</span> 范数 <spanclass="math inline">\(\left\| \cdot \right\|_{k}\)</span>是<strong>完备的</strong>，即 <spanclass="math inline">\(B^{k}(D)\)</span> 为 <strong>Banach空间</strong>。</p><p>类似地，空间 <span class="math display">\[C^{k}\left( \overline{D}\right) = \left\{ f \in C^{k}(D):D^{\alpha}f\text{ 可连续延拓到}\overline{D},\forall\alpha \in {\mathbb{N}}^{n},|\alpha| \leq k\right\}\]</span> 关于范数 <span class="math inline">\(\left\| \cdot\right\|_{k,D}\)</span> 也为 Banach 空间。</p><h2 id="偏微分算子">偏微分算子</h2><p>视 <span class="math inline">\({\mathbb{C}}^{n} ={\mathbb{R}}^{2n}\)</span>，由 <span class="math inline">\(z_{j} = x_{j}+ ix_{j + n}\)</span>，可引入偏微分算子 <spanclass="math display">\[\frac{\partial}{\partial z_{j}} =\frac{1}{2}\left( \frac{\partial}{\partial x_{j}} -i\frac{\partial}{\partial x_{j + n}}\right),\quad\frac{\partial}{\partial\overline{z_{j}}} =\frac{1}{2}\left( \frac{\partial}{\partial x_{j}} +i\frac{\partial}{\partial x_{j + n}} \right).\]</span> 容易验证 <spanclass="math display">\[\overline{\frac{\partial f}{\partial z_{j}}} =\frac{\partial\overline{f}}{\partial\overline{z_{j}}},\quad\overline{\frac{\partialf}{\partial\overline{z_{j}}}} = \frac{\partial\overline{f}}{\partialz_{j}}.\]</span></p><p>多重指标记号也可扩充到偏微分算子：<spanclass="math inline">\(\forall\alpha,\beta \in{\mathbb{N}}^{n}\)</span>， <spanclass="math display">\[D^{\alpha\overline{\beta}} ≔\frac{\partial^{|\alpha| + |\beta|}}{\partialz_{1}^{\alpha_{1}}\cdots\partialz_{n}^{\alpha_{n}}\partial\overline{z_{1}^{\beta_{1}}}\cdots\partial\overline{z_{n}^{\beta_{n}}}},\]</span><span class="math display">\[D^{\alpha} ≔\frac{\partial^{|\alpha|}}{\partial z_{1}^{\alpha_{1}}\cdots\partialz_{n}^{\alpha_{n}}},\quad D^{\overline{\beta}} ≔\frac{\partial^{|\beta|}}{\partial\overline{z_{1}^{\beta_{1}}}\cdots\partial\overline{z_{n}^{\beta_{n}}}}.\]</span></p><p>其具有性质：<span class="math inline">\(\forall\alpha,\beta \in{\mathbb{N}}^{n}\)</span>，<span class="math inline">\(|\alpha| +|\beta| \leq k\)</span>，有 <span class="math inline">\(f \in C^{k}(D)\Longleftrightarrow D^{\alpha\overline{\beta}} \in C(D)\)</span>。</p><h2 id="区域上的全纯函数">区域上的全纯函数</h2><p>设 <span class="math inline">\(D \subset {\mathbb{C}}^{n}\)</span>为一区域，<span class="math inline">\(f:D \rightarrow{\mathbb{C}}\)</span> 为一复值函数，若 <span class="math inline">\(f \inC^{1}(D)\)</span>，且 <span class="math inline">\(f\)</span>满足如下<strong>齐次 Cauchy-Riemann 方程组</strong>： <spanclass="math display">\[\frac{\partial f}{\partial\overline{z_{j}}} =0,\quad\forall 1 \leq j \leq n,\quad z \in D,\]</span> 则称 <spanclass="math inline">\(f\)</span> 在 <spanclass="math inline">\(D\)</span> 内<strong>全纯</strong>。</p><p>在单变量的情形下，若一个定义在区域 <span class="math inline">\(D\subset {\mathbb{C}}\)</span> 上的复值函数 <spanclass="math inline">\(f\)</span> 在 <spanclass="math inline">\(D\)</span> 上任一点的局部均可展开为幂级数，则称<span class="math inline">\(f\)</span> 在 <spanclass="math inline">\(D\)</span>上全纯。多变量情形下，也有类似的全纯函数幂级数定义：</p><p>设 <span class="math inline">\(D \subset {\mathbb{C}}^{n}\)</span>为一区域，<span class="math inline">\(f:D \rightarrow{\mathbb{C}}\)</span> 为一复值函数。若对任一点 <spanclass="math inline">\(z^{(0)} \in D\)</span>，均存在 <spanclass="math inline">\(z^{(0)}\)</span> 的一个开邻域 <spanclass="math inline">\(U \subset D\)</span>，使得 <spanclass="math inline">\(\forall z \in U\)</span>， <spanclass="math display">\[f(z) = \sum_{\alpha \in{\mathbb{N}}^{n}}\mathcal{a}_{\alpha}\left( z - z^{(0)} \right)^{\alpha}≔ \sum_{\alpha_{1},\cdots,\alpha_{n} = 0}^{+\infty}\mathcal{a}_{\alpha_{1},\cdots,\alpha_{n}}\prod_{j = 1}^{n}\left(z_{j} - z_{j}^{(0)} \right)^{\alpha_{j}},\]</span> 则称 <spanclass="math inline">\(f\)</span> 在 <spanclass="math inline">\(D\)</span>内<strong>全纯</strong>。上述两个全纯函数定义是<strong>等价</strong>的。</p><h2 id="hartogs-定理">Hartogs 定理</h2><p>记 <span class="math inline">\(\mathcal{O}(D)\)</span> 为 <spanclass="math inline">\(D\)</span> 上全体全纯函数的集合。若 <spanclass="math inline">\(\Omega\)</span> 是 <spanclass="math inline">\(C^{n}\)</span>中的任意子集（例如紧子集或更为一般的闭集），则 <spanclass="math inline">\(\mathcal{O}(\Omega)\)</span> 表示在包含 <spanclass="math inline">\(\Omega\)</span> 的某个邻域上的全纯函数的集合。</p><p>约定 <span class="math inline">\(f = g,\forall f,g \in\mathcal{O}(\Omega) \Longleftrightarrow\)</span> 存在 <spanclass="math inline">\(\Omega\)</span> 的某一邻域 <spanclass="math inline">\(D\)</span>，使得 <span class="math inline">\(f(z)= g(z),\forall z \in D\)</span>。</p><p>由全纯函数定义，立得：</p><p><strong>定理</strong>: 对任何子集 <span class="math inline">\(\Omega\subset {\mathbb{C}}^{n}\)</span>，<spanclass="math inline">\(\mathcal{O}(\Omega)\)</span>在逐点加法和数乘意义下封闭。任一关于 <spanclass="math inline">\(z_{1},\cdots,z_{n}\)</span> 的复系数多项式在 <spanclass="math inline">\({\mathbb{C}}^{n}\)</span> 上是全纯的，从而在 <spanclass="math inline">\(\mathcal{O}(\Omega)\)</span> 里。若 <spanclass="math inline">\(f,g \in \mathcal{O}(\Omega)\)</span>，且 <spanclass="math inline">\(g(z) \neq 0,\forall z \in \Omega\)</span>，则<span class="math inline">\(f/g \in \mathcal{O}(\Omega)\)</span>。</p><p>任意满足齐次 Cauchy-Riemann 方程组的函数 <spanclass="math inline">\(f\)</span> 也分别关于单复变量 <spanclass="math inline">\(z_{j}\)</span> 全纯。反过来，则有如下 Hartogs定理：</p><p><strong>定理</strong> (F. Hartogs, 1906): 设 <spanclass="math inline">\(D \subset {\mathbb{C}}^{n}\)</span>为一区域，<span class="math inline">\(f:D \rightarrow{\mathbb{C}}\)</span>。若 <span class="math inline">\(f\)</span>分别关于每一单复变量 <span class="math inline">\(z_{j}(1 \leq j \leqn)\)</span> 全纯，则 <span class="math inline">\(f \in\mathcal{O}(D)\)</span>。</p><p>上述定理说明全纯函数定义中的 <span class="math inline">\(f \inC^{1}(D)\)</span> 为多余条件。</p><p>Hartogs 定理在实变函数论中不成立：设 <spanclass="math inline">\(f:{\mathbb{R}}^{2} \rightarrow{\mathbb{R}}^{2}\)</span>， <span class="math display">\[f(x,y) =\begin{cases}\displaystyle{\frac{xy}{x^{4} + y^{4}}},\quad &amp; (x,y) \neq (0,0), \\0,\quad &amp; (x,y) = (0,0).\end{cases}\]</span> 显然 <span class="math inline">\(f\)</span> 关于<span class="math inline">\(x,y\)</span> 均是实解析的，但其在 <spanclass="math inline">\((0,0)\)</span> 处无界。</p><h2 id="osgood-定理">Osgood 定理</h2><p><strong>引理</strong> (Osgood): 设 <span class="math inline">\(D\subset {\mathbb{C}}\)</span> 为一区域，<span class="math inline">\(f:D\rightarrow {\mathbb{C}}\)</span>。若 <span class="math inline">\(f \inC(D)\)</span>，且 <span class="math inline">\(f\)</span>分别关于每一单复变量 <span class="math inline">\(z_{j}(1 \leq j \leqn)\)</span> 全纯，则 <span class="math inline">\(f \in\mathcal{O}(D)\)</span>。</p><p><em>证明</em>: 任选一点 <span class="math inline">\(z^{(0)} \inD\)</span> 以及 <span class="math inline">\(P\left( z^{(0)},r \right)\subset \subset D\)</span>，由于 <span class="math inline">\(f\)</span>在 <span class="math inline">\(\overline{P\left( z^{(0)},r\right)}\)</span>的邻域内关于每一单复变量全纯，可以重复使用单复变量全纯函数的 Cauchy积分公式，得 <span class="math display">\[f(z) = \left( \frac{1}{2\pi i}\right)^{n}\int_{\left| {\zeta_{1} - z_{1}^{(0)}} \right| =r_{1}}\frac{d\zeta_{1}}{\zeta_{1} - z_{1}}\cdots\int_{\left| {\zeta_{n}- z_{n}^{(0)}} \right| = r_{n}}\frac{f(\zeta)d\zeta_{n}}{\zeta_{n} -z_{n}}\]</span> 对任意 <span class="math inline">\(z \in P\left(z^{(0)},r \right)\)</span> 均成立。对任意固定点 <spanclass="math inline">\(z\)</span>，上式各积分的被积函数均在 <spanclass="math inline">\(D\)</span> 的紧子集 <spanclass="math display">\[\left\{ \zeta = \left( \zeta_{1},\cdots,\zeta_{n}\right) \in {\mathbb{C}}^{n}:\left| {\zeta_{1} - z_{1}^{(0)}} \right| =r_{1},\cdots,\left| {\zeta_{n} - z_{n}^{(0)}} \right| = r_{n}\right\}\]</span> 上连续，于是上式的累次积分可替换为重积分 <spanclass="math display">\[f(z) = \left( \frac{1}{2\pi i}\right)^{n}\int\mspace{-5mu}\cdots\mspace{-5mu}\int_{\mathfrak{b}P\left(z^{(0)},r \right)}\frac{f(\zeta)d\zeta_{1}\cdots d\zeta_{n}}{\prod_{j =1}^{n}\left( \zeta_{j} - z_{j} \right)}.\]</span> 注意到对固定的 <spanclass="math inline">\(z \in P\left( z^{(0)},r \right)\)</span>，级数<span class="math display">\[\prod_{j = 1}^{n}\left( \zeta_{j} - z_{j}\right)^{- 1} = \sum_{\alpha_{1},\cdots,\alpha_{n} = 0}^{+\infty}\prod_{j = 1}^{n}\frac{\left( z_{j} - z_{j}^{(0)}\right)^{\alpha_{j}}}{\left( \zeta_{j} - z_{j}^{(0)} \right)^{\alpha_{j}+ 1}}\]</span> 对所有 <span class="math inline">\(\zeta \in{\mathfrak{b}P\left( z^{(0)},r \right)}\)</span>绝对收敛、一致收敛。于是可将级数代入重积分中，并交换求和积分次序，得<span class="math display">\[f(z) = \sum_{\alpha_{1},\cdots,\alpha_{n} =0}^{+ \infty}\mathcal{a}_{\alpha_{1},\cdots,\alpha_{n}}\prod_{j =1}^{n}\left( z_{j} - z_{j}^{(0)} \right)^{\alpha_{j}},\]</span> 其中<span class="math display">\[\mathcal{a}_{\alpha_{1},\cdots,\alpha_{n}}≔ \left( \frac{1}{2\pi i}\right)^{n}\int\mspace{-5mu}\cdots\mspace{-5mu}\int_{\mathfrak{b}P\left(z^{(0)},r \right)}\frac{f(\zeta)d\zeta_{1}\cdots d\zeta_{n}}{\prod_{j =1}^{n}\left( \zeta_{j} - z_{j}^{(0)} \right)^{\alpha_{j} + 1}}.\]</span>由 <span class="math inline">\(z^{(0)}\)</span> 任意性可知 <spanclass="math inline">\(f(z)\)</span> 在 <spanclass="math inline">\(D\)</span> 上全纯。</p><p><strong>引理</strong> (Schwarz): 记 <spanclass="math inline">\(\mathbb{D}\)</span> 为复平面上的单位圆盘，<spanclass="math inline">\(f:{\mathbb{D}} \rightarrow {\mathbb{D}}\)</span>是 <span class="math inline">\(\mathbb{D}\)</span> 上全纯函数且 <spanclass="math inline">\(f(0) = 0\)</span>，则 <spanclass="math inline">\(\forall z \in {\mathbb{D}}\)</span>，<spanclass="math inline">\(\left| {f(z)} \right| \leq |z|\)</span> 且 <spanclass="math inline">\(\left| {f\prime(0)} \right| \leq1\)</span>。若存在 <span class="math inline">\(z\)</span> 使得 <spanclass="math inline">\(\left| {f(z)} \right| = |z|\)</span> 或者 <spanclass="math inline">\(\left| {f\prime(0)} \right| = 1\)</span>，则 <spanclass="math inline">\(f\)</span> 为一旋转 <spanclass="math inline">\(f(z) = \mathcal{a}z\)</span>，其中 <spanclass="math inline">\(\left| \mathcal{a} \right| = 1\)</span>。</p><p><strong>定理</strong> (Osgood): 设 <span class="math inline">\(\Omega\subset {\mathbb{C}}\)</span> 为一区域，<spanclass="math inline">\(f:\Omega \rightarrow {\mathbb{C}}\)</span>局部有界且分别关于每一单复变量 <span class="math inline">\(z_{j}(1 \leqj \leq n)\)</span> 全纯，则 <span class="math inline">\(f \in\mathcal{O}(\Omega)\)</span>。</p><p><em>证明</em>: 由 Osgood 引理，只需证 <span class="math inline">\(f\in C(\Omega)\)</span>。设 <span class="math inline">\(w \in\Omega\)</span>，任取 <span class="math inline">\(r &gt; 0\)</span> 使得<span class="math inline">\(P(2,2r) \subset \Omega\)</span>，记 <spanclass="math inline">\(g_{j}(z,w) = f\left( w_{1},\cdots,w_{j},z_{j +1},\cdots,z_{n} \right)\)</span>，对任意 <span class="math inline">\(z\in P(w,r)\)</span> 有 <span class="math display">\[\begin{aligned}f(z) - f(w) =  f(z) &amp; - g_{(1)(z,w)} + g_{1}(z,w) - g_{2}(z,w) +\cdots \\&amp; + g_{(n - 1)(z,w)} - f(w).\end{aligned}\]</span> <span class="math inline">\(f\)</span>局部有界，记 <span class="math display">\[M ≔ \sup\limits_{z \inP(w,2r)}\left| {f(z)} \right| &lt; + \infty,\]</span> <spanclass="math inline">\(\mathbb{D}\)</span> 为单位圆盘。定义 <spanclass="math inline">\(\bigtriangleup (a,r) = \left\{ t \in{\mathbb{C}}:\left| {t - a} \right| &lt; r\right\}\)</span>，取双全纯映射 <spanclass="math display">\[h_{j}:{\mathbb{D}} \rightarrow \bigtriangleup(w_{j + 1},r),\quad h_{j}(t) = w_{j + 1} + rt.\]</span> 令 <spanclass="math display">\[F_{j}(t) ≔ \frac{f\left(w_{1},\cdots,w_{j},h(t),z_{j + 2},\cdots,z_{n} \right) - f\left(w_{1},\cdots,w_{j},h(0),z_{j + 2},\cdots,z_{n} \right)}{2M},\]</span> 则<span class="math inline">\(F_{j}(t) \in\mathcal{O}({\mathbb{D}})\)</span>，<span class="math inline">\(F_{j}(0)= 0\)</span> 且 <span class="math inline">\(\left| {F_{j}(t)} \right|&lt; 1\)</span>，由 Schwarz 引理，<span class="math inline">\(\left|{F_{j}(t)} \right| \leq |t|\)</span>。 取 <span class="math inline">\(t= \left( z_{j + 1} - w_{j + 1} \right)/r\)</span>，则有 <spanclass="math display">\[2M\left| {F_{j}(t)} \right| = 2M\left|{g_{j}(z,w) - g_{j + 1}(z,w)} \right| \leq \frac{2M}{r}\left| {z - w}\right|,\]</span> 于是 <span class="math display">\[\left| {f(z) - f(w)}\right| \leq \frac{2M}{r}\sum_{j = 1}^{n}\left| {z_{j} - w_{j}}\right|,\]</span> 即 <span class="math inline">\(f\)</span> 局部Lipschitz 连续。</p>]]></content:encoded>
      
      
      <category domain="https://blog.hpcesia.com/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/">学习笔记</category>
      
      
      <category domain="https://blog.hpcesia.com/tags/%E6%95%B0%E5%AD%A6/">数学</category>
      
      <category domain="https://blog.hpcesia.com/tags/%E5%A4%9A%E5%A4%8D%E5%8F%98%E5%87%BD%E6%95%B0/">多复变函数</category>
      
      
      <comments>https://blog.hpcesia.com/posts/ef7d6a4/#disqus_thread</comments>
      
    </item>
    
  </channel>
</rss>
