過濾器

過濾器用於修改某些特定的數據。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);

您可以定義 priority(優先順序)。較低的 priority 表示它會先被執行。預設的 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();
});
});