メインコンテンツへスキップ

日本語基準で記事の推定読了時間を計算するBlowfishテーマ用コード

目次
日本語の文字数基準で記事の推定読了時間を表示するBlowfishテーマ向けのコード例です。コードブロックの重み補正も可能です。

Hugoで記事を読むのにかかる時間を日本語基準で推定するためのコードです。
このコードはBlowfishテーマでそのまま使用できます。

技術ブログの場合、文字数だけで読む時間を正確に推定するのは難しいです。
コード量や内容の複雑さによって、同じ文字数でも読み終わる時間に差が出るためです。
そのため、今は推定読了時間を表示していません。

環境
#

  • Windows 11
  • Git Bash
  • Hugo v0.150.0
  • Blowfish v2.90.0

パーシャルテンプレートの編集
#

テーマ内のパーシャルテンプレートをプロジェクト側にコピーします。

Bash
cp themes/blowfish/layouts/partials/meta/reading-time.html layouts/partials/meta/reading-time.html

コピーしたファイルを次のように書き換えます。

layouts/partials/meta/reading-time.html
{{- /* https://4nm1tsu.com/posts/wpermw2/ */ -}}

{{- /* 設定値 */ -}}
{{- $runesPerMinute := default 500.0 $.Site.Params.readingTime.runesPerMinute -}}
{{- $codeBlockWeight := default 0.2 $.Site.Params.readingTime.codeBlockWeight -}}

{{- /* コードブロックとそれ以外の長さを取得 */ -}}
{{- $pattern := "(?s)```.*?```[\r\n]+" -}}
{{- $codeBlock := findRE $pattern .RawContent -}}
{{- $trimmedLength := countrunes (replaceRE $pattern "" .RawContent) -}}
{{- $codeBlockLength := 0 -}}
{{- range $codeBlock -}}
  {{- $codeBlockLength = add $codeBlockLength (countrunes .) -}}
{{- end -}}

{{- /* コードブロック重み補正した記事の長さ */ -}}
{{- $length := add $trimmedLength (mul $codeBlockLength $codeBlockWeight) -}}

{{- /* 読むのにかかる推定時間(分) */ -}}
{{- $count := math.Ceil (div $length $runesPerMinute) -}}

{{- $readingTime := dict "Count" $count -}}

<span title="{{ i18n "article.reading_time_title" }}">
  {{- i18n "article.reading_time" $readingTime | markdownify | emojify -}}
</span>
{{- /* Trim EOF */ -}}

設定例
#

config/_default/params.toml
[readingTime]
  # 1分あたりの文字数(日本語基準)
  runesPerMinute = 500
  # コードブロックの重み(0〜1)。0.2なら文字数の20%で換算
  codeBlockWeight = 0.2

参考
#

prata0x
著者
prata0x
Game programmer

関連記事

Hugoでブログを作る手順
·
HugoでVS Codeを記事エディタに使う設定
·
PythonでHugoの記事作成スクリプトを用意した