Liquid 解决 Jekyll 主题中文字数统计错误的问题

本文记录了部分 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.contentpage.content 的写法
words 变量为总字数,可添加 {% assign actually_words = words %} 语句在代码块底部赋值给 actually_words 变量

使用示例

  • Minimal Mistakes Jekyll theme

    1. 编辑 _includes/page__meta.html 文件
    2. 删除 {% assign words = document.content | strip_html | number_of_words %}
    3. 将上述的核心代码粘贴至被删除的地方即可
  • Chirpy Jekyll Theme

    1. 编辑 _includes/read-time.html 文件
    2. 删除 {% assign words = include.content | strip_html | number_of_words: 'auto' %}
    3. 将上述核心代码中的 document.content 批量替换为 include.content ,然后粘贴核心代码至被删除的地方即可

在 Jekyll 主题文件中搜索 strip_html 关键字可以找到字数统计的代码
若找不到则表明该主题或许不是使用 Liquid 语法计算字数

总结

受限于 Liquid 语法,代码中使用了大量的 if 语句,所以在 GitHub Pages 上自动构建 Jekyll 站点时需要多花点时间。

但不管如何,GitHub Pages 的 10 分钟构建时间限制是绰绰有余的。

推荐使用 Vercel 或 CloudFlare 托管 Jekyll 站点,其能使用最新版本的 Jekyll 构建网站,也就不会出现字数统计不正确的情况。

参考链接

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