<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Blog on aiken&#39;s blog</title>
    <link>https://aikenh.cn/tags/blog/</link>
    <description>Recent content in Blog on aiken&#39;s blog</description>
    <generator>Hugo -- 0.137.0</generator>
    <language>en-us</language>
    <lastBuildDate>Thu, 19 Dec 2024 11:35:08 +0000</lastBuildDate>
    <follow_challenge>
      <feedId>90080597450814464</feedId>
      <userId>72439538841050112</userId>
    </follow_challenge>
    <atom:link href="https://aikenh.cn/tags/blog/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>基于Github部署和发布Hugo博客</title>
      <link>https://aikenh.cn/posts/%E5%8F%91%E5%B8%83%E5%92%8C%E9%83%A8%E7%BD%B2hugo%E5%8D%9A%E5%AE%A2/</link>
      <pubDate>Thu, 19 Dec 2024 11:35:08 +0000</pubDate>
      <guid>https://aikenh.cn/posts/%E5%8F%91%E5%B8%83%E5%92%8C%E9%83%A8%E7%BD%B2hugo%E5%8D%9A%E5%AE%A2/</guid>
      <description>通过 GithubPage 或者 Vercel, Netlify 发布 Hugo 博客的记录</description>
      <content:encoded><![CDATA[<h2 id="托管平台选择">托管平台选择</h2>
<p>一些常见的托管平台 PaaS <span class="sidenote-number"><small class="sidenote">Platform as a Service <a href="https://cloud.google.com/learn/what-is-paas?hl=zh-CN" target="_blank" rel="noopener">平台及服务</a>
，旨在使用户专注于应用代码开发</small></span> 的免费情况如下；</p>
<table>
  <thead>
      <tr>
          <th style="text-align: center">Site</th>
          <th>Github Page</th>
          <th><a href="https://vercel.com/" target="_blank" rel="noopener">Vercel</a>
</th>
          <th><a href="https://www.netlify.com/" target="_blank" rel="noopener">Netfily</a>
</th>
          <th>Coolify</th>
          <th><a href="https://zeabur.com/" target="_blank" rel="noopener">Zeabur</a>
</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td style="text-align: center">Free?</td>
          <td>Y</td>
          <td>Y</td>
          <td>Y</td>
          <td>自托管免费</td>
          <td>N（月费外无需额外）</td>
      </tr>
      <tr>
          <td style="text-align: center">Auto <br>Re-Deployed</td>
          <td>Y</td>
          <td>Y</td>
          <td>Y</td>
          <td>-</td>
          <td>-</td>
      </tr>
  </tbody>
</table>
<p>其实对于这些小型的静态网页的项目部署，大多都是免费的，整体部署的流程也是相对简单，选择一个顺眼，便于国内访问用即可，但是无论是哪个方案，都建议绑定一下自己的域名，一来是更便于记，二来也能便于国内访问。</p>



  
  

<blockquote class="alert-blockquote alert-todo">
  <p class="alert-heading">
    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16">
      <path d="M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"></path>
    </svg>
    <span>Todo</span>
  </p>
  <p>了解一下 Coolify，是否是类似一个公网转发平台的方案，将特定端口的服务使用 Coolify 转发到公网上，然后可以绑定自己的域名，这样的话也不失为一个好东西，我之前的服务也就都能部署出去了；</p>

</blockquote>
<p>最终选择的时候可以考虑以下都是谁在访问自己的博客，然后测一下对应地区平台访问的速度来做决定，国内的话 vercel 好像是被 DNS 污染了，如果要部署在 Vercel 上的的话，考虑在域名解析的地方更换为CF 的解析服务 <span class="sidenote-number"><small class="sidenote">原因：<a href="https://www.zhongfw.online/posts/%E3%80%90%E5%A4%9A%E5%9B%BE%E9%A2%84%E8%AD%A6%E3%80%91vercel%E9%83%A8%E7%BD%B2%E5%8F%8A%E5%9B%BD%E5%86%85%E8%AE%BF%E9%97%AE.html" target="_blank" rel="noopener">【多图预警】vercel部署及国内访问 | VuePress Theme Gungnir</a>

具体方案：<a href="https://www.didispace.com/article/richang/20230917-vercel-china-dns.html" target="_blank" rel="noopener">一招解决Vercel站点在国内无法访问的问题 | 程序猿DD</a>
 | <a href="https://juejin.cn/post/7301193497247727652" target="_blank" rel="noopener">如何在国内访问vercel部署应用？我个人觉得vercel是做前端的大家都应该去了解并且掌握的一个非常方便的部署工具，能 - 掘金</a>
  ；</small></span></p>
<h2 id="直接使用-public-文件夹进行部署">直接使用 Public 文件夹进行部署</h2>
<p>作为静态网页生成器，hugo 通过部署模式生成的 <code>public</code> 文件夹可以很轻松的在包括 <a href="https://docs.github.com/zh/pages/quickstart" target="_blank" rel="noopener">Github pages</a>
 和 <a href="https://vercel.com/" target="_blank" rel="noopener">Vercel</a>
 等第三方平台上的各个托管平台进行部署，部署起来相当简单，只需要将 Publish 文件夹推到github 上，后面的都比较简单了</p>
<ul>
<li>Github Page 直接在Setting-Pages 中设置选择源 Branch 即可，不需手动去写Github Action；</li>
<li>Vercel, Netfily 也是直接绑定对应的Github 仓库的指定分支即可，framework 选择Other；</li>
</ul>
<p>且均能根据 Publish 的变更对网页重新构建，这里就不再赘述。</p>
<h2 id="基于源码直接部署">基于源码直接部署</h2>
<p>基于源码部署主要是考虑到同时将博文本身推送上去，一是使用 git 做版本管理，二是可以不再额外管理一个仓库；因此也可以采用此种方式；</p>
<p>但实际上如果要和本地的 Editor 如 Obsidian 做无缝集成的话，还是会需要一些额外的脚本去做处理，包括写完后自动更新 repo 和推送这些，后续如果笔者记得的话可能也会更新一下相应的脚本；</p>
<h3 id="部署到-github-page">部署到 Github Page</h3>
<p>参考 <a href="https://gohugo.io/hosting-and-deployment/hosting-on-github/" target="_blank" rel="noopener">hugo官方教程</a>
使用 Github Action 进行在线构建和实现 Github Page 的发布，修改其中自己需要进行构建的分支名称和部署命令等，然后直接 push 上去即可。</p>
<p>这里我对部署命令的修改部分如下：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>yaml</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">run</span><span class="p">:</span><span class="w"> </span><span class="p">|</span><span class="sd">
</span></span></span><span class="line"><span class="cl"><span class="sd">  hugo \
</span></span></span><span class="line"><span class="cl"><span class="sd">    --gc \
</span></span></span><span class="line"><span class="cl"><span class="sd">    --minify \
</span></span></span><span class="line"><span class="cl"><span class="sd">    --environment papermod \
</span></span></span><span class="line"><span class="cl"><span class="sd">    --baseURL &#34;${{ steps.pages.outputs.base_url }}/&#34;  </span><span class="w">  </span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>使用非 Master 分支进行构建可能会遇到以下的问题（build 成功，deploy 部分显示如下错误）</p>



  
  

<blockquote class="alert-blockquote alert-error">
  <p class="alert-heading">
    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16">
      <path d="M4.47.22A.749.749 0 0 1 5 0h6c.199 0 .389.079.53.22l4.25 4.25c.141.14.22.331.22.53v6a.749.749 0 0 1-.22.53l-4.25 4.25A.749.749 0 0 1 11 16H5a.749.749 0 0 1-.53-.22L.22 11.53A.749.749 0 0 1 0 11V5c0-.199.079-.389.22-.53Zm.84 1.28L1.5 5.31v5.38l3.81 3.81h5.38l3.81-3.81V5.31L10.69 1.5ZM8 4a.75.75 0 0 1 .75.75v3.5a.75.75 0 0 1-1.5 0v-3.5A.75.75 0 0 1 8 4Zm0 8a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"></path>
    </svg>
    <span>Error</span>
  </p>
  <p>Branch &ldquo;x&rdquo; is not allowed to deploy to github-pages due to environment protection rules.</p>

</blockquote>
<p>解决方案：<a href="https://github.com/orgs/community/discussions/39054" target="_blank" rel="noopener">Github community · Discussion #39054</a>
 ，Repo 的 Setting 中找到 Environments 中的 github-pages 项中的 <code>Deployment branches and tags</code> 新增自己想要部署的分支即可；</p>
<p>
<div class="post-img-view">
  <a data-fancybox="gallery" href="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241212011338.png">
    <img alt="image.png" loading="lazy" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241212011338.png"class="responsive-image" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241212011338.png" style="display: block; margin: 0 auto;"
      alt="image.png"  />
  </a>
</div>


<script>
  document.addEventListener("DOMContentLoaded", function() {
      var images = document.querySelectorAll(".responsive-image");
      var maxHeight = window.innerHeight / 2.5;
      images.forEach(function(image) {
          image.style.maxHeight = maxHeight + "px";
      });
  });
</script>
</p>



  
  

<blockquote class="alert-blockquote alert-error">
  <p class="alert-heading">
    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16">
      <path d="M4.47.22A.749.749 0 0 1 5 0h6c.199 0 .389.079.53.22l4.25 4.25c.141.14.22.331.22.53v6a.749.749 0 0 1-.22.53l-4.25 4.25A.749.749 0 0 1 11 16H5a.749.749 0 0 1-.53-.22L.22 11.53A.749.749 0 0 1 0 11V5c0-.199.079-.389.22-.53Zm.84 1.28L1.5 5.31v5.38l3.81 3.81h5.38l3.81-3.81V5.31L10.69 1.5ZM8 4a.75.75 0 0 1 .75.75v3.5a.75.75 0 0 1-1.5 0v-3.5A.75.75 0 0 1 8 4Zm0 8a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"></path>
    </svg>
    <span>Error</span>
  </p>
  <p>Static 中的资源加载出现 404，导致界面表现不合预期的情况</p>

</blockquote>
<p>此外，如果个人之前已经对其他的 GithubPage 绑定了域名（例如 <a href="http://aikenh.cn/" target="_blank" rel="noopener">http://aikenh.cn/</a>
 ），这样可能会导致由于网页部署在域名的子目录下( <a href="http://aikenh.cn/hugoblog/" target="_blank" rel="noopener">http://aikenh.cn/hugoblog/</a>
 )，导致一些资源的 url 绑定到域名上（资源被绑定到 <a href="http://aikenh.cn/" target="_blank" rel="noopener">http://aikenh.cn/</a>
 中导致 404 ），无法获取到，这里的解决方式是，通过绑定子域名/二级域名 或者新的域名。</p>
<p>这里简单讲一下子域名的添加 <span class="sidenote-number"><small class="sidenote"><a href="https://docs.github.com/en/pages/configuring-a-custom-domain-for-your-github-pages-site/managing-a-custom-domain-for-your-github-pages-site#configuring-a-subdomain" target="_blank" rel="noopener">Github Docs</a></small></span> ，首先在 Github-Repo-Setting-Pages 中设置 Custom domain 如下</p>
<p>
<div class="post-img-view">
  <a data-fancybox="gallery" href="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241212111721.png">
    <img alt="image.png" loading="lazy" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241212111721.png"class="responsive-image" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241212111721.png" style="display: block; margin: 0 auto;"
      alt="image.png"  />
  </a>
</div>


<script>
  document.addEventListener("DOMContentLoaded", function() {
      var images = document.querySelectorAll(".responsive-image");
      var maxHeight = window.innerHeight / 2.5;
      images.forEach(function(image) {
          image.style.maxHeight = maxHeight + "px";
      });
  });
</script>
</p>
<p>添加后去自己的域名控制台添加对应的 cname 子域名记录，然后稍后即可</p>
<p>
<div class="post-img-view">
  <a data-fancybox="gallery" href="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241212111655.png">
    <img alt="image.png" loading="lazy" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241212111655.png"class="responsive-image" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241212111655.png" style="display: block; margin: 0 auto;"
      alt="image.png"  />
  </a>
</div>


<script>
  document.addEventListener("DOMContentLoaded", function() {
      var images = document.querySelectorAll(".responsive-image");
      var maxHeight = window.innerHeight / 2.5;
      images.forEach(function(image) {
          image.style.maxHeight = maxHeight + "px";
      });
  });
</script>
</p>
<p>添加子域名解析后可能会发现反而 CSS 等样式表加载不出来的问题（上一步的时候没问题），这时候就要考虑是不是 BaseURL 忘记更新了；记得修改项目配置（非 GithubAction 配置）中自己的 baseURL 再推上去使其重新构建，避免存在部分解析问题即可；</p>
<h3 id="部署到其他-paas">部署到其他 PaaS</h3>



  
  

<blockquote class="alert-blockquote alert-error">
  <p class="alert-heading">
    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16">
      <path d="M4.47.22A.749.749 0 0 1 5 0h6c.199 0 .389.079.53.22l4.25 4.25c.141.14.22.331.22.53v6a.749.749 0 0 1-.22.53l-4.25 4.25A.749.749 0 0 1 11 16H5a.749.749 0 0 1-.53-.22L.22 11.53A.749.749 0 0 1 0 11V5c0-.199.079-.389.22-.53Zm.84 1.28L1.5 5.31v5.38l3.81 3.81h5.38l3.81-3.81V5.31L10.69 1.5ZM8 4a.75.75 0 0 1 .75.75v3.5a.75.75 0 0 1-1.5 0v-3.5A.75.75 0 0 1 8 4Zm0 8a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"></path>
    </svg>
    <span>Error</span>
  </p>
  <p>由于我们本地开发使用的 Git Submodule 中的地址通常是 git@github ,可能会导致第三方平台在拉取 Submodule 的时候出现一些权限错误导致拉取失败</p>

</blockquote>
<p>因此当我们部署 Netlify 之前可以按照下面的方式更新 Submodule 为 http 链接，首先更改 <code>.gitmodules</code> 中子模块的URL</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>ini</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ini" data-lang="ini"><span class="line"><span class="cl"><span class="k">[submodule &#34;themes/PaperMod&#34;]</span>
</span></span><span class="line"><span class="cl">  <span class="na">path</span> <span class="o">=</span> <span class="s">themes/PaperMod
</span></span></span><span class="line"><span class="cl"><span class="s">  url = https://github.com/AikenH/papermod-sidebar.git</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>然后执行下列命令来更新子模块的URL</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>bash</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git submodule sync
</span></span><span class="line"><span class="cl">git submodule update --init --recursive</span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>更新完以后将其推送到部署分支，例如 <code>netlify</code></p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>bash</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git checkout -b netlify
</span></span><span class="line"><span class="cl">git add . 
</span></span><span class="line"><span class="cl">git commit -m <span class="s2">&#34;[Conf] update submodule for third-party deploy&#34;</span>
</span></span><span class="line"><span class="cl">git push origin netlify:netlify</span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><h4 id="部署到-netlify">部署到 Netlify</h4>
<p><strong>做完上述 Submodule 的准备之后</strong>，在 Netlify 的dashboard 上导入Repo 进行发布：</p>
<ul>
<li>导入仓库，选择好发布的分支</li>
</ul>
<p>可以参考下列命令来设置自己的发布参数以及环境变量（hugo 版本）</p>
<p>
<div class="post-img-view">
  <a data-fancybox="gallery" href="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241212142429.png">
    <img alt="image.png" loading="lazy" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241212142429.png"class="responsive-image" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241212142429.png" style="display: block; margin: 0 auto;"
      alt="image.png"  />
  </a>
</div>


<script>
  document.addEventListener("DOMContentLoaded", function() {
      var images = document.querySelectorAll(".responsive-image");
      var maxHeight = window.innerHeight / 2.5;
      images.forEach(function(image) {
          image.style.maxHeight = maxHeight + "px";
      });
  });
</script>
</p>
<p>环境变量的Key-Value 分别为：HUGO_VERSION 还有你本地的 hugo 版本，可以通过下列命令获取</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>bash</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">hugo version</span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>域名绑定：主要是参考官方指引，将需要的域名填入后，按照如下指引，在购买域名处添加CName 即可；</p>
<p>
<div class="post-img-view">
  <a data-fancybox="gallery" href="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241212171616.png">
    <img alt="image.png" loading="lazy" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241212171616.png"class="responsive-image" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241212171616.png" style="display: block; margin: 0 auto;"
      alt="image.png"  />
  </a>
</div>


<script>
  document.addEventListener("DOMContentLoaded", function() {
      var images = document.querySelectorAll(".responsive-image");
      var maxHeight = window.innerHeight / 2.5;
      images.forEach(function(image) {
          image.style.maxHeight = maxHeight + "px";
      });
  });
</script>
</p>
<p>随后记得更新网站的 BaseURL 以便网站正常工作;</p>
<h4 id="部署到-vercel">部署到 Vercel</h4>
<p><strong>做完上述 Submodule 的准备之后</strong>，同样在 Vercel 处的设置也是比较简单的，导入指定的仓库后，将模版指定为Hugo，并修改部署配置如下：</p>
<p>
<div class="post-img-view">
  <a data-fancybox="gallery" href="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241212144416.png">
    <img alt="image.png" loading="lazy" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241212144416.png"class="responsive-image" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241212144416.png" style="display: block; margin: 0 auto;"
      alt="image.png"  />
  </a>
</div>


<script>
  document.addEventListener("DOMContentLoaded", function() {
      var images = document.querySelectorAll(".responsive-image");
      var maxHeight = window.innerHeight / 2.5;
      images.forEach(function(image) {
          image.style.maxHeight = maxHeight + "px";
      });
  });
</script>
</p>
<p>同样添加环境变量：</p>
<p>
<div class="post-img-view">
  <a data-fancybox="gallery" href="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241212144450.png">
    <img alt="image.png" loading="lazy" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241212144450.png"class="responsive-image" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241212144450.png" style="display: block; margin: 0 auto;"
      alt="image.png"  />
  </a>
</div>


<script>
  document.addEventListener("DOMContentLoaded", function() {
      var images = document.querySelectorAll(".responsive-image");
      var maxHeight = window.innerHeight / 2.5;
      images.forEach(function(image) {
          image.style.maxHeight = maxHeight + "px";
      });
  });
</script>
</p>
<p>但是 Vercel 中指定分支的方式相对较麻烦一些，在部署后，进入project 的dashboard 中，选择Setting</p>
<p>
<div class="post-img-view">
  <a data-fancybox="gallery" href="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241212144613.png">
    <img alt="image.png" loading="lazy" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241212144613.png"class="responsive-image" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241212144613.png" style="display: block; margin: 0 auto;"
      alt="image.png"  />
  </a>
</div>


<script>
  document.addEventListener("DOMContentLoaded", function() {
      var images = document.querySelectorAll(".responsive-image");
      var maxHeight = window.innerHeight / 2.5;
      images.forEach(function(image) {
          image.style.maxHeight = maxHeight + "px";
      });
  });
</script>
</p>
<p>其中的 Git -&gt; Production 跳转到指定页面去设置分支，设置完记得选择保存，同时下面有个环境变量也可以在设置一次。</p>
<p>
<div class="post-img-view">
  <a data-fancybox="gallery" href="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241212144707.png">
    <img alt="image.png" loading="lazy" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241212144707.png"class="responsive-image" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241212144707.png" style="display: block; margin: 0 auto;"
      alt="image.png"  />
  </a>
</div>


<script>
  document.addEventListener("DOMContentLoaded", function() {
      var images = document.querySelectorAll(".responsive-image");
      var maxHeight = window.innerHeight / 2.5;
      images.forEach(function(image) {
          image.style.maxHeight = maxHeight + "px";
      });
  });
</script>
</p>
<p>
<div class="post-img-view">
  <a data-fancybox="gallery" href="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241212144752.png">
    <img alt="image.png" loading="lazy" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241212144752.png"class="responsive-image" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241212144752.png" style="display: block; margin: 0 auto;"
      alt="image.png"  />
  </a>
</div>


<script>
  document.addEventListener("DOMContentLoaded", function() {
      var images = document.querySelectorAll(".responsive-image");
      var maxHeight = window.innerHeight / 2.5;
      images.forEach(function(image) {
          image.style.maxHeight = maxHeight + "px";
      });
  });
</script>
</p>
<p>到此为止的话其他分支上的提交也会导致触发build，为此我们还需要进一步设置，在刚刚 Git 页面的最底下，选择 only build production 即可，这里参考 <span class="sidenote-number"><small class="sidenote"><a href="https://oragekk.me/tutorial/CI_CD/vercel-deploy.html#_2-%E6%AD%A5%E9%AA%A4" target="_blank" rel="noopener">oragekk</a></small></span> ：</p>
<p>
<div class="post-img-view">
  <a data-fancybox="gallery" href="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241212173248.png">
    <img alt="image.png" loading="lazy" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241212173248.png"class="responsive-image" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241212173248.png" style="display: block; margin: 0 auto;"
      alt="image.png"  />
  </a>
</div>


<script>
  document.addEventListener("DOMContentLoaded", function() {
      var images = document.querySelectorAll(".responsive-image");
      var maxHeight = window.innerHeight / 2.5;
      images.forEach(function(image) {
          image.style.maxHeight = maxHeight + "px";
      });
  });
</script>
</p>
<p>后面再触发一次 Deploy 任务以后就可以看到分支切换到指定的分支即可</p>
<p>
<div class="post-img-view">
  <a data-fancybox="gallery" href="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241212144841.png">
    <img alt="image.png" loading="lazy" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241212144841.png"class="responsive-image" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241212144841.png" style="display: block; margin: 0 auto;"
      alt="image.png"  />
  </a>
</div>


<script>
  document.addEventListener("DOMContentLoaded", function() {
      var images = document.querySelectorAll(".responsive-image");
      var maxHeight = window.innerHeight / 2.5;
      images.forEach(function(image) {
          image.style.maxHeight = maxHeight + "px";
      });
  });
</script>
</p>
<p>添加域名：待补充；</p>
<h2 id="troubleshooting-问题解决">TroubleShooting 问题解决</h2>
<h3 id="部署时-css-样式不显示问题">部署时 CSS 样式不显示问题</h3>
<p>hugo 部署时遇到像 CSS 和 JS 或者图像等不显示的问题，可能有以下的两种原因：</p>
<p>一、假如图像, JS, CSS 都不显示，可以通过浏览器的开发者模式中的网络选项等去检查资源的对应地址是否是正确的，然后检查 hugo.yaml 中的 <code>base_url</code> 是否设置正确；</p>
<p>二、假如仅 CSS 不显示，只显示图像和文字，可以打开开发者模式中的控制台，看是否有如下报错：</p>



  
  

<blockquote class="alert-blockquote alert-error">
  <p class="alert-heading">
    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16">
      <path d="M4.47.22A.749.749 0 0 1 5 0h6c.199 0 .389.079.53.22l4.25 4.25c.141.14.22.331.22.53v6a.749.749 0 0 1-.22.53l-4.25 4.25A.749.749 0 0 1 11 16H5a.749.749 0 0 1-.53-.22L.22 11.53A.749.749 0 0 1 0 11V5c0-.199.079-.389.22-.53Zm.84 1.28L1.5 5.31v5.38l3.81 3.81h5.38l3.81-3.81V5.31L10.69 1.5ZM8 4a.75.75 0 0 1 .75.75v3.5a.75.75 0 0 1-1.5 0v-3.5A.75.75 0 0 1 8 4Zm0 8a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"></path>
    </svg>
    <span>Error</span>
  </p>
  <p>Failed to find a valid digest in the &lsquo;integrity&rsquo; attribute for resource</p>

</blockquote>
<p>如果是如下报错的话，可能是由于 minify 生成静态网页时，去掉了 html,js,css 等文件的部分空格和格式，来缩小文件的体积，但是修改后会导致文件校验失败，从而阻止加载，因此就会有两种解决方式：</p>
<p><strong>hugo 设置中关闭校验</strong> <span class="sidenote-number"><small class="sidenote"><a href="https://spartanmans.github.io/posts/hugobug/" target="_blank" rel="noopener">bj-Space</a></small></span> : 在 hugo.yaml 中添加，（使用toml 配置的情自行修改对应选项）</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>yaml</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">params</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="nt">assets</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">		</span><span class="nt">disableFingerprinting</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p><strong>关闭 minify 选项</strong> <span class="sidenote-number"><small class="sidenote"><a href="https://www.333rd.net/zh/posts/tech/hugo%E4%B8%A2%E5%A4%B1css%E5%AF%BC%E8%87%B4%E6%98%BE%E7%A4%BA%E5%BC%82%E5%B8%B8%E9%97%AE%E9%A2%98%E8%A7%A3%E5%86%B3/" target="_blank" rel="noopener">3rd&rsquo;s blog</a></small></span></p>
<p>还有一些其他的可能问题：http 和 https 混用</p>
<h2 id="fi">FI</h2>
]]></content:encoded>
    </item>
    <item>
      <title>利用ShortCode增加Hugo的样式支持</title>
      <link>https://aikenh.cn/posts/%E5%88%A9%E7%94%A8shortcode%E5%A2%9E%E5%8A%A0hugo%E7%9A%84%E6%A0%B7%E5%BC%8F%E6%94%AF%E6%8C%81/</link>
      <pubDate>Wed, 18 Dec 2024 17:15:37 +0000</pubDate>
      <guid>https://aikenh.cn/posts/%E5%88%A9%E7%94%A8shortcode%E5%A2%9E%E5%8A%A0hugo%E7%9A%84%E6%A0%B7%E5%BC%8F%E6%94%AF%E6%8C%81/</guid>
      <description>通过Hugo的短代码功能，拓展主题的功能，使博客能够支持更多的样式</description>
      <content:encoded><![CDATA[


  
  

<blockquote class="alert-blockquote alert-important">
  <p class="alert-heading">
    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16">
      <path d="M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v9.5A1.75 1.75 0 0 1 14.25 13H8.06l-2.573 2.573A1.458 1.458 0 0 1 3 14.543V13H1.75A1.75 1.75 0 0 1 0 11.25Zm1.75-.25a.25.25 0 0 0-.25.25v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25Zm7 2.25v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 9a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path>
    </svg>
    <span>Important</span>
  </p>
  <p>本文为了避免 hugo 直接将 shortcode 渲染出来，在所有的 {{ 和 &lt; 或 &gt;，% 之间添加空格，具体使用的时候记得去掉。</p>

</blockquote>
<h2 id="whats-shortcode-in-hugo-mean-啥是简码">What&rsquo;s ShortCode in Hugo Mean 啥是简码</h2>
<p>Hugo 中的短代码 <span class="sidenote-number"><small class="sidenote">后续用简码来表示</small></span> 可以理解成一种使用固定方式引用的 Template(或者说 Alias)，通过使用<strong>预先定义模版</strong>，避免在 markdown 中直接添加大量 html 或者 go templates 代码</p>
<p>通常通过 <code>{{ &lt; shortcode &gt; }}</code> 的方式来调用模版，定义的简码可以为如下的三种形式：</p>
<table>
  <thead>
      <tr>
          <th style="text-align: center">type</th>
          <th>example</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td style="text-align: center">Single-Word ShortCode</td>
          <td><code>{{ &lt; year &gt; }}</code></td>
      </tr>
      <tr>
          <td style="text-align: center">With-Params ShortCode</td>
          <td><code>{{ &lt; img src=&quot;URL&quot; title=&quot;Title&quot; &gt; }}</code></td>
      </tr>
      <tr>
          <td style="text-align: center">Paired ShortCode</td>
          <td><code>{{ &lt; shortcode &gt; }} content {{ &lt; shortcode &gt; }}</code></td>
      </tr>
  </tbody>
</table>
<p>来支持不同类型的模版代码，将一些比较复杂的 html 代码通过简码的形式嵌入，可以使得我们的静态博客支持更多的拓展样式；<a href="https://gohugo.io/content-management/shortcodes/" target="_blank" rel="noopener">官方文档</a>
</p>
<h3 id="benefits-and-limitation-利弊分析">Benefits and Limitation 利弊分析</h3>



  
  

<blockquote class="alert-blockquote alert-summary">
  <p class="alert-heading">
    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16">
      <path d="M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"></path>
    </svg>
    <span>Summary</span>
  </p>
  <p>简码存在什么好处和弊端，应该在什么时候使用简码，什么情况下定义为简码，什么时候将其定义为内置的渲染类型；</p>

</blockquote>
<p>正如上文所说，ShortCode 其实本质上可以理解为 Hugo 内置的一种模版功能，通过<strong>模版</strong>用于在 Markdown 中快速的调用<strong>额外</strong>的样式，因此优势也就显而易见：</p>
<ul>
<li>模版的角度：简化书写，具备良好的可重用性，统一管理；</li>
<li>拓展的角度：丰富样式，增强功能</li>
</ul>
<p>例如我们可以使用简码为文章添加 sidenote(边注)，可以让文章的主体更加简洁，更为美观，效果如下：</p>
<p>
<div class="post-img-view">
  <a data-fancybox="gallery" href="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241216150934.png">
    <img alt="image.png" loading="lazy" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241216150934.png"class="responsive-image" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241216150934.png" style="display: block; margin: 0 auto;"
      alt="image.png"  />
  </a>
</div>


<script>
  document.addEventListener("DOMContentLoaded", function() {
      var images = document.querySelectorAll(".responsive-image");
      var maxHeight = window.innerHeight / 2.5;
      images.forEach(function(image) {
          image.style.maxHeight = maxHeight + "px";
      });
  });
</script>
</p>
<p>虽然使用简码确实能够使得 blog 更加的美观，拓展一些额外的功能，但是相应的会使得本地软件编写时的<strong>所见即所得的特性被破坏</strong>，同时对文档或者说<strong>博客平台迁移</strong>的时候也会增加一些额外的工作量对文档进行处理；</p>
<blockquote>
<p>当然这里也可以通过对一些开源的笔记软件进行适配去维持所见即所得的效果，但是工作量的增加是实打实的；</p>
</blockquote>
<p>为此，退而求其次的，为了保持原 markdown 的可迁移的特性不要被严重破坏，同时能够较好的维持所见即所得的可以考虑使用一下的流程去处理<small> 笔者使用 Obsidian 编写文档</small>：</p>
<pre class="mermaid">---
title: 文档处理流程
---
flowchart LR
	subgraph source
		MD[&#34;Md + ez-HTML&#34;]
		Obs[&#34;Obsidian&#34;] --- MD
	end
	subgraph Publish
		Pub[&#34;Publish Dir&#34;]
		Hugo[&#34;Hugo&#34;] --- Pub
	end
	source --Cond--&gt; Scr[&#34;Convert Md&#34;]
	Scr --&gt; Publish
	Publish --&gt; Tri[&#34;Tiggle Publish&#34;]	
  </pre>
  <p>在源文件中尽可能的使用原生的 markdown 和一些简单的 html 去编写，然后触发转换脚本之后，根据各种不同的条件（例如发布平台）去进行 markdown 的转换（html 转换为短代码，或删除多余部分）并发布到对应的路径上去触发发布任务；</p>
<p>以边注为例，这里可以使用 <code>&lt;small&gt; content &lt;small&gt;</code> 在 Obsidian 中显示其脚注的特性，然后当发布到 Hugo 的时候，利用脚本将 <code>small</code> 转换为 <code>sidenote</code> 的形式即可，这里替换起来还是很简单的；</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>python</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">re</span>
</span></span><span class="line"><span class="cl"><span class="n">content</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="sa">r</span><span class="s1">&#39;&lt;small&gt;&#39;</span><span class="p">,</span> <span class="s1">&#39;&lt;sidenote&gt;&#39;</span><span class="p">,</span> <span class="n">content</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">content</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="sa">r</span><span class="s1">&#39;&lt;/small&gt;&#39;</span><span class="p">,</span> <span class="s1">&#39;&lt;/sidenote&gt;&#39;</span><span class="p">,</span> <span class="n">content</span><span class="p">)</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>整体而言，笔者认为尽量少用那些比较特异的样式来破坏 markdown 的所见即所得的特性，但是可以通过这这种简单的 html 格式来保持的倒是无所谓，像是一些时间轴之类的，或者一些比较复杂的样式，建议还是少用，或者在一些场景将其转换为图片嵌入，主要的部分还是要让博客回归内容本身；</p>
<h3 id="some-default-shortcode-默认简码">Some Default ShortCode 默认简码</h3>
<p>hugo 本身支持了部分的 ShortCode，这里简单列举记录，便于需要的时候调用，同时避免重复造轮子：</p>
<table>
  <thead>
      <tr>
          <th style="text-align: center">Name</th>
          <th>Example</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td style="text-align: center">Gist</td>
          <td><a href="https://gist.github.com/spf13/7896402" target="_blank" rel="noopener"><code>{{ &lt; gist spf13 7896402 &gt; }}</code></a>
</td>
      </tr>
      <tr>
          <td style="text-align: center">Ins</td>
          <td><a href="https://www.instagram.com/p/CxOWiQNP2MO/" target="_blank" rel="noopener"><code>{{ &lt; instagram CxOWiQNP2MO &gt; }}</code></a>
</td>
      </tr>
      <tr>
          <td style="text-align: center">Twitter</td>
          <td><a href="https://x.com/SanDiegoZoo/status/1453110110599868418" target="_blank" rel="noopener"><code>{{ &lt; twitter user=&quot;SanDiegoZoo&quot; id=&quot;1453110110599868418&quot; &gt; }}</code></a>
</td>
      </tr>
      <tr>
          <td style="text-align: center">Youtube</td>
          <td><a href="https://www.youtube.com/watch?v=0RKpf3rK57I" target="_blank" rel="noopener"><code>{{ &lt; youtube 0RKpf3rK57I &gt; }}</code></a>
</td>
      </tr>
  </tbody>
</table>
<p>这些具体的参数或者更多默认的一些 Shortcode 可以去<a href="https://gohugo.io/content-management/shortcodes/" target="_blank" rel="noopener">官网</a>
 查阅，这里就不在多说。</p>
<h3 id="how-to-design-a-shortcode-编写简码">How To Design a ShortCode 编写简码</h3>
<p>主要的流程如下，如果需要自己定义，建议还是去<a href="https://gohugo.io/templates/shortcode/" target="_blank" rel="noopener">官网</a>
查看详细的文档、参数和优先级说明。</p>
<p>一、创建简码文件</p>
<p>在 Hugo 项目的 <code>layout/shortcodes</code> 中新建 <code>【keyword】.html</code> 文件，这里文件名的 keyword 会成为后续调用简码时的关键词；</p>
<p>二、编写简码文件</p>
<p>使用 Go template 和 html 编写你所需要的拓展样式，并通过 Go template 获取调用简码时传入的<strong>内容和参数</strong>进行处理和渲染；</p>
<p>下面简单列一些获取采位置参数，设定参数的写法：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>go</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="p">{{</span> <span class="p">.</span><span class="nx">Get</span> <span class="s">&#34;class&#34;</span> <span class="p">}}</span>
</span></span><span class="line"><span class="cl"><span class="p">{{</span> <span class="p">.</span><span class="nx">Get</span> <span class="mi">0</span> <span class="p">}}</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>获取 Paired 中填写的内容则可以使用 <code>.Inner</code> 去获取，如下：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>go</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="p">{{</span> <span class="k">if</span> <span class="nx">strings</span><span class="p">.</span><span class="nx">ContainsNonSpace</span> <span class="p">.</span><span class="nx">Inner</span> <span class="p">}}</span>
</span></span><span class="line"><span class="cl">  <span class="nx">Inner</span> <span class="nx">is</span> <span class="nx">not</span> <span class="nx">empty</span>
</span></span><span class="line"><span class="cl"><span class="p">{{</span> <span class="nx">end</span> <span class="p">}}</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>更多参数和内置变量和方法请参见官网文档和说明。</p>
<p>三、调用简码</p>
<p>使用 <code>{{ &lt; keyword &gt; }}</code> 或者 <code>{{ % keyword % }}</code> 的方式，或是上述提及的 paired 的方式进行调用。</p>
<h2 id="what-i-support-in-my-website">What I Support In My Website</h2>



  
  

<blockquote class="alert-blockquote alert-summary">
  <p class="alert-heading">
    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16">
      <path d="M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"></path>
    </svg>
    <span>Summary</span>
  </p>
  <p>本章节主要分享&amp;感谢一些本博客中使用的短代码的来源，并简单介绍部分我修改或者编写的短代码，包括加密还有边注的短代码；</p>

</blockquote>
<p>主题中引入的大部分 Shortcode 来自以下几位博主，这里简单整理了一下，这里就不再重复，如果需要的话可以转到博主的文章中查看，感谢几位博主的分享!!：</p>
<table>
  <thead>
      <tr>
          <th style="text-align: center">author</th>
          <th>shortcodes</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td style="text-align: center"><a href="https://guanqr.com/tech/website/hugo-shortcodes-customization/" target="_blank" rel="noopener">荷载独彷徨</a>
</td>
          <td>文字对齐、github 卡片、notice(两种)、quote(两种)</td>
      </tr>
      <tr>
          <td style="text-align: center"><a href="https://www.xalaok.top/post/hugo-shortcodes/" target="_blank" rel="noopener">Naive koala</a>
</td>
          <td>Notice、隐藏内容、聊天气泡、时间轴、友联、块引用、bilibili、腾讯视频</td>
      </tr>
      <tr>
          <td style="text-align: center"><a href="https://blog.imych.one/hugo-shortcodes-iframe/" target="_blank" rel="noopener">YC Photography</a>
</td>
          <td>iframe</td>
      </tr>
      <tr>
          <td style="text-align: center"><a href="https://kdjlyy.github.io/posts/site/hugo_shortcodes/" target="_blank" rel="noopener">向着悠远的苍穹</a>
</td>
          <td>PPT、PDF、博客内链、代码折叠</td>
      </tr>
  </tbody>
</table>
<blockquote>
<p>部分博主使用的是 Scss，使用的时候可以去网上搜索一下 Scss 转 css 的去转换成自己熟悉的格式，再根据自己主题的配色和习惯去简单调整一下 css 样式即可。</p>
</blockquote>
<p>接下来介绍一下自己修改或者编写的一些简码，这里也分享出来供大家参考：</p>
<h3 id="sidenote-边注简码">Sidenote 边注简码</h3>
<p>笔者希望博客能够充分利用视区的宽度，因此将 Papermod 的 Nav 和 Toc 都改到了侧边，但是通常使用宽屏阅读的时候，感觉还是有一部分空间没有被利用，决定通过简码支持 MarginNote <span class="sidenote-number"><small class="sidenote">这里受<a href="https://yunpengtai.top/posts/hello-world/" target="_blank" rel="noopener">台运鹏</a>
 该博客的启发，感谢其分享</small></span></p>
<p>最终参考 KF <span class="sidenote-number"><small class="sidenote"><a href="https://kennethfriedman.org/thoughts/2019/marginal-notes/" target="_blank" rel="noopener">KF: Marginal Notes</a></small></span>  和 a Scripter <span class="sidenote-number"><small class="sidenote"><a href="https://scripter.co/sidenotes-using-only-css/" target="_blank" rel="noopener">Sidenotes using only CSS ❚ A Scripter&rsquo;s Notes</a></small></span>  的实现，编写 hugo 的 shortcode，其核心就在于</p>
<ul>
<li>使用 relative 和 float 进行 postion 控制</li>
<li>然后通过-值的 margin 来校准位置</li>
<li>考虑响应式的要素再去启用侧边注释，否则就嵌入正文中</li>
<li>使用 counter 做脚注</li>
</ul>
<p>最终 shortcode 在本博客中呈现的效果和对应的 html 和 css 如下：</p>
<p>
<div class="post-img-view">
  <a data-fancybox="gallery" href="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241217154653.png">
    <img alt="image.png" loading="lazy" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241217154653.png"class="responsive-image" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241217154653.png" style="display: block; margin: 0 auto;"
      alt="image.png"  />
  </a>
</div>


<script>
  document.addEventListener("DOMContentLoaded", function() {
      var images = document.querySelectorAll(".responsive-image");
      var maxHeight = window.innerHeight / 2.5;
      images.forEach(function(image) {
          image.style.maxHeight = maxHeight + "px";
      });
  });
</script>
</p>
<p>
<div class="post-img-view">
  <a data-fancybox="gallery" href="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241217154717.png">
    <img alt="image.png" loading="lazy" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241217154717.png"class="responsive-image" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241217154717.png" style="display: block; margin: 0 auto;"
      alt="image.png"  />
  </a>
</div>


<script>
  document.addEventListener("DOMContentLoaded", function() {
      var images = document.querySelectorAll(".responsive-image");
      var maxHeight = window.innerHeight / 2.5;
      images.forEach(function(image) {
          image.style.maxHeight = maxHeight + "px";
      });
  });
</script>
</p>
<p>
<div class="post-img-view">
  <a data-fancybox="gallery" href="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241217154801.png">
    <img alt="image.png" loading="lazy" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241217154801.png"class="responsive-image" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241217154801.png" style="display: block; margin: 0 auto;"
      alt="image.png"  />
  </a>
</div>


<script>
  document.addEventListener("DOMContentLoaded", function() {
      var images = document.querySelectorAll(".responsive-image");
      var maxHeight = window.innerHeight / 2.5;
      images.forEach(function(image) {
          image.style.maxHeight = maxHeight + "px";
      });
  });
</script>
</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>html</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">span</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;sidenote-number&#34;</span><span class="p">&gt;&lt;</span><span class="nt">small</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;sidenote&#34;</span><span class="p">&gt;</span>{{ .Inner | markdownify }}<span class="p">&lt;/</span><span class="nt">small</span><span class="p">&gt;&lt;/</span><span class="nt">span</span><span class="p">&gt;</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>css</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="p">.</span><span class="nc">sidenote</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">font-size</span><span class="p">:</span> <span class="mi">80</span><span class="kt">%</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">position</span><span class="p">:</span> <span class="kc">relative</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="c">/* Wide viewport */</span>
</span></span><span class="line"><span class="cl"><span class="p">@</span><span class="k">media</span> <span class="o">(</span><span class="nt">min-width</span><span class="o">:</span> <span class="nt">1500px</span><span class="o">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="p">.</span><span class="nc">sidenote</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">float</span><span class="p">:</span> <span class="kc">left</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">clear</span><span class="p">:</span> <span class="kc">left</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">margin-left</span><span class="p">:</span> <span class="mi">-16</span><span class="kt">vw</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">text-align</span><span class="p">:</span> <span class="kc">right</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">top</span><span class="p">:</span> <span class="mi">0</span><span class="kt">rem</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">width</span><span class="p">:</span> <span class="mi">13</span><span class="kt">vw</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">margin-top</span><span class="p">:</span> <span class="mi">1</span><span class="kt">rem</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="k">border-top</span><span class="p">:</span> <span class="mi">2</span><span class="kt">px</span> <span class="kc">solid</span> <span class="nb">rgb</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">.</span><span class="nc">dark</span> <span class="p">.</span><span class="nc">sidenote</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">border-top</span><span class="p">:</span> <span class="mi">2</span><span class="kt">px</span> <span class="kc">solid</span> <span class="nb">rgb</span><span class="p">(</span><span class="mi">255</span><span class="p">,</span> <span class="mi">98</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c">/* Sidenote counter */</span>
</span></span><span class="line"><span class="cl"><span class="nt">main</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">counter-reset</span><span class="p">:</span> <span class="n">sidenote-counter</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">sidenote-number</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">counter-increment</span><span class="p">:</span> <span class="n">sidenote-counter</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="c">/* Counter before the sidenote in the margin. */</span>
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">sidenote</span><span class="p">::</span><span class="nd">before</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">content</span><span class="p">:</span> <span class="nb">counter</span><span class="p">(</span><span class="n">sidenote</span><span class="o">-</span><span class="n">counter</span><span class="p">)</span> <span class="s2">&#34;.&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">position</span><span class="p">:</span> <span class="kc">relative</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">vertical-align</span><span class="p">:</span> <span class="kc">baseline</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">font-size</span><span class="p">:</span> <span class="mf">0.9</span><span class="kt">em</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">font-weight</span><span class="p">:</span> <span class="kc">bold</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="c">/* Counter in the main body. */</span>
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">sidenote-number</span><span class="p">::</span><span class="nd">after</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">content</span><span class="p">:</span> <span class="nb">counter</span><span class="p">(</span><span class="n">sidenote</span><span class="o">-</span><span class="n">counter</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="k">vertical-align</span><span class="p">:</span> <span class="kc">super</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">font-size</span><span class="p">:</span> <span class="mf">0.7</span><span class="kt">em</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">font-weight</span><span class="p">:</span> <span class="kc">bold</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">margin-right</span><span class="p">:</span> <span class="mf">0.5</span><span class="kt">rem</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">@</span><span class="k">media</span> <span class="o">(</span><span class="nt">min-width</span><span class="o">:</span> <span class="nt">1400px</span><span class="o">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="c">/* Highlight the sidenote when mouse hovers on the sidenote number in body. */</span>
</span></span><span class="line"><span class="cl">  <span class="p">.</span><span class="nc">sidenote-number</span><span class="p">:</span><span class="nd">hover</span> <span class="p">.</span><span class="nc">sidenote</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kp">-webkit-</span><span class="n">backdrop-filter</span><span class="p">:</span> <span class="nb">blur</span><span class="p">(</span><span class="mi">30</span><span class="kt">px</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">backdrop-filter</span><span class="p">:</span> <span class="nb">blur</span><span class="p">(</span><span class="mi">30</span><span class="kt">px</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="k">background-color</span><span class="p">:</span> <span class="mh">#ffffff</span><span class="mi">7</span><span class="n">a</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">border-radius</span><span class="p">:</span> <span class="mi">5</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">font-weight</span><span class="p">:</span> <span class="kc">bold</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">padding</span><span class="p">:</span> <span class="mi">5</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">box-shadow</span><span class="p">:</span> <span class="mi">5</span><span class="kt">px</span> <span class="mi">5</span><span class="kt">px</span> <span class="mi">10</span><span class="kt">px</span> <span class="nb">rgb</span><span class="p">(</span><span class="mi">25</span><span class="p">,</span> <span class="mi">25</span><span class="p">,</span> <span class="mi">25</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">                <span class="mi">-5</span><span class="kt">px</span> <span class="mi">-5</span><span class="kt">px</span> <span class="mi">10</span><span class="kt">px</span> <span class="nb">rgb</span><span class="p">(</span><span class="mi">60</span><span class="p">,</span> <span class="mi">60</span><span class="p">,</span> <span class="mi">60</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">.</span><span class="nc">dark</span> <span class="p">.</span><span class="nc">sidenote-number</span><span class="p">:</span><span class="nd">hover</span> <span class="p">.</span><span class="nc">sidenote</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">background-color</span><span class="p">:</span> <span class="nb">rgba</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mf">0.5</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">dark</span> <span class="p">.</span><span class="nc">sidenote-number</span> <span class="nt">small</span><span class="p">.</span><span class="nc">sidenote</span><span class="o">,</span>
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">dark</span> <span class="p">.</span><span class="nc">sidenote-number</span> <span class="nt">small</span><span class="p">.</span><span class="nc">sidenote</span> <span class="nt">a</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">color</span><span class="p">:</span> <span class="nb">rgb</span><span class="p">(</span><span class="mi">255</span><span class="p">,</span> <span class="mi">179</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">sidenote-number</span> <span class="o">+</span> <span class="nt">p</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">display</span><span class="p">:</span> <span class="kc">inline</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nt">p</span><span class="p">:</span><span class="nd">has</span><span class="o">(+</span> <span class="p">.</span><span class="nc">sidenote-number</span><span class="o">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">display</span><span class="p">:</span> <span class="kc">inline</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>也遇到了一些小问题：</p>



  
  

<blockquote class="alert-blockquote alert-error">
  <p class="alert-heading">
    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16">
      <path d="M4.47.22A.749.749 0 0 1 5 0h6c.199 0 .389.079.53.22l4.25 4.25c.141.14.22.331.22.53v6a.749.749 0 0 1-.22.53l-4.25 4.25A.749.749 0 0 1 11 16H5a.749.749 0 0 1-.53-.22L.22 11.53A.749.749 0 0 1 0 11V5c0-.199.079-.389.22-.53Zm.84 1.28L1.5 5.31v5.38l3.81 3.81h5.38l3.81-3.81V5.31L10.69 1.5ZM8 4a.75.75 0 0 1 .75.75v3.5a.75.75 0 0 1-1.5 0v-3.5A.75.75 0 0 1 8 4Zm0 8a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"></path>
    </svg>
    <span>Error</span>
  </p>
  <p>counter 计数混乱</p>

</blockquote>
<p>一开始使用 body 去做 counter-reset ，后续改为 main 去做 counter-reset 后就好，没有找到中间哪里触发了 body 的 reset，如果有了解的希望指点一二，感恩；</p>
<p>还有一些其他可以借鉴的 MarginNote 的实现如下，感兴趣的大家可以去看看：</p>
<ul>
<li><a href="https://fanrongbin.com/blog-theme-changed/" target="_blank" rel="noopener">Rongbin&rsquo;s Blog</a>
</li>
<li><a href="https://dongheenam.info/posts/hugo-sidenotes/" target="_blank" rel="noopener">Sidenotes in Hugo | dongheenam.info</a>
</li>
</ul>
<h3 id="encrypt-加密简码实践">Encrypt 加密简码实践</h3>
<p>由于博客难免会写一些只想自己看或者说，只想和朋友分享的内容，因此在之前的 hexo 中支持了加密的功能，于是在 hugo 上找替代品的时候，目前发现的都是需要外部的代码|二进制执行，或是使用 submodule，这里为了更简单一些就尝试将其改为简码的模式；</p>
<p>参考 <a href="https://github.com/Li4n0/hugo_encryptor/tree/master?tab=readme-ov-file" target="_blank" rel="noopener">Li4n0的hugo_encryptor</a>
 借助 Gpt4o 将其改为纯 html+js 的形式，由此实现利用简码对文章加密，效果如下：</p>
<p>
<div class="post-img-view">
  <a data-fancybox="gallery" href="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241217111719.png">
    <img alt="image.png" loading="lazy" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241217111719.png"class="responsive-image" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241217111719.png" style="display: block; margin: 0 auto;"
      alt="image.png"  />
  </a>
</div>


<script>
  document.addEventListener("DOMContentLoaded", function() {
      var images = document.querySelectorAll(".responsive-image");
      var maxHeight = window.innerHeight / 2.5;
      images.forEach(function(image) {
          image.style.maxHeight = maxHeight + "px";
      });
  });
</script>
</p>
<p>
<div class="post-img-view">
  <a data-fancybox="gallery" href="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241217111733.png">
    <img alt="image.png" loading="lazy" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241217111733.png"class="responsive-image" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241217111733.png" style="display: block; margin: 0 auto;"
      alt="image.png"  />
  </a>
</div>


<script>
  document.addEventListener("DOMContentLoaded", function() {
      var images = document.querySelectorAll(".responsive-image");
      var maxHeight = window.innerHeight / 2.5;
      images.forEach(function(image) {
          image.style.maxHeight = maxHeight + "px";
      });
  });
</script>
</p>
<p>但是这个方法的加密实际上是一个<strong>伪加密</strong>，存在以下的问题：</p>
<ol>
<li>一篇文章仅能加密一次，否则会使得密码出错;</li>
<li>无法加密源文件，文章的内容仍能通过开发者模式中的源文件进行查看<strong>未加密的 html</strong>，只是无法直观的获取。</li>
</ol>
<blockquote>
<p>这是由于该脚本仅仅是对加载过程中的网页进行加密，但是对对应的 html 内容是没有加密的</p>
</blockquote>
<p>这是由于 hugo 静态站点生成的本质，如果需要完全的加密的话，可能还是要考虑外部对生成的 html 进行处理，或者看能不能想办法干预 hugo 本身生成静态文件的过程，这里由于笔者本身对相应的技术栈还不是特别熟悉，因此暂且搁置。</p>
<p>这里还尝试了 <a href="https://github.com/Li4n0/hugo_encryptor/tree/master?tab=readme-ov-file" target="_blank" rel="noopener">Li4n0的hugo_encryptor</a>
 和 <a href="https://github.com/hotjuicew/hugoArticleEncryptor/blob/master/README-zh_CN.md" target="_blank" rel="noopener">hugoArticleEncryptor</a>
 都会对我的主题样式产生严重的影响，导致无法使用，如果有需要彻底加密的还是建议去参考他们的实现；</p>
<p>这里分享一下笔者基于 Li4n0 将加密过程改到 shortcode 中的代码如下，：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>html</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">head</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="c">&lt;!-- Other head elements --&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">script</span> <span class="na">src</span><span class="o">=</span><span class="s">&#34;https://mirrors.sustech.edu.cn/cdnjs/ajax/libs/crypto-js/3.1.9-1/crypto-js.js&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">head</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">{{ $_hugo_config := `{ &#34;version&#34;: 1 }` }}
</span></span><span class="line"><span class="cl">{{/*
</span></span><span class="line"><span class="cl">    ## Hugo Encrypt
</span></span><span class="line"><span class="cl">    ### Params:
</span></span><span class="line"><span class="cl">    - `password`:
</span></span><span class="line"><span class="cl">        require param
</span></span><span class="line"><span class="cl">    - Simple
</span></span><span class="line"><span class="cl">*/}}
</span></span><span class="line"><span class="cl">{{/* DEFAULTS */}}
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;hugo-encryptor-container&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;hugo-encryptor-prompt&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    {{ if eq .Site.Params.hugoEncryptorLanguage &#34;en-us&#34; }}
</span></span><span class="line"><span class="cl">      <span class="p">&lt;</span><span class="nt">p</span><span class="p">&gt;</span>Part of this article is encrypted with password:<span class="p">&lt;/</span><span class="nt">p</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    {{ else }}
</span></span><span class="line"><span class="cl">      <span class="p">&lt;</span><span class="nt">p</span><span class="p">&gt;</span>文章的部分内容被密码保护：<span class="p">&lt;/</span><span class="nt">p</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    {{ end }}
</span></span><span class="line"><span class="cl">  <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;hugo-encryptor-form&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">input</span>
</span></span><span class="line"><span class="cl">      <span class="na">class</span><span class="o">=</span><span class="s">&#34;hugo-encryptor-input&#34;</span>
</span></span><span class="line"><span class="cl">      <span class="na">placeholder</span><span class="o">=</span><span class="s">&#39;{{ if eq .Site.Params.hugoEncryptorLanguage &#34;en-us&#34; }}Please input the password{{ else }}请输入密码{{ end }}&#39;</span>
</span></span><span class="line"><span class="cl">    <span class="p">/&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">input</span>
</span></span><span class="line"><span class="cl">      <span class="na">class</span><span class="o">=</span><span class="s">&#34;hugo-encryptor-button&#34;</span>
</span></span><span class="line"><span class="cl">      <span class="na">type</span><span class="o">=</span><span class="s">&#34;button&#34;</span>
</span></span><span class="line"><span class="cl">      <span class="na">value</span><span class="o">=</span><span class="s">&#39;{{ if eq .Site.Params.hugoEncryptorLanguage &#34;en-us&#34; }}Click to verify{{ else }}CLICK{{ end }}&#39;</span>
</span></span><span class="line"><span class="cl">      <span class="na">onclick</span><span class="o">=</span><span class="s">&#34;_click_handler(this)&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="p">/&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">div</span>
</span></span><span class="line"><span class="cl">    <span class="na">class</span><span class="o">=</span><span class="s">&#34;hugo-encryptor-cipher-text&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="na">data-password</span><span class="o">=</span><span class="s">&#34;{{ .Get 0 }}&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="na">style</span><span class="o">=</span><span class="s">&#34;display: none;&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">span</span> <span class="na">style</span><span class="o">=</span><span class="s">&#34;display: none;&#34;</span><span class="p">&gt;</span>--- DON&#39;T MODIFY THIS LINE ---<span class="p">&lt;/</span><span class="nt">span</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    {{ .Inner }}
</span></span><span class="line"><span class="cl">  <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">script</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// This script should be included in your Hugo templates
</span></span></span><span class="line"><span class="cl"><span class="c1">// Make sure to include the crypto-js library in your HTML
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">sanitizeContent</span><span class="p">(</span><span class="nx">content</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// Remove unwanted characters (like control characters)
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="k">return</span> <span class="nx">content</span><span class="p">.</span><span class="nx">replace</span><span class="p">(</span><span class="sr">/[\x00-\x1F\x7F]/g</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">).</span><span class="nx">trim</span><span class="p">();</span> <span class="c1">// Remove control characters and trim whitespace
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">encryptContent</span><span class="p">(</span><span class="nx">password</span><span class="p">,</span> <span class="nx">content</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kr">const</span> <span class="nx">key</span> <span class="o">=</span> <span class="nx">CryptoJS</span><span class="p">.</span><span class="nx">MD5</span><span class="p">(</span><span class="nx">password</span><span class="p">).</span><span class="nx">toString</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">    <span class="kr">const</span> <span class="nx">iv</span> <span class="o">=</span> <span class="nx">key</span><span class="p">.</span><span class="nx">substring</span><span class="p">(</span><span class="mi">16</span><span class="p">);</span> <span class="c1">// Use the second half of the key as IV
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="kr">const</span> <span class="nx">paddedContent</span> <span class="o">=</span> <span class="nx">padContent</span><span class="p">(</span><span class="nx">content</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="kr">const</span> <span class="nx">encrypted</span> <span class="o">=</span> <span class="nx">CryptoJS</span><span class="p">.</span><span class="nx">AES</span><span class="p">.</span><span class="nx">encrypt</span><span class="p">(</span><span class="nx">paddedContent</span><span class="p">,</span> <span class="nx">CryptoJS</span><span class="p">.</span><span class="nx">enc</span><span class="p">.</span><span class="nx">Utf8</span><span class="p">.</span><span class="nx">parse</span><span class="p">(</span><span class="nx">key</span><span class="p">),</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">iv</span><span class="o">:</span> <span class="nx">CryptoJS</span><span class="p">.</span><span class="nx">enc</span><span class="p">.</span><span class="nx">Utf8</span><span class="p">.</span><span class="nx">parse</span><span class="p">(</span><span class="nx">iv</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">        <span class="nx">mode</span><span class="o">:</span> <span class="nx">CryptoJS</span><span class="p">.</span><span class="nx">mode</span><span class="p">.</span><span class="nx">CBC</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nx">padding</span><span class="o">:</span> <span class="nx">CryptoJS</span><span class="p">.</span><span class="nx">pad</span><span class="p">.</span><span class="nx">Pkcs7</span>
</span></span><span class="line"><span class="cl">    <span class="p">});</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="nx">CryptoJS</span><span class="p">.</span><span class="nx">enc</span><span class="p">.</span><span class="nx">Base64</span><span class="p">.</span><span class="nx">stringify</span><span class="p">(</span><span class="nx">encrypted</span><span class="p">.</span><span class="nx">ciphertext</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">padContent</span><span class="p">(</span><span class="nx">content</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kr">const</span> <span class="nx">blockSize</span> <span class="o">=</span> <span class="mi">32</span><span class="p">;</span> <span class="c1">// AES block size
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="kr">const</span> <span class="nx">padlen</span> <span class="o">=</span> <span class="nx">blockSize</span> <span class="o">-</span> <span class="p">(</span><span class="nx">content</span><span class="p">.</span><span class="nx">length</span> <span class="o">%</span> <span class="nx">blockSize</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// const padding = String.fromCharCode(padlen).repeat(padlen);
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="c1">// return content + padding;
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="k">return</span> <span class="nx">content</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">processEncryptedBlocks</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kr">const</span> <span class="nx">blocks</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">querySelectorAll</span><span class="p">(</span><span class="s1">&#39;.hugo-encryptor-cipher-text&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nx">blocks</span><span class="p">.</span><span class="nx">forEach</span><span class="p">(</span><span class="nx">block</span> <span class="p">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="kr">const</span> <span class="nx">password</span> <span class="o">=</span> <span class="nx">block</span><span class="p">.</span><span class="nx">getAttribute</span><span class="p">(</span><span class="s1">&#39;data-password&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="kr">const</span> <span class="nx">content</span> <span class="o">=</span> <span class="nx">block</span><span class="p">.</span><span class="nx">innerHTML</span><span class="p">.</span><span class="nx">trim</span><span class="p">();</span> <span class="c1">// Trim whitespace
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>        <span class="kr">const</span> <span class="nx">sanitizedContent</span> <span class="o">=</span> <span class="nx">sanitizeContent</span><span class="p">(</span><span class="nx">content</span><span class="p">);</span> <span class="c1">// Sanitize content
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>        <span class="kr">const</span> <span class="nx">encryptedContent</span> <span class="o">=</span> <span class="nx">encryptContent</span><span class="p">(</span><span class="nx">password</span><span class="p">,</span> <span class="nx">sanitizedContent</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="nx">block</span><span class="p">.</span><span class="nx">innerHTML</span> <span class="o">=</span> <span class="nx">encryptedContent</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="nx">block</span><span class="p">.</span><span class="nx">removeAttribute</span><span class="p">(</span><span class="s1">&#39;data-password&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="p">});</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">// Append the decrypt.js script
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="kr">const</span> <span class="nx">script</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">createElement</span><span class="p">(</span><span class="s1">&#39;script&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nx">script</span><span class="p">.</span><span class="nx">src</span> <span class="o">=</span> <span class="s1">&#39;/js/decrypt.js&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="nb">document</span><span class="p">.</span><span class="nx">body</span><span class="p">.</span><span class="nx">appendChild</span><span class="p">(</span><span class="nx">script</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Call the function to process the blocks after the DOM is fully loaded
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nb">document</span><span class="p">.</span><span class="nx">addEventListener</span><span class="p">(</span><span class="s1">&#39;DOMContentLoaded&#39;</span><span class="p">,</span> <span class="nx">processEncryptedBlocks</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">script</span><span class="p">&gt;</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>对应的样式设置如下</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>css</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="c">/* change the style of the encrypt button &amp; input */</span>
</span></span><span class="line"><span class="cl"><span class="c">/* only encrypt once in one posts. */</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">hugo-encryptor-container</span><span class="p">:</span><span class="nd">has</span><span class="o">(&gt;</span><span class="p">.</span><span class="nc">hugo-encryptor-prompt</span><span class="o">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">border-top</span><span class="p">:</span> <span class="mi">2</span><span class="kt">px</span> <span class="kc">solid</span> <span class="kc">black</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">border-bottom</span><span class="p">:</span> <span class="mi">2</span><span class="kt">px</span> <span class="kc">solid</span> <span class="kc">black</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="c">/* background: rgb(0 0 0 / 20%); */</span>
</span></span><span class="line"><span class="cl">    <span class="n">backdrop-filter</span><span class="p">:</span> <span class="nb">blur</span><span class="p">(</span><span class="mi">5</span><span class="kt">px</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="k">padding</span><span class="p">:</span> <span class="mi">5</span><span class="kt">px</span><span class="p">;</span>   
</span></span><span class="line"><span class="cl">    <span class="k">margin-bottom</span><span class="p">:</span> <span class="mi">10</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">dark</span> <span class="p">.</span><span class="nc">hugo-encryptor-container</span><span class="p">:</span><span class="nd">has</span><span class="o">(&gt;</span><span class="p">.</span><span class="nc">hugo-encryptor-prompt</span><span class="o">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">border-top</span><span class="p">:</span> <span class="mi">2</span><span class="kt">px</span> <span class="kc">solid</span> <span class="mh">#5cbd63</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">border-bottom</span><span class="p">:</span> <span class="mi">2</span><span class="kt">px</span> <span class="kc">solid</span> <span class="mh">#5cbd63</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">hugo-encryptor-prompt</span> <span class="p">{</span><span class="k">font-weight</span><span class="p">:</span> <span class="kc">bold</span><span class="p">;}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nt">input</span><span class="p">.</span><span class="nc">hugo-encryptor-input</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">border</span><span class="p">:</span> <span class="mi">2</span><span class="kt">px</span> <span class="kc">solid</span> <span class="kc">black</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">color</span><span class="p">:</span> <span class="nf">var</span><span class="p">(</span><span class="o">--</span><span class="n">primary</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nt">input</span><span class="p">.</span><span class="nc">hugo-encryptor-button</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">border</span><span class="p">:</span> <span class="kc">unset</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">background</span><span class="p">:</span> <span class="kc">black</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">border-radius</span><span class="p">:</span> <span class="mi">20</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">padding</span><span class="p">:</span> <span class="mi">0</span><span class="kt">px</span> <span class="mi">5</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">box-shadow</span><span class="p">:</span> <span class="mi">0</span><span class="kt">px</span> <span class="mi">0</span><span class="kt">px</span> <span class="mi">2</span><span class="kt">px</span> <span class="mi">2</span><span class="kt">px</span> <span class="nb">rgb</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="k">color</span><span class="p">:</span><span class="kc">azure</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nt">input</span><span class="p">.</span><span class="nc">hugo-encryptor-button</span><span class="p">:</span><span class="nd">hover</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">background-color</span><span class="p">:</span><span class="mh">#5cbd63</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">transition</span><span class="p">:</span> <span class="mf">0.7</span><span class="kt">s</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nt">input</span><span class="p">.</span><span class="nc">hugo-encryptor-button</span><span class="p">:</span><span class="nd">focus</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">outline-color</span><span class="p">:</span> <span class="kc">transparent</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">outline-style</span><span class="p">:</span><span class="kc">solid</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">box-shadow</span><span class="p">:</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">4</span><span class="kt">px</span> <span class="mh">#5cbd63</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nt">input</span><span class="p">.</span><span class="nc">hugo-encryptor-input</span><span class="p">:</span><span class="nd">focus</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">outline-color</span><span class="p">:</span> <span class="kc">transparent</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">outline-style</span><span class="p">:</span><span class="kc">solid</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">box-shadow</span><span class="p">:</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">1</span><span class="kt">px</span> <span class="mh">#0e0912</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">dark</span> <span class="nt">input</span><span class="p">.</span><span class="nc">hugo-encryptor-input</span><span class="p">:</span><span class="nd">focus</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">box-shadow</span><span class="p">:</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">1</span><span class="kt">px</span> <span class="mh">#5cbd63</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">post-single</span><span class="p">:</span><span class="nd">has</span><span class="o">(</span><span class="p">.</span><span class="nc">post-content</span> <span class="p">.</span><span class="nc">hugo-encryptor-prompt</span><span class="o">)</span> <span class="p">#</span><span class="nn">toc-container</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">display</span><span class="p">:</span> <span class="kc">none</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>此外当你有加密的需求，记得把你的 repo 改为 Private，不然图啥呢是吧🔒；</p>
<h2 id="fi">FI</h2>
<blockquote>
<p>我可以不用，但是我得有啊，你说是不?</p>
</blockquote>
]]></content:encoded>
    </item>
    <item>
      <title>修改Hugo中Markdown的基础渲染</title>
      <link>https://aikenh.cn/posts/%E4%BF%AE%E6%94%B9hugo%E4%B8%ADmarkdown%E7%9A%84%E5%9F%BA%E7%A1%80%E6%B8%B2%E6%9F%93/</link>
      <pubDate>Tue, 17 Dec 2024 17:38:18 +0000</pubDate>
      <guid>https://aikenh.cn/posts/%E4%BF%AE%E6%94%B9hugo%E4%B8%ADmarkdown%E7%9A%84%E5%9F%BA%E7%A1%80%E6%B8%B2%E6%9F%93/</guid>
      <description>利用render hook修改markdown元素的默认渲染样式</description>
      <content:encoded><![CDATA[


  
  

<blockquote class="alert-blockquote alert-summary">
  <p class="alert-heading">
    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16">
      <path d="M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"></path>
    </svg>
    <span>Summary</span>
  </p>
  <p>利用 hugo 主题的 render hook 的功能，修改 markdown 转换为 html 的样式，通过这种方法更改特定 Markdown 元素的渲染；</p>

</blockquote>
<h2 id="whats-render-hook-in-hugo-啥是渲染钩子">What&rsquo;s Render Hook In Hugo 啥是渲染钩子</h2>
<p>Render Hook 是 Hugo 给希望增强 Markdown 渲染功能的开发者留出的工具，通过 Render Hook 可以使开发者为各种 Markdown 元素创建自定义的渲染模版，满足不同用户对于渲染的不同需求；</p>
<p>具体而言，当编辑/创建如下这些特定路径的文件，其会覆盖默认的 markdown 渲染成 html 的方式，具体路径为 <span class="sidenote-number"><small class="sidenote"><a href="https://gohugo.io/render-hooks/introduction/" target="_blank" rel="noopener">Render Hooks Introduction</a></small></span> ：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>text</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">layouts/
</span></span><span class="line"><span class="cl">└── _default/
</span></span><span class="line"><span class="cl">    └── _markup/
</span></span><span class="line"><span class="cl">        ├── render-blockquote.html  # 渲染引用快
</span></span><span class="line"><span class="cl">        ├── render-codeblock.html   # 渲染代码块
</span></span><span class="line"><span class="cl">        ├── render-image.html       # 图片
</span></span><span class="line"><span class="cl">        ├── render-link.html        # 链接
</span></span><span class="line"><span class="cl">        └── render-table.html       # 表格</span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>具体的参数和各种类型的具体文件，请在修改的时候参考对应的官方文档即可，如：<a href="https://gohugo.io/render-hooks/code-blocks/" target="_blank" rel="noopener">codeBlock</a>
</p>
<h3 id="why-为啥使用它呢">Why ？为啥使用它呢</h3>
<p>简单介绍 Render Hook 后，其实其优点就呼之欲出了：</p>
<ul>
<li>灵活 | 可自定义 | 增强功能：可以根据自己的需求随意的更改渲染的样式，甚至嵌入 js 引入复杂功能（收起，复制等）；</li>
<li>无需对博文做任何调整，不破坏 markdown 本身的可迁移性；</li>
<li>一劳永逸，统一管理；</li>
</ul>
<p>同时默认的样式在功能和外观上都比较基础，很多特性不被支持，如：</p>
<ul>
<li>外部打开链接</li>
<li>代码块的复制和折叠</li>
<li>图片的大小限制和位置限制等</li>
</ul>
<p>而为了支持这些特性，相比借助简码使用支持原生 markdown 的 render hook 去实现新特性，保持文章的简洁和完整性，那当然是最好不过；</p>
<h2 id="define-personal-render-定义自己的渲染">Define Personal Render 定义自己的渲染</h2>
<h3 id="mermaid-流程图支持">Mermaid 流程图支持</h3>
<p><a href="https://gohugo.io/content-management/diagrams/" target="_blank" rel="noopener">官方文档</a>
已经给出了对应的支持方案，主要分为三步：</p>
<p>一、在 <code>layouts/_default/_markup/render-codeblock-mermaid.html</code> 中添加</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>html</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">pre</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;mermaid&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    {{- .Inner | htmlEscape | safeHTML }}
</span></span><span class="line"><span class="cl">  <span class="p">&lt;/</span><span class="nt">pre</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  {{ .Page.Store.Set &#34;hasMermaid&#34; true }}</span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>二、在内容模版的底部添加如下内容（这里我是添加到 ``layouts/_default/single.html` 中）</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>html</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl">{{ if .Store.Get &#34;hasMermaid&#34; }}
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">script</span> <span class="na">type</span><span class="o">=</span><span class="s">&#34;module&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="kr">import</span> <span class="nx">mermaid</span> <span class="nx">from</span> <span class="s1">&#39;https://cdn.jsdmirror.com/npm/mermaid/dist/mermaid.esm.min.mjs&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// import mermaid from &#39;https://cdn.jsdelivr.net/npm/mermaid/+esm&#39;
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nx">mermaid</span><span class="p">.</span><span class="nx">initialize</span><span class="p">({</span> 
</span></span><span class="line"><span class="cl">      <span class="nx">startOnLoad</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="s1">&#39;theme&#39;</span><span class="o">:</span> <span class="s1">&#39;dark&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">     <span class="p">});</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  {{ end }} </span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><blockquote>
<p>可以修改 CDN 来加速 mermaid 的加载 <span class="sidenote-number"><small class="sidenote">感谢blog.jsdmirror.com 的镜像站</small></span></p>
</blockquote>
<p>三、可以在 markdown 中通过代码块的方式调用 mermaid ：</p>
<p>
<div class="post-img-view">
  <a data-fancybox="gallery" href="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241217194932.png">
    <img alt="image.png" loading="lazy" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241217194932.png"class="responsive-image" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241217194932.png" style="display: block; margin: 0 auto;"
      alt="image.png"  />
  </a>
</div>


<script>
  document.addEventListener("DOMContentLoaded", function() {
      var images = document.querySelectorAll(".responsive-image");
      var maxHeight = window.innerHeight / 2.5;
      images.forEach(function(image) {
          image.style.maxHeight = maxHeight + "px";
      });
  });
</script>
</p>
<p>四、如果 mermaid 仍然渲染失败，或者没有开始渲染，尝试将 guessSyntax 设置为 false 如下 <span class="sidenote-number"><small class="sidenote"><a href="https://github.com/adityatelange/hugo-PaperMod/discussions/850" target="_blank" rel="noopener">Mermaid doesn&rsquo;t work </a></small></span> <span class="sidenote-number"><small class="sidenote"><a href="https://ooe.ooo/posts/%E4%BB%8E%E9%9B%B6%E5%BC%80%E5%A7%8B%E6%90%AD%E5%BB%BAhugo%E5%8D%9A%E5%AE%A2/" target="_blank" rel="noopener">从零开始搭建Hugo博客</a></small></span>：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>yaml</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">markup</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">highlight</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">guessSyntax</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>最终应该可正常渲染 mermaid，下面是一个随机例子</p>
<p>
<div class="post-img-view">
  <a data-fancybox="gallery" href="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241217201621.png">
    <img alt="image.png" loading="lazy" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241217201621.png"class="responsive-image" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241217201621.png" style="display: block; margin: 0 auto;"
      alt="image.png"  />
  </a>
</div>


<script>
  document.addEventListener("DOMContentLoaded", function() {
      var images = document.querySelectorAll(".responsive-image");
      var maxHeight = window.innerHeight / 2.5;
      images.forEach(function(image) {
          image.style.maxHeight = maxHeight + "px";
      });
  });
</script>
</p>
<p><a href="https://ooe.ooo/posts/%E4%BB%8E%E9%9B%B6%E5%BC%80%E5%A7%8B%E6%90%AD%E5%BB%BAhugo%E5%8D%9A%E5%AE%A2/" target="_blank" rel="noopener">从零开始搭建Hugo博客</a>
 中还有两种其他的支持 mermaid 的方式，感兴趣的也可以参考；</p>
<h3 id="image-自适应图片大小--fancybox-查看原图">Image 自适应图片大小 &amp; FancyBox 查看原图</h3>
<p>多年图像不居中就难受症候群，对原始的图片渲染确实是十分不满意，同时一些比较大/长的图片也会很破坏整个页面的结构和阅读体验，为了避免用 html 逐个调整，因此修改图像的默认 render hook <span class="sidenote-number"><small class="sidenote">这里感谢<a href="https://lifeislife.cn/posts/hugo%E4%B8%BB%E9%A2%98%E9%85%8D%E7%BD%AE/" target="_blank" rel="noopener">夜云泊</a>
分享的十分完整的解决方案</small></span> ；</p>
<p>这里我针对 PaperMod 主题对<a href="https://lifeislife.cn/posts/hugo%E4%B8%BB%E9%A2%98%E9%85%8D%E7%BD%AE/" target="_blank" rel="noopener">夜云泊</a>
 提供的代码做了简单的改动，具体原因已不可考，依稀记得是由于原始的 markdown 中有部分用 html 呈现的图像会有一些问题：</p>
<p>修改后的 <code>render-image.html</code> 如下：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>html</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl">{{- $u := urls.Parse .Destination -}}
</span></span><span class="line"><span class="cl">{{- $src := $u.String -}}
</span></span><span class="line"><span class="cl">{{- if not $u.IsAbs -}}
</span></span><span class="line"><span class="cl">  {{- $path := strings.TrimPrefix &#34;./&#34; $u.Path }}
</span></span><span class="line"><span class="cl">  {{- with or (.PageInner.Resources.Get $path) (resources.Get $path) -}}
</span></span><span class="line"><span class="cl">    {{- $src = .RelPermalink -}}
</span></span><span class="line"><span class="cl">    {{- with $u.RawQuery -}}
</span></span><span class="line"><span class="cl">      {{- $src = printf &#34;%s?%s&#34; $src . -}}
</span></span><span class="line"><span class="cl">    {{- end -}}
</span></span><span class="line"><span class="cl">    {{- with $u.Fragment -}}
</span></span><span class="line"><span class="cl">      {{- $src = printf &#34;%s#%s&#34; $src . -}}
</span></span><span class="line"><span class="cl">    {{- end -}}
</span></span><span class="line"><span class="cl">  {{- end -}}
</span></span><span class="line"><span class="cl">{{- end -}}
</span></span><span class="line"><span class="cl">{{- $attributes := merge .Attributes (dict &#34;alt&#34; .Text &#34;src&#34; $src &#34;title&#34; (.Title | transform.HTMLEscape) &#34;loading&#34; &#34;lazy&#34;) -}}
</span></span><span class="line"><span class="cl">{{if .Page.Site.Params.fancybox }}
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;post-img-view&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">a</span> <span class="na">data-fancybox</span><span class="o">=</span><span class="s">&#34;gallery&#34;</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;{{ .Destination | safeURL }}&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">img</span> <span class="err">{{</span><span class="na">-</span> <span class="na">with</span> <span class="err">$</span><span class="na">attributes</span> <span class="na">-</span><span class="err">}}</span>
</span></span><span class="line"><span class="cl">    <span class="err">{{</span><span class="na">-</span> <span class="na">range</span> <span class="err">$</span><span class="na">k</span><span class="err">,</span> <span class="err">$</span><span class="na">v</span> <span class="na">:</span><span class="o">=</span> <span class="s">.</span> <span class="na">-</span><span class="err">}}</span>
</span></span><span class="line"><span class="cl">      <span class="err">{{</span><span class="na">-</span> <span class="na">if</span> <span class="err">$</span><span class="na">v</span> <span class="na">-</span><span class="err">}}</span>
</span></span><span class="line"><span class="cl">        <span class="err">{{</span><span class="na">-</span> <span class="na">printf</span> <span class="err">&#34;</span> <span class="err">%</span><span class="na">s</span><span class="o">=</span><span class="s">%q&#34;</span> <span class="err">$</span><span class="na">k</span> <span class="err">$</span><span class="na">v</span> <span class="err">|</span> <span class="na">safeHTMLAttr</span> <span class="na">-</span><span class="err">}}</span>
</span></span><span class="line"><span class="cl">      <span class="err">{{</span><span class="na">-</span> <span class="na">end</span> <span class="na">-</span><span class="err">}}</span>
</span></span><span class="line"><span class="cl">    <span class="err">{{</span><span class="na">-</span> <span class="na">end</span> <span class="na">-</span><span class="err">}}</span>
</span></span><span class="line"><span class="cl">  <span class="err">{{</span><span class="na">-</span> <span class="na">end</span> <span class="na">-</span><span class="err">}}</span>  <span class="na">class</span><span class="o">=</span><span class="s">&#34;responsive-image&#34;</span> <span class="na">src</span><span class="o">=</span><span class="s">&#34;{{ .Destination | safeURL }}&#34;</span> <span class="na">style</span><span class="o">=</span><span class="s">&#34;display: block; margin: 0 auto;&#34;</span>
</span></span><span class="line"><span class="cl">      <span class="na">alt</span><span class="o">=</span><span class="s">&#34;{{ .Text }}&#34;</span> <span class="err">{{</span> <span class="na">with</span> <span class="err">.</span><span class="na">Title</span><span class="err">}}</span> <span class="na">title</span><span class="o">=</span><span class="s">&#34;{{ . }}&#34;</span> <span class="err">{{</span> <span class="na">end</span> <span class="err">}}</span> <span class="p">/&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">{{else}}
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">img</span>
</span></span><span class="line"><span class="cl">  <span class="err">{{</span><span class="na">-</span> <span class="na">range</span> <span class="err">$</span><span class="na">k</span><span class="err">,</span> <span class="err">$</span><span class="na">v</span> <span class="na">:</span><span class="o">=</span> <span class="s">$attributes</span> <span class="na">-</span><span class="err">}}</span>
</span></span><span class="line"><span class="cl">    <span class="err">{{</span><span class="na">-</span> <span class="na">if</span> <span class="err">$</span><span class="na">v</span> <span class="na">-</span><span class="err">}}</span>
</span></span><span class="line"><span class="cl">      <span class="err">{{</span><span class="na">-</span> <span class="na">printf</span> <span class="err">&#34;</span> <span class="err">%</span><span class="na">s</span><span class="o">=</span><span class="s">%q&#34;</span> <span class="err">$</span><span class="na">k</span> <span class="err">$</span><span class="na">v</span> <span class="err">|</span> <span class="na">safeHTMLAttr</span> <span class="na">-</span><span class="err">}}</span>
</span></span><span class="line"><span class="cl">    <span class="err">{{</span><span class="na">-</span> <span class="na">end</span> <span class="na">-</span><span class="err">}}</span>
</span></span><span class="line"><span class="cl">  <span class="err">{{</span><span class="na">-</span> <span class="na">end</span> <span class="na">-</span><span class="err">}}</span> <span class="na">style</span><span class="o">=</span><span class="s">&#34;display: block; margin: 0 auto; &#34;</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;responsive-image&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">{{- /**/ -}}
</span></span><span class="line"><span class="cl">{{ end }}
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">script</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="nb">document</span><span class="p">.</span><span class="nx">addEventListener</span><span class="p">(</span><span class="s2">&#34;DOMContentLoaded&#34;</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="kd">var</span> <span class="nx">images</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">querySelectorAll</span><span class="p">(</span><span class="s2">&#34;.responsive-image&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">      <span class="kd">var</span> <span class="nx">maxHeight</span> <span class="o">=</span> <span class="nb">window</span><span class="p">.</span><span class="nx">innerHeight</span> <span class="o">/</span> <span class="mf">2.5</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">      <span class="nx">images</span><span class="p">.</span><span class="nx">forEach</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">image</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">          <span class="nx">image</span><span class="p">.</span><span class="nx">style</span><span class="p">.</span><span class="nx">maxHeight</span> <span class="o">=</span> <span class="nx">maxHeight</span> <span class="o">+</span> <span class="s2">&#34;px&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">      <span class="p">});</span>
</span></span><span class="line"><span class="cl">  <span class="p">});</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">script</span><span class="p">&gt;</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>然后去 Hugo 配置文件 <code>hugo.yml</code> 中新增一项：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>yaml</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">params</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">fancybox</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>具体的代码介绍请转向原作者 👍，最终效果如下：</p>
<p>
<div class="post-img-view">
  <a data-fancybox="gallery" href="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241217201918.png">
    <img alt="image.png" loading="lazy" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241217201918.png"class="responsive-image" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241217201918.png" style="display: block; margin: 0 auto;"
      alt="image.png"  />
  </a>
</div>


<script>
  document.addEventListener("DOMContentLoaded", function() {
      var images = document.querySelectorAll(".responsive-image");
      var maxHeight = window.innerHeight / 2.5;
      images.forEach(function(image) {
          image.style.maxHeight = maxHeight + "px";
      });
  });
</script>
</p>
<p>开启 fancybox：</p>
<p>
<div class="post-img-view">
  <a data-fancybox="gallery" href="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241217201933.png">
    <img alt="image.png" loading="lazy" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241217201933.png"class="responsive-image" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241217201933.png" style="display: block; margin: 0 auto;"
      alt="image.png"  />
  </a>
</div>


<script>
  document.addEventListener("DOMContentLoaded", function() {
      var images = document.querySelectorAll(".responsive-image");
      var maxHeight = window.innerHeight / 2.5;
      images.forEach(function(image) {
          image.style.maxHeight = maxHeight + "px";
      });
  });
</script>
</p>
<h3 id="link-默认新窗口打开网页">Link 默认新窗口打开网页</h3>
<p>参考： <a href="https://discourse.gohugo.io/t/how-to-open-plain-url-links-in-a-new-tab/25523/6" target="_blank" rel="noopener">How to open plain URL links in a new tab? - support - HUGO</a>
 实现如下 <code>render-link.html</code>：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>html</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;{{ .Destination | safeURL }}&#34;</span> <span class="err">{{</span> <span class="na">with</span> <span class="err">.</span><span class="na">Title</span><span class="err">}}</span> <span class="na">title</span><span class="o">=</span><span class="s">&#34;{{ . }}&#34;</span> <span class="err">{{</span> <span class="na">end</span> <span class="err">}}{{</span> <span class="na">if</span> <span class="na">strings</span><span class="err">.</span><span class="na">HasPrefix</span>
</span></span><span class="line"><span class="cl">    <span class="err">.</span><span class="na">Destination</span> <span class="err">&#34;</span><span class="na">http</span><span class="err">&#34;</span> <span class="err">}}</span> <span class="na">target</span><span class="o">=</span><span class="s">&#34;_blank&#34;</span> <span class="na">rel</span><span class="o">=</span><span class="s">&#34;noopener&#34;</span> <span class="err">{{</span> <span class="na">end</span> <span class="err">}}</span><span class="p">&gt;</span>{{ .Text | safeHTML }}<span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><h3 id="code-block--代码折叠">Code Block  代码折叠</h3>
<p>由于有时会分享一些较长的代码，如果始终使代码完整呈现的话，其实页面不是那么的美观，而且也废滚轮，因此感觉折叠功能还是很必要的🔥，同时由于默认的样式怎么看都有些变扭，因此也顺便的加上标签栏来优化对应的样式。</p>
<p>实现代码折叠主要是如下思路：</p>
<ol>
<li>将原本的代码渲染包含在 <code>&lt;div class=&quot;code-content&quot;&gt;</code> 中；</li>
<li>新增同级别元素 <code>&lt;div class=&quot;code-title&quot;&gt;</code> 用于存放标题，同时作为开关控制折叠；</li>
</ol>
<p>接着话不多说开始实现，首先获取原本的基础实现和一些基本参数 <span class="sidenote-number"><small class="sidenote"><a href="https://gohugo.io/render-hooks/code-blocks/" target="_blank" rel="noopener">Code block render hooks | Hugo</a></small></span> 如下：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>go</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="p">{{</span> <span class="err">$</span><span class="nx">result</span> <span class="o">:=</span> <span class="nx">transform</span><span class="p">.</span><span class="nx">HighlightCodeBlock</span> <span class="p">.</span> <span class="p">}}</span>
</span></span><span class="line"><span class="cl"><span class="p">{{</span> <span class="err">$</span><span class="nx">result</span><span class="p">.</span><span class="nx">Wrapped</span> <span class="p">}}</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><blockquote>
<p>该代码置于 <code>render-codeblock.html</code> 中，为默认的代码块渲染样式，如果需要修改特定语言的渲染，可以参考官方文档和 mermaid 的方式去处理；</p>
</blockquote>
<p>接着就很简单了，通过 <code>{{.Type}}</code> 可以获取语言类型信息用作 title，然后通过 js 和 css 实现折叠效果和样式调整即可，最终实现效果如下：</p>
<p>
<div class="post-img-view">
  <a data-fancybox="gallery" href="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241218071014.png">
    <img alt="image.png" loading="lazy" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241218071014.png"class="responsive-image" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241218071014.png" style="display: block; margin: 0 auto;"
      alt="image.png"  />
  </a>
</div>


<script>
  document.addEventListener("DOMContentLoaded", function() {
      var images = document.querySelectorAll(".responsive-image");
      var maxHeight = window.innerHeight / 2.5;
      images.forEach(function(image) {
          image.style.maxHeight = maxHeight + "px";
      });
  });
</script>
</p>
<p>折叠后：</p>
<p>
<div class="post-img-view">
  <a data-fancybox="gallery" href="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241218071043.png">
    <img alt="image.png" loading="lazy" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241218071043.png"class="responsive-image" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241218071043.png" style="display: block; margin: 0 auto;"
      alt="image.png"  />
  </a>
</div>


<script>
  document.addEventListener("DOMContentLoaded", function() {
      var images = document.querySelectorAll(".responsive-image");
      var maxHeight = window.innerHeight / 2.5;
      images.forEach(function(image) {
          image.style.maxHeight = maxHeight + "px";
      });
  });
</script>
</p>
<p>具体代码如下：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>html</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;code-block&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;code-title&#34;</span> <span class="na">onclick</span><span class="o">=</span><span class="s">&#34;toggleCode(this)&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nt">span</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;code-block-open&#34;</span><span class="p">&gt;&lt;</span><span class="nt">ion-icon</span> <span class="na">name</span><span class="o">=</span><span class="s">&#34;code-slash-outline&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">ion-icon</span><span class="p">&gt;&lt;/</span><span class="nt">span</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nt">span</span><span class="p">&gt;</span>{{.Type}}<span class="p">&lt;/</span><span class="nt">span</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;code-content&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        {{ $result := transform.HighlightCodeBlock . }}
</span></span><span class="line"><span class="cl">        {{ $result.Wrapped }}
</span></span><span class="line"><span class="cl">    <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">script</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">toggleCode</span><span class="p">(</span><span class="nx">element</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kr">const</span> <span class="nx">codeContent</span> <span class="o">=</span> <span class="nx">element</span><span class="p">.</span><span class="nx">nextElementSibling</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="p">(</span><span class="nx">codeContent</span><span class="p">.</span><span class="nx">style</span><span class="p">.</span><span class="nx">display</span> <span class="o">===</span> <span class="s2">&#34;none&#34;</span> <span class="o">||</span> <span class="nx">codeContent</span><span class="p">.</span><span class="nx">style</span><span class="p">.</span><span class="nx">display</span> <span class="o">===</span> <span class="s2">&#34;&#34;</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">codeContent</span><span class="p">.</span><span class="nx">style</span><span class="p">.</span><span class="nx">display</span> <span class="o">=</span> <span class="s2">&#34;block&#34;</span><span class="p">;</span> <span class="c1">// Show the code block
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>        <span class="nx">codeContent</span><span class="p">.</span><span class="nx">parentNode</span><span class="p">.</span><span class="nx">classList</span><span class="p">.</span><span class="nx">remove</span><span class="p">(</span><span class="s2">&#34;code-has-hidden-child&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">codeContent</span><span class="p">.</span><span class="nx">style</span><span class="p">.</span><span class="nx">display</span> <span class="o">=</span> <span class="s2">&#34;none&#34;</span><span class="p">;</span> <span class="c1">// Hide the code block
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>        <span class="nx">codeContent</span><span class="p">.</span><span class="nx">parentNode</span><span class="p">.</span><span class="nx">classList</span><span class="p">.</span><span class="nx">add</span><span class="p">(</span><span class="s2">&#34;code-has-hidden-child&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">script</span><span class="p">&gt;</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>css</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="p">.</span><span class="nc">code-block</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">background</span><span class="p">:</span> <span class="nf">var</span><span class="p">(</span><span class="o">--</span><span class="n">code</span><span class="o">-</span><span class="kc">block</span><span class="o">-</span><span class="n">bg</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="k">box-shadow</span><span class="p">:</span> <span class="mi">0</span><span class="kt">px</span> <span class="mi">4</span><span class="kt">px</span> <span class="mi">30</span><span class="kt">px</span> <span class="nb">rgba</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mf">0.5</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="k">border-radius</span><span class="p">:</span> <span class="mi">8</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">position</span><span class="p">:</span> <span class="kc">relative</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="c">/* padding: 2px; */</span>
</span></span><span class="line"><span class="cl">    <span class="k">margin</span><span class="p">:</span> <span class="mi">8</span><span class="kt">px</span> <span class="mi">0</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">code-title</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">display</span><span class="p">:</span> <span class="kc">flex</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">align-items</span><span class="p">:</span> <span class="kc">center</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">justify-content</span><span class="p">:</span> <span class="kc">space-between</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">margin</span><span class="p">:</span> <span class="mi">10</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">border-bottom</span><span class="p">:</span> <span class="mi">1</span><span class="kt">px</span> <span class="kc">solid</span> <span class="nb">rgba</span><span class="p">(</span><span class="mi">255</span><span class="p">,</span> <span class="mi">255</span><span class="p">,</span> <span class="mi">255</span><span class="p">,</span> <span class="mf">0.602</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="k">cursor</span><span class="p">:</span> <span class="kc">pointer</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">code-title</span> <span class="nt">span</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">letter-spacing</span><span class="p">:</span> <span class="mf">1.57</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">color</span><span class="p">:</span> <span class="nb">rgb</span><span class="p">(</span><span class="mi">212</span> <span class="mi">212</span> <span class="mi">212</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="c">/* width: 90%; */</span>
</span></span><span class="line"><span class="cl">    <span class="c">/* align-items: center; */</span>
</span></span><span class="line"><span class="cl">    <span class="k">font-size</span><span class="p">:</span> <span class="mi">1</span><span class="kt">rem</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">padding</span><span class="p">:</span> <span class="mi">5</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">padding-left</span><span class="p">:</span> <span class="mi">10</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">text-transform</span><span class="p">:</span> <span class="kc">capitalize</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">code-has-hidden-child</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">border</span><span class="p">:</span> <span class="mi">1</span><span class="kt">px</span> <span class="kc">solid</span> <span class="kc">salmon</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>此外这里也将 copy-code 按钮挪到了标题栏上，主要是修改 copy 的样式和渲染位置 <span class="sidenote-number"><small class="sidenote">可以参考 <a href="https://github.com/AikenH/papermod-sidebar/commit/2305a1c5a7098edaee8c850bae4efa2e22bb700d" target="_blank" rel="noopener">[Feat] update default code style · AikenH </a>
 剩余部分的修改，感兴趣的也可以点个 star，感谢。</small></span></p>
<h3 id="alert-blockquote-特殊引用块">Alert-Blockquote 特殊引用块</h3>
<p>在之前简码部分的博客已经介绍了一些特殊的引用块样式和实现，可以根据官网 <a href="https://gohugo.io/render-hooks/blockquotes/" target="_blank" rel="noopener">Blockquote render hooks | Hugo</a>
 将其改为自己的默认引用块即可，即可 markdown 中按照如下方式引用实现：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>markdown</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl"><span class="k">&gt; </span><span class="ge">[!{alert-keywork}]
</span></span></span><span class="line"><span class="cl"><span class="ge"></span>&gt; {alert-content}</span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>这是本博客中部分样式展示：</p>
<p>Note 样式：</p>



  
  

<blockquote class="alert-blockquote alert-note">
  <p class="alert-heading">
    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16">
      <path d="M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"></path>
    </svg>
    <span>Note</span>
  </p>
  <p>test note block&rsquo;s style.</p>

</blockquote>
<p>important 样式</p>



  
  

<blockquote class="alert-blockquote alert-important">
  <p class="alert-heading">
    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16">
      <path d="M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v9.5A1.75 1.75 0 0 1 14.25 13H8.06l-2.573 2.573A1.458 1.458 0 0 1 3 14.543V13H1.75A1.75 1.75 0 0 1 0 11.25Zm1.75-.25a.25.25 0 0 0-.25.25v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25Zm7 2.25v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 9a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path>
    </svg>
    <span>Important</span>
  </p>
  <p>重要内容</p>

</blockquote>
<p>Error 样式</p>



  
  

<blockquote class="alert-blockquote alert-error">
  <p class="alert-heading">
    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16">
      <path d="M4.47.22A.749.749 0 0 1 5 0h6c.199 0 .389.079.53.22l4.25 4.25c.141.14.22.331.22.53v6a.749.749 0 0 1-.22.53l-4.25 4.25A.749.749 0 0 1 11 16H5a.749.749 0 0 1-.53-.22L.22 11.53A.749.749 0 0 1 0 11V5c0-.199.079-.389.22-.53Zm.84 1.28L1.5 5.31v5.38l3.81 3.81h5.38l3.81-3.81V5.31L10.69 1.5ZM8 4a.75.75 0 0 1 .75.75v3.5a.75.75 0 0 1-1.5 0v-3.5A.75.75 0 0 1 8 4Zm0 8a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"></path>
    </svg>
    <span>Error</span>
  </p>
  <p>Error</p>

</blockquote>
<p>该部分可以发现大家都参考了 <a href="https://github.com/martignoni/hugo-notice" target="_blank" rel="noopener">hugo-notice</a>
 ，而本博客则是在其他博主分享 <span class="sidenote-number"><small class="sidenote">感谢 <a href="https://blog.grew.cc/posts/hugo-alert-blockquote/" target="_blank" rel="noopener">tom&rsquo;s blog</a></small></span> <span class="sidenote-number"><small class="sidenote">感谢<a href="https://blog.hentioe.dev/posts/hugo-support-blockquote-alerts.html" target="_blank" rel="noopener">绅士喵</a></small></span> 的样式之上根据本人的 Obsidian 调整了一下样式和默认值，具体实现如下：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>html</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl">{{ $alertTypes := dict
</span></span><span class="line"><span class="cl">  &#34;note&#34; &#34;<span class="p">&lt;</span><span class="nt">path</span> <span class="na">d</span><span class="o">=</span><span class="s">\&#34;M0</span> <span class="na">8a8</span> <span class="na">8</span> <span class="na">0</span> <span class="na">1</span> <span class="na">1</span> <span class="na">16</span> <span class="na">0A8</span> <span class="na">8</span> <span class="na">0</span> <span class="na">0</span> <span class="na">1</span> <span class="na">0</span> <span class="na">8Zm8-6</span><span class="err">.</span><span class="na">5a6</span><span class="err">.</span><span class="na">5</span> <span class="na">6</span><span class="err">.</span><span class="na">5</span> <span class="na">0</span> <span class="na">1</span> <span class="na">0</span> <span class="na">0</span> <span class="na">13</span> <span class="na">6</span><span class="err">.</span><span class="na">5</span> <span class="na">6</span><span class="err">.</span><span class="na">5</span> <span class="na">0</span> <span class="na">0</span> <span class="na">0</span> <span class="na">0-13ZM6</span><span class="err">.</span><span class="na">5</span> <span class="na">7</span><span class="err">.</span><span class="na">75A</span><span class="err">.</span><span class="na">75</span><span class="err">.</span><span class="na">75</span> <span class="na">0</span> <span class="na">0</span> <span class="na">1</span> <span class="na">7</span><span class="err">.</span><span class="na">25</span> <span class="na">7h1a</span><span class="err">.</span><span class="na">75</span><span class="err">.</span><span class="na">75</span> <span class="na">0</span> <span class="na">0</span> <span class="na">1</span> <span class="err">.</span><span class="na">75</span><span class="err">.</span><span class="na">75v2</span><span class="err">.</span><span class="na">75h</span><span class="err">.</span><span class="na">25a</span><span class="err">.</span><span class="na">75</span><span class="err">.</span><span class="na">75</span> <span class="na">0</span> <span class="na">0</span> <span class="na">1</span> <span class="na">0</span> <span class="na">1</span><span class="err">.</span><span class="na">5h-2a</span><span class="err">.</span><span class="na">75</span><span class="err">.</span><span class="na">75</span> <span class="na">0</span> <span class="na">0</span> <span class="na">1</span> <span class="na">0-1</span><span class="err">.</span><span class="na">5h</span><span class="err">.</span><span class="na">25v-2h-</span><span class="err">.</span><span class="na">25a</span><span class="err">.</span><span class="na">75</span><span class="err">.</span><span class="na">75</span> <span class="na">0</span> <span class="na">0</span> <span class="na">1-</span><span class="err">.</span><span class="na">75-</span><span class="err">.</span><span class="na">75ZM8</span> <span class="na">6a1</span> <span class="na">1</span> <span class="na">0</span> <span class="na">1</span> <span class="na">1</span> <span class="na">0-2</span> <span class="na">1</span> <span class="na">1</span> <span class="na">0</span> <span class="na">0</span> <span class="na">1</span> <span class="na">0</span> <span class="na">2Z</span><span class="err">\&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">path</span><span class="p">&gt;</span>&#34;
</span></span><span class="line"><span class="cl">  &#34;tip&#34; &#34;<span class="p">&lt;</span><span class="nt">path</span> <span class="na">d</span><span class="o">=</span><span class="s">\&#34;M8</span> <span class="na">1</span><span class="err">.</span><span class="na">5c-2</span><span class="err">.</span><span class="na">363</span> <span class="na">0-4</span> <span class="na">1</span><span class="err">.</span><span class="na">69-4</span> <span class="na">3</span><span class="err">.</span><span class="na">75</span> <span class="na">0</span> <span class="err">.</span><span class="na">984</span><span class="err">.</span><span class="na">424</span> <span class="na">1</span><span class="err">.</span><span class="na">625</span><span class="err">.</span><span class="na">984</span> <span class="na">2</span><span class="err">.</span><span class="na">304l</span><span class="err">.</span><span class="na">214</span><span class="err">.</span><span class="na">253c</span><span class="err">.</span><span class="na">223</span><span class="err">.</span><span class="na">264</span><span class="err">.</span><span class="na">47</span><span class="err">.</span><span class="na">556</span><span class="err">.</span><span class="na">673</span><span class="err">.</span><span class="na">848</span><span class="err">.</span><span class="na">284</span><span class="err">.</span><span class="na">411</span><span class="err">.</span><span class="na">537</span><span class="err">.</span><span class="na">896</span><span class="err">.</span><span class="na">621</span> <span class="na">1</span><span class="err">.</span><span class="na">49a</span><span class="err">.</span><span class="na">75</span><span class="err">.</span><span class="na">75</span> <span class="na">0</span> <span class="na">0</span> <span class="na">1-1</span><span class="err">.</span><span class="na">484</span><span class="err">.</span><span class="na">211c-</span><span class="err">.</span><span class="na">04-</span><span class="err">.</span><span class="na">282-</span><span class="err">.</span><span class="na">163-</span><span class="err">.</span><span class="na">547-</span><span class="err">.</span><span class="na">37-</span><span class="err">.</span><span class="na">847a8</span><span class="err">.</span><span class="na">456</span> <span class="na">8</span><span class="err">.</span><span class="na">456</span> <span class="na">0</span> <span class="na">0</span> <span class="na">0-</span><span class="err">.</span><span class="na">542-</span><span class="err">.</span><span class="na">68c-</span><span class="err">.</span><span class="na">084-</span><span class="err">.</span><span class="na">1-</span><span class="err">.</span><span class="na">173-</span><span class="err">.</span><span class="na">205-</span><span class="err">.</span><span class="na">268-</span><span class="err">.</span><span class="na">32C3</span><span class="err">.</span><span class="na">201</span> <span class="na">7</span><span class="err">.</span><span class="na">75</span> <span class="na">2</span><span class="err">.</span><span class="na">5</span> <span class="na">6</span><span class="err">.</span><span class="na">766</span> <span class="na">2</span><span class="err">.</span><span class="na">5</span> <span class="na">5</span><span class="err">.</span><span class="na">25</span> <span class="na">2</span><span class="err">.</span><span class="na">5</span> <span class="na">2</span><span class="err">.</span><span class="na">31</span> <span class="na">4</span><span class="err">.</span><span class="na">863</span> <span class="na">0</span> <span class="na">8</span> <span class="na">0s5</span><span class="err">.</span><span class="na">5</span> <span class="na">2</span><span class="err">.</span><span class="na">31</span> <span class="na">5</span><span class="err">.</span><span class="na">5</span> <span class="na">5</span><span class="err">.</span><span class="na">25c0</span> <span class="na">1</span><span class="err">.</span><span class="na">516-</span><span class="err">.</span><span class="na">701</span> <span class="na">2</span><span class="err">.</span><span class="na">5-1</span><span class="err">.</span><span class="na">328</span> <span class="na">3</span><span class="err">.</span><span class="na">259-</span><span class="err">.</span><span class="na">095</span><span class="err">.</span><span class="na">115-</span><span class="err">.</span><span class="na">184</span><span class="err">.</span><span class="na">22-</span><span class="err">.</span><span class="na">268</span><span class="err">.</span><span class="na">319-</span><span class="err">.</span><span class="na">207</span><span class="err">.</span><span class="na">245-</span><span class="err">.</span><span class="na">383</span><span class="err">.</span><span class="na">453-</span><span class="err">.</span><span class="na">541</span><span class="err">.</span><span class="na">681-</span><span class="err">.</span><span class="na">208</span><span class="err">.</span><span class="na">3-</span><span class="err">.</span><span class="na">33</span><span class="err">.</span><span class="na">565-</span><span class="err">.</span><span class="na">37</span><span class="err">.</span><span class="na">847a</span><span class="err">.</span><span class="na">751</span><span class="err">.</span><span class="na">751</span> <span class="na">0</span> <span class="na">0</span> <span class="na">1-1</span><span class="err">.</span><span class="na">485-</span><span class="err">.</span><span class="na">212c</span><span class="err">.</span><span class="na">084-</span><span class="err">.</span><span class="na">593</span><span class="err">.</span><span class="na">337-1</span><span class="err">.</span><span class="na">078</span><span class="err">.</span><span class="na">621-1</span><span class="err">.</span><span class="na">489</span><span class="err">.</span><span class="na">203-</span><span class="err">.</span><span class="na">292</span><span class="err">.</span><span class="na">45-</span><span class="err">.</span><span class="na">584</span><span class="err">.</span><span class="na">673-</span><span class="err">.</span><span class="na">848</span><span class="err">.</span><span class="na">075-</span><span class="err">.</span><span class="na">088</span><span class="err">.</span><span class="na">147-</span><span class="err">.</span><span class="na">173</span><span class="err">.</span><span class="na">213-</span><span class="err">.</span><span class="na">253</span><span class="err">.</span><span class="na">561-</span><span class="err">.</span><span class="na">679</span><span class="err">.</span><span class="na">985-1</span><span class="err">.</span><span class="na">32</span><span class="err">.</span><span class="na">985-2</span><span class="err">.</span><span class="na">304</span> <span class="na">0-2</span><span class="err">.</span><span class="na">06-1</span><span class="err">.</span><span class="na">637-3</span><span class="err">.</span><span class="na">75-4-3</span><span class="err">.</span><span class="na">75ZM5</span><span class="err">.</span><span class="na">75</span> <span class="na">12h4</span><span class="err">.</span><span class="na">5a</span><span class="err">.</span><span class="na">75</span><span class="err">.</span><span class="na">75</span> <span class="na">0</span> <span class="na">0</span> <span class="na">1</span> <span class="na">0</span> <span class="na">1</span><span class="err">.</span><span class="na">5h-4</span><span class="err">.</span><span class="na">5a</span><span class="err">.</span><span class="na">75</span><span class="err">.</span><span class="na">75</span> <span class="na">0</span> <span class="na">0</span> <span class="na">1</span> <span class="na">0-1</span><span class="err">.</span><span class="na">5ZM6</span> <span class="na">15</span><span class="err">.</span><span class="na">25a</span><span class="err">.</span><span class="na">75</span><span class="err">.</span><span class="na">75</span> <span class="na">0</span> <span class="na">0</span> <span class="na">1</span> <span class="err">.</span><span class="na">75-</span><span class="err">.</span><span class="na">75h2</span><span class="err">.</span><span class="na">5a</span><span class="err">.</span><span class="na">75</span><span class="err">.</span><span class="na">75</span> <span class="na">0</span> <span class="na">0</span> <span class="na">1</span> <span class="na">0</span> <span class="na">1</span><span class="err">.</span><span class="na">5h-2</span><span class="err">.</span><span class="na">5a</span><span class="err">.</span><span class="na">75</span><span class="err">.</span><span class="na">75</span> <span class="na">0</span> <span class="na">0</span> <span class="na">1-</span><span class="err">.</span><span class="na">75-</span><span class="err">.</span><span class="na">75Z</span><span class="err">\&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">path</span><span class="p">&gt;</span>&#34;
</span></span><span class="line"><span class="cl">  &#34;important&#34; &#34;<span class="p">&lt;</span><span class="nt">path</span> <span class="na">d</span><span class="o">=</span><span class="s">\&#34;M0</span> <span class="na">1</span><span class="err">.</span><span class="na">75C0</span> <span class="err">.</span><span class="na">784</span><span class="err">.</span><span class="na">784</span> <span class="na">0</span> <span class="na">1</span><span class="err">.</span><span class="na">75</span> <span class="na">0h12</span><span class="err">.</span><span class="na">5C15</span><span class="err">.</span><span class="na">216</span> <span class="na">0</span> <span class="na">16</span> <span class="err">.</span><span class="na">784</span> <span class="na">16</span> <span class="na">1</span><span class="err">.</span><span class="na">75v9</span><span class="err">.</span><span class="na">5A1</span><span class="err">.</span><span class="na">75</span> <span class="na">1</span><span class="err">.</span><span class="na">75</span> <span class="na">0</span> <span class="na">0</span> <span class="na">1</span> <span class="na">14</span><span class="err">.</span><span class="na">25</span> <span class="na">13H8</span><span class="err">.</span><span class="na">06l-2</span><span class="err">.</span><span class="na">573</span> <span class="na">2</span><span class="err">.</span><span class="na">573A1</span><span class="err">.</span><span class="na">458</span> <span class="na">1</span><span class="err">.</span><span class="na">458</span> <span class="na">0</span> <span class="na">0</span> <span class="na">1</span> <span class="na">3</span> <span class="na">14</span><span class="err">.</span><span class="na">543V13H1</span><span class="err">.</span><span class="na">75A1</span><span class="err">.</span><span class="na">75</span> <span class="na">1</span><span class="err">.</span><span class="na">75</span> <span class="na">0</span> <span class="na">0</span> <span class="na">1</span> <span class="na">0</span> <span class="na">11</span><span class="err">.</span><span class="na">25Zm1</span><span class="err">.</span><span class="na">75-</span><span class="err">.</span><span class="na">25a</span><span class="err">.</span><span class="na">25</span><span class="err">.</span><span class="na">25</span> <span class="na">0</span> <span class="na">0</span> <span class="na">0-</span><span class="err">.</span><span class="na">25</span><span class="err">.</span><span class="na">25v9</span><span class="err">.</span><span class="na">5c0</span> <span class="err">.</span><span class="na">138</span><span class="err">.</span><span class="na">112</span><span class="err">.</span><span class="na">25</span><span class="err">.</span><span class="na">25</span><span class="err">.</span><span class="na">25h2a</span><span class="err">.</span><span class="na">75</span><span class="err">.</span><span class="na">75</span> <span class="na">0</span> <span class="na">0</span> <span class="na">1</span> <span class="err">.</span><span class="na">75</span><span class="err">.</span><span class="na">75v2</span><span class="err">.</span><span class="na">19l2</span><span class="err">.</span><span class="na">72-2</span><span class="err">.</span><span class="na">72a</span><span class="err">.</span><span class="na">749</span><span class="err">.</span><span class="na">749</span> <span class="na">0</span> <span class="na">0</span> <span class="na">1</span> <span class="err">.</span><span class="na">53-</span><span class="err">.</span><span class="na">22h6</span><span class="err">.</span><span class="na">5a</span><span class="err">.</span><span class="na">25</span><span class="err">.</span><span class="na">25</span> <span class="na">0</span> <span class="na">0</span> <span class="na">0</span> <span class="err">.</span><span class="na">25-</span><span class="err">.</span><span class="na">25v-9</span><span class="err">.</span><span class="na">5a</span><span class="err">.</span><span class="na">25</span><span class="err">.</span><span class="na">25</span> <span class="na">0</span> <span class="na">0</span> <span class="na">0-</span><span class="err">.</span><span class="na">25-</span><span class="err">.</span><span class="na">25Zm7</span> <span class="na">2</span><span class="err">.</span><span class="na">25v2</span><span class="err">.</span><span class="na">5a</span><span class="err">.</span><span class="na">75</span><span class="err">.</span><span class="na">75</span> <span class="na">0</span> <span class="na">0</span> <span class="na">1-1</span><span class="err">.</span><span class="na">5</span> <span class="na">0v-2</span><span class="err">.</span><span class="na">5a</span><span class="err">.</span><span class="na">75</span><span class="err">.</span><span class="na">75</span> <span class="na">0</span> <span class="na">0</span> <span class="na">1</span> <span class="na">1</span><span class="err">.</span><span class="na">5</span> <span class="na">0ZM9</span> <span class="na">9a1</span> <span class="na">1</span> <span class="na">0</span> <span class="na">1</span> <span class="na">1-2</span> <span class="na">0</span> <span class="na">1</span> <span class="na">1</span> <span class="na">0</span> <span class="na">0</span> <span class="na">1</span> <span class="na">2</span> <span class="na">0Z</span><span class="err">\&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">path</span><span class="p">&gt;</span>&#34;
</span></span><span class="line"><span class="cl">  &#34;warning&#34; &#34;<span class="p">&lt;</span><span class="nt">path</span> <span class="na">d</span><span class="o">=</span><span class="s">\&#34;M6.457</span> <span class="na">1</span><span class="err">.</span><span class="na">047c</span><span class="err">.</span><span class="na">659-1</span><span class="err">.</span><span class="na">234</span> <span class="na">2</span><span class="err">.</span><span class="na">427-1</span><span class="err">.</span><span class="na">234</span> <span class="na">3</span><span class="err">.</span><span class="na">086</span> <span class="na">0l6</span><span class="err">.</span><span class="na">082</span> <span class="na">11</span><span class="err">.</span><span class="na">378A1</span><span class="err">.</span><span class="na">75</span> <span class="na">1</span><span class="err">.</span><span class="na">75</span> <span class="na">0</span> <span class="na">0</span> <span class="na">1</span> <span class="na">14</span><span class="err">.</span><span class="na">082</span> <span class="na">15H1</span><span class="err">.</span><span class="na">918a1</span><span class="err">.</span><span class="na">75</span> <span class="na">1</span><span class="err">.</span><span class="na">75</span> <span class="na">0</span> <span class="na">0</span> <span class="na">1-1</span><span class="err">.</span><span class="na">543-2</span><span class="err">.</span><span class="na">575Zm1</span><span class="err">.</span><span class="na">763</span><span class="err">.</span><span class="na">707a</span><span class="err">.</span><span class="na">25</span><span class="err">.</span><span class="na">25</span> <span class="na">0</span> <span class="na">0</span> <span class="na">0-</span><span class="err">.</span><span class="na">44</span> <span class="na">0L1</span><span class="err">.</span><span class="na">698</span> <span class="na">13</span><span class="err">.</span><span class="na">132a</span><span class="err">.</span><span class="na">25</span><span class="err">.</span><span class="na">25</span> <span class="na">0</span> <span class="na">0</span> <span class="na">0</span> <span class="err">.</span><span class="na">22</span><span class="err">.</span><span class="na">368h12</span><span class="err">.</span><span class="na">164a</span><span class="err">.</span><span class="na">25</span><span class="err">.</span><span class="na">25</span> <span class="na">0</span> <span class="na">0</span> <span class="na">0</span> <span class="err">.</span><span class="na">22-</span><span class="err">.</span><span class="na">368Zm</span><span class="err">.</span><span class="na">53</span> <span class="na">3</span><span class="err">.</span><span class="na">996v2</span><span class="err">.</span><span class="na">5a</span><span class="err">.</span><span class="na">75</span><span class="err">.</span><span class="na">75</span> <span class="na">0</span> <span class="na">0</span> <span class="na">1-1</span><span class="err">.</span><span class="na">5</span> <span class="na">0v-2</span><span class="err">.</span><span class="na">5a</span><span class="err">.</span><span class="na">75</span><span class="err">.</span><span class="na">75</span> <span class="na">0</span> <span class="na">0</span> <span class="na">1</span> <span class="na">1</span><span class="err">.</span><span class="na">5</span> <span class="na">0ZM9</span> <span class="na">11a1</span> <span class="na">1</span> <span class="na">0</span> <span class="na">1</span> <span class="na">1-2</span> <span class="na">0</span> <span class="na">1</span> <span class="na">1</span> <span class="na">0</span> <span class="na">0</span> <span class="na">1</span> <span class="na">2</span> <span class="na">0Z</span><span class="err">\&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">path</span><span class="p">&gt;</span>&#34;
</span></span><span class="line"><span class="cl">  &#34;caution&#34; &#34;<span class="p">&lt;</span><span class="nt">path</span> <span class="na">d</span><span class="o">=</span><span class="s">\&#34;M4.47.22A.749.749</span> <span class="na">0</span> <span class="na">0</span> <span class="na">1</span> <span class="na">5</span> <span class="na">0h6c</span><span class="err">.</span><span class="na">199</span> <span class="na">0</span> <span class="err">.</span><span class="na">389</span><span class="err">.</span><span class="na">079</span><span class="err">.</span><span class="na">53</span><span class="err">.</span><span class="na">22l4</span><span class="err">.</span><span class="na">25</span> <span class="na">4</span><span class="err">.</span><span class="na">25c</span><span class="err">.</span><span class="na">141</span><span class="err">.</span><span class="na">14</span><span class="err">.</span><span class="na">22</span><span class="err">.</span><span class="na">331</span><span class="err">.</span><span class="na">22</span><span class="err">.</span><span class="na">53v6a</span><span class="err">.</span><span class="na">749</span><span class="err">.</span><span class="na">749</span> <span class="na">0</span> <span class="na">0</span> <span class="na">1-</span><span class="err">.</span><span class="na">22</span><span class="err">.</span><span class="na">53l-4</span><span class="err">.</span><span class="na">25</span> <span class="na">4</span><span class="err">.</span><span class="na">25A</span><span class="err">.</span><span class="na">749</span><span class="err">.</span><span class="na">749</span> <span class="na">0</span> <span class="na">0</span> <span class="na">1</span> <span class="na">11</span> <span class="na">16H5a</span><span class="err">.</span><span class="na">749</span><span class="err">.</span><span class="na">749</span> <span class="na">0</span> <span class="na">0</span> <span class="na">1-</span><span class="err">.</span><span class="na">53-</span><span class="err">.</span><span class="na">22L</span><span class="err">.</span><span class="na">22</span> <span class="na">11</span><span class="err">.</span><span class="na">53A</span><span class="err">.</span><span class="na">749</span><span class="err">.</span><span class="na">749</span> <span class="na">0</span> <span class="na">0</span> <span class="na">1</span> <span class="na">0</span> <span class="na">11V5c0-</span><span class="err">.</span><span class="na">199</span><span class="err">.</span><span class="na">079-</span><span class="err">.</span><span class="na">389</span><span class="err">.</span><span class="na">22-</span><span class="err">.</span><span class="na">53Zm</span><span class="err">.</span><span class="na">84</span> <span class="na">1</span><span class="err">.</span><span class="na">28L1</span><span class="err">.</span><span class="na">5</span> <span class="na">5</span><span class="err">.</span><span class="na">31v5</span><span class="err">.</span><span class="na">38l3</span><span class="err">.</span><span class="na">81</span> <span class="na">3</span><span class="err">.</span><span class="na">81h5</span><span class="err">.</span><span class="na">38l3</span><span class="err">.</span><span class="na">81-3</span><span class="err">.</span><span class="na">81V5</span><span class="err">.</span><span class="na">31L10</span><span class="err">.</span><span class="na">69</span> <span class="na">1</span><span class="err">.</span><span class="na">5ZM8</span> <span class="na">4a</span><span class="err">.</span><span class="na">75</span><span class="err">.</span><span class="na">75</span> <span class="na">0</span> <span class="na">0</span> <span class="na">1</span> <span class="err">.</span><span class="na">75</span><span class="err">.</span><span class="na">75v3</span><span class="err">.</span><span class="na">5a</span><span class="err">.</span><span class="na">75</span><span class="err">.</span><span class="na">75</span> <span class="na">0</span> <span class="na">0</span> <span class="na">1-1</span><span class="err">.</span><span class="na">5</span> <span class="na">0v-3</span><span class="err">.</span><span class="na">5A</span><span class="err">.</span><span class="na">75</span><span class="err">.</span><span class="na">75</span> <span class="na">0</span> <span class="na">0</span> <span class="na">1</span> <span class="na">8</span> <span class="na">4Zm0</span> <span class="na">8a1</span> <span class="na">1</span> <span class="na">0</span> <span class="na">1</span> <span class="na">1</span> <span class="na">0-2</span> <span class="na">1</span> <span class="na">1</span> <span class="na">0</span> <span class="na">0</span> <span class="na">1</span> <span class="na">0</span> <span class="na">2Z</span><span class="err">\&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">path</span><span class="p">&gt;</span>&#34;
</span></span><span class="line"><span class="cl">  &#34;error&#34; &#34;<span class="p">&lt;</span><span class="nt">path</span> <span class="na">d</span><span class="o">=</span><span class="s">\&#34;M4.47.22A.749.749</span> <span class="na">0</span> <span class="na">0</span> <span class="na">1</span> <span class="na">5</span> <span class="na">0h6c</span><span class="err">.</span><span class="na">199</span> <span class="na">0</span> <span class="err">.</span><span class="na">389</span><span class="err">.</span><span class="na">079</span><span class="err">.</span><span class="na">53</span><span class="err">.</span><span class="na">22l4</span><span class="err">.</span><span class="na">25</span> <span class="na">4</span><span class="err">.</span><span class="na">25c</span><span class="err">.</span><span class="na">141</span><span class="err">.</span><span class="na">14</span><span class="err">.</span><span class="na">22</span><span class="err">.</span><span class="na">331</span><span class="err">.</span><span class="na">22</span><span class="err">.</span><span class="na">53v6a</span><span class="err">.</span><span class="na">749</span><span class="err">.</span><span class="na">749</span> <span class="na">0</span> <span class="na">0</span> <span class="na">1-</span><span class="err">.</span><span class="na">22</span><span class="err">.</span><span class="na">53l-4</span><span class="err">.</span><span class="na">25</span> <span class="na">4</span><span class="err">.</span><span class="na">25A</span><span class="err">.</span><span class="na">749</span><span class="err">.</span><span class="na">749</span> <span class="na">0</span> <span class="na">0</span> <span class="na">1</span> <span class="na">11</span> <span class="na">16H5a</span><span class="err">.</span><span class="na">749</span><span class="err">.</span><span class="na">749</span> <span class="na">0</span> <span class="na">0</span> <span class="na">1-</span><span class="err">.</span><span class="na">53-</span><span class="err">.</span><span class="na">22L</span><span class="err">.</span><span class="na">22</span> <span class="na">11</span><span class="err">.</span><span class="na">53A</span><span class="err">.</span><span class="na">749</span><span class="err">.</span><span class="na">749</span> <span class="na">0</span> <span class="na">0</span> <span class="na">1</span> <span class="na">0</span> <span class="na">11V5c0-</span><span class="err">.</span><span class="na">199</span><span class="err">.</span><span class="na">079-</span><span class="err">.</span><span class="na">389</span><span class="err">.</span><span class="na">22-</span><span class="err">.</span><span class="na">53Zm</span><span class="err">.</span><span class="na">84</span> <span class="na">1</span><span class="err">.</span><span class="na">28L1</span><span class="err">.</span><span class="na">5</span> <span class="na">5</span><span class="err">.</span><span class="na">31v5</span><span class="err">.</span><span class="na">38l3</span><span class="err">.</span><span class="na">81</span> <span class="na">3</span><span class="err">.</span><span class="na">81h5</span><span class="err">.</span><span class="na">38l3</span><span class="err">.</span><span class="na">81-3</span><span class="err">.</span><span class="na">81V5</span><span class="err">.</span><span class="na">31L10</span><span class="err">.</span><span class="na">69</span> <span class="na">1</span><span class="err">.</span><span class="na">5ZM8</span> <span class="na">4a</span><span class="err">.</span><span class="na">75</span><span class="err">.</span><span class="na">75</span> <span class="na">0</span> <span class="na">0</span> <span class="na">1</span> <span class="err">.</span><span class="na">75</span><span class="err">.</span><span class="na">75v3</span><span class="err">.</span><span class="na">5a</span><span class="err">.</span><span class="na">75</span><span class="err">.</span><span class="na">75</span> <span class="na">0</span> <span class="na">0</span> <span class="na">1-1</span><span class="err">.</span><span class="na">5</span> <span class="na">0v-3</span><span class="err">.</span><span class="na">5A</span><span class="err">.</span><span class="na">75</span><span class="err">.</span><span class="na">75</span> <span class="na">0</span> <span class="na">0</span> <span class="na">1</span> <span class="na">8</span> <span class="na">4Zm0</span> <span class="na">8a1</span> <span class="na">1</span> <span class="na">0</span> <span class="na">1</span> <span class="na">1</span> <span class="na">0-2</span> <span class="na">1</span> <span class="na">1</span> <span class="na">0</span> <span class="na">0</span> <span class="na">1</span> <span class="na">0</span> <span class="na">2Z</span><span class="err">\&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">path</span><span class="p">&gt;</span>&#34;
</span></span><span class="line"><span class="cl">}}
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">{{
</span></span><span class="line"><span class="cl">  $default := &#34;<span class="p">&lt;</span><span class="nt">path</span> <span class="na">d</span><span class="o">=</span><span class="s">\&#34;M0</span> <span class="na">8a8</span> <span class="na">8</span> <span class="na">0</span> <span class="na">1</span> <span class="na">1</span> <span class="na">16</span> <span class="na">0A8</span> <span class="na">8</span> <span class="na">0</span> <span class="na">0</span> <span class="na">1</span> <span class="na">0</span> <span class="na">8Zm8-6</span><span class="err">.</span><span class="na">5a6</span><span class="err">.</span><span class="na">5</span> <span class="na">6</span><span class="err">.</span><span class="na">5</span> <span class="na">0</span> <span class="na">1</span> <span class="na">0</span> <span class="na">0</span> <span class="na">13</span> <span class="na">6</span><span class="err">.</span><span class="na">5</span> <span class="na">6</span><span class="err">.</span><span class="na">5</span> <span class="na">0</span> <span class="na">0</span> <span class="na">0</span> <span class="na">0-13ZM6</span><span class="err">.</span><span class="na">5</span> <span class="na">7</span><span class="err">.</span><span class="na">75A</span><span class="err">.</span><span class="na">75</span><span class="err">.</span><span class="na">75</span> <span class="na">0</span> <span class="na">0</span> <span class="na">1</span> <span class="na">7</span><span class="err">.</span><span class="na">25</span> <span class="na">7h1a</span><span class="err">.</span><span class="na">75</span><span class="err">.</span><span class="na">75</span> <span class="na">0</span> <span class="na">0</span> <span class="na">1</span> <span class="err">.</span><span class="na">75</span><span class="err">.</span><span class="na">75v2</span><span class="err">.</span><span class="na">75h</span><span class="err">.</span><span class="na">25a</span><span class="err">.</span><span class="na">75</span><span class="err">.</span><span class="na">75</span> <span class="na">0</span> <span class="na">0</span> <span class="na">1</span> <span class="na">0</span> <span class="na">1</span><span class="err">.</span><span class="na">5h-2a</span><span class="err">.</span><span class="na">75</span><span class="err">.</span><span class="na">75</span> <span class="na">0</span> <span class="na">0</span> <span class="na">1</span> <span class="na">0-1</span><span class="err">.</span><span class="na">5h</span><span class="err">.</span><span class="na">25v-2h-</span><span class="err">.</span><span class="na">25a</span><span class="err">.</span><span class="na">75</span><span class="err">.</span><span class="na">75</span> <span class="na">0</span> <span class="na">0</span> <span class="na">1-</span><span class="err">.</span><span class="na">75-</span><span class="err">.</span><span class="na">75ZM8</span> <span class="na">6a1</span> <span class="na">1</span> <span class="na">0</span> <span class="na">1</span> <span class="na">1</span> <span class="na">0-2</span> <span class="na">1</span> <span class="na">1</span> <span class="na">0</span> <span class="na">0</span> <span class="na">1</span> <span class="na">0</span> <span class="na">2Z</span><span class="err">\&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">path</span><span class="p">&gt;</span>&#34;
</span></span><span class="line"><span class="cl">}}
</span></span><span class="line"><span class="cl">  
</span></span><span class="line"><span class="cl">  
</span></span><span class="line"><span class="cl">{{ if eq .Type &#34;alert&#34; }}
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">blockquote</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;alert-blockquote alert-{{ .AlertType }}&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">p</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;alert-heading&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">svg</span> <span class="na">xmlns</span><span class="o">=</span><span class="s">&#34;http://www.w3.org/2000/svg&#34;</span> <span class="na">viewBox</span><span class="o">=</span><span class="s">&#34;0 0 16 16&#34;</span> <span class="na">width</span><span class="o">=</span><span class="s">&#34;16&#34;</span> <span class="na">height</span><span class="o">=</span><span class="s">&#34;16&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      {{- $alertType := index $alertTypes .AlertType | default $default }}
</span></span><span class="line"><span class="cl">      {{ $alertType | safeHTML }}
</span></span><span class="line"><span class="cl">    <span class="p">&lt;/</span><span class="nt">svg</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">span</span><span class="p">&gt;</span>{{ or (i18n .AlertType) (title .AlertType) }}<span class="p">&lt;/</span><span class="nt">span</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;/</span><span class="nt">p</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  {{ .Text | safeHTML }}
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">blockquote</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">{{ else }}
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">blockquote</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  {{ .Text | safeHTML }}
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">blockquote</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">{{ end }}</span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>css</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="p">.</span><span class="nc">alert-blockquote</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nv">--title-color</span><span class="p">:</span> <span class="mh">#fff</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="nv">--content-color</span><span class="p">:</span> <span class="kc">inherit</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">padding</span><span class="p">:</span> <span class="mi">18</span><span class="kt">px</span> <span class="mi">18</span><span class="kt">px</span> <span class="mi">10</span><span class="kt">px</span> <span class="mi">18</span><span class="kt">px</span> <span class="cp">!important</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">line-height</span><span class="p">:</span> <span class="mi">24</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">margin</span><span class="p">:</span> <span class="mi">1</span><span class="kt">rem</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">border-radius</span><span class="p">:</span> <span class="mi">4</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">color</span><span class="p">:</span> <span class="nf">var</span><span class="p">(</span><span class="o">--</span><span class="n">content</span><span class="o">-</span><span class="kc">color</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="c">/* border-left: none !important; */</span>
</span></span><span class="line"><span class="cl">  <span class="c">/* border: 1px solid black; */</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">dark</span> <span class="p">.</span><span class="nc">alert-blockquote</span> <span class="o">*,</span>
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">alert-blockquote</span> <span class="o">*</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">color</span><span class="p">:</span> <span class="nf">var</span><span class="p">(</span><span class="o">--</span><span class="n">content</span><span class="o">-</span><span class="kc">color</span><span class="p">)</span> <span class="cp">!important</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">post-content</span> <span class="nt">blockquote</span><span class="o">%</span><span class="nt">3Ep</span><span class="o">&gt;</span><span class="nt">p</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">padding</span><span class="p">:</span> <span class="kc">unset</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">alert-blockquote</span> <span class="p">.</span><span class="nc">alert-heading</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">margin</span><span class="p">:</span> <span class="mi">-18</span><span class="kt">px</span> <span class="mi">-18</span><span class="kt">px</span> <span class="mi">12</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">padding</span><span class="p">:</span> <span class="mi">10</span><span class="kt">px</span> <span class="mi">18</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">border-radius</span><span class="p">:</span> <span class="mi">4</span><span class="kt">px</span> <span class="mi">4</span><span class="kt">px</span> <span class="mi">0</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">font-weight</span><span class="p">:</span> <span class="mi">600</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">color</span><span class="p">:</span> <span class="nf">var</span><span class="p">(</span><span class="o">--</span><span class="n">title</span><span class="o">-</span><span class="kc">color</span><span class="p">)</span> <span class="cp">!important</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">display</span><span class="p">:</span> <span class="kc">flex</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">align-items</span><span class="p">:</span> <span class="kc">center</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">alert-blockquote</span> <span class="p">.</span><span class="nc">alert-heading</span> <span class="nt">svg</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">width</span><span class="p">:</span> <span class="mi">1</span><span class="kt">em</span> <span class="cp">!important</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">height</span><span class="p">:</span> <span class="mi">1</span><span class="kt">em</span> <span class="cp">!important</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">margin-right</span><span class="p">:</span> <span class="mf">0.5</span><span class="kt">rem</span> <span class="cp">!important</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="n">fill</span><span class="p">:</span> <span class="kc">currentColor</span> <span class="cp">!important</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">alert-blockquote</span> <span class="nt">p</span><span class="p">:</span><span class="nd">last-child</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">margin-bottom</span><span class="p">:</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c">/* Light theme */</span>
</span></span><span class="line"><span class="cl"><span class="c">/* default */</span>
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">alert-blockquote</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">border-top</span><span class="p">:</span><span class="kc">unset</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="c">/* border: 1px solid #166dd0; */</span>
</span></span><span class="line"><span class="cl">  <span class="c">/* --title-background-color: rgba(221, 233, 244, 0.631); */</span>
</span></span><span class="line"><span class="cl">  <span class="nv">--content-background-color</span><span class="p">:</span> <span class="nb">rgba</span><span class="p">(</span><span class="mi">221</span><span class="p">,</span> <span class="mi">233</span><span class="p">,</span> <span class="mi">244</span><span class="p">,</span> <span class="mf">0.602</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">alert-blockquote</span> <span class="o">&gt;</span> <span class="p">.</span><span class="nc">alert-heading</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="c">/* border-bottom: 1px dashed #166dd07c; */</span>
</span></span><span class="line"><span class="cl">  <span class="k">color</span><span class="p">:</span> <span class="mh">#0969da</span> <span class="cp">!important</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c">/* note */</span>
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">alert-blockquote</span><span class="p">.</span><span class="nc">alert-note</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="c">/* border: 1px solid #166dd0; */</span>
</span></span><span class="line"><span class="cl">  <span class="c">/* border-left-color: #0969da !important; */</span>
</span></span><span class="line"><span class="cl">  <span class="c">/* --title-background-color: rgba(221, 233, 244, 0.631); */</span>
</span></span><span class="line"><span class="cl">  <span class="nv">--content-background-color</span><span class="p">:</span> <span class="nb">rgba</span><span class="p">(</span><span class="mi">221</span><span class="p">,</span> <span class="mi">233</span><span class="p">,</span> <span class="mi">244</span><span class="p">,</span> <span class="mf">0.602</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">alert-blockquote</span><span class="p">.</span><span class="nc">alert-note</span> <span class="p">.</span><span class="nc">alert-heading</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">color</span><span class="p">:</span> <span class="mh">#0969da</span> <span class="cp">!important</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c">/* tip */</span>
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">alert-blockquote</span><span class="p">.</span><span class="nc">alert-tip</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="c">/* border: 1px solid #1a7f37; */</span>
</span></span><span class="line"><span class="cl">  <span class="c">/* --title-background-color: rgb(173,193,182); */</span>
</span></span><span class="line"><span class="cl">  <span class="nv">--content-background-color</span><span class="p">:</span> <span class="nb">rgba</span><span class="p">(</span><span class="mi">222</span><span class="p">,</span> <span class="mi">240</span><span class="p">,</span> <span class="mi">223</span><span class="p">,</span> <span class="mf">0.7</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">alert-blockquote</span><span class="p">.</span><span class="nc">alert-tip</span> <span class="p">.</span><span class="nc">alert-heading</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">color</span><span class="p">:</span> <span class="mh">#1a7f37</span> <span class="cp">!important</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="c">/* border-bottom: 1px dashed #1a7f37; */</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c">/* important */</span>
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">alert-blockquote</span><span class="p">.</span><span class="nc">alert-important</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="c">/* border: 1px solid #8250df; */</span>
</span></span><span class="line"><span class="cl">  <span class="c">/* border-left-color: #8250df !important; */</span>
</span></span><span class="line"><span class="cl">  <span class="c">/* --title-background-color: #6843ae7c; */</span>
</span></span><span class="line"><span class="cl">  <span class="nv">--content-background-color</span><span class="p">:</span> <span class="nb">rgba</span><span class="p">(</span><span class="mi">235</span><span class="p">,</span> <span class="mi">227</span><span class="p">,</span> <span class="mi">245</span><span class="p">,</span> <span class="mf">0.9</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">alert-blockquote</span><span class="p">.</span><span class="nc">alert-important</span> <span class="p">.</span><span class="nc">alert-heading</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">color</span><span class="p">:</span> <span class="mh">#8250df</span> <span class="cp">!important</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="c">/* border-bottom: 1px dashed #8250df; */</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c">/* warning */</span>
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">alert-blockquote</span><span class="p">.</span><span class="nc">alert-warning</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="c">/* border: 1px solid #9a6700; */</span>
</span></span><span class="line"><span class="cl">  <span class="c">/* border-left-color: #9a6700 !important; */</span>
</span></span><span class="line"><span class="cl">  <span class="c">/* --title-background-color: rgb(232, 198, 140); */</span>
</span></span><span class="line"><span class="cl">  <span class="nv">--content-background-color</span><span class="p">:</span> <span class="nb">rgba</span><span class="p">(</span><span class="mi">243</span><span class="p">,</span> <span class="mi">232</span><span class="p">,</span> <span class="mi">222</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">alert-blockquote</span><span class="p">.</span><span class="nc">alert-warning</span> <span class="p">.</span><span class="nc">alert-heading</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">color</span><span class="p">:</span> <span class="mh">#9a6700</span> <span class="cp">!important</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="c">/* border-bottom: 1px dashed #9a6700; */</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c">/* caution */</span>
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">alert-blockquote</span><span class="p">.</span><span class="nc">alert-error</span><span class="o">,</span>
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">alert-blockquote</span><span class="p">.</span><span class="nc">alert-caution</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="c">/* border: 1px solid #cf222e; */</span>
</span></span><span class="line"><span class="cl">  <span class="c">/* border-left-color: #cf222e !important; */</span>
</span></span><span class="line"><span class="cl">  <span class="c">/* --title-background-color: rgb(244, 224, 223,0.5); */</span>
</span></span><span class="line"><span class="cl">  <span class="nv">--content-background-color</span><span class="p">:</span> <span class="nb">rgba</span><span class="p">(</span><span class="mi">243</span><span class="p">,</span> <span class="mi">207</span><span class="p">,</span> <span class="mi">205</span><span class="p">,</span> <span class="mf">0.9</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">alert-blockquote</span><span class="p">.</span><span class="nc">alert-error</span> <span class="p">.</span><span class="nc">alert-heading</span><span class="o">,</span>
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">alert-blockquote</span><span class="p">.</span><span class="nc">alert-caution</span> <span class="p">.</span><span class="nc">alert-heading</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">color</span><span class="p">:</span> <span class="mh">#cf222e</span> <span class="cp">!important</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="c">/* border-bottom: 1px dashed #cf222e; */</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c">/* Dark theme */</span>
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">dark</span> <span class="p">.</span><span class="nc">alert-blockquote</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">border-top</span><span class="p">:</span><span class="kc">unset</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="c">/* --content-color: #d0d7dd; */</span>
</span></span><span class="line"><span class="cl">  <span class="c">/* --title-background-color: #5151527c; */</span>
</span></span><span class="line"><span class="cl">  <span class="nv">--content-background-color</span><span class="p">:</span> <span class="nb">rgba</span><span class="p">(</span><span class="mi">22</span><span class="p">,</span> <span class="mi">37</span><span class="p">,</span> <span class="mi">50</span><span class="p">,</span> <span class="mf">0.8</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">dark</span> <span class="p">.</span><span class="nc">alert-blockquote</span> <span class="p">.</span><span class="nc">alert-heading</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">color</span><span class="p">:</span> <span class="mh">#58a6ff</span> <span class="cp">!important</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">dark</span> <span class="p">.</span><span class="nc">alert-blockquote</span><span class="p">.</span><span class="nc">alert-note</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="c">/* --title-background-color: #58a6ff7c; */</span>
</span></span><span class="line"><span class="cl">  <span class="nv">--content-background-color</span><span class="p">:</span> <span class="nb">rgba</span><span class="p">(</span><span class="mi">22</span><span class="p">,</span> <span class="mi">37</span><span class="p">,</span> <span class="mi">50</span><span class="p">,</span> <span class="mf">0.8</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">dark</span> <span class="p">.</span><span class="nc">alert-blockquote</span><span class="p">.</span><span class="nc">alert-note</span> <span class="p">.</span><span class="nc">alert-heading</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">color</span><span class="p">:</span> <span class="mh">#58a6ff</span> <span class="cp">!important</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">dark</span> <span class="p">.</span><span class="nc">alert-blockquote</span><span class="p">.</span><span class="nc">alert-tip</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="c">/* --title-background-color: #82bd8a7c; */</span>
</span></span><span class="line"><span class="cl">  <span class="nv">--content-background-color</span><span class="p">:</span> <span class="nb">rgba</span><span class="p">(</span><span class="mi">55</span><span class="p">,</span> <span class="mi">84</span><span class="p">,</span> <span class="mi">56</span><span class="p">,</span> <span class="mf">0.7</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">dark</span> <span class="p">.</span><span class="nc">alert-blockquote</span><span class="p">.</span><span class="nc">alert-tip</span> <span class="p">.</span><span class="nc">alert-heading</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">color</span><span class="p">:</span> <span class="mh">#3fb950</span> <span class="cp">!important</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">dark</span> <span class="p">.</span><span class="nc">alert-blockquote</span><span class="p">.</span><span class="nc">alert-important</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="c">/* --title-background-color: #9173c57c; */</span>
</span></span><span class="line"><span class="cl">  <span class="nv">--content-background-color</span><span class="p">:</span> <span class="nb">rgba</span><span class="p">(</span><span class="mi">46</span><span class="p">,</span> <span class="mi">32</span><span class="p">,</span> <span class="mi">62</span><span class="p">,</span> <span class="mf">0.9</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">dark</span> <span class="p">.</span><span class="nc">alert-blockquote</span><span class="p">.</span><span class="nc">alert-important</span> <span class="p">.</span><span class="nc">alert-heading</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">color</span><span class="p">:</span> <span class="mh">#8d62d8</span> <span class="cp">!important</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">dark</span> <span class="p">.</span><span class="nc">alert-blockquote</span><span class="p">.</span><span class="nc">alert-warning</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="c">/* --title-background-color: #d1b068a0; */</span>
</span></span><span class="line"><span class="cl">  <span class="nv">--content-background-color</span><span class="p">:</span> <span class="nb">rgb</span><span class="p">(</span><span class="mi">84</span><span class="p">,</span> <span class="mi">68</span><span class="p">,</span> <span class="mi">55</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">dark</span> <span class="p">.</span><span class="nc">alert-blockquote</span><span class="p">.</span><span class="nc">alert-warning</span> <span class="p">.</span><span class="nc">alert-heading</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">color</span><span class="p">:</span> <span class="mh">#d1b271</span> <span class="cp">!important</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">dark</span> <span class="p">.</span><span class="nc">alert-blockquote</span><span class="p">.</span><span class="nc">alert-error</span><span class="o">,</span>
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">dark</span> <span class="p">.</span><span class="nc">alert-blockquote</span><span class="p">.</span><span class="nc">alert-caution</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="c">/* --title-background-color: #c94a43; */</span>
</span></span><span class="line"><span class="cl">  <span class="nv">--content-background-color</span><span class="p">:</span> <span class="nb">rgba</span><span class="p">(</span><span class="mi">108</span><span class="p">,</span> <span class="mi">57</span><span class="p">,</span> <span class="mi">54</span><span class="p">,</span> <span class="mf">0.9</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">dark</span> <span class="p">.</span><span class="nc">alert-blockquote</span><span class="p">.</span><span class="nc">alert-error</span> <span class="p">.</span><span class="nc">alert-heading</span><span class="o">,</span>
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">dark</span> <span class="p">.</span><span class="nc">alert-blockquote</span><span class="p">.</span><span class="nc">alert-caution</span> <span class="p">.</span><span class="nc">alert-heading</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">color</span><span class="p">:</span> <span class="mh">#ff9791</span> <span class="cp">!important</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">alert-blockquote</span> <span class="p">.</span><span class="nc">alert-heading</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">background</span><span class="p">:</span> <span class="nf">var</span><span class="p">(</span><span class="o">--</span><span class="n">title</span><span class="o">-</span><span class="n">background</span><span class="o">-</span><span class="kc">color</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">alert-blockquote</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">background</span><span class="p">:</span> <span class="nf">var</span><span class="p">(</span><span class="o">--</span><span class="n">content</span><span class="o">-</span><span class="n">background</span><span class="o">-</span><span class="kc">color</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nt">blockquote</span><span class="p">:</span><span class="nd">not</span><span class="o">(</span><span class="p">.</span><span class="nc">alert-blockquote</span><span class="o">)</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">color</span><span class="p">:</span> <span class="mh">#a02222</span><span class="n">c2</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">border-top</span><span class="p">:</span> <span class="mi">2</span><span class="kt">px</span> <span class="kc">solid</span>  <span class="mh">#9c1e1e</span><span class="n">c2</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">font-size</span><span class="p">:</span> <span class="mf">0.9</span><span class="kt">rem</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">font-style</span><span class="p">:</span> <span class="kc">italic</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>源码也都已经在 Github 中分享。</p>
<h2 id="change-default-renders-style-改变一些默认样式">Change Default Renders&rsquo; Style 改变一些默认样式</h2>
<p>除了上述 markdown 基本单元的渲染调整，表格的样式也不是特别美观，但是由于表格本身的 html 模版已经不在需要调整，因此这里仅对其 css 样式做调整。</p>
<h3 id="tables-表格样式调整">Tables 表格样式调整</h3>
<p>默认的表格本身主要存在以下的一些问题：</p>
<ul>
<li>非全宽&amp;不居中：这里考虑直接调整为全宽；</li>
<li>样式单调：可以按照需求调整为三线表或者调整一下标题栏等；</li>
<li>可以添加 Hover 效果来优化交互；</li>
</ul>
<p>这里通过将 <code>display</code> 调整为 <code>table</code> 来支持全宽，同时通过 <code>overflow</code> 和 <code>wordbreak</code> 等属性来自适应格子宽度避免溢出 <span class="sidenote-number"><small class="sidenote"><a href="https://discourse.gohugo.io/t/responsive-tables-in-markdown/10639/8" target="_blank" rel="noopener">Responsive tables in markdown - support - HUGO</a></small></span> <span class="sidenote-number"><small class="sidenote"><a href="https://stackoverflow.com/questions/19794211/horizontal-scroll-on-overflow-of-table/62451601#62451601" target="_blank" rel="noopener">html - Horizontal scroll on overflow of table - Stack Overflow</a></small></span> ；</p>
<p>样式代码如下，编写的时候要避免 table 属性对其他元素的影响，特别是代码块，因此需要用 not 属性做一些排除：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>css</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="c">/* make the table fully wide  &amp; style */</span>
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">post-content</span> <span class="nt">table</span><span class="p">:</span><span class="nd">not</span><span class="o">(</span><span class="p">.</span><span class="nc">lntable</span> <span class="p">.</span><span class="nc">highlighttable</span><span class="o">,</span><span class="p">.</span><span class="nc">highlight</span> <span class="nt">table</span><span class="o">,</span><span class="p">.</span><span class="nc">gist</span> <span class="p">.</span><span class="nc">highlight</span><span class="o">)</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">display</span><span class="p">:</span> <span class="kc">table</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">background-color</span><span class="p">:</span> <span class="kc">transparent</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">border-radius</span><span class="p">:</span> <span class="mi">6</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">border</span><span class="p">:</span> <span class="mi">1</span><span class="kt">px</span> <span class="kc">solid</span> <span class="kc">black</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">outline</span><span class="p">:</span> <span class="mi">2</span><span class="kt">px</span> <span class="kc">solid</span> <span class="kc">black</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">overflow-x</span><span class="p">:</span> <span class="kc">auto</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">table-layout</span><span class="p">:</span> <span class="kc">fixed</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">word-break</span><span class="p">:</span> <span class="n">break-all</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="c">/* responsive ref */</span>
</span></span><span class="line"><span class="cl"><span class="c">/* ref: https://discourse.gohugo.io/t/responsive-tables-in-markdown/10639/8 */</span>
</span></span><span class="line"><span class="cl"><span class="c">/* ref: https://stackoverflow.com/questions/19794211/horizontal-scroll-on-overflow-of-table/62451601#62451601 */</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">dark</span> <span class="p">.</span><span class="nc">post-content</span> <span class="nt">table</span><span class="p">:</span><span class="nd">not</span><span class="o">(</span><span class="p">.</span><span class="nc">lntable</span> <span class="p">.</span><span class="nc">highlighttable</span><span class="o">,</span><span class="p">.</span><span class="nc">highlight</span> <span class="nt">table</span><span class="o">,</span><span class="p">.</span><span class="nc">gist</span> <span class="p">.</span><span class="nc">highlight</span><span class="o">)</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">outline</span><span class="p">:</span> <span class="mi">2</span><span class="kt">px</span> <span class="kc">solid</span> <span class="nb">rgb</span><span class="p">(</span><span class="mi">54</span><span class="p">,</span> <span class="mi">156</span><span class="p">,</span> <span class="mi">95</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">post-content</span> <span class="nt">table</span><span class="p">:</span><span class="nd">not</span><span class="o">(</span><span class="p">.</span><span class="nc">lntable</span> <span class="p">.</span><span class="nc">highlighttable</span><span class="o">,</span><span class="p">.</span><span class="nc">highlight</span> <span class="nt">table</span><span class="o">,</span><span class="p">.</span><span class="nc">gist</span> <span class="p">.</span><span class="nc">highlight</span><span class="o">)</span> <span class="nt">thead</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">background-color</span><span class="p">:</span> <span class="mh">#545d7b</span><span class="mi">8</span><span class="n">a</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">dark</span> <span class="p">.</span><span class="nc">post-content</span> <span class="nt">table</span><span class="p">:</span><span class="nd">not</span><span class="o">(</span><span class="p">.</span><span class="nc">lntable</span> <span class="p">.</span><span class="nc">highlighttable</span><span class="o">,</span><span class="p">.</span><span class="nc">highlight</span> <span class="nt">table</span><span class="o">,</span><span class="p">.</span><span class="nc">gist</span> <span class="p">.</span><span class="nc">highlight</span><span class="o">)</span> <span class="nt">thead</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">background-color</span><span class="p">:</span> <span class="nb">rgb</span><span class="p">(</span><span class="mi">62</span><span class="p">,</span> <span class="mi">62</span><span class="p">,</span> <span class="mi">62</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">post-content</span> <span class="nt">table</span><span class="p">:</span><span class="nd">not</span><span class="o">(</span><span class="p">.</span><span class="nc">lntable</span> <span class="p">.</span><span class="nc">highlighttable</span><span class="o">,</span><span class="p">.</span><span class="nc">highlight</span> <span class="nt">table</span><span class="o">,</span><span class="p">.</span><span class="nc">gist</span> <span class="p">.</span><span class="nc">highlight</span><span class="o">)</span> <span class="nt">td</span><span class="o">,</span>
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">post-content</span> <span class="nt">table</span><span class="p">:</span><span class="nd">not</span><span class="o">(</span><span class="p">.</span><span class="nc">lntable</span> <span class="p">.</span><span class="nc">highlighttable</span><span class="o">,</span><span class="p">.</span><span class="nc">highlight</span> <span class="nt">table</span><span class="o">,</span><span class="p">.</span><span class="nc">gist</span> <span class="p">.</span><span class="nc">highlight</span><span class="o">)</span> <span class="nt">tr</span><span class="o">,</span>
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">post-content</span> <span class="nt">table</span><span class="p">:</span><span class="nd">not</span><span class="o">(</span><span class="p">.</span><span class="nc">lntable</span> <span class="p">.</span><span class="nc">highlighttable</span><span class="o">,</span><span class="p">.</span><span class="nc">highlight</span> <span class="nt">table</span><span class="o">,</span><span class="p">.</span><span class="nc">gist</span> <span class="p">.</span><span class="nc">highlight</span><span class="o">)</span> <span class="nt">th</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">border-bottom</span><span class="p">:</span> <span class="kc">unset</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">border</span><span class="p">:</span> <span class="mi">1</span><span class="kt">px</span> <span class="kc">solid</span> <span class="kc">black</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">post-content</span> <span class="nt">table</span><span class="p">:</span><span class="nd">not</span><span class="o">(</span><span class="p">.</span><span class="nc">lntable</span> <span class="p">.</span><span class="nc">highlighttable</span><span class="o">,</span><span class="p">.</span><span class="nc">highlight</span> <span class="nt">table</span><span class="o">,</span><span class="p">.</span><span class="nc">gist</span> <span class="p">.</span><span class="nc">highlight</span><span class="o">)</span> <span class="nt">td</span><span class="p">:</span><span class="nd">hover</span><span class="o">,</span>
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">post-content</span> <span class="nt">table</span><span class="p">:</span><span class="nd">not</span><span class="o">(</span><span class="p">.</span><span class="nc">lntable</span> <span class="p">.</span><span class="nc">highlighttable</span><span class="o">,</span><span class="p">.</span><span class="nc">highlight</span> <span class="nt">table</span><span class="o">,</span><span class="p">.</span><span class="nc">gist</span> <span class="p">.</span><span class="nc">highlight</span><span class="o">)</span> <span class="nt">td</span><span class="p">:</span><span class="nd">focus</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">background-color</span><span class="p">:</span> <span class="nb">rgba</span><span class="p">(</span><span class="mi">170</span><span class="p">,</span> <span class="mi">217</span><span class="p">,</span> <span class="mi">248</span><span class="p">,</span> <span class="mf">0.8</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="c">/* transform: scale(1.1); */</span>
</span></span><span class="line"><span class="cl">  <span class="c">/* border: 2px solid black; */</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">dark</span> <span class="p">.</span><span class="nc">post-content</span> <span class="nt">table</span><span class="p">:</span><span class="nd">not</span><span class="o">(</span><span class="p">.</span><span class="nc">lntable</span> <span class="p">.</span><span class="nc">highlighttable</span><span class="o">,</span><span class="p">.</span><span class="nc">highlight</span> <span class="nt">table</span><span class="o">,</span><span class="p">.</span><span class="nc">gist</span> <span class="p">.</span><span class="nc">highlight</span><span class="o">)</span> <span class="nt">td</span><span class="p">:</span><span class="nd">hover</span><span class="o">,</span>
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">dark</span> <span class="p">.</span><span class="nc">post-content</span> <span class="nt">table</span><span class="p">:</span><span class="nd">not</span><span class="o">(</span><span class="p">.</span><span class="nc">lntable</span> <span class="p">.</span><span class="nc">highlighttable</span><span class="o">,</span><span class="p">.</span><span class="nc">highlight</span> <span class="nt">table</span><span class="o">,</span><span class="p">.</span><span class="nc">gist</span> <span class="p">.</span><span class="nc">highlight</span><span class="o">)</span> <span class="nt">td</span><span class="p">:</span><span class="nd">focus</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">background-color</span><span class="p">:</span> <span class="nb">rgb</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mf">0.7</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="c">/* transform: scale(1.1); */</span>
</span></span><span class="line"><span class="cl">  <span class="c">/* border: 2px solid black; */</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><h2 id="fi">Fi</h2>
<blockquote>
<p>有错误欢迎指正和交流，感兴趣的也欢迎去 github 上点个 star，不胜感激；</p>
</blockquote>
]]></content:encoded>
    </item>
    <item>
      <title>调整PaperMod的页面结构以及新增功能</title>
      <link>https://aikenh.cn/posts/%E8%B0%83%E6%95%B4papermod%E7%9A%84%E9%A1%B5%E9%9D%A2%E7%BB%93%E6%9E%84%E4%BB%A5%E5%8F%8A%E6%96%B0%E5%A2%9E%E5%8A%9F%E8%83%BD/</link>
      <pubDate>Sun, 15 Dec 2024 16:52:43 +0000</pubDate>
      <guid>https://aikenh.cn/posts/%E8%B0%83%E6%95%B4papermod%E7%9A%84%E9%A1%B5%E9%9D%A2%E7%BB%93%E6%9E%84%E4%BB%A5%E5%8F%8A%E6%96%B0%E5%A2%9E%E5%8A%9F%E8%83%BD/</guid>
      <description>进一步对PaperMod主题修改，设置侧边目录，侧边导航栏，评论区等功能</description>
      <content:encoded><![CDATA[


  
  

<blockquote class="alert-blockquote alert-summary">
  <p class="alert-heading">
    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16">
      <path d="M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"></path>
    </svg>
    <span>Summary</span>
  </p>
  <p>除了基础的样式和功能，本篇介绍一些会改变原本页面结构的样式调整，或是支持一些除了 markdown 渲染外的一些额外的功能。</p>

</blockquote>
<h2 id="assign-unique-classname-for-pages-给页面注册单独的类名">Assign Unique ClassName for Pages 给页面注册单独的类名</h2>
<p>在进行一些比较复杂的样式设置之前，为了避免样式会影响到预期之外的页面，因此通过 hugo 中的 go-template 语法判断页面类型后，通过修改原有模版，给搜索，时间线，profile 等页面注册一个单独的类名。</p>
<p>修改 <code>themes/PaperMod/layouts/_default/baseof.html</code>，将其中对应部分替换为如下内容：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>html</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">body</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;
</span></span></span><span class="line"><span class="cl"><span class="s">{{- if (or (ne .Kind `page` ) (eq .Layout `archives`) (eq .Layout `search`)) -}}
</span></span></span><span class="line"><span class="cl"><span class="s">{{- print &#34;</span><span class="na">list</span><span class="err">&#34;</span> <span class="na">-</span><span class="err">}}</span>
</span></span><span class="line"><span class="cl"><span class="err">{{</span><span class="na">-</span> <span class="na">end</span> <span class="na">-</span><span class="err">}}</span>
</span></span><span class="line"><span class="cl"><span class="err">{{</span><span class="na">-</span> <span class="na">if</span> <span class="na">eq</span> <span class="err">.</span><span class="na">Type</span> <span class="err">`</span><span class="na">linklog</span><span class="err">`</span> <span class="na">-</span><span class="err">}}</span>
</span></span><span class="line"><span class="cl"><span class="err">{{</span><span class="na">-</span> <span class="na">print</span> <span class="err">&#34;</span><span class="na">-linklog-</span><span class="err">&#34;</span> <span class="na">-</span><span class="err">}}</span>
</span></span><span class="line"><span class="cl"><span class="err">{{</span><span class="na">-</span> <span class="na">end</span> <span class="na">-</span><span class="err">}}</span>
</span></span><span class="line"><span class="cl"><span class="err">{{</span><span class="na">-</span> <span class="na">if</span> <span class="na">eq</span> <span class="err">.</span><span class="na">Layout</span> <span class="err">`</span><span class="na">search</span><span class="err">`</span> <span class="na">-</span><span class="err">}}</span>
</span></span><span class="line"><span class="cl"><span class="err">{{</span><span class="na">-</span> <span class="na">print</span> <span class="err">&#34;</span> <span class="na">search</span><span class="err">&#34;</span> <span class="na">-</span><span class="err">}}</span>
</span></span><span class="line"><span class="cl"><span class="err">{{</span><span class="na">-</span> <span class="na">end</span> <span class="na">-</span><span class="err">}}</span>
</span></span><span class="line"><span class="cl"><span class="err">{{</span><span class="na">-</span> <span class="na">if</span> <span class="err">(</span><span class="na">eq</span> <span class="err">.</span><span class="na">Layout</span> <span class="err">`</span><span class="na">archives</span><span class="err">`)</span> <span class="na">-</span><span class="err">}}</span>
</span></span><span class="line"><span class="cl"><span class="err">{{</span><span class="na">-</span> <span class="na">print</span> <span class="err">&#34;</span><span class="na">-archive</span><span class="err">&#34;</span> <span class="na">-</span><span class="err">}}</span>
</span></span><span class="line"><span class="cl"><span class="err">{{</span><span class="na">-</span> <span class="na">end</span> <span class="na">-</span><span class="err">}}</span>
</span></span><span class="line"><span class="cl"><span class="err">{{</span><span class="na">-</span> <span class="na">if</span> <span class="err">.</span><span class="na">IsHome</span> <span class="na">-</span><span class="err">}}</span>
</span></span><span class="line"><span class="cl"><span class="err">{{</span><span class="na">-</span> <span class="na">print</span> <span class="err">&#34;</span><span class="na">-profile</span><span class="err">&#34;</span> <span class="na">-</span><span class="err">}}</span>
</span></span><span class="line"><span class="cl"><span class="err">{{</span><span class="na">-</span> <span class="na">end</span> <span class="na">-</span><span class="err">}}</span>
</span></span><span class="line"><span class="cl"><span class="err">{{</span><span class="na">-</span> <span class="na">if</span> <span class="na">not</span> <span class="err">.</span><span class="na">IsHome</span> <span class="err">|</span> <span class="na">and</span> <span class="err">.</span><span class="na">Title</span> <span class="err">|</span> <span class="na">and</span> <span class="err">.</span><span class="na">Description</span> <span class="err">}}</span>
</span></span><span class="line"><span class="cl"><span class="err">{{</span><span class="na">-</span> <span class="na">print</span> <span class="err">&#34;</span><span class="na">post</span><span class="err">&#34;</span> <span class="na">-</span><span class="err">}}</span>
</span></span><span class="line"><span class="cl"><span class="err">{{</span><span class="na">-</span> <span class="na">end</span> <span class="na">-</span><span class="err">}}</span>
</span></span><span class="line"><span class="cl"><span class="err">{{</span><span class="na">-</span> <span class="na">if</span> <span class="na">eq</span> <span class="na">site</span><span class="err">.</span><span class="na">Params</span><span class="err">.</span><span class="na">defaultTheme</span> <span class="err">`</span><span class="na">dark</span><span class="err">`</span> <span class="na">-</span><span class="err">}}</span>
</span></span><span class="line"><span class="cl"><span class="err">{{</span><span class="na">-</span> <span class="na">print</span> <span class="err">&#34;</span> <span class="na">dark</span><span class="err">&#34;</span> <span class="err">}}</span>
</span></span><span class="line"><span class="cl"><span class="err">{{</span><span class="na">-</span> <span class="na">end</span> <span class="na">-</span><span class="err">}}</span>
</span></span><span class="line"><span class="cl"><span class="err">&#34;</span> <span class="na">id</span><span class="o">=</span><span class="s">&#34;top&#34;</span><span class="p">&gt;</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>替换即可通过如下的 class 对页面进行索引：</p>
<table>
  <thead>
      <tr>
          <th style="text-align: center">Selector</th>
          <th style="text-align: center">Page</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td style="text-align: center">.list-linklog-post</td>
          <td style="text-align: center">linklog 页面</td>
      </tr>
      <tr>
          <td style="text-align: center">.list.search</td>
          <td style="text-align: center">search 界面</td>
      </tr>
      <tr>
          <td style="text-align: center">.list-archive</td>
          <td style="text-align: center">archive 界面</td>
      </tr>
      <tr>
          <td style="text-align: center">.list-profile</td>
          <td style="text-align: center">主页</td>
      </tr>
  </tbody>
</table>
<p>在上述页面选择器之后添加 <code>.dark</code> 即可定位对应的深色主题样式，这部分可以按照自己的习惯去随便修改即可。</p>
<h3 id="background-image-设置背景">Background Image 设置背景</h3>
<p>可以参考笔者的设置，给背景添加一层简单的遮罩，具体代码如下：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>css</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="p">#</span><span class="nn">top</span><span class="o">,</span>
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">list</span><span class="o">,</span>
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">list-profile</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">background-image</span><span class="p">:</span> <span class="nb">url</span><span class="p">(</span><span class="sx">/cover/cover1.jpeg</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="k">background-size</span><span class="p">:</span> <span class="kc">cover</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">background-repeat</span><span class="p">:</span> <span class="kc">no-repeat</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">background-attachment</span><span class="p">:</span> <span class="kc">fixed</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">#</span><span class="nn">top</span><span class="p">.</span><span class="nc">dark</span><span class="o">,</span>
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">list</span><span class="p">.</span><span class="nc">dark</span><span class="o">,</span>
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">list-profile</span><span class="p">.</span><span class="nc">dark</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">background-image</span><span class="p">:</span> <span class="nb">url</span><span class="p">(</span><span class="sx">/cover/cover0.jpeg</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">#</span><span class="nn">top</span><span class="p">::</span><span class="nd">after</span><span class="o">,</span>
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">list</span><span class="p">::</span><span class="nd">after</span><span class="o">,</span>
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">list-profile</span><span class="p">::</span><span class="nd">after</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">background</span><span class="p">:</span> <span class="kc">inherit</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">filter</span><span class="p">:</span> <span class="nb">blur</span><span class="p">(</span><span class="mi">5</span><span class="kt">px</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="k">content</span><span class="p">:</span> <span class="s2">&#34;&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">position</span><span class="p">:</span> <span class="kc">fixed</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">top</span><span class="p">:</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">left</span><span class="p">:</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">width</span><span class="p">:</span> <span class="mi">100</span><span class="kt">%</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">min-height</span><span class="p">:</span> <span class="mi">100</span><span class="kt">%</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">background-size</span><span class="p">:</span> <span class="kc">cover</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">z-index</span><span class="p">:</span> <span class="mi">-1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">background-attachment</span><span class="p">:</span> <span class="kc">fixed</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>如果后续由于背景图像的色块比较杂乱，会导致文本模糊不清，可以给文本区域添加底色和对应的毛玻璃特效如下：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>css</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="p">.</span><span class="nc">list-archive</span> <span class="p">.</span><span class="nc">main</span><span class="o">,</span>
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">list-linklog-post</span> <span class="p">.</span><span class="nc">main</span><span class="o">,</span>
</span></span><span class="line"><span class="cl"><span class="p">#</span><span class="nn">top</span> <span class="nt">article</span><span class="p">.</span><span class="nc">post-single</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="kp">-webkit-</span><span class="n">backdrop-filter</span><span class="p">:</span> <span class="nb">blur</span><span class="p">(</span><span class="mi">30</span><span class="kt">px</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="n">backdrop-filter</span><span class="p">:</span> <span class="nb">blur</span><span class="p">(</span><span class="mi">30</span><span class="kt">px</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="k">background-color</span><span class="p">:</span> <span class="nb">rgba</span><span class="p">(</span><span class="mi">104</span><span class="p">,</span> <span class="mi">152</span><span class="p">,</span> <span class="mi">191</span><span class="p">,</span> <span class="mf">0.45</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>完成了基础设置之后就可以开始对页面结构做调整了，接下来主要介绍一下侧边目录、侧边导航栏，以及新建分享页面三个部分的页面调整和页面新增。</p>
<h2 id="support-linklog-page-添加博文收藏界面">Support LinkLog Page 添加博文收藏界面</h2>
<p>受到 <a href="https://xiaofei.ge/posts/modify-hugo-papermod-theme-and-templates/" target="_blank" rel="noopener">Xiaofei Ge</a>
 <span class="sidenote-number"><small class="sidenote"><a href="https://xiaofei.ge/linklog/" target="_blank" rel="noopener">Linklog | Xiaofei Ge</a></small></span> 的启发，确实希望能有一个页面来专门存放一些自己喜欢或者希望存档的文章，通过直接跳转或者表明转载（防止原博挂掉）的方式进行收藏，避免和自己的文章混在一起。</p>
<p>参考 <a href="https://dannorth.net/hugo-redirects/" target="_blank" rel="noopener">Using Hugo as a redirect service - Dan North &amp; Associates Limited</a>
，设计对应收藏博文的 markdown 元信息应该如下：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>yaml</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">title</span><span class="p">:</span><span class="w"> </span><span class="l">「特别篇」在关闭光猫、路由器IPv6防火墙后可能遇到的安全问题</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">url</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;www.bilibili.com/opus/825167559504429056&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">date</span><span class="p">:</span><span class="w"> </span><span class="ld">2023-11-05</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">draft</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;linklog&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">author</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;ce-12&#34;</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>通过 type 定义页面类型，日期存储我们收藏的时间，url 则是核心的跳转页面，还有一些作者和 title 的展示信息，并在 archive 按照日期展示每一条链接。</p>
<p>因此借助 GPT 快速实现了一版，并调整了一下搜索代码，使得搜索到 Linklog 文章的时候，会有符号&amp;样式去标识其为外部跳转的博文。</p>
<h3 id="add-linklog-page-添加博文收藏界面">Add LinkLog Page 添加博文收藏界面</h3>
<p>上述说到希望以 archive 界面的形式来收藏博文，通过简单的标题和简介来记录对应的博文，以及存放博文的时间，因此参考 <code>/layouts/_default/archives.html</code> 创建 <code>layouts/linklog/list.html</code> 如下，定义 LinkLog 的界面.</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>html</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl">{{- define &#34;main&#34; }}
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">header</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;page-header&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">h1</span><span class="p">&gt;</span>{{ .Title }}<span class="p">&lt;/</span><span class="nt">h1</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  {{- if .Description }}
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;post-description&#34;</span><span class="p">&gt;</span>{{ .Description }}<span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  {{- end }}
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">header</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">{{- $linklogPages := where site.RegularPages &#34;Type&#34; &#34;linklog&#34; }} <span class="c">&lt;!-- Adjust this if necessary --&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">{{- range $linklogPages.GroupByPublishDate &#34;2006&#34; }}
</span></span><span class="line"><span class="cl">{{- if ne .Key &#34;0001&#34; }}
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;archive-year&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  {{- $year := replace .Key &#34;0001&#34; &#34;&#34; }}
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">h2</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;archive-year-header&#34;</span> <span class="na">id</span><span class="o">=</span><span class="s">&#34;{{ $year }}&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">a</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;archive-header-link&#34;</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;#{{ $year }}&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      {{- $year -}}
</span></span><span class="line"><span class="cl">    <span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">sup</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;archive-count&#34;</span><span class="p">&gt;</span><span class="ni">&amp;nbsp;</span>{{ len .Pages }}<span class="p">&lt;/</span><span class="nt">sup</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;/</span><span class="nt">h2</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  {{- range .Pages.GroupByDate &#34;January&#34; }}
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;archive-month&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">h3</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;archive-month-header&#34;</span> <span class="na">id</span><span class="o">=</span><span class="s">&#34;{{ $year }}-{{ .Key }}&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;</span><span class="nt">a</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;archive-header-link&#34;</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;#{{ $year }}-{{ .Key }}&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        {{- .Key -}}
</span></span><span class="line"><span class="cl">      <span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;</span><span class="nt">sup</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;archive-count&#34;</span><span class="p">&gt;</span><span class="ni">&amp;nbsp;</span>{{ len .Pages }}<span class="p">&lt;/</span><span class="nt">sup</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;/</span><span class="nt">h3</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;archive-posts&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      {{- range .Pages }}
</span></span><span class="line"><span class="cl">      <span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;archive-entry&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nt">h3</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;archive-entry-title&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">          {{- if .Params.url}}
</span></span><span class="line"><span class="cl">            <span class="p">&lt;</span><span class="nt">span</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;jump-icon&#34;</span><span class="p">&gt;&lt;</span><span class="nt">ion-icon</span> <span class="na">name</span><span class="o">=</span><span class="s">&#34;link-outline&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">ion-icon</span><span class="p">&gt;&lt;/</span><span class="nt">span</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">            <span class="p">&lt;</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;https://{{ .Params.url }}&#34;</span> <span class="na">target</span><span class="o">=</span><span class="s">&#34;_blank&#34;</span> <span class="na">rel</span><span class="o">=</span><span class="s">&#34;noopener noreferrer&#34;</span><span class="p">&gt;</span>{{ .Title }}<span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;</span> <span class="c">&lt;!-- Prepend the protocol --&gt;</span>
</span></span><span class="line"><span class="cl">          {{- else}}
</span></span><span class="line"><span class="cl">            <span class="p">&lt;</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;{{ .Permalink }}&#34;</span> <span class="p">&gt;</span>转) {{ .Title }}<span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;</span> <span class="c">&lt;!-- Prepend the protocol --&gt;</span>
</span></span><span class="line"><span class="cl">          {{- end}}
</span></span><span class="line"><span class="cl">        <span class="p">&lt;/</span><span class="nt">h3</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        {{- if .Params.description }} <span class="c">&lt;!-- Check if description exists --&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;archive-entry-description&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">          {{ .Params.description }} <span class="c">&lt;!-- Display the description --&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        {{- end }}
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;archive-meta&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">          {{- partial &#34;post_meta.html&#34; . -}} <span class="c">&lt;!-- Optional: Include meta info --&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      {{- end }}
</span></span><span class="line"><span class="cl">    <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  {{- end }}
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">{{- end }}
</span></span><span class="line"><span class="cl">{{- end }}
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">{{- end }}{{/* end main */}}</span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>其中根据页面元信息是否存在 url 决定是否是外部链接，来决定 title 前面的样式是跳转符号还是转载标识，随后设置跳转标识的样式如下：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>css</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="p">.</span><span class="nc">jump-icon</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">position</span><span class="p">:</span> <span class="kc">relative</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">top</span><span class="p">:</span><span class="mi">3</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">padding-right</span><span class="p">:</span> <span class="mi">10</span><span class="kt">px</span><span class="p">;</span> <span class="c">/* Space between the icon and the title */</span>
</span></span><span class="line"><span class="cl">  <span class="k">font-size</span><span class="p">:</span> <span class="mi">1</span><span class="kt">em</span><span class="p">;</span> <span class="c">/* Adjust size as needed */</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">#</span><span class="nn">search-link</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">text-decoration</span><span class="p">:</span> <span class="kc">underline</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">color</span><span class="p">:</span> <span class="kc">slateblue</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">list-linklog-post</span> <span class="p">.</span><span class="nc">archive-entry-description</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">color</span><span class="p">:</span> <span class="nf">var</span><span class="p">(</span><span class="o">--</span><span class="n">secondary</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>设置完成后，即可在 content 中新建 linklog 文件夹，并在其中存放对应的转载文章，例如 <code>linklog/example.md</code> ，然后填写上述我们设计的格式，尝试跳转效果。最终页面效果如下：</p>
<p>
<div class="post-img-view">
  <a data-fancybox="gallery" href="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241220222745.png">
    <img alt="image.png" loading="lazy" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241220222745.png"class="responsive-image" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241220222745.png" style="display: block; margin: 0 auto;"
      alt="image.png"  />
  </a>
</div>


<script>
  document.addEventListener("DOMContentLoaded", function() {
      var images = document.querySelectorAll(".responsive-image");
      var maxHeight = window.innerHeight / 2.5;
      images.forEach(function(image) {
          image.style.maxHeight = maxHeight + "px";
      });
  });
</script>
</p>
<p>外部链接点击后即可跳转到对应的博文。</p>
<h3 id="avoid-url-directly-visit-wrong-page-避免直接用-url-访问对应页面时出现空页面">Avoid Url Directly Visit Wrong Page 避免直接用 url 访问对应页面时出现空页面</h3>
<p>添加 <code>layouts/linklog/single.html</code> 来设置页面的重定向，避免直接输入 linklog 对应地址以后，跳转到了一个空的 markdown 页面，具体代码如下：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>html</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl">{{- define &#34;main&#34; }}
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">{{- if .Params.url }}
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">meta</span> <span class="na">http-equiv</span><span class="o">=</span><span class="s">&#34;refresh&#34;</span> <span class="na">content</span><span class="o">=</span><span class="s">&#34;0; url=https://{{ .Params.url }}&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">script</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="nb">window</span><span class="p">.</span><span class="nx">location</span><span class="p">.</span><span class="nx">href</span> <span class="o">=</span> <span class="s2">&#34;https://{{ .Params.url }}&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">title</span><span class="p">&gt;</span>Redirecting...<span class="p">&lt;/</span><span class="nt">title</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">p</span><span class="p">&gt;</span>If you are not redirected, <span class="p">&lt;</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;https://{{ .Params.url }}&#34;</span><span class="p">&gt;</span>click here<span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;</span>.<span class="p">&lt;/</span><span class="nt">p</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">{{- else }}
</span></span><span class="line"><span class="cl">....
</span></span><span class="line"><span class="cl">{{- end }}
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">{{- end }}{{/* end main */}}</span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>通过判断参数中是否存在 url 来设置是否执行跳转，否则则使用默认的 <code>single.html</code> 的方式渲染 markdown 的转载文章。 <span class="sidenote-number"><small class="sidenote">else 中省略的部分填写的是 <code>_dafault/single.html</code></small></span> 中的内容。</p>
<h3 id="add-diff-style-in-search-result-搜索结果中支持跳转和特殊样式">Add Diff Style in Search Result 搜索结果中支持跳转和特殊样式</h3>
<p>由于在搜索中可能会搜到对应的文章，这里也需要和普通的文章做一些区分，因此修改 <code>assets/js/fastsearch.js</code> 的搜索结果部分如下：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>js</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="err">/ execute search as each character is typed</span>
</span></span><span class="line"><span class="cl"><span class="nx">sInput</span><span class="p">.</span><span class="nx">onkeyup</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">e</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// run a search query (for &#34;term&#34;) every time a letter is typed
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="c1">// in the search box
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="k">if</span> <span class="p">(</span><span class="nx">fuse</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="kd">let</span> <span class="nx">results</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="p">(</span><span class="nx">params</span><span class="p">.</span><span class="nx">fuseOpts</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="nx">results</span> <span class="o">=</span> <span class="nx">fuse</span><span class="p">.</span><span class="nx">search</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">value</span><span class="p">.</span><span class="nx">trim</span><span class="p">(),</span> <span class="p">{</span><span class="nx">limit</span><span class="o">:</span> <span class="nx">params</span><span class="p">.</span><span class="nx">fuseOpts</span><span class="p">.</span><span class="nx">limit</span><span class="p">});</span> <span class="c1">// the actual query being run using fuse.js along with options
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>        <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="nx">results</span> <span class="o">=</span> <span class="nx">fuse</span><span class="p">.</span><span class="nx">search</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">value</span><span class="p">.</span><span class="nx">trim</span><span class="p">());</span> <span class="c1">// the actual query being run using fuse.js
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>        <span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="p">(</span><span class="nx">results</span><span class="p">.</span><span class="nx">length</span> <span class="o">!==</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="c1">// build our html if result exists
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>            <span class="kd">let</span> <span class="nx">resultSet</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span><span class="p">;</span> <span class="c1">// our results bucket
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl">            <span class="k">for</span> <span class="p">(</span><span class="kd">let</span> <span class="nx">item</span> <span class="k">in</span> <span class="nx">results</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">                <span class="kr">const</span> <span class="nx">permalink</span> <span class="o">=</span> <span class="nx">results</span><span class="p">[</span><span class="nx">item</span><span class="p">].</span><span class="nx">item</span><span class="p">.</span><span class="nx">permalink</span><span class="p">;</span> <span class="c1">// Get the permalink
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>                
</span></span><span class="line"><span class="cl">                <span class="kr">const</span> <span class="nx">url</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">URL</span><span class="p">(</span><span class="nx">permalink</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">                <span class="kr">const</span> <span class="nx">pathAfterDomain</span> <span class="o">=</span> <span class="nx">url</span><span class="p">.</span><span class="nx">pathname</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;Permalink:&#34;</span><span class="p">,</span> <span class="nx">permalink</span><span class="p">);</span> <span class="c1">// Log the permalink
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl">                <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;Last Segment:&#34;</span><span class="p">,</span> <span class="nx">pathAfterDomain</span><span class="p">);</span> <span class="c1">// Log the last segment
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>                <span class="c1">// Check if the last segment contains a period
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>                <span class="kr">const</span> <span class="nx">jumpIcon</span> <span class="o">=</span> <span class="nx">pathAfterDomain</span><span class="p">.</span><span class="nx">includes</span><span class="p">(</span><span class="s1">&#39;.&#39;</span><span class="p">)</span> <span class="o">?</span> <span class="s1">&#39;&lt;span class=&#34;jump-icon&#34;&gt;&lt;ion-icon name=&#34;link-outline&#34;&gt;&lt;/ion-icon&gt;&lt;/span&gt;&#39;</span> <span class="o">:</span> <span class="s1">&#39;&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">                
</span></span><span class="line"><span class="cl">                <span class="k">if</span> <span class="p">(</span><span class="nx">pathAfterDomain</span><span class="p">.</span><span class="nx">includes</span><span class="p">(</span><span class="s1">&#39;.&#39;</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">                <span class="p">{</span>
</span></span><span class="line"><span class="cl">                    <span class="nx">resultSet</span> <span class="o">+=</span> <span class="sb">`&lt;li class=&#34;post-entry&#34;&gt;
</span></span></span><span class="line"><span class="cl"><span class="sb">                        &lt;header class=&#34;entry-header&#34; id=&#34;search-link&#34;&gt;</span><span class="si">${</span><span class="nx">jumpIcon</span><span class="si">}${</span><span class="nx">results</span><span class="p">[</span><span class="nx">item</span><span class="p">].</span><span class="nx">item</span><span class="p">.</span><span class="nx">title</span><span class="si">}</span><span class="sb">&amp;nbsp;»&lt;/header&gt;
</span></span></span><span class="line"><span class="cl"><span class="sb">                        &lt;a href=&#34;</span><span class="si">${</span><span class="nx">permalink</span><span class="si">}</span><span class="sb">&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; aria-label=&#34;</span><span class="si">${</span><span class="nx">results</span><span class="p">[</span><span class="nx">item</span><span class="p">].</span><span class="nx">item</span><span class="p">.</span><span class="nx">title</span><span class="si">}</span><span class="sb">&#34;&gt;&lt;/a&gt;
</span></span></span><span class="line"><span class="cl"><span class="sb">                    &lt;/li&gt;`</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">                <span class="p">}</span>
</span></span><span class="line"><span class="cl">                <span class="k">else</span>
</span></span><span class="line"><span class="cl">                <span class="p">{</span>
</span></span><span class="line"><span class="cl">                    <span class="nx">resultSet</span> <span class="o">+=</span> <span class="sb">`&lt;li class=&#34;post-entry&#34;&gt;
</span></span></span><span class="line"><span class="cl"><span class="sb">                        &lt;header class=&#34;entry-header&#34;&gt;</span><span class="si">${</span><span class="nx">jumpIcon</span><span class="si">}${</span><span class="nx">results</span><span class="p">[</span><span class="nx">item</span><span class="p">].</span><span class="nx">item</span><span class="p">.</span><span class="nx">title</span><span class="si">}</span><span class="sb">&amp;nbsp;»&lt;/header&gt;
</span></span></span><span class="line"><span class="cl"><span class="sb">                        &lt;a href=&#34;</span><span class="si">${</span><span class="nx">permalink</span><span class="si">}</span><span class="sb">&#34; aria-label=&#34;</span><span class="si">${</span><span class="nx">results</span><span class="p">[</span><span class="nx">item</span><span class="p">].</span><span class="nx">item</span><span class="p">.</span><span class="nx">title</span><span class="si">}</span><span class="sb">&#34;&gt;&lt;/a&gt;
</span></span></span><span class="line"><span class="cl"><span class="sb">                    &lt;/li&gt;`</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">                <span class="p">}</span>
</span></span><span class="line"><span class="cl">            <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            <span class="nx">resList</span><span class="p">.</span><span class="nx">innerHTML</span> <span class="o">=</span> <span class="nx">resultSet</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">            <span class="nx">resultsAvailable</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">            <span class="nx">first</span> <span class="o">=</span> <span class="nx">resList</span><span class="p">.</span><span class="nx">firstChild</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">            <span class="nx">last</span> <span class="o">=</span> <span class="nx">resList</span><span class="p">.</span><span class="nx">lastChild</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="nx">resultsAvailable</span> <span class="o">=</span> <span class="kc">false</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">            <span class="nx">resList</span><span class="p">.</span><span class="nx">innerHTML</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>由于在之前的设置下，通过判断搜索结果的跳转链接在我们域名之后是否还存在 <code>.</code> 来判断其是否为外部链接，进而为其添加跳转标识即可，最终效果如下：</p>
<p>
<div class="post-img-view">
  <a data-fancybox="gallery" href="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241220222656.png">
    <img alt="image.png" loading="lazy" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241220222656.png"class="responsive-image" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241220222656.png" style="display: block; margin: 0 auto;"
      alt="image.png"  />
  </a>
</div>


<script>
  document.addEventListener("DOMContentLoaded", function() {
      var images = document.querySelectorAll(".responsive-image");
      var maxHeight = window.innerHeight / 2.5;
      images.forEach(function(image) {
          image.style.maxHeight = maxHeight + "px";
      });
  });
</script>
</p>
<h2 id="side-toc-宽屏下设置侧边目录">Side Toc 宽屏下设置侧边目录</h2>
<p>正如以往笔者的 hexo 博客的设置，将目录放到侧边，一是能优化 PaperMod 主题在宽屏时对空间的利用，二是能够方便阅读的时候进行章节的跳转以及对进度的提示，因此下定决心在页面较宽时将目录改至侧边。</p>
<p>实现的方案主要借鉴自<a href="https://www.zhouxin.space/logs/introduce-side-toc-and-reading-percentage-to-papermod/" target="_blank" rel="noopener">周鑫的个人博客</a>
，在此之上添加了以下的一些特性：</p>
<ol>
<li>为已读的内容添加 read 的类名，设置不同的样式；</li>
<li>在加密页面隐藏 toc</li>
<li>仅展开当前正在阅读的章节的子章节</li>
<li>添加 toc 中 H2 的 index</li>
</ol>
<p>这里仅额外介绍一下改动部分，<strong>最终的源码可从 Github 上获取</strong> <span class="sidenote-number"><small class="sidenote"><a href="https://github.com/AikenH/papermod-sidebar/blob/master/layouts/partials/toc.html" target="_blank" rel="noopener">papermod-sidebar/layouts/partials/toc.html · AikenH/papermod-sidebar</a></small></span> <span class="sidenote-number"><small class="sidenote"><a href="https://github.com/AikenH/papermod-sidebar/blob/master/assets/css/common/toc.css" target="_blank" rel="noopener">papermod-sidebar/assets/css/common/toc.css · AikenH/papermod-sidebar</a></small></span></p>
<blockquote>
<p>本博客的回到顶部也是基于周鑫的实现完成，这里不在赘述，可以自行前往参考。</p>
</blockquote>
<h3 id="diff-style-for-read--unread-基于阅读状态修改样式">Diff Style for Read &amp; Unread 基于阅读状态修改样式</h3>
<p>在周鑫的实现中 <code>toc.html</code> 的滚动函数部分首先添加 read 状态的重置，避免回滚时的样式错误：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>html</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl">window.addEventListener(&#39;scroll&#39;, () =&gt; {
</span></span><span class="line"><span class="cl">	// Get the current scroll position
</span></span><span class="line"><span class="cl">	const scrollPosition = window.pageYOffset || document.documentElement.scrollTop;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	// Check if the scroll position is at the top of the page
</span></span><span class="line"><span class="cl">	if (scrollPosition === 0) {
</span></span><span class="line"><span class="cl">		return;
</span></span><span class="line"><span class="cl">	}
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	// Ensure elements is a valid NodeList
</span></span><span class="line"><span class="cl">	// ---------------------状态重置添加位置
</span></span><span class="line"><span class="cl">	if (elements <span class="err">&amp;&amp;</span> elements.length &gt; 0) {
</span></span><span class="line"><span class="cl">		elements.forEach(element =&gt; {
</span></span><span class="line"><span class="cl">			const id = encodeURI(element.getAttribute(&#39;id&#39;)).toLowerCase();
</span></span><span class="line"><span class="cl">			const tocLink = document.querySelector(`.inner ul li a[href=&#34;#${id}&#34;]`);
</span></span><span class="line"><span class="cl">			tocLink.classList.remove(&#39;read&#39;);
</span></span><span class="line"><span class="cl">		});
</span></span><span class="line"><span class="cl">	 // --------------------------------------------
</span></span><span class="line"><span class="cl">		// Check if there is an object in the top half of the screen or keep the last item active
</span></span><span class="line"><span class="cl">		...
</span></span><span class="line"><span class="cl">		...</span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>然后再滚动判断 active 元素的部分添加 read 属性的赋值：添加如下 3 行即可</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>html</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl">elements.forEach((element, index) =&gt; {
</span></span><span class="line"><span class="cl">	const id = encodeURI(element.getAttribute(&#39;id&#39;)).toLowerCase();
</span></span><span class="line"><span class="cl">	const tocLink = document.querySelector(`.inner ul li a[href=&#34;#${id}&#34;]`);
</span></span><span class="line"><span class="cl">	if (element === activeElement){
</span></span><span class="line"><span class="cl">		tocLink.classList.add(&#39;active&#39;);
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">		// Ensure the active element is in view within the .inner container
</span></span><span class="line"><span class="cl">		const tocContainer = document.querySelector(&#39;.toc .inner&#39;);
</span></span><span class="line"><span class="cl">		const linkOffsetTop = tocLink.offsetTop;
</span></span><span class="line"><span class="cl">		const containerHeight = tocContainer.clientHeight;
</span></span><span class="line"><span class="cl">		const linkHeight = tocLink.clientHeight;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">		// Calculate the scroll position to center the active link
</span></span><span class="line"><span class="cl">		const scrollPosition = linkOffsetTop - (containerHeight / 2) + (linkHeight / 2);
</span></span><span class="line"><span class="cl">		tocContainer.scrollTo({ top: scrollPosition, behavior: &#39;smooth&#39; });
</span></span><span class="line"><span class="cl">	} else {
</span></span><span class="line"><span class="cl">		// ------------------添加部分---------------------
</span></span><span class="line"><span class="cl">		if (getOffsetTop(element) <span class="p">&lt;</span> <span class="nt">scrollPosition</span><span class="err">)</span> <span class="err">{</span>
</span></span><span class="line"><span class="cl">			<span class="na">tocLink</span><span class="err">.</span><span class="na">classList</span><span class="err">.</span><span class="na">add</span><span class="err">(&#39;</span><span class="na">read</span><span class="err">&#39;);</span> <span class="err">//</span> <span class="na">Mark</span> <span class="na">as</span> <span class="na">read</span>
</span></span><span class="line"><span class="cl">		<span class="err">}</span>
</span></span><span class="line"><span class="cl">		<span class="err">//</span> <span class="na">------------------添加部分---------------------</span>
</span></span><span class="line"><span class="cl">		<span class="na">tocLink</span><span class="err">.</span><span class="na">classList</span><span class="err">.</span><span class="na">remove</span><span class="err">(&#39;</span><span class="na">active</span><span class="err">&#39;);</span>
</span></span><span class="line"><span class="cl">	<span class="err">}</span>
</span></span><span class="line"><span class="cl"><span class="err">});</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p><code>toc.css</code> 中对 read 添加样式</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>css</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="p">.</span><span class="nc">read</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">color</span><span class="p">:</span> <span class="nb">rgb</span><span class="p">(</span><span class="mi">105</span><span class="p">,</span> <span class="mi">105</span><span class="p">,</span> <span class="mi">105</span><span class="p">)</span> <span class="cp">!important</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><h3 id="only-unfold-current-chapter-自动折叠其他章节">Only Unfold Current Chapter 自动折叠其他章节</h3>
<p>在 <code>layouts/partials/head.html</code> 中添加如下代码</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>html</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl">{{ if or .Params.autofoldtoc .Page.Site.Params.autofoldtoc }}
</span></span><span class="line"><span class="cl">    {{ $styles := resources.Get &#34;css/autofoldtoc.css.tmpl&#34; | resources.ExecuteAsTemplate &#34;autofoldtoc.css&#34; . }}
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">style</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">{</span><span class="err">{</span> <span class="err">$styles.Content</span> <span class="err">|</span> <span class="err">safeCSS</span> <span class="p">}</span><span class="err">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;/</span><span class="nt">style</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">{{ end }}</span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>使得页面在设置了 <code>autofoldtoc</code> 时，引入我们预先定义好的样式表，实现对非激活章节的折叠，然后在 <code>assets.css</code> 中新建 <code>autofoldtoc.css.tmpl</code> 预先定义折叠样式<span class="sidenote-number"><small class="sidenote"><a href="https://blog.csdn.net/DuChongYY/article/details/136244762" target="_blank" rel="noopener">为Hugo主题添加动态跟随目录Scrollspy效果</a></small></span>如下</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>css</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="p">.</span><span class="nc">toc-container</span><span class="p">.</span><span class="nc">wide</span> <span class="nt">li</span><span class="o">&gt;</span><span class="nt">ul</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">display</span><span class="p">:</span> <span class="kc">none</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">toc-container</span><span class="p">.</span><span class="nc">wide</span> <span class="nt">li</span><span class="p">:</span><span class="nd">has</span><span class="o">(</span><span class="nt">a</span><span class="p">.</span><span class="nc">active</span><span class="o">)</span> <span class="nt">ul</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">display</span><span class="p">:</span> <span class="kc">inherit</span> <span class="cp">!important</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>后续可以在 <code>hugo.yaml</code> 中设置如下开启<strong>全局</strong>目录自动折叠功能</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>yaml</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">params</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">autofoldtoc</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>或者在 markdown 的 meta-info 中添加如下一行即可<strong>针对单篇文章</strong>开启。</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>yaml</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">autofoldtoc</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><h3 id="hide-toc-before-decrypt-博文解密之前隐藏目录">Hide Toc before Decrypt 博文解密之前隐藏目录</h3>
<p>修改 <code>toc.html</code> 的 <code>getOffsetTop</code> 如下：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>html</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">script</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">getOffsetTop</span><span class="p">(</span><span class="nx">element</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">element</span><span class="p">.</span><span class="nx">getClientRects</span><span class="p">().</span><span class="nx">length</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nb">document</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="s1">&#39;.hugo-encryptor-prompt&#39;</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="nx">elements</span><span class="p">.</span><span class="nx">length</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="c1">// Re-query the elements if the class is not found
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>            <span class="nx">elements</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">querySelectorAll</span><span class="p">(</span><span class="s1">&#39;h1[id],h2[id],h3[id],h4[id],h5[id],h6[id]&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">            <span class="c1">// console.log(&#39;Elements re-queried:&#39;, elements);
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>        <span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="kd">let</span> <span class="nx">rect</span> <span class="o">=</span> <span class="nx">element</span><span class="p">.</span><span class="nx">getBoundingClientRect</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">    <span class="kd">let</span> <span class="nx">win</span> <span class="o">=</span> <span class="nx">element</span><span class="p">.</span><span class="nx">ownerDocument</span><span class="p">.</span><span class="nx">defaultView</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="nx">rect</span><span class="p">.</span><span class="nx">top</span> <span class="o">+</span> <span class="nx">win</span><span class="p">.</span><span class="nx">pageYOffset</span><span class="p">;</span>   
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">script</span><span class="p">&gt;</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>这一部分后面使用简码加密的会讲到，实际上是一个伪加密，只是不显示对应模块罢了。</p>
<h3 id="auto-index-添加章节计数">Auto Index 添加章节计数</h3>
<p><code>toc.css</code> 中设置 H2 的样式如下：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>css</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="p">.</span><span class="nc">toc</span> <span class="p">.</span><span class="nc">inner</span> <span class="o">&gt;</span> <span class="nt">ul</span> <span class="o">&gt;</span> <span class="nt">li</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">list-style</span><span class="p">:</span> <span class="kc">none</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">counter-increment</span><span class="p">:</span> <span class="n">toc-section</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">toc</span> <span class="p">.</span><span class="nc">inner</span> <span class="o">&gt;</span> <span class="nt">ul</span> <span class="o">&gt;</span> <span class="nt">li</span><span class="p">::</span><span class="nd">before</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">content</span><span class="p">:</span> <span class="nb">counter</span><span class="p">(</span><span class="n">toc</span><span class="o">-</span><span class="n">section</span><span class="p">)</span> <span class="s1">&#39;.&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">margin-right</span><span class="p">:</span> <span class="mf">0.4</span><span class="kt">em</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><h2 id="sidebar-宽屏下设置侧边导航栏">Sidebar 宽屏下设置侧边导航栏</h2>
<p>在默认的 nav 之外添加一个 sidebar 结构体，然后通过 css 在不同的视窗中启用不同的导航栏即可，sidebar 可以添加在 <code>layouts/partials/header.html</code> 中：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>html</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">header</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">...
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">header</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">{{- $iconMap := dict &#34;home&#34; &#34;home-outline&#34; &#34;posts&#34; &#34;newspaper-outline&#34; &#34;tags&#34; &#34;pricetags-outline&#34; &#34;categories&#34;
</span></span><span class="line"><span class="cl">&#34;grid-outline&#34; &#34;archives&#34; &#34;folder-outline&#34; &#34;search&#34; &#34;search&#34; &#34;about&#34; &#34;person&#34; &#34;linklog&#34; &#34;link&#34;}}
</span></span><span class="line"><span class="cl">{{- $bgColorMap := dict &#34;home&#34; &#34;#f44336&#34; &#34;posts&#34; &#34;#b145e9&#34; &#34;tags&#34; &#34;#0f93c7&#34; &#34;categories&#34; &#34;#ffa117&#34; &#34;archives&#34; &#34;#0fc70f&#34;
</span></span><span class="line"><span class="cl">&#34;search&#34; &#34;#15c095&#34; &#34;about&#34; &#34;#d16111&#34; &#34;linklog&#34; &#34;#0fc70f&#34;}}
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;sidebar&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">ul</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nt">li</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;logo&#34;</span> <span class="na">style</span><span class="o">=</span><span class="s">&#34;--bg: #333;&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">            <span class="p">&lt;</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;#&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">                <span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;logo-icon&#34;</span><span class="p">&gt;&lt;</span><span class="nt">img</span> <span class="na">src</span><span class="o">=</span><span class="s">&#34;/logo/logo.png&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">                <span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;logo-text&#34;</span><span class="p">&gt;</span>Aiken&#39;s Blog <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">            <span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;/</span><span class="nt">li</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;menulist&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">            {{- range site.Menus.main }}
</span></span><span class="line"><span class="cl">            {{- $menu_item_url := (cond (strings.HasSuffix .URL &#34;/&#34;) .URL (printf &#34;%s/&#34; .URL) ) | absLangURL }}
</span></span><span class="line"><span class="cl">            {{- $page_url:= $currentPage.Permalink | absLangURL }}
</span></span><span class="line"><span class="cl">            {{- $is_search := eq (site.GetPage .KeyName).Layout `search` }}
</span></span><span class="line"><span class="cl">            {{- $iconName := index $iconMap .Name }}
</span></span><span class="line"><span class="cl">            {{- $bgColor := index $bgColorMap .Name }}
</span></span><span class="line"><span class="cl">            <span class="p">&lt;</span><span class="nt">li</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;{{- if eq $menu_item_url $page_url }}active{{- end }}&#34;</span> <span class="na">style</span><span class="o">=</span><span class="s">&#34;--bg: {{ $bgColor }};&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">                <span class="p">&lt;</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;{{ .URL | absLangURL }}&#34;</span> <span class="na">title</span><span class="o">=</span><span class="s">&#34;{{ .Title | default .Name }} {{- cond $is_search (&#34;</span> <span class="err">(</span><span class="na">Alt</span> <span class="err">+</span> <span class="err">/)&#34;</span> <span class="err">|</span> <span class="na">safeHTMLAttr</span><span class="err">)</span> <span class="err">(&#34;&#34;</span> <span class="err">|</span> <span class="na">safeHTMLAttr</span> <span class="err">)</span> <span class="err">}}&#34;</span>
</span></span><span class="line"><span class="cl">                <span class="err">{{</span><span class="na">-</span> <span class="na">cond</span> <span class="err">$</span><span class="na">is_search</span> <span class="err">(&#34;</span> <span class="na">accesskey</span><span class="o">=</span><span class="s">/&#34;</span> <span class="err">|</span> <span class="na">safeHTMLAttr</span><span class="err">)</span> <span class="err">(&#34;&#34;</span> <span class="err">|</span> <span class="na">safeHTMLAttr</span> <span class="err">)</span> <span class="err">}}</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                    <span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;logo-icon&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">                        <span class="p">&lt;</span><span class="nt">ion-icon</span> <span class="na">name</span><span class="o">=</span><span class="s">&#34;{{ $iconName }}&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">ion-icon</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">                    <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                    <span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;logo-text&#34;</span><span class="p">&gt;</span>{{ .Name }}<span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">                <span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">            <span class="p">&lt;/</span><span class="nt">li</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">            {{- end }}
</span></span><span class="line"><span class="cl">        <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;logo-switches&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">            <span class="p">&lt;</span><span class="nt">button</span> <span class="na">id</span><span class="o">=</span><span class="s">&#34;theme-toggle&#34;</span> <span class="na">accesskey</span><span class="o">=</span><span class="s">&#34;t&#34;</span> <span class="na">title</span><span class="o">=</span><span class="s">&#34;(Alt +T)&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">                <span class="p">&lt;</span><span class="nt">li</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">                    <span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;logo-icon&#34;</span> <span class="na">id</span><span class="o">=</span><span class="s">&#34;moon&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">                        <span class="p">&lt;</span><span class="nt">ion-icon</span> <span class="na">name</span><span class="o">=</span><span class="s">&#34;moon-outline&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">ion-icon</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">                    <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">                    <span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;logo-icon&#34;</span> <span class="na">id</span><span class="o">=</span><span class="s">&#34;sun&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">                        <span class="p">&lt;</span><span class="nt">ion-icon</span> <span class="na">name</span><span class="o">=</span><span class="s">&#34;sunny-outline&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">ion-icon</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">                    <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">                <span class="p">&lt;/</span><span class="nt">li</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">            <span class="p">&lt;/</span><span class="nt">button</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;/</span><span class="nt">ul</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>然后通过 css 去控制 sidebar 的位置和基本样式即可，这里的样式是来自之前自己<a href="https://github.com/AikenH/myWebProj/tree/side-nav" target="_blank" rel="noopener">练手项目</a>
，这里就不再详细分享：</p>
<p>基本的一些设置，包括 hover，nav 和 sidebar 的切换部分的 css 如下：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>css</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="c">/* sidebar styles */</span>
</span></span><span class="line"><span class="cl"><span class="p">@</span><span class="k">media</span> <span class="nt">screen</span> <span class="nt">and</span> <span class="o">(</span><span class="nt">min-width</span><span class="o">:</span> <span class="nt">768px</span><span class="o">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="p">.</span><span class="nc">nav</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">display</span><span class="p">:</span> <span class="kc">none</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="c">/* @media screen and (min-width: 768px) and (max-width: 1600px){
</span></span></span><span class="line"><span class="cl"><span class="c">  .main:has(&gt;article:first-child){
</span></span></span><span class="line"><span class="cl"><span class="c">    margin-left: 80px;
</span></span></span><span class="line"><span class="cl"><span class="c">  }
</span></span></span><span class="line"><span class="cl"><span class="c">} */</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">sidebar</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="c">/* background-color: var(--para-color); */</span>
</span></span><span class="line"><span class="cl">  <span class="k">background-color</span><span class="p">:</span> <span class="mh">#abc3d1</span><span class="n">bb</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">opacity</span><span class="p">:</span> <span class="mf">0.9</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">position</span><span class="p">:</span> <span class="kc">fixed</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">padding-top</span><span class="p">:</span> <span class="mi">0</span><span class="kt">vh</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">padding-left</span><span class="p">:</span> <span class="mi">10</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">height</span><span class="p">:</span> <span class="mi">100</span><span class="kt">%</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">width</span><span class="p">:</span> <span class="mi">80</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">overflow</span><span class="p">:</span> <span class="kc">hidden</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">border-radius</span><span class="p">:</span> <span class="mi">0</span><span class="kt">px</span><span class="o">/</span><span class="mi">30</span><span class="kt">px</span> <span class="mi">30</span><span class="kt">px</span><span class="o">/</span><span class="mi">30</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">box-shadow</span><span class="p">:</span> <span class="mi">20</span><span class="kt">px</span> <span class="mi">40</span><span class="kt">px</span> <span class="mi">40</span><span class="kt">px</span> <span class="nb">rgba</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mf">0.3</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="k">transition</span><span class="p">:</span> <span class="k">width</span> <span class="mf">0.5</span><span class="kt">s</span> <span class="kc">ease</span> <span class="mi">0</span><span class="kt">s</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">z-index</span><span class="p">:</span> <span class="mi">999</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">@</span><span class="k">media</span> <span class="nt">screen</span> <span class="nt">and</span> <span class="o">(</span><span class="nt">max-width</span><span class="o">:</span> <span class="nt">768px</span><span class="o">)</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="p">.</span><span class="nc">sidebar</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">display</span><span class="p">:</span> <span class="kc">none</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">sidebar</span><span class="p">:</span><span class="nd">hover</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">width</span><span class="p">:</span> <span class="mi">270</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">height</span><span class="p">:</span> <span class="mi">100</span><span class="kt">vh</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>主题中完整的侧边 css 可从 <a href="https://github.com/AikenH/papermod-sidebar/blob/master/assets/css/common/sidebar.css" target="_blank" rel="noopener">sidebar.css at · AikenH/papermod-sidebar</a>
 获取。</p>
<h2 id="extensions-功能拓展">Extensions 功能拓展</h2>
<h3 id="disqus-support-使用-disqus-作为评论区">Disqus Support 使用 Disqus 作为评论区</h3>
<blockquote>
<p>为博客添加评论区实际上有比较多的选择，这里由于之前使用的都是 disqus，这里暂时就不做切换，后续如果有需求的话可能会做别的尝试，例如 <a href="https://tunan.org/posts/add-comment-system-to-hugopapermo/" target="_blank" rel="noopener">giscus</a>
</p>
</blockquote>
<p>参考 PaperMod 主题的说明 <span class="sidenote-number"><small class="sidenote"><a href="https://github.com/adityatelange/hugo-PaperMod/wiki/Features#comments" target="_blank" rel="noopener">papermod-wiki-comments</a></small></span> ，创建 <code>layouts/partials/comments.html</code> ，然后将 disqus 获取的代码贴进去，同时在设置 <code>hugo.yaml</code> 中打开评论区即可。</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>yaml</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">params</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">comments</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>而由于 disqus 在国内的访问不是特别的友好，可能会成为页面加载的瓶颈，甚至阻碍其他核心的板块的加载进程，因此使用<strong>延迟加载方案</strong>使得当页面滚动到评论区域时才开始加载 disqus 板块，这里建议去原作者站点查看，故不再赘述  <span class="sidenote-number"><small class="sidenote"><a href="https://blog.skk.moe/post/prevent-disqus-from-slowing-your-site/" target="_blank" rel="noopener">使 Disqus 不再拖累性能和页面加载 | Sukka&rsquo;s Blog</a>
 感谢作者，这也是本博客使用的方案</small></span> <span class="sidenote-number"><small class="sidenote"><a href="https://css-tricks.org.cn/lazy-loading-disqus-comments/" target="_blank" rel="noopener">延迟加载 Disqus 评论 | CSS-Tricks 中文</a>
 感谢作者分享</small></span></p>
<p>此外由于觉得 disqus 的 reactions 模块有点烦人，因此在设置中讲 reactions 板块关闭 <span class="sidenote-number"><small class="sidenote"><a href="https://github.com/disqus/disqus-react/issues/146" target="_blank" rel="noopener">Document how to disable reactions · Issue #146 · disqus/disqus-react</a></small></span> ;</p>
<h3 id="busuanzi-统计网站访问人数">busuanzi 统计网站访问人数</h3>
<p>使用<a href="https://busuanzi.ibruce.info/" target="_blank" rel="noopener">不蒜子</a>
统计站点访问次数和人数，参考官方教程将对应的代码嵌入 footer 中即可，如果需要人次的话就把 pv 改成 uv 。</p>
<p>最终代码如下：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>html</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl">...
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">script</span> <span class="na">async</span> <span class="na">src</span><span class="o">=</span><span class="s">&#34;//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nt">span</span> <span class="na">id</span><span class="o">=</span><span class="s">&#34;busuanzi_container&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">            Visitors: <span class="p">&lt;</span><span class="nt">span</span> <span class="na">id</span><span class="o">=</span><span class="s">&#34;busuanzi_value_site_uv&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">span</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">            Views: <span class="p">&lt;</span><span class="nt">span</span> <span class="na">id</span><span class="o">=</span><span class="s">&#34;busuanzi_value_site_pv&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">span</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;/</span><span class="nt">span</span><span class="p">&gt;</span> 
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">footer</span><span class="p">&gt;</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>如果希望初始化站点的访问量和人数，避免域名转换后的重新计数，可以使用在西面添加 js 脚本对技术进行调整，可以参考 <a href="https://kyxie.me/zh/blog/tech/web/papermod/#%e6%b5%81%e9%87%8f%e7%bb%9f%e8%ae%a1" target="_blank" rel="noopener">Hugo + PaperMod搭建技术博客 | Kunyang&rsquo;s Blog</a>
 这里不再重复说明。</p>
<h3 id="sakana-widget-石蒜模拟器">Sakana Widget 石蒜模拟器</h3>
<p>页面中引入 Sakana 摆件<span class="sidenote-number"><small class="sidenote"><a href="https://github.com/dsrkafuu/sakana-widget?tab=readme-ov-file" target="_blank" rel="noopener">dsrkafuu/sakana-widget: Sakana widget for Web. | 网页小组件版本的石蒜模拟器。</a></small></span>，并将其自定义了欣欣向荣两兄弟的图片效果如下：</p>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta name="viewport" content="user-scalable=no, width=device-width, initial-scale=1, maximum-scale=1">
    <script src="https://cdn.jsdmirror.com/npm/jquery@3.3.1/dist/jquery.min.js"></script>
    <link rel="stylesheet" href="https://cdn.jsdmirror.com/npm/nanogallery2@3.0.5/dist/css/nanogallery2.min.css">
    <script src="https://cdn.jsdmirror.com/npm/nanogallery2@3.0.5/dist/jquery.nanogallery2.min.js"></script>
</head>
<body>

<div data-nanogallery2='{
	 "thumbnailDisplayTransition":          "none",
     "thumbnailDisplayTransitionDuration":  500,
     "thumbnailDisplayInterval":            30,
     "galleryDisplayTransition":            "none",
     "galleryDisplayTransitionDuration":    500,
     "galleryDisplayMode": "rows",
     "thumbnailDisplayOutsideScreen": "false",
     "eventsDebounceDelay": 10,
     "thumbnailL1BorderHorizontal": 0,
     "thumbnailL1BorderVertical": 0,
     "thumbnailLabel": {
        "titleFontSize": "0.6em"
     },
     "thumbnailHoverEffect2": "image_scale_1.00_1.10|label_backgroundColor_rgba(0,0,0,0)_rgba(255,255,255,0)",
     "galleryTheme": {
        "thumbnail": {
            "borderRadius": "8px"
        }
     },
     "thumbnailToolbarImage": {
        "topLeft": "",
        "topRight": "",
        "bottomLeft": "",
        "bottomRight": ""
     },
     "viewerToolbar":   {
        "display": true,
        "standard": "label"
     },
     "viewerTools":     {
        "topLeft":    "pageCounter, playPauseButton",
        "topRight":   "downloadButton, rotateLeft, zoomButton, fullscreenButton, closeButton"
     },
     "viewerGalleryTWidth": 40,
     "viewerGalleryTHeight": 40
}'>
     
<a href="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241220115346.png" data-ngThumb="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241220115346.png">欣欣</a>
<a href="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241220115403.png" data-ngThumb="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241220115403.png">小荣</a>

</div>
</body>
</html>
<p>该组件的使用，包括样式的调整文档里已经非常详细了，这里不在多说；</p>
<blockquote>
<p>以供参考：本文在 hugo 中引入相关代码的位置位于<code>layouts/partials/header,html</code>的末尾</p>
</blockquote>
<p>本文引入新角色的代码如下：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>js</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">initSakanaWidget</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="kr">const</span> <span class="nx">ronSang</span> <span class="o">=</span> <span class="nx">SakanaWidget</span><span class="p">.</span><span class="nx">getCharacter</span><span class="p">(</span><span class="s1">&#39;chisato&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="nx">ronSang</span><span class="p">.</span><span class="nx">initialState</span> <span class="o">=</span> <span class="p">{</span> 
</span></span><span class="line"><span class="cl">		<span class="p">...</span><span class="nx">ronSang</span><span class="p">.</span><span class="nx">initialState</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">		<span class="nx">controls</span><span class="o">:</span> <span class="kc">false</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">		<span class="nx">t</span><span class="o">:</span> <span class="mf">0.8</span><span class="p">,</span> <span class="nx">i</span><span class="o">:</span> <span class="mf">0.002</span><span class="p">,</span> <span class="nx">s</span><span class="o">:</span> <span class="mi">1</span><span class="p">,</span> <span class="nx">d</span><span class="o">:</span> <span class="mf">0.999</span><span class="p">,</span> <span class="nx">t</span><span class="o">:</span> <span class="mf">0.5</span><span class="p">,</span> <span class="nx">w</span><span class="o">:</span> <span class="mf">0.05</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">	<span class="p">};</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nx">ronSang</span><span class="p">.</span><span class="nx">image</span> <span class="o">=</span> <span class="s1">&#39;xxx.png&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="nx">SakanaWidget</span><span class="p">.</span><span class="nx">registerCharacter</span><span class="p">(</span><span class="s1">&#39;ronSang&#39;</span><span class="p">,</span> <span class="nx">ronSang</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="k">new</span> <span class="nx">SakanaWidget</span><span class="p">({</span> <span class="nx">character</span><span class="o">:</span> <span class="s1">&#39;ronSang&#39;</span> <span class="p">}).</span><span class="nx">mount</span><span class="p">(</span><span class="s1">&#39;#sakana-widget&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="p">...</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><h3 id="world-cloud-词云">World Cloud 词云</h3>
<p>尝试了一下做标签云，试图优化一下 tag 页面，但是设置了背景以后配合的不是很好，因此本博客中没有使用这个功能，这里分享一下实现词云 <span class="sidenote-number"><small class="sidenote"><a href="https://blog.xlap.top/post/tech/wordcloud4hugo/" target="_blank" rel="noopener">Hugo的标签使用词云WordCloud2展示 | Blog - XLapTop</a></small></span> <span class="sidenote-number"><small class="sidenote"><a href="https://github.com/timdream/wordcloud2.js/blob/gh-pages/API.md" target="_blank" rel="noopener">wordcloud2.js/API.md at gh-pages · timdream/wordcloud2.js</a></small></span> <span class="sidenote-number"><small class="sidenote"><a href="https://blog.cubieserver.de/2020/adding-a-tag-cloud-to-my-hugo-blog/" target="_blank" rel="noopener">Adding a Tag Cloud to my Hugo blog · Jack Henschel&rsquo;s Blog</a></small></span> 的代码:</p>
<p>这里需要去 <a href="https://github.com/timdream/wordcloud2.js/blob/gh-pages/src/wordcloud2.js" target="_blank" rel="noopener">wordcloud2.js/src/wordcloud2.js at gh-pages · timdream/wordcloud2.js</a>
 将该 js 文件存在 static 目录下，然后将下述代码替换到 <code>layouts/_default/terms.html</code> 中</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>html</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="c">&lt;!--标签云--&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">div</span> <span class="na">id</span><span class="o">=</span><span class="s">&#34;sourrounding_div&#34;</span> <span class="na">style</span><span class="o">=</span><span class="s">&#34;width:100%;height:100%;min-height: 500px;&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">div</span> <span class="na">id</span><span class="o">=</span><span class="s">&#34;tag-canvas&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">script</span> <span class="na">src</span><span class="o">=</span><span class="s">&#34;/js/wordcloud2.js&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">{{- range $key, $value := .Data.Terms.Alphabetical }}
</span></span><span class="line"><span class="cl">    {{ if eq &#34;&#34; ($.Scratch.Get &#34;tagsMap&#34;) }}
</span></span><span class="line"><span class="cl">        {{ $.Scratch.Set &#34;tagsMap&#34; (slice (dict .Name .Count))  }}
</span></span><span class="line"><span class="cl">    {{ else }}
</span></span><span class="line"><span class="cl">        {{ $.Scratch.Add &#34;tagsMap&#34; (slice (dict .Name .Count)) }}
</span></span><span class="line"><span class="cl">    {{ end }}
</span></span><span class="line"><span class="cl">{{- end }}
</span></span><span class="line"><span class="cl">{{ $result := ($.Scratch.Get &#34;tagsMap&#34;)}}
</span></span><span class="line"><span class="cl">`<span class="p">&lt;</span><span class="nt">span</span> <span class="na">id</span><span class="o">=</span><span class="s">&#34;tag-temp&#34;</span> <span class="na">style</span><span class="o">=</span><span class="s">&#34;display:none&#34;</span><span class="p">&gt;</span>`{{$result | jsonify }}
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">script</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="c1">//因为前期每个标签值比较小，帮X一个系数
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="c1">//为了动态宽度[[]()]()
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="kd">var</span> <span class="nx">div</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="s2">&#34;#sourrounding_div&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="nx">canvas</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="s2">&#34;#tag-canvas&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nx">canvas</span><span class="p">.</span><span class="nx">style</span><span class="p">.</span><span class="nx">width</span> <span class="o">=</span> <span class="nx">div</span><span class="p">.</span><span class="nx">offsetWidth</span><span class="o">+</span><span class="s1">&#39;px&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="nx">canvas</span><span class="p">.</span><span class="nx">style</span><span class="p">.</span><span class="nx">height</span> <span class="o">=</span> <span class="nx">div</span><span class="p">.</span><span class="nx">offsetHeight</span><span class="o">+</span><span class="s1">&#39;px&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="nx">wordFreqData</span> <span class="o">=</span>  <span class="nb">document</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="s2">&#34;#tag-temp&#34;</span><span class="p">).</span><span class="nx">innerHTML</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="kd">let</span> <span class="nx">tagMap</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Map</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">    <span class="kd">let</span> <span class="nx">tagArray</span> <span class="o">=</span> <span class="k">new</span> <span class="nb">Array</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">    <span class="p">{{</span><span class="o">-</span> <span class="nx">range</span> <span class="nx">$key</span><span class="p">,</span> <span class="nx">$value</span> <span class="o">:=</span> <span class="p">.</span><span class="nx">Data</span><span class="p">.</span><span class="nx">Terms</span> <span class="p">}}</span>
</span></span><span class="line"><span class="cl">    <span class="nx">tagMap</span><span class="p">.</span><span class="nx">set</span><span class="p">(</span><span class="s2">&#34;{{ $key }}&#34;</span><span class="p">,</span> <span class="p">{{</span><span class="o">-</span> <span class="nx">len</span> <span class="nx">$value</span> <span class="p">}});</span>
</span></span><span class="line"><span class="cl">    <span class="nx">tagArray</span><span class="p">.</span><span class="nx">push</span><span class="p">([{{</span><span class="o">-</span> <span class="nx">$key</span> <span class="p">}},</span> <span class="p">{{</span><span class="o">-</span> <span class="nx">len</span> <span class="nx">$value</span> <span class="p">}}]);</span>
</span></span><span class="line"><span class="cl">    <span class="p">{{</span><span class="o">-</span> <span class="nx">end</span> <span class="p">}}</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="c1">//获取当前是暗色还是浅色
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="kd">var</span> <span class="nx">isDark</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">body</span><span class="p">.</span><span class="nx">className</span><span class="p">.</span><span class="nx">includes</span><span class="p">(</span><span class="s2">&#34;dark&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nx">WordCloud</span><span class="p">(</span><span class="nx">canvas</span><span class="p">,</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">          <span class="s2">&#34;list&#34;</span><span class="o">:</span> <span class="nx">tagArray</span><span class="p">,</span><span class="c1">//或者[[&#39;各位观众&#39;,45],[&#39;词云&#39;, 21],[&#39;来啦!!!&#39;,13]],只要格式满足这样都可以
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>          <span class="s2">&#34;shape&#34;</span><span class="o">:</span> <span class="s2">&#34;diamond&#34;</span><span class="p">,</span> <span class="c1">//形状 circle (default), cardioid (心型), diamond, square, triangle-forward, triangle, pentagon, and star.
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>          <span class="s2">&#34;gridSize&#34;</span><span class="o">:</span> <span class="mi">18</span><span class="p">,</span> <span class="c1">// 密集程度 数字越小越密集
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>          <span class="s2">&#34;weightFactor&#34;</span><span class="o">:</span> <span class="mi">6</span><span class="p">,</span> <span class="c1">// 字体大小=原始大小*weightFactor
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>          <span class="s2">&#34;fontWeight&#34;</span><span class="o">:</span> <span class="s1">&#39;normal&#39;</span><span class="p">,</span> <span class="c1">//字体粗细
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>          <span class="s2">&#34;fontFamily&#34;</span><span class="o">:</span> <span class="s1">&#39;Times, serif&#39;</span><span class="p">,</span> <span class="c1">// 字体
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>          <span class="s2">&#34;hover&#34;</span><span class="o">:</span> <span class="nb">window</span><span class="p">.</span><span class="nx">drawBox</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">          <span class="s2">&#34;color&#34;</span><span class="o">:</span> <span class="nx">isDark</span><span class="o">?</span><span class="s1">&#39;random-light&#39;</span><span class="o">:</span><span class="s1">&#39;random-dark&#39;</span><span class="p">,</span> <span class="c1">// 字体颜色 &#39;random-dark&#39; 或者 &#39;random-light&#39;
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>          <span class="s2">&#34;backgroundColor&#34;</span><span class="o">:</span> <span class="s1">&#39;transparent&#39;</span><span class="p">,</span> <span class="c1">// 背景颜色
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>          <span class="s2">&#34;classes&#34;</span><span class="o">:</span> <span class="s2">&#34;tag-cloud-item word-color&#34;</span><span class="p">,</span> <span class="c1">//用于点击事件
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>          <span class="s2">&#34;shrinkToFit&#34;</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">          <span class="s2">&#34;rotationSteps&#34;</span><span class="o">:</span> <span class="mi">2</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">          <span class="s2">&#34;minSize&#34;</span><span class="o">:</span> <span class="s2">&#34;32&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">          <span class="s2">&#34;rotateRatio&#34;</span><span class="o">:</span> <span class="mi">0</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="p">});</span>
</span></span><span class="line"><span class="cl">      <span class="nx">canvas</span><span class="p">.</span><span class="nx">addEventListener</span><span class="p">(</span><span class="s1">&#39;wordcloudstop&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">e</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="c1">//点击
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>            <span class="nb">document</span><span class="p">.</span><span class="nx">querySelectorAll</span><span class="p">(</span><span class="s1">&#39;.tag-cloud-item&#39;</span><span class="p">).</span><span class="nx">forEach</span><span class="p">(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">element</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">                <span class="kr">const</span> <span class="nx">text</span> <span class="o">=</span> <span class="nx">element</span><span class="p">.</span><span class="nx">innerHTML</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">                <span class="nx">element</span><span class="p">.</span><span class="nx">innerHTML</span> <span class="o">=</span> <span class="sb">`&lt;a href=&#34;https://aikenh.cn/tags/</span><span class="si">${</span><span class="nx">text</span><span class="si">}</span><span class="sb">&#34; style=&#34;color: inherit;&#34;&gt;</span><span class="si">${</span><span class="nx">text</span><span class="si">}</span><span class="sb">&lt;/a&gt;`</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">            <span class="p">});</span>
</span></span><span class="line"><span class="cl">        <span class="p">});</span>
</span></span><span class="line"><span class="cl">  
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">{{- end }}{{/* end main */ -}}</span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>效果演示如下，各种的形状，参数等可以根据官网进行调整尝试，找到适合自己的。</p>
<p>
<div class="post-img-view">
  <a data-fancybox="gallery" href="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241220104910.png">
    <img alt="image.png" loading="lazy" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241220104910.png"class="responsive-image" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241220104910.png" style="display: block; margin: 0 auto;"
      alt="image.png"  />
  </a>
</div>


<script>
  document.addEventListener("DOMContentLoaded", function() {
      var images = document.querySelectorAll(".responsive-image");
      var maxHeight = window.innerHeight / 2.5;
      images.forEach(function(image) {
          image.style.maxHeight = maxHeight + "px";
      });
  });
</script>
</p>
<h3 id="gallery-使用简码支持-neogallery2">gallery 使用简码支持 neogallery2</h3>
<p>参考：<a href="https://cloud.tencent.com/developer/article/2246324" target="_blank" rel="noopener">Hugo博客添加相册功能-腾讯云-素履coder</a>
 的实现，这里不赘述，感谢博主，可以参照下一个章节优化一下国内的速度，替换一下 CDN。</p>
<h2 id="cdn-加速访问">CDN 加速访问</h2>
<p>通过 CDN <span class="sidenote-number"><small class="sidenote">Content Delivery Network 内容分发网络，使用靠近访问者的服务器为其分发内容</small></span> 来加速博客在不同地区的访问速度；</p>
<p>国内目前可用的 CDN 节点的话可以参考 <a href="https://blog.akass.cn/resources/mirrors" target="_blank" rel="noopener">aksBlog</a>
，感谢其整理与分享，目前本站主要使用的是cdn.jsdmirror.com <span class="sidenote-number"><small class="sidenote">感谢 blog.jsdmirror.com</small></span> ;</p>
<p>此外其实也可以将一些资源直接上传至仓库，直接利用发布平台托管静态文件，利用托管平台自身的服务也行吧；</p>
<h2 id="something-more">Something More</h2>
<h3 id="一些注意事项">一些注意事项</h3>
<p><strong>调试的时候</strong>记得使用 <code>--cleanDestinationDir</code> 选项，不然有时部分页面生成失败了，延续了之前的页面，会使得定位错误变得更加复杂麻烦。</p>
<h3 id="一些其他博主的设计">一些其他博主的设计</h3>
<ul>
<li><a href="https://loyayz.com/website/220610-hugo-papermodx-series-in-search-page.md/" target="_blank" rel="noopener">PaperMod 搜索页展示系列列表 | loyayz</a>
</li>
<li><a href="https://sspai.com/post/87431" target="_blank" rel="noopener">我的Hugo博客搭建记录 - 少数派</a>
 最后两个章节，集成 loading 和 memos =》 <a href="https://morick66.com/post/20241111200044/" target="_blank" rel="noopener">Obsidian到Anytype：Anytype介绍+个人实践分享</a>
 有很多有意思的页面爆改</li>
<li><a href="https://kenshin2438.top/archives/a8baf211.html/" target="_blank" rel="noopener">Hello World - Hugo博客搭建笔记 | Kenshin2438</a>
 一些修改的点子，虽然有一些没有实现</li>
<li><a href="https://hermygong.com/posts/papermod/build-my-website/#%e5%88%9b%e5%bb%ba%e7%ab%99%e7%82%b9%e5%92%8c%e4%b8%bb%e9%a2%98" target="_blank" rel="noopener">零基础搭建我的个人博客 | HermyGong&rsquo;s Studio</a>
 简单入门</li>
<li><a href="https://kdjlyy.github.io/posts/tech/markdown-note/#fnref:1" target="_blank" rel="noopener">PaperMod主题Markdown示例 | 向着悠远的苍穹</a>
</li>
</ul>
<h2 id="fi-写在最后">Fi 写在最后</h2>
<p>本博客的源码位于：<a href="https://github.com/AikenH/hugoblog" target="_blank" rel="noopener">AikenH/hugoblog: my blog’s hugo variant.</a>
 with submodule <a href="https://github.com/AikenH/papermod-sidebar" target="_blank" rel="noopener">AikenH/papermod-sidebar: my sidebar &amp; transparnet background variant of papermod</a>
</p>
<p>一些处理脚本后续可能会分享到：<a href="https://github.com/AikenH/ManipulateMarkdownNotes" target="_blank" rel="noopener">AikenH/ManipulateMarkdownNotes: manipulate markdown file for publish or some other reason</a>
 目前在 dev 分支完善中。</p>
<p>文中有任何错误、版权使用不当之处、或者问题欢迎指正和交流，可以留言也可以发邮件；</p>
]]></content:encoded>
    </item>
    <item>
      <title>初始化&amp;设置PaperMod主题的基础功能</title>
      <link>https://aikenh.cn/posts/%E5%88%9D%E5%A7%8B%E5%8C%96%E8%AE%BE%E7%BD%AEpapermod%E4%B8%BB%E9%A2%98%E7%9A%84%E5%9F%BA%E7%A1%80%E5%8A%9F%E8%83%BD/</link>
      <pubDate>Thu, 12 Dec 2024 13:26:12 +0000</pubDate>
      <guid>https://aikenh.cn/posts/%E5%88%9D%E5%A7%8B%E5%8C%96%E8%AE%BE%E7%BD%AEpapermod%E4%B8%BB%E9%A2%98%E7%9A%84%E5%9F%BA%E7%A1%80%E5%8A%9F%E8%83%BD/</guid>
      <description>以PaperMod主题为例，初始化hugo主题，并配置一些基础的功能</description>
      <content:encoded><![CDATA[<p>本文其实是配置和自定义 hugo 主题的第一章，从 papermod 的部署开始，记录整个基于 papermod 进行功能拓展和定制化的过程；</p>
<h2 id="setup-papermod-安装和设置-papermod">Setup PaperMod 安装和设置 PaperMod</h2>
<h3 id="init-hugo-project-初始化-hugo-项目">Init Hugo Project 初始化 Hugo 项目</h3>
<p>通过 hugo 指令新建一个 hugo 项目并制定使用 yaml 格式的配置进行设置；</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>bash</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">hugo new site <span class="o">{</span>your-proj-name<span class="o">}</span> --format yaml</span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>进入目录并通过 <code>git clone</code> 安装一个主题到 theme/ 目录下，如果想要使用 git 进行一些版本管理进行自己的修改，可能需要使用 submodule 的方式添加；</p>
<p>如果想直接对主题的内容也进行修改的话，建议先 fork 一下原仓库，将 fork 的仓库作为 submodule 和 hugo proj 一起进行版本管理和开发；</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>shell</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="nb">cd</span> <span class="o">{</span>your-proj-name<span class="o">}</span>
</span></span><span class="line"><span class="cl">git init <span class="c1"># [optional] for develop</span>
</span></span><span class="line"><span class="cl">git clone https://github.com/adityatelange/hugo-PaperMod themes/PaperMod --depth<span class="o">=</span><span class="m">1</span> 
</span></span><span class="line"><span class="cl">git submodule add --depth<span class="o">=</span><span class="m">1</span> https://github.com/adityatelange/hugo-PaperMod.git themes/PaperMod <span class="c1"># [optional] for develop</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>如果是自己的仓库，记得使用 git 的方式拉取，如果用 http 的方式拉取后，可能无法提交后续的修改，可以用下列命令去修改 submodule 对应的 url <span class="sidenote-number"><small class="sidenote"><a href="https://stackoverflow.com/questions/913701/how-to-change-the-remote-repository-for-a-git-submodule" target="_blank" rel="noopener">How to change the remote repository for a git submodule? - Stack Overflow</a></small></span></p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>bash</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git submodule set-url themes/PaperMod git@github.com:<span class="o">{</span>your-proj<span class="o">}</span>.git</span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><blockquote>
<p>后续部署的分支需要转换为 http 的形式，这里可以参见后面部署的文章。</p>
</blockquote>
<h3 id="manage-your-configurations-配置文件管理">Manage Your Configurations 配置文件管理</h3>
<p>推荐使用 config 文件夹切分基础配置和主题配置，这样方便在多个主题之间进行切换；</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>bash</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">cd</span> your-prj-name
</span></span><span class="line"><span class="cl">mkdir -p config/_default
</span></span><span class="line"><span class="cl">mkdir -p config/papermod
</span></span><span class="line"><span class="cl">touch config/paermod/hugo.yaml</span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>配置文件相关的目录结构如下：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>txt</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-txt" data-lang="txt"><span class="line"><span class="cl">.
</span></span><span class="line"><span class="cl">├── hugo.yaml
</span></span><span class="line"><span class="cl">├── config
</span></span><span class="line"><span class="cl">│   ├── _default
</span></span><span class="line"><span class="cl">│   │   └── hugo.yaml
</span></span><span class="line"><span class="cl">│   └── papermod
</span></span><span class="line"><span class="cl">│       └── hugo.yaml</span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>此处使用根目录的 <code>hugo.yaml</code> 作为默认的配置文件，<code>papermod/hugo.yaml</code> 设置主题特有的配置项，启动特定主题时使用 <code>--environment {config-dif}</code> 指定使用特定的配置文件：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>bash</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">hugo --environment papermod server</span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><blockquote>
<p>该部分具体的配置切分目前还没有完全确定，暂时还没有深入尝试使用别的主题，但是结构上应该是没问题的；</p>
</blockquote>
<h3 id="hugos-organization-博客的文件夹组织逻辑">Hugo&rsquo;s Organization 博客的文件夹组织逻辑</h3>
<p>在进行后续的修改和迭代之前，了解一下 hugo 目录结构对应的作用 <span class="sidenote-number"><small class="sidenote"><a href="https://hugo.opendocs.io/getting-started/directory-structure/" target="_blank" rel="noopener">目录结构 | Hugo官方文档</a></small></span> 是相当重要的，此外由于本文对 PaperMod 主题进行修改，也要对 PaperMod 的覆盖逻辑有一定的了解，包括模版覆盖 <span class="sidenote-number"><small class="sidenote"><a href="https://github.com/adityatelange/hugo-PaperMod/wiki/FAQs#override-theme-template" target="_blank" rel="noopener">hugo-PaperMod Wiki-override-theme-template</a></small></span> 和样式覆盖 <span class="sidenote-number"><small class="sidenote"><a href="https://github.com/adityatelange/hugo-PaperMod/wiki/FAQs#bundling-custom-css-with-themes-assets" target="_blank" rel="noopener">hugo-PaperMod Wiki-bundling-custom-css-with-themes-assets</a></small></span> ，由于官方文档中的介绍都比较详细，这里就不在赘述。</p>
<p>这里有一个特殊功能界面 <code>_index.md</code> 可以通过<a href="https://hugo.opendocs.io/content-management/organization/" target="_blank" rel="noopener">内容组织 | Hugo官方文档</a>
 简单了解并尝试一下，后面对组织文档和界面可能会有用武之地。</p>
<h3 id="papermod-setting-主题的基础页面配置">PaperMod Setting 主题的基础页面配置</h3>
<p><strong>一、设置自己的文章模版</strong></p>
<p>Archetypes 文件夹中可以注册不同的文章模版 <code>archetypes/{template.md}</code>，可以使用下列命令来基于指定的模版新建文章，此处由于大多时候都是直接使用 obsidian 编写后迁移过来的，该部分就不做太多说明；</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>shell</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">hugo new --kind template <span class="o">{</span>post-name<span class="o">}</span>.md</span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>但是<a href="https://github.com/adityatelange/hugo-PaperMod/wiki/Installation#sample-pagemd" target="_blank" rel="noopener">官方模版中页面</a>
包含了大量的元数据信息，如果不是需要经常修改的属性，可以直接丢到 <code>Theme/Hugo.yaml</code> 中，避免每个 markdown 的元信息都十分冗长，等需要修改的时候再用指定的 <code>markdown</code> 上新增去覆盖即可；</p>
<p><strong>二、启用 Archive 、 Search 、About页面等</strong></p>
<p>此外 PaperMod 的很多页面是没有默认开启的包括 Search，Archive ，这些参考<a href="https://github.com/adityatelange/hugo-PaperMod/wiki/Features" target="_blank" rel="noopener">官方 wiki</a>
 或者中文的话 <a href="https://www.shaohanyun.top/posts/env/blog_build2/" target="_blank" rel="noopener">PaperMod主题配置 | 🚀 田少晗的个人博客</a>
 简单配置一下这些页面，并启动 server 看一下这些页面是否正常生成；</p>
<p>about 界面可以仿照 archive 界面直接创建一个 about.md 在 content 目录中，最终其呈现的 URL 如下：<code>http://localhost:1313/about/</code>，content 中存放文件的最终路径均类似，会包含对应的文件夹路径。创建完成后将其新增到导航栏中 <span class="sidenote-number"><small class="sidenote"><a href="https://github.com/adityatelange/hugo-PaperMod/wiki/FAQs#add-menu-to-site" target="_blank" rel="noopener">FAQs · adityatelange/hugo-PaperMod Wiki</a></small></span> :</p>
<p><strong>三、参考<a href="https://github.com/adityatelange/hugo-PaperMod/wiki/Features" target="_blank" rel="noopener">官方wiki</a>
 完成自己需要的基本模式和参数设置。</strong></p>
<p>完成上面三步设置之后，添加一下博文测试一下各方面效果是否符合预期，没问题的话就可以开始折腾了👹</p>
<h2 id="extra-basic-function-support-额外基础功能支持">Extra Basic Function Support 额外基础功能支持</h2>
<p>现在编写 Markdown 的时候事实上大多都额外支持或者使用了 Html 的部分语法来使得 Markdown 更加美观，或者是 Latex 来记录一些数学推导，但是博客本身这些功能要么没有默认开启或者是没有很好的支持，因此首先拓展这些基础功能；</p>
<h3 id="render-html-支持对-html-的渲染">Render Html 支持对 html 的渲染</h3>
<p>基于安全性考虑，默认的 Goldmark 并不会渲染混合在 markdown 中的 html <span class="sidenote-number"><small class="sidenote"><a href="https://gohugo.io/getting-started/configuration-markup/#rendererunsafe" target="_blank" rel="noopener">Configure markup | Hugo</a></small></span> ，要打开的话修改/添加如下设置即可：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>yaml</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">markup</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">goldmark</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">renderer</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">unsafe</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><blockquote>
<p>这里请确保自己的 html 内容是安全的</p>
</blockquote>
<h3 id="render-latex-支持渲染-latex">Render Latex 支持渲染 Latex</h3>
<p>这一部分相关的资料和文章还是比较多的，主要会遇到的问题都是由于 markdown 渲染和 latex 渲染之间的冲突导致的，被 <code> $</code> 或者 <code>$$ </code> 包裹的内容需要如何被匹配和被谁渲染，以及一些其他的特殊字符之间的问题；</p>



  
  

<blockquote class="alert-blockquote alert-error">
  <p class="alert-heading">
    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16">
      <path d="M4.47.22A.749.749 0 0 1 5 0h6c.199 0 .389.079.53.22l4.25 4.25c.141.14.22.331.22.53v6a.749.749 0 0 1-.22.53l-4.25 4.25A.749.749 0 0 1 11 16H5a.749.749 0 0 1-.53-.22L.22 11.53A.749.749 0 0 1 0 11V5c0-.199.079-.389.22-.53Zm.84 1.28L1.5 5.31v5.38l3.81 3.81h5.38l3.81-3.81V5.31L10.69 1.5ZM8 4a.75.75 0 0 1 .75.75v3.5a.75.75 0 0 1-1.5 0v-3.5A.75.75 0 0 1 8 4Zm0 8a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"></path>
    </svg>
    <span>Error</span>
  </p>
  <p>没有特别处理过的话，最终会导致一些复杂的 Latex 或者是一些内联公式导致最后的样式混乱；</p>

</blockquote>
<p>经过多种尝试后，这里最终使用的如下方案 <span class="sidenote-number"><small class="sidenote">使用 <a href="https://gohugo.io/content-management/mathematics/" target="_blank" rel="noopener">Mathematics in Markdown | Hugo</a>
 中的分隔符处理</small></span> <span class="sidenote-number"><small class="sidenote">使用 <a href="https://kiwamizamurai.github.io/posts/2022-03-06/" target="_blank" rel="noopener">How to enable latex on PaperMod | terakoya</a>
 该博主的 katex 方案</small></span>  <span class="sidenote-number"><small class="sidenote"><a href="https://github.com/adityatelange/hugo-PaperMod/issues/236" target="_blank" rel="noopener">How to enable Math Typesetting in PaperMod? · Issue #236 · adityatelange/hugo-PaperMod</a>
 也提到了这种混合解法</small></span> ：</p>
<p>修改 <code>hugo.yaml</code> ：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>yaml</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">markup</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">goldmark</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">extensions</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">passthrough</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">delimiters</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">block</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span>- - <span class="l">\[</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span>- <span class="l">\]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span>- - <span class="l">$$</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span>- <span class="l">$$</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">inline</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span>- - <span class="l">\(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span>- <span class="l">\)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">enable</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">params</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">math</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>在 <code>layouts/partials</code> 中添加 <code>math.html</code></p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>html</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">link</span> <span class="na">rel</span><span class="o">=</span><span class="s">&#34;stylesheet&#34;</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;https://cdn.jsdelivr.net/npm/katex@0.15.2/dist/katex.min.css&#34;</span> <span class="na">integrity</span><span class="o">=</span><span class="s">&#34;sha384-MlJdn/WNKDGXveldHDdyRP1R4CTHr3FeuDNfhsLPYrq2t0UBkUdK2jyTnXPEK1NQ&#34;</span> <span class="na">crossorigin</span><span class="o">=</span><span class="s">&#34;anonymous&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="c">&lt;!-- The loading of KaTeX is deferred to speed up page rendering --&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">script</span> <span class="na">defer</span> <span class="na">src</span><span class="o">=</span><span class="s">&#34;https://cdn.jsdelivr.net/npm/katex@0.15.2/dist/katex.min.js&#34;</span> <span class="na">integrity</span><span class="o">=</span><span class="s">&#34;sha384-VQ8d8WVFw0yHhCk5E8I86oOhv48xLpnDZx5T9GogA/Y84DcCKWXDmSDfn13bzFZY&#34;</span> <span class="na">crossorigin</span><span class="o">=</span><span class="s">&#34;anonymous&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="c">&lt;!-- To automatically render math in text elements, include the auto-render extension: --&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">script</span> <span class="na">defer</span> <span class="na">src</span><span class="o">=</span><span class="s">&#34;https://cdn.jsdelivr.net/npm/katex@0.15.2/dist/contrib/auto-render.min.js&#34;</span> <span class="na">integrity</span><span class="o">=</span><span class="s">&#34;sha384-+XBljXPPiv+OzfbB3cVmLHf4hdUFHlWNZN5spNQ7rmHTXpd7WvJum6fIACpNNfIR&#34;</span> <span class="na">crossorigin</span><span class="o">=</span><span class="s">&#34;anonymous&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="na">onload</span><span class="o">=</span><span class="s">&#34;renderMathInElement(document.body);&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c">&lt;!-- for inline --&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">script</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="nb">document</span><span class="p">.</span><span class="nx">addEventListener</span><span class="p">(</span><span class="s2">&#34;DOMContentLoaded&#34;</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">renderMathInElement</span><span class="p">(</span><span class="nb">document</span><span class="p">.</span><span class="nx">body</span><span class="p">,</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">delimiters</span><span class="o">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">            <span class="p">{</span><span class="nx">left</span><span class="o">:</span> <span class="s2">&#34;$$&#34;</span><span class="p">,</span> <span class="nx">right</span><span class="o">:</span> <span class="s2">&#34;$$&#34;</span><span class="p">,</span> <span class="nx">display</span><span class="o">:</span> <span class="kc">true</span><span class="p">},</span>
</span></span><span class="line"><span class="cl">            <span class="p">{</span><span class="nx">left</span><span class="o">:</span> <span class="s2">&#34;$&#34;</span><span class="p">,</span> <span class="nx">right</span><span class="o">:</span> <span class="s2">&#34;$&#34;</span><span class="p">,</span> <span class="nx">display</span><span class="o">:</span> <span class="kc">false</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="p">});</span>
</span></span><span class="line"><span class="cl"><span class="p">});</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">script</span><span class="p">&gt;</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>在 <code>layouts/partials/extend_head.html</code> 的末尾添加如下内容：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>html</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl">{{ if or .Params.math .Site.Params.math }}
</span></span><span class="line"><span class="cl">{{ partial &#34;math.html&#34; . }}
</span></span><span class="line"><span class="cl">{{ end }}</span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>此外，针对有时因为三个 <code>{{{</code> 的出现导致渲染公式异常的情况<span class="sidenote-number"><small class="sidenote"><a href="https://www.shaohanyun.top/posts/env/hugo_mathjax/" target="_blank" rel="noopener">Hugo博客添加LaTeX语法支持 | 🚀 田少晗的个人博客</a></small></span>，可以通过脚本在 publish 时在代码块外侧添加 <code>&lt;div&gt;&lt;/div&gt;</code> 避免 markdown 干涉公式的渲染，使其正确渲染：</p>
<p>这里提供我的处理脚本，以供参考：</p>
<blockquote>
<p>并不一定需要处理，可以视自己配置后的具体情况而定</p>
</blockquote>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>python</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">_surround_latex_by_tag</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">content</span><span class="p">:</span><span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="c1"># *. need to match those inline latex &amp; block latex &amp; ignore those $ in ``` block</span>
</span></span><span class="line"><span class="cl">        <span class="c1"># 1. read code block and ignore it.</span>
</span></span><span class="line"><span class="cl">        <span class="c1"># 非贪婪匹配</span>
</span></span><span class="line"><span class="cl">        <span class="n">code_block_pattern</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="sa">r</span><span class="s1">&#39;```.*?```&#39;</span><span class="p">,</span> <span class="n">re</span><span class="o">.</span><span class="n">DOTALL</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">preserved_code_blocks</span> <span class="o">=</span> <span class="p">{}</span>
</span></span><span class="line"><span class="cl">        <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="k">match</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">code_block_pattern</span><span class="o">.</span><span class="n">finditer</span><span class="p">(</span><span class="n">content</span><span class="p">)):</span>
</span></span><span class="line"><span class="cl">            <span class="n">placeholder</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&#34;__CODE_BLOCK_</span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s2">__&#34;</span>
</span></span><span class="line"><span class="cl">            <span class="n">preserved_code_blocks</span><span class="p">[</span><span class="n">placeholder</span><span class="p">]</span> <span class="o">=</span> <span class="k">match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="n">content</span> <span class="o">=</span> <span class="n">content</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="k">match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">0</span><span class="p">),</span> <span class="n">placeholder</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="c1"># 2. add space surround the inline latex sentence</span>
</span></span><span class="line"><span class="cl">        <span class="n">inline_latex_pattern</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="sa">r</span><span class="s1">&#39;(?&lt;!\ $)(\$ .*?\ $)(?!\$ )&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        
</span></span><span class="line"><span class="cl">        <span class="n">content</span> <span class="o">=</span> <span class="n">inline_latex_pattern</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="k">lambda</span> <span class="k">match</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_latex_add_space_inline</span><span class="p">(</span><span class="k">match</span><span class="p">,</span> <span class="n">content</span><span class="p">),</span> <span class="n">content</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="c1"># 3. add newline between the `\ $\$ ` block or `\ $\$ \$` block </span>
</span></span><span class="line"><span class="cl">        <span class="n">block_latex_pattern</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="sa">r</span><span class="s1">&#39;(?&lt;!\S)(\ $\$ .*?\ $\$ |(?&lt;!\S)\ $\$ \ $.*?\$ \ $\$ )(?!\S)&#39;</span><span class="p">,</span> <span class="n">re</span><span class="o">.</span><span class="n">DOTALL</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="n">content</span> <span class="o">=</span> <span class="n">block_latex_pattern</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="k">lambda</span> <span class="k">match</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_latex_add_div_tags</span><span class="p">(</span><span class="k">match</span><span class="p">,</span> <span class="n">content</span><span class="p">),</span> <span class="n">content</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="c1"># 4. restore the code block</span>
</span></span><span class="line"><span class="cl">        <span class="k">for</span> <span class="n">placeholder</span><span class="p">,</span> <span class="n">code_block</span> <span class="ow">in</span> <span class="n">preserved_code_blocks</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">            <span class="n">content</span> <span class="o">=</span> <span class="n">content</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">placeholder</span><span class="p">,</span> <span class="n">code_block</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="n">content</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>其他参考资料 <span class="sidenote-number"><small class="sidenote"><a href="https://adityatelange.github.io/hugo-PaperMod/posts/math-typesetting/" target="_blank" rel="noopener">Math Typesetting | PaperMod</a></small></span></p>
<h3 id="rss-setting-for-follow-为-follow-认证设置-rss">Rss Setting for Follow 为 follow 认证设置 rss</h3>
<p>Ref： <a href="https://rokcso.com/p/follow-claim-feed/" target="_blank" rel="noopener">Follow 中如何 Claim 自己的博客 | Rokcso&rsquo;s blog</a>
</p>
<p>参考上述文章，在 <code>rss.xml</code> 中设置相关的 RSS Tag 即可，感谢博主的分享；</p>
<h3 id="copyright-setting-在-footer-设置-license">CopyRight Setting 在 footer 设置 License</h3>
<p>参考：<a href="https://www.yunyitang.me/hugo-papermod-blog/" target="_blank" rel="noopener">Hugo+PaperMod 双语博客搭建 Home-Info+Profile Mode - YUNYI BLOG</a>
 ，从 <a href="https://chooser-beta.creativecommons.org/" target="_blank" rel="noopener">Choose a License</a>
 按自己的需求选择一个协议，并设置自己的知识共享协议；</p>
<p>
<div class="post-img-view">
  <a data-fancybox="gallery" href="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241218212740.png">
    <img alt="image.png" loading="lazy" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241218212740.png"class="responsive-image" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241218212740.png" style="display: block; margin: 0 auto;"
      alt="image.png"  />
  </a>
</div>


<script>
  document.addEventListener("DOMContentLoaded", function() {
      var images = document.querySelectorAll(".responsive-image");
      var maxHeight = window.innerHeight / 2.5;
      images.forEach(function(image) {
          image.style.maxHeight = maxHeight + "px";
      });
  });
</script>
</p>
<p>我这里直接硬编码进 <code>layouts/partials/footer.html</code> 中 如下：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>html</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">footer</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;footer&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    {{- if not site.Params.footer.hideCopyright }}
</span></span><span class="line"><span class="cl">        {{- if site.Copyright }}
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nt">span</span><span class="p">&gt;</span>{{ site.Copyright | markdownify }}<span class="p">&lt;/</span><span class="nt">span</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        {{- else }}
</span></span><span class="line"><span class="cl">        
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nt">span</span><span class="p">&gt;</span><span class="ni">&amp;copy;</span> {{ now.Year }} <span class="p">&lt;</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;{{ &#34;</span><span class="err">&#34;</span> <span class="err">|</span> <span class="na">absLangURL</span> <span class="err">}}&#34;</span><span class="p">&gt;</span>{{ site.Title }}<span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;&lt;/</span><span class="nt">span</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nt">span</span> <span class="na">xmlns:cc</span><span class="o">=</span><span class="s">&#34;http://creativecommons.org/ns#&#34;</span> <span class="na">xmlns:dct</span><span class="o">=</span><span class="s">&#34;http://purl.org/dc/terms/&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">            Licensed under
</span></span><span class="line"><span class="cl">            <span class="p">&lt;</span><span class="nt">a</span>
</span></span><span class="line"><span class="cl">              <span class="na">href</span><span class="o">=</span><span class="s">&#34;https://creativecommons.org/licenses/by-nc/4.0/?ref=chooser-v1&#34;</span>
</span></span><span class="line"><span class="cl">              <span class="na">target</span><span class="o">=</span><span class="s">&#34;_blank&#34;</span>
</span></span><span class="line"><span class="cl">              <span class="na">rel</span><span class="o">=</span><span class="s">&#34;license noopener noreferrer&#34;</span>
</span></span><span class="line"><span class="cl">              <span class="na">style</span><span class="o">=</span><span class="s">&#34;display:inline-block;&#34;</span>
</span></span><span class="line"><span class="cl">              <span class="p">&gt;</span>CC BY-NC 4.0 <span class="p">&lt;/</span><span class="nt">a</span>
</span></span><span class="line"><span class="cl">            <span class="p">&gt;&lt;/</span><span class="nt">span</span>
</span></span><span class="line"><span class="cl">        <span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        {{- end }}
</span></span><span class="line"><span class="cl">        {{- print &#34; · &#34;}}
</span></span><span class="line"><span class="cl">    {{- end }}</span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><h2 id="basic-style-change-基础样式修改">Basic Style Change 基础样式修改</h2>
<p>PaperMod 主题本身有一些基础样式个人不是很喜欢，例如内容部分的宽度比较窄，在全屏或者宽屏观看的时候比较变扭。因此这里也会针对主题的一些基础样式做针对的调整。</p>
<h3 id="get-wider-space-for-content-拓宽正文区域">Get Wider Space for Content 拓宽正文区域</h3>
<p>根据自己的布局修改 <code>css</code> 中如下属性即可 <span class="sidenote-number"><small class="sidenote"><a href="https://github.com/adityatelange/hugo-PaperMod/discussions/442" target="_blank" rel="noopener">Change width of the content  hugo-PaperMod · Discussion #442</a></small></span> ：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>css</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="p">:</span><span class="nd">root</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nv">--post-width</span><span class="p">:</span> <span class="nf">max</span><span class="p">(</span><span class="mi">60</span><span class="kt">vw</span><span class="p">,</span> <span class="mi">100</span><span class="kt">vh</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="nv">--main-width</span><span class="p">:</span> <span class="nf">max</span><span class="p">(</span><span class="mi">60</span><span class="kt">vw</span><span class="p">,</span> <span class="mi">100</span><span class="kt">vh</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><h3 id="header-counter-为-title-添加章节序号">Header Counter 为 Title 添加章节序号</h3>
<p>直接利用 CSS 的 <code>counter</code> 和 <code>before</code> 属性为正文中的小标题添加对应的章节序号，实现如下：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>css</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="nt">main</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">counter-reset</span><span class="p">:</span> <span class="n">h1-cnt</span> <span class="n">h2-cnt</span> <span class="n">h3-cnt</span> <span class="n">h4-cnt</span> <span class="n">h5-cnt</span> <span class="n">h6-cnt</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">post-content</span> <span class="nt">h1</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">counter-increment</span><span class="p">:</span> <span class="n">h1-cnt</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">counter-reset</span><span class="p">:</span> <span class="n">h2-cnt</span> <span class="n">h3-cnt</span> <span class="n">h4-cnt</span> <span class="n">h5-cnt</span> <span class="n">h6-cnt</span><span class="p">;</span> <span class="c">/* Reset lower levels */</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">post-content</span> <span class="nt">h2</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">counter-increment</span><span class="p">:</span> <span class="n">h2-cnt</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">counter-reset</span><span class="p">:</span> <span class="n">h3-cnt</span> <span class="n">h4-cnt</span> <span class="n">h5-cnt</span> <span class="n">h6-cnt</span><span class="p">;</span> <span class="c">/* Reset lower levels */</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">post-content</span> <span class="nt">h3</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">counter-increment</span><span class="p">:</span> <span class="n">h3-cnt</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">counter-reset</span><span class="p">:</span> <span class="n">h4-cnt</span> <span class="n">h5-cnt</span> <span class="n">h6-cnt</span><span class="p">;</span> <span class="c">/* Reset lower levels */</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">post-content</span> <span class="nt">h4</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">counter-increment</span><span class="p">:</span> <span class="n">h4-cnt</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">counter-reset</span><span class="p">:</span> <span class="n">h5-cnt</span> <span class="n">h6-cnt</span><span class="p">;</span> <span class="c">/* Reset lower levels */</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">post-content</span> <span class="nt">h5</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">counter-increment</span><span class="p">:</span> <span class="n">h5-cnt</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">counter-reset</span><span class="p">:</span> <span class="n">h6-cnt</span><span class="p">;</span> <span class="c">/* Reset lower levels */</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">post-content</span> <span class="nt">h6</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">counter-increment</span><span class="p">:</span> <span class="n">h6-cnt</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">post-content</span> <span class="nt">h1</span><span class="p">::</span><span class="nd">before</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">content</span><span class="p">:</span> <span class="nb">counter</span><span class="p">(</span><span class="n">h1</span><span class="o">-</span><span class="n">cnt</span><span class="p">)</span> <span class="s1">&#39;. &#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">post-content</span> <span class="nt">h2</span><span class="p">::</span><span class="nd">before</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">content</span><span class="p">:</span> <span class="nb">counter</span><span class="p">(</span><span class="n">h2</span><span class="o">-</span><span class="n">cnt</span><span class="p">)</span> <span class="s1">&#39;. &#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">post-content</span> <span class="nt">h3</span><span class="p">::</span><span class="nd">before</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">content</span><span class="p">:</span> <span class="nb">counter</span><span class="p">(</span><span class="n">h2</span><span class="o">-</span><span class="n">cnt</span><span class="p">)</span> <span class="s1">&#39;.&#39;</span> <span class="nb">counter</span><span class="p">(</span><span class="n">h3</span><span class="o">-</span><span class="n">cnt</span><span class="p">)</span> <span class="s1">&#39;. &#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">post-content</span> <span class="nt">h4</span><span class="p">::</span><span class="nd">before</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">content</span><span class="p">:</span> <span class="nb">counter</span><span class="p">(</span><span class="n">h2</span><span class="o">-</span><span class="n">cnt</span><span class="p">)</span> <span class="s1">&#39;.&#39;</span> <span class="nb">counter</span><span class="p">(</span><span class="n">h3</span><span class="o">-</span><span class="n">cnt</span><span class="p">)</span> <span class="s1">&#39;.&#39;</span> <span class="nb">counter</span><span class="p">(</span><span class="n">h4</span><span class="o">-</span><span class="n">cnt</span><span class="p">)</span> <span class="s1">&#39;. &#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">post-content</span> <span class="nt">h5</span><span class="p">::</span><span class="nd">before</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">content</span><span class="p">:</span> <span class="nb">counter</span><span class="p">(</span><span class="n">h2</span><span class="o">-</span><span class="n">cnt</span><span class="p">)</span> <span class="s1">&#39;.&#39;</span> <span class="nb">counter</span><span class="p">(</span><span class="n">h3</span><span class="o">-</span><span class="n">cnt</span><span class="p">)</span> <span class="s1">&#39;.&#39;</span> <span class="nb">counter</span><span class="p">(</span><span class="n">h4</span><span class="o">-</span><span class="n">cnt</span><span class="p">)</span> <span class="s1">&#39;.&#39;</span> <span class="nb">counter</span><span class="p">(</span><span class="n">h5</span><span class="o">-</span><span class="n">cnt</span><span class="p">)</span> <span class="s1">&#39;. &#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">post-content</span> <span class="nt">h6</span><span class="p">::</span><span class="nd">before</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">content</span><span class="p">:</span> <span class="nb">counter</span><span class="p">(</span><span class="n">h2</span><span class="o">-</span><span class="n">cnt</span><span class="p">)</span> <span class="s1">&#39;.&#39;</span> <span class="nb">counter</span><span class="p">(</span><span class="n">h3</span><span class="o">-</span><span class="n">cnt</span><span class="p">)</span> <span class="s1">&#39;.&#39;</span> <span class="nb">counter</span><span class="p">(</span><span class="n">h4</span><span class="o">-</span><span class="n">cnt</span><span class="p">)</span> <span class="s1">&#39;.&#39;</span> <span class="nb">counter</span><span class="p">(</span><span class="n">h5</span><span class="o">-</span><span class="n">cnt</span><span class="p">)</span> <span class="s1">&#39;.&#39;</span> <span class="nb">counter</span><span class="p">(</span><span class="n">h6</span><span class="o">-</span><span class="n">cnt</span><span class="p">)</span> <span class="s1">&#39;. &#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>需要注意的是，这里由于笔者习惯在正文中仅使用&gt;=2 级的标题，因此对 H1 是没有做显示的，如果需要从 H1 开始需要对上述 css 进行简单调整；</p>
<p>
<div class="post-img-view">
  <a data-fancybox="gallery" href="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241218190430.png">
    <img alt="image.png" loading="lazy" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241218190430.png"class="responsive-image" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241218190430.png" style="display: block; margin: 0 auto;"
      alt="image.png"  />
  </a>
</div>


<script>
  document.addEventListener("DOMContentLoaded", function() {
      var images = document.querySelectorAll(".responsive-image");
      var maxHeight = window.innerHeight / 2.5;
      images.forEach(function(image) {
          image.style.maxHeight = maxHeight + "px";
      });
  });
</script>
</p>
<p>将该 css 存放在 <code>assets/css/extended</code> 中即可生效。</p>
<h3 id="pagination-update-分页拓展">Pagination Update 分页拓展</h3>
<p>当博客多起来以后，如果在 post 界面不显示页码，以及不能快速的回到首页的话，十分破坏体验，因此简单的添加了回到首页和去到尾页的按钮，方便翻页操作，同时将页码打开，效果如下：</p>
<p>
<div class="post-img-view">
  <a data-fancybox="gallery" href="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241218190634.png">
    <img alt="image.png" loading="lazy" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241218190634.png"class="responsive-image" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241218190634.png" style="display: block; margin: 0 auto;"
      alt="image.png"  />
  </a>
</div>


<script>
  document.addEventListener("DOMContentLoaded", function() {
      var images = document.querySelectorAll(".responsive-image");
      var maxHeight = window.innerHeight / 2.5;
      images.forEach(function(image) {
          image.style.maxHeight = maxHeight + "px";
      });
  });
</script>
</p>
<p>一、在 <code>hugo.yml</code> 中开启页码</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>yaml</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">params</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">ShowPageNums</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>二、添加跳转至首页和尾页的 button <span class="sidenote-number"><small class="sidenote">参数参考<a href="https://hugo.opendocs.io/templates/pagination/" target="_blank" rel="noopener">分页 | Hugo官方文档</a></small></span></p>
<p>在 <code>layouts/_default/list.html</code> 中的 prev 和 next 处添加 button 如下：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>html</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">footer</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;page-footer&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">nav</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;pagination&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    {{- if $paginator.HasPrev }}
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">a</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;last-icon&#34;</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;{{ $paginator.First.URL | absURL }}&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="c">&lt;!-- &lt;ion-icon name=&#34;play-back-circle-outline&#34;&gt;&lt;/ion-icon&gt; --&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;</span><span class="nt">span</span><span class="p">&gt;</span><span class="err">&lt;&lt;</span><span class="p">&lt;/</span><span class="nt">span</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">a</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;prev&#34;</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;{{ $paginator.Prev.URL | absURL }}&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      «<span class="ni">&amp;nbsp;</span>{{ i18n &#34;prev_page&#34; }}<span class="ni">&amp;nbsp;</span>
</span></span><span class="line"><span class="cl">      {{- if (.Param &#34;ShowPageNums&#34;) }}
</span></span><span class="line"><span class="cl">      {{- sub $paginator.PageNumber 1 }}/{{ $ paginator.TotalPages }}
</span></span><span class="line"><span class="cl">      {{- end }}
</span></span><span class="line"><span class="cl">    <span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    {{- end }}
</span></span><span class="line"><span class="cl">    {{- if $paginator.HasNext }}
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">a</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;next&#34;</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;{{ $paginator.Next.URL | absURL }}&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      {{- i18n &#34;next_page&#34; }}<span class="ni">&amp;nbsp;</span>
</span></span><span class="line"><span class="cl">      {{- if (.Param &#34;ShowPageNums&#34;) }}
</span></span><span class="line"><span class="cl">      {{- add 1 $paginator.PageNumber }}/{{ $ paginator.TotalPages }}
</span></span><span class="line"><span class="cl">      {{- end }}<span class="ni">&amp;nbsp;</span>»
</span></span><span class="line"><span class="cl">    <span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">a</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;last-icon&#34;</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;{{ $paginator.Last.URL | absURL }}&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="c">&lt;!-- &lt;ion-icon name=&#34;play-forward-circle-outline&#34;&gt;&lt;/ion-icon&gt; --&gt;</span>
</span></span><span class="line"><span class="cl">       <span class="p">&lt;</span><span class="nt">span</span><span class="p">&gt;</span>&gt;&gt;<span class="p">&lt;/</span><span class="nt">span</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    {{- end }}
</span></span><span class="line"><span class="cl">  <span class="p">&lt;/</span><span class="nt">nav</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">footer</span><span class="p">&gt;</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>三、简单设置其样式即可，可以在 <code>assets/css/extended</code> 中随意添加一个 css 文件对默认样式进行覆盖，当然也可以考虑写在主题的 css 中。</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>css</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="p">.</span><span class="nc">pagination</span> <span class="nt">a</span><span class="p">.</span><span class="nc">last-icon</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">background</span><span class="p">:</span> <span class="kc">unset</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">border</span><span class="p">:</span> <span class="kc">unset</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">font-size</span><span class="p">:</span> <span class="mf">1.3</span><span class="kt">rem</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">color</span><span class="p">:</span> <span class="mh">#001e1d</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="c">/* padding-top: 2px; */</span>
</span></span><span class="line"><span class="cl">  <span class="k">font-weight</span><span class="p">:</span> <span class="kc">bold</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">pagination</span> <span class="nt">a</span><span class="p">.</span><span class="nc">last-icon</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">color</span><span class="p">:</span> <span class="nf">var</span><span class="p">(</span><span class="o">--</span><span class="n">primary</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>虽然没有按照该方法实现，但是如果想要更好的分页，可以参考<a href="https://blog.dsrkafuu.net/post/2019/hugo-custom-pagination/" target="_blank" rel="noopener">自定义 Hugo 的分页导航栏 | DSRBLOG</a>
；</p>
<h3 id="pangu-js-引入盘古之白">PanGu JS 引入盘古之白</h3>


<blockquote class="quote-center"><p>為什麼你們就是不能加個空格呢？<span class="sidenote-number"><small class="sidenote"><a href="https://github.com/vinta/pangu.js" target="_blank" rel="noopener">vinta/pangu.js: Paranoid text spacing in JavaScript</a></small></span></p>
<p>如果你跟我一樣，每次看到網頁上的中文字和英文、數字、符號擠在一塊，就會坐立難安，忍不住想在它們之間加個空格。這個外掛（支援 Chrome 和 Firefox）正是你在網路世界走跳所需要的東西，它會自動替你在網頁中所有的中文字和半形的英文、數字、符號之間插入空白。</p>
<p>漢學家稱這個空白字元為「盤古之白 ，因為它劈開了全形字和半形字之間的混沌。另有研究顯示，打字的時候不喜歡在中文和英文之間加空格的人，感情路都走得很辛苦，有七成的比例會在 34 歲的時候跟自己不愛的人結婚，而其餘三成的人最後只能把遺產留給自己的貓。畢竟愛情跟書寫都需要適時地留白。</p>
</blockquote> 

<p>感谢 <code>pangu.js</code> 的作者，以及分享异步加载方案的博主 <span class="sidenote-number"><small class="sidenote"><a href="https://yihui.org/cn/2017/05/pangu/" target="_blank" rel="noopener">盘古之白 - 中英文之间自动加空格 - Yihui Xie | 谢益辉</a></small></span> <span class="sidenote-number"><small class="sidenote"><a href="https://huuuuuuo.github.io/post/hugo%E4%B8%AD%E8%8B%B1%E6%96%87%E4%B9%8B%E9%97%B4%E8%87%AA%E5%8A%A8%E5%8A%A0%E7%A9%BA%E6%A0%BC/" target="_blank" rel="noopener">Hugo：中英文之间自动加空格 | Blog</a></small></span> ， 将该脚本异步引入 hugo 中。</p>
<p>在 <code>layouts\partials\footer.html</code> 中添加即可。</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>html</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">script</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">u</span><span class="p">,</span> <span class="nx">c</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="kd">var</span> <span class="nx">d</span> <span class="o">=</span> <span class="nb">document</span><span class="p">,</span> <span class="nx">t</span> <span class="o">=</span> <span class="s1">&#39;script&#39;</span><span class="p">,</span> <span class="nx">o</span> <span class="o">=</span> <span class="nx">d</span><span class="p">.</span><span class="nx">createElement</span><span class="p">(</span><span class="nx">t</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">          <span class="nx">s</span> <span class="o">=</span> <span class="nx">d</span><span class="p">.</span><span class="nx">getElementsByTagName</span><span class="p">(</span><span class="nx">t</span><span class="p">)[</span><span class="mi">0</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">      <span class="nx">o</span><span class="p">.</span><span class="nx">src</span> <span class="o">=</span> <span class="nx">u</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">      <span class="k">if</span> <span class="p">(</span><span class="nx">c</span><span class="p">)</span> <span class="p">{</span> <span class="nx">o</span><span class="p">.</span><span class="nx">addEventListener</span><span class="p">(</span><span class="s1">&#39;load&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">e</span><span class="p">)</span> <span class="p">{</span> <span class="nx">c</span><span class="p">(</span><span class="nx">e</span><span class="p">);</span> <span class="p">});</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">      <span class="nx">s</span><span class="p">.</span><span class="nx">parentNode</span><span class="p">.</span><span class="nx">insertBefore</span><span class="p">(</span><span class="nx">o</span><span class="p">,</span> <span class="nx">s</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="p">})(</span><span class="s1">&#39;//cdn.bootcss.com/pangu/3.3.0/pangu.min.js&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nx">pangu</span><span class="p">.</span><span class="nx">spacingPage</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">    <span class="p">});</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;/</span><span class="nt">script</span><span class="p">&gt;</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><h3 id="font-setting-字体修改">Font Setting 字体修改</h3>
<p>本文使用的中文字体为<a href="https://github.com/chawyehsu/lxgw-wenkai-webfont" target="_blank" rel="noopener">霞鹜文楷</a>
 ，感谢开源分享，英文字体可以去 <a href="https://fonts.google.com/specimen/Open&#43;Sans?preview.text=Let%E2%80%99s%20learn%20and%20innovate%20together!" target="_blank" rel="noopener">google font</a>
 中找一个顺眼的，参考上述开源字体的指引，通过 cdn 引入对应的 html 和 css 即可直接在 font-family 中调用。</p>
<ul>
<li>html 插入到：<code>layouts/partials/extend_head.html</code> 中</li>
<li>（如有）css 插入到 <code>assets/css/extended/blank.css</code> 中</li>
</ul>
<p>然后直接在 css 中使用 <code>font-family</code> 调用即可：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>css</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="nt">body</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">font-family</span><span class="p">:</span> <span class="s2">&#34;Open Sans&#34;</span><span class="p">,</span> <span class="s2">&#34;LXGW WenKai&#34;</span><span class="p">,</span> <span class="kc">sans-serif</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><h3 id="tags-on-post-page-文章-widget-中显示-tag-信息">Tags on Post Page 文章 widget 中显示 tag 信息</h3>
<p>当 post 数量较多时，文章是比较零散的，希望能在 widget 界面展示文章的 Tag 提供更多文章的信息，来建立文章和文章之间的关联。</p>
<p>
<div class="post-img-view">
  <a data-fancybox="gallery" href="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241219085800.png">
    <img loading="lazy" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241219085800.png"class="responsive-image" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241219085800.png" style="display: block; margin: 0 auto;"
      alt=""  />
  </a>
</div>


<script>
  document.addEventListener("DOMContentLoaded", function() {
      var images = document.querySelectorAll(".responsive-image");
      var maxHeight = window.innerHeight / 2.5;
      images.forEach(function(image) {
          image.style.maxHeight = maxHeight + "px";
      });
  });
</script>
</p>
<p>找到主题中定义 widget 结构和样式的地方 <code>/layouts/_default/list.html</code> 中的 <code>post-entry</code> 部分 <span class="sidenote-number"><small class="sidenote"><a href="https://github.com/adityatelange/hugo-PaperMod/discussions/606" target="_blank" rel="noopener">How to display tags in the post list? · adityatelange/hugo-PaperMod · Discussion #606</a></small></span> <span class="sidenote-number"><small class="sidenote">主要样式和实现参考：<a href="https://github.com/novikov-ai/novikov-ai.github.io/blob/cc240bfc77819b168f1e70a55d4f7ee44c296ab3/layouts/_default/list.html#L85" target="_blank" rel="noopener">novikov-ai/novikov-ai.github.io</a></small></span> ，使用 go-template 语法遍历&amp;获取具体的 tag <span class="sidenote-number"><small class="sidenote">参考 <a href="https://hugo.opendocs.io/methods/page/params/" target="_blank" rel="noopener">Params | Hugo官方文档</a>
获取 tag</small></span> ，然后将其添加到对应的 meta 模块后面如下：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>html</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">footer</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;entry-footer&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      {{- partial &#34;post_meta.html&#34; . -}}
</span></span><span class="line"><span class="cl">    <span class="p">&lt;/</span><span class="nt">footer</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    {{- if .Params.tags }}
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;tags&#34;</span> <span class="na">style</span><span class="o">=</span><span class="s">&#34;padding: 2px;&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;</span><span class="nt">div</span> <span class="na">style</span><span class="o">=</span><span class="s">&#34;display: flex; flex-wrap: wrap; justify-content: flex-end; margin-top: 5px;&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        {{ range .Params.tags }}
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;/tags/{{ . | urlize }}&#34;</span> <span class="na">style</span><span class="o">=</span><span class="s">&#34;margin-right: 5px; 
</span></span></span><span class="line"><span class="cl"><span class="s">                  color: white; 
</span></span></span><span class="line"><span class="cl"><span class="s">                  background-color: rgba(53, 174, 128, 0.7); 
</span></span></span><span class="line"><span class="cl"><span class="s">                  border-radius: 6px; 
</span></span></span><span class="line"><span class="cl"><span class="s">                  padding: 1px 10px;
</span></span></span><span class="line"><span class="cl"><span class="s">                  font-size: 13px;
</span></span></span><span class="line"><span class="cl"><span class="s">                  z-index: 999; &#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">          #{{ . }}
</span></span><span class="line"><span class="cl">        <span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        {{ end }}
</span></span><span class="line"><span class="cl">      <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    {{- end }}</span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><ul>
<li>这里添加 z-index 将 tag 标签移至外层，避免元素置于其余元素下方导致跳转失效。</li>
<li>此外为了使得 tag 和 meta 信息处于同一行而非另起一行，添加如下样式：</li>
</ul>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>css</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="p">.</span><span class="nc">tags</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="c">/* display: inline-block; */</span>
</span></span><span class="line"><span class="cl">  <span class="k">float</span><span class="p">:</span> <span class="kc">right</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><h3 id="tag-on-meta-info-文章的元信息中显示-tag">Tag on Meta info 文章的元信息中显示 Tag</h3>
<p>在上述的讨论区中 <a href="https://github.com/adityatelange/hugo-PaperMod/discussions/606#discussioncomment-4705301" target="_blank" rel="noopener">mgopsill</a>
 提供了解决方案，感谢其分享，具体操作是通过修改 <code>layouts/partials/post_meta.html</code> 中的 <code>author</code> 部分如下：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>html</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl">{{- $author := (partial &#34;author.html&#34; .) }}
</span></span><span class="line"><span class="cl">{{- $tags := (partial &#34;tags.html&#34; .) }}
</span></span><span class="line"><span class="cl">{{- if $tags }}
</span></span><span class="line"><span class="cl">    {{- $scratch.Add &#34;meta&#34; (slice $ author $tags) -}}
</span></span><span class="line"><span class="cl">{{- else}}
</span></span><span class="line"><span class="cl">    {{- $scratch.Add &#34;meta&#34; (slice $ author) -}}
</span></span><span class="line"><span class="cl">{{- end}}</span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>并添加对应的 <code>layouts/partials/tags.html</code> 如下：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>html</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl">{{- $tags := .Params.tags -}}
</span></span><span class="line"><span class="cl">{{- if $tags -}}
</span></span><span class="line"><span class="cl">  {{- $lastIndex := sub (len $ tags) 1 -}}
</span></span><span class="line"><span class="cl">  {{- range $index, $ tag := $tags -}}
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;/tags/{{ $tag | urlize }}&#34;</span><span class="p">&gt;</span> {{ $ tag }}<span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    {{- if ne $index $ lastIndex }}<span class="ni">&amp;nbsp;</span>·<span class="ni">&amp;nbsp;</span>{{ end -}}
</span></span><span class="line"><span class="cl">  {{- end -}}
</span></span><span class="line"><span class="cl">{{- end -}}</span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><h3 id="post-widgets-image-to-left-将文章封面图移至侧边">Post Widget&rsquo;s Image to left 将文章封面图移至侧边</h3>
<p>在 post 页面，如果封面图片处于信息块的上方，会导致其对页面空间过度占用，同时不同 size 也会导致呈现效果好坏参差不齐，因此为了使得页面更加美观且高效，参考 <a href="https://cloud.tencent.com/developer/article/1969889" target="_blank" rel="noopener">Hugo博客文章封面图片缩小并移到侧边 | PaperMod主题-素履coder</a>
 的文章，将文章的封面移至侧边；</p>
<p>按照上述博主说的用 <code>div clss=post-info</code> 将整个 post-entry 卡片的内容包括 content、meta、footer 等包裹起来后，将下列两行移至 post-info 的上一行即可，最终结构如下：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>html</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">article</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;{{ $class }}&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  {{- $isHidden := (.Param &#34;cover.hiddenInList&#34;) | default (.Param &#34;cover.hidden&#34;) | default false }}
</span></span><span class="line"><span class="cl">  {{- partial &#34;cover.html&#34; (dict &#34;cxt&#34; . &#34;IsSingle&#34; false &#34;isHidden&#34; $isHidden) }}
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;post-info&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    ...
</span></span><span class="line"><span class="cl">  <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>该方法会导致同时影响了文章顶部的图片展示，笔者不同于原文的解决方案，这里通过更具体的 css 选择器做区分即可，还有一些其他的调整如下 <code>assets/css/common/post-entry.css</code>：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>css</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="c">/* F2 make the cover in the side on blogs page */</span>
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">post-entry</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">display</span><span class="p">:</span> <span class="kc">flex</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">flex-direction</span><span class="p">:</span> <span class="kc">row</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">align-items</span><span class="p">:</span> <span class="kc">center</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">post-info</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">display</span><span class="p">:</span> <span class="kc">inline-block</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">overflow</span><span class="p">:</span> <span class="kc">hidden</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">width</span><span class="p">:</span> <span class="mi">90</span><span class="kt">%</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">post-entry</span> <span class="p">.</span><span class="nc">entry-cover</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">overflow</span><span class="p">:</span> <span class="kc">hidden</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">padding-right</span><span class="p">:</span> <span class="mi">18</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">height</span><span class="p">:</span> <span class="mi">80</span><span class="kt">%</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">width</span><span class="p">:</span> <span class="mi">40</span><span class="kt">%</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">margin-bottom</span><span class="p">:</span> <span class="kc">unset</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><h2 id="something-more-一些别的">Something more 一些别的</h2>
<h3 id="一个多图片居中失败的例子">一个多图片居中失败的例子</h3>
<p>以往使用如下代码使得多张图片同一行居中显示如下图所示，此次在该主题上失效：</p>
<p>
<div class="post-img-view">
  <a data-fancybox="gallery" href="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241219150455.png">
    <img alt="image.png" loading="lazy" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241219150455.png"class="responsive-image" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20241219150455.png" style="display: block; margin: 0 auto;"
      alt="image.png"  />
  </a>
</div>


<script>
  document.addEventListener("DOMContentLoaded", function() {
      var images = document.querySelectorAll(".responsive-image");
      var maxHeight = window.innerHeight / 2.5;
      images.forEach(function(image) {
          image.style.maxHeight = maxHeight + "px";
      });
  });
</script>
</p>
<p>源码：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>html</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">p</span> <span class="na">align</span><span class="o">=</span><span class="s">&#34;center&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34; https://aikenh.cn&#34;</span><span class="p">&gt;&lt;</span><span class="nt">img</span> <span class="na">alt</span><span class="o">=</span><span class="s">&#34;github&#34;</span> <span class="na">title</span><span class="o">=</span><span class="s">&#34;AikenD&#34;</span> <span class="na">src</span><span class="o">=</span><span class="s">&#34; https://custom-icon-badges.demolab.com/badge/-aiken%20blog-palegreen?style=for-the-badge&amp;logo=package&amp;logoColor=black&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">a</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34; https://twitter.com/aiken_h97&#34;</span><span class="p">&gt;&lt;</span><span class="nt">img</span> <span class="na">alt</span><span class="o">=</span><span class="s">&#34;twitter&#34;</span> <span class="na">title</span><span class="o">=</span><span class="s">&#34;Twitter&#34;</span> <span class="na">src</span><span class="o">=</span><span class="s">&#34; https://custom-icon-badges.demolab.com/badge/-twitter%20aikenh97-plum?style=for-the-badge&amp;logo=package&amp;logoColor=black&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">a</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  ...
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">p</span><span class="p">&gt;</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>可以考虑使用 div 或者内联样式去覆盖主题或 hugo 的样式修复该问题如下：</p>
<p>使用 div：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>html</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">div</span> <span class="na">style</span><span class="o">=</span><span class="s">&#34;display: flex; justify-content: center; align-items: center;&#34;</span><span class="p">&gt;</span> 
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;https://aikenh.cn&#34;</span><span class="p">&gt;&lt;</span><span class="nt">img</span> <span class="na">alt</span><span class="o">=</span><span class="s">&#34;github&#34;</span> <span class="na">title</span><span class="o">=</span><span class="s">&#34;AikenD&#34;</span> <span class="na">src</span><span class="o">=</span><span class="s">&#34;https://custom-icon-badges.demolab.com/badge/-aiken%20blog-palegreen?style=for-the-badge&amp;logo=package&amp;logoColor=black&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">a</span><span class="p">&gt;</span> <span class="p">&lt;</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;https://twitter.com/aiken_h97&#34;</span><span class="p">&gt;&lt;</span><span class="nt">img</span> <span class="na">alt</span><span class="o">=</span><span class="s">&#34;twitter&#34;</span> <span class="na">title</span><span class="o">=</span><span class="s">&#34;Twitter&#34;</span> <span class="na">src</span><span class="o">=</span><span class="s">&#34;https://custom-icon-badges.demolab.com/badge/-twitter%20aikenh97-plum?style=for-the-badge&amp;logo=package&amp;logoColor=black&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">a</span><span class="p">&gt;</span> 
</span></span><span class="line"><span class="cl">...
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>使用 inline-style in p:</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>html</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">p</span> <span class="na">align</span><span class="o">=</span><span class="s">&#34;center&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;https://aikenh.cn&#34;</span> <span class="na">style</span><span class="o">=</span><span class="s">&#34;display: inline-block; margin: 0 5px;&#34;</span><span class="p">&gt;&lt;</span><span class="nt">img</span> <span class="na">alt</span><span class="o">=</span><span class="s">&#34;github&#34;</span> <span class="na">title</span><span class="o">=</span><span class="s">&#34;AikenD&#34;</span> <span class="na">src</span><span class="o">=</span><span class="s">&#34;https://custom-icon-badges.demolab.com/badge/-aiken%20blog-palegreen?style=for-the-badge&amp;logo=package&amp;logoColor=black&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">a</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;https://twitter.com/aiken_h97&#34;</span> <span class="na">style</span><span class="o">=</span><span class="s">&#34;display: inline-block; margin: 0 5px;&#34;</span><span class="p">&gt;&lt;</span><span class="nt">img</span> <span class="na">alt</span><span class="o">=</span><span class="s">&#34;twitter&#34;</span> <span class="na">title</span><span class="o">=</span><span class="s">&#34;Twitter&#34;</span> <span class="na">src</span><span class="o">=</span><span class="s">&#34;https://custom-icon-badges.demolab.com/badge/-twitter%20aikenh97-plum?style=for-the-badge&amp;logo=package&amp;logoColor=black&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">a</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"> ...
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">p</span><span class="p">&gt;</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><h3 id="一些资源或参考">一些资源或参考</h3>
<ul>
<li>网页图标：<a href="https://favicon.io/" target="_blank" rel="noopener">favicon.io</a>
</li>
<li>一种毛玻璃的实现方式：<a href="https://dev.to/rolandixor/achieving-backdrop-blur-without-backdrop-filter-16ii" target="_blank" rel="noopener">Achieving backdrop blur without &lsquo;backdrop-filter&rsquo; - DEV Community</a>
</li>
<li>给网站添加 loading 页面： <a href="https://dev.to/lensco825/how-to-quickly-add-a-loading-screen-onto-your-website-7ga" target="_blank" rel="noopener">How to Quickly Add a Loading Screen onto your website! - DEV Community</a>
</li>
<li>对 hugo 的理解：<a href="https://kuang.netlify.app/blog/hugo.html" target="_blank" rel="noopener">风月</a>
</li>
</ul>
<h2 id="fi">FI</h2>
<p>文中有任何错误、版权使用不当之处、或者问题欢迎指正和交流，可以留言也可以发邮件，本博客的源码位于：</p>
<p><a href="https://github.com/AikenH/hugoblog" target="_blank" rel="noopener">AikenH/hugoblog: my blog’s hugo variant.</a>
 with submodule <a href="https://github.com/AikenH/papermod-sidebar" target="_blank" rel="noopener">AikenH/papermod-sidebar: my sidebar &amp; transparnet background variant of papermod</a>
</p>
<p>一些处理脚本后续可能会分享到：</p>
<p><a href="https://github.com/AikenH/ManipulateMarkdownNotes" target="_blank" rel="noopener">AikenH/ManipulateMarkdownNotes: manipulate markdown file for publish or some other reason</a>
</p>
<p>目前在 dev 分支完善中。</p>
]]></content:encoded>
    </item>
    <item>
      <title>折腾 Hexo 的 Icarus 主题</title>
      <link>https://aikenh.cn/posts/custom_icarus/</link>
      <pubDate>Sat, 11 Mar 2023 23:46:37 +0000</pubDate>
      <guid>https://aikenh.cn/posts/custom_icarus/</guid>
      <description>基于Icarus的主题的个人配置</description>
      <content:encoded><![CDATA[<p>本文的博客页面基于 <a href="[Hexo]%28https://hexo.io/zh-cn/%29">Hexo</a>
+<a href="https://ppoffice.github.io/" target="_blank" rel="noopener">Icarus</a>
 主题搭建，在使用过程中对该主题做了一些简单的配置，以适应自己的需求。这里介绍一下自己粗浅的方案。</p>
<blockquote>
<p>十分推荐 Icarus 这个主题，功能支持十分全面而且作者的文档也较为详实，推荐大家去了解。</p>
</blockquote>
<h2 id="拓宽显示页面区域">拓宽显示页面区域</h2>
<p><code>include/style/base.styl</code>  中定义了各种基本页面尺寸：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>js</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">$gap</span> <span class="o">?=</span> <span class="mi">64</span><span class="nx">px</span>
</span></span><span class="line"><span class="cl"><span class="nx">$tablet</span> <span class="o">?=</span> <span class="mi">769</span><span class="nx">px</span>
</span></span><span class="line"><span class="cl"><span class="nx">$desktop</span> <span class="o">?=</span> <span class="mi">1088</span><span class="nx">px</span>
</span></span><span class="line"><span class="cl"><span class="nx">$widescreen</span> <span class="o">?=</span> <span class="mi">1280</span><span class="nx">px</span>
</span></span><span class="line"><span class="cl"><span class="nx">$fullhd</span> <span class="o">?=</span> <span class="mi">1472</span><span class="nx">px</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>可以在 <code>include/style/responsive.styl</code>  中定义 2 栏 3 栏情况下所使用的宽度：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>js</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="o">+</span><span class="nx">widescreen</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">    <span class="p">.</span><span class="nx">is</span><span class="o">-</span><span class="mi">3</span><span class="o">-</span><span class="nx">column</span> <span class="p">.</span><span class="nx">container</span>
</span></span><span class="line"><span class="cl">        <span class="nx">max</span><span class="o">-</span><span class="nx">width</span><span class="o">:</span> <span class="nx">$fullhd</span><span class="o">-</span> <span class="nx">$gap</span>
</span></span><span class="line"><span class="cl">        <span class="nx">width</span><span class="o">:</span> <span class="nx">$fullhd</span> <span class="o">-</span> <span class="nx">$gap</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="p">.</span><span class="nx">is</span><span class="o">-</span><span class="mi">1</span><span class="o">-</span><span class="nx">column</span> <span class="p">.</span><span class="nx">container</span><span class="p">,</span> <span class="p">.</span><span class="nx">is</span><span class="o">-</span><span class="mi">2</span><span class="o">-</span><span class="nx">column</span> <span class="p">.</span><span class="nx">container</span>
</span></span><span class="line"><span class="cl">        <span class="nx">max</span><span class="o">-</span><span class="nx">width</span><span class="o">:</span> <span class="nx">$widescreen</span> <span class="o">-</span> <span class="mi">2</span> <span class="o">*</span> <span class="nx">$gap</span>
</span></span><span class="line"><span class="cl">        <span class="nx">width</span><span class="o">:</span> <span class="nx">$widescreen</span><span class="o">-</span> <span class="mi">2</span> <span class="o">*</span> <span class="nx">$gap</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><h2 id="移动端优化">移动端优化</h2>
<p>该主题在移动端表现的时候，两侧的 widget 会自动挪到下方，这样每个文章看完的时候体验很差，所以我希望在移动端的时候能隐藏这些 widget。</p>
<p><code>source/js/main.js</code> 中仿照下面的格式添加对应 widget 的 type 即可：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>js</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">$</span><span class="p">(</span><span class="s1">&#39;div.container div.card[data-type=categories]&#39;</span><span class="p">).</span><span class="nx">addClass</span><span class="p">(</span><span class="s1">&#39;is-hidden-mobile&#39;</span><span class="p">);</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>但是该代码会有问题，就是相应 disable 的 widget 对应的单独界面在移动端会失效。</p>
<h2 id="自定义-404-界面">自定义 404 界面</h2>
<p>在 hexo 的默认配置（非 icarus 的配置）<code>_config.yml</code> 中跳过对 404.html 的渲染，直接使用该静态 html 页面进行页面的配置。</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>yml</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yml" data-lang="yml"><span class="line"><span class="cl"><span class="nt">skil_render</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span>- <span class="m">404.</span><span class="l">html</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>404 静态页面可以使用腾讯公益界面，或者网上找一个<a href="https://freefrontend.com/html-css-404-page-templates/" target="_blank" rel="noopener">模版</a>
使用，效果如下：</p>
<p>
<div class="post-img-view">
  <a data-fancybox="gallery" href="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20230312150155.png">
    <img alt="image.png" loading="lazy" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20230312150155.png"class="responsive-image" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20230312150155.png" style="display: block; margin: 0 auto;"
      alt="image.png"  />
  </a>
</div>


<script>
  document.addEventListener("DOMContentLoaded", function() {
      var images = document.querySelectorAll(".responsive-image");
      var maxHeight = window.innerHeight / 2.5;
      images.forEach(function(image) {
          image.style.maxHeight = maxHeight + "px";
      });
  });
</script>
</p>
<h2 id="夜间模式切换-variant">夜间模式（切换 variant）</h2>
<p>夜间模式的实现主要参考<a href=""></a>
，网上大多用的都是这个方案，但是个人非常喜欢 cyberpunk 的变体，所以希望实现夜间模式的时候切换成 cyberpunk 的 variant ，本文基于其实现做了一些改动，基本实现了该功能，但是目前而言还存在一些问题。</p>
<blockquote>
<p>本人不是很懂前端，因此这个 dom 加载完成后重新加载 css 过程中，导致的页面畸变问题目前不知道该如何解决，望前端大大给点指导</p>
</blockquote>
<h3 id="添加主题切换按钮">添加主题切换按钮</h3>
<p>在 <code>layout/common/navbar.jsx</code> 中添加夜间模式切换按钮，绑定 <code>night-nav</code> 事件，</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>jsx</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-jsx" data-lang="jsx"><span class="line"><span class="cl"><span class="c1">//{showSearch ? &lt;a class=&#34;navbar-item search&#34; title={searchTitle} href=&#34;javascript:;&#34;&gt;
</span></span></span><span class="line"><span class="cl"><span class="c1">//	&lt;i class=&#34;fas fa-search&#34;&gt;&lt;/i&gt;
</span></span></span><span class="line"><span class="cl"><span class="c1">//&lt;/a&gt; : null}
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">a</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;navbar-item night&#34;</span> <span class="na">id</span><span class="o">=</span><span class="s">&#34;night-nav&#34;</span> <span class="na">title</span><span class="o">=</span><span class="s">&#34;Night Mode&#34;</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;javascript:;&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">	<span class="p">&lt;</span><span class="nt">i</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;fas fa-lightbulb&#34;</span> <span class="na">id</span><span class="o">=</span><span class="s">&#34;night-icon&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">i</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><h3 id="预先载入两个-css-文件">预先载入两个 css 文件</h3>
<p>在 <code>layout/common/head.jsx</code> 中预先载入可选的第二个 stylesheet（css 文件）</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>jsx</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-jsx" data-lang="jsx"><span class="line"><span class="cl"><span class="p">{</span><span class="cm">/* &lt;link rel=&#34;stylesheet&#34; href={url_for(&#39;/css/&#39; + variant + &#39;.css&#39;)} /&gt; */</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">link</span> <span class="na">rel</span><span class="o">=</span><span class="s">&#34;stylesheet&#34;</span> <span class="na">href</span><span class="o">=</span><span class="p">{</span><span class="nx">url_for</span><span class="p">(</span><span class="s1">&#39;/css/&#39;</span> <span class="o">+</span> <span class="s1">&#39;default&#39;</span> <span class="o">+</span> <span class="s1">&#39;.css&#39;</span><span class="p">)}</span> <span class="na">title</span><span class="o">=</span><span class="s">&#39;default&#39;</span><span class="p">/&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">link</span> <span class="na">rel</span><span class="o">=</span><span class="s">&#34;alternate stylesheet&#34;</span> <span class="na">href</span><span class="o">=</span><span class="p">{</span><span class="nx">url_for</span><span class="p">(</span><span class="s1">&#39;/css/&#39;</span> <span class="o">+</span> <span class="s1">&#39;cyberpunk&#39;</span> <span class="o">+</span> <span class="s1">&#39;.css&#39;</span><span class="p">)</span> <span class="p">}</span> <span class="na">title</span><span class="o">=</span><span class="s">&#39;cyberpunk&#39;</span><span class="p">/&gt;</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><h3 id="编写-js-实现-css-跳转">编写 js 实现 css 跳转</h3>
<p>本部分主要来自 <a href="https://www.imaegoo.com/" target="_blank" rel="noopener">imagegoo</a>
 的夜间模式实现，修改了一下其调用的文件和变体变量，在 <code>source/js/night.js</code> 中实现。</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>js</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="p">(</span><span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="cm">/**
</span></span></span><span class="line"><span class="cl"><span class="cm">     * Icarus 夜间模式 by iMaeGoo
</span></span></span><span class="line"><span class="cl"><span class="cm">     * https://www.imaegoo.com/
</span></span></span><span class="line"><span class="cl"><span class="cm">        */</span>
</span></span><span class="line"><span class="cl">      <span class="kd">var</span> <span class="nx">isNight</span> <span class="o">=</span> <span class="nx">localStorage</span><span class="p">.</span><span class="nx">getItem</span><span class="p">(</span><span class="s1">&#39;default&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">      <span class="kd">var</span> <span class="nx">nightNav</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  
</span></span><span class="line"><span class="cl">    <span class="kd">function</span> <span class="nx">applyNight</span><span class="p">(</span><span class="nx">value</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">$</span><span class="p">(</span><span class="nb">window</span><span class="p">).</span><span class="nx">trigger</span><span class="p">(</span><span class="s1">&#39;resize&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="p">(</span><span class="nx">value</span><span class="p">.</span><span class="nx">toString</span><span class="p">()</span> <span class="o">===</span> <span class="s1">&#39;true&#39;</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="c1">// document.body.classList.remove(&#39;light&#39;);
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>            <span class="c1">// document.body.classList.add(&#39;night&#39;);
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>            <span class="nx">setStyleSheet</span><span class="p">(</span><span class="s1">&#39;cyberpunk&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">            
</span></span><span class="line"><span class="cl">        <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="c1">// document.body.classList.remove(&#39;night&#39;);
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>            <span class="c1">// document.body.classList.add(&#39;light&#39;);
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>            <span class="nx">setStyleSheet</span><span class="p">(</span><span class="s1">&#39;default&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">        
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">  
</span></span><span class="line"><span class="cl">    <span class="kd">function</span> <span class="nx">findNightNav</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">nightNav</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="s1">&#39;night-nav&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">nightNav</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="nx">setTimeout</span><span class="p">(</span><span class="nx">findNightNav</span><span class="p">,</span> <span class="mi">100</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="nx">nightNav</span><span class="p">.</span><span class="nx">addEventListener</span><span class="p">(</span><span class="s1">&#39;click&#39;</span><span class="p">,</span> <span class="nx">switchNight</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">  
</span></span><span class="line"><span class="cl">    <span class="kd">function</span> <span class="nx">switchNight</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">location</span><span class="p">.</span><span class="nx">reload</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">        <span class="nx">isNight</span> <span class="o">=</span> <span class="nx">isNight</span> <span class="o">?</span> <span class="nx">isNight</span><span class="p">.</span><span class="nx">toString</span><span class="p">()</span> <span class="o">!==</span> <span class="s1">&#39;true&#39;</span> <span class="o">:</span> <span class="kc">true</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="nx">applyNight</span><span class="p">(</span><span class="nx">isNight</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="nx">localStorage</span><span class="p">.</span><span class="nx">setItem</span><span class="p">(</span><span class="s1">&#39;default&#39;</span><span class="p">,</span> <span class="nx">isNight</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="kd">function</span> <span class="nx">setStyleSheet</span><span class="p">(</span><span class="nx">title</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">        <span class="kd">var</span> <span class="nx">link_list</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementsByTagName</span><span class="p">(</span><span class="s2">&#34;link&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="p">(</span><span class="nx">link_list</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">            <span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="nx">i</span><span class="o">&lt;</span><span class="nx">link_list</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">                <span class="k">if</span> <span class="p">(</span><span class="nx">link_list</span><span class="p">[</span><span class="nx">i</span><span class="p">].</span><span class="nx">getAttribute</span><span class="p">(</span><span class="s2">&#34;rel&#34;</span><span class="p">).</span><span class="nx">indexOf</span><span class="p">(</span><span class="s2">&#34;style&#34;</span><span class="p">)</span> <span class="o">!=</span> <span class="o">-</span><span class="mi">1</span> <span class="o">&amp;&amp;</span> <span class="nx">link_list</span><span class="p">[</span><span class="nx">i</span><span class="p">].</span><span class="nx">getAttribute</span><span class="p">(</span><span class="s2">&#34;title&#34;</span><span class="p">)){</span>
</span></span><span class="line"><span class="cl">                    <span class="nx">link_list</span><span class="p">[</span><span class="nx">i</span><span class="p">].</span><span class="nx">disabled</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">                    <span class="k">if</span> <span class="p">(</span><span class="nx">link_list</span><span class="p">[</span><span class="nx">i</span><span class="p">].</span><span class="nx">getAttribute</span><span class="p">(</span><span class="s2">&#34;title&#34;</span><span class="p">)</span> <span class="o">==</span> <span class="nx">title</span><span class="p">)</span> <span class="nx">link_list</span><span class="p">[</span><span class="nx">i</span><span class="p">].</span><span class="nx">disabled</span> <span class="o">=</span> <span class="kc">false</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">                <span class="p">}</span>
</span></span><span class="line"><span class="cl">            <span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">  
</span></span><span class="line"><span class="cl">    <span class="nx">findNightNav</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">    <span class="nx">isNight</span> <span class="o">&amp;&amp;</span> <span class="nx">applyNight</span><span class="p">(</span><span class="nx">isNight</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="p">}());</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>并在 <code>layout/common</code> 完成对该 js 的引入。</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>js</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl">	<span class="o">&lt;</span><span class="nx">script</span> <span class="nx">src</span><span class="o">=</span><span class="p">{</span><span class="nx">url_for</span><span class="p">(</span><span class="s1">&#39;/js/main.js&#39;</span><span class="p">)}</span> <span class="nx">defer</span><span class="o">&gt;&lt;</span><span class="err">/script&gt;</span>
</span></span><span class="line"><span class="cl">	<span class="o">&lt;</span><span class="nx">script</span> <span class="nx">src</span><span class="o">=</span><span class="p">{</span><span class="nx">url_for</span><span class="p">(</span><span class="s1">&#39;/js/night.js&#39;</span><span class="p">)}</span> <span class="nx">defer</span><span class="o">=</span><span class="p">{</span><span class="kc">true</span><span class="p">}</span><span class="o">&gt;&lt;</span><span class="err">/script&gt;</span>
</span></span><span class="line"><span class="cl"><span class="o">&lt;</span><span class="err">/Fragment&gt;;</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><h2 id="添加访客数和访问次数">添加访客数和访问次数</h2>
<p>该主题原本就支持 busuanzi 的访客统计，在设置中打开就行，但是只显示其中一种，如果想要全部打开，可以仿照其原本的补充编写：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>js</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="c1">// 在如下的地方依照类似的方法添加访客计数pv
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nx">visitorCounterTitle</span><span class="o">:</span> <span class="nx">_p</span><span class="p">(</span><span class="s1">&#39;plugin.visitor_count&#39;</span><span class="p">,</span> <span class="s1">&#39;&lt;span id=&#34;busuanzi_value_site_uv&#34;&gt;0&lt;/span&gt;&#39;</span><span class="p">),</span>
</span></span><span class="line"><span class="cl"><span class="nx">visitorCounterTitle</span><span class="o">:</span> <span class="nx">_p</span><span class="p">(</span><span class="s1">&#39;plugin.visitor_count&#39;</span><span class="p">,</span> <span class="s1">&#39;&lt;span id=&#34;busuanzi_value_site_pv&#34;&gt;0&lt;/span&gt;&#39;</span><span class="p">)</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>同样对该值的调用和渲染也要到相应的地方注册。</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>js</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">visitorCounterTitle</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"><span class="nx">visitCounterTitle</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>并添加渲染：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>js</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="p">{</span><span class="nx">showVisitorCounter</span> <span class="o">?</span> <span class="o">&lt;</span><span class="nx">span</span> <span class="nx">id</span><span class="o">=</span><span class="s2">&#34;busuanzi_container_site_pv&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="nx">dangerouslySetInnerHTML</span><span class="o">=</span><span class="p">{{</span> <span class="nx">__html</span><span class="o">:</span> <span class="nx">visitorCounterTitle</span> <span class="p">}}</span><span class="o">&gt;&lt;</span><span class="err">/span&gt; : null}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">{</span><span class="nx">showVisitorCounter</span> <span class="o">?</span> <span class="s2">&#34; and &#34;</span><span class="o">:</span> <span class="kc">null</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">	<span class="p">{</span><span class="nx">showVisitorCounter</span> <span class="o">?</span> <span class="o">&lt;</span><span class="nx">span</span> <span class="nx">id</span><span class="o">=</span><span class="s2">&#34;busuanzi_container2_site_uv&#34;</span>
</span></span><span class="line"><span class="cl">		<span class="nx">dangerouslySetInnerHTML</span><span class="o">=</span><span class="p">{{</span> <span class="nx">__html</span><span class="o">:</span> <span class="nx">visitCounterTitle</span> <span class="p">}}</span><span class="o">&gt;&lt;</span><span class="err">/span&gt; : null}</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><h2 id="所有图片居中">所有图片居中</h2>
<p>参考资料：<a href="https://github.com/ppoffice/hexo-theme-icarus/issues/386" target="_blank" rel="noopener">请问如何实现文章中图片居中显示</a>
</p>
<p>单张图片居中可以使用：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>js</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="o">&lt;</span><span class="nx">div</span> <span class="nx">style</span><span class="o">=</span><span class="s2">&#34;text-align:center&#34;</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="o">&lt;</span><span class="nx">img</span> <span class="nx">src</span><span class="o">=</span> <span class="nx">https</span><span class="o">:</span><span class="c1">//picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20230403173436.png title=&#34;devops&#34;&gt;
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="o">&lt;</span><span class="err">/div&gt;</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>全部图片居中可以在 hexo-theme-icarus/source/css/style.styl 中的 article 部分添加如下的最后四行：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>javascript</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-javascript" data-lang="javascript"><span class="line"><span class="cl"><span class="p">.</span><span class="nx">article</span>
</span></span><span class="line"><span class="cl">    <span class="p">.</span><span class="nx">article</span><span class="o">-</span><span class="nx">meta</span>
</span></span><span class="line"><span class="cl">        <span class="nx">margin</span><span class="o">-</span><span class="nx">bottom</span><span class="o">:</span> <span class="mf">0.5</span><span class="nx">rem</span> <span class="o">!</span><span class="nx">important</span>
</span></span><span class="line"><span class="cl">    <span class="p">.</span><span class="nx">content</span>
</span></span><span class="line"><span class="cl">        <span class="nx">font</span><span class="o">-</span><span class="nx">size</span><span class="o">:</span> <span class="mf">1.1</span><span class="nx">rem</span>
</span></span><span class="line"><span class="cl">        <span class="nx">blockquote</span><span class="p">.</span><span class="nx">pullquote</span>
</span></span><span class="line"><span class="cl">            <span class="kr">float</span><span class="o">:</span> <span class="nx">right</span>
</span></span><span class="line"><span class="cl">            <span class="nx">max</span><span class="o">-</span><span class="nx">width</span><span class="o">:</span> <span class="mi">50</span><span class="o">%</span>
</span></span><span class="line"><span class="cl">            <span class="nx">font</span><span class="o">-</span><span class="nx">size</span><span class="o">:</span> <span class="mf">1.15</span><span class="nx">rem</span>
</span></span><span class="line"><span class="cl">            <span class="nx">position</span><span class="o">:</span> <span class="nx">relative</span>
</span></span><span class="line"><span class="cl">        <span class="nx">a</span>
</span></span><span class="line"><span class="cl">            <span class="nx">img</span>
</span></span><span class="line"><span class="cl">                <span class="nx">margin</span><span class="o">:</span> <span class="nx">auto</span>
</span></span><span class="line"><span class="cl">                <span class="nx">display</span><span class="o">:</span> <span class="nx">block</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>新版的修改的地址已经迁移到：<code>themes/icarus/include/style/article.styl</code> 中,同样还是找到这一段描述中添加最后四行即可。</p>
<h2 id="文章以更新时间排序">文章以更新时间排序</h2>
<p>修改 <code>node_modules\hexo-generator-index\lib\generator.js</code> 文件为以下内容重新 <code>hexo s</code> 即可：</p>
<blockquote>
<p>修改之前记得备份</p>
</blockquote>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>js</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="s1">&#39;use strict&#39;</span><span class="p">;</span>  
</span></span><span class="line"><span class="cl"><span class="kd">var</span> <span class="nx">pagination</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;hexo-pagination&#39;</span><span class="p">);</span>  
</span></span><span class="line"><span class="cl"><span class="nx">module</span><span class="p">.</span><span class="nx">exports</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">locals</span><span class="p">){</span>  
</span></span><span class="line"><span class="cl">  <span class="kd">var</span> <span class="nx">config</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">config</span><span class="p">;</span>  
</span></span><span class="line"><span class="cl">  <span class="kd">var</span> <span class="nx">posts</span> <span class="o">=</span> <span class="nx">locals</span><span class="p">.</span><span class="nx">posts</span><span class="p">;</span>  
</span></span><span class="line"><span class="cl">    <span class="nx">posts</span><span class="p">.</span><span class="nx">data</span> <span class="o">=</span> <span class="nx">posts</span><span class="p">.</span><span class="nx">data</span><span class="p">.</span><span class="nx">sort</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">a</span><span class="p">,</span> <span class="nx">b</span><span class="p">)</span> <span class="p">{</span>  
</span></span><span class="line"><span class="cl">        <span class="k">if</span><span class="p">(</span><span class="nx">a</span><span class="p">.</span><span class="nx">top</span> <span class="o">&amp;&amp;</span> <span class="nx">b</span><span class="p">.</span><span class="nx">top</span><span class="p">)</span> <span class="p">{</span> <span class="c1">// 当两篇文章top都有定义时  
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>            <span class="k">if</span><span class="p">(</span><span class="nx">a</span><span class="p">.</span><span class="nx">top</span> <span class="o">==</span> <span class="nx">b</span><span class="p">.</span><span class="nx">top</span><span class="p">)</span> <span class="k">return</span> <span class="nx">b</span><span class="p">.</span><span class="nx">updated</span> <span class="o">-</span> <span class="nx">a</span><span class="p">.</span><span class="nx">updated</span><span class="p">;</span> <span class="c1">// 若top值一样，则按照文章更新日期降序排列  
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>            <span class="k">else</span> <span class="k">return</span> <span class="nx">b</span><span class="p">.</span><span class="nx">top</span> <span class="o">-</span> <span class="nx">a</span><span class="p">.</span><span class="nx">top</span><span class="p">;</span> <span class="c1">// 否则按照top值降序排列  
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>        <span class="p">}</span>  
</span></span><span class="line"><span class="cl">        <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="nx">a</span><span class="p">.</span><span class="nx">top</span> <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="nx">b</span><span class="p">.</span><span class="nx">top</span><span class="p">)</span> <span class="p">{</span> <span class="c1">// 以下两种情况是若只有一篇文章top有定义，则将有top的排在前面（这里用异或操作居然不行233）  
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>            <span class="k">return</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span>  
</span></span><span class="line"><span class="cl">        <span class="p">}</span>  
</span></span><span class="line"><span class="cl">        <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="nx">a</span><span class="p">.</span><span class="nx">top</span> <span class="o">&amp;&amp;</span> <span class="nx">b</span><span class="p">.</span><span class="nx">top</span><span class="p">)</span> <span class="p">{</span> <span class="c1">//上一条已解释  
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>            <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>  
</span></span><span class="line"><span class="cl">        <span class="p">}</span>  
</span></span><span class="line"><span class="cl">        <span class="k">else</span> <span class="k">return</span> <span class="nx">b</span><span class="p">.</span><span class="nx">updated</span> <span class="o">-</span> <span class="nx">a</span><span class="p">.</span><span class="nx">updated</span><span class="p">;</span> <span class="c1">// 若都没定义，则按照文章更新日期降序排列  
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="p">});</span>  
</span></span><span class="line"><span class="cl">  <span class="kd">var</span> <span class="nx">paginationDir</span> <span class="o">=</span> <span class="nx">config</span><span class="p">.</span><span class="nx">pagination_dir</span> <span class="o">||</span> <span class="s1">&#39;page&#39;</span><span class="p">;</span>  
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="nx">pagination</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">,</span> <span class="nx">posts</span><span class="p">,</span> <span class="p">{</span>  
</span></span><span class="line"><span class="cl">    <span class="nx">perPage</span><span class="o">:</span> <span class="nx">config</span><span class="p">.</span><span class="nx">index_generator</span><span class="p">.</span><span class="nx">per_page</span><span class="p">,</span>  
</span></span><span class="line"><span class="cl">    <span class="nx">layout</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;index&#39;</span><span class="p">,</span> <span class="s1">&#39;archive&#39;</span><span class="p">],</span>  
</span></span><span class="line"><span class="cl">    <span class="nx">format</span><span class="o">:</span> <span class="nx">paginationDir</span> <span class="o">+</span> <span class="s1">&#39;/%d/&#39;</span><span class="p">,</span>  
</span></span><span class="line"><span class="cl">    <span class="nx">data</span><span class="o">:</span> <span class="p">{</span>  
</span></span><span class="line"><span class="cl">      <span class="nx">__index</span><span class="o">:</span> <span class="kc">true</span>  
</span></span><span class="line"><span class="cl">    <span class="p">}</span>  
</span></span><span class="line"><span class="cl">  <span class="p">});</span>  
</span></span><span class="line"><span class="cl"><span class="p">};</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><h2 id="troubleshooting">Troubleshooting</h2>
<h3 id="map-迭代错误">map 迭代错误</h3>
<p>执行 <code>hexo cl &amp;&amp; hexo g</code> 会出现以下的错误：</p>
<blockquote>
<p>Uncaught TypeError: Cannot read properties of undefined (reading ‘map‘)</p>
</blockquote>
<p>该错误主要是由于使用 map 进行循环之前未判断变量是否非空，导致对 undefined 变量做遍历导致，因此只需要在循环之前加上判断即可。</p>
<p>主要出错的是在一下的两个文件里：</p>
<ul>
<li>Layout/category.Jsx</li>
<li>Layout/index.Jsx</li>
</ul>
<p>使用如下的方式在使用 map 对变量进行遍历之前做一个非空判断：</p>
<p>
<div class="post-img-view">
  <a data-fancybox="gallery" href="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20231031000315.png">
    <img alt="image.png" loading="lazy" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20231031000315.png"class="responsive-image" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/mac/20231031000315.png" style="display: block; margin: 0 auto;"
      alt="image.png"  />
  </a>
</div>


<script>
  document.addEventListener("DOMContentLoaded", function() {
      var images = document.querySelectorAll(".responsive-image");
      var maxHeight = window.innerHeight / 2.5;
      images.forEach(function(image) {
          image.style.maxHeight = maxHeight + "px";
      });
  });
</script>
</p>
<p><a href="https://blog.csdn.net/fangqi20170515/article/details/126030610" target="_blank" rel="noopener">在react中使用map遍历，出现错误：Uncaught TypeError: Cannot read properties of undefined (reading ‘map‘)_学习前端的渣渣的博客-CSDN博客</a>
</p>
<h3 id="spawn-failed-解决方法">spawn failed 解决方法</h3>
<p>执行 <code>hexo d</code> 进行部署的时候可能会遇到 spawn failed 的各种问题，主要有两种情况</p>
<ul>
<li>网络问题</li>
<li>文件结构问题</li>
</ul>
<p>网络问题可以使用 <code>ss -T git@github</code> 测试连接情况；而文件结构问题的话，其实就是我们的链接库 <code>.deploy_git</code> 文件夹无法正常推送到 github，这种情况下可以考虑以下几种解决方式：</p>
<ul>
<li>【重置部署文件夹】 删除 <code>.depoly_git</code> 文件夹，重新执行 <code>hexo d</code></li>
<li>【不推荐】进入 <code>.deploy_git</code> 文件夹强制推送，<code>git push -f</code></li>
<li>【多系统编写导致文件混合编码问题】 <code>git config –global core.autocrlf false</code></li>
</ul>
<p>参考资料：<a href="https://blog.zhheo.com/p/128998ac.html" target="_blank" rel="noopener">Hexo错误：spawn failed的解决方法 | 张洪Heo (zhheo.com)</a>
</p>
<h2 id="reference">Reference</h2>
<ul>
<li><a href="https://www.imaegoo.com/2022/dec-27/" target="_blank" rel="noopener">博客主题源码和配置文件 - iMaeGoo&rsquo;s Blog</a>
</li>
<li><a href="https://karobben.github.io/2021/02/11/Blog/hexo_icarus/#Giscus" target="_blank" rel="noopener">Hexo theme: icarus| Highly personalize it - Karobben</a>
</li>
<li><a href="https://www.alphalxy.com/2019/03/customize-icarus/#%E7%9B%AE%E5%BD%95%E7%B2%98%E6%80%A7%E5%AE%9A%E4%BD%8D" target="_blank" rel="noopener">Icarus 主题自定义 - Alpha Lxy</a>
</li>
<li><a href="https://angericky.github.io/2018/12/24/icarus%E4%B8%AA%E6%80%A7%E5%AE%9A%E5%88%B6/" target="_blank" rel="noopener">hexo及icarus主题个性定制 - Jingjing&rsquo;s blog (angericky.github.io)</a>
</li>
<li><a href="https://ganzhixiong.com/" target="_blank" rel="noopener">干志雄的博客 (ganzhixiong.com)</a>
</li>
<li><a href="https://gsy00517.github.io/hexo20200207151318/" target="_blank" rel="noopener">hexo笔记：文章排序 | 高深远的博客 (gsy00517.github.io)</a>
</li>
</ul>
<p>and here are some theme I may want to try：</p>
<ul>
<li><a href="https://arknights.theme.hexo.yue.zone/" target="_blank" rel="noopener">Arknights (yue.zone)</a>
</li>
<li><a href="https://heliumoi.github.io/ringoExample/2022/07/07/Hexo-%E4%B8%BB%E9%A2%98-Ringo/" target="_blank" rel="noopener">Hexo 主题 Ringo - Hexo Theme Ringo (heliumoi.github.io)</a>
</li>
<li><a href="https://wiki.eryajf.net/" target="_blank" rel="noopener">二丫讲梵 (eryajf.net)</a>
</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>设置各Editor自动添加meta信息</title>
      <link>https://aikenh.cn/posts/hexo_write/</link>
      <pubDate>Wed, 13 Apr 2022 23:29:10 +0000</pubDate>
      <guid>https://aikenh.cn/posts/hexo_write/</guid>
      <description>设置 vscode, vim, obsidian 自动为 Markdown 添加 Hexo 所需Meta信息</description>
      <content:encoded><![CDATA[<p>Hexo和Gitee一致，都是由Markdown文件为基础，构建的博客，编写Markdown本身无需多言，由于Hexo并非笔者的首选笔记管理方式，故而再其他地方构建和编写文件是常态，该Blog主要是利用其他工具来方便Hexo博文的编写（Header）</p>
<p>默认的是 <code>hexo new [layout] title</code> 可简写为 <code>hexo n [layout] title</code>，其中布局应该是在博客目录中定义，该命令也局限于博客的对应目录。</p>
<blockquote>
<p>post(默认)、draft、page</p>
</blockquote>
<p>除了默认的方法，本篇将介绍Obsidian、VsCode-like、Vim自动添加Header的方式，用以方便随时随地的编写博文。</p>
<p>同时为了方便已有笔记迁移，本文也编写了Python脚本，CPY后为Target Dir的版本自动添加Header，但是其中对应的Catagories最好还是手动修改一下。</p>
<h2 id="obsidian">Obsidian</h2>
<p>通过<strong>template</strong>插件，按照对应主题的Header样式添加，可以去官方文档中找对应的语法和说明。从而构建自己的Template</p>
<p><strong>Workflow</strong>：插件市场添加Template -&gt; 设置指定Template文件夹 -&gt; 按照语法编写Template文件 -&gt; 使用快捷键插入模板</p>
<p>由于这一块没有什么存在歧义的操作，就不赘述，唯一需要注意的是语法，简单参考一下<a href="https://silentvoid13.github.io/Templater/" target="_blank" rel="noopener">官方的Example</a>
即可，无需过于深入</p>
<p>本文使用的是Live my Life的Hexo-Theme，模板文件如下：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>ts</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ts" data-lang="ts"><span class="line"><span class="cl"><span class="o">---</span>
</span></span><span class="line"><span class="cl"><span class="nx">title</span><span class="o">:</span> <span class="o">&lt;%</span> <span class="nx">tp</span><span class="p">.</span><span class="nx">file</span><span class="p">.</span><span class="nx">title</span> <span class="o">%&gt;</span>
</span></span><span class="line"><span class="cl"><span class="nx">catalog</span>: <span class="kt">true</span>
</span></span><span class="line"><span class="cl"><span class="nx">data</span><span class="o">:</span> <span class="o">&lt;%</span> <span class="nx">tp</span><span class="p">.</span><span class="nx">date</span><span class="p">.</span><span class="nx">now</span><span class="p">(</span><span class="s2">&#34;YYYY-MM-DD HH:mm:ss&#34;</span><span class="p">)</span> <span class="o">%&gt;</span>
</span></span><span class="line"><span class="cl"><span class="nx">subtitle</span>:
</span></span><span class="line"><span class="cl"><span class="kt">lang</span><span class="o">:</span> <span class="nx">cn</span>
</span></span><span class="line"><span class="cl"><span class="nx">header</span><span class="o">-</span><span class="nx">img</span><span class="o">:</span> <span class="err">/img/header_img/lml_bg1.jpg</span>
</span></span><span class="line"><span class="cl"><span class="nx">tag</span><span class="o">:</span>
</span></span><span class="line"><span class="cl"><span class="o">-</span> 
</span></span><span class="line"><span class="cl"><span class="nx">categories</span><span class="o">:</span>
</span></span><span class="line"><span class="cl"><span class="o">-</span>
</span></span><span class="line"><span class="cl"><span class="nx">mathjax</span>: <span class="kt">true</span>
</span></span><span class="line"><span class="cl"><span class="nx">sticky</span>: <span class="kt">22</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">---</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>实际上各个模块的操作思想都是一致的Snippet方案。</p>
<h2 id="vimnvim">Vim/Nvim</h2>
<p>通过Vimscript设置或者Lua的设置文件，令Vim，Neovim再新建<code>.md</code>的同时，为其添加默认Header。Lua实际上调用的是Vimscript的接口，这里仅给出<code>.lua</code>版本，相应的转换不在赘言。</p>
<p>配置NeoVim中的 <code>~/.config/nvim/lua/basic/config.lua</code></p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>lua</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-lua" data-lang="lua"><span class="line"><span class="cl"><span class="n">vim.cmd</span><span class="p">(</span><span class="s1">&#39;autocmd BufNewFile *.md,*.sh,*.cpp,*.py,*.lua exec &#34;:lua set_title()&#34;&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="kr">function</span> <span class="nf">set_title</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">    <span class="n">filetype</span> <span class="o">=</span> <span class="n">vim.fn</span><span class="p">.</span><span class="n">expand</span><span class="p">(</span><span class="s2">&#34;%:e&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="c1">-- set title for markdown</span>
</span></span><span class="line"><span class="cl">    <span class="kr">if</span> <span class="n">filetype</span> <span class="o">==</span> <span class="s2">&#34;md&#34;</span> <span class="kr">then</span>
</span></span><span class="line"><span class="cl">		<span class="n">vim.fn</span><span class="p">.</span><span class="n">setline</span><span class="p">(</span><span class="s2">&#34;1&#34;</span><span class="p">,</span> <span class="s2">&#34;--- &#34;</span> <span class="o">..</span> <span class="n">vim.fn</span><span class="p">.</span><span class="n">expand</span><span class="p">(</span><span class="s2">&#34;%&#34;</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">        <span class="n">vim.fn</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">vim.fn</span><span class="p">.</span><span class="n">line</span><span class="p">(</span><span class="s2">&#34;.&#34;</span><span class="p">),</span> <span class="s2">&#34;&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">vim.fn</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">vim.fn</span><span class="p">.</span><span class="n">line</span><span class="p">(</span><span class="s2">&#34;.&#34;</span><span class="p">)</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="s2">&#34;Author: AikenHong  &#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">vim.fn</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">vim.fn</span><span class="p">.</span><span class="n">line</span><span class="p">(</span><span class="s2">&#34;.&#34;</span><span class="p">)</span><span class="o">+</span><span class="mi">2</span><span class="p">,</span> <span class="s2">&#34;Mail: h.aiken.970@gmail.com  &#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">vim.fn</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">vim.fn</span><span class="p">.</span><span class="n">line</span><span class="p">(</span><span class="s2">&#34;.&#34;</span><span class="p">)</span><span class="o">+</span><span class="mi">3</span><span class="p">,</span> <span class="s2">&#34;Date: &#34;</span> <span class="o">..</span> <span class="n">os.date</span><span class="p">(</span><span class="s2">&#34;%Y-%m-%d %H:%M:%S  &#34;</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">        <span class="n">vim.fn</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">vim.fn</span><span class="p">.</span><span class="n">line</span><span class="p">(</span><span class="s2">&#34;.&#34;</span><span class="p">)</span><span class="o">+</span><span class="mi">4</span><span class="p">,</span> <span class="s2">&#34;Desc: &#34;</span><span class="p">)](</span><span class="o">&lt;</span><span class="n">vim.fn</span><span class="p">.</span><span class="n">setline</span><span class="p">(</span><span class="s2">&#34;1&#34;</span><span class="p">,</span> <span class="s2">&#34;---&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">vim.fn</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">vim.fn</span><span class="p">.</span><span class="n">line</span><span class="p">(</span><span class="s2">&#34;.&#34;</span><span class="p">),</span> <span class="s2">&#34;title: &#34;</span> <span class="o">..</span> <span class="n">vim.fn</span><span class="p">.</span><span class="n">expand</span><span class="p">(</span><span class="s2">&#34;%&#34;</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">        <span class="n">vim.fn</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">vim.fn</span><span class="p">.</span><span class="n">line</span><span class="p">(</span><span class="s2">&#34;.&#34;</span><span class="p">)</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="s2">&#34;catalog: true&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">vim.fn</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">vim.fn</span><span class="p">.</span><span class="n">line</span><span class="p">(</span><span class="s2">&#34;.&#34;</span><span class="p">)</span><span class="o">+</span><span class="mi">2</span><span class="p">,</span> <span class="s2">&#34;subtitle: &#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">vim.fn</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">vim.fn</span><span class="p">.</span><span class="n">line</span><span class="p">(</span><span class="s2">&#34;.&#34;</span><span class="p">)</span><span class="o">+</span><span class="mi">3</span><span class="p">,</span> <span class="s2">&#34;date: &#34;</span> <span class="o">..</span> <span class="n">os.date</span><span class="p">(</span><span class="s2">&#34;%Y-%m-%d %H:%M:%S  &#34;</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">        <span class="n">vim.fn</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">vim.fn</span><span class="p">.</span><span class="n">line</span><span class="p">(</span><span class="s2">&#34;.&#34;</span><span class="p">)</span><span class="o">+</span><span class="mi">4</span><span class="p">,</span> <span class="s2">&#34;lang: cn&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">vim.fn</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">vim.fn</span><span class="p">.</span><span class="n">line</span><span class="p">(</span><span class="s2">&#34;.&#34;</span><span class="p">)</span><span class="o">+</span><span class="mi">5</span><span class="p">,</span> <span class="s2">&#34;header-img: /img/header_img/lml_bg1.jpg&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">vim.fn</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">vim.fn</span><span class="p">.</span><span class="n">line</span><span class="p">(</span><span class="s2">&#34;.&#34;</span><span class="p">)</span><span class="o">+</span><span class="mi">6</span><span class="p">,</span> <span class="s2">&#34;tag: &#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">vim.fn</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">vim.fn</span><span class="p">.</span><span class="n">line</span><span class="p">(</span><span class="s2">&#34;.&#34;</span><span class="p">)</span><span class="o">+</span><span class="mi">7</span><span class="p">,</span> <span class="s2">&#34;-  &#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">vim.fn</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">vim.fn</span><span class="p">.</span><span class="n">line</span><span class="p">(</span><span class="s2">&#34;.&#34;</span><span class="p">)</span><span class="o">+</span><span class="mi">8</span><span class="p">,</span> <span class="s2">&#34;categories: &#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">vim.fn</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">vim.fn</span><span class="p">.</span><span class="n">line</span><span class="p">(</span><span class="s2">&#34;.&#34;</span><span class="p">)</span><span class="o">+</span><span class="mi">9</span><span class="p">,</span> <span class="s2">&#34;-  &#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">vim.fn</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">vim.fn</span><span class="p">.</span><span class="n">line</span><span class="p">(</span><span class="s2">&#34;.&#34;</span><span class="p">)</span><span class="o">+</span><span class="mi">10</span><span class="p">,</span> <span class="s2">&#34;mathjax: true&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">vim.fn</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">vim.fn</span><span class="p">.</span><span class="n">line</span><span class="p">(</span><span class="s2">&#34;.&#34;</span><span class="p">)</span><span class="o">+</span><span class="mi">11</span><span class="p">,</span> <span class="s2">&#34;sticky: &#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">vim.fn</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">vim.fn</span><span class="p">.</span><span class="n">line</span><span class="p">(</span><span class="s2">&#34;.&#34;</span><span class="p">)</span><span class="o">+</span><span class="mi">12</span><span class="p">,</span> <span class="s2">&#34;&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">vim.fn</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">vim.fn</span><span class="p">.</span><span class="n">line</span><span class="p">(</span><span class="s2">&#34;.&#34;</span><span class="p">)</span><span class="o">+</span><span class="mi">13</span><span class="p">,</span> <span class="s2">&#34;---&#34;</span><span class="p">)</span><span class="o">&gt;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="kr">end</span>
</span></span><span class="line"><span class="cl"><span class="kr">end</span>        </span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>这样当我们用<code>nvim newblog.md</code>的时候，会自动添加上Header。</p>
<h2 id="vscode">Vscode</h2>
<p>使用Snippet插件添加代码片段，等待补充。</p>
<h2 id="convert-md2blogs">Convert md2Blogs</h2>
<p>使用Python脚本为原有<code>.md</code> 批量添加Header，缺点是不太灵活，但是用于初始化还是能省不少事。如果原本按照Tag，或者Categories进行文件夹归类的话，倒是能起到不错的初始化效果。</p>
<p>Shut Out and Show my <strong>Code</strong>：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>python</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># define the path of saving and the target path.</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Specific for windows or Linux version yourself</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">get_all_blogs</span><span class="p">(</span><span class="n">path</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="c1"># get all blog path.</span>
</span></span><span class="line"><span class="cl">    <span class="n">dirs</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">listdir</span><span class="p">(</span><span class="n">BlogPath</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">blogs</span> <span class="o">=</span> <span class="p">[]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="n">blog_dir</span> <span class="ow">in</span> <span class="n">dirs</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="n">blog_dir</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">[</span><span class="s1">&#39;.obsidian&#39;</span><span class="p">,</span><span class="s1">&#39;_book&#39;</span><span class="p">,</span> <span class="s1">&#39;Day Planners&#39;</span><span class="p">,</span> <span class="s1">&#39;node_module&#39;</span><span class="p">,</span><span class="s1">&#39;Draft&#39;</span><span class="p">]:</span>
</span></span><span class="line"><span class="cl">            <span class="n">tmpdir</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">BlogPath</span><span class="p">,</span> <span class="n">blog_dir</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="n">blogs</span> <span class="o">+=</span> <span class="n">glob</span><span class="o">.</span><span class="n">glob</span><span class="p">(</span><span class="n">tmpdir</span> <span class="o">+</span> <span class="s1">&#39;/*.md&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="c1"># del using _ replace space of filename.</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="n">blog</span> <span class="ow">in</span> <span class="n">blogs</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="s1">&#39; &#39;</span> <span class="ow">in</span> <span class="n">blog</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="n">blog</span> <span class="o">=</span> <span class="n">blog</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">,</span> <span class="s1">&#39;_&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="nb">print</span><span class="p">(</span><span class="n">blog</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">blogs</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>获取文件后我们需要得到文件的一些基本属性，用于Header中对应值的填充</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>python</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1"># TODO: get the basic info of each blog</span>
</span></span><span class="line"><span class="cl"><span class="c1"># title(name of files) \ catalog: true \ data: create time \ subtitle: desc \ lang cn\en</span>
</span></span><span class="line"><span class="cl"><span class="c1"># header-img: we can create a loop to generate this part.</span>
</span></span><span class="line"><span class="cl"><span class="c1"># tags, categories, mathjax.</span>
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">change_realtime</span><span class="p">(</span><span class="n">timestamp</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">time_struct</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">localtime</span><span class="p">(</span><span class="n">timestamp</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">time</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s1">&#39;%Y-%m-</span><span class="si">%d</span><span class="s1"> %H:%M:%S&#39;</span><span class="p">,</span> <span class="n">time_struct</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">get_attribute</span><span class="p">(</span><span class="n">blog</span><span class="p">,</span> <span class="n">verbose</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">attr</span> <span class="o">=</span> <span class="p">{}</span>
</span></span><span class="line"><span class="cl">    <span class="c1"># get timestamp.</span>
</span></span><span class="line"><span class="cl">    <span class="n">create_time</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">getctime</span><span class="p">(</span><span class="n">blog</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">modify_time</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">getmtime</span><span class="p">(</span><span class="n">blog</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">attr</span><span class="p">[</span><span class="s1">&#39;data&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">change_realtime</span><span class="p">(</span><span class="n">create_time</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">attr</span><span class="p">[</span><span class="s1">&#39;m_data&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">change_realtime</span><span class="p">(</span><span class="n">modify_time</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1"># get tags and categories.</span>
</span></span><span class="line"><span class="cl">    <span class="n">tags</span> <span class="o">=</span> <span class="n">blog</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">)[</span><span class="o">-</span><span class="mi">2</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="n">attr</span><span class="p">[</span><span class="s1">&#39;tags&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">tags</span>
</span></span><span class="line"><span class="cl">    <span class="n">attr</span><span class="p">[</span><span class="s1">&#39;categories&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">tags</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1"># get title.</span>
</span></span><span class="line"><span class="cl">    <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">blog</span><span class="p">,</span> <span class="s1">&#39;r&#39;</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="s1">&#39;UTF-8&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">lines</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">readlines</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">        <span class="n">title</span> <span class="o">=</span> <span class="n">lines</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;#&#39;</span><span class="p">)[</span><span class="mi">1</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">        <span class="n">attr</span><span class="p">[</span><span class="s1">&#39;title&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">title</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1"># default attr</span>
</span></span><span class="line"><span class="cl">    <span class="n">attr</span><span class="p">[</span><span class="s1">&#39;lang&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;cn&#39;</span>
</span></span><span class="line"><span class="cl">    <span class="c1"># verbose:</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">verbose</span><span class="p">:</span> <span class="nb">print</span><span class="p">(</span><span class="n">blog</span><span class="p">,</span> <span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">,</span> <span class="n">attr</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">attr</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>为了不意外损坏源文件，同时保持源文件的结构、组织和属性等等，我们Cpy并只对副本进行操作，cpy的同时转移文件路径到所需地点。</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>python</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">cpy_files</span><span class="p">(</span><span class="n">blog</span><span class="p">,</span><span class="n">target</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;&#34;&#34;cpy files to the target path&#34;&#34;&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="n">filename</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">basename</span><span class="p">(</span><span class="n">blog</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">os</span><span class="o">.</span><span class="n">system</span><span class="p">(</span><span class="s1">&#39;cp &#39;</span> <span class="o">+</span> <span class="n">blog</span> <span class="o">+</span> <span class="s1">&#39; &#39;</span> <span class="o">+</span> <span class="n">target</span> <span class="o">+</span> <span class="n">filename</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">target</span> <span class="o">+</span> <span class="n">filename</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>在获取完基本属性和转移后，我们需要开始对文件进行添加header的处理,在这里我们添加了一个Loop为Blog设置不同的背景图片，根据自己有多少图片进行自定义设置吧。</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>python</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">add_header</span><span class="p">(</span><span class="n">blog</span><span class="p">,</span><span class="n">index</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span><span class="n">attr</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;&#34;&#34;add default header for each files&#34;&#34;&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="n">header_imgs</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span><span class="mi">5</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">blog</span><span class="p">,</span> <span class="s2">&#34;r+&#34;</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="s1">&#39;UTF-8&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">old</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">        <span class="n">f</span><span class="o">.</span><span class="n">seek</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&#34;---</span><span class="se">\n</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&#34;title: &#34;</span> <span class="o">+</span> <span class="n">attr</span><span class="p">[</span><span class="s1">&#39;title&#39;</span><span class="p">]</span> <span class="o">+</span> <span class="s2">&#34;</span><span class="se">\n</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&#34;catalog: true</span><span class="se">\n</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&#34;date: &#34;</span> <span class="o">+</span> <span class="n">attr</span><span class="p">[</span><span class="s1">&#39;data&#39;</span><span class="p">]</span> <span class="o">+</span> <span class="s2">&#34;</span><span class="se">\n</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&#34;subtitle: </span><span class="se">\n</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&#34;lang: &#34;</span> <span class="o">+</span> <span class="n">attr</span><span class="p">[</span><span class="s1">&#39;lang&#39;</span><span class="p">]</span> <span class="o">+</span> <span class="s2">&#34;</span><span class="se">\n</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&#34;header-img: &#34;</span> <span class="o">+</span> <span class="s1">&#39;/img/header_img/lml_bg</span><span class="si">{}</span><span class="s1">.jpg&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">index</span><span class="o">%</span><span class="mi">6</span><span class="p">)</span> <span class="o">+</span> <span class="s2">&#34;</span><span class="se">\n</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&#34;tags: &#34;</span> <span class="o">+</span> <span class="s2">&#34;</span><span class="se">\n</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&#34;-  &#34;</span> <span class="o">+</span> <span class="n">attr</span><span class="p">[</span><span class="s1">&#39;tags&#39;</span><span class="p">]</span> <span class="o">+</span> <span class="s2">&#34;</span><span class="se">\n</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&#34;categories: &#34;</span> <span class="o">+</span> <span class="s2">&#34;</span><span class="se">\n</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&#34;-  &#34;</span> <span class="o">+</span> <span class="n">attr</span><span class="p">[</span><span class="s1">&#39;categories&#39;</span><span class="p">]</span> <span class="o">+</span> <span class="s2">&#34;</span><span class="se">\n</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&#34;---</span><span class="se">\n</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">old</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>然后就是执行文件夹的批量处理了。可以添加args便于对多个文件夹进行处理，或者控制只变换单个文件等，应该需求不大，且代码比较简单，这里就暂时不贴出了。</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>python</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">dir_process</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="n">blogs</span> <span class="o">=</span> <span class="n">get_all_blogs</span><span class="p">(</span><span class="n">BlogPath</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="n">i</span><span class="p">,</span><span class="n">blog</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">blogs</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="n">b_attr</span> <span class="o">=</span> <span class="n">get_attribute</span><span class="p">(</span><span class="n">blog</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">new_blog</span> <span class="o">=</span> <span class="n">cpy_files</span><span class="p">(</span><span class="n">blog</span><span class="p">,</span> <span class="n">TargetPath</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">add_header</span><span class="p">(</span><span class="n">new_blog</span><span class="p">,</span> <span class="n">index</span><span class="o">=</span><span class="n">i</span><span class="p">,</span> <span class="n">attr</span><span class="o">=</span><span class="n">b_attr</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s1">&#39;__main__&#39;</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="n">dir_process</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">    <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;Done!&#39;</span><span class="p">)</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script>]]></content:encoded>
    </item>
    <item>
      <title>Latex tesing</title>
      <link>https://aikenh.cn/posts/latex_testing/</link>
      <pubDate>Wed, 13 Apr 2022 16:50:53 +0000</pubDate>
      <guid>https://aikenh.cn/posts/latex_testing/</guid>
      <description>test hexo render</description>
      <content:encoded><![CDATA[<p>该文档主要目的是用于测试Latex语法对应前端的渲染能力，主要用于测试Hexo站点是否能正常渲染Latex。</p>
<p>Example1: 2 inline in one sentence.</p>
<p>When $a \ne 0$ , there are two solutions to $(ax^2 + bx + c = 0)$ and they are</p>
<div>
$$ x = {-b \pm \sqrt{b^2-4ac} \over 2a}. $$
</div>
<p>Example2: Matrix Example</p>
<div>
$$ 
\begin{bmatrix} 1&x&x^2\\ 1&y&y^2\\ 1&z&z^2 \end{bmatrix}
\\
\begin{bmatrix} 1&x&x^2\\\\ 1&y&y^2\\\\ 1&z&z^2 \end{bmatrix}
\\
vmatrix ||、Bmatrix{}、pmatrix()
 $$
</div>
<p>Example3: the Conditional Formula</p>
<div>
$$ 
f(x)=
\begin{cases}
0& \text{x=0}\\\\
1& \text{x!=0}
\end{cases}
 $$
</div>
<p>Example4: Sprcial Symboy</p>
<div>
$$ 
\lim_{\alpha \rightarrow +\infty} \frac{1}{\alpha(\beta+1)}
 $$
</div>
<p>Example5: Complex Function Which Occurs Error in Much Situation</p>
<div>
$$ 
\begin{gathered}
\mathcal{L}_{POD-final} = \frac{\lambda_c}{L-1}\sum_{l=1}^{L-1} \mathcal{L}_{POD-spatial}(f_l^{t-1}(x),f_l^t(x)) +  \\
\lambda_f \mathcal{L}_{POD-flat}(f_l^{t-1}(x),f_l^t(x))
\end{gathered}
 $$
</div>
<p>Example6：Mathbb、Text、etc&hellip;</p>
<div>
$$ 
\mathcal{L}_{\text {POD-pixel }}\left(\mathbf{h}_{\ell}^{t-1}, \mathbf{h}_{\ell}^{t}\right)=\sum_{c=1}^{C} \sum_{w=1}^{W} \sum_{h=1}^{H}\left\|\mathbf{h}_{\ell, c, w, h}^{t-1}-\mathbf{h}_{\ell, c, w, h}^{t}\right\|^{2}
 $$
</div>
<p>Example7: Multiple Lines of Loss in Incremental Learning</p>
<div>
$$ 
\begin{gathered}
\mathcal{L}_{\text {POD-channel }}\left(\mathbf{h}_{\ell}^{t-1}, \mathbf{h}_{\ell}^{t}\right)=\sum_{w=1}^{W} \sum_{h=1}^{H}\left\|\sum_{c=1}^{C} \mathbf{h}_{\ell, c, w, h}^{t-1}-\sum_{c=1}^{C} \mathbf{h}_{\ell, c, w, h}^{t}\right\|^{2} \\
\mathcal{L}_{\text {POD-gap }}\left(\mathbf{h}_{\ell}^{t-1}, \mathbf{h}_{\ell}^{t}\right)=\sum_{c=1}^{C}\left\|\sum_{w=1}^{W} \sum_{h=1}^{H} \mathbf{h}_{\ell, c, w, h}^{t-1}-\sum_{w=1}^{W} \sum_{h=1}^{H} \mathbf{h}_{\ell, c, w, h}^{t}\right\|^{2} \\
\mathcal{L}_{\text {POD-width }}\left(\mathbf{h}_{\ell}^{t-1}, \mathbf{h}_{\ell}^{t}\right)=\sum_{c=1}^{C} \sum_{h=1}^{H}\left\|\sum_{w=1}^{W} \mathbf{h}_{\ell, c, w, h}^{t-1}-\sum_{w=1}^{W} \mathbf{h}_{\ell, c, w, h}^{t}\right\|^{2}
\end{gathered}
 $$
</div>
<p>如果这些都能正确渲染的话，基本整个文档中的Latex基本渲染应该都没问题，用该文档能验证当前本地渲染的版本是否是正确的。</p>
]]></content:encoded>
    </item>
    <item>
      <title>部署和发布 Hexo 博客</title>
      <link>https://aikenh.cn/posts/hexo_build/</link>
      <pubDate>Tue, 12 Apr 2022 11:16:30 +0000</pubDate>
      <guid>https://aikenh.cn/posts/hexo_build/</guid>
      <description>以 Livemylive 为例搭建并发布自己的Hexo博客</description>
      <content:encoded><![CDATA[<p>该文档用以，记录自己（外行）利用Hexo建立Blog的过程，将原本用Gitbook构建的笔记转移到Hexo中，同时购买域名并部署其上。网页部署于<a href="AikenH.cn">Github Page</a>
。以Live my Live主题为例。</p>
<p>腾讯云和Github Page的操作和理解在现有的一些博客中过时了，或者说存在一些问题，后续会对此进行简单的讲解。同时大部分博客都是使用NexT主题进行配置，这里采用的是Live My Life主题，该博文介绍自己的粗浅理解，也为自己后续的工作进行一定的参考。</p>
<p>还存在一些<strong>没有解决</strong>的问题：</p>
<ul>
<li>对主题切换和主题配置和全局配置的的深入理解（Live my Life主题覆盖了很多默认配置）</li>
<li>前端代码的理解，<strong>自定义Layout</strong>，超链接，图标等</li>
<li>深入理解插件的应用和自定义</li>
<li>推送网站到baidu和google（Option）（没有计划）</li>
</ul>
<p>之后有时间的话可以去研究一下：</p>
<p><strong>关键词</strong>：Hexo_Livemylive、Github Page、腾讯云（Domain、DNS、SSL）</p>
<h2 id="environment">Environment</h2>
<p>需要准备的环境如下：本地Node（NPM），Page部署Git（SSH），可在Windows，Linux，WSL2中部署均可，但需要注意的是，如果在WSL2中进行部署，生成速度与部署速度会明显慢于宿主机。</p>
<p>首先安装NodeJS、NPM、Git并验证是否成功安装，根据Linux和Windows不同环境进行安装，可以去官网了解相关的安装步骤，或者参考Gitee和Github的两篇博文。</p>
<p>为了更好的编写笔记，最好配置一个图床，图床的配置可以使用Github、Gitee或者腾讯云的COS服务，相关的配置可以参考<a href="https://aikenh.cn/en/PicBed/" target="_blank" rel="noopener">LInk</a>
</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>sh</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">git version
</span></span><span class="line"><span class="cl">node -v
</span></span><span class="line"><span class="cl">npm -v</span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>安装Hexo</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>sh</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">npm install -g hexo-cli
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 查看Hexo的版本</span>
</span></span><span class="line"><span class="cl">hexo -v</span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><h2 id="initialize">Initialize</h2>
<h3 id="blog">Blog</h3>
<p>对博客目录初始化：<code>hexo init blog</code>，blog为空的话初始化当前文件夹，初始化后基本结构如下：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>sh</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">.
</span></span><span class="line"><span class="cl">├── _config.yml <span class="c1"># 网站的全局配置信息，在此配置大部分的参数。 </span>
</span></span><span class="line"><span class="cl">├── package.json <span class="c1"># 定义Hexo，以及对应安装的依赖的版本等</span>
</span></span><span class="line"><span class="cl">├── node_module: <span class="c1"># Hexo安装插件的位置</span>
</span></span><span class="line"><span class="cl">├── scaffolds <span class="c1"># 页面模版文件夹</span>
</span></span><span class="line"><span class="cl">├── <span class="nb">source</span>  <span class="c1"># 资源文件夹，除 _posts 文件，其他以下划线_开头的文件或者文件夹不会被编译打包到public文件夹</span>
</span></span><span class="line"><span class="cl"><span class="p">|</span>   ├── _drafts <span class="c1"># 草稿文件</span>
</span></span><span class="line"><span class="cl"><span class="p">|</span>   └── _posts <span class="c1"># 文章Markdowm文件 </span>
</span></span><span class="line"><span class="cl">└── themes  <span class="c1"># 主题文件夹</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>有了初始化的目录后，就可以参考相关主题的官方介绍页面进行对应的 配置，不同的主题可能有不同的配置方法。接下来我们会以<a href="https://github.com/V-Vincen/hexo-theme-livemylife/blob/master/README_CN.md" target="_blank" rel="noopener">《Live my life》</a>
主题为例。</p>
<p>后续基于别的主题对文件配置有了更深入的理解后，会对配置部分进行更新说明，或另开一贴。</p>
<h3 id="github">Github</h3>
<p>本文使用Github Page构建自己的静态站点，用于部署自己的网页。GitHub只能使用一个同名仓库托管一个静态站点：aikenh.github.io，但是可以在此站之上，使用其他仓库构建子域名如: aikenh.github.io/Docs</p>
<p>Git和Github仓库和链接的初始化参见<a href="https://aikenh.cn/en/GitGithub/" target="_blank" rel="noopener">GitWorkflow</a>
；对应的io，可以通过建立【UserName】.github.io为名的Repo，并在<strong>Setting</strong>-&gt; <strong>Code and automation</strong> -&gt; <strong>Page</strong>中选择对应的Branch作为Source.</p>
<p>
<div class="post-img-view">
  <a data-fancybox="gallery" href="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/imgs/20220413001718.png">
    <img loading="lazy" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/imgs/20220413001718.png"class="responsive-image" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/imgs/20220413001718.png" style="display: block; margin: 0 auto;"
      alt=""  />
  </a>
</div>


<script>
  document.addEventListener("DOMContentLoaded", function() {
      var images = document.querySelectorAll(".responsive-image");
      var maxHeight = window.innerHeight / 2.5;
      images.forEach(function(image) {
          image.style.maxHeight = maxHeight + "px";
      });
  });
</script>
</p>
<p>完成后如图所示，后续设置好域名解析服务后后可在<strong>Custom domain</strong>中设置你的自定义域名，github.io将自动转换成该域名，会在域名解析部分详细介绍</p>
<p>
<div class="post-img-view">
  <a data-fancybox="gallery" href="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/imgs/20220413001932.png">
    <img loading="lazy" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/imgs/20220413001932.png"class="responsive-image" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/imgs/20220413001932.png" style="display: block; margin: 0 auto;"
      alt=""  />
  </a>
</div>


<script>
  document.addEventListener("DOMContentLoaded", function() {
      var images = document.querySelectorAll(".responsive-image");
      var maxHeight = window.innerHeight / 2.5;
      images.forEach(function(image) {
          image.style.maxHeight = maxHeight + "px";
      });
  });
</script>
</p>
<p>创建完该网站Github的初始部分差不多完成。</p>
<h2 id="config-livemylife">Config-livemylife</h2>
<p>本章节的基本操作均针对<code>_config.yml</code>进行。</p>
<p>基于我的理解，为了便于多主题的配置和切换，在主<em>Config.yml</em> 中应该尽量不参与特定主题的设置，而在<code>Theme/SpecificTheme/_config.yml</code>中为每个主题定制基本的配置为好。但目前只用过这个主题，就以此为例。</p>
<p>更多的设置去主题的readme中查看和设置。</p>
<p><strong>初始化主题</strong>：设置主题的基本需求，并基于此安装相关依赖</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>sh</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl"><span class="nb">cd</span> blog
</span></span><span class="line"><span class="cl">rm -rf scaffolds <span class="nb">source</span> themes _config.landscape.yml _config.yml package.json yarn.lock <span class="c1">#just keep node_modules</span>
</span></span><span class="line"><span class="cl">git clone https://github.com/V-Vincen/hexo-theme-livemylife.git
</span></span><span class="line"><span class="cl">mv hexo-theme-livemylife/* ./
</span></span><span class="line"><span class="cl">rm -rf hexo-theme-livemylife
</span></span><span class="line"><span class="cl">npm install</span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p><strong>设置主题</strong>：修改配置中的theme值</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>yaml</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">theme</span><span class="p">:</span><span class="w"> </span><span class="l">livemylife</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">themecolor</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="nt">enable</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="nt">mode</span><span class="p">:</span><span class="w"> </span><span class="l">light</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>完成了基础设置后，可以直接在本地运行博客，查看效果，方便后续调试后部署，具体命令如下</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>bash</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">hexo cl <span class="o">&amp;&amp;</span> hexo g <span class="o">&amp;&amp;</span> hexo s -p your-port
</span></span><span class="line"><span class="cl"><span class="c1"># default port is 4000</span>
</span></span><span class="line"><span class="cl">hexo g <span class="o">&amp;&amp;</span> hexo s</span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><h3 id="basic-configs">Basic Configs</h3>
<p>使用自己的信息修改配置文件的对应选项，以下介绍一些基本属性配置：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>yaml</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># header</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">title</span><span class="p">:</span><span class="w"> </span><span class="l">My_Blog</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">subtitle</span><span class="p">:</span><span class="w"> </span><span class="l">some description of u or ur site</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">author</span><span class="p">:</span><span class="w"> </span><span class="l">NickName</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">timezone</span><span class="p">:</span><span class="w"> 
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c"># url</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">url: http://aikenh.cn # note</span><span class="p">:</span><span class="w"> </span><span class="l">不要忘了修改source文件中的CNAME</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">root</span><span class="p">:</span><span class="w"> 
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">permalink</span><span class="p">:</span><span class="w"> </span><span class="p">:</span><span class="l">lang/:title/</span><span class="w"> </span><span class="c"># 子页面的链接形式</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c"># site setting</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">SEOTitle</span><span class="p">:</span><span class="w"> </span><span class="l">Names Blog</span><span class="w"> </span><span class="c"># 标签栏显示的标题</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="l">email：</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">description</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;Development Documentation&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">keyword</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;name,Name,blog,Blog&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">header-img</span><span class="p">:</span><span class="w"> </span><span class="l">img/header_img/bg_img.jpg</span><span class="w"> </span><span class="c"># 标题图像的存储路径，Source为根路径</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">favicon</span><span class="p">:</span><span class="w"> </span><span class="l">img/avatar/f_img.png</span><span class="w"> </span><span class="c"># 标签栏显示的图像</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c"># 暂时不使用签名</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">signature</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">signature-img</span><span class="p">:</span><span class="w"> </span><span class="l">_ </span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>不使用<a href="https://v-vincen.life/en/How-to-Use-Internationalization%EF%BC%88i18n%EF%BC%89/" target="_blank" rel="noopener">Internationalization</a>
设置，关掉选项：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>yaml</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">langselect</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="nt">enable</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>该选项会关闭生成语言选择按钮。</p>
<h3 id="effects-custom">Effects custom</h3>
<p>该部分控制页面的特效设置。主要包括关闭线段背景，线段背景消耗CPU的同时还会遮挡文字，故而关闭；鼠标点击特效mouseclick关闭，在界面使用的时候异常选中的问题以及遮挡的问题。</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>yaml</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">wave</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c"># false can not disable this, should del content and color alse</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">mouseclick</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="nt">enable</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="nt">content</span><span class="p">:</span><span class="w"> 
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="nt">color</span><span class="p">:</span><span class="w"> 
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">ribbonDynamic</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">bglinecanvas</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><h3 id="sidebar--sns">Sidebar &amp; SNS</h3>
<p>启用侧边栏放置相关的个人信息，SNS的设置实际上也与该部分相关，会显示在头像的下方。</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>yaml</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">sidebar</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">   </span><span class="c"># whether or not using Sidebar.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">sidebar-about-description</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;making trash&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">sidebar-avatar</span><span class="p">:</span><span class="w"> </span><span class="l">img/avatar/samura.jpg   </span><span class="w"> </span><span class="c"># use absolute URL, seeing it&#39;s used in both `/` and `/about/`</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">widgets</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span>- <span class="nt">visitor   # busuanzi</span><span class="p">:</span><span class="w"> </span><span class="l">https://busuanzi.ibruce.info/</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span>- <span class="l">featured-tags</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span>- <span class="l">short-about</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span>- <span class="l">recent-posts</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span>- <span class="l">friends-blog</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span>- <span class="l">archive</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span>- <span class="l">category</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c"># widget behavior 设置相关的Archieve侧边部件</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c">## Archive</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">archive_type</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;monthly&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">show_count</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c">## Featured Tags </span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">featured-tags</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">   </span><span class="c"># whether or not using Feature-Tags</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">featured-condition-size</span><span class="p">:</span><span class="w"> </span><span class="m">0</span><span class="w">    </span><span class="c"># A tag will be featured if the size of it is more than this condition value</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c">## Friends 友站设置</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">friends</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>{<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">title</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;GitBook&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">href</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;https://Name.github.io/Docs&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>}<span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>{<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">title</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;Hexo&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">href</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;https://hexo.io/&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>}<span class="p">]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c"># SNS Settings just enable what u want.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">RSS</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">github_username</span><span class="p">:</span><span class="w"> </span><span class="l">yourAccount</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">twitter_username</span><span class="p">:</span><span class="w"> </span><span class="l">yourAccount</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c"># instagram_username: </span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c"># facebook_username:  yourAccount</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c"># linkedin_username:  yourAccount</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">zhihu_username</span><span class="p">:</span><span class="w"> </span><span class="l">yourAccount</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">weibo_username</span><span class="p">:</span><span class="w"> </span><span class="l">numid of weibo in url</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><h3 id="layout-custom">Layout Custom</h3>
<p>修改一些页面布局，除了一些基础设置，还有还有一些对应的标签问题。</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>yaml</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># top scroll progress</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">scroll</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c"># make article sticky</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">top</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c"># count word for each doc</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">wordcount</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c"># show tag of each article</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">home_posts_tag</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c"># anchorjs 设置锚点</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">anchorjs</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">socialshare</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">viewer</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>页面的Newer Posts和Old Posts在<code>theme</code>中，根据不同的语言选项去修改即可。

<div class="post-img-view">
  <a data-fancybox="gallery" href="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/imgs/20220413013824.png">
    <img loading="lazy" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/imgs/20220413013824.png"class="responsive-image" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/imgs/20220413013824.png" style="display: block; margin: 0 auto;"
      alt=""  />
  </a>
</div>


<script>
  document.addEventListener("DOMContentLoaded", function() {
      var images = document.querySelectorAll(".responsive-image");
      var maxHeight = window.innerHeight / 2.5;
      images.forEach(function(image) {
          image.style.maxHeight = maxHeight + "px";
      });
  });
</script>
</p>
<p>页面背景在博文中通过Header（Meta-data）设置，批量转化的时候可以通过代码循环生成，后续进行转化的时候最好依靠随机数指定。</p>
<h3 id="github-page">Github Page</h3>
<p>安装部署插件如下：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>shell</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">npm install hexo-deployer-git  --save</span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>实际上就是将<code>public</code> 文件夹<code>push</code>到对应仓库的指定分支，有插件能够直接执行该操作，在config中执行如下设置：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>yaml</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">deploy</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l">git</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">repo</span><span class="p">:</span><span class="w"> </span><span class="l">https://github.com/&lt;yourAccount&gt;/&lt;repo&gt;</span><span class="w"> </span><span class="c"># or https://gitee.com/&lt;yourAccount&gt;/&lt;repo&gt;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">branch</span><span class="p">:</span><span class="w"> </span><span class="l">&lt;your-branch&gt;</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>之后执行 <code>hexo d</code>即可</p>
<h3 id="mathjaxtb-fix">Mathjax（TB fix）</h3>
<p>用于下一次验证的策略：手动添加MathJa支持而不基于<a href="http://masikkk.com/article/hexo-13-MathJax/" target="_blank" rel="noopener">Kramed</a>
，基于此思想迁移到<a href="https://adaning.github.io/posts/33457.html" target="_blank" rel="noopener">Mathjax3</a>
，也避免了Kramed和Prismjs的冲突。</p>
<p>支持公式的方式主要有<a href="https://dog.wtf/tech/making-hexo-next-theme-latex-math-equation-supported/" target="_blank" rel="noopener">以下</a>
的几种思路，该设置实际上主要是和Next主题相关，包括Katex等</p>
<p>
<div class="post-img-view">
  <a data-fancybox="gallery" href="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/imgs/20220413155935.png">
    <img loading="lazy" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/imgs/20220413155935.png"class="responsive-image" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/imgs/20220413155935.png" style="display: block; margin: 0 auto;"
      alt=""  />
  </a>
</div>


<script>
  document.addEventListener("DOMContentLoaded", function() {
      var images = document.querySelectorAll(".responsive-image");
      var maxHeight = window.innerHeight / 2.5;
      images.forEach(function(image) {
          image.style.maxHeight = maxHeight + "px";
      });
  });
</script>
</p>
<p>该主题目前使用的是Mathjax + kramed + it的方式。</p>
<p>官方描述对应的Latex支持, 该部分目前的渲染效果处于玄学状态，有时候能用，有时候针对一些语法会出现渲染错误，但是并不能很好的定位到错误的原因。现象如下：</p>
<ul>
<li>缩略图中出现正常的渲染，而在正文中只显示公式</li>
<li>部分语法可以正常渲染，稍微复杂一点的无法渲染，且原因不定。</li>
</ul>
<p>目前猜测可能与Package有一定的关系，在对hexo-renderer-marked等Package进行操作后，可能就会恢复正常。</p>
<p>当前情况下在Windows清除，在WSL2中执行Hexo命令好像就可以，非常的玄学。</p>
<p>目前按照<a href="https://v-vincen.life/en/How-to-Use-Mathjax/" target="_blank" rel="noopener">主题</a>
的方式（默认已配置好），后续如果效果仍然不稳定，可能会对渲染的方式进行改动。比如利用<a href="https://linkinpark213.com/2018/04/24/mathjax/" target="_blank" rel="noopener">math的jax支持</a>
，或者基于<a href="https://hexo-next.readthedocs.io/zh_CN/latest/next/advanced/%E9%85%8D%E7%BD%AEMathJax/" target="_blank" rel="noopener">pandoc</a>
的方式把。后续再出现问题的话对比一下。</p>
<ul>
<li>利用pandoc可以完美的显示所有的LaTex，但是原有设置下Archive主页的归档信息消失：</li>
<li>基于karmx等的数学公式无法完美显示，问题有些严重，所以最终还是换了</li>
</ul>
<p>其中的一些<a href="https://blog.csdn.net/qq_44766883/article/details/107103668" target="_blank" rel="noopener">语义冲突修改</a>
倒是在新版本中，好像影响不是很明显，可能更多的是与marked的冲突，但是我们使用的是别的渲染引擎</p>
<p><strong>CDN的设置</strong>：可能需要自动<a href="https://cps.ninja/2019/03/16/hexo-with-latex/" target="_blank" rel="noopener">添加文件末尾</a>
，CDN可以自己去找一找了，把后面的对其就行</p>
<blockquote>
<p>在 ~/blog/_config.yml 文件（注意，是 Hexo 博客文件夹根目录中的 /_config.yml 而不是主题目录下的 /themes/next/_config.yml）中增加 MathJax 的支持，并手动设置下面的 src（这一步很重要，使用默认的 src 会导致数学表达式渲染显示失败。这里的关键是 src 中的 ?config=TeX-MML-AM_CHTML 这个字段）</p>
</blockquote>
<h4 id="pandoc">Pandoc</h4>
<p>MathJax + PanDoc + it的解决方案，最好部署在自己的服务器上，部署在Github上有一些折磨, Pandoc需要使用CI或者Action去部署，等熟悉了再采用该方法把。</p>
<p>pandoc 需要本机中首先安装 <a href="https://pandoc.org/installing.html#windows" target="_blank" rel="noopener">pandoc</a>
，各平台参考官方链接进行安装即可。</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>bash</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">npm uninstall hexo-renderer-kramed --save
</span></span><span class="line"><span class="cl">npm install hexo-renderer-pandoc -- save</span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>（非正常方式）对于Archive的问题只需要修改一下生成Archive的路径即可，即通过修改config的生成archive和archive的路径</p>
<p>
<div class="post-img-view">
  <a data-fancybox="gallery" href="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/imgs/20220413155305.png">
    <img loading="lazy" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/imgs/20220413155305.png"class="responsive-image" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/imgs/20220413155305.png" style="display: block; margin: 0 auto;"
      alt=""  />
  </a>
</div>


<script>
  document.addEventListener("DOMContentLoaded", function() {
      var images = document.querySelectorAll(".responsive-image");
      var maxHeight = window.innerHeight / 2.5;
      images.forEach(function(image) {
          image.style.maxHeight = maxHeight + "px";
      });
  });
</script>
</p>
<p>具体的对pandoc的配置可以参考：[Link1](<a href="https://feigeek.com/posts/b1bbb984" target="_blank" rel="noopener">https://feigeek.com/posts/b1bbb984</a>
. html)，对其一些bug的修复则用<a href="https://yidaoxiangan.com/blog/2021/03/17/Hexo%E4%BD%BF%E7%94%A8Pandoc%E6%B8%B2%E6%9F%93%E5%B8%A6%E6%9D%A5%E7%9A%84%E5%88%97%E8%A1%A8%E7%BC%A9%E8%BF%9B%E9%97%AE%E9%A2%98%E5%8F%8A%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88/" target="_blank" rel="noopener">Link2</a>
，但是暂时作为可选项，新版的好像已经没有问题。</p>
<p>目前配置如下（有一些不对的冗余存在）：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>bash</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">mathjax: 
</span></span><span class="line"><span class="cl">  enable: <span class="nb">true</span>
</span></span><span class="line"><span class="cl">  mhchem: <span class="nb">false</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">katex: 
</span></span><span class="line"><span class="cl">  enable: <span class="nb">false</span>
</span></span><span class="line"><span class="cl">  copy_tex: <span class="nb">false</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">pandoc:
</span></span><span class="line"><span class="cl"> extensions:
</span></span><span class="line"><span class="cl">    - <span class="s1">&#39;+hard_line_breaks&#39;</span>
</span></span><span class="line"><span class="cl">    - <span class="s1">&#39;+emoji&#39;</span>
</span></span><span class="line"><span class="cl">    - <span class="s1">&#39;-implicit_figures&#39;</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><h3 id="prismjs">Prismjs</h3>
<p>在Hexo6.0<a href="https://sdwh.dev/posts/2022/01/Hexo-Syntax-Highlight/" target="_blank" rel="noopener">之前</a>
还是需要借助插件的，但是根据<a href="https://hexo.io/zh-cn/docs/syntax-highlight.html#PrismJS" target="_blank" rel="noopener">官方说明</a>
，在6.0之后官方已经添加了Prismjs的支持，disable Hightlight，Enable prismjs后，基于preprocess模式</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>yaml</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">highlight</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">enable</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">line_number</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">auto_detect</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">tab_replace</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">wrap</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">hljs</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">prismjs</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">enable</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">preprocess</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">line_number</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">tab_replace</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;&#39;</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>在对应的Theme/specific theme/layout/<code>_partial</code>/head.ejs中添加需要的css样式。</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>javascript</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-javascript" data-lang="javascript"><span class="line"><span class="cl"><span class="o">&lt;</span><span class="nx">head</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="o">&lt;</span><span class="nx">link</span> <span class="nx">rel</span><span class="o">=</span><span class="s2">&#34;stylesheet&#34;</span> <span class="nx">href</span><span class="o">=</span><span class="s2">&#34;https://cdnjs.cloudflare.com/ajax/libs/prism-themes/1.9.0/prism-lucario.min.css&#34;</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">...</span>
</span></span><span class="line"><span class="cl">  
</span></span><span class="line"><span class="cl"><span class="o">&lt;</span><span class="err">\</span><span class="nx">header</span><span class="o">&gt;</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>对应的样式可以在<a href="https://github.com/prismjs/prism-themes?utm_source=cdnjs&amp;utm_medium=cdnjs_link&amp;utm_campaign=cdnjs_library#readme" target="_blank" rel="noopener">github prismjs</a>
 中查看，其对应的cdn则按照此<a href="https://cdnjs.com/libraries/prism-themes" target="_blank" rel="noopener">链接</a>
查询，虽然不懂得javascript，但是我寻思下载到本地也是一样的，按照其他对应的prismjs-hexo-Blog中的处理即可。</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>javascript</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-javascript" data-lang="javascript"><span class="line"><span class="cl"><span class="o">&lt;</span><span class="nx">head</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="o">&lt;</span><span class="nx">link</span> <span class="nx">rel</span><span class="o">=</span><span class="s2">&#34;stylesheet&#34;</span> <span class="nx">href</span><span class="o">=</span><span class="s2">&#34;/js/prism/prism.css&#34;</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">...</span>
</span></span><span class="line"><span class="cl">  
</span></span><span class="line"><span class="cl"><span class="o">&lt;</span><span class="err">\</span><span class="nx">header</span><span class="o">&gt;</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>之后应该就可以正常使用</p>
<h3 id="password-4-blog">Password 4 Blog</h3>
<p>利用插件对特定的文章进行加密，使得特定的文章的查看需要输入密码。</p>
<p>安装插件：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>shell</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">npm install --save hexo-blog-encrypt</span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>快速使用: 只需要在文章的Meta信息中添加Password字段即可</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>markdown</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl">---
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">password: test
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">---</span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>也可进行全局加密设置：参考<a href="https://www.itfanr.cc/2021/04/16/hexo-blog-article-encryption/" target="_blank" rel="noopener">Password</a>
</p>
<h2 id="domain-setup">Domain Setup</h2>
<p><strong>腾讯云注册</strong>：首先获取一个免费的域名或是去<a href="https://dnspod.cloud.tencent.com/" target="_blank" rel="noopener">腾讯云</a>
/阿里云购买一个域名，（实名制-&gt;付钱-&gt;审核备案）</p>
<h3 id="dns-setting">DNS Setting</h3>
<p><strong>DNS解析</strong>：在购买域名的提供商为域名添加解析，以腾讯云为例：</p>
<p>（不推荐）如果想要使用ipv4，ipv6进行dns解析的话可以搜索Github Page的IP，或者</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>bash</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">ping username.github.io</span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>（推荐）在<a href="https://console.cloud.tencent.com/domain" target="_blank" rel="noopener">域名注册控制台</a>
 选择对应的域名解析

<div class="post-img-view">
  <a data-fancybox="gallery" href="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/imgs/20220413163700.png">
    <img loading="lazy" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/imgs/20220413163700.png"class="responsive-image" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/imgs/20220413163700.png" style="display: block; margin: 0 auto;"
      alt=""  />
  </a>
</div>


<script>
  document.addEventListener("DOMContentLoaded", function() {
      var images = document.querySelectorAll(".responsive-image");
      var maxHeight = window.innerHeight / 2.5;
      images.forEach(function(image) {
          image.style.maxHeight = maxHeight + "px";
      });
  });
</script>
</p>
<p><strong>主机记录</strong>：@、www分别注册一次，分别用于https://yourdomain和 https:// www. yourdomain的解析。</p>
<p><strong>记录类型</strong>：由于同个网站的CNAME和AAAA会发生冲突，这里建议使用CNAME类型，并在后续的</p>
<p><strong>记录值</strong>: 中填写自己的username.github.io

<div class="post-img-view">
  <a data-fancybox="gallery" href="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/imgs/20220413163804.png">
    <img loading="lazy" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/imgs/20220413163804.png"class="responsive-image" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/imgs/20220413163804.png" style="display: block; margin: 0 auto;"
      alt=""  />
  </a>
</div>


<script>
  document.addEventListener("DOMContentLoaded", function() {
      var images = document.querySelectorAll(".responsive-image");
      var maxHeight = window.innerHeight / 2.5;
      images.forEach(function(image) {
          image.style.maxHeight = maxHeight + "px";
      });
  });
</script>
</p>
<p>后面有免费的SSL记得勾选，等待审核即可。</p>
<h3 id="deploy-it">Deploy it</h3>
<p><strong>Hexo部署：</strong></p>
<p>本地部署和服务启动不需要d（eploy）执行到前面即可在指定的端口查看本地的部署效果了。远程部署实际上就是<code>git Push -f</code> 到远程仓库的指定分支，完成前面github page的设置可以使用hexo -d 进行部署。</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>bash</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">hexo cl 
</span></span><span class="line"><span class="cl">hexo g
</span></span><span class="line"><span class="cl">hexo s
</span></span><span class="line"><span class="cl">hexo d
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">hexo cl <span class="o">&amp;&amp;</span> hexo g <span class="o">&amp;&amp;</span> hexo s <span class="o">&amp;&amp;</span> hexo d</span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p><strong>Github绑定：</strong></p>
<p>在站点的source目录下创建CNAME并添加域名</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>bash</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;yourDomain&#34;</span> &gt;&gt; CNAME</span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>在Github-&gt; Repo -&gt; Settting -&gt; Page —&gt; Custom Domain 中填写域名并保存，等待解析完成后，即可。</p>
<p>参考资料：<a href="https://cloud.tencent.com/developer/article/1834163" target="_blank" rel="noopener">Link1</a>
、<a href="http://t.zoukankan.com/zengmianhui-p-12634066.html" target="_blank" rel="noopener">Link2</a>
</p>
<h2 id="themes-switch">Themes Switch</h2>
<p>主题之间的切换应该和我预想的一致，下载主题到对应的Theme文件夹，在最外层的_Config中切换，但是由于我们的初始主题Live my LIfe极度依赖默认<code>_config.yml</code>，而非自身目录下的配置文件。故而有以下的几点工作</p>
<ul>
<li><strong>Compatibility Check</strong>： config setting，plugin version and dependencies conflics</li>
<li><strong>Dir structure</strong>： check the consistency of the dir tree structure</li>
<li><strong>Find themes u like</strong>: latex-support，post-style，archive，tag，Difficulty，Long-Time-Support&hellip;</li>
</ul>
<p>以下这些是一些初步筛选出来的觉得还可以的主题，之后可以切换看看：</p>
<ol>
<li><a href="http://miccall.tech/2018/12/05/Shader/toolbag3%20Shader/" target="_blank" rel="noopener">画廊</a>
 Miccall主页为画廊的基本样式，有对应的图库功能，作为图片和效果展示的话可能还不错，post页面和标签等页面较为一般。</li>
<li><a href="https://tridiamond.tech/" target="_blank" rel="noopener">三钻主题</a>
，亮色惊艳，暗色太花，设计难度和修改难度估计较大，Archive为时间轴模式，大爱，可以的话看看怎么将LivemyLife的Archive也变为这种样式。正文的效果以及对应的TOC</li>
<li><a href="https://www.iequa.com/" target="_blank" rel="noopener">极简程序员博客</a>
，简洁美但是稍微有点太简洁，Archive界面好像崩了</li>
<li><a href="https://blinkfox.github.io/" target="_blank" rel="noopener">闪耀狐</a>
，LTS，分类的雷达图，标签的热力图大爱，想办法搞到自己的主题里，功能较为全面和完善，如果想要自定义或者添加一些功能，完全可以参考这个主题。</li>
<li><a href="https://hexo.io/themes/" target="_blank" rel="noopener">Find More</a>
 官方主题游廊</li>
</ol>
<p>当前对各方各面的概念还不是太理解，后面考虑对网页构建的底层，以及其他的相关知识进行进一步的了解，方便自己对网站进行更进一步的自定义。</p>
<h2 id="public">Public</h2>
<p>站点提交，通过将自己的网页提交给搜索引擎，使得自己的文章能够被搜索到，目前暂时先不考虑Public，所以这里先行占位，功能暂时不进行支持。</p>
<p>主要参考<a href="https://www.hansion.win/2020/04/13/hexo-bo-ke-deng-jing-tai-wang-ye-ti-jiao-bai-du-he-google-gu-ge-shou-lu/" target="_blank" rel="noopener">Link1</a>
，初步计划使用sitemap进行站点提交，由于baidusitemap存在较多冲突考虑先不启用。后续进行继续实验。</p>
<h2 id="reference">Reference</h2>
<ol>
<li><a href="https://segmentfault.com/a/1190000017986794" target="_blank" rel="noopener">基础+百度网站提交</a>
 | <a href="https://hackmd.io/@Heidi-Liu/note-hexo-github#%E4%BB%80%E9%BA%BC%E6%98%AF-Hexo%EF%BC%9F" target="_blank" rel="noopener">基础解读</a>
 |</li>
<li><a href="https://hexo.io/zh-tw/docs/configuration" target="_blank" rel="noopener">Official SIte</a>
： 介绍默认_config文件的配置信息</li>
<li><a href="https://yesmore.cc/cn/hexo-livemylife/#Mathjax%E6%B8%B2%E6%9F%93%E9%85%8D%E7%BD%AE" target="_blank" rel="noopener">简单修改</a>
livemylife主题的一些简单修改</li>
<li><a href="https://zhuanlan.zhihu.com/p/26625249" target="_blank" rel="noopener">知乎教程</a>
 可以添加网易云音乐的外链，同时有我们需要的自定义社交网络按钮的部分（基于Next）去看看用的是什么插件，怎么嵌入。</li>
<li><a href="https://zhuanlan.zhihu.com/p/33616481" target="_blank" rel="noopener">zhihu2</a>
，基本同上，但是多了一些其他的自定义的</li>
<li>大小写的改变不会git推送，导致发生<a href="https://www.lovesofttech.com/general/hexoTagsAndCategories404Error.html" target="_blank" rel="noopener">404</a>
错误</li>
</ol>
]]></content:encoded>
    </item>
    <item>
      <title>使用 PicGo 设置图床</title>
      <link>https://aikenh.cn/posts/picbed/</link>
      <pubDate>Sun, 27 Mar 2022 09:19:23 +0000</pubDate>
      <guid>https://aikenh.cn/posts/picbed/</guid>
      <description>Github | Tencent-COS</description>
      <content:encoded><![CDATA[<p>@Aiken 2020 first write，2021 modify</p>
<p>Mainly using picgo-core(command line) to setting picbed，and we can update the setting method</p>
<h2 id="github">Github</h2>
<ul>
<li><a href="#Pic-Bed">使用PicGo-Core（command line）设置github图床，自动转义url</a>
</li>
<li><a href="#Git">插入自动复制图片，使用git上传github</a>
</li>
</ul>
<h3 id="基本部署">基本部署</h3>
<ol>
<li>在偏好设置中的图像，进行如下设置👇： 下载或更新PicGo-Cord(command line)</li>
</ol>
<p>
<div class="post-img-view">
  <a data-fancybox="gallery" href="https://raw.githubusercontent.com/AikenH/md-image/master/img/image-20200512160643588.png">
    <img alt="image-20200512160643588" loading="lazy" src="https://raw.githubusercontent.com/AikenH/md-image/master/img/image-20200512160643588.png"class="responsive-image" src="https://raw.githubusercontent.com/AikenH/md-image/master/img/image-20200512160643588.png" style="display: block; margin: 0 auto;"
      alt="image-20200512160643588"  />
  </a>
</div>


<script>
  document.addEventListener("DOMContentLoaded", function() {
      var images = document.querySelectorAll(".responsive-image");
      var maxHeight = window.innerHeight / 2.5;
      images.forEach(function(image) {
          image.style.maxHeight = maxHeight + "px";
      });
  });
</script>
</p>
<ol start="2">
<li>
<p>接着去Github中建立一个Repo：UserName/RepoName，用以存放图片（Public），简单的用readme初始建立即可。</p>
</li>
<li>
<p>在Github的setting - developer setting-personal access tokens中新建token，指定简单的repo权限，并记录个人的token（只显示一次）
<strong>Attention：</strong> 忘记记录的话，在token中也是通过update token（好像是这个名，获取新的值的）</p>
</li>
<li>
<p>用Typora打开配置文件设置，或者使用命令行进行配置</p>
</li>
</ol>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>json</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl">   <span class="p">{</span>
</span></span><span class="line"><span class="cl">       <span class="nt">&#34;picBed&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">           <span class="nt">&#34;github&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">             <span class="nt">&#34;repo&#34;</span><span class="p">:</span> <span class="s2">&#34;UserName/RepoName&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">             <span class="nt">&#34;token&#34;</span><span class="p">:</span> <span class="s2">&#34;your github token here&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">             <span class="nt">&#34;path&#34;</span><span class="p">:</span> <span class="s2">&#34;img/&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">             <span class="nt">&#34;customUrl&#34;</span><span class="p">:</span> <span class="s2">&#34;https://raw.githubusercontent.com/UserName/RepoName/master&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">             <span class="nt">&#34;branch&#34;</span><span class="p">:</span> <span class="s2">&#34;master&#34;</span>
</span></span><span class="line"><span class="cl">           <span class="p">},</span>
</span></span><span class="line"><span class="cl">           <span class="nt">&#34;current&#34;</span><span class="p">:</span> <span class="s2">&#34;github&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">           <span class="nt">&#34;uploader&#34;</span><span class="p">:</span> <span class="s2">&#34;github&#34;</span>
</span></span><span class="line"><span class="cl">         <span class="p">},</span>
</span></span><span class="line"><span class="cl">         <span class="nt">&#34;picgoPlugins&#34;</span><span class="p">:</span> <span class="p">{}</span>
</span></span><span class="line"><span class="cl">   <span class="p">}</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><ol start="5">
<li>点击验证图片上传选项，进行测试，成功即可</li>
</ol>
<h3 id="存在问题">存在问题</h3>
<p>用Github做图床的话，上传不是十分的稳定（可能需要依赖科学上网技术。请八仙过海，各显神通）。可以用其他的服务器作图床，大体过程应该也差不多，后续个人有更换的话在进行补充。</p>
<ol>
<li>在其他的pc上可以使用相同的token进行复用，但是在进行测试的时候要记得将repo中的两张测试图片删除，不然可能会导致验证失败的问题。</li>
</ol>
<h2 id="picgo-with-obsidian-etc">PicGo With Obsidian etc.</h2>
<p>这种方法可能是最稳健的泛化能力也最强，再很多编辑器类似的地方都能用，但是前提就是我们进行笔记撰写的时候要把picgo的客户端打开。</p>
<ol>
<li>安装<code>picgo</code>客户端，（在其中安装你对应图床的插件）</li>
</ol>
<p>
<div class="post-img-view">
  <a data-fancybox="gallery" href="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/imgs/3070imgs/20211227165330.png">
    <img alt="gitee" loading="lazy" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/imgs/3070imgs/20211227165330.png"class="responsive-image" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/imgs/3070imgs/20211227165330.png" style="display: block; margin: 0 auto;"
      alt="gitee"  />
  </a>
</div>


<script>
  document.addEventListener("DOMContentLoaded", function() {
      var images = document.querySelectorAll(".responsive-image");
      var maxHeight = window.innerHeight / 2.5;
      images.forEach(function(image) {
          image.style.maxHeight = maxHeight + "px";
      });
  });
</script>
</p>
<ol start="2">
<li>和上述描述的一样再gitee或者github中设置相应的图床token等，并在软件中填写对应的token</li>
<li>picgo设置中，打开server即可</li>
<li>再Obsidian中安装插件 <code>image auto upload plugin</code> 并在其中设置本地<code>ip:port</code>即可</li>
</ol>
<h2 id="cos-in-tencent-cloud">COS in tencent-cloud</h2>
<p>相关网站：<a href="https://console.cloud.tencent.com/cos" target="_blank" rel="noopener">Tencent-Cloud-Cos</a>

参考资料：<a href="https://sspai.com/post/64169" target="_blank" rel="noopener">Create-Tencent-Cloud-Cos</a>
, <a href="https://jy741.github.io/2020/05/14/%E8%85%BE%E8%AE%AF%E4%BA%91%E5%9B%BE%E5%BA%8A/" target="_blank" rel="noopener">Setting-Your-PicGoApp</a>
</p>
<h3 id="创建存储桶">创建存储桶</h3>
<ol>
<li>
<p>Create Store-Bucket(Private write Public read) -&gt;</p>
</li>
<li>
<p>Create A sub-User(which only got access for the cos R/W) -&gt;</p>
<blockquote>
<p>QcloudCOSFullAccess, Pic Below to add the access</p>
</blockquote>
</li>
<li>
<p>generate a private_token -&gt;</p>
<blockquote>
<p>token manage</p>
</blockquote>
</li>
<li>
<p>cp SecretID,SecretKey,Main_Account_ID,name_of_bucket to PicGo</p>
<blockquote>
<p>the area in the second figure</p>
</blockquote>
</li>
</ol>
<p>
<div class="post-img-view">
  <a data-fancybox="gallery" href="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/imgs/20220327174117.png">
    <img loading="lazy" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/imgs/20220327174117.png"class="responsive-image" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/imgs/20220327174117.png" style="display: block; margin: 0 auto;"
      alt=""  />
  </a>
</div>


<script>
  document.addEventListener("DOMContentLoaded", function() {
      var images = document.querySelectorAll(".responsive-image");
      var maxHeight = window.innerHeight / 2.5;
      images.forEach(function(image) {
          image.style.maxHeight = maxHeight + "px";
      });
  });
</script>


<div class="post-img-view">
  <a data-fancybox="gallery" href="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/imgs/20220327174402.png">
    <img loading="lazy" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/imgs/20220327174402.png"class="responsive-image" src="https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/imgs/20220327174402.png" style="display: block; margin: 0 auto;"
      alt=""  />
  </a>
</div>


<script>
  document.addEventListener("DOMContentLoaded", function() {
      var images = document.querySelectorAll(".responsive-image");
      var maxHeight = window.innerHeight / 2.5;
      images.forEach(function(image) {
          image.style.maxHeight = maxHeight + "px";
      });
  });
</script>
</p>
<h3 id="picgo-设置">Picgo 设置</h3>
<ul>
<li>进入腾讯云的对象存储页面：
<ul>
<li>存储桶列表中可以看到存储桶名称，即Bucket</li>
<li>所属地域，也就是设定存储区域如：ap-guangzhou</li>
</ul>
</li>
<li>右上角的用户信息中点击访问管理进入到用户界面
<ul>
<li>用户-&gt; 子用户可以看到账号 ID：即Appid</li>
<li>点击子账户进入详情页-&gt;API 密钥
<ul>
<li>SecretId</li>
<li>SecretKey</li>
</ul>
</li>
</ul>
</li>
<li>设置完成即可。</li>
</ul>
<h2 id="gitee防盗链事件后抛弃">Gitee（防盗链事件后抛弃）</h2>
<p>因为gitee是国内的github，服务器比较稳定，所以我们也可以使用gitee作为我们更为稳定的图床；</p>
<p>两个链接合起来才是好用的，都有一些冗余：</p>
<ul>
<li><a href="https://zhuanlan.zhihu.com/p/145960692" target="_blank" rel="noopener">Typora+picgo-core+gitee</a>
</li>
<li><a href="https://blog.csdn.net/weixin_42230956/article/details/111349889" target="_blank" rel="noopener">PicGo-core+Gitee+Typora</a>
</li>
</ul>
<h3 id="gitee基本部署">gitee基本部署</h3>
<ul>
<li>
<p>安装Node，npm；</p>
</li>
<li>
<p>安装picgo-core的命令行命令：</p>
</li>
</ul>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>shell</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">  npm install picgo -g</span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><ul>
<li>安装gitee的插件：</li>
</ul>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>shell</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">  picgo install super-prefix
</span></span><span class="line"><span class="cl">  picgo install gitee-uploader</span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><h3 id="配置gitee-repo">配置Gitee Repo</h3>
<ul>
<li>
<p>初始化一个repo，保存URL中的User/repo，不要轻信标题，因为有昵称机制。</p>
</li>
<li>
<p>在个人资料中初始化个人的Token，勾选<code>projects</code>选项即可;</p>
</li>
</ul>
<h3 id="设置配置文件">设置配置文件</h3>
<p>基于picgo的命令，会自动的更新Json文件，我们不许需要</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>shell</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">picgo <span class="nb">set</span> uploader
</span></span><span class="line"><span class="cl"><span class="c1"># up to the command hint, we input those messages</span>
</span></span><span class="line"><span class="cl">1.按上下键找到gitee，回车    
</span></span><span class="line"><span class="cl">2.repo：用户名/仓库名 （打开自己的仓库，浏览器里的网址username/reponame）    
</span></span><span class="line"><span class="cl">3.token：刚才生成的token    
</span></span><span class="line"><span class="cl">4.path:路径，写仓库的名字就是reponame    
</span></span><span class="line"><span class="cl">5.custompath:不用填，回车   
</span></span><span class="line"><span class="cl">6.customURL:不用填，回车    
</span></span><span class="line"><span class="cl"><span class="c1"># finish setting process</span>
</span></span><span class="line"><span class="cl">picgo use uploader</span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script>]]></content:encoded>
    </item>
    <item>
      <title>基于 Gitbook 发布笔记</title>
      <link>https://aikenh.cn/posts/gitbook/</link>
      <pubDate>Sun, 26 Sep 2021 15:36:25 +0000</pubDate>
      <guid>https://aikenh.cn/posts/gitbook/</guid>
      <description>Build your Gitbook</description>
      <content:encoded><![CDATA[<p>Gitbook命令行工具，基于Markdown编写文档，后续基于Github发布该Blog</p>
<p>笔记的构建流程：</p>
<h2 id="chapter1-install">Chapter1 Install</h2>
<p>安装<code>Gitbook</code>之前我们需要安装<code>node.js</code>和<code>npm</code>的依赖，使用<code>npm</code>安装<code>gitbook</code></p>
<ul>
<li>
<p>首先安装Install Nodejs，Npm</p>
<p>Windows：<a href="https://nodejs.org/zh-cn/download/" target="_blank" rel="noopener">Node.js (nodejs.org)</a>
</p>
<p>Linux:</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>bash</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># add &amp; update apt source before install nodejs.</span>
</span></span><span class="line"><span class="cl">curl -sL https://deb.nodesource.com/setup_14.x <span class="p">|</span> sudo -E bash -
</span></span><span class="line"><span class="cl">sudo apt-get update
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># install nodejs after that.</span>
</span></span><span class="line"><span class="cl">sudo apt-get install -y nodejs</span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script></li>
<li>
<p>然后安装gitbook</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>bash</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">npm install gitbook-cli -g 
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">gitbook fetch beta <span class="c1"># 安装历史版本</span>
</span></span><span class="line"><span class="cl">gitbook ls-remote <span class="c1"># 列举可以下载的版本</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script></li>
<li>
<p>检查Gitbook版本</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>bash</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">gitbook -V</span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script></li>
</ul>
<h3 id="安装gitbook插件">安装Gitbook插件</h3>
<p>安装插件主要有两种方式：一种是直接通过book和gitbook的安装来实现，另一种是基于Npm预先安装</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>bash</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">npm install gitbook-plugin-PACKAGE</span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>基于<strong>book</strong>的安装方式</p>
<p>插件和相关的配置在<code>book.json</code>中指定，关键词<code>plugins</code> &amp; <code>pluginsConfig</code>为对应的插件的配置信息</p>
<p>添加插件通过修改<code>book.json</code>如下：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>json</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="nt">&#34;plugins&#34;</span><span class="p">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;-summary&#34;</span><span class="p">,</span><span class="s2">&#34;-katex&#34;</span><span class="p">,</span><span class="s2">&#34;mathjax-pro&#34;</span><span class="p">,</span><span class="s2">&#34;anchor-navigation-ex-toc&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;search-plus&#34;</span><span class="p">,</span><span class="s2">&#34;-lunr&#34;</span><span class="p">,</span><span class="s2">&#34;-search&#34;</span><span class="p">,</span><span class="s2">&#34;splitter&#34;</span><span class="p">,</span><span class="s2">&#34;copy-code-button&#34;</span><span class="p">,</span><span class="s2">&#34;github&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;theme-comscore&#34;</span><span class="p">,</span><span class="s2">&#34;-latex-codecogs&#34;</span><span class="p">,</span><span class="s2">&#34;tbfed-pagefooter&#34;</span><span class="p">,</span><span class="s2">&#34;-expandable-chapters-small&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;-edit-link-plus&#34;</span><span class="p">,</span><span class="s2">&#34;expandable-chapters&#34;</span><span class="p">,</span><span class="s2">&#34;pageview-count&#34;</span><span class="p">,</span><span class="s2">&#34;-editlink&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;lightbox&#34;</span><span class="p">,</span><span class="s2">&#34;-highlight&#34;</span><span class="p">,</span><span class="s2">&#34;prism&#34;</span><span class="p">,</span><span class="s2">&#34;disqus&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="p">],</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>添加完新的插件配置之后，运行<code>gitbook install ./</code>来安装新的插件</p>
<p><a href="https://www.npmjs.com/package/gitbook-plugin-mathjax-pro" target="_blank" rel="noopener">gitbook-plugin-mathjax-pro - npm (npmjs.com)</a>
；<a href="https://github.com/PrismJS/prism-themes" target="_blank" rel="noopener">PrismJS/prism-themes: A wider selection of Prism themes (github.com)</a>
</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>bash</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># gitbook-plugin-mathjax-pro 安装方式</span>
</span></span><span class="line"><span class="cl">npm install mathjax@2.7.7
</span></span><span class="line"><span class="cl">npm install gitbook-plugin-mathjax-pro
</span></span><span class="line"><span class="cl"><span class="c1"># and editor the book.json as below</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>json</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;author&#34;</span><span class="p">:</span> <span class="s2">&#34;AikenHong&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;title&#34;</span><span class="p">:</span> <span class="s2">&#34;Aiken&#39;s Blogs&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;language&#34;</span><span class="p">:</span> <span class="s2">&#34;zh-hans&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;plugins&#34;</span><span class="p">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;-summary&#34;</span><span class="p">,</span><span class="s2">&#34;-katex&#34;</span><span class="p">,</span><span class="s2">&#34;mathjax-pro&#34;</span><span class="p">,</span><span class="s2">&#34;anchor-navigation-ex-toc&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;search-plus&#34;</span><span class="p">,</span><span class="s2">&#34;-lunr&#34;</span><span class="p">,</span><span class="s2">&#34;-search&#34;</span><span class="p">,</span><span class="s2">&#34;splitter&#34;</span><span class="p">,</span><span class="s2">&#34;copy-code-button&#34;</span><span class="p">,</span><span class="s2">&#34;github&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;theme-comscore&#34;</span><span class="p">,</span><span class="s2">&#34;-latex-codecogs&#34;</span><span class="p">,</span><span class="s2">&#34;tbfed-pagefooter&#34;</span><span class="p">,</span><span class="s2">&#34;-expandable-chapters-small&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;-edit-link-plus&#34;</span><span class="p">,</span><span class="s2">&#34;expandable-chapters&#34;</span><span class="p">,</span><span class="s2">&#34;pageview-count&#34;</span><span class="p">,</span><span class="s2">&#34;-editlink&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;lightbox&#34;</span><span class="p">,</span><span class="s2">&#34;-highlight&#34;</span><span class="p">,</span><span class="s2">&#34;prism&#34;</span><span class="p">,</span><span class="s2">&#34;disqus&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="p">],</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;pluginsConfig&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;insert-logo&#34;</span><span class="p">:{</span>
</span></span><span class="line"><span class="cl">            <span class="nt">&#34;url&#34;</span><span class="p">:</span> <span class="s2">&#34;https://picture-bed-001-1310572365.cos.ap-guangzhou.myqcloud.com/imgs/img/20210927180958.png&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">            <span class="nt">&#34;style&#34;</span><span class="p">:</span> <span class="s2">&#34;background: none; max-height: 120px; min-height: 120px&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="p">},</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;github&#34;</span><span class="p">:{</span>
</span></span><span class="line"><span class="cl">            <span class="nt">&#34;url&#34;</span><span class="p">:</span> <span class="s2">&#34;https://aikenh.github.io/about/&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="p">},</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;tbfed-pagefooter&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="nt">&#34;copyright&#34;</span><span class="p">:</span><span class="s2">&#34;&amp;copy AikenHong&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">            <span class="nt">&#34;modify_label&#34;</span><span class="p">:</span> <span class="s2">&#34;该文件修订时间：&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">            <span class="nt">&#34;modify_format&#34;</span><span class="p">:</span> <span class="s2">&#34;YYYY-MM-DD HH:mm:ss&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="p">},</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;mathjax-pro&#34;</span><span class="p">:{</span>
</span></span><span class="line"><span class="cl">            <span class="nt">&#34;version&#34;</span><span class="p">:</span> <span class="s2">&#34;2.7.7&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="p">},</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;prism&#34;</span><span class="p">:{</span>
</span></span><span class="line"><span class="cl">            <span class="nt">&#34;css&#34;</span><span class="p">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">                <span class="s2">&#34;prismjs/themes/prism-tomorrow.css&#34;</span>
</span></span><span class="line"><span class="cl">            <span class="p">],</span>
</span></span><span class="line"><span class="cl">            <span class="nt">&#34;lang&#34;</span><span class="p">:{</span>
</span></span><span class="line"><span class="cl">                <span class="nt">&#34;flow&#34;</span><span class="p">:</span> <span class="s2">&#34;typescript&#34;</span>
</span></span><span class="line"><span class="cl">            <span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="p">},</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;disqus&#34;</span><span class="p">:{</span>
</span></span><span class="line"><span class="cl">            <span class="nt">&#34;shortName&#34;</span><span class="p">:</span> <span class="s2">&#34;aikensdoc&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">        
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>安装Disqus的时候，要到Disqus官网进行账号注册，并安装个人评论的网站，记录唯一的个人标识符，然后再配置中引入即可；</p>
<p>使用prism代替</p>
<h2 id="chapter2-configure">Chapter2 Configure</h2>
<p><code>gitbook init</code>会初始化文件目录，文件夹会包含如下的结构：目录中的文件对应有如下的作用</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>bash</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">.
</span></span><span class="line"><span class="cl">├── _book         <span class="c1"># 自动生成的html</span>
</span></span><span class="line"><span class="cl">├── book.json     <span class="c1"># 配置文件</span>
</span></span><span class="line"><span class="cl">├── README.md     <span class="c1"># 电子书的前言或者简介</span>
</span></span><span class="line"><span class="cl">├── SUMMARY.md    <span class="c1"># 电子书的目录</span>
</span></span><span class="line"><span class="cl">├── chapter-1/
</span></span><span class="line"><span class="cl"><span class="p">|</span>   ├── README.md <span class="c1"># 章节的描述</span>
</span></span><span class="line"><span class="cl"><span class="p">|</span>   └── something.md
</span></span><span class="line"><span class="cl">└── chapter-2/ 
</span></span><span class="line"><span class="cl">    ├── README.md <span class="c1"># 章节的描述</span>
</span></span><span class="line"><span class="cl">    └── something.md</span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>编辑对应的<code>SUMMARY</code>同时可以按照文件夹结构进行组织，基本的组织结构可以按照下面的来进行部署</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>markdown</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl"><span class="gh"># 概要
</span></span></span><span class="line"><span class="cl"><span class="gh"></span>
</span></span><span class="line"><span class="cl"><span class="k">*</span> [<span class="nt">卷 I</span>](<span class="na">part1/README.md</span>)
</span></span><span class="line"><span class="cl">    <span class="k">*</span> [<span class="nt">写作很棒</span>](<span class="na">part1/writing.md</span>)
</span></span><span class="line"><span class="cl">    <span class="k">*</span> [<span class="nt">GitBook很酷</span>](<span class="na">part1/gitbook.md</span>)
</span></span><span class="line"><span class="cl">  
</span></span><span class="line"><span class="cl"><span class="k">*</span> [<span class="nt">卷 II</span>](<span class="na">part2/README.md</span>)
</span></span><span class="line"><span class="cl">    <span class="k">*</span> [<span class="nt">期待反馈</span>](<span class="na">part2/feedback_please.md</span>)
</span></span><span class="line"><span class="cl">    * [<span class="nt">更好的写作工具</span>](<span class="na">part2/better_tools.md</span>)</span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><h2 id="chapter3-deploy">Chapter3 Deploy</h2>
<p>在本地部署和运行一个样本书，设置gitbook的配置文件</p>
<h3 id="初始化">初始化</h3>
<p>将书籍创建到当前的目录或者指定的目录中</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>bash</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">gitbook init
</span></span><span class="line"><span class="cl">gitbook init ./directory <span class="c1"># 在指定的目录中生成</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><h3 id="构建">构建</h3>
<p>使用下面的命令会在当前目录下或者指定目录里生成<code>_book</code>目录，里面的内容是静态站点的资源文件：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>bash</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">gitbook build</span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><h3 id="debugging">Debugging</h3>
<p>您可以使用选项 <code>--log=debug</code> 和 <code>--debug</code> 来获取更好的错误消息（使用堆栈跟踪）。例如：</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>bash</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">gitbook build ./ --log<span class="o">=</span>debug --debug</span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><h3 id="启动服务">启动服务</h3>
<p>使用下列服务在<a href="http://localhost:4000/" target="_blank" rel="noopener">LocalHost</a>
可以预览我们的的本地书籍</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>bash</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">gitbook serve</span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><h2 id="chapter4-publish">Chapter4 Publish</h2>
<p>希望可以不借助<code>gitbook</code>服务来可视化界面，全靠<code>git</code> &amp; <code>cmd</code> &amp; <code>github</code>来进行一系列操作，这样就能通过我的<code>onedrive</code>来进行比较好的统一管理</p>
<h3 id="托管到github-pages">托管到Github Pages</h3>
<p>optional: 创建username.github.io的个人repo,可以通过<a href="https://github.com/AikenH/aikenh.github.io" target="_blank" rel="noopener">jekyll</a>
来init该githubpage</p>
<ul>
<li>创建note&rsquo;s repo, 用来存储自己的所有Liture</li>
<li>调用<code>gitbook serve</code>之后将<code>_book</code>的文件推送到repo的gh-pages分支</li>
<li>就可以在下列的url中看到自己的文档：aikenh.github.io/REPONAME/</li>
<li>修改io文件夹中的_layout中的Default.html如下
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>html</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;https://aikenh.github.io/Docs/&#34;</span><span class="p">&gt;</span>Blog<span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script></li>
</ul>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>bash</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># enter the right dir</span>
</span></span><span class="line"><span class="cl"><span class="c1"># we need to excute gitbook serve int terminal first</span>
</span></span><span class="line"><span class="cl"><span class="nb">cd</span> _book
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># using condtional rules to control the update actions</span>
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="o">[</span> -d <span class="s2">&#34;.git&#34;</span> <span class="o">]</span><span class="p">;</span><span class="k">then</span>
</span></span><span class="line"><span class="cl">  <span class="nb">echo</span> <span class="s2">&#34;exist git files&#34;</span>
</span></span><span class="line"><span class="cl"><span class="k">else</span>
</span></span><span class="line"><span class="cl">  git init
</span></span><span class="line"><span class="cl"><span class="k">fi</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># update those blogs using git</span>
</span></span><span class="line"><span class="cl">git add . 
</span></span><span class="line"><span class="cl">git commit -m <span class="s2">&#34;update those blogs&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;update the local git log&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># push the update to the remote repo</span>
</span></span><span class="line"><span class="cl">git remote add origin git@github.com:AikenH/Docs.git
</span></span><span class="line"><span class="cl">git push -f origin master:gh-pages
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;finish pushing files&#34;</span></span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><h2 id="reference">Reference</h2>
<ul>
<li><a href="https://chrisniael.gitbooks.io/gitbook-documentation/content/github/index.html" target="_blank" rel="noopener">集成GitHub | GitBook文档（中文版） (gitbooks.io)</a>
</li>
<li><a href="https://www.cnblogs.com/mingyue5826/p/10307051.html#11-%e5%85%a8%e5%b1%80%e9%85%8d%e7%bd%ae" target="_blank" rel="noopener">GitBook插件整理 - book.json配置</a>
</li>
<li><a href="https://dunwu.gitbooks.io/gitbook-notes/content/GLOSSARY.html" target="_blank" rel="noopener">gitbook-notes (gitbooks.io)</a>
</li>
<li><a href="https://blog.cugxuan.cn/2018/12/03/Markdown/How-to-use-gitbook-elegantly/" target="_blank" rel="noopener">内含github部署资料</a>
</li>
<li><a href="https://pandao.github.io/editor.md/examples/katex.html" target="_blank" rel="noopener">Katex 测试验证</a>
</li>
<li><a href="https://github.com/julianxhokaxhiu/gitbook-plugin-summary#readme" target="_blank" rel="noopener">Gitbook-plugin-summary</a>
</li>
<li><a href="https://www.cnblogs.com/zhangjk1993/p/5066771.html#_label2_2" target="_blank" rel="noopener">实用配置及插件介绍</a>
</li>
<li><a href="https://www.cnblogs.com/snowdreams1006/p/10680684.html" target="_blank" rel="noopener">gitbook 入门教程之主题插件</a>
</li>
<li><a href="https://szdastone.github.io/posts/2019/01/4dd0f083.html" target="_blank" rel="noopener">Gitbook插件和主题</a>
</li>
<li><a href="https://www.jianshu.com/p/53fccf623f1c" target="_blank" rel="noopener">GitBook相关配置及优化</a>
</li>
<li><a href="https://www.cnblogs.com/phyger/p/14035937.html#Github_Pages_629" target="_blank" rel="noopener">打造完美写作系统：Gitbook+Github Pages+Github Actions - phyger - 博客园 (cnblogs.com)</a>
</li>
<li><a href="http://gitbook.zhangjikai.com/plugins.html#prsim" target="_blank" rel="noopener">插件</a>
</li>
</ul>
]]></content:encoded>
    </item>
  </channel>
</rss>
