hexo-theme-shokax 0.4.12 → 0.4.14
Sign up to get free protection for your applications and to get access to all the features.
- package/_config.yml +4 -0
- package/layout/_partials/layout.pug +19 -15
- package/layout/_partials/post/nav.pug +5 -1
- package/package.json +3 -2
- package/scripts/filters/locals.js +41 -48
- package/scripts/filters/post.js +2 -4
- package/scripts/generaters/archive.js +121 -125
- package/scripts/generaters/config.js +61 -49
- package/scripts/generaters/images.js +17 -20
- package/scripts/generaters/index.js +111 -100
- package/scripts/generaters/pages.js +14 -14
- package/scripts/generaters/script.js +161 -153
- package/scripts/helpers/asset.js +68 -59
- package/scripts/helpers/engine.js +145 -159
- package/scripts/helpers/list_categories.js +68 -73
- package/scripts/helpers/summary_ai.js +100 -94
- package/scripts/helpers/symbols_count_time.js +43 -51
- package/scripts/libtypes.d.js +15 -0
- package/scripts/plugin/check.js +26 -27
- package/scripts/plugin/index.js +64 -73
- package/scripts/plugin/lib/injects-point.js +40 -19
- package/scripts/plugin/lib/injects.js +89 -73
- package/scripts/tags/links.js +51 -34
- package/scripts/tags/media.js +33 -16
- package/scripts/utils.js +40 -18
- package/source/js/_app/page/search.ts +2 -3
- package/toolbox/compiler.mjs +30 -24
package/_config.yml
CHANGED
@@ -27,6 +27,10 @@ experiments:
|
|
27
27
|
optimizeLongPosts: false # 优化长文章,这能让长文章的FPS提升70%-150%并解决假死问题,但存在一些副作用
|
28
28
|
# 具体见https://docs.kaitaku.xyz/guide/theme.html#%E9%95%BF%E6%96%87%E7%AB%A0%E4%BC%98%E5%8C%96
|
29
29
|
mobileWidth: 820px # 移动版和桌面版导航栏最短切换长度
|
30
|
+
coverConfig:
|
31
|
+
enableCover: true # 是否开启头图
|
32
|
+
enablePreload: true #是否开启预加载头图
|
33
|
+
enableNextGradientCover: true # 使用CSS渐变作为上/下一页封面
|
30
34
|
|
31
35
|
homeConfig:
|
32
36
|
gradient: false # 使用CSS渐变作为文章封面
|
@@ -8,16 +8,19 @@ if (theme.quicklink.ignores)
|
|
8
8
|
|
9
9
|
- var covers = _cover_index(page, 6)
|
10
10
|
- var enableFixedCover = theme.homeConfig?.fixedCover
|
11
|
+
- var enablePreload = theme.experiments?.coverConfig?.enablePreload
|
12
|
+
- var enableCover = theme.experiments?.coverConfig?.enableCover
|
11
13
|
|
12
14
|
doctype html
|
13
15
|
html(lang=page.language?page.language:config.language, style=theme.grayMode ? 'filter: grayscale(1);':'' )
|
14
16
|
head
|
15
17
|
!= partial('_partials/head/head.pug', {}, {cache: true})
|
16
|
-
if
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
18
|
+
if enablePreload && enableCover
|
19
|
+
if enableFixedCover
|
20
|
+
link(rel="preload" href=theme.homeConfig.fixedCover as="image" fetchpriority="high")
|
21
|
+
else
|
22
|
+
each image in covers
|
23
|
+
link(rel="preload" href=image as="image" fetchpriority="high")
|
21
24
|
|
22
25
|
!= partial('_partials/head/head_com.pug')
|
23
26
|
!= shokax_inject('head')
|
@@ -44,17 +47,18 @@ html(lang=page.language?page.language:config.language, style=theme.grayMode ? 'f
|
|
44
47
|
|
45
48
|
!= partial('_partials/header.pug', {}, {cache: true})
|
46
49
|
div(id="imgs" class="pjax")
|
47
|
-
if
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
if covers.length === 6
|
53
|
-
ul
|
54
|
-
each image in covers
|
55
|
-
li(class="item" style=`background-image: url("${image}");`)
|
50
|
+
if enableCover
|
51
|
+
if theme.homeConfig.gradient || enableFixedCover
|
52
|
+
//- cover不可用时用Bing随机图片代替
|
53
|
+
- var coverImage = theme.homeConfig?.fixedCover || "https://7ed.net/bing/api"
|
54
|
+
img(src=coverImage loading="eager" decoding="async" fetchpriority="high" alt=title)
|
56
55
|
else
|
57
|
-
|
56
|
+
if covers.length === 6
|
57
|
+
ul
|
58
|
+
each image in covers
|
59
|
+
li(class="item" style=`background-image: url("${image}");`)
|
60
|
+
else
|
61
|
+
img(src=covers loading="eager" decoding="async" fetchpriority="high" alt=title)
|
58
62
|
div(id="waves")
|
59
63
|
svg(class="waves" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 24 150 28" preserveAspectRatio="none" shape-rendering="auto")
|
60
64
|
defs
|
@@ -1,8 +1,12 @@
|
|
1
1
|
mixin navpost(item, type)
|
2
|
+
- var enableNextGradientCover = theme?.experiments?.coverConfig?.enableNextGradientCover
|
2
3
|
- var postText = item.title || item.link || __('post.untitled')
|
3
4
|
- var lastcat = item.categories.last()
|
4
5
|
- var itemlink = `<span class="type">${__('post.' + type)}</span>${lastcat && lastcat.name ? `<span class="category"><i class="ic i-flag"></i>${lastcat.name}</span>` : ''}<h3>${postText}</h3>`
|
5
|
-
|
6
|
+
if enableNextGradientCover
|
7
|
+
!= _url(item.path, itemlink, {itemprop: 'url', rel: type, title: postText, style: `background-image: linear-gradient(to bottom right, ${random_color()}, ${random_color()});`})
|
8
|
+
else
|
9
|
+
!= _url(item.path, itemlink, {itemprop: 'url', rel: type, 'data-background-image': _cover(item), title: postText})
|
6
10
|
|
7
11
|
div(class="post-nav")
|
8
12
|
div(class="item left")
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "hexo-theme-shokax",
|
3
|
-
"version": "0.4.
|
3
|
+
"version": "0.4.14",
|
4
4
|
"description": "a hexo theme based on shoka",
|
5
5
|
"main": "index.js",
|
6
6
|
"repository": "https://github.com/theme-shoka-x/hexo-theme-shokaX",
|
@@ -23,13 +23,14 @@
|
|
23
23
|
"eslint": "^9.11.0",
|
24
24
|
"eslint-config-standard": "~17",
|
25
25
|
"eslint-plugin-vue": "^9.28.0",
|
26
|
+
"glob": "^11.0.0",
|
26
27
|
"typescript": "^5.6.2"
|
27
28
|
},
|
28
29
|
"dependencies": {
|
29
30
|
"@algolia/client-search": "^5.5.3",
|
30
31
|
"@waline/client": "^3.3.2",
|
31
32
|
"algoliasearch": "5.5.3",
|
32
|
-
"esbuild": "^0.
|
33
|
+
"esbuild": "^0.24.0",
|
33
34
|
"hexo": "^7.3.0",
|
34
35
|
"hexo-algoliasearch": "^2.0.1",
|
35
36
|
"hexo-feed": "^1.1.2",
|
@@ -1,52 +1,45 @@
|
|
1
|
-
// @ts-ignore
|
2
1
|
const fmtNum = (num) => {
|
3
|
-
|
2
|
+
return num < 10 ? "0" + num : num;
|
4
3
|
};
|
5
|
-
hexo.extend.filter.register(
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
return data;
|
13
|
-
}
|
14
|
-
};
|
15
|
-
// Language & Config
|
16
|
-
// 根据主题配置的 Creative Commons 许可证生成链接
|
17
|
-
locals.alternate = theme.alternate;
|
18
|
-
locals.title = pangu.spacing(__('title') !== 'title' ? __('title') : config.title);
|
19
|
-
locals.subtitle = pangu.spacing(__('subtitle') !== 'subtitle' ? __('subtitle') : config.subtitle);
|
20
|
-
locals.author = __('author') !== 'author' ? __('author') : config.author;
|
21
|
-
locals.description = pangu.spacing(__('description') !== 'description' ? __('description') : config.description);
|
22
|
-
locals.languages = [...i18n.languages];
|
23
|
-
locals.languages.splice(locals.languages.indexOf('default'), 1);
|
24
|
-
locals.page.lang = locals.page.lang || locals.page.language;
|
25
|
-
locals.hostname = new URL(config.url).hostname || config.url;
|
26
|
-
// Creative Commons
|
27
|
-
// 根据主题配置的 Creative Commons 许可证生成链接
|
28
|
-
if (theme.creative_commons.license === 'zero') {
|
29
|
-
locals.ccURL = 'https://creativecommons.org/' + 'publicdomain/zero/1.0/' + (theme.creative_commons.language || '');
|
30
|
-
}
|
31
|
-
else {
|
32
|
-
locals.ccURL = 'https://creativecommons.org/' + 'licenses/' + theme.creative_commons.license + '/4.0/' + (theme.creative_commons.language || '');
|
33
|
-
}
|
34
|
-
if (locals.page.title) {
|
35
|
-
locals.page.title = pangu.spacing(locals.page.title);
|
36
|
-
}
|
37
|
-
locals.page.lastcat = '';
|
38
|
-
if (locals.page.categories) {
|
39
|
-
locals.page.categories.map((cat) => {
|
40
|
-
if (cat.name) {
|
41
|
-
cat.name = locals.page.lastcat = pangu.spacing(cat.name);
|
42
|
-
}
|
43
|
-
return cat;
|
44
|
-
});
|
45
|
-
}
|
46
|
-
if (locals.page.category) {
|
47
|
-
locals.page.title = pangu.spacing(locals.page.category);
|
48
|
-
}
|
49
|
-
if (locals.page.month) {
|
50
|
-
locals.page.month = fmtNum(locals.page.month);
|
4
|
+
hexo.extend.filter.register("template_locals", (locals) => {
|
5
|
+
const { config } = hexo;
|
6
|
+
const { __, theme } = locals;
|
7
|
+
const { i18n } = hexo.theme;
|
8
|
+
const pangu = {
|
9
|
+
spacing: (data) => {
|
10
|
+
return data;
|
51
11
|
}
|
12
|
+
};
|
13
|
+
locals.alternate = theme.alternate;
|
14
|
+
locals.title = pangu.spacing(__("title") !== "title" ? __("title") : config.title);
|
15
|
+
locals.subtitle = pangu.spacing(__("subtitle") !== "subtitle" ? __("subtitle") : config.subtitle);
|
16
|
+
locals.author = __("author") !== "author" ? __("author") : config.author;
|
17
|
+
locals.description = pangu.spacing(__("description") !== "description" ? __("description") : config.description);
|
18
|
+
locals.languages = [...i18n.languages];
|
19
|
+
locals.languages.splice(locals.languages.indexOf("default"), 1);
|
20
|
+
locals.page.lang = locals.page.lang || locals.page.language;
|
21
|
+
locals.hostname = new URL(config.url).hostname || config.url;
|
22
|
+
if (theme.creative_commons.license === "zero") {
|
23
|
+
locals.ccURL = "https://creativecommons.org/publicdomain/zero/1.0/" + (theme.creative_commons.language || "");
|
24
|
+
} else {
|
25
|
+
locals.ccURL = "https://creativecommons.org/licenses/" + theme.creative_commons.license + "/4.0/" + (theme.creative_commons.language || "");
|
26
|
+
}
|
27
|
+
if (locals.page.title) {
|
28
|
+
locals.page.title = pangu.spacing(locals.page.title);
|
29
|
+
}
|
30
|
+
locals.page.lastcat = "";
|
31
|
+
if (locals.page.categories) {
|
32
|
+
locals.page.categories.map((cat) => {
|
33
|
+
if (cat.name) {
|
34
|
+
cat.name = locals.page.lastcat = pangu.spacing(cat.name);
|
35
|
+
}
|
36
|
+
return cat;
|
37
|
+
});
|
38
|
+
}
|
39
|
+
if (locals.page.category) {
|
40
|
+
locals.page.title = pangu.spacing(locals.page.category);
|
41
|
+
}
|
42
|
+
if (locals.page.month) {
|
43
|
+
locals.page.month = fmtNum(locals.page.month);
|
44
|
+
}
|
52
45
|
});
|
package/scripts/filters/post.js
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
// 使用正则表达式将<img>标签的src属性替换为data-src属性
|
4
|
-
data.content = data.content.replace(/(<img[^>]*) src=/img, '$1 loading="lazy" data-src=');
|
1
|
+
hexo.extend.filter.register("after_post_render", (data) => {
|
2
|
+
data.content = data.content.replace(/(<img[^>]*) src=/img, '$1 loading="lazy" data-src=');
|
5
3
|
}, 0);
|
@@ -1,133 +1,129 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
var
|
4
|
-
|
1
|
+
"use strict";
|
2
|
+
var __create = Object.create;
|
3
|
+
var __defProp = Object.defineProperty;
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
8
|
+
var __copyProps = (to, from, except, desc) => {
|
9
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
10
|
+
for (let key of __getOwnPropNames(from))
|
11
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
12
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
13
|
+
}
|
14
|
+
return to;
|
5
15
|
};
|
6
|
-
|
7
|
-
//
|
8
|
-
|
9
|
-
//
|
16
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
17
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
18
|
+
// file that has been converted to a CommonJS file using a Babel-
|
19
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
20
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
21
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
22
|
+
mod
|
23
|
+
));
|
24
|
+
var import_hexo_pagination = __toESM(require("hexo-pagination"));
|
10
25
|
const fmtNum = (num) => {
|
11
|
-
|
26
|
+
return num < 10 ? "0" + num : num;
|
12
27
|
};
|
13
28
|
if (!(hexo.config.archive && hexo.config.archive.enabled === false)) {
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
29
|
+
let per_page;
|
30
|
+
if (hexo.config.archive === 1) {
|
31
|
+
per_page = 0;
|
32
|
+
} else if (typeof hexo.config.per_page === "undefined") {
|
33
|
+
per_page = 10;
|
34
|
+
} else {
|
35
|
+
per_page = hexo.config.per_page;
|
36
|
+
}
|
37
|
+
hexo.config.archive_generator = Object.assign({
|
38
|
+
per_page,
|
39
|
+
yearly: true,
|
40
|
+
monthly: true,
|
41
|
+
daily: false
|
42
|
+
}, hexo.config.archive_generator);
|
43
|
+
hexo.extend.generator.register("archive", function(locals) {
|
44
|
+
const config = hexo.config;
|
45
|
+
let archiveDir = config.archive_dir;
|
46
|
+
const paginationDir = config.pagination_dir || "page";
|
47
|
+
const allPosts = locals.posts.sort(config.archive_generator.order_by || "-date");
|
48
|
+
const perPage = config.archive_generator.per_page;
|
49
|
+
let result = [];
|
50
|
+
if (!allPosts.length) return;
|
51
|
+
if (archiveDir[archiveDir.length - 1] !== "/") archiveDir += "/";
|
52
|
+
function generate(path, posts2, options) {
|
53
|
+
options = options || {};
|
54
|
+
options.archive = true;
|
55
|
+
result = result.concat((0, import_hexo_pagination.default)(path, posts2, {
|
56
|
+
perPage: path === archiveDir ? 0 : perPage,
|
57
|
+
layout: ["archive", "index"],
|
58
|
+
format: paginationDir + "/%d/",
|
59
|
+
data: options
|
60
|
+
}));
|
18
61
|
}
|
19
|
-
|
20
|
-
|
21
|
-
}
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
format: paginationDir + '/%d/',
|
50
|
-
data: options
|
51
|
-
}));
|
52
|
-
}
|
53
|
-
generate(archiveDir, allPosts);
|
54
|
-
if (!config.archive_generator.yearly)
|
55
|
-
return result;
|
56
|
-
const posts = {};
|
57
|
-
// 按日期对文章进行分类
|
58
|
-
allPosts.forEach(post => {
|
59
|
-
const date = post.date;
|
60
|
-
const year = date.year();
|
61
|
-
const month = date.month() + 1; // month is started from 0
|
62
|
-
if (!Object.prototype.hasOwnProperty.call(posts, year)) {
|
63
|
-
// 13个数组. 第一个数组是给这一年的文章准备的
|
64
|
-
// 其他则是各个月份的文章
|
65
|
-
posts[year] = [
|
66
|
-
[],
|
67
|
-
[],
|
68
|
-
[],
|
69
|
-
[],
|
70
|
-
[],
|
71
|
-
[],
|
72
|
-
[],
|
73
|
-
[],
|
74
|
-
[],
|
75
|
-
[],
|
76
|
-
[],
|
77
|
-
[],
|
78
|
-
[]
|
79
|
-
];
|
80
|
-
}
|
81
|
-
posts[year][0].push(post);
|
82
|
-
posts[year][month].push(post);
|
83
|
-
// Daily
|
84
|
-
if (config.archive_generator.daily) {
|
85
|
-
const day = date.date();
|
86
|
-
if (!Object.prototype.hasOwnProperty.call(posts[year][month], 'day')) {
|
87
|
-
posts[year][month].day = {};
|
88
|
-
}
|
89
|
-
(posts[year][month].day[day] || (posts[year][month].day[day] = [])).push(post);
|
90
|
-
}
|
91
|
-
});
|
92
|
-
const Query = this.model('Post').Query;
|
93
|
-
const years = Object.keys(posts);
|
94
|
-
let year, data, month, monthData, url;
|
95
|
-
// Yearly
|
96
|
-
for (let i = 0, len = years.length; i < len; i++) {
|
97
|
-
year = +years[i];
|
98
|
-
data = posts[year];
|
99
|
-
url = archiveDir + year + '/';
|
100
|
-
if (!data[0].length)
|
101
|
-
continue;
|
102
|
-
generate(url, new Query(data[0]), { year });
|
103
|
-
if (!config.archive_generator.monthly && !config.archive_generator.daily)
|
104
|
-
continue;
|
105
|
-
// Monthly
|
106
|
-
for (month = 1; month <= 12; month++) {
|
107
|
-
monthData = data[month];
|
108
|
-
if (!monthData.length)
|
109
|
-
continue;
|
110
|
-
if (config.archive_generator.monthly) {
|
111
|
-
generate(url + fmtNum(month) + '/', new Query(monthData), {
|
112
|
-
year,
|
113
|
-
month
|
114
|
-
});
|
115
|
-
}
|
116
|
-
if (!config.archive_generator.daily)
|
117
|
-
continue;
|
118
|
-
// Daily
|
119
|
-
for (let day = 1; day <= 31; day++) {
|
120
|
-
const dayData = monthData.day[day];
|
121
|
-
if (!dayData || !dayData.length)
|
122
|
-
continue;
|
123
|
-
generate(url + fmtNum(month) + '/' + fmtNum(day) + '/', new Query(dayData), {
|
124
|
-
year,
|
125
|
-
month,
|
126
|
-
day
|
127
|
-
});
|
128
|
-
}
|
129
|
-
}
|
62
|
+
generate(archiveDir, allPosts);
|
63
|
+
if (!config.archive_generator.yearly) return result;
|
64
|
+
const posts = {};
|
65
|
+
allPosts.forEach((post) => {
|
66
|
+
const date = post.date;
|
67
|
+
const year2 = date.year();
|
68
|
+
const month2 = date.month() + 1;
|
69
|
+
if (!Object.prototype.hasOwnProperty.call(posts, year2)) {
|
70
|
+
posts[year2] = [
|
71
|
+
[],
|
72
|
+
[],
|
73
|
+
[],
|
74
|
+
[],
|
75
|
+
[],
|
76
|
+
[],
|
77
|
+
[],
|
78
|
+
[],
|
79
|
+
[],
|
80
|
+
[],
|
81
|
+
[],
|
82
|
+
[],
|
83
|
+
[]
|
84
|
+
];
|
85
|
+
}
|
86
|
+
posts[year2][0].push(post);
|
87
|
+
posts[year2][month2].push(post);
|
88
|
+
if (config.archive_generator.daily) {
|
89
|
+
const day = date.date();
|
90
|
+
if (!Object.prototype.hasOwnProperty.call(posts[year2][month2], "day")) {
|
91
|
+
posts[year2][month2].day = {};
|
130
92
|
}
|
131
|
-
|
93
|
+
(posts[year2][month2].day[day] || (posts[year2][month2].day[day] = [])).push(post);
|
94
|
+
}
|
132
95
|
});
|
96
|
+
const Query = this.model("Post").Query;
|
97
|
+
const years = Object.keys(posts);
|
98
|
+
let year, data, month, monthData, url;
|
99
|
+
for (let i = 0, len = years.length; i < len; i++) {
|
100
|
+
year = +years[i];
|
101
|
+
data = posts[year];
|
102
|
+
url = archiveDir + year + "/";
|
103
|
+
if (!data[0].length) continue;
|
104
|
+
generate(url, new Query(data[0]), { year });
|
105
|
+
if (!config.archive_generator.monthly && !config.archive_generator.daily) continue;
|
106
|
+
for (month = 1; month <= 12; month++) {
|
107
|
+
monthData = data[month];
|
108
|
+
if (!monthData.length) continue;
|
109
|
+
if (config.archive_generator.monthly) {
|
110
|
+
generate(url + fmtNum(month) + "/", new Query(monthData), {
|
111
|
+
year,
|
112
|
+
month
|
113
|
+
});
|
114
|
+
}
|
115
|
+
if (!config.archive_generator.daily) continue;
|
116
|
+
for (let day = 1; day <= 31; day++) {
|
117
|
+
const dayData = monthData.day[day];
|
118
|
+
if (!dayData || !dayData.length) continue;
|
119
|
+
generate(url + fmtNum(month) + "/" + fmtNum(day) + "/", new Query(dayData), {
|
120
|
+
year,
|
121
|
+
month,
|
122
|
+
day
|
123
|
+
});
|
124
|
+
}
|
125
|
+
}
|
126
|
+
}
|
127
|
+
return result;
|
128
|
+
});
|
133
129
|
}
|
@@ -1,51 +1,63 @@
|
|
1
|
-
|
2
|
-
var
|
3
|
-
|
1
|
+
"use strict";
|
2
|
+
var __create = Object.create;
|
3
|
+
var __defProp = Object.defineProperty;
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
8
|
+
var __copyProps = (to, from, except, desc) => {
|
9
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
10
|
+
for (let key of __getOwnPropNames(from))
|
11
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
12
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
13
|
+
}
|
14
|
+
return to;
|
4
15
|
};
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
}
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
if (
|
37
|
-
|
38
|
-
}
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
16
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
17
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
18
|
+
// file that has been converted to a CommonJS file using a Babel-
|
19
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
20
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
21
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
22
|
+
mod
|
23
|
+
));
|
24
|
+
var import_hexo_util = require("hexo-util");
|
25
|
+
var import_node_fs = __toESM(require("node:fs"));
|
26
|
+
var import_path = __toESM(require("path"));
|
27
|
+
var import_js_yaml = __toESM(require("js-yaml"));
|
28
|
+
hexo.extend.filter.register("before_generate", () => {
|
29
|
+
if (hexo.config.theme_config) {
|
30
|
+
hexo.theme.config = (0, import_hexo_util.deepMerge)(hexo.theme.config, hexo.config.theme_config);
|
31
|
+
}
|
32
|
+
const data = hexo.locals.get("data");
|
33
|
+
if (data.languages) {
|
34
|
+
const { i18n } = hexo.theme;
|
35
|
+
const mergeLang = (lang) => {
|
36
|
+
if (data.languages[lang]) {
|
37
|
+
i18n.set(lang, (0, import_hexo_util.deepMerge)(i18n.get([lang]), data.languages[lang]));
|
38
|
+
}
|
39
|
+
};
|
40
|
+
for (const lang of ["en", "ja", "zh-CN", "zh-HK", "zh-TW"]) {
|
41
|
+
mergeLang(lang);
|
42
|
+
}
|
43
|
+
}
|
44
|
+
hexo.theme.config.style = {};
|
45
|
+
for (const style of ["iconfont", "colors", "custom"]) {
|
46
|
+
const custom_file = "source/_data/" + style + ".styl";
|
47
|
+
if (import_node_fs.default.existsSync(custom_file)) {
|
48
|
+
hexo.theme.config.style[style] = import_path.default.resolve(hexo.base_dir, custom_file);
|
49
|
+
}
|
50
|
+
}
|
51
|
+
if (data.images && data.images.length > 0) {
|
52
|
+
hexo.theme.config.image_list = data.images;
|
53
|
+
} else {
|
54
|
+
hexo.theme.config.image_list = import_js_yaml.default.load(import_node_fs.default.readFileSync(import_path.default.join(__dirname, "../../_images.yml"), { encoding: "utf-8" }));
|
55
|
+
}
|
56
|
+
if (data.images_index && data.images_index.length > 0) {
|
57
|
+
hexo.theme.config.index_images = data.images_index;
|
58
|
+
} else if (import_node_fs.default.existsSync(import_path.default.join(__dirname, "../../_images_index.yml"))) {
|
59
|
+
hexo.theme.config.index_images = import_js_yaml.default.load(import_node_fs.default.readFileSync(import_path.default.join(__dirname, "../../_images_index.yml"), { encoding: "utf-8" }));
|
60
|
+
} else {
|
61
|
+
hexo.theme.config.index_images = data.index_images || [];
|
62
|
+
}
|
51
63
|
});
|
@@ -1,23 +1,20 @@
|
|
1
|
-
|
2
|
-
'use strict';
|
3
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
4
|
-
// @ts-ignore
|
1
|
+
"use strict";
|
5
2
|
const fs = require("hexo-fs");
|
6
|
-
hexo.extend.generator.register(
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
});
|
3
|
+
hexo.extend.generator.register("images", function(locals) {
|
4
|
+
const theme = hexo.theme.config;
|
5
|
+
const dir = "source/_data/" + theme.assets + "/";
|
6
|
+
if (!fs.existsSync(dir)) {
|
7
|
+
return;
|
8
|
+
}
|
9
|
+
const result = [];
|
10
|
+
const files = fs.listDirSync(dir);
|
11
|
+
files.forEach((file) => {
|
12
|
+
result.push({
|
13
|
+
path: theme.assets + "/" + file,
|
14
|
+
data: function() {
|
15
|
+
return fs.createReadStream(dir + file);
|
16
|
+
}
|
21
17
|
});
|
22
|
-
|
18
|
+
});
|
19
|
+
return result;
|
23
20
|
});
|