PeterSmith.Org

Posts by month

    I want to get a count of blog posts by month. Actually, I want to do that for each of my types of content. Ultimately, the idea is to generate a sparkline, rather like Aaron Parecki does on his website.

    A partial screenshot

    Screenshot of sparklines from Aaron Parecki's website

    The code I finally ended up with looks like this. First I have a partial template posting-status.html. It cycles through all the types of sections I have and draws a sparkline, a count of posts, and a link to the section. I don't think the code is pretty, but it seems to work.

    
    {{ range .Pages.GroupBy "Section" }}
    {{ $MyKey := .Key }}
    
     <ul class="sparklines">
       {{ range .Pages }}
       <li>
          <embed {{ printf "src=%q" ( replaceRE "(\\s)" "" (partial "sparkline-data" (dict "context" . "WhatSection" $MyKey ))) | safeHTMLAttr }}  width="100" height="15">
         {{ len .Pages }} <a href="{{ .Permalink }}">{{ .Title }}</a>
       </li>
       {{ end }}
     </ul>
    {{ end }}

    Then there is another partial that gets the data needed for the sparkline. This took a lot of messing around because (a) Hugo was keen to HTML encode the data, and (b) I could figure way to build an 'array' of the count of posts by month. Anyway, in the end sparkline-data.html looks like this:

    {{ $master_list := dict "2021 10" 0 }}
    
    {{ $ThisSection := .WhatSection }}
    
    {{ range (.context.Site.RegularPages.GroupByDate "y2006_01").Reverse }}
      {{ $my_year := .Key }} {{ $my_entries := len (where .Pages.Reverse "Section" $ThisSection  ) }}
      {{ $temp := dict $my_year $my_entries }}
      {{ $master_list = merge  $temp $master_list}}
    {{ end }}
    
    {{ $StartYear := 2000 }}
    {{ $EndYear := now.Format "2006" }}
    
    {{ $MyList := "0" }}
    {{ $NewOne := "" }}
    {{ range $index, $year := (seq $StartYear $EndYear ) }}
        {{ range $month := (seq 1 12) }}
          {{ $key := (printf "y%d_%02d" $year $month) }}
          {{ $entries := index $master_list $key }}
          {{ if $entries }}
             {{ $NewOne = $entries }}
          {{ else }}
             {{ $NewOne = "0" }}
          {{ end }}
          {{ $MyList = print $MyList ", " $NewOne }}
       {{ end }}
    {{ end }}
    
    {{- print "/images/sparkline.svg?" $MyList -}}

    All-in-all, I don't think I am good at doing coding/functions/templates in Hugo, but it works.


    Webmentions
    If you webmention this page, please let me know the URL of your page.

    BTW: Your webmention won't show up until I next "build" my site.

    Word count: 400 (about 2 minutes)

    Published:

    Updated: 30 Oct '21 16:00

    Author: Peter Smith

    Permalink: https://petersmith.org/blog/2021/10/27/posts-by-month/

    Section: blog

    Kind: page

    Bundle type: leaf

    Source: blog/2021/10/27/posts-by-month/index.org