过滤器

过滤器用于修改一些指定的数据。Hexo 按顺序将数据传递给过滤器,然后过滤器依次修改数据。这个概念借鉴了 WordPress.

概述

hexo.extend.filter.register(type, function() {
// User configuration
const { config } = this;
if (config.external_link.enable) // do something...

// Theme configuration
const { config: themeCfg } = this.theme;
if (themeCfg.fancybox) // do something...

}, priority);

您可以定义prioritypriority越低,越先执行。默认的priority是 10。我们建议使用用户可配置的优先级值,用户可以在配置文件中指定,例如hexo.config.your_plugin.priority

执行过滤器

hexo.extend.filter.exec(type, data, options);
hexo.extend.filter.execSync(type, data, options);
选项 描述
context 上下文
args 参数。这必须是一个数组。

传递给每个过滤器的第一个参数是data。传递给下一个过滤器的data可以通过返回一个新值来修改。如果没有返回值,则数据保持不变。您甚至可以使用args在过滤器中指定其他参数。例如

hexo.extend.filter.register("test", function (data, arg1, arg2) {
// data === 'some data'
// arg1 === 'foo'
// arg2 === 'bar'

return "something";
});

hexo.extend.filter.register("test", function (data, arg1, arg2) {
// data === 'something'
});

hexo.extend.filter.exec("test", "some data", {
args: ["foo", "bar"],
});

您也可以使用以下方法执行过滤器

hexo.execFilter(type, data, options);
hexo.execFilterSync(type, data, options);

取消注册过滤器

hexo.extend.filter.unregister(type, filter);

示例

// Unregister a filter which is registered with named function

const filterFn = (data) => {
data = "something";
return data;
};
hexo.extend.filter.register("example", filterFn);

hexo.extend.filter.unregister("example", filterFn);
// Unregister a filter which is registered with commonjs module

hexo.extend.filter.register("example", require("path/to/filter"));

hexo.extend.filter.unregister("example", require("path/to/filter"));

过滤器列表

以下列出了 Hexo 使用的过滤器。

before_post_render

在渲染文章之前执行。请参考 文章渲染 以了解执行步骤。

例如,将标题转换为小写

hexo.extend.filter.register("before_post_render", function (data) {
data.title = data.title.toLowerCase();
return data;
});

after_post_render

在渲染文章之后执行。请参考 文章渲染 以了解执行步骤。

例如,将@username替换为指向 Twitter 账户的链接

hexo.extend.filter.register("after_post_render", function (data) {
data.content = data.content.replace(
/@(\d+)/,
'<a href="http://twitter.com/$1">#$1</a>',
);
return data;
});

before_exit

在 Hexo 即将退出之前执行——这将在hexo.exit调用之后立即运行。

hexo.extend.filter.register("before_exit", function () {
// ...
});

before_generate

在开始生成之前执行。

hexo.extend.filter.register("before_generate", function () {
// ...
});

after_generate

在生成完成之后执行。

hexo.extend.filter.register("after_generate", function () {
// ...
});

template_locals

修改模板中的 本地变量

例如,将当前时间添加到模板的本地变量中

hexo.extend.filter.register("template_locals", function (locals) {
locals.now = Date.now();
return locals;
});

after_init

在 Hexo 初始化之后执行——这将在hexo.init完成后立即运行。

hexo.extend.filter.register("after_init", function () {
// ...
});

new_post_path

在创建文章时执行,用于确定新文章的路径。

hexo.extend.filter.register("new_post_path", function (data, replace) {
// ...
});

post_permalink

用于确定文章的永久链接。

hexo.extend.filter.register("post_permalink", function (data) {
// ...
});

after_render

在渲染完成之后执行。您可以查看 渲染 了解更多信息。

after_clean

在使用hexo clean命令删除生成的文件和缓存后执行。

hexo.extend.filter.register("after_clean", function () {
// remove some other temporary files
});

server_middleware

向服务器添加中间件。app是一个 Connect 实例。

例如,向响应头添加X-Powered-By: Hexo

hexo.extend.filter.register("server_middleware", function (app) {
app.use(function (req, res, next) {
res.setHeader("X-Powered-By", "Hexo");
next();
});
});