hexo-theme-solitude 1.6.1 → 1.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/README.md +1 -1
  2. package/README_zh-cn.md +1 -1
  3. package/README_zh-tw.md +1 -1
  4. package/SECURITY.md +5 -5
  5. package/_config.yml +30 -15
  6. package/languages/en.yml +20 -2
  7. package/languages/zh-CN.yml +25 -1
  8. package/languages/zh-TW.yml +25 -1
  9. package/layout/category.pug +1 -1
  10. package/layout/includes/console.pug +8 -7
  11. package/layout/includes/head/config.pug +66 -40
  12. package/layout/includes/inject/body.pug +7 -3
  13. package/layout/includes/inject/head.pug +35 -1
  14. package/layout/includes/widgets/post/copyright.pug +5 -5
  15. package/layout/includes/widgets/post/postMeta.pug +8 -1
  16. package/layout/includes/widgets/third-party/comments/comment.pug +5 -7
  17. package/layout/includes/widgets/third-party/comments/valine.pug +44 -0
  18. package/layout/includes/widgets/third-party/comments/waline.pug +40 -12
  19. package/layout/includes/widgets/third-party/news-comment/newest-comment.pug +5 -3
  20. package/layout/includes/widgets/third-party/news-comment/twikoo.pug +12 -10
  21. package/layout/includes/widgets/third-party/news-comment/valine.pug +79 -0
  22. package/layout/includes/widgets/third-party/news-comment/waline.pug +25 -20
  23. package/layout/page.pug +3 -0
  24. package/layout/tag.pug +1 -1
  25. package/package.json +1 -1
  26. package/plugins.yml +15 -3
  27. package/scripts/event/cdn.js +7 -2
  28. package/scripts/event/init.js +4 -2
  29. package/scripts/event/merge_config.js +6 -5
  30. package/scripts/helper/related_post.js +2 -2
  31. package/scripts/tags/tabs.js +1 -1
  32. package/source/css/_comments/{index.styl → comment.styl} +4 -24
  33. package/source/css/_comments/valine.styl +245 -0
  34. package/source/css/_global/index.styl +3 -0
  35. package/source/css/_highlight/highlight/index.styl +1 -1
  36. package/source/css/_page/index.styl +1 -4
  37. package/source/css/_post/content.styl +13 -7
  38. package/source/css/_post/copyright.styl +4 -1
  39. package/source/css/index.styl +1 -3
  40. package/source/js/commentBarrage/twikoo.js +4 -4
  41. package/source/js/commentBarrage/valine.js +156 -0
  42. package/source/js/commentBarrage/waline.js +3 -3
  43. package/source/js/main.js +28 -33
  44. package/source/js/third_party/efu_ai.min.js +6 -0
  45. package/source/js/utils.js +14 -1
  46. package/source/css/_comments/waline.styl +0 -455
  47. package/source/js/third_party/sco-ai.min.js +0 -8
@@ -1,17 +1,45 @@
1
- - const { envId, option } = theme.comment.waline
1
+ - const { envId, option ,pageview } = theme.comment.waline
2
+ - const { lazyload, count } = theme.comment
2
3
 
3
4
  script.
