hexo 主题魔改记录

自己折腾了下 Hexo 的 next 主题. 给 post 添加了字段 type. 为了避免下次崩了的时候, 我会对着自己写的代码一脸懵逼, 简单记录下……

本文基于 hexo-theme-next version 5.

首页分页

预期效果: 在首页不显示 post 中 type 为 book 的文章

思路: 修改首页的分页, 过滤掉 type 为 book 的文章.

具体实现:

参考 hexo-generator-index , 在 next 的 scripts 下, 添加文件 customIndexPagination.js, 内容如下:

var pagination = require('hexo-pagination');

hexo.extend.generator.register('customIndexPagination', function(locals){
locals.posts.forEach(function(post) {
// set post default type as post, 设置默认值
if (post.type == undefined) {
post.type = "post"
}
})

const config = this.config;
const posts = locals.posts.sort(config.index_generator.order_by);
// filter posts with type == "post", 过滤
const postsWithoutbook = posts.find({ "type": "post" })

posts.data.sort((a, b) => (b.sticky || 0) - (a.sticky || 0));

const paginationDir = config.pagination_dir || 'page';
const path = config.index_generator.path || '';

return pagination(path, postsWithoutbook, {
perPage: config.index_generator.per_page,
layout: ['index', 'archive'],
format: paginationDir + '/%d/',
data: {
__index: true
}
});
});

分类排序

预期效果: 同一个 category 中, 所有 type 为 book 的 post 按照指定字段排序后再分页.这里按照 ranked 字段来排序 posts.

思路: 找到 page下对应的category, 按照 ranked 字段排序后, 调用 slice 实现分页.

具体实现:

next version 5 的模板用的是swig 语法, swig已经多年不维护, 这个用起来还是折腾的.很多ES6语法不支持. 等后续有时间再折腾, 目前凑合用用swig….

修改 layout/category.swig, 在 Section部分, 添加如下代码:

<section id="posts" class="posts-collapse">
<div class="collection-title">
<h2 >{{ page.category }}</h2>
</div>
...........

{% set current = page.current %}
{% set pre = current - 1 %}
{% set perPage = config.per_page %}
{% set category = site.categories.findOne({ "name": page.category }) %}
{% set posts = category.posts.sort('ranked') %}
{% set bookPost = posts.find({ type: 'book' }) %}
{% set hasBookPost = bookPost.length > 0 %}
{% if hasBookPost %}
{% set posts = posts.slice(perPage * pre, perPage * current) %}
{% else %}
{% set posts = page.posts %}
{% endif %}

{% for post in posts %}
{{ post_template.render(post) }}
{% endfor %}

..........

逻辑很简单, 主要调用 slice 来得到当前分页中的posts.

其中 site.categories 调用了findOne来查找当前页面的category, 参考的是 warehouse.

OK.

参考

hexo-pagination

hexo-generator-index

warehouse