Follow

新课题:
页尾之前加了个全站字数统计,现在字数超十万了,我想给它加个单位,然后再模糊一点
也就是说,从显示“共嘟嘟了 125126 字”,变成显示“共嘟嘟了12.5k字”

hexo那边装个插件就行,hugo是用的 .WordCount,模糊字数用.FuzzyWordCount应该可行,但加单位怎么加呢……

站点总字数统计升级:不太完美地解决了 

具体讨论(象友单方面教学)见嘟串

字数模板变量有两个:
.FuzzyWordCount,模糊单词数,取整值100
.WordCount,具体字数

然后看之前抄的两个代码段,{{ range (where .Site.Pages "Kind" "page" )}},循环遍历所有页面,{{$scratch.Add "total" .WordCount}},将总字数添加给“total”这个值,

{{ ($scratch.Get "total") }}显示总字数。

所以,可以简单修改页尾,改成{{div ($scratch.Get "total") 1000}}(不显示小数)或者1000.0(显示小数),加一个”k“。最终会显示125k字或者125.126k字。
125.126k字很难看,125k好像又有点不够活泼,折中一下,{{$scratch.Add "total" .FuzzyWordCount}},输出结果就会变成125.1k字

缺点:,125.1k只是想象,实际上模糊字数模糊得还挺离谱,120126的总字数,模糊后变成了122300……

@Hydrangea Hugo 那个 .WordCount 和 .FuzzyWordCount 都是给文章计字数用的,据我所知全站字数没法用那个. 我曾经询问过你全站字数的实现,你换主题之前是用 js 做的:o3o.ca/@Hydrangea/106889401328

@zero 啊,是,我昨天没去看代码记错了

共嘟嘟了 {{$scratch.Get "total"}}字

是这个。

@Hydrangea
获取字数然后除于 1000 ,变量后面加个 K 。
我以前就这么干的,不优雅,但懒。

@SouthFox 我也打算这么干,能用就行,就是得研究下怎么写。

@Hydrangea
Hugo?我还没用过,不过这种一般都是在模板文件里改的。
不知道 Hugo 的渲染语法跟 ejs 区别大不大……

@Hydrangea
模板语法差不多吧, 都是 {{ }} 括起来,我弄个 Hugo 试试吧。

@SouthFox 我之前是直接照抄的,计划今晚不打本的话就先搞清楚这个是什么,再看看怎么写,应该不难。

@Hydrangea
我弄 Hugo 是用来渲染一下我的笔记 :blobfox_computer: 。快不算是正常使用了……

@SouthFox 工具用得舒服就行啦。

我的笔记是docsify,好久没用了…

@Hydrangea
啊,报错了,页脚加 {{$scratch.Get "total"}} 直接报错,我还为这是 Hugo 里的内置方法。

看了一下博客,是要首先声明啊……具体逻辑好像是循环调用 .WordCount ,然后将字数累加起来 :fox_think:

@SouthFox

怪我没说清楚,之前有个这个:

{{$scratch := newScratch}}
{{ range (where .Site.Pages "Kind" "page" )}}
{{$scratch.Add "total" .WordCount}}
{{ end }}

参考:immmmm.com/hugo-total-count/

@Hydrangea
:fox_think: 是,我看到了。逻辑就是一个循环,然后计算类型是文章的网页,然后调用 .WordCount 计算字数,在累加起来。

接下来直接修改这个变量就可以了……

@SouthFox 对!

所以要改我猜应该是改这个计算?
{{ range (where .Site.Pages "Kind" "page" )}}

@Hydrangea
这个是计算字数的循环,改的应该是结果。

@SouthFox 下面这句吗:
{{$scratch.Add "total" .WordCount}}
我不懂这个函数是什么,光看字面感觉像是加入一个“total”参数,参数内容是循环计算所有page页面的总字数。

然后在页尾引用这个“total”

@Hydrangea 早上好!不知道问题有没有得到解决……我参考了南狐的方法,大致是这样:
{{ div ($scratch.Get "total") 1000 }}
意思是把总字数除以一千,之后在“字”前面手动加上k就好了

@Hydrangea 如果需要显示小数的话就用 {{ div ($scratch.Get "total") 1000.0 }},方法来自 gohugo.io/functions/math/#read

@injellyfish

找到了!{{div 6 4}} → 1
原来这里的div不是那个div(比划)

@Hydrangea 就是这个 div 好像没有保留一位小数的方法 (。_。)

@injellyfish 哇谢谢!

不好意思地说我其实还没有开始解决,昨天只是写了个to-do 嘟嘟,因为感觉不是太难,准备今晚从“研究这个函数的名字叫什么”学起……

@Hydrangea @injellyfish
这里 Div(ides) 是除法的意思
好像确实没有保留几位小数的选项,所以可能要更麻烦一下了,

{{$var := $scratch.Get "total"}}
{{$var = div $var 100.0}}
先除到百位,然后再用附带的向上(或下)取整函数,
{{$var = math.Ceil $var}}
然后再除多一位
{{$var = div $var 10.0}}
这样就是保留一位小数的数字了。

当然更偷懒的方法就是循环里换成
{{$scratch.Add "total" .FuzzyWordCount}}
这个函数,文章多 1 个字也会当作 100 个字,这样就抹掉了零头,保证能除尽。当然每篇文章这样算,每篇文章都会多算一百字了。

@SouthFox @injellyfish 是,我中午是直接换成fuzzywordcount的,误差很大,而且明显会随着文章数量的增加越来越大。

你说的计算过程,是应该放在{{ range (where .Site.Pages "Kind" "page" )}}这部分吗?

@Hydrangea
这样好像会超出变量的作用域?
应该在你写一共写了 xx 字那一代码块开头那里声明变量并处理数据,
然后最后在一共写了 xx 字那里替换为一开始声明的变量名就行了。

@SouthFox

{{$var := $scratch.Get "total"}}{{$var = div $var 100.0}}{{$var = math.Ceil $var}}{{$var = div $var 10.0}}共嘟嘟了 {{$scratch.Get "total"}}字
这样吗?

@SouthFox @Hydrangea @injellyfish 不好意思打扰了,保留小数点的方法是 lang.FormatNumber:

共嘟嘟了{{ div ($scratch.Get "total") 1000.0 | lang.FormatNumber 2 }}k字.

gohugo.io/functions/lang/#lang

它之所以把这个功能放到 lang 下面,是因为比如说中法双语的博客,切换到法语后小数点自动改成逗号:123.45 → 123,45

@zero 这个方法简单欸!感谢您的补充,原来还有这种函数哇!

@zero
这……hugo 我也翻了 Format 的页面,只是都是日期相关的……我对取小数的观念还停留在 js 上的 Math.round …… 就以为一定是在 math 下了。
没想到是放在 lang 下 ……

Sign in to participate in the conversation
小球飞象

本实例是獭獭客厅,提供小球飞鱼,壁炉,风铃,獭獭提灯,散乱的书本和小雪人