hexo-theme-solitude 1.11.1 → 1.11.3

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.
package/README.md CHANGED
@@ -15,6 +15,7 @@
15
15
  ![license](https://img.shields.io/github/license/valor-x/hexo-theme-solitude?color=FF5531)
16
16
  [![Stars](https://img.shields.io/github/stars/valor-x/hexo-theme-solitude)](https://github.com/valor-x/hexo-theme-solitude/stargazers)
17
17
  [![NPM all downloads](https://img.shields.io/npm/dy/hexo-theme-solitude?color=white)](https://www.npmjs.com/package/hexo-theme-solitude)
18
+ [![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fvalor-x%2Fhexo-theme-solitude.svg?type=shield)](https://app.fossa.com/projects/git%2Bgithub.com%2Fvalor-x%2Fhexo-theme-solitude?ref=badge_shield)
18
19
 
19
20
  ![hexo version](https://img.shields.io/badge/hexo-7.0.0+-blue?logo=hexo&logoColor=white)
20
21
  ![node version](https://img.shields.io/badge/node-14.0.0-white?logo=node.js&logoColor=white)
@@ -38,7 +39,7 @@
38
39
  [![gitee](https://img.shields.io/badge/Gitee-red?logo=gitee)](https://gitee.com/nsjjd_w/hexo-theme-solitude)
39
40
  [![gitlab](https://img.shields.io/badge/GitLab-blue?logo=gitlab)](https://gitlab.com/efu/hexo-theme-solitude)
40
41
 
41
- [文档 & 预览](https://solitude.js.org/)
42
+ [文档](https://solitude.js.org/)丨[预览](https://www.efu.me/)
42
43
 
43
44
  </div>
44
45
 
@@ -60,7 +61,7 @@
60
61
  - [x] 双评论
61
62
  - [x] 相册
62
63
  - [x] 弹幕留言页
63
- - [ ] 首页顶部新样式
64
+ - [x] 首页顶部新样式
64
65
 
65
66
  > 如有问题请提 [issue](https://github.com/valor-x/hexo-theme-solitude/issues)
66
67
 
@@ -87,4 +88,6 @@
87
88
 
88
89
  ## 版权
89
90
 
90
- [MIT](./LICENSE) License &copy; 2023-至今 [EverFu](https://github.com/efuo)
91
+ [MIT](./LICENSE) License &copy; 2023-至今 [EverFu](https://github.com/efuo)
92
+
93
+ [![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fvalor-x%2Fhexo-theme-solitude.svg?type=large)](https://app.fossa.com/projects/git%2Bgithub.com%2Fvalor-x%2Fhexo-theme-solitude?ref=badge_large)
package/README_en-US.md CHANGED
@@ -38,7 +38,7 @@
38
38
  [![gitee](https://img.shields.io/badge/Gitee-red?logo=gitee)](https://gitee.com/nsjjd_w/hexo-theme-solitude)
39
39
  [![gitlab](https://img.shields.io/badge/GitLab-blue?logo=gitlab)](https://gitlab.com/efu/hexo-theme-solitude)
40
40
 
41
- [Documentation & Preview](https://solitude.js.org/)
41
+ [Documentation](https://solitude.js.org/)丨[Preview](https://www.efu.me/)
42
42
 
43
43
  </div>
44
44
 
@@ -87,4 +87,4 @@ Check out the [Documentation](https://solitude.js.org/) for more information.
87
87
 
88
88
  ## License
89
89
 
90
- [MIT](./LICENSE) License &copy; 2023-PRESENT [EverFu](https://github.com/efuo)
90
+ [MIT](./LICENSE) License &copy; 2023-PRESENT [EverFu](https://github.com/efuo)
package/README_zh-Hant.md CHANGED
@@ -38,7 +38,7 @@
38
38
  [![gitee](https://img.shields.io/badge/Gitee-red?logo=gitee)](https://gitee.com/nsjjd_w/hexo-theme-solitude)
39
39
  [![gitlab](https://img.shields.io/badge/GitLab-blue?logo=gitlab)](https://gitlab.com/efu/hexo-theme-solitude)
40
40
 
41
- [文档 & 預覽](https://solitude.js.org/)
41
+ [文档](https://solitude.js.org/)丨[預覽](https://www.efu.me/)
42
42
 
43
43
  </div>
44
44
 
@@ -85,4 +85,4 @@
85
85
 
86
86
  ## 版權
87
87
 
88
- [MIT](./LICENSE) License &copy; 2023-至今 [Efu](https://github.com/efuo)
88
+ [MIT](./LICENSE) License &copy; 2023-至今 [Efu](https://github.com/efuo)
@@ -4,6 +4,7 @@ random: Random
4
4
  upload: 'datetime: '
5
5
  totalk: You don't need to delete blank lines, just type in your comments.
6
6
  loading: Loading...
7
+ day: ' days'
7
8
 
8
9
  theme:
9
10
  dark: Dark
@@ -71,7 +72,7 @@ nav:
71
72
 
72
73
  award:
73
74
  thanks: Thanks
74
- tipping: Tipping
75
+ tipping: Sponsor
75
76
  title: List of appreciation
76
77
 
77
78
  search:
package/languages/en.yml CHANGED
@@ -4,6 +4,7 @@ random: Random
4
4
  upload: 'datetime: '
5
5
  totalk: You don't need to delete blank lines, just type in your comments.
6
6
  loading: Loading...
7
+ day: ' days'
7
8
 
8
9
  theme:
9
10
  dark: Dark
@@ -71,7 +72,7 @@ nav:
71
72
 
72
73
  award:
73
74
  thanks: Thanks
74
- tipping: Tipping
75
+ tipping: Sponsor
75
76
  title: List of appreciation
76
77
 
77
78
  search:
@@ -4,6 +4,7 @@ random: 随便逛逛
4
4
  upload: 发布时间:
5
5
  totalk: 无需删除空行,直接输入评论即可
6
6
  loading: 加载中...
7
+ day: ' 天'
7
8
 
8
9
  # Language: 简体中文
9
10
  theme:
@@ -4,6 +4,7 @@ random: 随便逛逛
4
4
  upload: 發佈時間:
5
5
  totalk: 無需刪除空行,直接輸入評論即可
6
6
  loading: 加載中...
7
+ day: ' 天'
7
8
 
8
9
  # Language: 繁體中文 (台灣)
9
10
  theme:
@@ -73,6 +73,7 @@
73
73
  min: _p('time.min'),
74
74
  month: _p('time.month')
75
75
  },
76
+ day: _p('day'),
76
77
  f12: _p('f12'),
77
78
  totalk: _p('totalk')
78
79
  }
@@ -27,7 +27,7 @@ include ../head/pwa.pug
27
27
 
28
28
  script.
29
29
  console.log(
30
- "%c Program: Hexo %c Theme: Solitude %c Version: v1.11.1",
30
+ "%c Program: Hexo %c Theme: Solitude %c Version: v1.11.3",
31
31
  "border-radius:5px 0 0 5px;padding: 5px 10px;color:white;background:#ff3842;",
32
32
  "padding: 5px 10px;color:white;background:#3e9f50;",
33
33
  "padding: 5px 10px;color:white;background:#0084ff;border-radius:0 5px 5px 0",
@@ -1,5 +1,5 @@
1
1
  - const { server, site, option } = theme.artalk
2
- - const { lazyload, count ,use} = theme.comment
2
+ - const { lazyload ,use} = theme.comment
3
3
 
4
4
  script.
5
5
  (() => {
@@ -10,7 +10,7 @@ script.
10
10
  server: '!{server}',
11
11
  site: "!{site}",
12
12
  pageKey: location.pathname,
13
- darkMode: document.documentElement.getAttribute('data-theme') === 'dark',
13
+ darkMode: document.documentElement.getAttribute('data-theme') === 'dark'
14
14
  }, !{JSON.stringify(option)})
15
15
  if (GLOBAL_CONFIG.lightbox === 'null') return
16
16
  artalkItem.on('list-loaded', () => {
@@ -23,8 +23,8 @@ script.
23
23
  })
24
24
  const $content = comment.getRender().$content
25
25
  GLOBAL_CONFIG.lightbox && utils.lightbox($content.querySelectorAll('img:not([atk-emoticon])'))
26
- sco.owoBig({body: '.atk-grp', item: '.atk-item'})
27
26
  })
27
+ sco.owoBig({body: '.atk-grp', item: '.atk-item'})
28
28
  !{commentBarrage} && barrageArtalk(array)
29
29
  })
30
30
  const destroyArtalk = () => artalkItem.destroy()
@@ -1,23 +1,32 @@
1
1
  - const { server, site, option } = theme.artalk
2
- - const avatarCdn = option !== null && option.gravatar && option.gravatar.mirror
3
- - const avatarDefault = option !== null && option.gravatar && (option.gravatar.params || option.gravatar.default)
2
+ - const avatarCdn = theme.comment.avatar
4
3
 
5
4
  script.
6
5
  window.addEventListener('load', () => {
7
6
  const changeContent = content => {
8
- if (content === '') return content
7
+ if (content === '') return content;
9
8
  const replacements = [
10
- {regex: /<img.*?src="(.*?)"?[^\>]+>/ig, replacement: '[!{_p("console.newest_comment.image")}]'},
9
+ {
10
+ regex: /<img.*?src="(.*?)"?[^\>]+>/ig,
11
+ replacement: '[!{_p("console.newest_comment.image")}]'
12
+ },
11
13
  {
12
14
  regex: /<a[^>]+?href=["']?([^"']+)["']?[^>]*>([^<]+)<\/a>/gi,
13
15
  replacement: '[!{_p("console.newest_comment.link")}]'
14
16
  },
15
- {regex: /<pre><code>.*?<\/pre>/gi, replacement: '[!{_p("console.newest_comment.code")}]'},
16
- {regex: /<[^>]+>/g, replacement: ''}
17
- ]
18
- content = replacements.reduce((str, {regex, replacement}) => str.replace(regex, replacement), content)
19
- return content.length > 150 ? content.substring(0, 150) + '...' : content
20
- }
17
+ {
18
+ regex: /<pre><code>.*?<\/pre>/gi,
19
+ replacement: '[!{_p("console.newest_comment.code")}]'
20
+ },
21
+ {
22
+ regex: /<[^>]+>/g,
23
+ replacement: ''
24
+ }
25
+ ];
26
+ content = replacements.reduce((str, {regex, replacement}) => str.replace(regex, replacement), content);
27
+ return content.length > 150 ? content.substring(0, 150) + '...' : content;
28
+ };
29
+
21
30
  const generateHtml = (array, asideList) => {
22
31
  asideList.innerHTML = array.length ? array.map(item => `
23
32
  <div class='aside-list-item'>
@@ -30,58 +39,56 @@ script.
30
39
  <time class="datetime" datetime="${item.date}"></time>
31
40
  </div>
32
41
  </div>
33
- `).join('') : "!{_p('newest_comment.zero')}"
34
- window.lazyLoadInstance?.update()
35
- window.pjax?.refresh()
36
- sco?.changeTimeFormat(document.querySelectorAll('.aside-list-item time'))
37
- }
42
+ `).join('') : "!{_p('newest_comment.zero')}";
43
+ window.lazyLoadInstance?.update();
44
+ window.pjax?.refresh();
45
+ sco?.changeTimeFormat(document.querySelectorAll('.aside-list-item time'));
46
+ };
38
47
 
39
48
  const getSetting = async () => {
40
49
  try {
41
- const res = await fetch('!{server}/api/v2/conf', {method: 'GET'})
42
- return await res.json()
50
+ const res = await fetch('!{server}/api/v2/conf', {method: 'GET'});
51
+ return await res.json();
43
52
  } catch (e) {
44
- console.error(e)
45
- return null
53
+ console.error(e);
54
+ return null;
46
55
  }
47
- }
56
+ };
48
57
 
49
58
  const getComment = async (asideList) => {
50
- const searchParams = new URLSearchParams({'site_name': "!{site}", 'limit': '6'})
59
+ const searchParams = new URLSearchParams({'site_name': "!{site}", 'limit': '6'});
51
60
  await fetch(`!{server}/api/v2/stats/latest_comments?${searchParams}`, {method: 'GET'}).then(async res => {
52
- const result = await res.json()
53
- const avatarConfig = await getSetting()
54
- const {mirror, params, default: defaults} = avatarConfig.frontend_conf.gravatar
55
- const avatarCdn = !{avatarCdn} || mirror
56
- let avatarDefault = !{avatarDefault} || params || defaults
57
- avatarDefault = avatarDefault.startsWith('d=') ? avatarDefault : `d=${avatarDefault}`
61
+ const result = await res.json();
62
+ const avatarConfig = await getSetting();
63
+ const avatarCdn = '!{avatarCdn}' + '/avatar/';
64
+ const params = avatarConfig?.gravatar?.params || '';
58
65
  const artalk = result.data.map(e => ({
59
- avatar: `${avatarCdn}${e.email_encrypted}?${avatarDefault}`,
66
+ avatar: avatarCdn + e.email_encrypted + '?' + params,
60
67
  content: changeContent(e.content_marked),
61
68
  nick: e.nick,
62
- url: e.page_key,
69
+ url: e.page_key + `#atk-comment-${e.id}`,
63
70
  date: e.date,
64
- })).slice(0, 6)
65
- utils.saveToLocal.set('artalk-newest-comments', artalk, !{theme.comment.newest_comment.storage})
66
- generateHtml(artalk, asideList)
71
+ })).slice(0, 6);
72
+ utils.saveToLocal.set('artalk-newest-comments', artalk, !{theme.comment.newest_comment.storage});
73
+ generateHtml(artalk, asideList);
67
74
  }).catch(error => {
68
75
  console.error(error);
69
- asideList.textContent = "!{_p('newest_comment.error')}"
70
- })
71
- }
76
+ asideList.textContent = "!{_p('newest_comment.error')}";
77
+ });
78
+ };
72
79
 
73
80
  const newestCommentInit = (asideList) => {
74
- const data = utils.saveToLocal.get('artalk-newest-comments')
81
+ const data = utils.saveToLocal.get('artalk-newest-comments');
75
82
  if (data) {
76
- generateHtml(data, asideList)
83
+ generateHtml(data, asideList);
77
84
  } else {
78
- getComment(asideList)
85
+ getComment(asideList);
79
86
  }
80
- }
87
+ };
81
88
 
82
- const $asideList = document.querySelector('#card-newest-comments .aside-list')
89
+ const $asideList = document.querySelector('#card-newest-comments .aside-list');
83
90
  if ($asideList) {
84
- newestCommentInit($asideList)
85
- utils.addGlobalFn('pjaxComplete', () => newestCommentInit($asideList), 'artalk_newestComment')
91
+ newestCommentInit($asideList);
92
+ utils.addGlobalFn('pjaxComplete', () => newestCommentInit($asideList), 'artalk_newestComment');
86
93
  }
87
94
  });
package/layout/post.pug CHANGED
@@ -3,7 +3,7 @@ extends includes/layout.pug
3
3
  block content
4
4
  main.layout#content-inner
5
5
  #post
6
- if theme.post_ai.enable
6
+ if theme.post_ai.enable && page.ai
7
7
  include includes/widgets/post/post-ai
8
8
  article.post-content#article-container!= page.content
9
9
  include includes/widgets/post/copyright
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hexo-theme-solitude",
3
- "version": "1.11.1",
3
+ "version": "1.11.3",
4
4
  "description": "A beautiful, powerful, and efficient Hexo theme developed by EverFu.",
5
5
  "main": "package.json",
6
6
  "scripts": {
package/plugins.yml CHANGED
@@ -5,7 +5,7 @@ algolia_search:
5
5
  instantsearch:
6
6
  name: instantsearch.js
7
7
  file: dist/instantsearch.production.min.js
8
- version: 4.68.1
8
+ version: 4.70.0
9
9
  pjax:
10
10
  name: pjax
11
11
  file: pjax.min.js
@@ -13,16 +13,16 @@ pjax:
13
13
  twikoo:
14
14
  name: twikoo
15
15
  file: dist/twikoo.all.min.js
16
- version: 1.6.32
16
+ version: 1.6.36
17
17
  waline_js:
18
18
  name: '@waline/client'
19
19
  file: dist/waline.js
20
20
  other_name: waline
21
- version: 3.1.3
21
+ version: 3.2.1
22
22
  waline_css:
23
23
  name: '@waline/client'
24
24
  file: dist/waline.css
25
- version: 3.1.3
25
+ version: 3.2.1
26
26
  other_name: waline
27
27
  valine:
28
28
  name: valine
@@ -110,7 +110,7 @@ fancyapps_css:
110
110
  mermaid_js:
111
111
  name: mermaid
112
112
  file: dist/mermaid.min.js
113
- version: 10.9.0
113
+ version: 10.9.1
114
114
  blueimp_md5:
115
115
  name: blueimp-md5
116
116
  file: js/md5.min.js
@@ -11,6 +11,7 @@ hexo.extend.filter.register('after_post_render', function (data) {
11
11
  data.cover = data.cover || cover[getRandomInt(0, cover?.length)]
12
12
  data.excerpt = data.description || data.excerpt
13
13
  data.toc = !!(config.aside.toc.post && data.toc !== false)
14
+ data.ai = data.ai !== false
14
15
  }
15
16
  if (data.layout === 'page') {
16
17
  let {cover} = hexo.theme.config.page.default
@@ -49,7 +49,7 @@
49
49
  position relative
50
50
  overflow hidden
51
51
  margin-top .5rem
52
- padding 1rem 1.2rem
52
+ padding .5rem .7rem
53
53
 
54
54
  &:hover
55
55
  box-shadow var(--efu-shadow-border)
@@ -10,7 +10,6 @@
10
10
  background 0 center
11
11
 
12
12
  #nav
13
- z-index 998
14
13
  transition .3s
15
14
  background var(--efu-card-bg)
16
15
 
@@ -187,7 +186,6 @@
187
186
  #nav
188
187
  position fixed
189
188
  top 0
190
- z-index 103
191
189
  transition .3s
192
190
  box-shadow none
193
191
  background var(--efu-card-bg)
@@ -287,7 +285,7 @@
287
285
  padding 0
288
286
  position absolute
289
287
  top 0
290
- z-index 90
288
+ z-index 10
291
289
  display flex
292
290
  flex-wrap wrap
293
291
  -webkit-box-align center
@@ -307,7 +305,6 @@
307
305
  top 0
308
306
  transition .2s
309
307
  position fixed
310
- z-index 91
311
308
  opacity 1
312
309
  filter none
313
310
 
@@ -862,8 +859,6 @@ if hexo-config('nav.group')
862
859
  height 35px
863
860
  line-height 35px
864
861
  border-radius 40px
865
- if hexo-config('language') == 'en'
866
- letter-spacing 0
867
862
 
868
863
  #travellings_button
869
864
  display inline
@@ -133,6 +133,10 @@
133
133
  color var(--efu-fontcolor)
134
134
  caret-color var(--efu-theme)
135
135
 
136
+ ::placeholder
137
+ color var(--efu-gray)
138
+ opacity .5
139
+
136
140
  #search-mask
137
141
  position fixed
138
142
  inset 0
package/source/js/main.js CHANGED
@@ -329,7 +329,7 @@ let sco = {
329
329
  */
330
330
  addRuntime: function () {
331
331
  let el = document.getElementById('runtimeshow')
332
- el && GLOBAL_CONFIG.runtime && (el.innerText = utils.timeDiff(new Date(GLOBAL_CONFIG.runtime), new Date()) + GLOBAL_CONFIG.lang.time.day)
332
+ el && GLOBAL_CONFIG.runtime && (el.innerText = utils.timeDiff(new Date(GLOBAL_CONFIG.runtime), new Date()) + GLOBAL_CONFIG.lang.day)
333
333
  },
334
334
  /**
335
335
  * toTalk
@@ -400,7 +400,6 @@ let sco = {
400
400
  for (let key of keys) {
401
401
  const data = localStorage.getItem(key);
402
402
  if (data) {
403
- console.log(key, data);
404
403
  return JSON.parse(data);
405
404
  }
406
405
  }
@@ -776,17 +775,20 @@ class tabs {
776
775
  }
777
776
 
778
777
  static clickFnOfTabs() {
779
- document.querySelectorAll('#article-container .tab > button').forEach(item => {
780
- item.addEventListener('click', e => {
781
- const $tabItem = e.target.parentNode
778
+ document.querySelectorAll('#article-container .tab > button').forEach(function (item) {
779
+ item.addEventListener('click', function (e) {
780
+ const that = this
781
+ const $tabItem = that.parentNode
782
782
  if (!$tabItem.classList.contains('active')) {
783
783
  const $tabContent = $tabItem.parentNode.nextElementSibling
784
- const $siblings = $tabItem.parentNode.querySelector('.active')
784
+ const $siblings = utils.siblings($tabItem, '.active')[0]
785
785
  $siblings && $siblings.classList.remove('active')
786
786
  $tabItem.classList.add('active')
787
- const tabId = e.target.getAttribute('data-href').replace('#', '')
788
- Array.from($tabContent.children).forEach(item => {
789
- item.id === tabId ? item.classList.add('active') : item.classList.remove('active')
787
+ const tabId = that.getAttribute('data-href').replace('#', '')
788
+ const childList = [...$tabContent.children]
789
+ childList.forEach(item => {
790
+ if (item.id === tabId) item.classList.add('active')
791
+ else item.classList.remove('active')
790
792
  })
791
793
  }
792
794
  })
@@ -794,14 +796,14 @@ class tabs {
794
796
  }
795
797
 
796
798
  static backToTop() {
797
- document.querySelectorAll('#article-container .tabs .tab-to-top').forEach(item => {
798
- item.addEventListener('click', () => {
799
- utils.scrollToDest(utils.getEleTop(item.closest('.tabs')), 300)
799
+ document.querySelectorAll('#article-container .tabs .tab-to-top').forEach(function (item) {
800
+ item.addEventListener('click', function () {
801
+ utils.scrollToDest(utils.getEleTop(item.parentElement.parentElement.parentNode), 300)
802
+
800
803
  })
801
804
  })
802
805
  }
803
806
  }
804
-
805
807
  // 页面刷新
806
808
  window.refreshFn = () => {
807
809
  const {is_home, is_page, page, is_post} = PAGE_CONFIG;
@@ -1,6 +1,6 @@
1
1
  /**
2
- * efuAI
3
- * author: @efuo
4
- * version: 1.0.0
2
+ * author: Efu
3
+ * email: o@efu.me
4
+ * website: https://efu.me
5
5
  */
6
- const _0x13613d=_0x413b;function _0x413b(_0x2b151b,_0x2765b5){const _0x2e2ac7=_0x2e2a();return _0x413b=function(_0x413be1,_0x2731a7){_0x413be1=_0x413be1-0x6a;let _0x48e6e4=_0x2e2ac7[_0x413be1];return _0x48e6e4;},_0x413b(_0x2b151b,_0x2765b5);}(function(_0x23c5ad,_0x1d8983){const _0x4a3867=_0x413b,_0x549d7e=_0x23c5ad();while(!![]){try{const _0x23e9f6=parseInt(_0x4a3867(0xa9))/0x1*(-parseInt(_0x4a3867(0x95))/0x2)+parseInt(_0x4a3867(0x7d))/0x3*(-parseInt(_0x4a3867(0x83))/0x4)+-parseInt(_0x4a3867(0xb2))/0x5*(parseInt(_0x4a3867(0xb7))/0x6)+-parseInt(_0x4a3867(0x77))/0x7*(-parseInt(_0x4a3867(0x72))/0x8)+parseInt(_0x4a3867(0x7e))/0x9+-parseInt(_0x4a3867(0xb8))/0xa+parseInt(_0x4a3867(0x9f))/0xb*(parseInt(_0x4a3867(0x6f))/0xc);if(_0x23e9f6===_0x1d8983)break;else _0x549d7e['push'](_0x549d7e['shift']());}catch(_0xf0b15c){_0x549d7e['push'](_0x549d7e['shift']());}}}(_0x2e2a,0x24be2));class efuAI{constructor(){const _0x5c45b1=_0x413b;this[_0x5c45b1(0x98)]=_0x5c45b1(0xb1),this[_0x5c45b1(0x84)]=!0x1,this[_0x5c45b1(0x7c)]='',this[_0x5c45b1(0x8a)]=GLOBAL_CONFIG[_0x5c45b1(0xb3)],this[_0x5c45b1(0x90)]=!0x1;}['init'](){const _0x185d66=_0x413b;this[_0x185d66(0x90)]=!0x1,this[_0x185d66(0x7c)]=PAGE_CONFIG[_0x185d66(0x87)]?PAGE_CONFIG[_0x185d66(0x87)]+'':![],!this['aiPostExplanation']?this[_0x185d66(0xa6)]():this[_0x185d66(0x76)](Promise[_0x185d66(0x78)](this[_0x185d66(0x7c)])),this['AIEngine']();}['getTitleAndContent'](){const _0x1c05d3=_0x413b,_0x497431=document['getElementById'](_0x1c05d3(0x6d)),_0x1134ec=document[_0x1c05d3(0xb4)],_0x30a3a2=_0x497431[_0x1c05d3(0xa3)]('p'),_0x2d35eb=_0x497431['querySelectorAll'](_0x1c05d3(0x80));return(_0x1134ec+'\x20'+Array[_0x1c05d3(0xa0)](_0x2d35eb)[_0x1c05d3(0x9d)](Array[_0x1c05d3(0xa0)](_0x30a3a2))[_0x1c05d3(0x74)](_0x25a656=>_0x25a656[_0x1c05d3(0x88)][_0x1c05d3(0x86)](/https?:\/\/[^\s]+/g,''))[_0x1c05d3(0xac)]('\x20'))[_0x1c05d3(0xb0)](0x0,0x3e8);}async[_0x13613d(0xa6)](){const _0x23a9bd=_0x13613d;this[_0x23a9bd(0x76)](this['fetch'](document[_0x23a9bd(0xb4)],this[_0x23a9bd(0x96)](),this['config'][_0x23a9bd(0xaf)]));}async[_0x13613d(0x8f)](_0x22e80e,_0x3dcc90,_0x24437c){const _0xaf00b3=_0x13613d,_0x565c45=this[_0xaf00b3(0x98)]+'/?content='+encodeURIComponent(_0x3dcc90)+_0xaf00b3(0x7a)+_0x22e80e+_0xaf00b3(0x75)+encodeURIComponent(_0x24437c)+_0xaf00b3(0x92)+encodeURIComponent(window[_0xaf00b3(0x9e)][_0xaf00b3(0xad)]),_0x460d6f=await fetch(_0x565c45),_0x1b4076=await _0x460d6f[_0xaf00b3(0xa4)]();return _0x460d6f['ok']?(this[_0xaf00b3(0x7c)]=_0x1b4076['summary'],_0x1b4076['summary']):(console[_0xaf00b3(0xa1)]('Request\x20failed:',_0x1b4076[_0xaf00b3(0xa8)]),_0x1b4076['err_msg']);}['aiShowAnimation'](_0xad4d41,_0x42d337=!0x1){const _0x59e5bb=_0x13613d,_0x3e9d86=document[_0x59e5bb(0x8e)](_0x59e5bb(0x70)),_0xd29cf1=document[_0x59e5bb(0x8e)](_0x59e5bb(0xb5));if(!_0x3e9d86||this[_0x59e5bb(0x90)])return;this[_0x59e5bb(0x90)]=!0x0,this[_0x59e5bb(0x8c)](),_0xd29cf1[_0x59e5bb(0x8b)][_0x59e5bb(0x9b)](_0x59e5bb(0x85)),_0x3e9d86[_0x59e5bb(0x93)][_0x59e5bb(0x9a)]='block',_0x3e9d86[_0x59e5bb(0x7b)]=_0x59e5bb(0x89),setTimeout(()=>{const _0x40cf66=_0x59e5bb;let _0x214250,_0x4a5de1,_0x4f6a34=!0x0,_0x238416=0x0,_0x1792a7=!0x0;const _0x24b6fe=new IntersectionObserver(_0x46a81a=>{const _0x30414d=_0x413b;_0x4f6a34=_0x46a81a[0x0][_0x30414d(0x6e)],_0x4f6a34&&requestAnimationFrame(_0x4a5de1);},{'threshold':0x0});_0xad4d41['then'](_0x12449a=>{const _0x4a1249=_0x413b;_0x214250=performance[_0x4a1249(0xa7)](),_0x4a5de1=()=>{const _0x12a8a9=_0x4a1249;if(_0x238416<_0x12449a[_0x12a8a9(0x73)]&&_0x4f6a34){const _0x27454f=performance[_0x12a8a9(0xa7)](),_0x2ece04=_0x27454f-_0x214250,_0x493a62=_0x12449a['slice'](_0x238416,_0x238416+0x1),_0x29dd3e=/[,。!、?,.!?]/[_0x12a8a9(0x91)](_0x493a62),_0x323f23=/[a-zA-Z0-9]/[_0x12a8a9(0x91)](_0x493a62);_0x2ece04>=(_0x29dd3e?0x64*Math['random']()+0x64:_0x323f23?0xa:0x19)&&(_0x3e9d86[_0x12a8a9(0x88)]=_0x12449a[_0x12a8a9(0xb0)](0x0,_0x238416+0x1),_0x214250=_0x27454f,_0x238416++,_0x238416<_0x12449a[_0x12a8a9(0x73)]?_0x3e9d86[_0x12a8a9(0x7b)]=_0x12449a[_0x12a8a9(0xb0)](0x0,_0x238416)+_0x12a8a9(0x79):(_0x3e9d86['innerHTML']=_0x12449a,_0x3e9d86['style'][_0x12a8a9(0x9a)]='block',this[_0x12a8a9(0x90)]=!0x1,_0xd29cf1[_0x12a8a9(0x8b)]['remove'](_0x12a8a9(0x85)),_0x24b6fe[_0x12a8a9(0x82)](),_0x42d337&&this[_0x12a8a9(0x6a)]())),_0x4f6a34&&requestAnimationFrame(_0x4a5de1);}},_0x4f6a34&&_0x1792a7&&setTimeout(()=>{requestAnimationFrame(_0x4a5de1),_0x1792a7=!0x1;},0xbb8),_0x24b6fe['observe'](_0x3e9d86);})[_0x40cf66(0xab)](_0x497c7f=>{const _0x16a888=_0x40cf66;console[_0x16a888(0xa1)](_0x16a888(0x6c),_0x497c7f),_0x3e9d86[_0x16a888(0x7b)]='检索信息失败',_0x3e9d86['style'][_0x16a888(0x9a)]=_0x16a888(0x97),this[_0x16a888(0x90)]=!0x1,_0xd29cf1[_0x16a888(0x8b)][_0x16a888(0xa5)](_0x16a888(0x85)),_0x24b6fe[_0x16a888(0x82)]();});},0xbb8);}[_0x13613d(0x71)](){const _0xa48776=_0x13613d,_0x294414=document[_0xa48776(0x8e)](_0xa48776(0xb5));_0x294414&&_0x294414['addEventListener'](_0xa48776(0xa2),()=>{const _0x5e3005=_0xa48776;this['scoGPTIsRunning']||(this[_0x5e3005(0x84)]=!0x0,this['aiShowAnimation'](Promise['resolve'](this['config'][_0x5e3005(0xae)]),!0x0));});}[_0x13613d(0x8c)](){const _0x4e5582=_0x13613d,_0x355d20=document[_0x4e5582(0x8e)](_0x4e5582(0xb6));_0x355d20?_0x355d20[_0x4e5582(0x7b)]='':console[_0x4e5582(0xa1)](_0x4e5582(0xaa));}['createSuggestions'](){const _0x1196c6=_0x13613d;this[_0x1196c6(0x84)]&&(this[_0x1196c6(0x8c)](),this[_0x1196c6(0x99)](_0x1196c6(0x81),()=>{const _0x2d4131=_0x1196c6;''===this[_0x2d4131(0x7c)]?this[_0x2d4131(0xa6)]():this[_0x2d4131(0x76)](Promise[_0x2d4131(0x78)](this[_0x2d4131(0x7c)]),!0x0);}),this[_0x1196c6(0x8a)][_0x1196c6(0xb9)]&&this['createSuggestionItemWithAction']('带我去看看其他文章',()=>toRandomPost()),this[_0x1196c6(0x84)]=!0x0);}['createSuggestionItemWithAction'](_0x411977,_0x1ee9c4){const _0x15cc5f=_0x13613d,_0x5e399f=document[_0x15cc5f(0x8e)](_0x15cc5f(0xb6));if(!_0x5e399f)return void console['error']('无法找到具有class为ai-suggestions的元素');const _0x504608=document[_0x15cc5f(0x6b)]('div');_0x504608['classList'][_0x15cc5f(0x9b)](_0x15cc5f(0x94)),_0x504608[_0x15cc5f(0x9c)]=_0x411977,_0x504608[_0x15cc5f(0x7f)](_0x15cc5f(0xa2),_0x1ee9c4),_0x5e399f[_0x15cc5f(0x8d)](_0x504608);}}function _0x2e2a(){const _0x17cf3e=['loadingAI','replace','ai_text','innerText','生成中...<span\x20class=\x22blinking-cursor\x22></span>','config','classList','cleanSuggestions','appendChild','querySelector','fetch','scoGPTIsRunning','test','&url=','style','ai-suggestions-item','6YFtYAZ','getTitleAndContent','block','root','createSuggestionItemWithAction','display','add','textContent','concat','location','11mBQjxP','from','error','click','getElementsByTagName','json','remove','generate','now','err_msg','95089WLUpyk','没有这个元素:\x27ai-suggestions\x27','catch','join','href','talk','key','slice','https://summary.tianli0.top','106175QRactq','post_ai','title','.ai-tag','.ai-suggestions','66dgrcvD','2694560CoUACr','randomPost','createSuggestions','createElement','检索信息失败:','article-container','isIntersecting','11202588AcRnYR','.ai-explanation','AIEngine','32wwjFQL','length','map','&key=','aiShowAnimation','238161ujxgZE','resolve','<span\x20class=\x22blinking-cursor\x22></span>','&title=','innerHTML','aiPostExplanation','28326zDzbwu','267111zRGBLY','addEventListener','h1,\x20h2,\x20h3,\x20h4,\x20h5','这篇文章讲了什么?','disconnect','68AXICSD','aiTalkMode'];_0x2e2a=function(){return _0x17cf3e;};return _0x2e2a();}const efu_ai=new efuAI();
6
+ class efuAI{constructor(){this.root="https://summary.tianli0.top",this.aiTalkMode=!1,this.aiPostExplanation='',this.config=GLOBAL_CONFIG.post_ai,this.scoGPTIsRunning=!1}init(){if(!document.querySelector(".ai-explanation"))return;this.scoGPTIsRunning=!1;this.aiPostExplanation=PAGE_CONFIG.ai_text?PAGE_CONFIG.ai_text+"":false;if(!this.aiPostExplanation){this.generate()}else{this.aiShowAnimation(Promise.resolve(this.aiPostExplanation))}this.AIEngine()}getTitleAndContent(){const e=document.getElementById("article-container"),t=document.title,n=e.getElementsByTagName("p"),i=e.querySelectorAll("h1, h2, h3, h4, h5");return(t+" "+Array.from(i).concat(Array.from(n)).map((e=>e.innerText.replace(/https?:\/\/[^\s]+/g,""))).join(" ")).slice(0,1e3)}async generate(){this.aiShowAnimation(this.fetch(document.title,this.getTitleAndContent(),this.config.key))}async fetch(e,t,n){const i=`${this.root}/?content=${encodeURIComponent(t)}&title=${e}&key=${encodeURIComponent(n)}&url=${encodeURIComponent(window.location.href)}`,s=await fetch(i),o=await s.json();return s.ok?(this.aiPostExplanation=o.summary,o.summary):(console.error("Request failed:",o.err_msg),o.err_msg)}aiShowAnimation(e,t=!1){const n=document.querySelector(".ai-explanation"),i=document.querySelector(".ai-tag");if(!n||this.scoGPTIsRunning)return;this.scoGPTIsRunning=!0,this.cleanSuggestions(),i.classList.add("loadingAI"),n.style.display="block",n.innerHTML='生成中...<span class="blinking-cursor"></span>';let s,o,a=!0,c=0,r=!0;const l=new IntersectionObserver((e=>{a=e[0].isIntersecting,a&&requestAnimationFrame(o)}),{threshold:0});e.then((e=>{s=performance.now(),o=()=>{if(c<e.length&&a){const r=performance.now(),g=r-s,h=e.slice(c,c+1),u=/[,。!、?,.!?]/.test(h),m=/[a-zA-Z0-9]/.test(h);g>=(u?100*Math.random()+100:m?10:25)&&(n.innerText=e.slice(0,c+1),s=r,c++,c<e.length?n.innerHTML=e.slice(0,c)+'<span class="blinking-cursor"></span>':(n.innerHTML=e,n.style.display="block",this.scoGPTIsRunning=!1,i.classList.remove("loadingAI"),l.disconnect(),t&&this.createSuggestions())),a&&requestAnimationFrame(o)}},a&&r&&setTimeout((()=>{requestAnimationFrame(o),r=!1}),3e3),l.observe(n)})).catch((e=>{console.error("检索信息失败:",e),n.innerHTML="检索信息失败",n.style.display="block",this.scoGPTIsRunning=!1,i.classList.remove("loadingAI"),l.disconnect()}))}AIEngine(){const e=document.querySelector(".ai-tag");e&&e.addEventListener("click",(()=>{this.scoGPTIsRunning||(this.aiTalkMode=!0,this.aiShowAnimation(Promise.resolve(this.config.talk),!0))}))}cleanSuggestions(){const e=document.querySelector(".ai-suggestions");e?e.innerHTML="":console.error("没有这个元素:'ai-suggestions'")}createSuggestions(){this.aiTalkMode&&(this.cleanSuggestions(),this.createSuggestionItemWithAction("这篇文章讲了什么?",(()=>{""===this.aiPostExplanation?this.generate():this.aiShowAnimation(Promise.resolve(this.aiPostExplanation),!0)})),this.config.randomPost&&this.createSuggestionItemWithAction("带我去看看其他文章",(()=>toRandomPost())),this.aiTalkMode=!0)}createSuggestionItemWithAction(e,t){const n=document.querySelector(".ai-suggestions");if(!n)return void console.error("无法找到具有class为ai-suggestions的元素");const i=document.createElement("div");i.classList.add("ai-suggestions-item"),i.textContent=e,i.addEventListener("click",t),n.appendChild(i)}}const efu_ai=new efuAI;
@@ -59,6 +59,14 @@
59
59
  }
60
60
  return actualTop;
61
61
  },
62
+ siblings: (ele, selector) => {
63
+ return [...ele.parentNode.children].filter((child) => {
64
+ if (selector) {
65
+ return child !== ele && child.matches(selector)
66
+ }
67
+ return child !== ele
68
+ })
69
+ },
62
70
  randomNum: (length) => {
63
71
  return Math.floor(Math.random() * length)
64
72
  },