Hexo 備忘録 タグクラウドの見た目を変えたい
方針
tags.njk
で使っているtagcloud
は第一引数にtags
を取れるはずなので、そこでフィルタリングしたものを渡してみる
問題
{% set array = [] %}
で配列を作って渡すとエラーを吐く。site.tags
と構造が違うのかもしれない
公式サイトではarray
と言っているんだけど、これがNunjacks
で作れる配列とイコールかは不明。
解決策
enjine.js
にhelper
としてメソッドを追加するhexo.extend.helper.register
を使えば、任意のJavaScript関数を埋め込むことができる。
1 | // engine.js |
調査ログ
site.tags の出自
多分、hexo/lib/hexo/index.js
で作っているDatabase
からなんやかんや生成している気配を感じる
なお、内部的にはwarehouse
のDatabase
を使っている模様。db.json
のTag
以下にあるものをもとに引っ張りだしてくるgetter
関数を定義して、それがLocales
経由でobject
になっている。
実態としてはDatabase
に対してクエリを飛ばした結果であるdb.model('Tag').filter(tag => tag.length)
であると思われる。
site.tags に上書きしてよいか
良くない。なぜならsite.tags
は共有化されたものなので
ではどうするか
site.tags
はこれまでの情報からwaterhouse
のQuery
であることが分かっている
つまり、上記のゼロ参照タグをはじくためにも使っているfilter
が使える
それを返せば、それは同じくQuery
だし、破壊的変更にもならない
追加でやりたいこと
map
でタグ名を編集したかったんだけど、map
の返り値が配列なので使えない
なので、data
を直接いじってみる
以下だと、tags
に破壊的変更を加えることになる
多分そのページ単位で閉じるので影響は軽微だけど、何とかしたいところ
1 | const regExp = new RegExp(regTxt); |
以下で一応回避できる。なんとなくまずい気もするけど、問題が起きてから考える。
1 | let result = tags.filter(it => regExp.test(it.name)); |