背景

随着生活不断发生变故,有着想把自己私密隐私写成文字记录下来的想法,这些文字将会包含我最真实丑陋的一面,绝对不想让除了我之外的人看到。

但是Hexo以及Indigo主题并不支持隐藏文章的功能,所以花了几小时查阅资料实现了这个功能。

现记录实现细节如下。

隐藏文章

首先要隐藏指定的文章,通过阅读与实践,最终采用了 为 Hexo 博客添加隐藏文章 / 限定公开功能 这个方案。

与该文作者不同的是,由于我是自用,并不需要做成插件的方式,所以直接修改了plugins.js 文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
//themes/indigo/scripts/plugins.js
//生成前过滤文章
hexo.extend.filter.register('before_generate', function () {
const all_posts = this.locals.get('posts');
//找到所有hide标记为true的文章
const hide_posts = this.locals.get('posts').find({ 'hide': true });
//过滤hide文章
const normal_posts = this.locals.get('posts').filter(post => !post['hide']);

this._bindLocals();

this.locals.set('all_posts', all_posts);
this.locals.set('sage_posts', sage_posts);
//更新生成的文章为过滤后的文章
//页面调用时获取的数据就是这个
this.locals.set('posts', normal_posts);
})

const original_post_generator = hexo.extend.generator.get('post');

hexo.extend.generator.register('post', function (locals) {
//发送时需要把过滤的页面也加入
return original_post_generator.bind(this)({
posts: new locals.posts.constructor(
locals.posts.data.concat(locals.sage_posts.data)
)
});
});

接着只要设置页面的属性hide:true,就能够保证网站中找不到任何该页面的蛛丝马迹,但是可以直接访问链接(https://vanchchen.github.io/p/7587.html)查阅。

导航页面

文章确实找不到了,虽然能够通过记录下每一个网址链接的方式访问,但是始终不够优雅,能不能像分类一样有一个导航页面呢?

Hexo页面的渲染需要使用模板,直接使用 page category tag 这些模板无法定制化成需要的数据,所以建立一个新的layout模版。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//themes/indigo/layout/hide.ejs
//标题栏
<%- partial('_partial/header', {
title: '里世界',
hdClass: 'page-header'
}) %>

<div class="container body-wrap fade">
<!-->仿照分类页面的设计,去除了分类头<-->
<div class="waterfall">
<!-->获取了之前脚本中设置的隐藏文章表<-->
<% site.hide_posts.each(function(post){ %>
<%- partial('_partial/archive', {post: post, date_format: config.date_format}) %>
<% })%>
</div>
<%- partial('_partial/paginator') %>
</div>

接着设置一个新的index页面作为入口。

1
2
3
4
//source/hide/index.md

layout: hide
title: 里世界

文章设置是这样的。

1
2
3
4
5
6
7
---
title: 如何优雅的隐藏 Hexo 博客文章
categories: Hexo
abbrlink: '7587'
tags:
hide: true
---

隐藏导航

Indigo主题默认会在帖子页的底部,展示上一个下一个贴的导航。

这会暴露我们隐藏的帖子链接,所以必须要去除。

1
2
3
4
//themes/indigo/_config.yml

# 帖子页面是否展示上一个下一个导航栏
showNav: false
1
2
3
4
5
6
//themes/indigo/layout/_partial/post.ejs

//根据配置选择是否显示导航栏
<% if (theme.showNav == true) { %>
<%- partial('post/nav') %>
<% } %>

总结

通过这两个改动,就可以很方便的隐藏文章,并且通过访问hide路由进入隐藏文章列表页面,从而优雅的解决需求。