2025-2-26-fixed
This commit is contained in:
55
themes/next/scripts/events/index.js
Normal file
55
themes/next/scripts/events/index.js
Normal file
@ -0,0 +1,55 @@
|
||||
/* global hexo */
|
||||
|
||||
'use strict';
|
||||
|
||||
hexo.on('generateBefore', () => {
|
||||
// Merge config.
|
||||
require('./lib/config')(hexo);
|
||||
// Add filter type `theme_inject`
|
||||
require('./lib/injects')(hexo);
|
||||
});
|
||||
|
||||
hexo.on('generateAfter', () => {
|
||||
if (!hexo.theme.config.reminder) return;
|
||||
const https = require('https');
|
||||
const path = require('path');
|
||||
const { version } = require(path.normalize('../../package.json'));
|
||||
https.get('https://api.github.com/repos/theme-next/hexo-theme-next/releases/latest', {
|
||||
headers: {
|
||||
'User-Agent': 'Theme NexT Client'
|
||||
}
|
||||
}, res => {
|
||||
let result = '';
|
||||
res.on('data', data => {
|
||||
result += data;
|
||||
});
|
||||
res.on('end', () => {
|
||||
try {
|
||||
let latest = JSON.parse(result).tag_name.replace('v', '').split('.');
|
||||
let current = version.split('.');
|
||||
let isOutdated = false;
|
||||
for (let i = 0; i < Math.max(latest.length, current.length); i++) {
|
||||
if (!current[i] || latest[i] > current[i]) {
|
||||
isOutdated = true;
|
||||
break;
|
||||
}
|
||||
if (latest[i] < current[i]) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (isOutdated) {
|
||||
hexo.log.warn(`Your theme NexT is outdated. Current version: v${current.join('.')}, latest version: v${latest.join('.')}`);
|
||||
hexo.log.warn('Visit https://github.com/theme-next/hexo-theme-next/releases for more information.');
|
||||
} else {
|
||||
hexo.log.info('Congratulations! Your are using the latest version of theme NexT.');
|
||||
}
|
||||
} catch (err) {
|
||||
hexo.log.error('Failed to detect version info. Error message:');
|
||||
hexo.log.error(err);
|
||||
}
|
||||
});
|
||||
}).on('error', err => {
|
||||
hexo.log.error('Failed to detect version info. Error message:');
|
||||
hexo.log.error(err);
|
||||
});
|
||||
});
|
||||
60
themes/next/scripts/events/lib/config.js
Normal file
60
themes/next/scripts/events/lib/config.js
Normal file
@ -0,0 +1,60 @@
|
||||
'use strict';
|
||||
|
||||
function isObject(item) {
|
||||
return item && typeof item === 'object' && !Array.isArray(item);
|
||||
}
|
||||
|
||||
function merge(target, source) {
|
||||
for (const key in source) {
|
||||
if (isObject(target[key]) && isObject(source[key])) {
|
||||
merge(target[key], source[key]);
|
||||
} else {
|
||||
target[key] = source[key];
|
||||
}
|
||||
}
|
||||
return target;
|
||||
}
|
||||
|
||||
module.exports = hexo => {
|
||||
let data = hexo.locals.get('data');
|
||||
|
||||
/**
|
||||
* Merge configs from _data/next.yml into hexo.theme.config.
|
||||
* If `override`, configs in next.yml will rewrite configs in hexo.theme.config.
|
||||
* If next.yml not exists, merge all `theme_config.*` into hexo.theme.config.
|
||||
*/
|
||||
if (data.next) {
|
||||
if (data.next.override) {
|
||||
hexo.theme.config = data.next;
|
||||
} else {
|
||||
merge(hexo.config, data.next);
|
||||
merge(hexo.theme.config, data.next);
|
||||
}
|
||||
} else {
|
||||
merge(hexo.theme.config, hexo.config.theme_config);
|
||||
}
|
||||
|
||||
if (hexo.theme.config.cache && hexo.theme.config.cache.enable && hexo.config.relative_link) {
|
||||
hexo.log.warn('Since caching is turned on, the `relative_link` option in Hexo `_config.yml` is set to `false` to avoid potential hazards.');
|
||||
hexo.config.relative_link = false;
|
||||
}
|
||||
hexo.config.meta_generator = false;
|
||||
|
||||
// Custom languages support. Introduced in NexT v6.3.0.
|
||||
if (data.languages) {
|
||||
let { language } = hexo.config;
|
||||
let { i18n } = hexo.theme;
|
||||
|
||||
const mergeLang = lang => {
|
||||
i18n.set(lang, merge(i18n.get([lang]), data.languages[lang]));
|
||||
};
|
||||
|
||||
if (Array.isArray(language)) {
|
||||
for (let lang of language) {
|
||||
mergeLang(lang);
|
||||
}
|
||||
} else {
|
||||
mergeLang(language);
|
||||
}
|
||||
}
|
||||
};
|
||||
19
themes/next/scripts/events/lib/injects-point.js
Normal file
19
themes/next/scripts/events/lib/injects-point.js
Normal file
@ -0,0 +1,19 @@
|
||||
'use strict';
|
||||
|
||||
module.exports = {
|
||||
views: [
|
||||
'head',
|
||||
'header',
|
||||
'sidebar',
|
||||
'postMeta',
|
||||
'postBodyEnd',
|
||||
'footer',
|
||||
'bodyEnd',
|
||||
'comment'
|
||||
],
|
||||
styles: [
|
||||
'variable',
|
||||
'mixin',
|
||||
'style'
|
||||
]
|
||||
};
|
||||
85
themes/next/scripts/events/lib/injects.js
Normal file
85
themes/next/scripts/events/lib/injects.js
Normal file
@ -0,0 +1,85 @@
|
||||
'use strict';
|
||||
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
const points = require('./injects-point');
|
||||
const defaultExtname = '.swig';
|
||||
|
||||
// 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);
|
||||
}
|
||||
}
|
||||
|
||||
// Init injects
|
||||
function initInject(base_dir) {
|
||||
let 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
|
||||
let 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 => {
|
||||
let configs = Object.create(null);
|
||||
hexo.theme.config.injects[type] = [];
|
||||
// Add or override view.
|
||||
injects[type].raws.forEach((injectObj, index) => {
|
||||
let 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);
|
||||
});
|
||||
};
|
||||
Reference in New Issue
Block a user