Photo by David Straight on Unsplash

[Jekyll] Collapsible Post Series Panel


Jekyll blog 에서 ‘Post Series’ 만들고 collapsible panel 로 post 목록 보여주기

포스팅을 하다 보면 간혹 너무 긴 글을 여러 편의 시리즈로 나누거나, 하나의 주제로 여러 편의 글을 시리즈로 작성하고 싶을 때가 있다. jekyll 에서 여러 편의 포스팅을 하나의 시리즈로 묶고, 시리즈의 모든 포스팅 첫 머리에 해당 시리즈의 포스팅 목록을 보여 주는 패널을 만들어 보자.

Create template for ‘series’

먼저 /include 디렉토리에, 시리즈 목록을 표시할 html template 파일을 작성한다.


{% if page.series %}
  {% assign count = '0' %}
  {% assign idx = '0' %}
  {% for post in site.posts reversed %}
    {% if post.series == page.series %}
      {% capture count %}{{ count | plus: '1' }}{% endcapture %}
      {% if post.url == page.url %}
        {% capture idx %}{{count}}{% endcapture %}
      {% endif %}
    {% endif %}
  {% endfor %}
{% endif %}
<details>
  <summary>
    Post Series <sub>(click to expand)</sub>
    <h3>{{ page.series }}</h3>
  </summary>
  <div class="panel seriesNote">
    {% assign count = '0' %}
    {% for post in site.posts reversed %}
    {% if post.series == page.series %}
      {% capture count %}{{ count | plus: '1' }}{% endcapture %}
      👉 Part {{ count }} -
      {% if page.url == post.url %}
        {{ page.title }}
      {% else %}
        <a href="{{post.url}}">{{post.title}}</a>
      {% endif %}<br/>
    {% endif %}
    {% endfor %}
  </div>
</details>
<hr/>

/_includes/series.html

<summary> 태그에 ‘Post Series (click to expand)’ 구문과 함께 시리즈 제목을 표시하고, 확장되는 패널(<div class="panel seriesNote"> 태그) 에 같은 시리즈에 속한 포스트들의 목록을 표시하도록 했다. 조금만 코드를 뜯어본다면 원하는 대로 수정해서 사용할 수 있을 것이다.

Add ‘series’ tag to Post

포스트의 front matter 에 series 태그를 추가하고, series tag 가 있는 포스트의 본문에는 series.html 을 include 해준다.

---
...
series: "My series 1"
...
---


{% include series.html %}

Add css for Panel class

블로그의 css 또는 scss 파일에 panel class 를 위한 스타일을 추가해준다. 내 경우에는 _sass 디렉토리 아래 _panel.scss 파일을 새로 만들고 @import 구문을 이용하여 추가했다.

.panel {
  padding: 15px;
  margin-bottom: 20px;
  background-color: #111111;
  border: 1px solid #3f3f3f;
  border-radius: 4px;
  -webkit-box-shadow: 0 1px 1px rgba(0,0,0,0.05);
  box-shadow: 0 1px 1px rgba(0,0,0,0.05)
}

.panel-heading {
  padding: 10px 15px;
  margin: -15px -15px 15px;
  background-color: #f5f5f5;
  border-bottom: 1px solid #ddd;
  border-top-right-radius: 3px;
  border-top-left-radius: 3px
}

.panel-title {
  margin-top: 0;
  margin-bottom: 0;
  font-size: 17.5px;
  font-weight: 500
}

.panel-footer {
  padding: 10px 15px;
  margin: 15px -15px -15px;
  background-color: #f5f5f5;
  border-top: 1px solid #ddd;
  border-bottom-right-radius: 3px;
  border-bottom-left-radius: 3px
}

.panel-primary {
  border-color: #428bca
}

.panel-primary .panel-heading {
  color: #fff;
  background-color: #428bca;
  border-color: #428bca
}

.panel-success {
  border-color: #d6e9c6
}

.panel-success .panel-heading {
  color: #468847;
  background-color: #dff0d8;
  border-color: #d6e9c6
}

.panel-warning {
  border-color: #fbeed5
}

.panel-warning .panel-heading {
  color: #c09853;
  background-color: #fcf8e3;
  border-color: #fbeed5
}

.panel-danger {
  border-color: #eed3d7
}

.panel-danger .panel-heading {
  color: #b94a48;
  background-color: #f2dede;
  border-color: #eed3d7
}

.panel-info {
  border-color: #bce8f1
}

.panel-info .panel-heading {
  color: #3a87ad;
  background-color: #d9edf7;
  border-color: #bce8f1
}
/_sass/_panel.scss

각자 블로그의 테마에 맞게 background, border color 등을 수정해 준다. 새로 추가한 series.html 파일에서 실제로는 panel class 만 이용하고 있으므로 전부 수정할 필요는 없고 맨 처음의 .panel 스타일링만 수정해 주면 된다. 나머지 스타일들은 혹시 모를 나중을 위해 남겨 두었다.

collapsed list
collapsed list
expanded list
expanded list

References