hexo-theme-shokax 0.0.1-alpha1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (162) hide show
  1. package/LICENSE +21 -0
  2. package/LICENSE-shoka +21 -0
  3. package/README.md +47 -0
  4. package/_config.yml +353 -0
  5. package/_images.yml +99 -0
  6. package/languages/README.md +19 -0
  7. package/languages/default.yml +1 -0
  8. package/languages/en.yml +151 -0
  9. package/languages/ja.yml +146 -0
  10. package/languages/zh-CN.yml +154 -0
  11. package/languages/zh-HK.yml +146 -0
  12. package/languages/zh-TW.yml +146 -0
  13. package/layout/_alternate/atom.ejs +30 -0
  14. package/layout/_alternate/json.ejs +16 -0
  15. package/layout/_alternate/rss.ejs +34 -0
  16. package/layout/_mixin/breadcrumb.pug +33 -0
  17. package/layout/_mixin/card.pug +37 -0
  18. package/layout/_mixin/comment.pug +10 -0
  19. package/layout/_mixin/postmeta.pug +30 -0
  20. package/layout/_mixin/segment.pug +32 -0
  21. package/layout/_mixin/sidebar.pug +36 -0
  22. package/layout/_mixin/widgets.pug +29 -0
  23. package/layout/_partials/footer.pug +61 -0
  24. package/layout/_partials/head/head.pug +54 -0
  25. package/layout/_partials/head/head_com.pug +17 -0
  26. package/layout/_partials/head/pwa.pug +17 -0
  27. package/layout/_partials/header.pug +19 -0
  28. package/layout/_partials/layout.pug +143 -0
  29. package/layout/_partials/loading.pug +13 -0
  30. package/layout/_partials/pagination.pug +4 -0
  31. package/layout/_partials/post/copyright.pug +20 -0
  32. package/layout/_partials/post/footer.pug +13 -0
  33. package/layout/_partials/post/nav.pug +13 -0
  34. package/layout/_partials/post/post.pug +26 -0
  35. package/layout/_partials/post/reward.pug +18 -0
  36. package/layout/_partials/sidebar/menu.pug +37 -0
  37. package/layout/_partials/sidebar/overview.pug +40 -0
  38. package/layout/_partials/third-party/baidu-analytics.pug +11 -0
  39. package/layout/_partials/third-party/clarity.pug +8 -0
  40. package/layout/_partials/third-party/qweather.pug +35 -0
  41. package/layout/archive.pug +31 -0
  42. package/layout/category.pug +66 -0
  43. package/layout/index.pug +33 -0
  44. package/layout/page.pug +56 -0
  45. package/layout/post.pug +35 -0
  46. package/layout/tag.pug +43 -0
  47. package/package.json +35 -0
  48. package/scripts/filters/locals.js +57 -0
  49. package/scripts/filters/post.js +23 -0
  50. package/scripts/generaters/archive.js +141 -0
  51. package/scripts/generaters/config.js +43 -0
  52. package/scripts/generaters/images.js +26 -0
  53. package/scripts/generaters/index.js +110 -0
  54. package/scripts/generaters/pages.js +19 -0
  55. package/scripts/generaters/script.js +81 -0
  56. package/scripts/helpers/asset.js +237 -0
  57. package/scripts/helpers/engine.js +183 -0
  58. package/scripts/helpers/list_categories.js +140 -0
  59. package/scripts/helpers/symbols_count_time.js +76 -0
  60. package/scripts/tags/links.js +86 -0
  61. package/scripts/tags/media.js +19 -0
  62. package/source/assets/404.png +0 -0
  63. package/source/assets/algolia_logo.svg +9 -0
  64. package/source/assets/apple-touch-icon.png +0 -0
  65. package/source/assets/beian.webp +0 -0
  66. package/source/assets/failure.ico +0 -0
  67. package/source/assets/favicon.ico +0 -0
  68. package/source/assets/logo.svg +16 -0
  69. package/source/assets/play_disc.png +0 -0
  70. package/source/assets/play_needle.png +0 -0
  71. package/source/assets/search.png +0 -0
  72. package/source/css/_colors.styl +207 -0
  73. package/source/css/_common/components/components.styl +6 -0
  74. package/source/css/_common/components/highlight/highlight.styl +353 -0
  75. package/source/css/_common/components/highlight/operation.styl +21 -0
  76. package/source/css/_common/components/pages/collapse.styl +119 -0
  77. package/source/css/_common/components/pages/home.styl +385 -0
  78. package/source/css/_common/components/pages/pages.styl +56 -0
  79. package/source/css/_common/components/pages/tag-cloud.styl +12 -0
  80. package/source/css/_common/components/post/breadcrumb.styl +39 -0
  81. package/source/css/_common/components/post/copyright.styl +41 -0
  82. package/source/css/_common/components/post/expand.styl +264 -0
  83. package/source/css/_common/components/post/footer.styl +11 -0
  84. package/source/css/_common/components/post/header.styl +79 -0
  85. package/source/css/_common/components/post/nav.styl +63 -0
  86. package/source/css/_common/components/post/post.styl +29 -0
  87. package/source/css/_common/components/post/reward.styl +50 -0
  88. package/source/css/_common/components/post/rtl.styl +12 -0
  89. package/source/css/_common/components/post/tags.styl +39 -0
  90. package/source/css/_common/components/tags/collapse.styl +72 -0
  91. package/source/css/_common/components/tags/container.styl +49 -0
  92. package/source/css/_common/components/tags/label.styl +12 -0
  93. package/source/css/_common/components/tags/links.styl +77 -0
  94. package/source/css/_common/components/tags/list.styl +131 -0
  95. package/source/css/_common/components/tags/note.styl +70 -0
  96. package/source/css/_common/components/tags/player.styl +361 -0
  97. package/source/css/_common/components/tags/quiz.styl +200 -0
  98. package/source/css/_common/components/tags/tabs.styl +83 -0
  99. package/source/css/_common/components/tags/tags.styl +9 -0
  100. package/source/css/_common/components/third-party/loading.styl +222 -0
  101. package/source/css/_common/components/third-party/mermaid/class.styl +90 -0
  102. package/source/css/_common/components/third-party/mermaid/flowchart.styl +72 -0
  103. package/source/css/_common/components/third-party/mermaid/gantt.styl +251 -0
  104. package/source/css/_common/components/third-party/mermaid/git.styl +7 -0
  105. package/source/css/_common/components/third-party/mermaid/mermaid.styl +37 -0
  106. package/source/css/_common/components/third-party/mermaid/pie.styl +9 -0
  107. package/source/css/_common/components/third-party/mermaid/sequence.styl +95 -0
  108. package/source/css/_common/components/third-party/mermaid/state.styl +130 -0
  109. package/source/css/_common/components/third-party/pace.styl +18 -0
  110. package/source/css/_common/components/third-party/search.styl +167 -0
  111. package/source/css/_common/components/third-party/theme.styl +151 -0
  112. package/source/css/_common/components/third-party/third-party.styl +22 -0
  113. package/source/css/_common/components/third-party/valine.styl +548 -0
  114. package/source/css/_common/components/third-party/widgets.styl +57 -0
  115. package/source/css/_common/outline/footer/footer.styl +69 -0
  116. package/source/css/_common/outline/header/brand.styl +77 -0
  117. package/source/css/_common/outline/header/header.styl +20 -0
  118. package/source/css/_common/outline/header/image.styl +79 -0
  119. package/source/css/_common/outline/header/menu.styl +117 -0
  120. package/source/css/_common/outline/header/nav.styl +81 -0
  121. package/source/css/_common/outline/header/right.styl +15 -0
  122. package/source/css/_common/outline/header/tool.styl +207 -0
  123. package/source/css/_common/outline/header/waves.styl +50 -0
  124. package/source/css/_common/outline/mobile.styl +46 -0
  125. package/source/css/_common/outline/outline.styl +78 -0
  126. package/source/css/_common/outline/sidebar/author.styl +59 -0
  127. package/source/css/_common/outline/sidebar/dimmer.styl +23 -0
  128. package/source/css/_common/outline/sidebar/menu.styl +63 -0
  129. package/source/css/_common/outline/sidebar/quick.styl +43 -0
  130. package/source/css/_common/outline/sidebar/related.styl +56 -0
  131. package/source/css/_common/outline/sidebar/sidebar.styl +75 -0
  132. package/source/css/_common/outline/sidebar/social.styl +69 -0
  133. package/source/css/_common/outline/sidebar/state.styl +37 -0
  134. package/source/css/_common/outline/sidebar/tab.styl +71 -0
  135. package/source/css/_common/outline/sidebar/toc.styl +47 -0
  136. package/source/css/_common/scaffolding/animate.styl +318 -0
  137. package/source/css/_common/scaffolding/base.styl +172 -0
  138. package/source/css/_common/scaffolding/buttons.styl +48 -0
  139. package/source/css/_common/scaffolding/divider.styl +36 -0
  140. package/source/css/_common/scaffolding/iconfont.styl +443 -0
  141. package/source/css/_common/scaffolding/normalize.styl +289 -0
  142. package/source/css/_common/scaffolding/pagination.styl +81 -0
  143. package/source/css/_common/scaffolding/ribbon.styl +38 -0
  144. package/source/css/_common/scaffolding/scaffolding.styl +14 -0
  145. package/source/css/_common/scaffolding/scrollbar.styl +37 -0
  146. package/source/css/_common/scaffolding/tables.styl +50 -0
  147. package/source/css/_common/scaffolding/tip.styl +19 -0
  148. package/source/css/_common/scaffolding/toggles.styl +59 -0
  149. package/source/css/_iconfont.styl +451 -0
  150. package/source/css/_mixins.styl +146 -0
  151. package/source/css/_variables.styl +89 -0
  152. package/source/css/app.styl +27 -0
  153. package/source/css/comment.styl +5 -0
  154. package/source/css/mermaid.styl +5 -0
  155. package/source/css/plugin.styl +174 -0
  156. package/source/css/twikoo.css +2002 -0
  157. package/source/js/_app/components.js +330 -0
  158. package/source/js/_app/global.js +317 -0
  159. package/source/js/_app/library.js +302 -0
  160. package/source/js/_app/page.js +623 -0
  161. package/source/js/_app/player.js +748 -0
  162. package/source/js/_app/vue.js +43 -0
