Hugo主题定制

  Hugo主题繁多,使用主题模板必然会有一些地方是需要修改的,以本站主题Hyde为例,记录一下本渣定制主题的过程。


主题颜色

八种主题颜色

  根据官方文档,要改变主题颜色,只需要在根目录 config.toml 中的 params 下增加 themeColor 属性即可。   例如我想使用青色 0c 主题:

[params]
  themeColor = "theme-base-0c"

页面描述

sidebar

  很显然,sidebar中红框内的内容是我们希望更改的。

  查看根部录 layouts 下的文件,简单阅读就能找到更改页面内容的途径。

  在 sidebar.html

<div class="sidebar-about">
    <a href="{{ .Site.BaseURL }}"><h1>{{ .Site.Title }}</h1></a>
    <p class="lead">
    {{ with .Site.Params.description }} {{.}} {{ else }}An elegant open source and mobile first theme for <a href="http://hugo.spf13.com">hugo</a> made by <a href="http://twitter.com/mdo">@mdo</a>. Originally made for Jekyll.{{end}}
    </p>
</div>

  显然其中的Title、description(以及贴上代码段中没有的copyright等)就是我们希望更改的内容。

  同样,在根目录 config.toml 中的 params 下增加相关属性即可。   例如:

title = "Teza小站"

[params]
  description = "无名小站,始于2020-7-14,记录某大学仔学习历程。"
  copyright = "Copyright (c) 2020, Guanda Wei"

首页博客列表描述

  博客列表默认显示文章的所有内容,当文章内容过长时看上去就很不舒服,而且会直接输出.md文件的源码内容,就像这样 ↓

content

  查看 index.html ,可以看到控制这段文字输出的是以下部分

  {{ .Summary }}

  于是在.md头部补上Summary(这一点其实并不算是定制主题的一部分,只是自己在写博客时发现的一点小问题,所以一并写上)

Summary: "Hugo主题繁多,使用主题模板必然会有一些地方是需要修改的,以本站主题Hyde为例,记录本渣定制主题的过程。"

  效果如下 👇

summary

  另外时间的格式时偏向西方,我个人而言肯定还是习惯于阅读年-月-日这样格式的时间。继续修改 index.html 中的内容:

{{ .Date.Format "2006-1-2" }}

  效果如下 👇

time

代码高亮

  作为秃头计算机生,代码没有高亮显然是不能忍的。

codenohighlight

  网上查阅资料权衡后,选择 HighLight.js 来作为小站代码高亮工具。

  在 head_fonts.html 中引入 css,在 hook_head_end.html 中引入 js,实现代码高亮效果。

head_fonts.html:

  <!-- 代码高亮 -->
  <link href="https://cdn.bootcdn.net/ajax/libs/highlight.js/10.1.1/styles/atom-one-dark-reasonable.min.css" rel="stylesheet">
hook_head_end.html:

  <!-- 代码高亮 -->
  <script src="https://cdn.bootcdn.net/ajax/libs/highlight.js/10.1.1/highlight.min.js"></script>
  <script>hljs.initHighlightingOnLoad();</script>

  至此,基本定制工作完成!~ 😏


2022-3-31更新

Mermaid 支持

mermaid语法官方文档

mermaid官方github

首先,官方的渲染是通过<div class="mermaid"></div>标签将 div 中的内容渲染成图表的。然而咱们在 typora 中写 mermaid 的方式则是通过代码块来实现,如下:

```mermaid
graph TD;
    A-->B;
    A-->C;
    B-->D;
```

hugo 在渲染代码块时,是将其渲染为以下 html:

<pre><code class="language-语言种类">
    <!-- code -->
</code></pre>

所以咱们的核心思路即是:如何将<pre><code class="language-mermaid"></code></code>替换为<div class="mermaid"></div>。本人并不太懂 js 代码,直接搬运了大佬的实现(原文放在下面的参考文档中了)。

<!-- mermaid JS 导入 -->
<script src="https://cdn.bootcdn.net/ajax/libs/mermaid/8.14.0/mermaid.min.js"></script>
<script>
    // Replace mermaid pre.code to div
    Array.from(document.getElementsByClassName("language-mermaid")).forEach(
        (el) => {
            el.parentElement.outerHTML = `<div class="mermaid">${el.innerText}</div>`;
        }
    );
    mermaid.initialize({ startOnLoad: true });
</script>



<!-- 别忘了把渲染出的svg居中显示 -->
<style>
  svg {
    display: block;
    margin: auto;
  }
</style>

需要注意的是,核心的代码需要放在页面最下方(最好是放在<body>标签的最后),这样才能正常把所有的<pre><code class="language-mermaid"></code></code>替换为<div class="mermaid"></div>,如下图:

image-20220331143902523

由于我用的 hyde 主题默认是没有在 body 后的模版的,所以就自己小改一下代码吧~

  1. themes>hyde>layouts>_default>baseof.html(正如其名字,这是 hyde 的页面基础架构模版)的<body>最后声明要添加一个模版文件 body_end.html

    {{ partial "head.html" . }}
    
    <body class="{{ .Site.Params.themeColor }} {{if .Site.Params.layoutReverse}}layout-reverse{{end}}">
      {{ partial "sidebar.html" . }}
      <main class="content container">
        {{ block "main" . -}}{{- end }}
      </main>
    
      {{ if not .Site.IsServer }}
      {{ template "_internal/google_analytics.html" . }}
      {{ end }}
    
      <!-- 新增的代码 -->
      {{ partial "body_end.html" . }}
    </body>
    
    </html>
    
  2. themes>hyde>layouts>partials>body_end.html(新建)内写上引入 mermaid 支持的代码。

    <!-- mermaid JS -->
    <script src="https://cdn.bootcdn.net/ajax/libs/mermaid/8.14.0/mermaid.min.js"></script>
    <script>
        // Replace mermaid pre.code to div
        Array.from(document.getElementsByClassName("language-mermaid")).forEach(
            (el) => {
                el.parentElement.outerHTML = `<div class="mermaid">${el.innerText}</div>`;
            }
        );
        mermaid.initialize({ startOnLoad: true });
    </script>
    
  3. themes>hyde>layouts>partials>head_fonts.html 内修改生成的 svg 标签的样式。

    <style>
      svg {
        display: block;
        margin: auto;
      }
    </style>
    
  4. 最终效果⬇️

graph TD;
    A-->B;
    A-->C;
    B-->D;

参考文档:

使用Mermaid在hugo的Markdown中绘制UML

俺如何为 hugo-theme-even 提供 mermaid 支持