3

単純な個人のJekyllブログの場合、lang(言語)site.postsの属性で自分をグループ化します。postこれは、「en」、「nl」、またはnilのいずれかです。

次に、投稿の2つのリストをレンダリングします。現在私は持っています:

<section lang="nl">
<h2>Nederlandse Artikelen</h2>
<ul class="posts">
  {% for post in site.posts limit:50 %}
    {% if post.lang == "nl" %}
      {% include li_for_post_with_date.yml %}
    {% endif %}
  {% endfor %}
</ul>
<a href="archief.html">Archief »</a>
</section>
<section lang="en">
<h2>English Articles</h2>
<ul class="posts">
  {% for post in site.posts limit:50 %}
    {% if post.lang == nil or post.lang == "en" %}
      <li><span>{{ post.date | date_to_string }}</span> &raquo; <a href="{{ BASE_PATH }}{{ post.url }}">{{ post.title }}</a></li>
    {% endif %}
  {% endfor %}
</ul>

これには2つの問題があります。

  1. 最も迷惑な; 最後の50件の投稿に47個のlang=enと3個のlang=nlがあると、歪んだリストが表示されます。25 lang=enと25lang=nlのエントリが必要です。
  2. ループは2回ウォークオーバーされますが、これは不十分だと思います。

Liquidでコレクションを割り当てたり準備したりする方法はありますか?そうすれば、一度ループしsite.postsて、のようなネストされたコレクションを準備できますsite.grouped_posts[en]

または別のトリック?

解決

トムクラークソンが指摘するように、カウンターを維持することは正しい方向です。ただし、カウンターのインクリメントは最近のLiquidバージョンでのみ行われ、Github(私の液体がコンパイルされている場所)で実行されているものには2.2.2があり、カウンターをインクリメントすることはできません。Liquidは変数counterを文字列に変換するため、Tomsソリューション自体も機能しません。これは、と比較することはできません<

文字列を追加して文字数を数えることで、ハックを作成しました。

{% assign counter = '.' %}
{% for post in site.posts %}
  {% if counter.size <= 25 and post.lang == "nl" %}
    {% capture counter %}{{ counter | append:'.' }}{% endcapture %}
    {% include li_for_post_with_date.yml %}
  {% endif %}
{% endfor %}

言ったように、醜いので、よりクリーンな解決策がある場合は、解決策を追加してください!

4

2 に答える 2

4

残念ながら、Liquidのフィルターはforループでは機能しません。ただし、変数の割り当てでは機能します。

{% assign posts_by_lang = site.posts | group_by: "lang" %}
{% for lang in posts_by_lang %}
  {{ lang.name }}
  {% for post in lang.items limit: 25 %}
    {{ post.title }}
  {% endfor %}
{% endfor %}

nameitems属性はによって生成され、group_by残りは通常どおりビジネスです。

于 2015-01-26T21:57:56.420 に答える
1

プラグインやカスタムフィルターを作成せずにフィルター処理されたコレクションを作成することはできないと思いますが、制限を使用するのではなく、グループに対して既に収集された投稿の数をカウントできる場合があります。

{% for post in site.posts %}
    {% if counter < 25 and post.lang == nil or post.lang == "en" %}
        {% capture counter %}{{ counter | plus:1 }}{% endcapture %} 
        <li></li>
    {% endif %}
{% endfor %}

コードはテストされていませんが、かなり似たようなものが機能するはずです。

于 2012-11-27T14:07:13.400 に答える