package/layout/tag.pug ADDED
@@ -0,0 +1,43 @@
1
+ extends ./_partials/layout.pug
2
+
3
+ block title
4
+ != `${__('title.tag')}${__('symbol.colon')}${page.tag}|`
5
+
6
+ block header
7
+ h1(itemprop="name headline")
8
+ != _p('title.tag_in', page.tag)
9
+
10
+ block content
11
+ div(class="collapse wrap")
12
+ h2(class="item header")
13
+ a(href=url_for(config.tag_dir))
14
+ != __('title.all')
15
+ small /
16
+ != page.tag
17
+ small
18
+ != __('title.tag')
19
+ - var posts = page.posts
20
+ each post in posts.toArray()
21
+ article(class="item normal" itemscope itemtype="http://schema.org/Article")
22
+ div(class="meta")
23
+ time(itemprop="dateCreated"
24
+ datetime=moment(post.date).format()
25
+ content=date(post.date, config.date_format))
26
+ != date(post.date, 'YYYY-MM-DD')
27
+ if post.categories && post.categories.length
28
+ - var cat_length = post.categories.length
29
+ each cat,index in post.categories.toArray()
30
+ if index == cat_length && cat.name !== page.category
31
+ span
32
+ a(href=url_for(cat.path))
33
+ != cat.name
34
+ div(class="title")
35
+ if post.link
36
+ - var postTitleIcon = '<i class="ic i-link-alt"></i>'
37
+ - var postText = post.title || post.link
38
+ != _url(post.link, postText + postTitleIcon, {class: 'external', itemprop: 'url'})
39
+ else
40
+ a(href=url_for(post.path) itemprop="url")
41
+ span(itemprop="name")
42
+ != post.title || __('post.untitled')
43
+ include _partials/pagination.pug
package/package.json ADDED
@@ -0,0 +1,35 @@
1
+ {
2
+ "name": "hexo-theme-shokax",
3
+ "version": "0.0.1-alpha1",
4
+ "description": "a hexo theme based on shoka",
5
+ "main": "index.js",
6
+ "repository": "https://github.com/zkz098/hexo-theme-shokaX",
7
+ "author": "Chou kaitaku",
8
+ "license": "MIT",
9
+ "scripts": {
10
+ "test": "cd ./source/js && tsc"
11
+ },
12
+ "devDependencies": {
13
+ "@types/animejs": "^3.1.6",
14
+ "@types/fancybox": "^3.5.3",
15
+ "@types/hexo": "^3.8.8",
16
+ "@types/jquery": "^3.5.14",
17
+ "@types/js-yaml": "^4.0.5",
18
+ "@types/lozad": "^1.16.1",
19
+ "@types/node": "^18.11.17",
20
+ "@types/shelljs": "^0.8.11",
21
+ "@typescript-eslint/eslint-plugin": "^5.47.0",
22
+ "@typescript-eslint/parser": "^5.47.0",
23
+ "eslint": "^8.30.0",
24
+ "eslint-config-standard": "^17.0.0",
25
+ "eslint-plugin-import": "^2.26.0",
26
+ "eslint-plugin-n": "^15.6.0",
27
+ "eslint-plugin-promise": "^6.1.1",
28
+ "eslint-plugin-vue": "^9.8.0",
29
+ "typescript": "^4.9.4",
30
+ "vue": "^3.2.45"
31
+ },
32
+ "dependencies": {
33
+ "js-yaml": "^4.1.0"
34
+ }
35
+ }
@@ -0,0 +1,57 @@
1
+ 'use strict'
2
+ /* global hexo */
3
+ const path = require('path')
4
+ const url = require('url')
5
+
6
+ const fmtNum = num => {
7
+ return num < 10 ? '0' + num : num
8
+ }
9
+
10
+ hexo.extend.filter.register('template_locals', locals => {
11
+ const { env, config } = hexo
12
+ const { __, theme } = locals
13
+ const { i18n } = hexo.theme
14
+
15
+ const pangu = theme.pangu
16
+ ? require('pangu')
17
+ : {
18
+ spacing: data => {
19
+ return data
20
+ }
21
+ }
22
+
23
+ // Language & Config
24
+ locals.alternate = theme.alternate
25
+ locals.title = pangu.spacing(__('title') !== 'title' ? __('title') : config.title)
26
+ locals.subtitle = pangu.spacing(__('subtitle') !== 'subtitle' ? __('subtitle') : config.subtitle)
27
+ locals.author = __('author') !== 'author' ? __('author') : config.author
28
+ locals.description = pangu.spacing(__('description') !== 'description' ? __('description') : config.description)
29
+ locals.languages = [...i18n.languages]
30
+ locals.languages.splice(locals.languages.indexOf('default'), 1)
31
+ locals.page.lang = locals.page.lang || locals.page.language
32
+ locals.hostname = new URL(config.url).hostname || config.url
33
+
34
+ // Creative Commons
35
+ locals.ccURL = 'https://creativecommons.org/' + (theme.creative_commons.license === 'zero' ? 'publicdomain/zero/1.0/' : 'licenses/' + theme.creative_commons.license + '/4.0/') + (theme.creative_commons.language || '')
36
+
37
+ if (locals.page.title) {
38
+ locals.page.title = pangu.spacing(locals.page.title)
39
+ }
40
+ locals.page.lastcat = ''
41
+ if (locals.page.categories) {
42
+ locals.page.categories.map((cat) => {
43
+ if (cat.name) {
44
+ cat.name = locals.page.lastcat = pangu.spacing(cat.name)
45
+ }
46
+ return cat
47
+ })
48
+ }
49
+
50
+ if (locals.page.category) {
51
+ locals.page.title = pangu.spacing(locals.page.category)
52
+ }
53
+
54
+ if (locals.page.month) {
55
+ locals.page.month = fmtNum(locals.page.month)
56
+ }
57
+ })
@@ -0,0 +1,23 @@
1
+ 'use strict'
2
+
3
+ hexo.extend.filter.register('after_post_render', data => {
4
+ const { config } = hexo
5
+ const theme = hexo.theme.config
6
+
7
+ data.content = data.content.replace(/(<img[^>]*) src=/img, '$1 data-src=')
8
+
9
+ const url = require('url')
10
+ // eslint-disable-next-line n/no-deprecated-api
11
+ const siteHost = url.parse(config.url).hostname || config.url
12
+ data.content = data.content.replace(/<a[^>]* href="([^"]+)"[^>]*>([^<]*)<\/a>/img, (match, href, html) => {
13
+ // Exit if the href attribute doesn't exists.
14
+ if (!href) return match
15
+
16
+ // Exit if the url has same host with `config.url`, which means it's an internal link.
17
+ // eslint-disable-next-line n/no-deprecated-api
18
+ const link = url.parse(href)
19
+ if (!link.protocol || link.hostname === siteHost) return match
20
+
21
+ return `<span class="exturl" data-url="${Buffer.from(href).toString('base64')}">${html}</span>`
22
+ })
23
+ }, 0)
@@ -0,0 +1,141 @@
1
+ /* global hexo */
2
+ 'use strict'
3
+
4
+ const pagination = require('hexo-pagination')
5
+
6
+ const fmtNum = num => {
7
+ return num < 10 ? '0' + num : num
8
+ }
9
+
10
+ if (!(hexo.config.archive && hexo.config.archive.enabled === false)) {
11
+ // when archive disabled pagination, per_page should be 0.
12
+ let per_page
13
+
14
+ if (hexo.config.archive === 1) {
15
+ per_page = 0
16
+ } else if (typeof hexo.config.per_page === 'undefined') {
17
+ per_page = 10
18
+ } else {
19
+ per_page = hexo.config.per_page
20
+ }
21
+
22
+ hexo.config.archive_generator = Object.assign({
23
+ per_page,
24
+ yearly: true,
25
+ monthly: true,
26
+ daily: false
27
+ }, hexo.config.archive_generator)
28
+
29
+ hexo.extend.generator.register('archive', function (locals) {
30
+ const config = hexo.config
31
+ let archiveDir = config.archive_dir
32
+ const paginationDir = config.pagination_dir || 'page'
33
+ const allPosts = locals.posts.sort(config.archive_generator.order_by || '-date')
34
+ const perPage = config.archive_generator.per_page
35
+ let result = []
36
+
37
+ if (!allPosts.length) return
38
+
39
+ if (archiveDir[archiveDir.length - 1] !== '/') archiveDir += '/'
40
+
41
+ function generate (path, posts, options) {
42
+ options = options || {}
43
+ options.archive = true
44
+
45
+ result = result.concat(pagination(path, posts, {
46
+ perPage: path === archiveDir ? 0 : perPage,
47
+ layout: ['archive', 'index'],
48
+ format: paginationDir + '/%d/',
49
+ data: options
50
+ }))
51
+ }
52
+
53
+ generate(archiveDir, allPosts)
54
+
55
+ if (!config.archive_generator.yearly) return result
56
+
57
+ const posts = {}
58
+
59
+ // Organize posts by date
60
+ allPosts.forEach(post => {
61
+ const date = post.date
62
+ const year = date.year()
63
+ const month = date.month() + 1 // month is started from 0
64
+
65
+ if (!Object.prototype.hasOwnProperty.call(posts, year)) {
66
+ // 13 arrays. The first array is for posts in this year
67
+ // and the other arrays is for posts in this month
68
+ posts[year] = [
69
+ [],
70
+ [],
71
+ [],
72
+ [],
73
+ [],
74
+ [],
75
+ [],
76
+ [],
77
+ [],
78
+ [],
79
+ [],
80
+ [],
81
+ []
82
+ ]
83
+ }
84
+
85
+ posts[year][0].push(post)
86
+ posts[year][month].push(post)
87
+ // Daily
88
+ if (config.archive_generator.daily) {
89
+ const day = date.date()
90
+ if (!Object.prototype.hasOwnProperty.call(posts[year][month], 'day')) {
91
+ posts[year][month].day = {}
92
+ }
93
+
94
+ (posts[year][month].day[day] || (posts[year][month].day[day] = [])).push(post)
95
+ }
96
+ })
97
+
98
+ const Query = this.model('Post').Query
99
+ const years = Object.keys(posts)
100
+ let year, data, month, monthData, url
101
+
102
+ // Yearly
103
+ for (let i = 0, len = years.length; i < len; i++) {
104
+ year = +years[i]
105
+ data = posts[year]
106
+ url = archiveDir + year + '/'
107
+ if (!data[0].length) continue
108
+
109
+ generate(url, new Query(data[0]), { year })
110
+
111
+ if (!config.archive_generator.monthly && !config.archive_generator.daily) continue
112
+
113
+ // Monthly
114
+ for (month = 1; month <= 12; month++) {
115
+ monthData = data[month]
116
+ if (!monthData.length) continue
117
+ if (config.archive_generator.monthly) {
118
+ generate(url + fmtNum(month) + '/', new Query(monthData), {
119
+ year,
120
+ month
121
+ })
122
+ }
123
+
124
+ if (!config.archive_generator.daily) continue
125
+
126
+ // Daily
127
+ for (let day = 1; day <= 31; day++) {
128
+ const dayData = monthData.day[day]
129
+ if (!dayData || !dayData.length) continue
130
+ generate(url + fmtNum(month) + '/' + fmtNum(day) + '/', new Query(dayData), {
131
+ year,
132
+ month,
133
+ day
134
+ })
135
+ }
136
+ }
137
+ }
138
+
139
+ return result
140
+ })
141
+ }
@@ -0,0 +1,43 @@
1
+ 'use strict'
2
+ /* global hexo */
3
+
4
+ const merge = require('hexo-util').deepMerge || require('lodash/merge')
5
+ const fs = require('hexo-fs')
6
+ const path = require('path')
7
+ const yaml = require('js-yaml')
8
+
9
+ hexo.extend.filter.register('before_generate', () => {
10
+ if (hexo.config.theme_config) {
11
+ hexo.theme.config = merge(hexo.theme.config, hexo.config.theme_config)
12
+ }
13
+
14
+ const data = hexo.locals.get('data')
15
+
16
+ if (data.languages) {
17
+ const { language } = hexo.config
18
+ const { i18n } = hexo.theme
19
+
20
+ const mergeLang = lang => {
21
+ if (data.languages[lang]) { i18n.set(lang, merge(i18n.get([lang]), data.languages[lang])) }
22
+ }
23
+
24
+ for (const lang of ['en', 'ja', 'zh-CN', 'zh-HK', 'zh-TW']) {
25
+ mergeLang(lang)
26
+ }
27
+ }
28
+
29
+ hexo.theme.config.style = {}
30
+
31
+ for (const style of ['iconfont', 'colors', 'custom']) {
32
+ const custom_file = 'source/_data/' + style + '.styl'
33
+ if (fs.existsSync(custom_file)) {
34
+ hexo.theme.config.style[style] = path.resolve(hexo.base_dir, custom_file)
35
+ }
36
+ }
37
+
38
+ if (data.images && data.images.length > 6) {
39
+ hexo.theme.config.image_list = data.images
40
+ } else {
41
+ hexo.theme.config.image_list = yaml.load(fs.readFileSync(path.join(__dirname, '../../_images.yml')))
42
+ }
43
+ })
@@ -0,0 +1,26 @@
1
+ /* global hexo */
2
+ 'use strict'
3
+
4
+ const fs = require('hexo-fs')
5
+
6
+ hexo.extend.generator.register('images', function (locals) {
7
+ const config = hexo.config
8
+ const theme = hexo.theme.config
9
+ const dir = 'source/_data/' + theme.assets + '/'
10
+
11
+ if (!fs.existsSync(dir)) { return }
12
+
13
+ const result = []
14
+ const files = fs.listDirSync(dir)
15
+
16
+ files.forEach((file) => {
17
+ result.push({
18
+ path: theme.assets + '/' + file,
19
+ data: function () {
20
+ return fs.createReadStream(dir + file)
21
+ }
22
+ })
23
+ })
24
+
25
+ return result
26
+ })
@@ -0,0 +1,110 @@
1
+ /* global hexo */
2
+ 'use strict'
3
+
4
+ const fs = require('hexo-fs')
5
+ const pagination = require('hexo-pagination')
6
+
7
+ hexo.config.index_generator = Object.assign({
8
+ per_page: typeof hexo.config.per_page === 'undefined' ? 10 : hexo.config.per_page,
9
+ order_by: '-date'
10
+ }, hexo.config.index_generator)
11
+
12
+ hexo.extend.generator.register('index', function (locals) {
13
+ const covers = []
14
+ const catlist = []
15
+ let pages
16
+ const config = hexo.config
17
+ const theme = hexo.theme.config
18
+ const sticky = locals.posts.find({ sticky: true }).sort(config.index_generator.order_by)
19
+ const posts = locals.posts.find({ sticky: { $exists: false } }).sort(config.index_generator.order_by)
20
+ const paginationDir = config.pagination_dir || 'page'
21
+ const path = config.index_generator.path || ''
22
+ const categories = locals.categories
23
+
24
+ const getTopcat = function (cat) {
25
+ if (cat.parent) {
26
+ const pCat = categories.findOne({ _id: cat.parent })
27
+ return getTopcat(pCat)
28
+ } else {
29
+ return cat
30
+ }
31
+ }
32
+
33
+ if (categories && categories.length) {
34
+ categories.forEach((cat) => {
35
+ const cover = `source/_posts/${cat.slug}`
36
+ if (fs.existsSync(cover + '/cover.avif')) {
37
+ covers.push({
38
+ path: cat.slug + '/cover.avif',
39
+ data: function () {
40
+ return fs.createReadStream(cover + '/cover.avif')
41
+ }
42
+ })
43
+ } else if (fs.existsSync(cover + '/cover.webp')) {
44
+ covers.push({
45
+ path: cat.slug + '/cover.webp',
46
+ data: function () {
47
+ return fs.createReadStream(cover + '/cover.webp')
48
+ }
49
+ })
50
+ } else if (fs.existsSync(cover + '/cover.jpg')) {
51
+ covers.push({
52
+ path: cat.slug + '/cover.jpg',
53
+ data: function () {
54
+ return fs.createReadStream(cover + '/cover.jpg')
55
+ }
56
+ })
57
+
58
+ const topcat = getTopcat(cat)
59
+
60
+ if (topcat._id !== cat._id) {
61
+ cat.top = topcat
62
+ }
63
+
64
+ const child = categories.find({ parent: cat._id })
65
+ let pl = 6
66
+
67
+ if (child.length !== 0) {
68
+ cat.child = child.length
69
+ cat.subs = child.sort({ name: 1 }).limit(6).toArray()
70
+ pl = Math.max(0, pl - child.length)
71
+ if (pl > 0) {
72
+ // eslint-disable-next-line array-callback-return
73
+ cat.subs.push.apply(cat.subs, cat.posts.sort({ title: 1 }).filter(function (item, i) {
74
+ if (item.categories.last()._id === cat._id) { return true }
75
+ }).limit(pl).toArray())
76
+ }
77
+ } else {
78
+ cat.subs = cat.posts.sort({ title: 1 }).limit(6).toArray()
79
+ }
80
+
81
+ catlist.push(cat)
82
+ }
83
+ })
84
+ }
85
+
86
+ if (posts.length > 0) {
87
+ pages = pagination(path, posts, {
88
+ perPage: config.index_generator.per_page,
89
+ layout: ['index', 'archive'],
90
+ format: paginationDir + '/%d/',
91
+ data: {
92
+ __index: true,
93
+ catlist,
94
+ sticky
95
+ }
96
+ })
97
+ } else {
98
+ pages = [{
99
+ path,
100
+ layout: ['index', 'archive'],
101
+ data: {
102
+ __index: true,
103
+ catlist,
104
+ sticky
105
+ }
106
+ }]
107
+ }
108
+
109
+ return [...covers, ...pages]
110
+ })
@@ -0,0 +1,19 @@
1
+ /* global hexo */
2
+ 'use strict'
3
+
4
+ hexo.extend.generator.register('pages', function (locals) {
5
+ const config = hexo.config
6
+
7
+ return [
8
+ {
9
+ path: config.category_dir + '/index.html',
10
+ data: { type: 'categories' },
11
+ layout: ['page']
12
+ },
13
+ {
14
+ path: config.tag_dir + '/index.html',
15
+ data: { type: 'tags' },
16
+ layout: ['page']
17
+ }
18
+ ]
19
+ })
@@ -0,0 +1,81 @@
1
+ /* global hexo */
2
+ const fs = require('hexo-fs')
3
+ // const url = require('url')
4
+
5
+ hexo.extend.generator.register('script', function (locals) {
6
+ const log = hexo.log || console.log
7
+ const config = hexo.config
8
+ const theme = hexo.theme.config
9
+
10
+ const env = require('../../package.json')
11
+
12
+ const siteConfig = {
13
+ version: env.version,
14
+ hostname: config.url,
15
+ root: config.root,
16
+ statics: theme.statics,
17
+ favicon: {
18
+ normal: theme.assets + '/favicon.ico',
19
+ hidden: theme.assets + '/failure.ico'
20
+ },
21
+ darkmode: theme.darkmode,
22
+ auto_dark: theme.auto_dark,
23
+ auto_scroll: theme.auto_scroll,
24
+ js: {
25
+ chart: theme.vendors.js.chart,
26
+ copy_tex: theme.vendors.js.copy_tex,
27
+ fancybox: theme.vendors.js.fancybox
28
+ },
29
+ css: {
30
+ valine: theme.css + '/comment.css',
31
+ katex: theme.vendors.css.katex,
32
+ mermaid: theme.css + '/mermaid.css',
33
+ fancybox: theme.vendors.css.fancybox
34
+ },
35
+ loader: theme.loader,
36
+ search: null,
37
+ valine: theme.valine,
38
+ outime: {
39
+ enable: theme.outime.enable,
40
+ days: theme.outime.days
41
+ },
42
+ quicklink: {
43
+ timeout: theme.quicklink.timeout,
44
+ priority: theme.quicklink.priority
45
+ }
46
+ }
47
+
48
+ if (config?.algolia) {
49
+ siteConfig.search = {
50
+ appID: config.algolia.appId,
51
+ apiKey: config.algolia.apiKey,
52
+ indexName: config.algolia.indexName,
53
+ hits: theme.search.hits
54
+ }
55
+ }
56
+
57
+ if (theme?.audio) {
58
+ siteConfig.audio = theme.audio
59
+ }
60
+
61
+ let text = '';
62
+
63
+ ['library', 'global', 'page', 'vue', 'components'].forEach(function (item) {
64
+ text += fs.readFileSync(`themes/shokaX/source/js/_app/${item}.js`).toString()
65
+ })
66
+ if (!theme.experiments?.noPlayer) {
67
+ text += fs.readFileSync('themes/shokaX/source/js/_app/player.js').toString()
68
+ }
69
+ if (theme.fireworks && theme.fireworks.enable) {
70
+ siteConfig.fireworks = theme.fireworks.color || ['rgba(255,182,185,.9)', 'rgba(250,227,217,.9)', 'rgba(187,222,214,.9)', 'rgba(138,198,209,.9)']
71
+ }
72
+
73
+ text = 'const CONFIG = ' + JSON.stringify(siteConfig) + ';' + text
74
+ const result = hexo.render.renderSync({ text, engine: 'js' })
75
+ return {
76
+ path: theme.js + '/app.js',
77
+ data: function () {
78
+ return result
79
+ }
80
+ }
81
+ })