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.
Files changed (304) hide show
  1. package/LICENSE +674 -19
  2. package/README.md +56 -19
  3. package/README_EN.md +98 -0
  4. package/_config.yml +274 -224
  5. package/languages/en-US.yml +1 -0
  6. package/languages/zh-CN.yml +8 -8
  7. package/layout/404.pug +24 -0
  8. package/layout/archive.pug +11 -0
  9. package/layout/category.pug +16 -0
  10. package/layout/includes/console.pug +42 -0
  11. package/layout/includes/footer.pug +71 -0
  12. package/layout/includes/head/config.pug +79 -0
  13. package/layout/includes/head/pwa.pug +59 -0
  14. package/layout/includes/head.pug +29 -0
  15. package/layout/includes/header.pug +4 -0
  16. package/layout/includes/inject/body.pug +68 -0
  17. package/layout/{partial/compoment/inject/head.ejs → includes/inject/head.pug} +60 -37
  18. package/layout/includes/layout.pug +35 -0
  19. package/layout/{partial/loading.ejs → includes/loading.pug} +19 -17
  20. package/layout/includes/mixins/articleSort.pug +14 -0
  21. package/layout/includes/mixins/pagination.pug +8 -0
  22. package/layout/includes/nav.pug +22 -0
  23. package/layout/includes/page/about.pug +10 -0
  24. package/layout/includes/page/categories.pug +8 -0
  25. package/layout/includes/page/default.pug +2 -0
  26. package/layout/includes/page/echarts.pug +7 -0
  27. package/layout/includes/page/equipment.pug +3 -0
  28. package/layout/includes/page/links.pug +35 -0
  29. package/layout/includes/page/moments.pug +5 -0
  30. package/layout/includes/page/rss.pug +22 -0
  31. package/layout/includes/page/says.pug +20 -0
  32. package/layout/includes/page/tags.pug +8 -0
  33. package/layout/includes/page/tlink.pug +9 -0
  34. package/layout/includes/recent-posts.pug +9 -0
  35. package/layout/includes/sidebar.pug +17 -0
  36. package/layout/includes/widgets/aside/aside.pug +18 -0
  37. package/layout/includes/widgets/aside/asideAllInfo.pug +8 -0
  38. package/layout/includes/widgets/aside/asideArchive.pug +9 -0
  39. package/layout/includes/widgets/aside/asideFlipCard.pug +5 -0
  40. package/layout/includes/widgets/aside/asideHistory.pug +8 -0
  41. package/layout/includes/widgets/aside/asideInfoCard.pug +22 -0
  42. package/layout/includes/widgets/aside/asideNewestPost.pug +16 -0
  43. package/layout/includes/widgets/aside/asidePower.pug +19 -0
  44. package/layout/includes/widgets/aside/asideSwitch.pug +26 -0
  45. package/layout/includes/widgets/aside/asideTag.pug +11 -0
  46. package/layout/includes/widgets/aside/asideToc.pug +5 -0
  47. package/layout/includes/widgets/aside/asideWebInfo.pug +40 -0
  48. package/layout/includes/widgets/aside/asideWelcome.pug +12 -0
  49. package/layout/includes/widgets/home/banner.pug +16 -0
  50. package/layout/includes/widgets/home/bbTimeList.pug +8 -0
  51. package/layout/includes/widgets/home/categoryBar.pug +10 -0
  52. package/layout/includes/widgets/home/categoryGroup.pug +9 -0
  53. package/layout/includes/widgets/home/hometop.pug +9 -0
  54. package/layout/includes/widgets/home/postList.pug +26 -0
  55. package/layout/includes/widgets/home/rencentPost.pug +26 -0
  56. package/layout/includes/widgets/home/topGroup.pug +27 -0
  57. package/layout/includes/widgets/nav/left.pug +10 -0
  58. package/layout/includes/widgets/nav/menu.pug +16 -0
  59. package/layout/includes/widgets/nav/right.pug +23 -0
  60. package/layout/includes/widgets/page/about/authorinfo.pug +12 -0
  61. package/layout/includes/widgets/page/about/award.pug +34 -0
  62. package/layout/includes/widgets/page/about/contentinfo.pug +38 -0
  63. package/layout/includes/widgets/page/about/hobbies.pug +33 -0
  64. package/layout/includes/widgets/page/about/motto.pug +19 -0
  65. package/layout/includes/widgets/page/about/other.pug +61 -0
  66. package/layout/includes/widgets/page/about/personalities.pug +16 -0
  67. package/layout/includes/widgets/page/about/skillsinfo.pug +41 -0
  68. package/layout/includes/widgets/page/banner.pug +14 -0
  69. package/layout/includes/widgets/page/equipment/content.pug +23 -0
  70. package/layout/includes/widgets/page/links/banner.pug +30 -0
  71. package/layout/includes/widgets/page/links/linksCard.pug +18 -0
  72. package/layout/includes/widgets/page/links/linksItem.pug +14 -0
  73. package/layout/includes/widgets/page/moments/angle.pug +24 -0
  74. package/layout/includes/widgets/page/moments/index.pug +18 -0
  75. package/layout/includes/widgets/page/says/saysBottom.pug +11 -0
  76. package/layout/includes/widgets/page/says/saysContent.pug +6 -0
  77. package/layout/includes/widgets/page/says/saysFunction.pug +10 -0
  78. package/layout/includes/widgets/page/says/saysMeta.pug +7 -0
  79. package/layout/includes/widgets/post/award.pug +48 -0
  80. package/layout/includes/widgets/post/copyright.pug +27 -0
  81. package/layout/includes/widgets/post/postMeta.pug +55 -0
  82. package/layout/includes/widgets/post/postNav.pug +25 -0
  83. package/layout/includes/widgets/post/wave.pug +9 -0
  84. package/layout/includes/widgets/randomlink.pug +32 -0
  85. package/layout/includes/widgets/rightside/index.pug +74 -0
  86. package/layout/includes/widgets/third-party/comments/comment.pug +14 -0
  87. package/layout/includes/widgets/third-party/comments/gitalk.pug +0 -0
  88. package/layout/{partial/compoment/third-party/comments/twikoo.ejs → includes/widgets/third-party/comments/twikoo.pug} +8 -9
  89. package/layout/includes/widgets/third-party/comments/valine.pug +0 -0
  90. package/layout/includes/widgets/third-party/music.pug +3 -0
  91. package/layout/includes/widgets/third-party/pjax.pug +30 -0
  92. package/layout/includes/widgets/third-party/search/algolia-search.pug +16 -0
  93. package/layout/includes/widgets/third-party/search/index.pug +7 -0
  94. package/layout/includes/widgets/third-party/search/local-search.pug +15 -0
  95. package/layout/index.pug +20 -0
  96. package/layout/page.pug +32 -0
  97. package/layout/post.pug +43 -0
  98. package/layout/tag.pug +19 -0
  99. package/package.json +3 -3
  100. package/scripts/event/page.js +20 -2
  101. package/scripts/filter/checkThemeConfig.js +0 -1
  102. package/scripts/filter/randomPosts.js +0 -1
  103. package/scripts/helper/{charts.js → echarts.js} +21 -11
  104. package/scripts/helper/related_post.js +10 -3
  105. package/scripts/helper/stylus.js +23 -0
  106. package/scripts/tags/bvideo.js +1 -36
  107. package/scripts/tags/fold.js +2 -3
  108. package/scripts/tags/note.js +6 -2
  109. package/scripts/tags/tabs.js +1 -1
  110. package/source/css/_comment/index.styl +121 -0
  111. package/source/css/_comment/twikoo.styl +515 -0
  112. package/source/css/_extra/console.styl +354 -0
  113. package/source/css/_extra/rightmenu.styl +83 -0
  114. package/source/css/_global/animation.css +756 -0
  115. package/source/css/_global/function.styl +83 -0
  116. package/source/css/_global/index.styl +120 -0
  117. package/source/css/_global/var.styl +1 -0
  118. package/source/css/_layout/articleSort.styl +199 -0
  119. package/source/css/_layout/base.styl +392 -0
  120. package/source/css/_layout/footer.styl +359 -0
  121. package/source/css/_layout/header.styl +1331 -0
  122. package/source/css/_layout/index.styl +293 -0
  123. package/source/css/_layout/sidebar.styl +226 -0
  124. package/source/css/_mode/index.styl +52 -0
  125. package/source/css/_page/about.styl +944 -0
  126. package/source/css/_page/category.styl +141 -0
  127. package/source/css/_page/equipment.styl +108 -0
  128. package/source/css/_page/error.styl +161 -0
  129. package/source/css/_page/home.styl +58 -0
  130. package/source/css/_page/homeTop.styl +1035 -0
  131. package/source/css/_page/index.styl +22 -0
  132. package/source/css/_page/link.styl +433 -0
  133. package/source/css/_page/moment.styl +186 -0
  134. package/source/css/_page/rss.styl +87 -0
  135. package/source/css/_page/says.styl +353 -0
  136. package/source/css/_page/tag.styl +56 -0
  137. package/source/css/_post/commentBarrage.styl +149 -0
  138. package/source/css/_post/externalTags.styl +694 -0
  139. package/source/css/_post/highlight.styl +96 -0
  140. package/source/css/_post/index.styl +935 -0
  141. package/source/css/_post/pagination.styl +467 -0
  142. package/source/css/_post/postContent.styl +957 -0
  143. package/source/css/_post/relatedPost.styl +160 -0
  144. package/source/css/_post/reward.styl +217 -0
  145. package/source/css/_search/algolia-search.styl +206 -0
  146. package/source/css/_search/local-search.styl +112 -0
  147. package/source/css/_widgets/aside/allinfo.styl +134 -0
  148. package/source/css/_widgets/aside/flip.styl +68 -0
  149. package/source/css/_widgets/aside/history.styl +35 -0
  150. package/source/css/_widgets/aside/index.styl +156 -0
  151. package/source/css/_widgets/aside/info.styl +263 -0
  152. package/source/css/_widgets/aside/newPost.styl +55 -0
  153. package/source/css/_widgets/aside/power.styl +90 -0
  154. package/source/css/_widgets/aside/toc.styl +85 -0
  155. package/source/css/_widgets/aside/welcome.styl +14 -0
  156. package/source/css/_widgets/index.styl +3 -0
  157. package/source/css/index.styl +40 -0
  158. package/source/img/default.png +0 -0
  159. package/source/img/logo-horizontal_version.png +0 -0
  160. package/source/img/pwa/16.png +0 -0
  161. package/source/img/pwa/180.png +0 -0
  162. package/source/img/pwa/192.png +0 -0
  163. package/source/img/pwa/32.png +0 -0
  164. package/source/img/pwa/512.png +0 -0
  165. package/source/img/pwa/logo.png +0 -0
  166. package/source/img/pwa/siteicon/splash-1125x2436.png +0 -0
  167. package/source/img/pwa/siteicon/splash-1136x640.png +0 -0
  168. package/source/img/pwa/siteicon/splash-1170x2532.png +0 -0
  169. package/source/img/pwa/siteicon/splash-1179x2556.png +0 -0
  170. package/source/img/pwa/siteicon/splash-1242x2208.png +0 -0
  171. package/source/img/pwa/siteicon/splash-1242x2688.png +0 -0
  172. package/source/img/pwa/siteicon/splash-1248x2778.png +0 -0
  173. package/source/img/pwa/siteicon/splash-1290x2796.png +0 -0
  174. package/source/img/pwa/siteicon/splash-1334x750.png +0 -0
  175. package/source/img/pwa/siteicon/splash-1536x2048.png +0 -0
  176. package/source/img/pwa/siteicon/splash-1620x2160.png +0 -0
  177. package/source/img/pwa/siteicon/splash-1668x2224.png +0 -0
  178. package/source/img/pwa/siteicon/splash-1668x2388.png +0 -0
  179. package/source/img/pwa/siteicon/splash-1792x828.png +0 -0
  180. package/source/img/pwa/siteicon/splash-2048x1536.png +0 -0
  181. package/source/img/pwa/siteicon/splash-2048x2732.png +0 -0
  182. package/source/img/pwa/siteicon/splash-2160x1620.png +0 -0
  183. package/source/img/pwa/siteicon/splash-2208x1242.png +0 -0
  184. package/source/img/pwa/siteicon/splash-2224x1668.png +0 -0
  185. package/source/img/pwa/siteicon/splash-2388x1668.png +0 -0
  186. package/source/img/pwa/siteicon/splash-2436x1125.png +0 -0
  187. package/source/img/pwa/siteicon/splash-2532x1170.png +0 -0
  188. package/source/img/pwa/siteicon/splash-2556x1179.png +0 -0
  189. package/source/img/pwa/siteicon/splash-2688x1242.png +0 -0
  190. package/source/img/pwa/siteicon/splash-2732x2048.png +0 -0
  191. package/source/img/pwa/siteicon/splash-2778x1248.png +0 -0
  192. package/source/img/pwa/siteicon/splash-2796x1290.png +0 -0
  193. package/source/img/pwa/siteicon/splash-640x1136.png +0 -0
  194. package/source/img/pwa/siteicon/splash-750x1334.png +0 -0
  195. package/source/img/pwa/siteicon/splash-828x1792.png +0 -0
  196. package/source/img/solitude-show.jpg +0 -0
  197. package/source/js/commentBarrage.js +8 -5
  198. package/source/js/extend/console/comment.js +60 -63
  199. package/source/js/extend/covercolor/local.js +105 -95
  200. package/source/js/extend/search/algolia-search.js +104 -111
  201. package/source/js/extend/search/local-search.js +7 -7
  202. package/source/js/main.js +673 -520
  203. package/source/js/utils.js +131 -137
  204. package/source/lib/chuckle-post-ai.js +1 -1
  205. package/layout/404.ejs +0 -34
  206. package/layout/archive.ejs +0 -10
  207. package/layout/category.ejs +0 -18
  208. package/layout/index.ejs +0 -20
  209. package/layout/layout.ejs +0 -30
  210. package/layout/page/about.ejs +0 -13
  211. package/layout/page/categories.ejs +0 -12
  212. package/layout/page/circle.ejs +0 -5
  213. package/layout/page/echarts.ejs +0 -14
  214. package/layout/page/equipment.ejs +0 -2
  215. package/layout/page/links.ejs +0 -46
  216. package/layout/page/page.ejs +0 -3
  217. package/layout/page/rss.ejs +0 -37
  218. package/layout/page/says.ejs +0 -17
  219. package/layout/page/tags.ejs +0 -12
  220. package/layout/page/tlink.ejs +0 -11
  221. package/layout/page.ejs +0 -45
  222. package/layout/partial/body.ejs +0 -7
  223. package/layout/partial/compoment/about/authorinfo.ejs +0 -18
  224. package/layout/partial/compoment/about/award.ejs +0 -59
  225. package/layout/partial/compoment/about/contentinfo.ejs +0 -33
  226. package/layout/partial/compoment/about/hobbies.ejs +0 -53
  227. package/layout/partial/compoment/about/motto.ejs +0 -17
  228. package/layout/partial/compoment/about/other.ejs +0 -76
  229. package/layout/partial/compoment/about/personalities.ejs +0 -11
  230. package/layout/partial/compoment/about/skillsinfo.ejs +0 -62
  231. package/layout/partial/compoment/aside/aside.ejs +0 -28
  232. package/layout/partial/compoment/aside/asideAllInfo.ejs +0 -6
  233. package/layout/partial/compoment/aside/asideArchive.ejs +0 -11
  234. package/layout/partial/compoment/aside/asideFlipCard.ejs +0 -72
  235. package/layout/partial/compoment/aside/asideHistory.ejs +0 -49
  236. package/layout/partial/compoment/aside/asideInfoCard.ejs +0 -39
  237. package/layout/partial/compoment/aside/asideNewestPost.ejs +0 -31
  238. package/layout/partial/compoment/aside/asidePower.ejs +0 -31
  239. package/layout/partial/compoment/aside/asideSwitch.ejs +0 -41
  240. package/layout/partial/compoment/aside/asideTag.ejs +0 -5
  241. package/layout/partial/compoment/aside/asideToc.ejs +0 -11
  242. package/layout/partial/compoment/aside/asideWebInfo.ejs +0 -60
  243. package/layout/partial/compoment/aside/asideWelcome.ejs +0 -33
  244. package/layout/partial/compoment/circle/angle.ejs +0 -26
  245. package/layout/partial/compoment/circle/banner.ejs +0 -11
  246. package/layout/partial/compoment/circle/content.ejs +0 -19
  247. package/layout/partial/compoment/dorakika/rightmenu.ejs +0 -100
  248. package/layout/partial/compoment/equipment/list.ejs +0 -37
  249. package/layout/partial/compoment/home/homeCategoryBar.ejs +0 -11
  250. package/layout/partial/compoment/home/postList.ejs +0 -37
  251. package/layout/partial/compoment/hometop/bbTimeList.ejs +0 -15
  252. package/layout/partial/compoment/hometop/categoryGroup.ejs +0 -19
  253. package/layout/partial/compoment/hometop/groupTag.ejs +0 -30
  254. package/layout/partial/compoment/hometop/topGroup.ejs +0 -41
  255. package/layout/partial/compoment/inject/body.ejs +0 -72
  256. package/layout/partial/compoment/links/angle.ejs +0 -26
  257. package/layout/partial/compoment/links/banner.ejs +0 -42
  258. package/layout/partial/compoment/links/linksCard.ejs +0 -27
  259. package/layout/partial/compoment/links/linksItem.ejs +0 -21
  260. package/layout/partial/compoment/mixins/articleSort.ejs +0 -26
  261. package/layout/partial/compoment/mixins/pagination.ejs +0 -11
  262. package/layout/partial/compoment/nav/left.ejs +0 -22
  263. package/layout/partial/compoment/nav/menu.ejs +0 -25
  264. package/layout/partial/compoment/nav/right.ejs +0 -42
  265. package/layout/partial/compoment/post/award.ejs +0 -52
  266. package/layout/partial/compoment/post/copyright.ejs +0 -37
  267. package/layout/partial/compoment/post/postMeta.ejs +0 -83
  268. package/layout/partial/compoment/post/postNav.ejs +0 -41
  269. package/layout/partial/compoment/post/wave.ejs +0 -14
  270. package/layout/partial/compoment/says/banner.ejs +0 -10
  271. package/layout/partial/compoment/says/saysBottom.ejs +0 -18
  272. package/layout/partial/compoment/says/saysContent.ejs +0 -10
  273. package/layout/partial/compoment/says/saysFunction.ejs +0 -15
  274. package/layout/partial/compoment/third-party/comments/comment.ejs +0 -12
  275. package/layout/partial/compoment/third-party/comments/twikoo_k.ejs +0 -29
  276. package/layout/partial/compoment/third-party/music.ejs +0 -5
  277. package/layout/partial/compoment/third-party/pjax.ejs +0 -31
  278. package/layout/partial/compoment/third-party/search/algolia-search.ejs +0 -20
  279. package/layout/partial/compoment/third-party/search/index.ejs +0 -10
  280. package/layout/partial/compoment/third-party/search/local-search.ejs +0 -22
  281. package/layout/partial/compoment/tlink/banner.ejs +0 -10
  282. package/layout/partial/console.ejs +0 -68
  283. package/layout/partial/footer.ejs +0 -104
  284. package/layout/partial/head.ejs +0 -37
  285. package/layout/partial/header.ejs +0 -6
  286. package/layout/partial/hometop.ejs +0 -15
  287. package/layout/partial/nav.ejs +0 -34
  288. package/layout/partial/pwa.ejs +0 -40
  289. package/layout/partial/sidebar.ejs +0 -31
  290. package/layout/post.ejs +0 -52
  291. package/layout/tag.ejs +0 -19
  292. package/scripts/filter/katex.js +0 -25
  293. package/scripts/helper/randomLinks.js +0 -16
  294. package/scripts/helper/themeJsExport.js +0 -79
  295. package/scripts/tags/expand.js +0 -4
  296. package/scripts/tags/hide.js +0 -70
  297. package/source/css/commentBarrage.css +0 -174
  298. package/source/css/custom.css +0 -901
  299. package/source/css/main.css +0 -16420
  300. package/source/css/search/algolia-search.css +0 -141
  301. package/source/css/search/local-search.css +0 -138
  302. package/source/css/var.css +0 -189
  303. package/source/js/extend/covercolor/web.js +0 -137
  304. /package/source/js/{rightmenu.js → rightside.js} +0 -0
