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 +6 -3
- package/README_en-US.md +2 -2
- package/README_zh-Hant.md +2 -2
- package/languages/default.yml +2 -1
- package/languages/en.yml +2 -1
- package/languages/zh-CN.yml +1 -0
- package/languages/zh-TW.yml +1 -0
- package/layout/includes/head/config.pug +1 -0
- package/layout/includes/inject/head.pug +1 -1
- package/layout/includes/widgets/third-party/comments/artalk.pug +3 -3
- package/layout/includes/widgets/third-party/news-comment/artalk.pug +49 -42
- package/layout/post.pug +1 -1
- package/package.json +1 -1
- package/plugins.yml +5 -5
- package/scripts/filter/default.js +1 -0
- package/source/css/_layout/aside.styl +1 -1
- package/source/css/_layout/header.styl +1 -6
- package/source/css/_search/local-search.styl +4 -0
- package/source/js/main.js +15 -13
- package/source/js/third_party/efu_ai.min.js +4 -4
- package/source/js/utils.js +8 -0
package/README.md
CHANGED
@@ -15,6 +15,7 @@
|
|
15
15
|

|
16
16
|
[](https://github.com/valor-x/hexo-theme-solitude/stargazers)
|
17
17
|
[](https://www.npmjs.com/package/hexo-theme-solitude)
|
18
|
+
[](https://app.fossa.com/projects/git%2Bgithub.com%2Fvalor-x%2Fhexo-theme-solitude?ref=badge_shield)
|
18
19
|
|
19
20
|

|
20
21
|

|
@@ -38,7 +39,7 @@
|
|
38
39
|
[](https://gitee.com/nsjjd_w/hexo-theme-solitude)
|
39
40
|
[](https://gitlab.com/efu/hexo-theme-solitude)
|
40
41
|
|
41
|
-
[文档
|
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 © 2023-至今 [EverFu](https://github.com/efuo)
|
91
|
+
[MIT](./LICENSE) License © 2023-至今 [EverFu](https://github.com/efuo)
|
92
|
+
|
93
|
+
[](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
|
[](https://gitee.com/nsjjd_w/hexo-theme-solitude)
|
39
39
|
[](https://gitlab.com/efu/hexo-theme-solitude)
|
40
40
|
|
41
|
-
[Documentation
|
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 © 2023-PRESENT [EverFu](https://github.com/efuo)
|
90
|
+
[MIT](./LICENSE) License © 2023-PRESENT [EverFu](https://github.com/efuo)
|
package/README_zh-Hant.md
CHANGED
@@ -38,7 +38,7 @@
|
|
38
38
|
[](https://gitee.com/nsjjd_w/hexo-theme-solitude)
|
39
39
|
[](https://gitlab.com/efu/hexo-theme-solitude)
|
40
40
|
|
41
|
-
[文档
|
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 © 2023-至今 [Efu](https://github.com/efuo)
|
88
|
+
[MIT](./LICENSE) License © 2023-至今 [Efu](https://github.com/efuo)
|
package/languages/default.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:
|
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:
|
75
|
+
tipping: Sponsor
|
75
76
|
title: List of appreciation
|
76
77
|
|
77
78
|
search:
|
package/languages/zh-CN.yml
CHANGED
package/languages/zh-TW.yml
CHANGED
@@ -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.
|
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
|
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 =
|
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
|
-
{
|
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
|
-
{
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
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
|
55
|
-
const
|
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:
|
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
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.
|
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.
|
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
|
21
|
+
version: 3.2.1
|
22
22
|
waline_css:
|
23
23
|
name: '@waline/client'
|
24
24
|
file: dist/waline.css
|
25
|
-
version: 3.1
|
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.
|
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
|
@@ -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
|
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
|
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.
|
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
|
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
|
784
|
+
const $siblings = utils.siblings($tabItem, '.active')[0]
|
785
785
|
$siblings && $siblings.classList.remove('active')
|
786
786
|
$tabItem.classList.add('active')
|
787
|
-
const tabId =
|
788
|
-
|
789
|
-
|
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.
|
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
|
-
*
|
3
|
-
*
|
4
|
-
*
|
2
|
+
* author: Efu
|
3
|
+
* email: o@efu.me
|
4
|
+
* website: https://efu.me
|
5
5
|
*/
|
6
|
-
|
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;
|
package/source/js/utils.js
CHANGED
@@ -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
|
},
|