middlemn v4 では resources と collection というのが導入されたらしいのですが、公式ドキュメントを見てもいまいち分かりにくいです。どうやらわざわざextension で manipulate_resource_list() を使わなくても手軽にリソース操作ができるっぽいですね。
resources を使ってみる。
とりあえず、すべてのリソースに 'foo' というローカル変数を使えるようにしてみます。config.rb に
resources.each {|res|
res.add_metadata(locals: {foo: "YES! FOO!!!"})
}
と書くだけで、*.html.erb で
foo? <%= foo %>
と使えるようです。確かに便利ですね。v3ではこれをするのには Middleman::Extension から派生させたクラスを作って manipulate_resource_list() を書いてそのクラスを Middleman::Extensions に register して activate して、、、という手順を踏まなければなりませんでしたから。
collection を使ってみる
ドキュメントのタグの例題が分かりにくいので、ここでは、**「見てほしい記事に mitene: 100 とかフロントマターにつけて大きい順に表示する」**というのをやってみたいと思います。
config.rb:
mitene = resources.select {|r| r.data.mitene }.sort_by {|r| r.data.mitene}.reverse
collection :mitene, mitene
というふうに、collection() を使って、あるシンボルに対して、resources から始まるチェーンから作られたオブジェクトを紐付けしてあげます。そうすると mitene.html.erb でそのシンボルを使って、
<h2>みてね!</h2>
<ul>
<% collection(:mitene).each do |res| %>
<li><%= link_to(res.data.title, res) %></li>
<% end %>
</ul>
というふうに、集めておいたオブジェクトを呼び出せるようです。
また、config.rb:
mitene = resources.select {|r| r.data.mitene }.group_by {|r| r.data.mitene }
collection :mitene, mitene
とハッシュにしてあげて
<h2>みてね!順</h2>
<ul>
<% collection(:mitene).sort_by {|r, v| r}.reverse.each do |key, items| %>
<li><%= key %>
<ul>
<% items.each do |res| %>
<li><%= link_to(res.data.title, res) %></li>
<% end %>
</ul>
<% end %>
</ul>
と受け取ることも出来ます。
ちょっとリソースに手を加えたり、特定の条件のリソースを集めておいてテンプレートで使うということが手軽にできそうな感じです。
また分かり次第追記していきます。