4
5
  async function initComment() {
5
- Waline.init(Object.assign({
6
- el: '#comment',
7
- serverURL: '!{envId}',
8
- pageview: !{theme.post.meta.pv},
9
- dark: 'html[data-theme="dark"]',
10
- path: window.location.pathname,
11
- search: false,
12
- comment: #{theme.post.meta.comment && is_post()},
13
- }, !{JSON.stringify(option)}))
6
+ const isLazyLoad = !!{lazyload};
7
+ let walineInitFunction = window.walineFn || null;
14
8
 
15
- GLOBAL_CONFIG.lightbox && utils.lightbox(document.querySelectorAll('#comment .wl-content img:not(.wl-emoji)'))
16
- sco.owoBig()
9
+ async function initWaline(Fn) {
10
+ const walineOptions = {
11
+ el: '#comment',
12
+ serverURL: '!{envId}',
13
+ pageview: !isLazyLoad,
14
+ dark: 'html[data-theme="dark"]',
15
+ path: window.location.pathname,
16
+ comment: !isLazyLoad,
17
+ ...!{JSON.stringify(option)}
18
+ };
19
+ const walineInstance = Fn(walineOptions);
20
+
21
+ utils.addGlobalFn('pjax', () => walineInstance.destroy(), 'destroyWaline');
22
+ }
23
+
24
+ async function loadWalineCSSAndJS() {
25
+ if (!walineInitFunction) {
26
+ await getCSS('!{url_for(theme.cdn.waline_css)}');
27
+ const {init} = await import('!{url_for(theme.cdn.waline_js)}');
28
+ walineInitFunction = init || Waline.init;
29
+ window.walineFn = walineInitFunction;
30
+ }
31
+ initWaline(walineInitFunction);
32
+ }
33
+
34
+ if (isLazyLoad) {
35
+ utils.loadComment(document.getElementById('comment'),loadWalineCSSAndJS);
36
+ } else {
37
+ await loadWalineCSSAndJS();
38
+ }
39
+
40
+ if (GLOBAL_CONFIG.lightbox) {
41
+ utils.lightbox(document.querySelectorAll('#comment .wl-content img:not(.wl-emoji)'));
42
+ }
43
+
44
+ sco.owoBig();
17
45
  }
@@ -1,6 +1,8 @@
1
- if theme.comment.enable && theme.comment.newComment
1
+ if theme.comment.enable && theme.console_plus && theme.comment.newest_comment.enable
2
2
  case theme.comment.type
3
3
  when 'twikoo'
4
- include twikoo
4
+ !=partial('includes/widgets/third-party/news-comment/twikoo',{}, {cache: true})
5
5
  when 'waline'
6
- include waline
6
+ !=partial('includes/widgets/third-party/news-comment/waline',{}, {cache: true})
7
+ when 'valine'
8
+ !=partial('includes/widgets/third-party/news-comment/valine',{}, {cache: true})
@@ -15,12 +15,12 @@ script.
15
15
  return content.length > 150 ? content.substring(0, 150) + '...' : content;
16
16
  }
17
17
 
18
- const getComment = () => {
19
- const $dom = document.querySelector('#card-newest-comments .aside-list')
18
+ const $asideList = document.querySelector('#card-newest-comments .aside-list')
20
19
 
20
+ const getComment = () => {
21
21
  const runTwikoo = () => {
22
22
  twikoo.getRecentComments({
23
- envId: GLOBAL_CONFIG.comment.twikoo.url,
23
+ envId: GLOBAL_CONFIG.comment.url,
24
24
  region: '',
25
25
  pageSize: 6,
26
26
  includeReply: true
@@ -32,18 +32,18 @@ script.
32
32
  'url': `${e.url}#${e.id}`,
33
33
  'date': new Date(e.created).toISOString()
34
34
  }))
35
+ saveToLocal.set('twikoo-newest-comment', JSON.stringify(twikooArray), !{theme.comment.newest_comment.storage}/(60*24))
35
36
  generateHtml(twikooArray)
36
37
  }).catch(function (err) {
37
38
  console.error(err)
38
- $dom.innerHTML = "无法获取评论,请确认相关配置是否正确"
39
+ $asideList.textContent = "!{_p('newest_comment.error')}"
39
40
  })
40
41
  }
41
42
  runTwikoo()
42
43
  }
43
44
 
44
45
  const generateHtml = array => {
45
- const $dom = document.querySelector('#card-newest-comments .aside-list')
46
- $dom.innerHTML = array.length ? array.map(item => `
46
+ $asideList.innerHTML = array.length ? array.map(item => `
47
47
  <div class='aside-list-item'>
48
48
  <a onclick='pjax.loadUrl("${item.url}")' class='thumbnail'>
49
49
  <img src='${item.avatar}' alt='${item.nick}'>
@@ -54,15 +54,17 @@ script.
54
54
  <time class="datetime" datetime="${item.date}"></time>
55
55
  </div>
56
56
  </div>
57
- `).join('') : '没有评论'
57
+ `).join('') : "!{_p('newest_comment.zero')}"
58
58
  window.lazyLoadInstance && window.lazyLoadInstance.update()
59
- window.pjax && window.pjax.refresh($dom)
59
+ window.pjax && window.pjax.refresh()
60
60
  utils && utils.changeTimeFormat()
61
61
  }
