JekyllとGitHub pagesを使って、個人的な技術メモサイトをつくりました(がんばって記事を書こう...)。
ページのテーマはTeXt themeを使っています。
シンプルな見た目のウェブサイトで、サイドバーや目次をページに追加できるなど見やすいメモサイトができると考えて使っています。
Text themeにはアーカイブページというページが用意されています。デモサイトではこのようなページとなっています。
このアーカイブページは、ポスト記事(日付で整理される記事、_post
フォルダ下のファイル)の一覧とポスト記事についているタグを集めて表示してくれます。また、タグが付いているページ数をカウントし、それも合わせて表示します。さらにタグを選択すると、そのタグが付いているページだけが表示されます。
しかしながら、アーカイブページは ポスト以外のページ の表示やタグの収集はおこないません。今回の私のサイトは日付で管理するブログ的なサイトというより、勉強したことを追記するメモサイトなので、ポスト以外のページも対象にしたいところです。
上記の困りごとのため、ソースコードを改変し、ざっくりと以下の内容に対応しました。
できていないことは以下です。
タグがついているページ数をカウントする
改変後のアーカイブページはこちらです。
先に設定の変更とソースコードの改変部分を挙げておきます。
_config.xml
を変更
collection_dir
)を利用するarchive.html
でポスト以外のページも一覧にするtags.html
でポスト以外のページのタグを収集し、表示させる_config.xml
の変更Jekyllのコレクション(collections)とは、ページをまとめた配列を作成してくれるJekyll標準機能です。
<source>/_hoge
という形式でフォルダを作成し、そのフォルダ以下にページを作成すると、site.collections.hoge
という配列になります。
<source>
はデフォルトではトップページとなりますが、_config.xml
でcollection_dir
というプロパティを使用することで別のフォルダにすることができます。collection_dir
を使った場合には、ポスト記事のフォルダ(_post
)や下書きのフォルダ(_draft
)もcollection_dir
で指定したフォルダ以下に配置する必要があります。
今回は_config.xml
に以下の設定のような設定を追加します。
articles
フォルダ以下にコレクションとなるフォルダを用意します。下のような場合、_java
、_nodejs
というフォルダを用意することになります。
collections_dir: articles
collections:
java:
output: true
nodejs:
output: true
archive.html
の改変archive.html
は、元々は全てのポスト記事を一覧にして表示してくれるページです。
ここでは、先述のように設定したコレクションを用い、ポスト記事以外のページもこのアーカイブページに表示させます。
具体的には、archive.html
を以下のように変更します。
{% assign my_list = site.posts | concat: site.nodejs | concat: site.oidc_oauth %}
{%- include article-list.html articles=my_list type='brief' show_info=true reverse=true group_by='year' -%}
{%- assign page_list = "" | split: ',' -%}
{%- for coll in site.collections -%}
{%- assign page_list = page_list | concat: coll.docs -%}
{%- endfor -%}
{%- include article-list.html articles=page_list type='brief' show_info=true reverse=true group_by='year' -%}
tags.html
の改変tags.html
は元々アーカイブページ(archive.html
)に読み込まれ、全てのポスト記事から収集したタグの一覧を表示します。タグをクリックすると、そのタグが付いているページのみ表示されるようになります。
今回は修正をおこない、ポスト記事以外の全てのページからタグを収集するように変更します。
最終的に_tags
という変数にタグ情報を格納することで、アーカイブページにタグ機能を利用できるようになります。もともと、変数_tags
にはJekyllに用意されているsite.tags
を格納しています。このsite.tags
はポスト記事についているタグだけが入っています。そこで、全てのページのタグを集め、site.tags
の代わりに同じ構造のオブジェクトを作成してそれを渡せばよいはずです。
site.tags
の構造を説明します。site.tags
は配列になっています。配列の各要素は、さらに配列となっています。この要素の配列の先頭はタグの名称です。配列の2番目はそのタグがつけられているページ情報の配列です。
全てのページのタグから作成したタグ情報のオブジェクトの配列(site.tags
の代替、以下では「タグ情報オブジェクト配列」と呼称)を作成するため、コレクションを使います。
全てのコレクションを取り出し、各コレクションからページを取り出し、ページに付いているタグを取り出します。これらはfor文によるループで実行します。取得したタグは、作成するタグ情報オブジェクト配列に同じ名称のタグがなければ新規に追加し、反対に既に存在すればページ情報の配列に追加します。
tags.html
の先頭に追加します。
{%- assign page_tags = "" | split: ',' -%}
{%- for coll in site.collections -%}
{%- for page in coll.docs -%}
{%- for tagname in page.tags -%}
{%- assign found = false -%}
{%- for target in page_tags -%}
{%- if target[0] == tagname -%}
{%- comment -%}
下の行がうまく実行できていない
{%- endcomment -%}
{%- assign target[1] = target[1] | push: page -%}
{%- assign found = true -%}
{%- break -%}
{%- endif -%}
{%- endfor -%}
{%- if found == false -%}
{%- assign tagstruct = "" | split: ',' -%}
{%- assign tagstruct = tagstruct | push: tagname -%}
{%- assign page_list = "" | split: ',' -%}
{%- assign page_list = page_list | push: page -%}
{%- assign tagstruct = tagstruct | push: page_list -%}
{%- assign page_tags = page_tags | push: tagstruct -%}
{%- endif -%}
{%- endfor -%}
{%- endfor -%}
{%- endfor -%}
下のコードを、
{%- assign _tags = site.tags | sort -%}
以下のように変更します。
{%- assign _tags = page_tags | sort -%}
記事の先頭にも記載していますが、上のコードではできていないことがあります。
tags.html
は元々タグが付いているページ数を表示するようになっていますが、今回の改修をおこなうとページ数が正しく表示できません。tags.html
の実装コードにもコメントとして書いていますが、対象のタグが付いているページの配列に要素を追加することができていないです。
これは私がLiquid言語の配列の仕様を理解していないため、正しい実装をできていないことが原因のようです。
また、このページの配列が正しくセットされていなくとも、タグをクリックすることでページが絞り込まれる機能は動作しました。
アーカイブページはこちらです。
Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。
また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!
こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?
コメント