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)); |