Hexoのカテゴリーリストにcurrentクラスを付けて現在地をハイライト表示する
HexoではHelperという機能が備わっており、よく使う機能は簡単に出力できるようになっています。その機能を利用すると下のように記述することで、簡単にカテゴリー一覧を出力できます。
<%- list_categories( {
show_count: true
}) %>
そこで、カテゴリー別ページや記事ページにおいて、そのページが属するカテゴリーにcurrentクラスをつけ、ハイライト表示できるようにしたいのですが、どうやらヘルパーにその機能は備わっていない模様…
それならば、ヘルパーを使わずに自力でカテゴリー一覧を出力し、現在地表示にも対応してみよう、というのがこの記事での試みです。
この記事で紹介する内容は並列複数カテゴリーには対応していません。(階層カテゴリーは可)ご了承ください。
currentクラスをつける
カテゴリー一覧を表示したい箇所に以下のように記述します。
<ul class="category-list">
<%
let current_category = "";
if(is_category()) {
current_category = page.category;
} else if(is_post() && page.categories.length > 0) {
current_category = page.categories.data[page.categories.length - 1].name;
}
function displayCategories(parent = undefined) {
site.categories
.find({ parent })
.sort("name")
.each(function(category) {
const childCount = site.categories.find({ parent: category._id }).count();
%>
<li class="category-list-item">
<a class="category-list-link <% if(current_category === category.name) { %>current<% } %>" href="<%=url_for(category.path)%>"><%=category.name%></a>
<span class="category-list-count"><%= category.length%></span>
<% if (childCount > 0) { %>
<ul class="category-list-child">
<% displayCategories(category._id); %>
</ul>
<% } %>
</li>
<%
});
}
displayCategories();
%>
</ul>
class名やHTML構造は、ヘルパーで出力されるものと揃えてありますので、すでにCSSで装飾している場合でもそのまま置き換え可能です。
CSSで装飾
.current {
background: #eaeaea;
font-weight: 700;
}
ページが属するカテゴリーにはcurrentクラスがつくので、CSSで好きなように装飾してください。
参考記事
GitHubのIssueに挙がっているものを参考に改造させていただきました。ありがとうございました。