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,107 +1,113 @@
1
1
  function coverColor() {
2
2
  var path = document.getElementById("post-cover")?.src;
3
3
  if (path !== undefined) {
4
- var img = new Image();
5
- img.crossOrigin = "Anonymous";
6
- img.src = path;
7
- img.onload = function () {
8
- var canvas = document.createElement("canvas");
9
- canvas.width = this.width;
10
- canvas.height = this.height;
11
- var ctx = canvas.getContext("2d");
12
- ctx.drawImage(this, 0, 0);
13
- var data = ctx.getImageData(0, 0, this.width, this.height).data;
14
- var r = 0, g = 0, b = 0;
15
- var step = 5;
16
- for (var i = 0; i < data.length; i += 4 * step) {
17
- r += data[i];
18
- g += data[i + 1];
19
- b += data[i + 2];
4
+ var img = new Image();
5
+ img.crossOrigin = "Anonymous";
6
+ img.src = path;
7
+ img.onload = function () {
8
+ var canvas = document.createElement("canvas");
9
+ canvas.width = this.width;
10
+ canvas.height = this.height;
11
+ var ctx = canvas.getContext("2d");
12
+ ctx.drawImage(this, 0, 0);
13
+ var data = ctx.getImageData(0, 0, this.width, this.height).data;
14
+ var colorCounts = {};
15
+ var dominantColor = '';
16
+ var maxCount = 0;
17
+ var step = 5;
18
+ for (var i = 0; i < data.length; i += 4 * step) {
19
+ var r = data[i];
20
+ var g = data[i + 1];
21
+ var b = data[i + 2];
22
+ var color = `${r},${g},${b}`;
23
+
24
+ colorCounts[color] = (colorCounts[color] || 0) + 1;
25
+
26
+ if (colorCounts[color] > maxCount) {
27
+ maxCount = colorCounts[color];
28
+ dominantColor = color;
29
+ }
30
+ }
31
+ var rgb = dominantColor.split(',').map(c => parseInt(c, 10));
32
+ var value = "#" + rgb[0].toString(16) + rgb[1].toString(16) + rgb[2].toString(16);
33
+ if (getContrastYIQ(value) == "light") {
34
+ value = LightenDarkenColor(colorHex(value), -50)
35
+ }
36
+
37
+ document.documentElement.style.setProperty('--sco-main', value);
38
+ document.documentElement.style.setProperty('--sco-main-op', value + '23');
39
+ document.documentElement.style.setProperty('--sco-main-op-deep', value + 'dd');
40
+ document.documentElement.style.setProperty('--sco-main-none', value + '00');
41
+ initThemeColor()
42
+ document.getElementById("coverdiv").classList.add("loaded");
20
43
  }
21
- r = Math.floor(r / (data.length / 4 / step));
22
- g = Math.floor(g / (data.length / 4 / step));
23
- b = Math.floor(b / (data.length / 4 / step));
24
- var value = "#" + r.toString(16) + g.toString(16) + b.toString(16);
25
- if (getContrastYIQ(value) == "light") {
26
- value = LightenDarkenColor(colorHex(value), -50)
27
- }
28
-
29
- document.documentElement.style.setProperty('--sco-main', value);
30
- document.documentElement.style.setProperty('--sco-main-op', value + '23');
31
- document.documentElement.style.setProperty('--sco-main-op-deep', value + 'dd');
32
- document.documentElement.style.setProperty('--sco-main-none', value + '00');
33
- initThemeColor()
34
- document.getElementById("coverdiv").classList.add("loaded");
35
- }
36
44
  } else {
37
- document.documentElement.style.setProperty('--sco-main', 'var(--sco-theme)');
38
- document.documentElement.style.setProperty('--sco-main-op', 'var(--sco-theme-op)');
39
- document.documentElement.style.setProperty('--sco-main-op-deep', 'var(--sco-theme-op-deep)');
40
- document.documentElement.style.setProperty('--sco-main-none', 'var(--sco-theme-none)');
41
- initThemeColor()
45
+ document.documentElement.style.setProperty('--sco-main', 'var(--sco-theme)');
46
+ document.documentElement.style.setProperty('--sco-main-op', 'var(--sco-theme-op)');
47
+ document.documentElement.style.setProperty('--sco-main-op-deep', 'var(--sco-theme-op-deep)');
48
+ document.documentElement.style.setProperty('--sco-main-none', 'var(--sco-theme-none)');
49
+ initThemeColor()
42
50
  }
43
- }
44
-
51
+ }
45
52
 
