2023-10-03 11:14:36 +08:00
|
|
|
'use strict';
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Modified from https://github.com/next-theme/hexo-theme-next/blob/master/scripts/events/lib/injects.js
|
|
|
|
*/
|
|
|
|
|
|
|
|
const fs = require('fs');
|
|
|
|
const path = require('path');
|
|
|
|
const defaultExtname = '.ejs';
|
|
|
|
|
|
|
|
// Defining stylus types
|
|
|
|
class StylusInject {
|
|
|
|
|
|
|
|
constructor(base_dir) {
|
|
|
|
this.base_dir = base_dir;
|
|
|
|
this.files = [];
|
|
|
|
}
|
|
|
|
|
|
|
|
push(file) {
|
|
|
|
// Get absolute path base on hexo dir
|
|
|
|
this.files.push(path.resolve(this.base_dir, file));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Defining view types
|
|
|
|
class ViewInject {
|
|
|
|
|
|
|
|
constructor(base_dir) {
|
|
|
|
this.base_dir = base_dir;
|
|
|
|
this.raws = [];
|
|
|
|
}
|
|
|
|
|
|
|
|
raw(name, raw, ...args) {
|
|
|
|
// Set default extname
|
|
|
|
if (path.extname(name) === '') {
|
|
|
|
name += defaultExtname;
|
|
|
|
}
|
|
|
|
this.raws.push({ name, raw, args });
|
|
|
|
}
|
|
|
|
|
|
|
|
file(name, file, ...args) {
|
|
|
|
// Set default extname from file's extname
|
|
|
|
if (path.extname(name) === '') {
|
|
|
|
name += path.extname(file);
|
|
|
|
}
|
|
|
|
// Get absolute path base on hexo dir
|
|
|
|
this.raw(name, fs.readFileSync(path.resolve(this.base_dir, file), 'utf8'), ...args);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
const points = {
|
|
|
|
views: [
|
|
|
|
'head',
|
|
|
|
'header',
|
|
|
|
'bodyBegin',
|
|
|
|
'bodyEnd',
|
|
|
|
'footer',
|
|
|
|
'postMetaTop',
|
|
|
|
'postMetaBottom',
|
|
|
|
'postMarkdownBegin',
|
|
|
|
'postMarkdownEnd',
|
|
|
|
'postLeft',
|
|
|
|
'postRight',
|
|
|
|
'postCopyright',
|
|
|
|
'postComments',
|
|
|
|
'pageComments',
|
|
|
|
'linksComments'
|
|
|
|
],
|
|
|
|
styles: [
|
|
|
|
'variable',
|
|
|
|
'mixin',
|
|
|
|
'style'
|
|
|
|
]
|
|
|
|
};
|
|
|
|
|
|
|
|
// Init injects
|
|
|
|
function initInject(base_dir) {
|
|
|
|
const injects = {};
|
|
|
|
points.styles.forEach(item => {
|
|
|
|
injects[item] = new StylusInject(base_dir);
|
|
|
|
});
|
|
|
|
points.views.forEach(item => {
|
|
|
|
injects[item] = new ViewInject(base_dir);
|
|
|
|
});
|
|
|
|
return injects;
|
|
|
|
}
|
|
|
|
|
|
|
|
module.exports = (hexo) => {
|
|
|
|
// Exec theme_inject filter
|
|
|
|
const injects = initInject(hexo.base_dir);
|
|
|
|
hexo.execFilterSync('theme_inject', injects);
|
|
|
|
hexo.theme.config.injects = {};
|
|
|
|
|
|
|
|
// Inject stylus
|
|
|
|
points.styles.forEach(type => {
|
|
|
|
hexo.theme.config.injects[type] = injects[type].files;
|
|
|
|
});
|
|
|
|
|
|
|
|
// Inject views
|
|
|
|
points.views.forEach(type => {
|
|
|
|
const configs = Object.create(null);
|
|
|
|
hexo.theme.config.injects[type] = [];
|
|
|
|
// Add or override view.
|
|
|
|
injects[type].raws.forEach((injectObj, index) => {
|
|
|
|
const name = `inject/${type}/${injectObj.name}`;
|
|
|
|
hexo.theme.setView(name, injectObj.raw);
|
|
|
|
configs[name] = {
|
|
|
|
layout : name,
|
|
|
|
locals : injectObj.args[0],
|
|
|
|
options: injectObj.args[1],
|
|
|
|
order : injectObj.args[2] || index
|
|
|
|
};
|
|
|
|
});
|
|
|
|
// Views sort.
|
|
|
|
hexo.theme.config.injects[type] = Object.values(configs)
|
|
|
|
.sort((x, y) => x.order - y.order);
|
|
|
|
});
|
|
|
|
};
|