hexo-theme-solitude 1.1.0 → 1.2.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.
- package/LICENSE +674 -19
- package/README.md +56 -19
- package/README_EN.md +98 -0
- package/_config.yml +274 -224
- package/languages/en-US.yml +1 -0
- package/languages/zh-CN.yml +8 -8
- package/layout/404.pug +24 -0
- package/layout/archive.pug +11 -0
- package/layout/category.pug +16 -0
- package/layout/includes/console.pug +42 -0
- package/layout/includes/footer.pug +71 -0
- package/layout/includes/head/config.pug +79 -0
- package/layout/includes/head/pwa.pug +59 -0
- package/layout/includes/head.pug +29 -0
- package/layout/includes/header.pug +4 -0
- package/layout/includes/inject/body.pug +68 -0
- package/layout/{partial/compoment/inject/head.ejs → includes/inject/head.pug} +60 -37
- package/layout/includes/layout.pug +35 -0
- package/layout/{partial/loading.ejs → includes/loading.pug} +19 -17
- package/layout/includes/mixins/articleSort.pug +14 -0
- package/layout/includes/mixins/pagination.pug +8 -0
- package/layout/includes/nav.pug +22 -0
- package/layout/includes/page/about.pug +10 -0
- package/layout/includes/page/categories.pug +8 -0
- package/layout/includes/page/default.pug +2 -0
- package/layout/includes/page/echarts.pug +7 -0
- package/layout/includes/page/equipment.pug +3 -0
- package/layout/includes/page/links.pug +35 -0
- package/layout/includes/page/moments.pug +5 -0
- package/layout/includes/page/rss.pug +22 -0
- package/layout/includes/page/says.pug +20 -0
- package/layout/includes/page/tags.pug +8 -0
- package/layout/includes/page/tlink.pug +9 -0
- package/layout/includes/recent-posts.pug +9 -0
- package/layout/includes/sidebar.pug +17 -0
- package/layout/includes/widgets/aside/aside.pug +18 -0
- package/layout/includes/widgets/aside/asideAllInfo.pug +8 -0
- package/layout/includes/widgets/aside/asideArchive.pug +9 -0
- package/layout/includes/widgets/aside/asideFlipCard.pug +5 -0
- package/layout/includes/widgets/aside/asideHistory.pug +8 -0
- package/layout/includes/widgets/aside/asideInfoCard.pug +22 -0
- package/layout/includes/widgets/aside/asideNewestPost.pug +16 -0
- package/layout/includes/widgets/aside/asidePower.pug +19 -0
- package/layout/includes/widgets/aside/asideSwitch.pug +26 -0
- package/layout/includes/widgets/aside/asideTag.pug +11 -0
- package/layout/includes/widgets/aside/asideToc.pug +5 -0
- package/layout/includes/widgets/aside/asideWebInfo.pug +40 -0
- package/layout/includes/widgets/aside/asideWelcome.pug +12 -0
- package/layout/includes/widgets/home/banner.pug +16 -0
- package/layout/includes/widgets/home/bbTimeList.pug +8 -0
- package/layout/includes/widgets/home/categoryBar.pug +10 -0
- package/layout/includes/widgets/home/categoryGroup.pug +9 -0
- package/layout/includes/widgets/home/hometop.pug +9 -0
- package/layout/includes/widgets/home/postList.pug +26 -0
- package/layout/includes/widgets/home/rencentPost.pug +26 -0
- package/layout/includes/widgets/home/topGroup.pug +27 -0
- package/layout/includes/widgets/nav/left.pug +10 -0
- package/layout/includes/widgets/nav/menu.pug +16 -0
- package/layout/includes/widgets/nav/right.pug +23 -0
- package/layout/includes/widgets/page/about/authorinfo.pug +12 -0
- package/layout/includes/widgets/page/about/award.pug +34 -0
- package/layout/includes/widgets/page/about/contentinfo.pug +38 -0
- package/layout/includes/widgets/page/about/hobbies.pug +33 -0
- package/layout/includes/widgets/page/about/motto.pug +19 -0
- package/layout/includes/widgets/page/about/other.pug +61 -0
- package/layout/includes/widgets/page/about/personalities.pug +16 -0
- package/layout/includes/widgets/page/about/skillsinfo.pug +41 -0
- package/layout/includes/widgets/page/banner.pug +14 -0
- package/layout/includes/widgets/page/equipment/content.pug +23 -0
- package/layout/includes/widgets/page/links/banner.pug +30 -0
- package/layout/includes/widgets/page/links/linksCard.pug +18 -0
- package/layout/includes/widgets/page/links/linksItem.pug +14 -0
- package/layout/includes/widgets/page/moments/angle.pug +24 -0
- package/layout/includes/widgets/page/moments/index.pug +18 -0
- package/layout/includes/widgets/page/says/saysBottom.pug +11 -0
- package/layout/includes/widgets/page/says/saysContent.pug +6 -0
- package/layout/includes/widgets/page/says/saysFunction.pug +10 -0
- package/layout/includes/widgets/page/says/saysMeta.pug +7 -0
- package/layout/includes/widgets/post/award.pug +48 -0
- package/layout/includes/widgets/post/copyright.pug +27 -0
- package/layout/includes/widgets/post/postMeta.pug +55 -0
- package/layout/includes/widgets/post/postNav.pug +25 -0
- package/layout/includes/widgets/post/wave.pug +9 -0
- package/layout/includes/widgets/randomlink.pug +32 -0
- package/layout/includes/widgets/rightside/index.pug +74 -0
- package/layout/includes/widgets/third-party/comments/comment.pug +14 -0
- package/layout/includes/widgets/third-party/comments/gitalk.pug +0 -0
- package/layout/{partial/compoment/third-party/comments/twikoo.ejs → includes/widgets/third-party/comments/twikoo.pug} +8 -9
- package/layout/includes/widgets/third-party/comments/valine.pug +0 -0
- package/layout/includes/widgets/third-party/music.pug +3 -0
- package/layout/includes/widgets/third-party/pjax.pug +30 -0
- package/layout/includes/widgets/third-party/search/algolia-search.pug +16 -0
- package/layout/includes/widgets/third-party/search/index.pug +7 -0
- package/layout/includes/widgets/third-party/search/local-search.pug +15 -0
- package/layout/index.pug +20 -0
- package/layout/page.pug +32 -0
- package/layout/post.pug +43 -0
- package/layout/tag.pug +19 -0
- package/package.json +3 -3
- package/scripts/event/page.js +20 -2
- package/scripts/filter/checkThemeConfig.js +0 -1
- package/scripts/filter/randomPosts.js +0 -1
- package/scripts/helper/{charts.js → echarts.js} +21 -11
- package/scripts/helper/related_post.js +10 -3
- package/scripts/helper/stylus.js +23 -0
- package/scripts/tags/bvideo.js +1 -36
- package/scripts/tags/fold.js +2 -3
- package/scripts/tags/note.js +6 -2
- package/scripts/tags/tabs.js +1 -1
- package/source/css/_comment/index.styl +121 -0
- package/source/css/_comment/twikoo.styl +515 -0
- package/source/css/_extra/console.styl +354 -0
- package/source/css/_extra/rightmenu.styl +83 -0
- package/source/css/_global/animation.css +756 -0
- package/source/css/_global/function.styl +83 -0
- package/source/css/_global/index.styl +120 -0
- package/source/css/_global/var.styl +1 -0
- package/source/css/_layout/articleSort.styl +199 -0
- package/source/css/_layout/base.styl +392 -0
- package/source/css/_layout/footer.styl +359 -0
- package/source/css/_layout/header.styl +1331 -0
- package/source/css/_layout/index.styl +293 -0
- package/source/css/_layout/sidebar.styl +226 -0
- package/source/css/_mode/index.styl +52 -0
- package/source/css/_page/about.styl +944 -0
- package/source/css/_page/category.styl +141 -0
- package/source/css/_page/equipment.styl +108 -0
- package/source/css/_page/error.styl +161 -0
- package/source/css/_page/home.styl +58 -0
- package/source/css/_page/homeTop.styl +1035 -0
- package/source/css/_page/index.styl +22 -0
- package/source/css/_page/link.styl +433 -0
- package/source/css/_page/moment.styl +186 -0
- package/source/css/_page/rss.styl +87 -0
- package/source/css/_page/says.styl +353 -0
- package/source/css/_page/tag.styl +56 -0
- package/source/css/_post/commentBarrage.styl +149 -0
- package/source/css/_post/externalTags.styl +694 -0
- package/source/css/_post/highlight.styl +96 -0
- package/source/css/_post/index.styl +935 -0
- package/source/css/_post/pagination.styl +467 -0
- package/source/css/_post/postContent.styl +957 -0
- package/source/css/_post/relatedPost.styl +160 -0
- package/source/css/_post/reward.styl +217 -0
- package/source/css/_search/algolia-search.styl +206 -0
- package/source/css/_search/local-search.styl +112 -0
- package/source/css/_widgets/aside/allinfo.styl +134 -0
- package/source/css/_widgets/aside/flip.styl +68 -0
- package/source/css/_widgets/aside/history.styl +35 -0
- package/source/css/_widgets/aside/index.styl +156 -0
- package/source/css/_widgets/aside/info.styl +263 -0
- package/source/css/_widgets/aside/newPost.styl +55 -0
- package/source/css/_widgets/aside/power.styl +90 -0
- package/source/css/_widgets/aside/toc.styl +85 -0
- package/source/css/_widgets/aside/welcome.styl +14 -0
- package/source/css/_widgets/index.styl +3 -0
- package/source/css/index.styl +40 -0
- package/source/img/default.png +0 -0
- package/source/img/logo-horizontal_version.png +0 -0
- package/source/img/pwa/16.png +0 -0
- package/source/img/pwa/180.png +0 -0
- package/source/img/pwa/192.png +0 -0
- package/source/img/pwa/32.png +0 -0
- package/source/img/pwa/512.png +0 -0
- package/source/img/pwa/logo.png +0 -0
- package/source/img/pwa/siteicon/splash-1125x2436.png +0 -0
- package/source/img/pwa/siteicon/splash-1136x640.png +0 -0
- package/source/img/pwa/siteicon/splash-1170x2532.png +0 -0
- package/source/img/pwa/siteicon/splash-1179x2556.png +0 -0
- package/source/img/pwa/siteicon/splash-1242x2208.png +0 -0
- package/source/img/pwa/siteicon/splash-1242x2688.png +0 -0
- package/source/img/pwa/siteicon/splash-1248x2778.png +0 -0
- package/source/img/pwa/siteicon/splash-1290x2796.png +0 -0
- package/source/img/pwa/siteicon/splash-1334x750.png +0 -0
- package/source/img/pwa/siteicon/splash-1536x2048.png +0 -0
- package/source/img/pwa/siteicon/splash-1620x2160.png +0 -0
- package/source/img/pwa/siteicon/splash-1668x2224.png +0 -0
- package/source/img/pwa/siteicon/splash-1668x2388.png +0 -0
- package/source/img/pwa/siteicon/splash-1792x828.png +0 -0
- package/source/img/pwa/siteicon/splash-2048x1536.png +0 -0
- package/source/img/pwa/siteicon/splash-2048x2732.png +0 -0
- package/source/img/pwa/siteicon/splash-2160x1620.png +0 -0
- package/source/img/pwa/siteicon/splash-2208x1242.png +0 -0
- package/source/img/pwa/siteicon/splash-2224x1668.png +0 -0
- package/source/img/pwa/siteicon/splash-2388x1668.png +0 -0
- package/source/img/pwa/siteicon/splash-2436x1125.png +0 -0
- package/source/img/pwa/siteicon/splash-2532x1170.png +0 -0
- package/source/img/pwa/siteicon/splash-2556x1179.png +0 -0
- package/source/img/pwa/siteicon/splash-2688x1242.png +0 -0
- package/source/img/pwa/siteicon/splash-2732x2048.png +0 -0
- package/source/img/pwa/siteicon/splash-2778x1248.png +0 -0
- package/source/img/pwa/siteicon/splash-2796x1290.png +0 -0
- package/source/img/pwa/siteicon/splash-640x1136.png +0 -0
- package/source/img/pwa/siteicon/splash-750x1334.png +0 -0
- package/source/img/pwa/siteicon/splash-828x1792.png +0 -0
- package/source/img/solitude-show.jpg +0 -0
- package/source/js/commentBarrage.js +8 -5
- package/source/js/extend/console/comment.js +60 -63
- package/source/js/extend/covercolor/local.js +105 -95
- package/source/js/extend/search/algolia-search.js +104 -111
- package/source/js/extend/search/local-search.js +7 -7
- package/source/js/main.js +673 -520
- package/source/js/utils.js +131 -137
- package/source/lib/chuckle-post-ai.js +1 -1
- package/layout/404.ejs +0 -34
- package/layout/archive.ejs +0 -10
- package/layout/category.ejs +0 -18
- package/layout/index.ejs +0 -20
- package/layout/layout.ejs +0 -30
- package/layout/page/about.ejs +0 -13
- package/layout/page/categories.ejs +0 -12
- package/layout/page/circle.ejs +0 -5
- package/layout/page/echarts.ejs +0 -14
- package/layout/page/equipment.ejs +0 -2
- package/layout/page/links.ejs +0 -46
- package/layout/page/page.ejs +0 -3
- package/layout/page/rss.ejs +0 -37
- package/layout/page/says.ejs +0 -17
- package/layout/page/tags.ejs +0 -12
- package/layout/page/tlink.ejs +0 -11
- package/layout/page.ejs +0 -45
- package/layout/partial/body.ejs +0 -7
- package/layout/partial/compoment/about/authorinfo.ejs +0 -18
- package/layout/partial/compoment/about/award.ejs +0 -59
- package/layout/partial/compoment/about/contentinfo.ejs +0 -33
- package/layout/partial/compoment/about/hobbies.ejs +0 -53
- package/layout/partial/compoment/about/motto.ejs +0 -17
- package/layout/partial/compoment/about/other.ejs +0 -76
- package/layout/partial/compoment/about/personalities.ejs +0 -11
- package/layout/partial/compoment/about/skillsinfo.ejs +0 -62
- package/layout/partial/compoment/aside/aside.ejs +0 -28
- package/layout/partial/compoment/aside/asideAllInfo.ejs +0 -6
- package/layout/partial/compoment/aside/asideArchive.ejs +0 -11
- package/layout/partial/compoment/aside/asideFlipCard.ejs +0 -72
- package/layout/partial/compoment/aside/asideHistory.ejs +0 -49
- package/layout/partial/compoment/aside/asideInfoCard.ejs +0 -39
- package/layout/partial/compoment/aside/asideNewestPost.ejs +0 -31
- package/layout/partial/compoment/aside/asidePower.ejs +0 -31
- package/layout/partial/compoment/aside/asideSwitch.ejs +0 -41
- package/layout/partial/compoment/aside/asideTag.ejs +0 -5
- package/layout/partial/compoment/aside/asideToc.ejs +0 -11
- package/layout/partial/compoment/aside/asideWebInfo.ejs +0 -60
- package/layout/partial/compoment/aside/asideWelcome.ejs +0 -33
- package/layout/partial/compoment/circle/angle.ejs +0 -26
- package/layout/partial/compoment/circle/banner.ejs +0 -11
- package/layout/partial/compoment/circle/content.ejs +0 -19
- package/layout/partial/compoment/dorakika/rightmenu.ejs +0 -100
- package/layout/partial/compoment/equipment/list.ejs +0 -37
- package/layout/partial/compoment/home/homeCategoryBar.ejs +0 -11
- package/layout/partial/compoment/home/postList.ejs +0 -37
- package/layout/partial/compoment/hometop/bbTimeList.ejs +0 -15
- package/layout/partial/compoment/hometop/categoryGroup.ejs +0 -19
- package/layout/partial/compoment/hometop/groupTag.ejs +0 -30
- package/layout/partial/compoment/hometop/topGroup.ejs +0 -41
- package/layout/partial/compoment/inject/body.ejs +0 -72
- package/layout/partial/compoment/links/angle.ejs +0 -26
- package/layout/partial/compoment/links/banner.ejs +0 -42
- package/layout/partial/compoment/links/linksCard.ejs +0 -27
- package/layout/partial/compoment/links/linksItem.ejs +0 -21
- package/layout/partial/compoment/mixins/articleSort.ejs +0 -26
- package/layout/partial/compoment/mixins/pagination.ejs +0 -11
- package/layout/partial/compoment/nav/left.ejs +0 -22
- package/layout/partial/compoment/nav/menu.ejs +0 -25
- package/layout/partial/compoment/nav/right.ejs +0 -42
- package/layout/partial/compoment/post/award.ejs +0 -52
- package/layout/partial/compoment/post/copyright.ejs +0 -37
- package/layout/partial/compoment/post/postMeta.ejs +0 -83
- package/layout/partial/compoment/post/postNav.ejs +0 -41
- package/layout/partial/compoment/post/wave.ejs +0 -14
- package/layout/partial/compoment/says/banner.ejs +0 -10
- package/layout/partial/compoment/says/saysBottom.ejs +0 -18
- package/layout/partial/compoment/says/saysContent.ejs +0 -10
- package/layout/partial/compoment/says/saysFunction.ejs +0 -15
- package/layout/partial/compoment/third-party/comments/comment.ejs +0 -12
- package/layout/partial/compoment/third-party/comments/twikoo_k.ejs +0 -29
- package/layout/partial/compoment/third-party/music.ejs +0 -5
- package/layout/partial/compoment/third-party/pjax.ejs +0 -31
- package/layout/partial/compoment/third-party/search/algolia-search.ejs +0 -20
- package/layout/partial/compoment/third-party/search/index.ejs +0 -10
- package/layout/partial/compoment/third-party/search/local-search.ejs +0 -22
- package/layout/partial/compoment/tlink/banner.ejs +0 -10
- package/layout/partial/console.ejs +0 -68
- package/layout/partial/footer.ejs +0 -104
- package/layout/partial/head.ejs +0 -37
- package/layout/partial/header.ejs +0 -6
- package/layout/partial/hometop.ejs +0 -15
- package/layout/partial/nav.ejs +0 -34
- package/layout/partial/pwa.ejs +0 -40
- package/layout/partial/sidebar.ejs +0 -31
- package/layout/post.ejs +0 -52
- package/layout/tag.ejs +0 -19
- package/scripts/filter/katex.js +0 -25
- package/scripts/helper/randomLinks.js +0 -16
- package/scripts/helper/themeJsExport.js +0 -79
- package/scripts/tags/expand.js +0 -4
- package/scripts/tags/hide.js +0 -70
- package/source/css/commentBarrage.css +0 -174
- package/source/css/custom.css +0 -901
- package/source/css/main.css +0 -16420
- package/source/css/search/algolia-search.css +0 -141
- package/source/css/search/local-search.css +0 -138
- package/source/css/var.css +0 -189
- package/source/js/extend/covercolor/web.js +0 -137
- /package/source/js/{rightmenu.js → rightside.js} +0 -0
package/source/js/utils.js
CHANGED
@@ -1,153 +1,147 @@
|
|
1
1
|
const utils = {
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
throttle: function (func, wait, options) {
|
19
|
-
let timeout, context, args
|
20
|
-
let previous = 0
|
21
|
-
if (!options) options = {}
|
2
|
+
debounce: function (func, wait, immediate) {
|
3
|
+
let timeout
|
4
|
+
return function () {
|
5
|
+
const context = this
|
6
|
+
const args = arguments
|
7
|
+
const later = function () {
|
8
|
+
timeout = null
|
9
|
+
if (!immediate) func.apply(context, args)
|
10
|
+
}
|
11
|
+
const callNow = immediate && !timeout
|
12
|
+
clearTimeout(timeout)
|
13
|
+
timeout = setTimeout(later, wait)
|
14
|
+
if (callNow) func.apply(context, args)
|
15
|
+
}
|
16
|
+
},
|
22
17
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
if (!timeout) context = args = null
|
28
|
-
}
|
18
|
+
throttle: function (func, wait, options) {
|
19
|
+
let timeout, context, args
|
20
|
+
let previous = 0
|
21
|
+
if (!options) options = {}
|
29
22
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
args = arguments
|
36
|
-
if (remaining <= 0 || remaining > wait) {
|
37
|
-
if (timeout) {
|
38
|
-
clearTimeout(timeout)
|
39
|
-
timeout = null
|
23
|
+
const later = function () {
|
24
|
+
previous = options.leading === false ? 0 : new Date().getTime()
|
25
|
+
timeout = null
|
26
|
+
func.apply(context, args)
|
27
|
+
if (!timeout) context = args = null
|
40
28
|
}
|
41
|
-
previous = now
|
42
|
-
func.apply(context, args)
|
43
|
-
if (!timeout) context = args = null
|
44
|
-
} else if (!timeout && options.trailing !== false) {
|
45
|
-
timeout = setTimeout(later, remaining)
|
46
|
-
}
|
47
|
-
}
|
48
29
|
|
49
|
-
|
50
|
-
|
30
|
+
const throttled = function () {
|
31
|
+
const now = new Date().getTime()
|
32
|
+
if (!previous && options.leading === false) previous = now
|
33
|
+
const remaining = wait - (now - previous)
|
34
|
+
context = this
|
35
|
+
args = arguments
|
36
|
+
if (remaining <= 0 || remaining > wait) {
|
37
|
+
if (timeout) {
|
38
|
+
clearTimeout(timeout)
|
39
|
+
timeout = null
|
40
|
+
}
|
41
|
+
previous = now
|
42
|
+
func.apply(context, args)
|
43
|
+
if (!timeout) context = args = null
|
44
|
+
} else if (!timeout && options.trailing !== false) {
|
45
|
+
timeout = setTimeout(later, remaining)
|
46
|
+
}
|
47
|
+
}
|
51
48
|
|
52
|
-
|
53
|
-
|
54
|
-
},
|
49
|
+
return throttled
|
50
|
+
},
|
55
51
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
ele.removeEventListener('animationend', f)
|
60
|
-
})
|
61
|
-
ele.style.animation = `to_hide ${time}s`
|
62
|
-
},
|
52
|
+
fadeIn: (ele, time) => {
|
53
|
+
ele.style.cssText = `display:block;animation: to_show ${time}s`
|
54
|
+
},
|
63
55
|
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
}
|
71
|
-
},
|
56
|
+
fadeOut: (ele, time) => {
|
57
|
+
ele.addEventListener('animationend', function f() {
|
58
|
+
ele.style.cssText = "display: none; animation: '' "
|
59
|
+
ele.removeEventListener('animationend', f)
|
60
|
+
})
|
61
|
+
ele.style.animation = `to_hide ${time}s`
|
62
|
+
},
|
72
63
|
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
pos: 'top-center'
|
82
|
-
})
|
83
|
-
},
|
64
|
+
sidebarPaddingR: () => {
|
65
|
+
const innerWidth = window.innerWidth
|
66
|
+
const clientWidth = document.body.clientWidth
|
67
|
+
const paddingRight = innerWidth - clientWidth
|
68
|
+
if (innerWidth !== clientWidth) {
|
69
|
+
document.body.style.paddingRight = paddingRight + 'px'
|
70
|
+
}
|
71
|
+
},
|
84
72
|
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
73
|
+
snackbarShow: (text, showAction, duration) => {
|
74
|
+
const sa = (typeof showAction !== 'undefined') ? showAction : false
|
75
|
+
const dur = (typeof duration !== 'undefined') ? duration : 5000
|
76
|
+
document.styleSheets[0].addRule(':root', '--sco-snackbar-time:' + dur + 'ms!important')
|
77
|
+
Snackbar.show({
|
78
|
+
text: text,
|
79
|
+
showAction: sa,
|
80
|
+
duration: dur,
|
81
|
+
pos: 'top-center'
|
82
|
+
})
|
83
|
+
},
|
93
84
|
|
94
|
-
|
95
|
-
|
96
|
-
|
85
|
+
copy: async (text) => {
|
86
|
+
try {
|
87
|
+
await navigator.clipboard.writeText(text)
|
88
|
+
utils.snackbarShow(GLOBAL_CONFIG.lang.copy.success, false, 2000)
|
89
|
+
} catch (err) {
|
90
|
+
utils.snackbarShow(GLOBAL_CONFIG.lang.copy.error, false, 2000)
|
91
|
+
}
|
92
|
+
},
|
97
93
|
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
94
|
+
getEleTop: ele => {
|
95
|
+
let actualTop = 0
|
96
|
+
while (ele) {
|
97
|
+
actualTop += ele.offsetTop
|
98
|
+
ele = ele.offsetParent
|
99
|
+
}
|
100
|
+
return actualTop
|
101
|
+
},
|
102
102
|
|
103
|
-
|
104
|
-
|
103
|
+
randomNum: (length) => {
|
104
|
+
return Math.floor(Math.random() * length)
|
105
|
+
},
|
105
106
|
|
106
|
-
|
107
|
-
|
108
|
-
|
107
|
+
timeDiff: (timeObj, today) => {
|
108
|
+
var timeDiff = today.getTime() - timeObj.getTime();
|
109
|
+
return Math.floor(timeDiff / (1000 * 3600 * 24));
|
110
|
+
},
|
109
111
|
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
112
|
+
scrollToDest: (pos, time = 500) => {
|
113
|
+
const currentPos = window.pageYOffset
|
114
|
+
const isNavFixed = document.getElementById('page-header').classList.contains('nav-fixed')
|
115
|
+
if (currentPos > pos || isNavFixed) pos = pos - 70
|
116
|
+
if ('scrollBehavior' in document.documentElement.style) {
|
117
|
+
window.scrollTo({
|
118
|
+
top: pos,
|
119
|
+
behavior: 'smooth'
|
120
|
+
})
|
121
|
+
return
|
122
|
+
}
|
123
|
+
let start = null
|
124
|
+
const distance = pos - currentPos
|
125
|
+
window.requestAnimationFrame(function step(currentTime) {
|
126
|
+
start = !start ? currentTime : start
|
127
|
+
const progress = currentTime - start
|
128
|
+
if (progress < time) {
|
129
|
+
window.scrollTo(0, currentPos + distance * progress / time)
|
130
|
+
window.requestAnimationFrame(step)
|
131
|
+
} else {
|
132
|
+
window.scrollTo(0, pos)
|
133
|
+
}
|
134
|
+
})
|
135
|
+
},
|
114
136
|
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
let start = null
|
127
|
-
pos = + pos
|
128
|
-
window.requestAnimationFrame(function step(currentTime) {
|
129
|
-
start = !start ? currentTime : start
|
130
|
-
const progress = currentTime - start
|
131
|
-
if (currentPos < pos) {
|
132
|
-
window.scrollTo(0, ((pos - currentPos) * progress / time) + currentPos)
|
133
|
-
} else {
|
134
|
-
window.scrollTo(0, currentPos - ((currentPos - pos) * progress / time))
|
135
|
-
}
|
136
|
-
if (progress < time) {
|
137
|
-
window.requestAnimationFrame(step)
|
138
|
-
} else {
|
139
|
-
window.scrollTo(0, pos)
|
140
|
-
}
|
141
|
-
})
|
142
|
-
},
|
143
|
-
|
144
|
-
siblings: (ele, selector) => {
|
145
|
-
return [...ele.parentNode.children].filter((child) => {
|
146
|
-
if (selector) {
|
147
|
-
return child !== ele && child.matches(selector)
|
148
|
-
}
|
149
|
-
return child !== ele
|
150
|
-
})
|
151
|
-
},
|
152
|
-
isMobile: () => /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent),
|
153
|
-
}
|
137
|
+
siblings: (ele, selector) => {
|
138
|
+
return [...ele.parentNode.children].filter((child) => {
|
139
|
+
if (selector) {
|
140
|
+
return child !== ele && child.matches(selector)
|
141
|
+
}
|
142
|
+
return child !== ele
|
143
|
+
})
|
144
|
+
},
|
145
|
+
isMobile: () => /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent),
|
146
|
+
isHidden: e => 0 === e.offsetHeight && 0 === e.offsetWidth
|
147
|
+
}
|
@@ -1 +1 @@
|
|
1
|
-
function ChucklePostAI(t){function e(t){const e=document.querySelector(".post-ai");e&&e.parentElement.removeChild(e);const o=window.location.href;if(t.eliminate&&t.eliminate.length&&t.eliminate.some((t=>o.includes(t))))return;if(t.whitelist&&t.whitelist.length&&!t.whitelist.some((t=>o.includes(t))))return;let n="";n=!t.auto_mount&&t.el?document.querySelector(t.el?t.el:"#post #article-container"):function(){function t(e){let o=1;for(const n of e.children)o+=t(n);return o}function e(t){if(["IFRAME","FOOTER","HEADER","BLOCKQUOTE"].includes(t.tagName))return!0;const e=["aplayer","comment"];return Array.from(t.classList).some((t=>e.some((e=>t.includes(e)))))}function o(t){const o={H1:1.5,H2:1,H3:.5,P:1};let n=0,i=null;function r(t){if(e(t))return;let a=0;for(const e of t.children)e.tagName in o&&(a+=o[e.tagName]);a>n&&(n=a,i=t);for(const e of t.children)r(e)}return r(t),i}function n(){const n=[document.body];let i=0,r=null;for(;n.length>0;){const o=n.shift();if(e(o))continue;const a=t(o);a>i&&(i=a,r=o);for(const t of o.children)n.push(t)}return o(r)}return n()}();const i=document.querySelector(t.title_el)?document.querySelector(t.title_el).textContent:document.title;if(!n)return;const r={name:"ChatGPT",introduce:"我是文章辅助AI: ChatGPT,点击下方的按钮,让我生成本文简介、推荐相关文章等。",version:"GPT-4",button:["介绍自己","推荐相关文章","生成AI简介","矩阵穿梭"],...t.interface};!function(){const e="qx-ai-style";if(document.getElementById(e))return;const o=document.createElement("style");o.id=e,o.textContent=t.css||":root{--ai-font-color:#353535;--ai-post-bg:#f1f3f8;--ai-content-bg:#fff;--ai-content-border:1px solid #e3e8f7;--ai-border:1px solid #e3e8f7bd;--ai-tag-bg:rgba(48,52,63,0.80);--ai-cursor:#333;--ai-btn-bg:rgba(48,52,63,0.75);--ai-title-color:#4c4948;--ai-btn-color:#fff;--ai-speech-content:#fff;}[data-theme=dark],.theme-dark,body.dark,body.dark-theme{--ai-font-color:rgba(255,255,255,0.9);--ai-post-bg:#30343f;--ai-content-bg:#1d1e22;--ai-content-border:1px solid #42444a;--ai-border:1px solid #3d3d3f;--ai-tag-bg:#1d1e22;--ai-cursor:rgb(255,255,255,0.9);--ai-btn-bg:#1d1e22;--ai-title-color:rgba(255,255,255,0.86);--ai-btn-color:rgb(255,255,255,0.9);--ai-speech-content:#1d1e22;}#post-ai.post-ai{background:var(--ai-post-bg);border-radius:12px;padding:10px 12px 11px;line-height:1.3;border:var(--ai-border);margin-top:10px;margin-bottom:6px;transition:all 0.3s;-webkit-transition:all 0.3s;-moz-transition:all 0.3s;-ms-transition:all 0.3s;-o-transition:all 0.3s;}#post-ai .ai-title{display:flex;color:var(--ai-title-color);border-radius:8px;align-items:center;padding:0 6px;position:relative;}#post-ai .ai-title i{font-weight:800;}#post-ai .ai-title-text{font-weight:bold;margin-left:8px;font-size:17px;}#post-ai .ai-tag{font-size:12px;background-color:var(--ai-tag-bg);color:var(--ai-btn-color);border-radius:4px;margin-left:auto;line-height:1;padding:4px 5px;border:var(--ai-border);}#post-ai .ai-explanation{margin-top:10px;padding:8px 12px;background:var(--ai-content-bg);border-radius:8px;border:var(--ai-content-border);font-size:15.5px;line-height:1.4;color:var(--ai-font-color);}#post-ai .ai-cursor{display:inline-block;width:7px;background:var(--ai-cursor);height:16px;margin-bottom:-2px;opacity:0.95;margin-left:3px;transition:all 0.3s;-webkit-transition:all 0.3s;-moz-transition:all 0.3s;-ms-transition:all 0.3s;-o-transition:all 0.3s;}#post-ai .ai-btn-box{font-size:15.5px;width:100%;display:flex;flex-direction:row;flex-wrap:wrap;}#post-ai .ai-btn-item{padding:5px 10px;margin:10px 16px 0px 5px;width:fit-content;line-height:1;background:var(--ai-btn-bg);border:var(--ai-border);color:var(--ai-btn-color);border-radius:6px 6px 6px 0;-webkit-border-radius:6px 6px 6px 0;-moz-border-radius:6px 6px 6px 0;-ms-border-radius:6px 6px 6px 0;-o-border-radius:6px 6px 6px 0;user-select:none;transition:all 0.3s;-webkit-transition:all 0.3s;-moz-transition:all 0.3s;-ms-transition:all 0.3s;-o-transition:all 0.3s;cursor:pointer;}#post-ai .ai-btn-item:hover{background:#49b0f5dc;}#post-ai .ai-recommend{display:flex;flex-direction:row;flex-wrap:wrap;}#post-ai .ai-recommend-item{width:50%;margin-top:2px;}#post-ai .ai-recommend-item a{border-bottom:2px solid #4c98f7;padding:0 .2em;color:#4c98f7;font-weight:700;text-decoration:none;transition:all 0.3s;-webkit-transition:all 0.3s;-moz-transition:all 0.3s;-ms-transition:all 0.3s;-o-transition:all 0.3s;}#post-ai .ai-recommend-item a:hover{background-color:#49b1f5;border-bottom:2px solid #49b1f5;color:#fff;border-radius:5px;}@media screen and (max-width:768px){#post-ai .ai-btn-box{justify-content:center;}}#post-ai .ai-title>svg{width:21px;height:fit-content;}#post-ai .ai-title>svg path{fill:var(--ai-font-color);}#post-ai .ai-Toggle{font-size:12px;border:var(--ai-border);background:var(--ai-btn-bg);color:var(--ai-btn-color);padding:3px 4px;border-radius:4px;margin-left:6px;cursor:pointer;-webkit-transition:.3s;-moz-transition:.3s;-o-transition:.3s;-ms-transition:.3s;transition:.3s;font-weight:bolder;pointer-events:none;opacity:0;}#post-ai .ai-Toggle:hover{background:#49b0f5dc;}#post-ai .ai-speech-box{width:21px;height:21px;background:var(--ai-font-color);margin-left:7px;border-radius:50%;display:flex;flex-direction:row;flex-wrap:wrap;align-content:center;justify-content:center;pointer-events:none;opacity:0;-webkit-transition:.3s;-moz-transition:.3s;-o-transition:.3s;-ms-transition:.3s;transition:.3s;cursor:pointer;}#post-ai .ai-speech-content{width:8px;background:var(--ai-speech-content);height:8px;border-radius:50%;-webkit-transition:.3s;-moz-transition:.3s;-o-transition:.3s;-ms-transition:.3s;transition:.3s;}#post-ai .ai-speech-box:hover .ai-speech-content{background:#49b0f5;}@keyframes ai_breathe{0%{transform:scale(0.9);-webkit-transform:scale(0.9);-moz-transform:scale(0.9);-ms-transform:scale(0.9);-o-transform:scale(0.9);}50%{transform:scale(1);-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);}}",t.additional_css&&(o.textContent+=t.additional_css),document.head.appendChild(o)}();const a=document.createElement("div");a.className="post-ai",a.setAttribute("id","post-ai"),n.insertBefore(a,n.firstChild),a.innerHTML=`<div class="ai-title">\n <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="21px" height="21px" viewBox="0 0 48 48">\n <g id="机器人" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"><path d="M34.717885,5.03561087 C36.12744,5.27055371 37.079755,6.60373651 36.84481,8.0132786 L35.7944,14.3153359 L38.375,14.3153359 C43.138415,14.3153359 47,18.1768855 47,22.9402569 L47,34.4401516 C47,39.203523 43.138415,43.0650727 38.375,43.0650727 L9.625,43.0650727 C4.861585,43.0650727 1,39.203523 1,34.4401516 L1,22.9402569 C1,18.1768855 4.861585,14.3153359 9.625,14.3153359 L12.2056,14.3153359 L11.15519,8.0132786 C10.920245,6.60373651 11.87256,5.27055371 13.282115,5.03561087 C14.69167,4.80066802 16.024865,5.7529743 16.25981,7.16251639 L17.40981,14.0624532 C17.423955,14.1470924 17.43373,14.2315017 17.43948,14.3153359 L30.56052,14.3153359 C30.56627,14.2313867 30.576045,14.1470924 30.59019,14.0624532 L31.74019,7.16251639 C31.975135,5.7529743 33.30833,4.80066802 34.717885,5.03561087 Z M38.375,19.4902885 L9.625,19.4902885 C7.719565,19.4902885 6.175,21.0348394 6.175,22.9402569 L6.175,34.4401516 C6.175,36.3455692 7.719565,37.89012 9.625,37.89012 L38.375,37.89012 C40.280435,37.89012 41.825,36.3455692 41.825,34.4401516 L41.825,22.9402569 C41.825,21.0348394 40.280435,19.4902885 38.375,19.4902885 Z M14.8575,23.802749 C16.28649,23.802749 17.445,24.9612484 17.445,26.3902253 L17.445,28.6902043 C17.445,30.1191812 16.28649,31.2776806 14.8575,31.2776806 C13.42851,31.2776806 12.27,30.1191812 12.27,28.6902043 L12.27,26.3902253 C12.27,24.9612484 13.42851,23.802749 14.8575,23.802749 Z M33.1425,23.802749 C34.57149,23.802749 35.73,24.9612484 35.73,26.3902253 L35.73,28.6902043 C35.73,30.1191812 34.57149,31.2776806 33.1425,31.2776806 C31.71351,31.2776806 30.555,30.1191812 30.555,28.6902043 L30.555,26.3902253 C30.555,24.9612484 31.71351,23.802749 33.1425,23.802749 Z" id="形状结合" fill="#444444" fill-rule="nonzero"></path></g></svg>\n <div class="ai-title-text">${r.name}</div>\n <div class="ai-Toggle">切换简介</div>\n <div class="ai-speech-box">\n <div class="ai-speech-content"></div>\n </div>\n <div class="ai-tag">${r.version}</div>\n </div>\n <div class="ai-explanation">${r.name}初始化中...</div>\n <div class="ai-btn-box">\n <div class="ai-btn-item">${r.button[0]}</div>\n <div class="ai-btn-item">${r.button[1]}</div>\n <div class="ai-btn-item">${r.button[2]}</div>\n <div class="ai-btn-item">${r.button[3]}</div>\n </div>`;let s=!0,l=document.querySelector(".ai-explanation"),c=document.querySelector(".post-ai"),d=document.querySelectorAll(".ai-btn-item"),m=document.querySelector(".ai-Toggle"),p=document.querySelector(".ai-speech-box"),u="",f="",g=600,h=0,b=0,y=t.speed||20,x=7.5*y,w=[],v=0,S=!1,k=new AbortController,E=k.signal,C="",I="";const L=t.summary_toggle??!0,T=t.summary_speech??!0;let A=0,$=!1,N="",O="",_=!1;const q=t.summary_num||3,j=!0,z="填入chatGPT的apiKey",P=`https://${window.location.host}/`,M=t.key?t.key:"123456",R=t=>{if(s)if(R.start||(R.start=t),v=t-R.start,v>=y){if(R.start=t,h<f-1){let t=u.charAt(h+1),e=/[,.,。!?!?]/.test(t)?x:y;l.firstElementChild&&l.removeChild(l.firstElementChild),l.innerHTML+=t;let o=document.createElement("div");o.className="ai-cursor",l.appendChild(o),h++,e===x&&(document.querySelector(".ai-explanation .ai-cursor").style.opacity="0"),h===f-1&&(G.disconnect(),l.removeChild(l.firstElementChild)),w[0]=setTimeout((()=>{requestAnimationFrame(R)}),e)}}else requestAnimationFrame(R)},G=new IntersectionObserver((t=>{let e=t[0].isIntersecting;s=e,s&&(g=0===h?200:20,w[1]=setTimeout((()=>{b&&(h=0,b=0),0===h&&(l.innerHTML=u.charAt(0)),requestAnimationFrame(R)}),g))}),{threshold:0});function H(t=!0,e="生成中. . ."){h=0,b=1,w.length&&w.forEach((t=>{t&&clearTimeout(t)})),s=!1,v=0,l.innerHTML=t?e:"请等待. . .",S||k.abort(),u="",f="",L&&(m.style.opacity="0",m.style.pointerEvents="none"),T&&(Z(),p.style.opacity="0",p.style.pointerEvents="none"),G.disconnect()}function J(e,o=!0){t.hasOwnProperty("typewriter")&&!t.typewriter?l.innerHTML=e:(H(o),u=e,f=u.length,G.observe(c))}function B(){J(r.introduce)}function F(){H(),w[2]=setTimeout((async()=>{let e=await async function(){S=!1,k=new AbortController,E=k.signal;let e="",o="",n="";const i={signal:E,method:"GET",headers:{"content-type":"application/x-www-form-urlencoded"}};if(sessionStorage.getItem("recommendList"))n=JSON.parse(sessionStorage.getItem("recommendList"));else{try{if(e=await fetch(`https://summary.tianli0.top/recommends?url=${encodeURIComponent(window.location.href)}&author=${t.rec_method?t.rec_method:"all"}`,i),S=!0,429===e.status&&J("请求过于频繁,请稍后再请求AI。"),!e.ok)throw new Error("Response not ok")}catch(t){return"AbortError"===t.name||(console.error("Error occurred:",t),J("获取推荐出错了,请稍后再试。")),S=!0,!1}n=await e.json(),sessionStorage.setItem("recommendList",JSON.stringify(n))}if(n.hasOwnProperty("success")&&!n.success)return!1;o="推荐文章:<br />",o+='<div class="ai-recommend">',n.forEach(((t,e)=>{o+=`<div class="ai-recommend-item"><span>推荐${e+1}:</span><a target="_blank" href="${t.url}" title="${t.title?t.title:"未获取到题目"}">${t.title?t.title:"未获取到题目"}</a></div>`})),o+="</div>";return o}();""===e||!1===e?J(`${r.name}未能找到任何可推荐的文章。`):e&&(l.innerHTML=e)}),200)}async function U(){H();const t=Y(n),e=await tt(t,j);e&&(J(e.summary),L&&(m.style.opacity="1",m.style.pointerEvents="auto",K()))}async function D(){H(!0,"矩阵穿梭中. . ."),S=!1,k=new AbortController,E=k.signal;let t="",e="";const o={signal:E,method:"GET",headers:{"content-type":"application/x-www-form-urlencoded"}};if(sessionStorage.getItem("matrixShuttle"))e=JSON.parse(sessionStorage.getItem("matrixShuttle"));else{try{if(t=await fetch("https://summary.tianli0.top/websites_used",o),S=!0,429===t.status&&J("请求过于频繁,请稍后再请求AI。"),!t.ok)throw new Error("Response not ok")}catch(t){return"AbortError"===t.name||(console.error("Error occurred:",t),J("矩阵穿梭失败了,请稍后再试。")),S=!0,!1}e=await t.json(),sessionStorage.setItem("matrixShuttle",JSON.stringify(e))}const n=function(t){if(0===t.length)return null;const e=function(t){const e=new Uint32Array(1);return window.crypto.getRandomValues(e),e[0]%t}(t.length);return t[e]}(e.websites);n?(J(`正在前往 ${n} ,已有 ${e.count} 个网站接入AI摘要。`),w[2]=setTimeout((()=>{window.open(`https://${n}`,"_blank")}),100*y)):J("没有可以穿梭的网站。")}function Z(t=!1){T&&(N&&(N.pause(),N.remove()),N=null,p.style.opacity="1",p.style.animation="",t&&(O=null))}function K(){T&&(p.style.opacity="1",p.style.animation="",p.style.pointerEvents="auto")}async function Q(e){if(!T)return;const o=URL.createObjectURL(e);if(N=new Audio(o),N.play(),t.pjax){function n(){N.pause(),N.remove(),document.removeEventListener("pjax:complete",n)}document.removeEventListener("pjax:complete",n),document.addEventListener("pjax:complete",n)}p.style.opacity="0.4",p.style.animation="ai_breathe .7s linear infinite",N.removeEventListener("ended",V),N.addEventListener("ended",V)}function V(){Z()}function X(e){const o=t.exclude?t.exclude:["highlight","Copyright-Notice","post-ai","post-series","mini-sandbox"];o.includes("post-ai")||o.push("post-ai");const n=["script","style","iframe","embed","video","audio","source","canvas","img","svg","hr","input","form"];let i="";for(let t of e.childNodes)if(t.nodeType===Node.TEXT_NODE)i+=t.textContent.trim();else if(t.nodeType===Node.ELEMENT_NODE){let e=!1;for(let n of t.classList)if(o.includes(n)){e=!0;break}let r=n.includes(t.tagName.toLowerCase());if(!e&&!r){i+=X(t)}}return i.replace(/\s+/g,"")}function W(t){const e=t.querySelectorAll("h1, h2, h3, h4"),o=[];for(let t=0;t<e.length;t++){const n=e[t],i=n.textContent.trim();o.push(i);const r=W(n);o.push(...r)}return o.join(";")}function Y(e,o=!0){let n;if(o){const o=t.total_length||1e3,i=t.ratio_string||"5:3:2";n=`文章的各级标题:${W(e)}。文章内容的截取:${function(t,e=1e3,o="5:3:2"){if(e=Math.min(e,5e3),t.length<=e)return t;const n=o.split(":").map(Number),i=n.reduce(((t,e)=>t+e),0),r=Math.min(t.length,e),a=n.map((t=>Math.floor(r*t/i))),s=t.substring(0,a[0]),l=(t.length-300)/2;return s+t.substring(l,l+a[1])+t.substring(t.length-a[2])}(X(e),o,i)}`}else n=`${X(e)}`;return n}async function tt(t,e=!0){if(!M)return"没有获取到key,代码可能没有安装正确,详细请查看文档。";if("123456"===M)return"请购买 key 使用,如果你能看到此条内容,则说明代码安装正确。";S=!1,k=new AbortController,E=k.signal;let o="";if(sessionStorage.getItem("summary"))return JSON.parse(sessionStorage.getItem("summary"));if(e){try{if(o=await fetch("https://summary.tianli0.top/",{signal:E,method:"POST",headers:{"Content-Type":"application/json",Referer:P},body:JSON.stringify({content:t,key:M,title:i,url:window.location.href,user_openid:C})}),S=!0,429===o.status&&J("请求过于频繁,请稍后再请求AI。"),!o.ok)throw new Error("Response not ok")}catch(t){return"AbortError"===t.name||("localhost"===window.location.hostname||"127.0.0.1"===window.location.hostname?J(`${r.name}请求tianliGPT出错了,你正在本地进行调试,请前往summary.zhheo.com添加本地域名(127.0.0.1:端口)的白名单。`):J(`${r.name}请求tianliGPT出错了,请稍后再试。`)),S=!0,""}const e=await o.json();return I=e.id,sessionStorage.setItem("summary",JSON.stringify(e)),Z(!0),e}{const e=`你是一个摘要生成工具,你需要解释我发送给你的内容,不要换行,不要超过200字,只需要介绍文章的内容,不需要提出建议和缺少的东西。请用中文回答,文章内容为:${t}`,n="https://api.openai.com/v1/chat/completions";try{if(o=await fetch(n,{signal:E,method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${z}`},body:JSON.stringify({model:"gpt-3.5-turbo",messages:[{role:"user",content:e}]})}),S=!0,429===o.status&&J("请求过于频繁,请稍后再请求AI。"),!o.ok)throw new Error("Response not ok")}catch(t){return console.error("Error occurred:",t),J(`${r.name}请求chatGPT出错了,请稍后再试。`),S=!0,""}const i=(await o.json()).choices[0].message.content;return sessionStorage.setItem("summary",i),i}}!async function(){sessionStorage.removeItem("recommendList"),sessionStorage.removeItem("backupsSummary");for(let t=0;t<q;t++)sessionStorage.removeItem(`summary${"#".repeat(t)}`);l=document.querySelector(".ai-explanation"),c=document.querySelector(".post-ai"),d=document.querySelectorAll(".ai-btn-item");const e=[B,F,U,D];d.forEach(((o,n)=>{t.hide_shuttle&&n===d.length-1?o.style.display="none":o.addEventListener("click",(()=>{e[n]()}))})),m=document.querySelector(".ai-Toggle"),L?m.addEventListener("click",(()=>{!async function(){H(),O=null,A=(A+1)%q;const t=Y(n)+"#".repeat(A);let e="";1!==A||$||(sessionStorage.setItem("backupsSummary",sessionStorage.getItem("summary")),$=!0),sessionStorage.getItem(`summary${"#".repeat(A)}`)?(e=JSON.parse(sessionStorage.getItem(`summary${"#".repeat(A)}`)),I=e.id,0===A?sessionStorage.setItem("summary",sessionStorage.getItem("backupsSummary")):sessionStorage.setItem("summary",sessionStorage.getItem(`summary${"#".repeat(A)}`))):(sessionStorage.removeItem("summary"),e=await tt(t,j),e&&sessionStorage.setItem(`summary${"#".repeat(A)}`,JSON.stringify(e))),e&&(J(e.summary),m.style.opacity="1",m.style.pointerEvents="auto",K())}()})):m.style.display="none",p=document.querySelector(".ai-speech-box"),T?p.addEventListener("click",(()=>{!async function(){if(!I)return;let t="";if(!O||N)if(N&&N)_?(_=!1,N.play(),p.style.opacity="0.4",p.style.animation="ai_breathe .7s linear infinite"):(_=!0,N.pause(),p.style.opacity="1",p.style.animation="");else{const e={method:"GET",headers:{"Content-Type":"application/json",Referer:P}},o=new URLSearchParams({key:M,id:I});try{p.style.pointerEvents="none",p.style.opacity="0.4",t=await fetch(`https://summary.tianli0.top/audio?${o}`,e),403===t.status?console.error("403 refer与key不匹配。"):500===t.status?console.error("500 系统内部错误"):(O=await t.blob(),p.style.pointerEvents="auto",await Q(O))}catch(t){console.log("摘要语音请求出错:",t),p.style.opacity="1",p.style.pointerEvents="auto"}}else await Q(O)}()})):p.style.display="none",t.summary_directly?U():B(),C=localStorage.getItem("visitorId")||await async function(){try{const t=await import("https://openfpcdn.io/fingerprintjs/v4"),e=await t.default.load(),o=(await e.get()).visitorId;return localStorage.setItem("visitorId",o),o}catch(t){return console.error("生成ID失败"),null}}()}()}e(t),t.pjax&&document.addEventListener("pjax:complete",(()=>{setTimeout((()=>{e(t)}),0)}))}window.hasOwnProperty("aiExecuted")||(console.log("%cPost-Summary-AI 文章摘要AI生成工具:%chttps://github.com/qxchuckle/Post-Summary-AI%c","border:1px #888 solid;border-right:0;border-radius:5px 0 0 5px;padding: 5px 10px;color:white;background:#4976f5;margin:10px 0","border:1px #888 solid;border-left:0;border-radius:0 5px 5px 0;padding: 5px 10px;",""),window.aiExecuted="chuckle");
|
1
|
+
function ChucklePostAI(t){function e(t){const e=document.querySelector(".post-ai");e&&e.parentElement.removeChild(e);const o=window.location.href;if(t.eliminate&&t.eliminate.length&&t.eliminate.some((t=>o.includes(t))))return;if(t.whitelist&&t.whitelist.length&&!t.whitelist.some((t=>o.includes(t))))return;let n="";n=!t.auto_mount&&t.el?document.querySelector(t.el?t.el:"#post #article-container"):function(){function t(e){let o=1;for(const n of e.children)o+=t(n);return o}function e(t){if(["IFRAME","FOOTER","HEADER","BLOCKQUOTE"].includes(t.tagName))return!0;const e=["aplayer","comment"];return Array.from(t.classList).some((t=>e.some((e=>t.includes(e)))))}function o(t){const o={H1:1.5,H2:1,H3:.5,P:1};let n=0,i=null;function r(t){if(e(t))return;let a=0;for(const e of t.children)e.tagName in o&&(a+=o[e.tagName]);a>n&&(n=a,i=t);for(const e of t.children)r(e)}return r(t),i}function n(){const n=[document.body];let i=0,r=null;for(;n.length>0;){const o=n.shift();if(e(o))continue;const a=t(o);a>i&&(i=a,r=o);for(const t of o.children)n.push(t)}return o(r)}return n()}();const i=document.querySelector(t.title_el)?document.querySelector(t.title_el).textContent:document.title;if(!n)return;const r={name:"ChatGPT",introduce:"我是OpenAI的人工智能助手,名为ChatGPT。我是一个大型语言模型,可以理解和生成人类语言。我不是一个真实的人,我没有情感,也没有个人经历,我只是一个计算机程序。点击下方的按钮,让我生成本文简介、推荐相关文章等。",version:"GPT-4",button:["介绍自己","推荐相关文章","生成AI简介","矩阵穿梭"],...t.interface};!function(){const e="qx-ai-style";if(document.getElementById(e))return;const o=document.createElement("style");o.id=e,o.textContent=t.css||":root{--ai-font-color:#353535;--ai-post-bg:#f1f3f8;--ai-content-bg:#fff;--ai-content-border:1px solid #e3e8f7;--ai-border:1px solid #e3e8f7bd;--ai-tag-bg:rgba(48,52,63,0.80);--ai-cursor:#333;--ai-btn-bg:rgba(48,52,63,0.75);--ai-title-color:#4c4948;--ai-btn-color:#fff;--ai-speech-content:#fff;}[data-theme=dark],.theme-dark,body.dark,body.dark-theme{--ai-font-color:rgba(255,255,255,0.9);--ai-post-bg:#30343f;--ai-content-bg:#1d1e22;--ai-content-border:1px solid #42444a;--ai-border:1px solid #3d3d3f;--ai-tag-bg:#1d1e22;--ai-cursor:rgb(255,255,255,0.9);--ai-btn-bg:#1d1e22;--ai-title-color:rgba(255,255,255,0.86);--ai-btn-color:rgb(255,255,255,0.9);--ai-speech-content:#1d1e22;}#post-ai.post-ai{background:var(--ai-post-bg);border-radius:12px;padding:10px 12px 11px;line-height:1.3;border:var(--ai-border);margin-top:10px;margin-bottom:6px;transition:all 0.3s;-webkit-transition:all 0.3s;-moz-transition:all 0.3s;-ms-transition:all 0.3s;-o-transition:all 0.3s;}#post-ai .ai-title{display:flex;color:var(--ai-title-color);border-radius:8px;align-items:center;padding:0 6px;position:relative;}#post-ai .ai-title i{font-weight:800;}#post-ai .ai-title-text{font-weight:bold;margin-left:8px;font-size:17px;}#post-ai .ai-tag{font-size:12px;background-color:var(--ai-tag-bg);color:var(--ai-btn-color);border-radius:4px;margin-left:auto;line-height:1;padding:4px 5px;border:var(--ai-border);}#post-ai .ai-explanation{margin-top:10px;padding:8px 12px;background:var(--ai-content-bg);border-radius:8px;border:var(--ai-content-border);font-size:15.5px;line-height:1.4;color:var(--ai-font-color);}#post-ai .ai-cursor{display:inline-block;width:7px;background:var(--ai-cursor);height:16px;margin-bottom:-2px;opacity:0.95;margin-left:3px;transition:all 0.3s;-webkit-transition:all 0.3s;-moz-transition:all 0.3s;-ms-transition:all 0.3s;-o-transition:all 0.3s;}#post-ai .ai-btn-box{font-size:15.5px;width:100%;display:flex;flex-direction:row;flex-wrap:wrap;}#post-ai .ai-btn-item{padding:5px 10px;margin:10px 16px 0px 5px;width:fit-content;line-height:1;background:var(--ai-btn-bg);border:var(--ai-border);color:var(--ai-btn-color);border-radius:6px 6px 6px 0;-webkit-border-radius:6px 6px 6px 0;-moz-border-radius:6px 6px 6px 0;-ms-border-radius:6px 6px 6px 0;-o-border-radius:6px 6px 6px 0;user-select:none;transition:all 0.3s;-webkit-transition:all 0.3s;-moz-transition:all 0.3s;-ms-transition:all 0.3s;-o-transition:all 0.3s;cursor:pointer;}#post-ai .ai-btn-item:hover{background:#49b0f5dc;}#post-ai .ai-recommend{display:flex;flex-direction:row;flex-wrap:wrap;}#post-ai .ai-recommend-item{width:50%;margin-top:2px;}#post-ai .ai-recommend-item a{border-bottom:2px solid #4c98f7;padding:0 .2em;color:#4c98f7;font-weight:700;text-decoration:none;transition:all 0.3s;-webkit-transition:all 0.3s;-moz-transition:all 0.3s;-ms-transition:all 0.3s;-o-transition:all 0.3s;}#post-ai .ai-recommend-item a:hover{background-color:#49b1f5;border-bottom:2px solid #49b1f5;color:#fff;border-radius:5px;}@media screen and (max-width:768px){#post-ai .ai-btn-box{justify-content:center;}}#post-ai .ai-title>svg{width:21px;height:21px;}#post-ai .ai-title>svg path{fill:var(--ai-font-color);}#post-ai .ai-Toggle{font-size:12px;border:var(--ai-border);background:var(--ai-btn-bg);color:var(--ai-btn-color);padding:3px 4px;border-radius:4px;margin-left:6px;cursor:pointer;-webkit-transition:.3s;-moz-transition:.3s;-o-transition:.3s;-ms-transition:.3s;transition:.3s;font-weight:bolder;pointer-events:none;opacity:0;}#post-ai .ai-Toggle:hover{background:#49b0f5dc;}#post-ai .ai-speech-box{width:21px;height:21px;background:var(--ai-font-color);margin-left:7px;border-radius:50%;display:flex;flex-direction:row;flex-wrap:wrap;align-content:center;justify-content:center;pointer-events:none;opacity:0;-webkit-transition:.3s;-moz-transition:.3s;-o-transition:.3s;-ms-transition:.3s;transition:.3s;cursor:pointer;}#post-ai .ai-speech-content{width:8px;background:var(--ai-speech-content);height:8px;border-radius:50%;-webkit-transition:.3s;-moz-transition:.3s;-o-transition:.3s;-ms-transition:.3s;transition:.3s;}#post-ai .ai-speech-box:hover .ai-speech-content{background:#49b0f5;}@keyframes ai_breathe{0%{transform:scale(0.9);-webkit-transform:scale(0.9);-moz-transform:scale(0.9);-ms-transform:scale(0.9);-o-transform:scale(0.9);}50%{transform:scale(1);-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);}}",t.additional_css&&(o.textContent+=t.additional_css),document.head.appendChild(o)}();const a=document.createElement("div");a.className="post-ai",a.setAttribute("id","post-ai"),n.insertBefore(a,n.firstChild),a.innerHTML=`<div class="ai-title">\n <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="21px" height="21px" viewBox="0 0 48 48">\n <g id="机器人" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"><path d="M34.717885,5.03561087 C36.12744,5.27055371 37.079755,6.60373651 36.84481,8.0132786 L35.7944,14.3153359 L38.375,14.3153359 C43.138415,14.3153359 47,18.1768855 47,22.9402569 L47,34.4401516 C47,39.203523 43.138415,43.0650727 38.375,43.0650727 L9.625,43.0650727 C4.861585,43.0650727 1,39.203523 1,34.4401516 L1,22.9402569 C1,18.1768855 4.861585,14.3153359 9.625,14.3153359 L12.2056,14.3153359 L11.15519,8.0132786 C10.920245,6.60373651 11.87256,5.27055371 13.282115,5.03561087 C14.69167,4.80066802 16.024865,5.7529743 16.25981,7.16251639 L17.40981,14.0624532 C17.423955,14.1470924 17.43373,14.2315017 17.43948,14.3153359 L30.56052,14.3153359 C30.56627,14.2313867 30.576045,14.1470924 30.59019,14.0624532 L31.74019,7.16251639 C31.975135,5.7529743 33.30833,4.80066802 34.717885,5.03561087 Z M38.375,19.4902885 L9.625,19.4902885 C7.719565,19.4902885 6.175,21.0348394 6.175,22.9402569 L6.175,34.4401516 C6.175,36.3455692 7.719565,37.89012 9.625,37.89012 L38.375,37.89012 C40.280435,37.89012 41.825,36.3455692 41.825,34.4401516 L41.825,22.9402569 C41.825,21.0348394 40.280435,19.4902885 38.375,19.4902885 Z M14.8575,23.802749 C16.28649,23.802749 17.445,24.9612484 17.445,26.3902253 L17.445,28.6902043 C17.445,30.1191812 16.28649,31.2776806 14.8575,31.2776806 C13.42851,31.2776806 12.27,30.1191812 12.27,28.6902043 L12.27,26.3902253 C12.27,24.9612484 13.42851,23.802749 14.8575,23.802749 Z M33.1425,23.802749 C34.57149,23.802749 35.73,24.9612484 35.73,26.3902253 L35.73,28.6902043 C35.73,30.1191812 34.57149,31.2776806 33.1425,31.2776806 C31.71351,31.2776806 30.555,30.1191812 30.555,28.6902043 L30.555,26.3902253 C30.555,24.9612484 31.71351,23.802749 33.1425,23.802749 Z" id="形状结合" fill="#444444" fill-rule="nonzero"></path></g></svg>\n <div class="ai-title-text">${r.name}</div>\n <div class="ai-Toggle">切换简介</div>\n <div class="ai-speech-box">\n <div class="ai-speech-content"></div>\n </div>\n <div class="ai-tag">${r.version}</div>\n </div>\n <div class="ai-explanation">${r.name}初始化中...</div>\n <div class="ai-btn-box">\n <div class="ai-btn-item">${r.button[0]}</div>\n <div class="ai-btn-item">${r.button[1]}</div>\n <div class="ai-btn-item">${r.button[2]}</div>\n <div class="ai-btn-item">${r.button[3]}</div>\n </div>`;let s=!0,l=document.querySelector(".ai-explanation"),c=document.querySelector(".post-ai"),d=document.querySelectorAll(".ai-btn-item"),m=document.querySelector(".ai-Toggle"),p=document.querySelector(".ai-speech-box"),u="",f="",g=600,h=0,b=0,y=t.speed||20,x=7.5*y,w=[],v=0,S=!1,k=new AbortController,E=k.signal,C="",I="";const L=t.summary_toggle??!0,T=t.summary_speech??!0;let A=0,$=!1,N="",O="",_=!1;const q=t.summary_num||3,j=!0,z="填入chatGPT的apiKey",P=`https://${window.location.host}/`,M=t.key?t.key:"123456",R=t=>{if(s)if(R.start||(R.start=t),v=t-R.start,v>=y){if(R.start=t,h<f-1){let t=u.charAt(h+1),e=/[,.,。!?!?]/.test(t)?x:y;l.firstElementChild&&l.removeChild(l.firstElementChild),l.innerHTML+=t;let o=document.createElement("div");o.className="ai-cursor",l.appendChild(o),h++,e===x&&(document.querySelector(".ai-explanation .ai-cursor").style.opacity="0"),h===f-1&&(G.disconnect(),l.removeChild(l.firstElementChild)),w[0]=setTimeout((()=>{requestAnimationFrame(R)}),e)}}else requestAnimationFrame(R)},G=new IntersectionObserver((t=>{let e=t[0].isIntersecting;s=e,s&&(g=0===h?200:20,w[1]=setTimeout((()=>{b&&(h=0,b=0),0===h&&(l.innerHTML=u.charAt(0)),requestAnimationFrame(R)}),g))}),{threshold:0});function H(t=!0,e="生成中. . ."){h=0,b=1,w.length&&w.forEach((t=>{t&&clearTimeout(t)})),s=!1,v=0,l.innerHTML=t?e:"请等待. . .",S||k.abort(),u="",f="",L&&(m.style.opacity="0",m.style.pointerEvents="none"),T&&(Z(),p.style.opacity="0",p.style.pointerEvents="none"),G.disconnect()}function J(e,o=!0){t.hasOwnProperty("typewriter")&&!t.typewriter?l.innerHTML=e:(H(o),u=e,f=u.length,G.observe(c))}function B(){J(r.introduce)}function F(){H(),w[2]=setTimeout((async()=>{let e=await async function(){S=!1,k=new AbortController,E=k.signal;let e="",o="",n="";const i={signal:E,method:"GET",headers:{"content-type":"application/x-www-form-urlencoded"}};if(sessionStorage.getItem("recommendList"))n=JSON.parse(sessionStorage.getItem("recommendList"));else{try{if(e=await fetch(`https://summary.tianli0.top/recommends?url=${encodeURIComponent(window.location.href)}&author=${t.rec_method?t.rec_method:"all"}`,i),S=!0,429===e.status&&J("请求过于频繁,请稍后再请求AI。"),!e.ok)throw new Error("Response not ok")}catch(t){return"AbortError"===t.name||(console.error("Error occurred:",t),J("获取推荐出错了,请稍后再试。")),S=!0,!1}n=await e.json(),sessionStorage.setItem("recommendList",JSON.stringify(n))}if(n.hasOwnProperty("success")&&!n.success)return!1;o="推荐文章:<br />",o+='<div class="ai-recommend">',n.forEach(((t,e)=>{o+=`<div class="ai-recommend-item"><span>推荐${e+1}:</span><a target="_blank" href="${t.url}" title="${t.title?t.title:"未获取到题目"}">${t.title?t.title:"未获取到题目"}</a></div>`})),o+="</div>";return o}();""===e||!1===e?J(`${r.name}未能找到任何可推荐的文章。`):e&&(l.innerHTML=e)}),200)}async function U(){H();const t=Y(n),e=await tt(t,j);e&&(J(e.summary),L&&(m.style.opacity="1",m.style.pointerEvents="auto",K()))}async function D(){H(!0,"矩阵穿梭中. . ."),S=!1,k=new AbortController,E=k.signal;let t="",e="";const o={signal:E,method:"GET",headers:{"content-type":"application/x-www-form-urlencoded"}};if(sessionStorage.getItem("matrixShuttle"))e=JSON.parse(sessionStorage.getItem("matrixShuttle"));else{try{if(t=await fetch("https://summary.tianli0.top/websites_used",o),S=!0,429===t.status&&J("请求过于频繁,请稍后再请求AI。"),!t.ok)throw new Error("Response not ok")}catch(t){return"AbortError"===t.name||(console.error("Error occurred:",t),J("矩阵穿梭失败了,请稍后再试。")),S=!0,!1}e=await t.json(),sessionStorage.setItem("matrixShuttle",JSON.stringify(e))}const n=function(t){if(0===t.length)return null;const e=function(t){const e=new Uint32Array(1);return window.crypto.getRandomValues(e),e[0]%t}(t.length);return t[e]}(e.websites);n?(J(`正在前往 ${n} ,已有 ${e.count} 个网站接入AI摘要。`),w[2]=setTimeout((()=>{window.open(`https://${n}`,"_blank")}),100*y)):J("没有可以穿梭的网站。")}function Z(t=!1){T&&(N&&(N.pause(),N.remove()),N=null,p.style.opacity="1",p.style.animation="",t&&(O=null))}function K(){T&&(p.style.opacity="1",p.style.animation="",p.style.pointerEvents="auto")}async function Q(e){if(!T)return;const o=URL.createObjectURL(e);if(N=new Audio(o),N.play(),t.pjax){function n(){N.pause(),N.remove(),document.removeEventListener("pjax:complete",n)}document.removeEventListener("pjax:complete",n),document.addEventListener("pjax:complete",n)}p.style.opacity="0.4",p.style.animation="ai_breathe .7s linear infinite",N.removeEventListener("ended",V),N.addEventListener("ended",V)}function V(){Z()}function X(e){const o=t.exclude?t.exclude:["highlight","Copyright-Notice","post-ai","post-series","mini-sandbox"];o.includes("post-ai")||o.push("post-ai");const n=["script","style","iframe","embed","video","audio","source","canvas","img","svg","hr","input","form"];let i="";for(let t of e.childNodes)if(t.nodeType===Node.TEXT_NODE)i+=t.textContent.trim();else if(t.nodeType===Node.ELEMENT_NODE){let e=!1;for(let n of t.classList)if(o.includes(n)){e=!0;break}let r=n.includes(t.tagName.toLowerCase());if(!e&&!r){i+=X(t)}}return i.replace(/\s+/g,"")}function W(t){const e=t.querySelectorAll("h1, h2, h3, h4"),o=[];for(let t=0;t<e.length;t++){const n=e[t],i=n.textContent.trim();o.push(i);const r=W(n);o.push(...r)}return o.join(";")}function Y(e,o=!0){let n;if(o){const o=t.total_length||1e3,i=t.ratio_string||"5:3:2";n=`文章的各级标题:${W(e)}。文章内容的截取:${function(t,e=1e3,o="5:3:2"){if(e=Math.min(e,5e3),t.length<=e)return t;const n=o.split(":").map(Number),i=n.reduce(((t,e)=>t+e),0),r=Math.min(t.length,e),a=n.map((t=>Math.floor(r*t/i))),s=t.substring(0,a[0]),l=(t.length-300)/2;return s+t.substring(l,l+a[1])+t.substring(t.length-a[2])}(X(e),o,i)}`}else n=`${X(e)}`;return n}async function tt(t,e=!0){if(!M)return"没有获取到key,代码可能没有安装正确,详细请查看文档。";if("123456"===M)return"请购买 key 使用,如果你能看到此条内容,则说明代码安装正确。";S=!1,k=new AbortController,E=k.signal;let o="";if(sessionStorage.getItem("summary"))return JSON.parse(sessionStorage.getItem("summary"));if(e){try{if(o=await fetch("https://summary.tianli0.top/",{signal:E,method:"POST",headers:{"Content-Type":"application/json",Referer:P},body:JSON.stringify({content:t,key:M,title:i,url:window.location.href,user_openid:C})}),S=!0,429===o.status&&J("请求过于频繁,请稍后再请求AI。"),!o.ok)throw new Error("Response not ok")}catch(t){return"AbortError"===t.name||("localhost"===window.location.hostname||"127.0.0.1"===window.location.hostname?J(`${r.name}请求tianliGPT出错了,你正在本地进行调试,请前往summary.zhheo.com添加本地域名(127.0.0.1:端口)的白名单。`):J(`${r.name}请求tianliGPT出错了,请稍后再试。`)),S=!0,""}const e=await o.json();return I=e.id,sessionStorage.setItem("summary",JSON.stringify(e)),Z(!0),e}{const e=`你是一个摘要生成工具,你需要解释我发送给你的内容,不要换行,不要超过200字,只需要介绍文章的内容,不需要提出建议和缺少的东西。请用中文回答,文章内容为:${t}`,n="https://api.openai.com/v1/chat/completions";try{if(o=await fetch(n,{signal:E,method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${z}`},body:JSON.stringify({model:"gpt-3.5-turbo",messages:[{role:"user",content:e}]})}),S=!0,429===o.status&&J("请求过于频繁,请稍后再请求AI。"),!o.ok)throw new Error("Response not ok")}catch(t){return console.error("Error occurred:",t),J(`${r.name}请求chatGPT出错了,请稍后再试。`),S=!0,""}const i=(await o.json()).choices[0].message.content;return sessionStorage.setItem("summary",i),i}}!async function(){sessionStorage.removeItem("recommendList"),sessionStorage.removeItem("backupsSummary");for(let t=0;t<q;t++)sessionStorage.removeItem(`summary${"#".repeat(t)}`);l=document.querySelector(".ai-explanation"),c=document.querySelector(".post-ai"),d=document.querySelectorAll(".ai-btn-item");const e=[B,F,U,D];d.forEach(((o,n)=>{t.hide_shuttle&&n===d.length-1?o.style.display="none":o.addEventListener("click",(()=>{e[n]()}))})),m=document.querySelector(".ai-Toggle"),L?m.addEventListener("click",(()=>{!async function(){H(),O=null,A=(A+1)%q;const t=Y(n)+"#".repeat(A);let e="";1!==A||$||(sessionStorage.setItem("backupsSummary",sessionStorage.getItem("summary")),$=!0),sessionStorage.getItem(`summary${"#".repeat(A)}`)?(e=JSON.parse(sessionStorage.getItem(`summary${"#".repeat(A)}`)),I=e.id,0===A?sessionStorage.setItem("summary",sessionStorage.getItem("backupsSummary")):sessionStorage.setItem("summary",sessionStorage.getItem(`summary${"#".repeat(A)}`))):(sessionStorage.removeItem("summary"),e=await tt(t,j),e&&sessionStorage.setItem(`summary${"#".repeat(A)}`,JSON.stringify(e))),e&&(J(e.summary),m.style.opacity="1",m.style.pointerEvents="auto",K())}()})):m.style.display="none",p=document.querySelector(".ai-speech-box"),T?p.addEventListener("click",(()=>{!async function(){if(!I)return;let t="";if(!O||N)if(N&&N)_?(_=!1,N.play(),p.style.opacity="0.4",p.style.animation="ai_breathe .7s linear infinite"):(_=!0,N.pause(),p.style.opacity="1",p.style.animation="");else{const e={method:"GET",headers:{"Content-Type":"application/json",Referer:P}},o=new URLSearchParams({key:M,id:I});try{p.style.pointerEvents="none",p.style.opacity="0.4",t=await fetch(`https://summary.tianli0.top/audio?${o}`,e),403===t.status?console.error("403 refer与key不匹配。"):500===t.status?console.error("500 系统内部错误"):(O=await t.blob(),p.style.pointerEvents="auto",await Q(O))}catch(t){console.log("摘要语音请求出错:",t),p.style.opacity="1",p.style.pointerEvents="auto"}}else await Q(O)}()})):p.style.display="none",t.summary_directly?U():B(),C=localStorage.getItem("visitorId")||await async function(){try{const t=await import("https://openfpcdn.io/fingerprintjs/v4"),e=await t.default.load(),o=(await e.get()).visitorId;return localStorage.setItem("visitorId",o),o}catch(t){return console.error("生成ID失败"),null}}()}()}e(t),t.pjax&&document.addEventListener("pjax:complete",(()=>{setTimeout((()=>{e(t)}),0)}))}window.hasOwnProperty("aiExecuted")||(console.log("%cPost-Summary-AI 文章摘要AI生成工具:%chttps://github.com/qxchuckle/Post-Summary-AI%c","border:1px #888 solid;border-right:0;border-radius:5px 0 0 5px;padding: 5px 10px;color:white;background:#4976f5;margin:10px 0","border:1px #888 solid;border-left:0;border-radius:0 5px 5px 0;padding: 5px 10px;",""),window.aiExecuted="chuckle");
|
package/layout/404.ejs
DELETED
@@ -1,34 +0,0 @@
|
|
1
|
-
<div id="error-wrap">
|
2
|
-
<div class="error-content">
|
3
|
-
<div class="error-img" style="background-image: url('<%= theme.errorpage.img %>')"></div>
|
4
|
-
<div class="error-info">
|
5
|
-
<h1 class="error_title">404</h1>
|
6
|
-
<div class="error_subtitle">
|
7
|
-
<%= theme.errorpage.text %>
|
8
|
-
</div>
|
9
|
-
<a class="button--animated" href="/">
|
10
|
-
<i class="scoicon sco-external-link"></i>
|
11
|
-
回到主页
|
12
|
-
</a>
|
13
|
-
</div>
|
14
|
-
</div>
|
15
|
-
</div>
|
16
|
-
<% if(theme.errorpage.recommendList){ %>
|
17
|
-
<div class="aside-list">
|
18
|
-
<div class="aside-list-group">
|
19
|
-
<% for (const [index, post] of site.posts.sort('-date').data.entries()){ %>
|
20
|
-
<% if(index >= 5)break; %>
|
21
|
-
<div class="aside-list-item">
|
22
|
-
<a class="thumbnail" href="<%= url_for(post.path) %>" title="<%= post.title %>">
|
23
|
-
<img src="<%= post.cover %>" alt="<%= post.title %>">
|
24
|
-
</a>
|
25
|
-
<div class="content">
|
26
|
-
<a class="title" href="<%= url_for(post.path) %>" title="<%= post.title %>">
|
27
|
-
<%= post.title %>
|
28
|
-
</a>
|
29
|
-
</div>
|
30
|
-
</div>
|
31
|
-
<% } %>
|
32
|
-
</div>
|
33
|
-
</div>
|
34
|
-
<% } %>
|
package/layout/archive.ejs
DELETED
@@ -1,10 +0,0 @@
|
|
1
|
-
<main class="layout" id="content-inner">
|
2
|
-
<div id="archive">
|
3
|
-
<div class="article-sort-title"><%= __('page.archives') %><sup><%= page.posts.length %></sup></div>
|
4
|
-
<div class="article-sort">
|
5
|
-
<%- partial('partial/compoment/mixins/articleSort') %>
|
6
|
-
</div>
|
7
|
-
<%- partial('partial/compoment/mixins/pagination') %>
|
8
|
-
</div>
|
9
|
-
<%- partial('partial/compoment/aside/aside') %>
|
10
|
-
</main>
|
package/layout/category.ejs
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
<main class="layout" id="content-inner">
|
2
|
-
<div id="category">
|
3
|
-
<div class="category-in-bar">
|
4
|
-
<div class="category-in-bar-tips">分类</div>
|
5
|
-
<div id="category-bar">
|
6
|
-
<div class="category-bar-items" id="category-bar-items">
|
7
|
-
<%- partial('partial/compoment/home/homeCategoryBar', {select:page.category}) %>
|
8
|
-
</div>
|
9
|
-
</div>
|
10
|
-
</div>
|
11
|
-
<div class="article-sort-title"><%= page.category %></div>
|
12
|
-
<div class="article-sort">
|
13
|
-
<%- partial('partial/compoment/mixins/articleSort') %>
|
14
|
-
</div>
|
15
|
-
<%- partial('partial/compoment/mixins/pagination') %>
|
16
|
-
</div>
|
17
|
-
<%- partial('partial/compoment/aside/aside') %>
|
18
|
-
</main>
|
package/layout/index.ejs
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
<div id="home_top">
|
2
|
-
<% if(theme.hometop.bbtime){ %>
|
3
|
-
<%- partial('partial/compoment/hometop/bbTimeList') %>
|
4
|
-
<% } %>
|
5
|
-
<% if(theme.hometop.banner.enable){ %>
|
6
|
-
<%- partial('partial/hometop') %>
|
7
|
-
<% } %>
|
8
|
-
</div>
|
9
|
-
<main class="layout" id="content-inner">
|
10
|
-
<div class="recent-posts" id="recent-posts">
|
11
|
-
<div id="category-bar">
|
12
|
-
<%- partial('partial/compoment/home/homeCategoryBar', {select:false}) %>
|
13
|
-
</div>
|
14
|
-
<% for (const item of page.posts.sort('-date').data){ %>
|
15
|
-
<%- partial('partial/compoment/home/postList', {post: item}) %>
|
16
|
-
<% } %>
|
17
|
-
<%- partial('partial/compoment/mixins/pagination') %>
|
18
|
-
</div>
|
19
|
-
<%- partial('partial/compoment/aside/aside') %>
|
20
|
-
</main>
|
package/layout/layout.ejs
DELETED
@@ -1,30 +0,0 @@
|
|
1
|
-
<!DOCTYPE html>
|
2
|
-
<html lang="<%= config.language %>" data-theme="light">
|
3
|
-
<head>
|
4
|
-
<%- partial('partial/head', {cache: true}) %>
|
5
|
-
</head>
|
6
|
-
<body id="body">
|
7
|
-
<% if(theme.loading.fullpage){ %>
|
8
|
-
<%- partial('partial/loading', {cache: true}) %>
|
9
|
-
<% } %>
|
10
|
-
<%- partial('partial/console', {cache: true}) %>
|
11
|
-
<%- partial('partial/sidebar', {cache: true}) %>
|
12
|
-
|
13
|
-
<% if(page.type !== '404'){ %>
|
14
|
-
<div class="<%= is_post() ? 'post' : 'page' %>" id="body-wrap">
|
15
|
-
<%- partial('partial/header') %>
|
16
|
-
<%- body %>
|
17
|
-
<footer id="footer">
|
18
|
-
<%- partial('partial/footer', {cache: true}) %>
|
19
|
-
</footer>
|
20
|
-
</div>
|
21
|
-
<% }else{ %>
|
22
|
-
<div class="error" id="body-wrap">
|
23
|
-
<%- body %>
|
24
|
-
</div>
|
25
|
-
<% } %>
|
26
|
-
<%- partial('partial/body', {cache: true}) %>
|
27
|
-
<%- partial('partial/compoment/third-party/search/index', {cache: true}) %>
|
28
|
-
<%- partial('partial/compoment/third-party/music', {cache: true}) %>
|
29
|
-
</body>
|
30
|
-
</html>
|
package/layout/page/about.ejs
DELETED
@@ -1,13 +0,0 @@
|
|
1
|
-
<% if (theme.about) { %>
|
2
|
-
<div id="about-page">
|
3
|
-
<%- partial('partial/compoment/about/authorinfo' ) %>
|
4
|
-
<%- partial('partial/compoment/about/contentinfo' ) %>
|
5
|
-
<%- partial('partial/compoment/about/skillsinfo' ) %>
|
6
|
-
<%- partial('partial/compoment/about/personalities' ) %>
|
7
|
-
<%- partial('partial/compoment/about/motto' ) %>
|
8
|
-
<%- partial('partial/compoment/about/hobbies' ) %>
|
9
|
-
<%- partial('partial/compoment/about/other' ) %>
|
10
|
-
<%- partial('partial/compoment/about/award' ) %>
|
11
|
-
</div>
|
12
|
-
<script src="<%= theme.echarts.js %>" rel="external nofollow"></script>
|
13
|
-
<% } %>
|
@@ -1,12 +0,0 @@
|
|
1
|
-
<h1 class="page-title"><%= __('page.category') %></h1>
|
2
|
-
<div class="category-lists">
|
3
|
-
<div class="tag-cloud-list is-center">
|
4
|
-
<% site.categories.data.forEach(data => { %>
|
5
|
-
<a href="<%= url_for(data.path.toLowerCase()) %>">
|
6
|
-
<span class="tags-punctuation"></span>
|
7
|
-
<%= data.name %>
|
8
|
-
<span class="tagsPageCount"><%= data.length %></span>
|
9
|
-
</a>
|
10
|
-
<% }) %>
|
11
|
-
</div>
|
12
|
-
</div>
|
package/layout/page/circle.ejs
DELETED
package/layout/page/echarts.ejs
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
<script src="<%= theme.echarts.js %>" rel="external nofollow"></script>
|
2
|
-
|
3
|
-
<main class="layout hide-aside" id="content-inner">
|
4
|
-
<div id="page">
|
5
|
-
<%- page.content %>
|
6
|
-
<% if(page.comment){ %>
|
7
|
-
<%- partial('partial/compoment/third-party/comments/comment') %>
|
8
|
-
<% } %>
|
9
|
-
</div>
|
10
|
-
|
11
|
-
<% if(page.aside){%>
|
12
|
-
<%- partial('partial/compoment/aside/aside') %>
|
13
|
-
<%} %>
|
14
|
-
</main>
|
package/layout/page/links.ejs
DELETED
@@ -1,46 +0,0 @@
|
|
1
|
-
<div class="flink" id="banners">
|
2
|
-
<%- partial('partial/compoment/links/banner') %>
|
3
|
-
</div>
|
4
|
-
<% if(theme.circle.angle.enable){ %>
|
5
|
-
<%- partial('partial/compoment/links/angle') %>
|
6
|
-
<% } %>
|
7
|
-
<div class="flink" id="article-container">
|
8
|
-
<% site.data.links.links.forEach(data => { %>
|
9
|
-
<h2><%= data.class_name %></h2>
|
10
|
-
<div class="flink-desc"><%= data.descr %></div>
|
11
|
-
<% switch (data.type) {
|
12
|
-
case 'card': %>
|
13
|
-
<%- partial('partial/compoment/links/linksCard', {data: data.link_list}) %>
|
14
|
-
<% break;
|
15
|
-
case 'item': %>
|
16
|
-
<%- partial('partial/compoment/links/linksItem', {data: data.link_list}) %>
|
17
|
-
<% break;
|
18
|
-
default: %>
|
19
|
-
<% break; } %>
|
20
|
-
<% }); %>
|
21
|
-
</div>
|
22
|
-
<h3 align="end">——本站友链排序不分先后,所有站点都值得一看。</h3>
|
23
|
-
<% if(theme.comment.enable){ %>
|
24
|
-
<h2 id="友情链接申请">友情链接申请</h2>
|
25
|
-
<div id="article-container">
|
26
|
-
<%- page.content %>
|
27
|
-
</div>
|
28
|
-
<p>请<b>勾选</b>你符合的条件:</p>
|
29
|
-
<div id="friendlink_checkboxs">
|
30
|
-
<p>
|
31
|
-
<label><input type="checkbox" id="checkbox1" onclick="checkForm()"> 我已添加 <b><%= config.title %></b>
|
32
|
-
博客的友情链接</label>
|
33
|
-
</p>
|
34
|
-
<p>
|
35
|
-
<label><input type="checkbox" id="checkbox2" onclick="checkForm()"> 我的链接主体为
|
36
|
-
<b>个人</b>,网站类型为<b>博客</b></label>
|
37
|
-
</p>
|
38
|
-
<p>
|
39
|
-
<label><input type="checkbox" id="checkbox3" onclick="checkForm()">
|
40
|
-
我的网站现在可以在中国大陆区域正常访问</label>
|
41
|
-
</p>
|
42
|
-
<p>
|
43
|
-
<label><input type="checkbox" id="checkbox4" onclick="checkForm()"> 网站内容符合中国大陆法律法规</label>
|
44
|
-
</p>
|
45
|
-
</div>
|
46
|
-
<% } %>
|
package/layout/page/page.ejs
DELETED