@@ -1,153 +1,147 @@
1
1
  const utils = {
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
- },
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
- 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
28
- }
18
+ throttle: function (func, wait, options) {
19
+ let timeout, context, args
20
+ let previous = 0
21
+ if (!options) options = {}
29
22
 
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
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
- return throttled
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
- fadeIn: (ele, time) => {
53
- ele.style.cssText = `display:block;animation: to_show ${time}s`
54
- },
49
+ return throttled
50
+ },
55
51
 
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
- },
52
+ fadeIn: (ele, time) => {
53
+ ele.style.cssText = `display:block;animation: to_show ${time}s`
54
+ },
63
55
 
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
- },
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
- 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
- },
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
- copy: async (text) => {
86
- try {
87
- await navigator.clipboard.writeText(text)
88
- utils.snackbarShow(GLOBALCONFIG.lang.copy.success, false, 2000)
89
- } catch (err) {
90
- utils.snackbarShow(GLOBALCONFIG.lang.copy.error, false, 2000)
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
- getEleTop: ele => {
95
- let actualTop = ele.offsetTop
96
- let current = ele.offsetParent
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
- while (current !== null) {
99
- actualTop += current.offsetTop
100
- current = current.offsetParent
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
- return actualTop
104
- },
103
+ randomNum: (length) => {
104
+ return Math.floor(Math.random() * length)
105
+ },
105
106
 
106
- randomNum: (length) => {
107
- return Math.floor(Math.random() * length)
108
- },
107
+ timeDiff: (timeObj, today) => {
108
+ var timeDiff = today.getTime() - timeObj.getTime();
109
+ return Math.floor(timeDiff / (1000 * 3600 * 24));
110
+ },
109
111
 
110
- timeDiff: (timeObj, today) => {
111
- var timeDiff = today.getTime() - timeObj.getTime();
112
- return Math.floor(timeDiff / (1000 * 3600 * 24));
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
- scrollToDest: (pos, time = 500) => {
116
- const currentPos = window.pageYOffset
117
- const isNavFixed = document.getElementById('page-header').classList.contains('nav-fixed')
118
- if (currentPos > pos || isNavFixed) pos = pos - 70
119
- if ('scrollBehavior' in document.documentElement.style) {
120
- window.scrollTo({
121
- top: pos,
122
- behavior: 'smooth'
123
- })
124
- return
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="&#x673A;&#x5668;&#x4EBA;" 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="&#x5F62;&#x72B6;&#x7ED3;&#x5408;" 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="&#x673A;&#x5668;&#x4EBA;" 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="&#x5F62;&#x72B6;&#x7ED3;&#x5408;" 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
- <% } %>
@@ -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>
@@ -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>
@@ -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>
@@ -1,5 +0,0 @@
1
- <%- partial('partial/compoment/circle/banner') %>
2
- <% if(theme.circle.angle.enable){ %>
3
- <%- partial('partial/compoment/circle/angle') %>
4
- <% } %>
5
- <%- partial('partial/compoment/circle/content') %>
@@ -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>
@@ -1,2 +0,0 @@
1
- <%- partial('partial/compoment/says/banner') %>
2
- <%- partial('partial/compoment/equipment/list') %>
@@ -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
- <% } %>
@@ -1,3 +0,0 @@
1
- <div id="article-container">
2
- <%- page.content %>
3
- </div>