46
- function colorHex(colorString) {
53
+ function colorHex(colorString) {
47
54
  const hexRegex = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/;
48
55
  let color = colorString;
49
56
 
50
57
  if (/^(rgb|RGB)/.test(color)) {
51
- const colorArr = color.replace(/(?:\(|\)|rgb|RGB)*/g, "").split(",");
52
- const hexArr = colorArr.map(c => {
53
- const hex = Number(c).toString(16);
54
- return hex.length === 1 ? "0" + hex : hex;
55
- });
56
- return "#" + hexArr.join("");
57
- } else if (hexRegex.test(color)) {
58
- const hexDigits = color.replace(/#/, "").split("");
59
- if (hexDigits.length === 6) {
60
- return color;
61
- } else if (hexDigits.length === 3) {
62
- const hexArr = hexDigits.map(c => c + c);
58
+ const colorArr = color.replace(/(?:\(|\)|rgb|RGB)*/g, "").split(",");
59
+ const hexArr = colorArr.map(c => {
60
+ const hex = Number(c).toString(16);
61
+ return hex.length === 1 ? "0" + hex : hex;
62
+ });
63
63
  return "#" + hexArr.join("");
64
- }
64
+ } else if (hexRegex.test(color)) {
65
+ const hexDigits = color.replace(/#/, "").split("");
66
+ if (hexDigits.length === 6) {
67
+ return color;
68
+ } else if (hexDigits.length === 3) {
69
+ const hexArr = hexDigits.map(c => c + c);
70
+ return "#" + hexArr.join("");
71
+ }
65
72
  }
66
73
  return color;
67
- }
68
-
74
+ }
69
75
 
70
76
 
71
77
  function colorRgb(str) {
72
- const HEX_SHORT_REGEX = /^#([0-9a-fA-f]{3})$/;
73
- const HEX_LONG_REGEX = /^#([0-9a-fA-f]{6})$/;
74
- const HEX_SHORT_LENGTH = 4;
75
-
76
- if (!str || typeof str !== 'string') {
77
- return str;
78
- }
79
-
80
- const sColor = str.toLowerCase();
81
- let hexValue = "";
82
-
83
- if (sColor && (HEX_SHORT_REGEX.test(sColor) || HEX_LONG_REGEX.test(sColor))) {
84
- hexValue = sColor.length === HEX_SHORT_LENGTH ?
85
- sColor.replace(/^#(.)/g, "#$1$1") :
86
- sColor;
87
-
88
- const rgbValue = hexValue.slice(1)
89
- .match(/.{2}/g)
90
- .map(val => parseInt(val, 16));
91
-
92
- return `rgb(${rgbValue[0]}, ${rgbValue[1]}, ${rgbValue[2]})`;
93
- } else {
94
- return sColor;
95
- }
78
+ const HEX_SHORT_REGEX = /^#([0-9a-fA-f]{3})$/;
79
+ const HEX_LONG_REGEX = /^#([0-9a-fA-f]{6})$/;
80
+ const HEX_SHORT_LENGTH = 4;
81
+
82
+ if (!str || typeof str !== 'string') {
83
+ return str;
84
+ }
85
+
86
+ const sColor = str.toLowerCase();
87
+ let hexValue = "";
88
+
89
+ if (sColor && (HEX_SHORT_REGEX.test(sColor) || HEX_LONG_REGEX.test(sColor))) {
90
+ hexValue = sColor.length === HEX_SHORT_LENGTH ?
91
+ sColor.replace(/^#(.)/g, "#$1$1") :
92
+ sColor;
93
+
94
+ const rgbValue = hexValue.slice(1)
95
+ .match(/.{2}/g)
96
+ .map(val => parseInt(val, 16));
97
+
98
+ return `rgb(${rgbValue[0]}, ${rgbValue[1]}, ${rgbValue[2]})`;
99
+ } else {
100
+ return sColor;
101
+ }
96
102
  }
97
103
 
98
104
 
99
- function LightenDarkenColor(col, amt) {
105
+ function LightenDarkenColor(col, amt) {
100
106
  let usePound = false;
101
107
 
102
108
  if (col[0] === "#") {
103
- col = col.slice(1);
104
- usePound = true;
109
+ col = col.slice(1);
110
+ usePound = true;
105
111
  }
106
112
 
107
113
  const num = parseInt(col, 16);
@@ -110,12 +116,15 @@ function colorRgb(str) {
110
116
  const g = Math.min(255, Math.max(0, (num & 0xff) + amt));
111
117
 
112
118
  return `${usePound ? "#" : ""}${(g | (b << 8) | (r << 16)).toString(16).padStart(6, "0")}`;
113
- }
119
+ }
114
120
 
115
121
 
116
- function getContrastYIQ(hexcolor) {
122
+ function getContrastYIQ(hexcolor) {
117
123
  var colorrgb = colorRgb(hexcolor);
118
124
  var colors = colorrgb.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/);
125
+ if (!colors) {
126
+ return "light"; // or "dark", depending on your preference
127
+ }
119
128
  var red = colors[1];
120
129
  var green = colors[2];
121
130
  var blue = colors[3];
@@ -123,28 +132,29 @@ function colorRgb(str) {
123
132
  brightness = (red * 299) + (green * 587) + (blue * 114);
124
133
  brightness = brightness / 255000;
125
134
  if (brightness >= 0.5) {
126
- return "light";
135
+ return "light";
127
136
  } else {
128
- return "dark";
137
+ return "dark";
129
138
  }
130
- }
139
+ }
140
+
131
141
 
132
- function initThemeColor() {
142
+ function initThemeColor() {
133
143
  const currentTop = window.scrollY || document.documentElement.scrollTop;
134
144
  let themeColor;
135
145
  if (currentTop > 0) {
136
- themeColor = getComputedStyle(document.documentElement).getPropertyValue('--sco-card-bg');
137
- } else if (PAGECONFIG.is_post) {
138
- themeColor = getComputedStyle(document.documentElement).getPropertyValue('--sco-main');
146
+ themeColor = getComputedStyle(document.documentElement).getPropertyValue('--sco-card-bg');
147
+ } else if (PAGE_CONFIG.is_post) {
148
+ themeColor = getComputedStyle(document.documentElement).getPropertyValue('--sco-main');
139
149
  } else {
140
- themeColor = getComputedStyle(document.documentElement).getPropertyValue('--sco-background');
150
+ themeColor = getComputedStyle(document.documentElement).getPropertyValue('--sco-background');
141
151
  }
142
152
  changeThemeColor(themeColor);
143
- }
153
+ }
144
154
 
145
- function changeThemeColor(color) {
155
+ function changeThemeColor(color) {
146
156
  const meta = document.querySelector('meta[name="theme-color"]');
147
157
  if (meta) {
148
- meta.setAttribute('content', color);
158
+ meta.setAttribute('content', color);
149
159
  }
150
- }
160
+ }
@@ -1,10 +1,10 @@
1
- const $searchMask = document.getElementById('search-mask'),
2
- $searchDialog = document.querySelector('#algolia-search .search-dialog')
3
-
4
- class search {
5
- static openSearch() {
6
- utils.fadeIn($searchMask, '0.5')
7
- utils.fadeIn($searchDialog, '0.5')
1
+ window.addEventListener('load', () => {
2
+ const openSearch = () => {
3
+ document.body.style.cssText = 'width: 100%;overflow: hidden'
4
+ document.querySelector('#algolia-search .search-dialog').style.display = 'block'
5
+ document.querySelector('#algolia-search .ais-SearchBox-input').focus()
6
+ utils.fadeIn(document.getElementById('search-mask'), 0.5)
7
+ // shortcut: ESC
8
8
  document.addEventListener('keydown', function f(event) {
9
9
  if (event.code === 'Escape') {
10
10
  closeSearch()
@@ -13,135 +13,128 @@ class search {
13
13
  })
14
14
  }
15
15
 
16
- static closeSearch() {
17
- utils.fadeOut($searchDialog, '0.5')
18
- utils.fadeOut($searchMask, '0.5')
16
+ const closeSearch = () => {
17
+ document.body.style.cssText = "width: '';overflow: ''"
18
+ const $searchDialog = document.querySelector('#algolia-search .search-dialog')
19
+ $searchDialog.style.animation = 'search_close .5s'
20
+ setTimeout(() => {
21
+ $searchDialog.style.cssText = "display: none; animation: ''"
22
+ }, 500)
23
+ utils.fadeOut(document.getElementById('search-mask'), 0.5)
19
24
  }
20
25
 
21
- static cutContent(content) {
22
- if (content === '') return ''
23
-
24
- const firstOccur = content.indexOf('<mark>')
26
+ const searchClickFn = () => {
27
+ document.querySelector('#search-button > .search').addEventListener('click', openSearch)
28
+ document.getElementById('search-mask').addEventListener('click', closeSearch)
29
+ document.querySelector('#algolia-search .search-close-button').addEventListener('click', closeSearch)
30
+ document.getElementById('menu-search').addEventListener('click', function () {
31
+ rm.hideRightMenu();
32
+ openSearch();
33
+ let t = document.querySelector('.ais-search-box--input');
34
+ let evt = new Event('input', {bubbles: true, cancelable: true});
35
+ t.value = selectTextNow;
36
+ t.dispatchEvent(evt);
37
+ });
38
+ }
25
39
 
26
- let start = firstOccur - 30
27
- let end = firstOccur + 120
28
- let pre = ''
29
- let post = ''
40
+ searchClickFn()
30
41
 
31
- if (start <= 0) {
32
- start = 0
33
- end = 140
34
- } else {
35
- pre = '...'
36
- }
42
+ window.addEventListener('pjax:complete', function () {
43
+ getComputedStyle(document.querySelector('#algolia-search .search-dialog')).display === 'block' && closeSearch()
44
+ searchClickFn()
45
+ })
37
46
 
38
- if (end > content.length) {
39
- end = content.length
40
- } else {
41
- post = '...'
42
- }
43
-
44
- const matchContent = pre + content.substring(start, end) + post
45
- return matchContent
47
+ const algolia = GLOBAL_CONFIG.algolia
48
+ const isAlgoliaValid = algolia.appId && algolia.apiKey && algolia.indexName
49
+ if (!isAlgoliaValid) {
50
+ return console.error('Algolia setting is invalid!')
46
51
  }
47
52
 
48
- static search() {
49
- const algolia = GLOBALCONFIG.algolia, that = this
50
- const isAlgoliaValid = algolia.appId && algolia.apiKey && algolia.indexName
51
- if (!isAlgoliaValid) {
52
- return console.error('Algolia setting is invalid!')
53
- }
53
+ const searchClient = algoliasearch(
54
+ algolia.appId,
55
+ algolia.apiKey
56
+ );
54
57
 
55
- const init = instantsearch({
56
- indexName: algolia.indexName,
57
- searchClient: algoliasearch(algolia.appId, algolia.apiKey),
58
- searchFunction(helper) {
59
- helper.state.query && helper.search()
60
- }
61
- })
58
+ const search = instantsearch({
59
+ indexName: algolia.indexName,
60
+ searchClient,
61
+ searchParameters: {
62
+ hitsPerPage: algolia.hits.per_page || 10
63
+ }
64
+ })
62
65
 
63
- const searchBox = instantsearch.widgets.searchBox({
64
- container: '#search-input',
66
+ search.addWidget(
67
+ instantsearch.widgets.searchBox({
68
+ container: '#algolia-search-input',
65
69
  showReset: false,
70
+ placeholder: GLOBAL_CONFIG.lang.search.placeholder,
66
71
  showSubmit: false,
67
- autofocus: true,
68
- placeholder: GLOBALCONFIG.lang.search.placeholder,
69
- showLoadingIndicator: false
72
+ showLoadingIndicator: true,
73
+ templates: {
74
+ loadingIndicator: '<i class="scoicon sco-loading-line search-icon"></i>'
75
+ },
76
+ onStateChange({uiState, setUiState}) {
77
+ const searchInput = document.querySelector('#algolia-search-input input')
78
+ if (searchInput.value) {
79
+ setUiState(uiState);
80
+ }
81
+ }
70
82
  })
71
-
72
- const hits = instantsearch.widgets.hits({
83
+ )
84
+ search.addWidget(
85
+ instantsearch.widgets.hits({
73
86
  container: '#algolia-hits',
74
87
  templates: {
75
- item(data) {
76
- const link = '/posts/' + data.permalink.split('/')[4]
77
- const result = data._highlightResult
78
- const content = result.contentStripTruncate
79
- ? that.cutContent(result.contentStripTruncate.value)
80
- : result.contentStrip
81
- ? that.cutContent(result.contentStrip.value)
82
- : result.content
83
- ? that.cutContent(result.content.value)
84
- : ''
85
- return `
86
- <a href="${link}" class="algolia-hit-item-link">
87
- ${result.title.value}
88
- </a>
89
- <p class="algolia-hit-item-content">${content}</p>`
88
+ item(hit) {
89
+ const link = hit.permalink ? hit.permalink : (GLOBAL_CONFIG.root + hit.path)
90
+ return (
91
+ `<a href="${link}" class="algolia-hit-item-link">${hit._highlightResult.title.value}</a>`
92
+ )
90
93
  },
91
- empty: function (data) {
94
+ empty(data) {
92
95
  return (
93
- `<div id="algolia-hits-empty">${GLOBALCONFIG.lang.search.empty}</div>`
96
+ '<div id="algolia-hits-empty">' +
97
+ GLOBAL_CONFIG.lang.search.empty.replace(/\$\{query}/, data.query) +
98
+ '</div>'
94
99
  )
95
100
  }
101
+ },
102
+ cssClasses: {
103
+ item: 'algolia-hit-item'
96
104
  }
97
105
  })
106
+ )
98
107
 
99
- const stats = instantsearch.widgets.stats({
100
- container: '.algolia-stats',
108
+ search.addWidget(
109
+ instantsearch.widgets.stats({
110
+ container: '#algolia-stats',
101
111
  templates: {
102
- text: function (data) {
103
- const stats = GLOBALCONFIG.lang.search.hit.replace('${query}', `<mark>${data.nbHits}</mark>`)
104
- return (
105
- stats
106
- )
112
+ text(data) {
113
+ const stats = GLOBAL_CONFIG.lang.search.hit.replace(/\$\{hits}/, data.nbHits).replace(/\$\{time}/, data.processingTimeMS);
114
+ return `${stats}`;
107
115
  }
108
116
  }
109
117
  })
110
-
111
- init.addWidgets([searchBox, hits, stats]) // add the widgets to the instantsearch instance
112
- init.start()
113
- init.on('render', () => {
114
- pjax.refresh(document.getElementById('algolia-hits'))
118
+ )
119
+
120
+ search.addWidget(
121
+ instantsearch.widgets.pagination({
122
+ container: '#algolia-pagination',
123
+ scrollTo: false,
124
+ showFirst: false,
125
+ showPrevious: false,
126
+ showNext: false,
127
+ showLast: false,
128
+ cssClasses: {
129
+ list: 'pagination',
130
+ pageItem: 'pagination-item',
131
+ link: 'page-number',
132
+ },
115
133
  })
116
- }
117
- }
134
+ )
135
+ search.start()
118
136
 
119
- const searchClickFn = () => {
120
- document.querySelector('#search-button > .search').addEventListener('click', search.openSearch)
121
- document.getElementById('menu-search').addEventListener('click', function() {
122
- rm.hideRightMenu();
123
- search.openSearch();
124
- let t = document.getElementsByClassName('ais-search-box--input')[0];
125
- let evt = new Event('input', {
126
- bubbles: true,
127
- cancelable: true
128
- });
129
- t.value = selectTextNow;
130
- t.dispatchEvent(evt);
131
- });
132
- }
133
-
134
- const searchClickFnOnce = () => {
135
- document.querySelector('#algolia-search .search-close-button').addEventListener('click', search.closeSearch)
136
- $searchMask.addEventListener('click', search.closeSearch)
137
- }
138
-
139
- window.addEventListener('load', () => {
140
- searchClickFn()
141
- searchClickFnOnce()
142
- search.search()
137
+ window.pjax && search.on('render', () => {
138
+ window.pjax.refresh(document.getElementById('algolia-hits'))
139
+ })
143
140
  })
144
-
145
- window.addEventListener('pjax:complete', () => {
146
- searchClickFn()
147
- })
@@ -44,7 +44,7 @@ class search{
44
44
  }
45
45
 
46
46
  static search(){
47
- if (!GLOBALCONFIG.localsearch.preload && dataObj === null) dataObj = this.fetchData(GLOBALCONFIG.localsearch.path)
47
+ if (!GLOBAL_CONFIG.localsearch.preload && dataObj === null) dataObj = this.fetchData(GLOBAL_CONFIG.localsearch.path)
48
48
  $input.addEventListener('input', function type() {
49
49
  const keywords = this.value.trim().toLowerCase().split(/[\s]+/)
50
50
  if (keywords[0] !== '') $loadingStatus.innerHTML = '<i class="scoicon sco-loading-line"></i><span>加载中</span>'
@@ -61,7 +61,7 @@ class search{
61
61
  let isMatch = true
62
62
  let dataTitle = data.title ? data.title.trim().toLowerCase() : ''
63
63
  const dataContent = data.content ? data.content.trim().replace(/<[^>]+>/g, '').toLowerCase() : ''
64
- const dataUrl = data.url.startsWith('/') ? data.url : GLOBALCONFIG.root + data.url
64
+ const dataUrl = data.url.startsWith('/') ? data.url : GLOBAL_CONFIG.root + data.url
65
65
  let indexTitle = -1
66
66
  let indexContent = -1
67
67
  let firstOccur = -1
@@ -128,9 +128,9 @@ class search{
128
128
  }
129
129
  })
130
130
  if (count === 0) {
131
- str += `<div id="search__hits-empty">${GLOBALCONFIG.lang.search.empty}</div>`
131
+ str += `<div id="search__hits-empty">${GLOBAL_CONFIG.lang.search.empty}</div>`
132
132
  }else{
133
- str += `<div class="search__hits-count">${GLOBALCONFIG.lang.search.hit.replace('${query}', '<span class="search-keyword">' + count + '</span>')}</div>`
133
+ str += `<div class="search__hits-count">${GLOBAL_CONFIG.lang.search.hit.replace('${query}', '<span class="search-keyword">' + count + '</span>')}</div>`
134
134
  }
135
135
  str += '</div>'
136
136
  $resultContent.innerHTML = str
@@ -141,8 +141,8 @@ class search{
141
141
  }
142
142
 
143
143
  const searchClickFn = () => {
144
- document.querySelector('#search-button > .search').addEventListener('click', search.openSearch)
145
- document.getElementById('menu-search').addEventListener('click', function() {
144
+ if (PAGE_CONFIG.page !== "404") document.querySelector('#search-button > .search').addEventListener('click', search.openSearch)
145
+ GLOBAL_CONFIG.rightmenu.enable && document.getElementById('menu-search').addEventListener('click', function() {
146
146
  rm.hideRightMenu();
147
147
  search.openSearch();
148
148
  let t = document.getElementsByClassName('search-box-input')[0];
@@ -158,7 +158,7 @@ const searchClickFn = () => {
158
158
  const searchClickFnOnce = () => {
159
159
  document.querySelector('#local-search .search-close-button').addEventListener('click', search.closeSearch)
160
160
  $searchMask.addEventListener('click', search.closeSearch)
161
- if (GLOBALCONFIG.localsearch.preload) dataObj = search.fetchData(GLOBALCONFIG.localsearch.path)
161
+ if (GLOBAL_CONFIG.localsearch.preload) dataObj = search.fetchData(GLOBAL_CONFIG.localsearch.path)
162
162
  }
163
163
 
164
164
  window.addEventListener('load', () => {