今さらブログを書いたところで生成AIにパクられて検索に食われるだけなのでオワコン気味ではあるが、 ギャラリーページみたいに画像を列挙して一覧表示させたかったのでHexoのプラグインを作ってみた。
サンプル:ギャラリー
環境:Hexo 7.3.0
Hexoプラグインの作り方
Hexoのプラグインはいろいろ公開されているが、探すのも大変なので自分で作ってみることに。
プラグイン
プラグインの作り方がどこに書いてあるのか分からなかったので hexo-generator-tagやhexo-generator-archiveを参考に試した (後々APIの「拡張」に説明が書かれているのを知った)。
- 単純なプラグインの場合、scritsディレクトリ内にJavaScriptのファイルを置く
- ページを生成するにはジェネレータで、
hexo.extend.generator.register('gallery', function(locals) {...})
で登録する- コールバック関数から返すオブジェクトに
path
,data
,layout
の各キーに値を格納 - 複数のページを生成する場合には配列にして返す
- 引数
locals
にいろいろ入っていて、locals.posts
が全てのポスト内容 this.config
でコンフィグ- ページネーションさせるにはhexo-paginationを使用する
- コールバック関数から返すオブジェクトに
各ポストにはタイトルやパスの他に、Front Matterの内容も格納されている。
ここではギャラリーに載せたい記事のFront Matterにgallery: 画像のパス
で指定:
--- |
して、その記事を列挙させることにした:
// scripts/hexo-generator-gallery.js |
filter
でpost.gallery
としてるので、Front Matterに指定した記事だけが列挙される- HTMLのヘッダの
<title>
がdata.title
で設定されるようになってるが、自分の使用しているテーマでは自動的には多言語対応されないので、ジェネレータ内で対応しておく$/themes/xxxx/layout/_partial/head.ejs
でヘッダの出力で、<title>
もそこで設定されていた
- ページネーション、簡単に使えて便利
コンフィグ
一応設定をいじれるように、コンフィグの値を参照するようにした:
# $/_config.yml |
レイアウト追加
生成するページのlayout
に'gallery'
と指定したので、それにあうレイアウトのテンプレートファイルを追加する:
<!-- $/themes/xxxx/layout/gallery.ejs --> |
- HTMLの内容はテーマに合うように、同じディレクトリ内の
archive.ejs
などを参考に書き換えること page.posts
に各記事が入ってくるpost.gallery
にFront Matterに記述した内容が入っているので、例えば<img src>
に使用する
辞書追加
ギャラリーページのタイトルを多言語対応するために辞書に追加:
# $/themes/xxxx/languages/ja.yml |
メニューに追加
使用しているテーマにもよると思うが、メニューに追加するにはテーマのコンフィグに追加:
# $/themes/xxxx/_config.yml |
センスのいいギャラリーページ
Googleの画像検索結果やPinterestみたいなカッコいいページにしたいが、デザインセンス皆無なのでなんともいえない。
- レスポンシブ:PCではカードで3~4列程度、スマホではSNSアプリっぽく各画像を正方形で横幅いっぱいにしたい:
flexbox
とメディアクエリを使うflex-grow
を指定すると最後の行が割り切れない場合に横に拡大されてしまうのを回避したい
- マウスホバーで記事タイトルを表示:
<div data-hover="タイトル">
と指定しておき、.card::before{content:attr(data-hover); opacity:0}
、.card:hover::before{opacity:1;}
とする
できはともかく、画像がたくさん並ぶとなんかいろいろやってきたんだなって感じでよい。