基本的に、私は Jekyll (これは Liquid テンプレート言語を使用します)を使用しており、for
の2つの項目ごとにラップするdiv
ループを記述しようとしています。
これは私の現在のループです:
<div>
{% for post in site.posts %}
<a href="{{ post.url }}">{{ post.title }}</a>
{% endfor %}
</div>
これは次のように4つの投稿を出力します。
<div>
<a href="#">Title</a>
<a href="#">Title</a>
<a href="#">Title</a>
<a href="#">Title</a>
</div>
4つの投稿に対する私の望ましい出力は次のとおりです。
<div>
<a href="#">Title</a>
<a href="#">Title</a>
</div>
<div>
<a href="#">Title</a>
<a href="#">Title</a>
</div>
どうすればこれを達成できますか?
私はゲームに遅れていることを知っていますが、私が感じるのは、ハックを感じないかなりエレガントなソリューションだと思いました。
for
ループのlimit
およびoffset
paramsを使用すると、一度に1行ずつ、行ごとにN個の投稿を反復できます。
まず、列挙する必要がある行の数を数えます。
_{% assign rows = site.posts.size | divided_by: 2.0 | ceil %}
_
Ruby同等のものはrows = (posts.size / 2.0).ceil
になります(奇数は独自の行を取得します)。
次に、行を反復処理します。
_{% for i in (1..rows) %}
<div>
_
ここで、_(i - 1) * 2
_を使用してコレクションオフセットを計算する必要があります(_forloop.index0
_を使用):
_ {% assign offset = forloop.index0 | times: 2 %}
_
次に、行のオフセットで始まる投稿のスライスを反復処理できます(Rubyの_posts[offset, 2]
_と同等)。
_ {% for post in site.posts limit:2 offset:offset %}
<a href="{{ post.url }}">{{ post.title }}</a>
{% endfor %}
_
行div
要素とforループを閉じます。
_ </div>
{% endfor %}
_
それでおしまい!
Rubyでは、次のようになります。
_rows = (posts.size / 2.0).ceil # the number of rows
(1..rows).each do |i|
offset = (i - 1) * 2
# <div>
posts[offset, 2].each do |post|
# <a href="#{post.url}>#{post.title}</a>
end
# </div>
end
_
今、すべて一緒に、Liquidで:
_{% assign rows = site.posts.size | divided_by: 2.0 | ceil %}
{% for i in (1..rows) %}
{% assign offset = forloop.index0 | times: 2 %}
<div>
{% for post in site.posts limit:2 offset:offset %}
<a href="{{ post.url }}">{{ post.title }}</a>
{% endfor %}
</div>
{% endfor %}
_
これが誰かを助けることを願っています!
<div>
sと投稿が修正されました(選択した回答に基づいている場合と思われます)、同じ出力を取得する短い方法があります-limit
を使用しますおよびoffset
:
(ページングへの液体のアプローチ)
<div>
{% for post in site.posts limit: 2 %}
<a href="{{ post.url }}">{{ post.title }}</a>
{% endfor %}
</div>
<div>
{% for post in site.posts limit: 2 offset: 2 %}
<a href="{{ post.url }}">{{ post.title }}</a>
{% endfor %}
</div>
投稿数が固定されていない場合(つまり、100の投稿がある場合、50 <div>
sそれぞれ2つの投稿)、次に forloop.index
(これは他のほとんどの回答ですでに言及されています)、およびmodulo
を使用して、現在のインデックスが偶数か奇数かを確認します。
{% for post in site.posts %}
{% assign loopindex = forloop.index | modulo: 2 %}
{% if loopindex == 1 %}
<div>
<a href="{{ post.url }}">{{ post.title }}</a>
{% else %}
<a href="{{ post.url }}">{{ post.title }}</a>
</div>
{% endif %}
{% endfor %}
これは希望する出力も返しますが、any件の投稿に対して機能します。
これを試してください:
<div>
{% for post in paginator.posts %}
<div>
{% if forloop.index == 1 %}
<a href="">{{ post.title }}</a>
{% endif %}
{% if forloop.index == 2 %}
<a href="">{{ post.title }}</a>
{% endif %}
</div>
<div>
{% if forloop.index == 3 %}
<a href="">{{ post.title }}</a>
{% endif %}
{% if forloop.index == 4 %}
<a href="">{{ post.title }}</a>
{% endif %}
</div>
{% endfor %}
</div>
私はこれに遭遇しました( https://Gist.github.com/leemachin/2366832 )これは他の回答に投稿されたものよりもはるかに優れたソリューションですが、これが必要になることを覚えておいてくださいプラグイン( https://Gist.github.com/leemachin/2366832#file-modulo-filter-rb )を機能させるには:
{% for post in paginator.posts %}
{% capture modulo %}{{ forloop.index0 | mod:2 }}{% endcapture %}
{% if modulo == '0' or forloop.first %}
<div>
{% endif %}
<a href="{{ post.url }}">{{ post.title }}</a>
{% if modulo == '1' or forloop.last %}
</div>
{% endif %}
{% endfor %}
私は本当に自分のやっていることに集中すべきですが、1歳で彼女のすべてのおもちゃを私に与えるのは難しいです...:D
コードが機能するはずです。
<div>
<div>
{% for post in paginator.posts %}
{% if forloop.index == 1 %}
<a href="">{{ post.title }}</a>
{% endif %}
{% if forloop.index == 2 %}
<a href="">{{ post.title }}</a>
{% endif %}
{% endfor %}
</div>
<div>
{% for post in paginator.posts %}
{% if forloop.index == 3 %}
<a href="">{{ post.title }}</a>
{% endif %}
{% if forloop.index == 4 %}
<a href="">{{ post.title }}</a>
{% endif %}
{% endfor %}
</div>
</div>
のhtmlを与える必要があります:
<div>
<div>
<a href="">Title 1</a>
<a href="">Title 2</a>
</div>
<div>
<a href="">Title 3</a>
<a href="">Title 4</a>
</div>
</div>
わかりました、適切なスタイリングなしで簡単に試してみましたが、これはうまくいくはずです:
<div>
{% for post in paginator.posts %}
{% case forloop.index %}
<div>
{% when 1 %}
<a href="">{{ post.title }}</a>
{% when 2 %}
<a href="">{{ post.title }}</a>
</div>
<div>
{% when 3 %}
<a href="">{{ post.title }}</a>
{% when 4 %}
<a href="">{{ post.title }}</a>
</div>
{% endcase %}
{% endfor %}
</div>
@ smilinmonki666の助けを借りて、私もこれを希望どおりに機能させることができました。これが最終的なコードです。
{% assign current_page_posts = paginator.posts | size %}
{% if current_page_posts > 0 %}
<div>
<div>
{% for post in paginator.posts %}
{% if forloop.index == 1 %}
<a href="{{ post.url }}">{{ post.title }}</a>
{% endif %}
{% if forloop.index == 2 %}
<a href="{{ post.url }}">{{ post.title }}</a>
{% endif %}
{% endfor %}
</div>
{% if current_page_posts > 2 %}
<div>
{% for post in paginator.posts %}
{% if forloop.index == 3 %}
<a href="{{ post.url }}">{{ post.title }}</a>
{% endif %}
{% if forloop.index == 4 %}
<a href="{{ post.url }}">{{ post.title }}</a>
{% endif %}
{% endfor %}
</div>
{% endif %}
</div>
{% endif %}
https://shopify.github.io/liquid/tags/iteration/ で説明されているように、cycle
タグを使用してこれを行うことができます
{% for post in site.posts %}
{% cycle '<div>', '' %}
<a href="{{ post.url }}">{{ post.title }}</a>
{% cycle '', '</div>' %}
{% endfor %}
出力
<div>
<a href="#">Title</a>
<a href="#">Title</a>
</div>
<div>
<a href="#">Title</a>
<a href="#">Title</a>
</div>
クリスチャンのソリューションを見た後、私は(pugベースの)コードを次のように更新しました:
.blog
.container
.row
.col-xs-0
.col-xs-12
h1 Blog
p Summit blog with latest news, thinking and participant's posts.
.col-xs-0
| {% for page in site.posts %}
| {% assign loopindex = forloop.index | modulo: 2 %}
| {% if loopindex == 1 %}
.row
| {% endif %}
span
.col-xs-6.col-sm-6
.card
.card-top
+ add-title
+ add-author
.card-block
+ add-snippet
| {% endfor %}