hexo-theme-shokax 0.0.1-alpha4 → 0.0.1-alpha6

Sign up to get free protection for your applications and to get access to all the features.
package/LICENSE CHANGED
@@ -1,21 +1,28 @@
1
- MIT License
1
+ BSD 3-Clause License
2
2
 
3
- Copyright (c) 2022 zkz098
3
+ Copyright (c) 2022, zkz098
4
4
 
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
5
+ Redistribution and use in source and binary forms, with or without
6
+ modification, are permitted provided that the following conditions are met:
11
7
 
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
8
+ 1. Redistributions of source code must retain the above copyright notice, this
9
+ list of conditions and the following disclaimer.
14
10
 
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
11
+ 2. Redistributions in binary form must reproduce the above copyright notice,
12
+ this list of conditions and the following disclaimer in the documentation
13
+ and/or other materials provided with the distribution.
14
+
15
+ 3. Neither the name of the copyright holder nor the names of its
16
+ contributors may be used to endorse or promote products derived from
17
+ this software without specific prior written permission.
18
+
19
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
23
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
25
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
27
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
package/README.md CHANGED
@@ -4,8 +4,9 @@
4
4
  ![stars](https://img.shields.io/github/stars/zkz098/hexo-theme-shokaX)
5
5
  ![version](https://shields.io/npm/v/hexo-theme-shokax)
6
6
 
7
- 此项目是shoka的一个魔改版,致力于提高性能和优化魔改体验 \
8
- 本项目处于高强度开发期,但github仓库版本已基本可用 \s
7
+ 此项目是shoka的一个二次开发版(算精神续作),致力于提高性能和优化魔改体验 \
8
+ 诞生原因是目前shoka已经两年没有更新了,积压了大量BUG和功能请求。\
9
+ 本项目处于高强度开发期,但github仓库版本已基本可用 \
9
10
  二次开发与常见问题请看wiki
10
11
 
11
12
  ## 待办名单
@@ -16,20 +17,25 @@
16
17
  - [x] 注入js和css支持
17
18
  - [x] 自定义font
18
19
  - [x] 部分功能调整为可关闭
19
- - [ ] 重构lib方法(长期计划)
20
- - [ ] 异步化js
21
-
22
- ## 已于从shoka迁移吗?
23
- 很容易,只需要调整shoka的部分配置,并重新安装渲染器就行
24
-
25
- ## 以前的魔改呢?
26
- 这个比较难解决,因为shokaX对编写语言进行了更改:
27
- - javascript -> typescript
28
- - njk -> pug
29
- 因此需要更改编写的语言
20
+ - [ ] 插件系统
21
+
22
+ ## 和shoka的区别
23
+ 原先shoka使用了javascript+Native+nunjucks的技术 \
24
+ 而shokaX则使用了typescript+Vue 3+Pug的技术搭配 \
25
+ 图标库可能会更换为Font Awesome 6 \
26
+ 更改了大量难以访问的CDN链接
27
+
28
+ ## 如何安装?
29
+ 建议使用[ShokaX-CLI](https://github.com/zkz098/shokaX-CLI) ,执行下列命令即可:
30
+ ```bash
31
+ npm i shokax-cli --location=global
32
+ # hexo init 初始化环境
33
+ SXC install shokaX
34
+ ```
30
35
 
31
36
  # 许可证
32
- 许可证: MIT \
37
+ 许可证: BSD-3-Clause \
38
+ 请注意: `0.0.1-alpha6`版本开始,shokaX使用BSD协议,这意味着删除页脚处的shokaX标识是违反许可证的
33
39
  [![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fzkz098%2Fhexo-theme-shokaX.svg?type=large)](https://app.fossa.com/projects/git%2Bgithub.com%2Fzkz098%2Fhexo-theme-shokaX?ref=badge_large)
34
40
 
35
41
  # 致谢名单
@@ -29,3 +29,90 @@ block content
29
29
  != `${page.month}${__('symbol.month')}`
30
30
  small
31
31
  != __('title.archive')
32
+ else if is_year()
33
+ a(href=url_for(config.archive_dir))
34
+ != __('title.all')
35
+ small /
36
+ != page.year + __('symbol.year')
37
+ small
38
+ != __('title.archive')
39
+ else
40
+ a(href=url_for(site.path))
41
+ != __('menu.home')
42
+ small /
43
+ - var posts_length = site.posts.length,cheers
44
+ if posts_length > 210
45
+ - cheers = 'excellent'
46
+ else if posts_length > 130
47
+ - cheers = 'great'
48
+ else if posts_length > 80
49
+ - cheers = 'good'
50
+ else if posts_length > 50
51
+ - cheers = 'nice'
52
+ else if posts_length > 30
53
+ - cheers = 'ok'
54
+ else
55
+ - cheers = 'um'
56
+ != _p('counter.archive_posts', site.posts.length)
57
+ small(class="cheers")
58
+ != __('cheers.' + cheers)
59
+ != ' '
60
+ != __('keep_on')
61
+
62
+ - var current_year = '1970'
63
+ - var current_month = '01'
64
+ - var count_post = 1
65
+ each post in page.posts.toArray()
66
+ - var year = date(post.date, 'YYYY')
67
+ - var month = date(post.date, 'MM')
68
+ if !is_year()
69
+ if year !== current_year || month !== current_month
70
+ if current_year !== '1970'
71
+ small (#{count_post})
72
+ </h3>
73
+ <h3 class="item section">
74
+ a(href=url_for(config.archive_dir + '/' + year )) #{year} #{__('symbol.year')}
75
+ small /
76
+ a(href=url_for(config.archive_dir + '/' + year + '/' + month)) #{ month } #{__('symbol.month')}
77
+ - current_year = year
78
+ - current_month = month
79
+ - count_post = 1
80
+ else
81
+ - count_post = count_post + 1
82
+ else
83
+ if year !== current_year && !is_year()
84
+ - current_year = year
85
+ h3(class="item section")
86
+ a(href=url_for(config.archive_dir + '/' + year )) #{ year } #{__('symbol.year')}
87
+ if month !== current_month && is_year() && !is_month()
88
+ - current_month = month
89
+ h3(class="item section")
90
+ a(href=url_for(config.archive_dir + '/' + year + '/' + month)) #{ month } #{__('symbol.month')}
91
+ article(class="item normal" itemscope itemtype="http://schema.org/Article")
92
+ div(class="meta")
93
+ time(
94
+ itemprop="dateCreated"
95
+ datetime=moment(post.date).format()
96
+ content=date(post.date, config.date_format)
97
+ ) #{date(post.date, 'MM-DD')}
98
+ if post.categories && post.categories.length
99
+ - var cat_length = post.categories.length
100
+ each cat,index in post.categories.toArray()
101
+ if index == cat_length && cat.name !== page.category
102
+ span
103
+ a(href=url_for(cat.path)) #{cat.name}
104
+ div(class="title")
105
+ if post.link
106
+ - var postTitleIcon = '<i class="ic i-link-alt"></i>'
107
+ - var postText = post.title || post.link
108
+ != _url(post.link, postText + postTitleIcon, {class: 'external', itemprop: 'url'})
109
+ else
110
+ - var postTitle = post.title || __('post.untitled')
111
+ a(href=url_for(post.path) itemprop="url")
112
+ span(itemprop="name") #{postTitle}
113
+ if !is_year()
114
+ small (#{count_post})
115
+ </h3>
116
+
117
+ include _partials/pagination.pug
118
+
@@ -11,15 +11,13 @@ block content
11
11
  div(class="collapse wrap")
12
12
  - var prev = _category_prev(page.category)
13
13
  h2(class="item header")
14
- a(href=url_for(config.category_dir))
15
- != __('title.all')
14
+ a(href=url_for(config.category_dir)) #{__('title.all')}
16
15
  if prev
17
16
  small /
18
17
  != prev
19
18
  small /
20
19
  != page.title
21
- small
22
- != __('title.category')
20
+ small #{__('title.category')}
23
21
  - var posts = page.posts
24
22
  - var current = "c"
25
23
  - var lastcat = ""
@@ -40,7 +38,7 @@ block content
40
38
  if index >= post.categories.toArray().length
41
39
  != cat.length
42
40
  else
43
- != "/"
41
+ #{'/'}
44
42
  - var lastcatslug = lastcatslug + cat.slug
45
43
  if lastcat && lastcatslug && lastcatslug !== current
46
44
  h3(class="item section")
@@ -52,8 +50,7 @@ block content
52
50
  itemprop="dateCreated"
53
51
  datetime=moment(post.date).format()
54
52
  content=date(post.date, config.date_format)
55
- )
56
- != date(post.date, 'MM-DD')
53
+ ) #{date(post.date, 'MM-DD')}
57
54
  div(class="title")
58
55
  if post.link
59
56
  - var postTitleIcon = '<i class="ic i-link-alt"></i>'
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hexo-theme-shokax",
3
- "version": "0.0.1-alpha4",
3
+ "version": "0.0.1-alpha6",
4
4
  "description": "a hexo theme based on shoka",
5
5
  "main": "index.js",
6
6
  "repository": "https://github.com/zkz098/hexo-theme-shokaX",
@@ -35,7 +35,7 @@ hexo.extend.filter.register('before_generate', () => {
35
35
  }
36
36
  }
37
37
 
38
- if (data.images && data.images.length > 6) {
38
+ if (data.images && data.images.length >= 6) {
39
39
  hexo.theme.config.image_list = data.images
40
40
  } else {
41
41
  hexo.theme.config.image_list = yaml.load(fs.readFileSync(path.join(__dirname, '../../_images.yml')))
@@ -61,10 +61,18 @@ hexo.extend.generator.register('script', function (locals) {
61
61
  let text = '';
62
62
 
63
63
  ['library', 'global', 'page', 'vue', 'components'].forEach(function (item) {
64
- text += fs.readFileSync(`themes/shokaX/source/js/_app/${item}.js`).toString()
64
+ if (fs.existsSync(`themes/shokaX/source/js/_app/${item}.js`)) {
65
+ text += fs.readFileSync(`themes/shokaX/source/js/_app/${item}.js`).toString()
66
+ } else {
67
+ text += fs.readFileSync(`node_modules/hexo-theme-shokax/source/js/_app/${item}.js`).toString()
68
+ }
65
69
  })
66
70
  if (!theme.experiments?.noPlayer) {
67
- text += fs.readFileSync('themes/shokaX/source/js/_app/player.js').toString()
71
+ if (fs.existsSync('themes/shokaX/source/js/_app/player.js')) {
72
+ text += fs.readFileSync('themes/shokaX/source/js/_app/player.js').toString()
73
+ } else {
74
+ text += fs.readFileSync('node_modules/hexo-theme-shokax/source/js/_app/player.js').toString()
75
+ }
68
76
  }
69
77
  if (theme.fireworks && theme.fireworks.enable) {
70
78
  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)']
@@ -1,58 +1,6 @@
1
1
  /* global hexo */
2
- 'use strict'
3
2
 
4
- /** @type {Map<string, string[]>} */
5
- const insertions = new Map()
6
- class TemplateBlock {
7
- constructor (text, type = 'raw') {
8
- this.text = text
9
- this.type = type
10
- this.result = ''
11
- }
12
-
13
- render () {
14
- if (this.type === 'raw' || this.type === 'html') {
15
- this.result = this.text
16
- }
17
- this.result = hexo.render.renderSync({ text: this.text, engine: this.type })
18
- }
19
-
20
- repalceTag (...tag) {
21
- tag.forEach((item) => {
22
- this.text = this.text.replace(item.tag, item.value)
23
- })
24
- }
25
-
26
- insert (location) {
27
- if (insertions.get(location)) {
28
- insertions.get(location).push(this.result)
29
- } else {
30
- insertions.set(location, [])
31
- }
32
- }
33
- }
34
-
35
- const toolpack = {
36
- TemplateBlock
37
- }
38
-
39
- hexo.extend.helper.register('insert_footer', () => {
40
- if (hexo.theme.config?.plugin?.enable && insertions.get('footer')) {
41
- let res = ''
42
- insertions.get('footer').forEach((item) => {
43
- res += item
44
- })
45
- return res
46
- }
47
- })
48
-
49
- if (hexo.theme.config?.plugin?.enable) {
50
- hexo.theme.config.plugin.load.forEach((item) => {
51
- const p = require(item)
52
- console.log(p)
53
- if (p.prepare) {
54
- p.prepare(hexo, this)
55
- }
56
- p.main(hexo, this, toolpack)
57
- })
58
- }
3
+ // hexo.on('generateBefore', () => {
4
+ // // 加载`theme_injects`过滤器
5
+ // require('./lib/injects')(hexo);
6
+ // });
@@ -0,0 +1,20 @@
1
+ 'use strict'
2
+
3
+ module.exports = {
4
+ views: [
5
+ 'head',
6
+ 'header',
7
+ 'sidebar',
8
+ 'rightNav',
9
+ 'postMeta',
10
+ 'postBodyEnd',
11
+ 'footer',
12
+ 'bodyEnd',
13
+ 'comment'
14
+ ],
15
+ styles: [
16
+ 'variable',
17
+ 'mixin',
18
+ 'style'
19
+ ]
20
+ }
@@ -0,0 +1,88 @@
1
+ 'use strict'
2
+
3
+ const fs = require('fs')
4
+ const path = require('path')
5
+ const points = require('./injects-point')
6
+ const defaultExtname = '.pug'
7
+
8
+ // Defining stylus types
9
+ class StylusInject {
10
+ constructor (base_dir) {
11
+ this.base_dir = base_dir
12
+ this.files = []
13
+ }
14
+
15
+ push (file) {
16
+ // Get absolute path base on hexo dir
17
+ this.files.push(path.resolve(this.base_dir, file))
18
+ }
19
+ }
20
+
21
+ // Defining view types
22
+ class ViewInject {
23
+ constructor (base_dir) {
24
+ this.base_dir = base_dir
25
+ this.raws = []
26
+ }
27
+
28
+ raw (name, raw, ...args) {
29
+ // Set default extname
30
+ if (path.extname(name) === '') {
31
+ name += defaultExtname
32
+ }
33
+ this.raws.push({ name, raw, args })
34
+ }
35
+
36
+ file (name, file, ...args) {
37
+ // Set default extname from file's extname
38
+ if (path.extname(name) === '') {
39
+ name += path.extname(file)
40
+ }
41
+ // Get absolute path base on hexo dir
42
+ this.raw(name, fs.readFileSync(path.resolve(this.base_dir, file), 'utf8'), ...args)
43
+ }
44
+ }
45
+
46
+ // Init injects
47
+ function initInject (base_dir) {
48
+ const injects = {}
49
+ points.styles.forEach(item => {
50
+ injects[item] = new StylusInject(base_dir)
51
+ })
52
+ points.views.forEach(item => {
53
+ injects[item] = new ViewInject(base_dir)
54
+ })
55
+ return injects
56
+ }
57
+
58
+ module.exports = (hexo) => {
59
+ // Exec theme_inject filter
60
+ const injects = initInject(hexo.base_dir)
61
+ hexo.execFilterSync('theme_inject', injects)
62
+ hexo.theme.config.injects = {}
63
+
64
+ // Inject stylus
65
+ points.styles.forEach(type => {
66
+ hexo.theme.config.injects[type] = injects[type].files
67
+ })
68
+
69
+ // Inject views
70
+ points.views.forEach(type => {
71
+ const configs = Object.create(null)
72
+ hexo.theme.config.injects[type] = []
73
+ // Add or override view.
74
+ injects[type].raws.forEach((injectObj, index) => {
75
+ const name = `inject/${type}/${injectObj.name}`
76
+ hexo.theme.setView(name, injectObj.raw)
77
+ configs[name] = {
78
+ layout: name,
79
+ locals: injectObj.args[0],
80
+ options: injectObj.args[1],
81
+ order: injectObj.args[2] || index
82
+ }
83
+ })
84
+ // Views sort.
85
+ hexo.theme.config.injects[type] = Object.values(configs)
86
+ .sort((x, y) => x.order - y.order)
87
+ })
88
+ }