62
62
 
63
63
  const newestCommentInit = () => {
64
- const $asideList = document.querySelector('#card-newest-comments .aside-list')
65
- if ($asideList) {
64
+ const data = saveToLocal.get('twikoo-newest-comment')
65
+ if (data) {
66
+ generateHtml(JSON.parse(data))
67
+ } else {
66
68
  getComment()
67
69
  }
68
70
  }
@@ -0,0 +1,79 @@
1
+ script.
2
+ window.addEventListener('load', () => {
3
+ const changeContent = (content) => {
4
+ if (content === '') return content;
5
+
6
+ const replacements = [
7
+ {regex: /<img.*?src="(.*?)"?[^\>]+>/ig, replacement: '[Image]'},
8
+ {regex: /<a[^>]+?href=["']?([^"']+)["']?[^>]*>([^<]+)<\/a>/gi, replacement: '[URL]'},
9
+ {regex: /```[\s\S]*?```/g, replacement: '[Code]'},
10
+ {regex: /<[^>]+>/g, replacement: ""}
11
+ ];
12
+
13
+ content = replacements.reduce((str, {regex, replacement}) => str.replace(regex, replacement), content);
14
+
15
+ return content.length > 150 ? content.substring(0, 150) + '...' : content;
16
+ }
17
+
18
+ const $asideList = document.querySelector('#card-newest-comments .aside-list')
19
+ const newestCommentInit = () => {
20
+ const data = saveToLocal.get('valine-newest-comment')
21
+ if (data) {
22
+ generateHtml(JSON.parse(data))
23
+ } else {
24
+ getComment()
25
+ }
26
+ }
27
+
28
+ const getComment = async () => {
29
+ try {
30
+ const settings = {
31
+ "method": "GET",
32
+ "headers": {
33
+ "X-LC-Id": '!{theme.comment.valine.appId}',
34
+ "X-LC-Key": '!{theme.comment.valine.appKey}',
35
+ "Content-Type": "application/json"
36
+ },
37
+ }
38
+
39
+ const res = await fetch('!{theme.comment.valine.serverURLs}/1.1/classes/Comment?limit=8&order=-createdAt', settings)
40
+ const result = await res.json()
41
+ window.res = result
42
+ const valineArray = result.results.map(e => {
43
+ return {
44
+ 'content': changeContent(e.comment),
45
+ 'avatar': '!{theme.comment.avatar}' + '/avatar/' + md5(e.mail.toLowerCase()),
46
+ 'nick': e.nick,
47
+ 'url': e.url + '#' + e.objectId,
48
+ 'date': e.updatedAt || e.createdAt
49
+ }
50
+ })
51
+ saveToLocal.set('valine-newest-comment', JSON.stringify(valineArray), !{theme.comment.newest_comment.storage} / (60 * 24))
52
+ generateHtml(valineArray)
53
+ } catch (err) {
54
+ console.error(err)
55
+ $asideList.textContent = "!{_p('newest_comment.error')}"
56
+ }
57
+ }
58
+
59
+ const generateHtml = array => {
60
+ const $dom = document.querySelector('#card-newest-comments .aside-list')
61
+ $dom.innerHTML = array.length ? array.map(item => `
62
+ <div class='aside-list-item'>
63
+ <a onclick='pjax.loadUrl("${item.url}")' class='thumbnail'>
64
+ <img src='${item.avatar}' alt='${item.nick}'>
65
+ <div class='name'><span>${item.nick}</span></div>
66
+ </a>
67
+ <div class='content'>
68
+ <a class='comment' onclick='pjax.loadUrl("${item.url}")'>${item.content}</a>
69
+ <time class="datetime" datetime="${item.date}"></time>
70
+ </div>
71
+ </div>
72
+ `).join('') : "!{_p('newest_comment.zero')}"
73
+ window.lazyLoadInstance && window.lazyLoadInstance.update()
74
+ window.pjax && window.pjax.refresh()
75
+ utils && utils.changeTimeFormat()
76
+ }
77
+
78
+ newestCommentInit()
79
+ })
@@ -17,28 +17,33 @@ script.
17
17
 
18
18
  const $asideList = document.querySelector('#card-newest-comments .aside-list')
19
19
  const newestCommentInit = () => {
20
- if ($asideList) {
20
+ const data = saveToLocal.get('waline-newest-comment')
21
+ if (data) {
22
+ generateHtml(JSON.parse(data))
23
+ } else {
21
24
  getComment()
22
25
  }
23
26
  }
24
- const getComment = () => {
25
- Waline.RecentComments(
26
- options = {
27
- serverURL: GLOBAL_CONFIG.comment.waline.url,
28
- count: 6,
29
- }
30
- ).then(function (res) {
31
- const walineArray = res.comments.map(item => ({
32
- 'content': changeContent(item.comment),
33
- 'avatar': item.avatar,
34
- 'nick': item.nick,
35
- 'url': `${item.url}#${item.objectId}`,
36
- 'date': new Date(item.insertedAt).toISOString()
37
- }))
27
+
28
+ const getComment = async () => {
29
+ try {
30
+ const res = await fetch('!{theme.comment.waline.envId}/api/comment?type=recent&count=8', {method: 'GET'})
31
+ const result = await res.json()
32
+ const walineArray = result.data.map(e => {
33
+ return {
34
+ 'content': changeContent(e.comment),
35
+ 'avatar': e.avatar,
36
+ 'nick': e.nick,
37
+ 'url': e.url + '#' + e.objectId,
38
+ 'date': e.time || e.insertedAt
39
+ }
40
+ })
41
+ saveToLocal.set('waline-newest-comment', JSON.stringify(walineArray), !{theme.comment.newest_comment.storage} / (60 * 24))
38
42
  generateHtml(walineArray)
39
- }).catch(
40
- $asideList.innerHTML = "无法获取评论,请确认相关配置是否正确"
41
- )
43
+ } catch (err) {
44
+ console.error(err)
45
+ $asideList.textContent = "!{_p('newest_comment.error')}"
46
+ }
42
47
  }
43
48
 
44
49
  const generateHtml = array => {
@@ -54,9 +59,9 @@ script.
54
59
  <time class="datetime" datetime="${item.date}"></time>
55
60
  </div>
56
61
  </div>
57
- `).join('') : '没有评论'
62
+ `).join('') : "!{_p('newest_comment.zero')}"
58
63
  window.lazyLoadInstance && window.lazyLoadInstance.update()
59
- window.pjax && window.pjax.refresh($dom)
64
+ window.pjax && window.pjax.refresh()
60
65
  utils && utils.changeTimeFormat()
61
66
  }
62
67
 
package/layout/page.pug CHANGED
@@ -25,6 +25,9 @@ block content
25
25
  != page.content
26
26
  when 'music'
27
27
  include includes/page/music
28
+ when 'banner'
29
+ include includes/widgets/page/banner
30
+ include includes/page/default
28
31
  default
29
32
  include includes/page/default
30
33
  if page.comment
package/layout/tag.pug CHANGED
@@ -10,7 +10,7 @@ block content
10
10
  | #{tag.name}
11
11
  span.tagsPageCount #{tag.length}
12
12
  .recent-posts#recent-posts
13
- each post in page.posts.find({ parent: { $exists: false } }).data
13
+ each post,index in page.posts.find({ parent: { $exists: false } }).data
14
14
  include includes/widgets/home/postList
15
15
  include includes/mixins/pagination
16
16
  include includes/widgets/aside/aside
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hexo-theme-solitude",
3
- "version": "1.6.1",
3
+ "version": "1.7.1",
4
4
  "description": "A beautiful, powerful, and efficient Hexo theme developed by the wleelw",
5
5
  "main": "package.json",
6
6
  "scripts": {
package/plugins.yml CHANGED
@@ -15,10 +15,18 @@ twikoo:
15
15
  file: dist/twikoo.all.min.js
16
16
  version: 1.6.31
17
17
  waline_js:
18
- name: '@waline/client'
18
+ name: 'waline'
19
19
  file: dist/waline.js
20
20
  other_name: waline
21
- version: 2.15.8
21
+ version: 3.1.3
22
+ waline_css:
23
+ name: 'waline'
24
+ file: dist/waline.css
25
+ version: 3.1.3
26
+ valine:
27
+ name: valine
28
+ file: dist/Valine.min.js
29
+ version: 1.5.1
22
30
  sharejs:
23
31
  name: butterfly-extsrc
24
32
  file: sharejs/dist/js/social-share.min.js
@@ -97,4 +105,8 @@ fancyapps_css:
97
105
  mermaid_js:
98
106
  name: mermaid
99
107
  file: dist/mermaid.min.js
100
- version: 10.8.0
108
+ version: 10.8.0
109
+ blueimp_md5:
110
+ name: blueimp-md5
111
+ file: js/md5.min.js
112
+ version: 2.19.0
@@ -54,9 +54,9 @@ hexo.extend.filter.register('before_generate', () => {
54
54
  file: 'js/tw_cn.js',
55
55
  version
56
56
  },
57
- sco_ai_js: {
57
+ efu_ai: {
58
58
  name: 'hexo-theme-solitude',
59
- file: 'js/third_party/sco-ai.min.js',
59
+ file: 'js/third_party/efu_ai.min.js',
60
60
  version
61
61
  },
62
62
  twikoo_commentBarrage: {
@@ -69,6 +69,11 @@ hexo.extend.filter.register('before_generate', () => {
69
69
  file: 'js/commentBarrage/waline.js',
70
70
  version
71
71
  },
72
+ valine_commentBarrage: {
73
+ name: 'hexo-theme-solitude',
74
+ file: 'js/commentBarrage/valine.js',
75
+ version
76
+ },
72
77
  waterfall: {
73
78
  name: 'hexo-theme-solitude',
74
79
  file: 'js/third_party/waterfall.min.js',
@@ -5,13 +5,15 @@ hexo.extend.filter.register('before_generate', () => {
5
5
  const logger = hexo.log;
6
6
  const config = hexo.config;
7
7
 
8
- if (hexoVer < 6.3) {
9
- logger.error('请把 Hexo 升级到 V6.3.0 或更高的版本!');
8
+ if (hexoVer < 7.0) {
9
+ logger.error('请把 Hexo 升级到 V7.0.0 或更高的版本!');
10
+ logger.error('Please upgrade your Hexo to V7.0.0 or higher!');
10
11
  process.exit(-1);
11
12
  }
12
13
 
13
14
  if (Number(majorVer) < 14) {
14
15
  logger.error('请将 Node.js 升级到 v14.0.0 或更高的版本!');
16
+ logger.error('Please upgrade Node.js to v14.0.0 or later!');
15
17
  process.exit(-1);
16
18
  }
17
19
  });
@@ -129,7 +129,8 @@ hexo.extend.filter.register('before_generate', () => {
129
129
  randompostjs: 'https://cdn.cbd.int/st-source/js/moment/random_post.min.js'
130
130
  }, keyboard: {
131
131
  enable: false, list: []
132
- }, lazyload: {
132
+ }
133
+ ,lazyload: {
133
134
  enable: false, field: 'site', placeholder: '/img/loading.gif', errorimg: '/img/error_load.png'
134
135
  }, loading: {
135
136
  fullpage: false, pace: true,
@@ -150,7 +151,7 @@ hexo.extend.filter.register('before_generate', () => {
150
151
  enable: true,
151
152
  copyright: {
152
153
  enable: false,
153
- limit_count: 50
154
+ limit: 50
154
155
  }
155
156
  }
156
157
  , post_ai: {
@@ -164,7 +165,7 @@ hexo.extend.filter.register('before_generate', () => {
164
165
  enable: false, per_page: false, copytex: false,
165
166
  }, comment: {
166
167
  enable: false,
167
- type: 'twikoo',
168
+ type: '',
168
169
  commentBarrage: false,
169
170
  newComment: false,
170
171
  randomInfoStart: [`baby's`, `little`, `my`,],
@@ -180,8 +181,8 @@ hexo.extend.filter.register('before_generate', () => {
180
181
  font: {
181
182
  'font-size': '16px',
182
183
  'code-font-size': '16px',
183
- 'font-family': '"PingFang SC","Hiragino Sans GB","Microsoft YaHei"',
184
- 'code-font-family': '"monospace", "monospace"',
184
+ 'font-family': 'PingFang SC, Hiragino Sans GB,Microsoft YaHei',
185
+ 'code-font-family': 'monospace, monospace',
185
186
  },
186
187
  extends: {
187
188
  head: [], body: [],
@@ -5,7 +5,7 @@ hexo.extend.helper.register('related_posts', function (currentPost, allPosts) {
5
5
  const config = hexo.theme.config
6
6
  const limitNum = config.related_post.limit || 6
7
7
  const dateType = config.related_post.date_type || 'created'
8
- const headlineLang = this._p('喜欢这篇的人也看了')
8
+ const headlineLang = this._p('star')
9
9
 
10
10
  currentPost.tags.forEach(function (tag) {
11
11
  allPosts.forEach(function (post) {
@@ -36,7 +36,7 @@ hexo.extend.helper.register('related_posts', function (currentPost, allPosts) {
36
36
  relatedPosts.sort(compare('weight', dateType))
37
37
 
38
38
  let result = '<div class="relatedPosts">'
39
- result += `<div class="headline"><i class="solitude st-star-smile-fill"></i><span>${headlineLang}</span><div class="relatedPosts-link"><a onclick="event.preventDefault(); toRandomPost();" href="javascript:void(0);" rel="external nofollow" data-pjax-state="">随便逛逛</a></div></div>`
39
+ result += `<div class="headline"><i class="solitude st-star-smile-fill"></i><span>${headlineLang}</span><div class="relatedPosts-link"><a onclick="event.preventDefault(); toRandomPost();" href="javascript:void(0);" rel="external nofollow" data-pjax-state="">${this._p('random')}</a></div></div>`
40
40
  result += '<div class="relatedPosts-list">'
41
41
 
42
42
  for (let i = 0; i < Math.min(relatedPosts.length, limitNum); i++) {
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Tabs
3
- * from butterfly
3
+ * from solitude
4
4
  */
5
5
 
6
6
  'use strict'
@@ -72,21 +72,6 @@ div#post-comment
72
72
  a:hover
73
73
  color var(--efu-main)
74
74
 
75
- .comment-tips
76
- background-color rgba(103, 194, 58, 0.13)
77
- border var(--style-border-always)
78
- border-color var(--efu-green)
79
- color var(--efu-green)
80
- border-radius 8px
81
- padding 8px 12px
82
- margin-top 0.5rem
83
- display none
84
- width 100%
85
-
86
- &.show
87
- display flex
88
- font-weight 700
89
-
90
75
  blockquote
91
76
  background var(--efu-secondbg)
92
77
  border var(--style-border)
@@ -104,14 +89,6 @@ div#post-comment
104
89
  flex-wrap wrap
105
90
  position relative
106
91
 
107
- .comment-randomInfo
108
- margin-left auto
109
- font-size 13px
110
-
111
- &:hover
112
- a
113
- color var(--efu-theme)
114
-
115
92
  #owo-big
116
93
  position fixed
117
94
  align-items center
@@ -123,4 +100,7 @@ div#post-comment
123
100
  transform translate(0, -105%)
124
101
  overflow hidden
125
102
  animation owoIn .3s cubic-bezier(.42,0,.3,1.11)
126
- padding 1rem
103
+ padding 1rem
104
+
105
+ @import 'twikoo.styl' when hexo-config('comment.type') == 'twikoo'
106
+ @import 'valine.styl' when hexo-config('comment.type') == 'valine'