惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

N
Netflix TechBlog - Medium
罗磊的独立博客
云风的 BLOG
云风的 BLOG
Last Week in AI
Last Week in AI
Y
Y Combinator Blog
小众软件
小众软件
Blog — PlanetScale
Blog — PlanetScale
T
The Blog of Author Tim Ferriss
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
月光博客
月光博客
博客园 - Franky
F
Fortinet All Blogs
D
Docker
博客园 - 司徒正美
腾讯CDC
Recent Announcements
Recent Announcements
The Cloudflare Blog
B
Blog RSS Feed
GbyAI
GbyAI
T
Tailwind CSS Blog
雷峰网
雷峰网
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
博客园 - 三生石上(FineUI控件)
阮一峰的网络日志
阮一峰的网络日志

Dejavu's Blog

甲骨文 ARM 实例部署 Gemma 4 模型 Headscale + Tailscale 组建虚拟专用网 在 Linux 上使用 Yubikey OpenPGP 应用 BuyVM VPS 块存储挂载教程 Alpine Linux 服务器配置指南 Alpine Linux 安装 Cloudflared Docker 多容器共享中心数据库 安装 Komari 服务器监控工具 Scaleway VPS 安装 Debian Linux Debian 13 下部署 AsmBB 论坛 使用 Kopia 自动化备份服务器数据 给 Docker 启用 IPv6 支持 Netcup 服务器安装自定义 ISO 镜像 烽火 HG5582A 光猫开启桥接模式 Docker 自托管 Shlink 短链服务 部署 Obsidian LiveSync 实时同步服务指南 我的 2025 年不完全回顾 Linux 下 Intel 核显驱动配置与硬件加速 Fedora Linux 安装配置记录 2025 年优雅地自托管 RSS 服务 Woodpecker CI 和 Gitea 实现 Hugo 自动部署 Gitea/Forgejo 集成 Woodpecker CI/CD 在 Blinko 中使用 Ollama 作为 AI 供应商 Docker 部署 Gitea/Forgejo Plausible CE 启用城市级地理位置识别 Blinko 开源 AI 知识库 Docker 部署指南 Netcup 免税账号注册及购买服务器全记录 Docker 自托管 Cloudreve Pro 私有网盘服务 GiffGaff SIM 卡使用体验和注意事项 简体中文互联网在变得糟糕吗?
写一个 Hugo 短代码将不同类别的总字数统计转换为书名显示
Dejavu Moe · 2023-06-13 · via Dejavu's Blog

前言

最近看到不少博主都在用一种很新的方式来展示站点的总字数:将全站总字数换算成对应书籍的篇幅来显示,我也想整一个。

对于 Hugo 静态博客,可以使用短代码的形式来实现这个小功能。此外,我的站点主要内容有两个大的分类:

  1. 文章 /content/posts/
  2. 周刊 /content/weekly/

后面我们调用短代码的时候传递一个参数即可实现对不同类别的统计,就像这样:

下文中的 \\ 用于转义 Hugo 短代码,使用时请把它去掉。

{{\\< wordCount "posts" >\\}}
{{\\< wordCount "weekly" >\\}}
{{\\< wordCount "all" >\\}}
  • 传递参数 posts 统计所有文章的字数
  • 传递参数 weekly 统计所有周刊的字数
  • 传递参数 all 统计全站总字数

实现

进入 Hugo 站点根目录,新建短代码:layouts/shortcodes/wordCount.html,参考 How to Calculate Global Word Count for a Hugo Static Site ,看下 Hugo 全站总字数统计的实现:

{{ $scratch := newScratch }}
{{ range (where .Site.RegularPages "Type" "in" (slice "blog")) }}
{{ $scratch.Add "wordcount" .WordCount }}
{{ end }}

{{ $scratch.Get "wordcount" | lang.NumFmt 0 }}

上面使用了 Hugo 内置的 .Scratch 函数 暂存 被操作的数据,遍历统计 blog 类别下的字数,最后将相加后的总字数格式化输出。

对于我的两个类别,可以根据输入的参数进行条件输出,我们还可以知道:全站总字数 = 所有文章字数 + 所有周刊字数:

{{ $scratch := newScratch }}
{{ if eq (.Get 0) "posts" }}
  {{ range (where .Site.RegularPages "Type" "in" "posts") }}
    {{ $scratch.Add "wordcount" .WordCount }}
  {{ end }}
{{ else if eq (.Get 0) "weekly" }}
  {{ range (where .Site.RegularPages "Type" "in" "weekly") }}
    {{ $scratch.Add "wordcount" .WordCount }}
  {{ end }}
{{ else if eq (.Get 0) "all" }}
  {{ range (where .Site.RegularPages "Type" "in" (slice "posts" "weekly")) }}
    {{ $scratch.Add "wordcount" .WordCount }}
  {{ end }}
{{ end }}
{{ $scratch.Get "wordcount" | lang.NumFmt 0 }} 

上面完成了统计各个类别的总字数功能,得到了输出的总字数,现在就可以使用条件语句匹配不同篇幅的书名并输出:

{{ $wordcount := $scratch.Get "wordcount" }}
{{ $output := "" }}
{{ if ge $wordcount 1000000 }} 
  {{ $output = "《战争与和平》" }}
{{ else if ge $wordcount 850000 }} 
  {{ $output = "《应物兄》" }}
{{ else if ge $wordcount 80000 }} 
  {{ $output = "《呐喊》" }}
{{ else if ge $wordcount 50000 }} 
  {{ $output = "《小王子》" }}
{{ else if gt $wordcount 4000 }} 
  {{ $output = "《断魂枪》" }}
{{ end }}
相当于一本 {{ $output }}

这个短代码就完成了。

使用

在想要插入字数统计的地方插入短代码,比如:

  1. 文章总字数

    所有文章加起来约 {{\\< wordCount "posts" >\\}}
    

    效果如下:

    统计文章总字数

  2. 周刊总字数

    Hacker News 周刊加起来约 {{\\< wordCount "weekly" >\\}}
    

    效果:

    统计周刊总字数

  3. 全站总字数

    Hacker News 周刊加起来约 {{\\< wordCount "all" >\\}}
    

    效果:

    统计全站总字数

  4. 关于页面

    - 文章写了约 {{\\< wordCount "posts" >\\}}
    - 周刊写了约 {{\\< wordCount "weekly" >\\}}
    - 全站共写了约 {{\\< wordCount "all" >\\}}
    

    效果:

    关于页面

完成,请享受。🫣