本文记录了部分 Jekyll 主题部署在 GitHub Pages 时,出现中文字数统计错误问题的详细解决过程。
前言
Jekyll 中用于计算文章字数的方法为 number_of_words
,该方法需要 Jekyll 版本大于等于 v4.1.0
时才能正确计算中文字数。
但可惜的是,目前 GitHub Pages 构建所用的 Jekyll 版本还是 v3.9.5
版本。
因此在 GitHub Pages 上自动构建的 Jekyll 网站会出现中文字数统计不正确的情况,也影响到了阅读时间的计算。
本文提供了一种比较折中的方式解决该问题。
解决方式
此部分为字数统计功能核心代码的展示以及一些 Jekyll 主题上的使用示例。
核心代码
- 以下为 Liquid 语言实现的字数统计代码,使用其替换原 Jekyll 主题的字数统计代码即可
{% comment %} 当构建使用的 Jekyll 版本大于等于 4.1 时的字数计算方式 {% endcomment %} {% if jekyll.version >= "4.1" %} {% assign words = document.content | strip_html | number_of_words: "auto" %} {% else %} {% comment %} 当构建使用的 Jekyll 版本小于 4.1 时的字数计算方式 {% endcomment %} {% comment %} Starting write by Dancying {% endcomment %} {% assign page_content = document.content | strip_html | split: "" %} {% assign words = 0 %} {% assign is_cjk = true %} {% comment %} 使用循环逐个判断字符类型 {% endcomment %} {% for i in page_content %} {% comment %} 对 ASCII 码小于波浪线以下的部分进行细分 {% endcomment %} {% if i <= "~" %} {% comment %} 遇到大写字母、小写字母、数字时的处理方式 {% endcomment %} {% if i >= "a" and i <= "z" %} {% assign is_cjk = false %} {% elsif i >= "A" and i <= "Z" %} {% assign is_cjk = false %} {% elsif i >= "0" and i <= "9" %} {% assign is_cjk = false %} {% comment %} 遇到其他字符时的处理方式 {% endcomment %} {% else %} {% if i <= " " %} {% if is_cjk == false %} {% assign words = words | plus: 1 %} {% assign is_cjk = true %} {% endif %} {% elsif i == "." %} {% assign is_cjk = false %} {% else %} {% if is_cjk == false %} {% assign words = words | plus: 1 %} {% assign is_cjk = true %} {% endif %} {% endif %} {% endif %} {% comment %} ASCII 码大于波浪线的都算为一个字数 {% endcomment %} {% else %} {% if is_cjk == false %} {% assign words = words | plus: 1 %} {% assign is_cjk = true %} {% endif %} {% assign words = words | plus: 1 %} {% endif %} {% endfor %} {% comment %} Ending write by Dancying {% endcomment %} {% endif %}
该代码中的
document
变量和words
变量可能需要根据实际使用的主题进行调整
document
变量用于调用content
方法,一些主题里可能是include.content
或page.content
的写法
words
变量为总字数,可添加{% assign actually_words = words %}
语句在代码块底部赋值给actually_words
变量
使用示例
-
- 编辑
_includes/page__meta.html
文件 - 删除
{% assign words = document.content | strip_html | number_of_words %}
行 - 将上述的核心代码粘贴至被删除的地方即可
- 编辑
-
- 编辑
_includes/read-time.html
文件 - 删除
{% assign words = include.content | strip_html | number_of_words: 'auto' %}
行 - 将上述核心代码中的
document.content
批量替换为include.content
,然后粘贴核心代码至被删除的地方即可
- 编辑
在 Jekyll 主题文件中搜索
strip_html
关键字可以找到字数统计的代码
若找不到则表明该主题或许不是使用 Liquid 语法计算字数
总结
受限于 Liquid 语法,代码中使用了大量的 if 语句,所以在 GitHub Pages 上自动构建 Jekyll 站点时需要多花点时间。
但不管如何,GitHub Pages 的 10 分钟构建时间限制是绰绰有余的。
推荐使用 Vercel 或 CloudFlare 托管 Jekyll 站点,其能使用最新版本的 Jekyll 构建网站,也就不会出现字数统计不正确的情况。