Jekyll / Liquid Templating: come raggruppare i post dei blog per anno?

Sto riscrivendo il mio blog per usare Jekyll. Jekyll usa il linguaggio dei Templari Liquid in modo da rendere un po ‘più difficile imparare a personalizzare.

Vorrei raggruppare la mia lista di post del blog per anno. Come scriverei il codice Liquid per poterlo fare?

{% for post in site.posts %} 
  • {{ post.title }}
  • {% endfor %}

    Se vuoi crearlo per anno, ecco il codice:

     {% for post in site.posts %} {% capture this_year %}{{ post.date | date: "%Y" }}{% endcapture %} {% capture next_year %}{{ post.previous.date | date: "%Y" }}{% endcapture %} {% if forloop.first %} 

    {{this_year}}

    {% else %} {% if this_year != next_year %}

    {{next_year}}

      {% endif %} {% endif %} {% endfor %}

    Se vuoi abbatterlo in anni e mesi, puoi ottenerlo in questo modo:

     {% for post in site.posts %} {% capture this_year %}{{ post.date | date: "%Y" }}{% endcapture %} {% capture this_month %}{{ post.date | date: "%B" }}{% endcapture %} {% capture next_year %}{{ post.previous.date | date: "%Y" }}{% endcapture %} {% capture next_month %}{{ post.previous.date | date: "%B" }}{% endcapture %} {% if forloop.first %} 

    {{this_year}}

    {{ this_month }}

    {% else %} {% if this_year != next_year %}

    {{next_year}}

    {{ next_month }}

      {% else %} {% if this_month != next_month %}

    {{ next_month }}

      {% endif %} {% endif %} {% endif %} {% endfor %}

    È solo una questione di dove si fa il taglio sul loop.

    Può essere fatto con molto, molto meno codice liquido rispetto alle risposte esistenti:

     {% for post in site.posts %} {% assign currentdate = post.date | date: "%Y" %} {% if currentdate != date %} 
  • {{ currentdate }}
  • {% assign date = currentdate %} {% endif %}
  • {{ post.title }}
  • {% endfor %}

    Ciò restituirà esattamente l’HTML specificato nella tua domanda:

     
  • 2013
  • foo
  • 2012
  • bar
  • baz

  • Tuttavia, questa non è la soluzione ottimale, perché i numeri dell’anno sono “solo” voci di elenco.
    Non è molto più codice liquido per mettere l’anno in un titolo e iniziare un nuovo

      per i post di ogni anno:

       {% for post in site.posts %} {% assign currentdate = post.date | date: "%Y" %} {% if currentdate != date %} {% unless forloop.first %}{% endunless %} 

      {{ currentdate }}

        {% assign date = currentdate %} {% endif %}
      • {{ post.title }}
      • {% if forloop.last %}
      {% endif %} {% endfor %}

      L’HTML generato:

       

      2013

      2012


      Puoi anche raggruppare per mese e anno (in modo che i titoli siano February 2012 , January 2012 e così via).

      Per fare ciò, devi solo sostituire la date: "%Y" (nella seconda riga di entrambi gli esempi precedenti) per date: "%B %Y" .
      ( %B è il nome completo del mese, vedi la documentazione )

      Queste soluzioni precedenti sono fantastiche, ma fortunatamente verso la fine del 2016, Jekyll ha aggiunto un filtro group_by_exp che può farlo in modo molto più pulito.

       {% assign postsByYear = site.posts | group_by_exp:"post", "post.date | date: '%Y'" %} {% for year in postsByYear %} 

      {{ year.name }}

      {% endfor %}

      La documentazione può essere trovata nella pagina Modelli di Jekyll .

      Alcune soluzioni di cui sopra sono molto complesse, ma poi come @Trevor ha sottolineato che possiamo levarage il filtro group_by_exp di Jekyll. Inoltre mi è piaciuta la soluzione, ma quello di cui avevo bisogno era raggruppato per Anno e poi all’interno di quell’elenco raggruppato per mese. Quindi, l’ho ottimizzato un po ‘.

       {% assign postsByYear = site.posts | group_by_exp:"post", "post.date | date: '%Y'" %} {% for year in postsByYear %} 

      {{ year.name }}

      {% assign postsByMonth = year.items | group_by_exp:"post", "post.date | date: '%B'" %} {% for month in postsByMonth %}

      {{ month.name }}

      {% endfor %} {% endfor %}

      Provare:

       {% for post in site.posts %} {% capture this_year %}{{ post.date | date: "%Y" }}{% endcapture %} {% if forloop.first %} 

      {{this_year}}

        {% else %} {% if this_year != last_year %}

      {{this_year}}

        {% endif %} {% endif %}
      • {{ post.title }}
      • {% if forloop.last %}
      {% endif %} {% capture last_year %}{{ this_year }}{% endcapture %} {% endfor %}
       
        {% for post in site.posts %} {% assign year = post.date | date: "%Y" %} {% if year != prev_year %}

        {{year}}

        {% endif %}
      • {{ post.date | date: "%B %e, %Y" }} {{ post.title }}
      • {% assign prev_year = year %} {% endfor %}