<?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>Hugo on aiken&#39;s blog</title>
    <link>https://aikenh.cn/tags/hugo/</link>
    <description>Recent content in Hugo 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/hugo/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>
  </channel>
</rss>
