hexo-theme-solitude 1.6.0 → 1.7.0

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 (83) hide show
  1. package/README.md +1 -1
  2. package/README_zh-cn.md +1 -1
  3. package/README_zh-tw.md +1 -1
  4. package/SECURITY.md +5 -5
  5. package/_config.yml +50 -51
  6. package/languages/en.yml +59 -63
  7. package/languages/zh-CN.yml +52 -55
  8. package/languages/zh-TW.yml +52 -55
  9. package/layout/404.pug +1 -1
  10. package/layout/category.pug +1 -1
  11. package/layout/includes/console.pug +13 -12
  12. package/layout/includes/footer.pug +6 -6
  13. package/layout/includes/head/config.pug +70 -38
  14. package/layout/includes/head/opengraph.pug +2 -2
  15. package/layout/includes/head/pwa.pug +6 -6
  16. package/layout/includes/head.pug +1 -1
  17. package/layout/includes/inject/body.pug +7 -7
  18. package/layout/includes/inject/head.pug +35 -1
  19. package/layout/includes/keyboard.pug +1 -1
  20. package/layout/includes/nav.pug +1 -1
  21. package/layout/includes/sidebar.pug +19 -3
  22. package/layout/includes/widgets/home/categoryBar.pug +2 -2
  23. package/layout/includes/widgets/home/postList.pug +4 -4
  24. package/layout/includes/widgets/home/topGroup.pug +2 -2
  25. package/layout/includes/widgets/nav/group.pug +2 -2
  26. package/layout/includes/widgets/nav/right.pug +1 -1
  27. package/layout/includes/widgets/page/about/award.pug +8 -9
  28. package/layout/includes/widgets/page/about/hobbies.pug +1 -1
  29. package/layout/includes/widgets/page/about/other.pug +1 -1
  30. package/layout/includes/widgets/page/banner.pug +1 -1
  31. package/layout/includes/widgets/page/links/banner.pug +5 -4
  32. package/layout/includes/widgets/page/moments/angle.pug +1 -1
  33. package/layout/includes/widgets/post/award.pug +10 -15
  34. package/layout/includes/widgets/post/copyright.pug +2 -2
  35. package/layout/includes/widgets/post/postMeta.pug +17 -10
  36. package/layout/includes/widgets/randomlink.pug +3 -2
  37. package/layout/includes/widgets/third-party/comments/comment.pug +5 -7
  38. package/layout/includes/widgets/third-party/comments/twikoo.pug +1 -0
  39. package/layout/includes/widgets/third-party/comments/valine.pug +44 -0
  40. package/layout/includes/widgets/third-party/comments/waline.pug +40 -11
  41. package/layout/includes/widgets/third-party/news-comment/newest-comment.pug +5 -3
  42. package/layout/includes/widgets/third-party/news-comment/twikoo.pug +12 -10
  43. package/layout/includes/widgets/third-party/news-comment/valine.pug +79 -0
  44. package/layout/includes/widgets/third-party/news-comment/waline.pug +25 -20
  45. package/layout/page.pug +3 -0
  46. package/layout/tag.pug +1 -1
  47. package/package.json +1 -1
  48. package/plugins.yml +15 -3
  49. package/scripts/event/cdn.js +9 -9
  50. package/scripts/event/init.js +4 -2
  51. package/scripts/event/merge_config.js +15 -6
  52. package/scripts/helper/related_post.js +2 -2
  53. package/scripts/tags/tabs.js +1 -1
  54. package/source/css/_comments/{index.styl → comment.styl} +15 -22
  55. package/source/css/_comments/twikoo.styl +3 -0
  56. package/source/css/_comments/valine.styl +245 -0
  57. package/source/css/_global/index.styl +3 -0
  58. package/source/css/_highlight/highlight/index.styl +1 -1
  59. package/source/css/_highlight/prismjs/line-number.styl +1 -1
  60. package/source/css/_layout/article-sort.styl +1 -1
  61. package/source/css/_layout/aside.styl +3 -3
  62. package/source/css/_layout/console.styl +7 -6
  63. package/source/css/_layout/footer.styl +1 -0
  64. package/source/css/_layout/header.styl +2 -0
  65. package/source/css/_layout/sidebar.styl +30 -20
  66. package/source/css/_page/_home/home-top.styl +1 -1
  67. package/source/css/_page/_home/recent-post.styl +2 -2
  68. package/source/css/_page/index.styl +1 -4
  69. package/source/css/_page/links.styl +5 -5
  70. package/source/css/_post/content.styl +26 -7
  71. package/source/css/_post/tools.styl +3 -9
  72. package/source/css/index.styl +1 -3
  73. package/source/img/flower.gif +0 -0
  74. package/source/js/{comment/twikoo_commentBarrage.js → commentBarrage/twikoo.js} +4 -10
  75. package/source/js/commentBarrage/valine.js +156 -0
  76. package/source/js/{comment/waline_commentBarrage.js → commentBarrage/waline.js} +3 -5
  77. package/source/js/main.js +92 -96
  78. package/source/js/third_party/efu_ai.min.js +6 -0
  79. package/source/js/utils.js +15 -2
  80. package/layout/includes/widgets/rightside/index.pug +0 -87
  81. package/source/css/_comments/waline.styl +0 -455
  82. package/source/js/rightside.js +0 -221
  83. package/source/js/third_party/sco-ai.min.js +0 -8
@@ -1,221 +0,0 @@
1
- let rm = {};
2
- const addEvent = (element, event, callback) => element.addEventListener(event, callback);
3
- rm.stopdragimg = Array.from(document.getElementsByTagName('img'));
4
- rm.stopdragimg.forEach(img => addEvent(img, 'dragstart', () => false));
5
- rm.showRightMenu = function (e, n = 0, t = 0) {
6
- let o = document.getElementById('rightMenu');
7
- o.style.top = n + 'px';
8
- o.style.left = t + 'px';
9
- o.style.display = e ? 'block' : 'none';
10
- e ? stopMaskScroll() : document.getElementById('rightmenu-mask').style.display = 'none';
11
- };
12
- rm.reloadrmSize = function () {
13
- let menu = document.querySelector("#rightMenu");
14
- menu.style.display = "block";
15
- rmWidth = menu.offsetWidth;
16
- rmHeight = menu.offsetHeight;
17
- menu.style.display = 'none';
18
- }
19
- async function imageToBlob(e) {
20
- const n = new Image();
21
- const t = document.createElement("canvas");
22
- const o = t.getContext("2d");
23
- n.crossOrigin = "";
24
- n.src = e;
25
- return new Promise((resolve => {
26
- n.onload = function () {
27
- t.width = this.naturalWidth;
28
- t.height = this.naturalHeight;
29
- o.drawImage(this, 0, 0);
30
- t.toBlob((blob => resolve(blob)), "image/png", .75);
31
- };
32
- }));
33
- }
34
- async function copyImage(e) {
35
- try {
36
- const n = await imageToBlob(e);
37
- const t = new ClipboardItem({
38
- "image/png": n
39
- });
40
- await navigator.clipboard.write([t]);
41
- } catch (error) {
42
- console.error('Failed to copy image: ', error);
43
- }
44
- }
45
- function stopMaskScroll() {
46
- addEvent(document.getElementById("rightmenu-mask"), "mousewheel", rm.hideRightMenu);
47
- addEvent(document.getElementById("rightMenu"), "mousewheel", rm.hideRightMenu);
48
- }
49
- rm.downloadimging = false;
50
- rm.writeClipImg = async function (e) {
51
- if (!rm.downloadimging) {
52
- rm.downloadimging = true;
53
- utils.snackbarShow("正在下载中,请稍后", false, 10000);
54
- rm.hideRightMenu();
55
- setTimeout(async function () {
56
- await copyImage(e);
57
- utils.snackbarShow("复制成功!图片已添加盲水印,请遵守版权协议");
58
- rm.downloadimging = false;
59
- }, 1000);
60
- }
61
- };
62
- rm.copyUrl = function (e) {
63
- const t = document.createElement('input');
64
- t.value = e;
65
- document.body.appendChild(t);
66
- t.select();
67
- document.execCommand('copy');
68
- document.body.removeChild(t);
69
- };
70
- rm.insertAtCaret = function (e, n) {
71
- const t = e.selectionStart
72
- , o = e.selectionEnd;
73
- if (document.selection)
74
- e.focus(),
75
- document.selection.createRange().text = n,
76
- e.focus();
77
- else if (t || "0" === t) {
78
- let i = e.scrollTop;
79
- e.value = e.value.substring(0, t) + n + e.value.substring(o, e.value.length),
80
- e.focus(),
81
- e.selectionStart = t + n.length,
82
- e.selectionEnd = t + n.length,
83
- e.scrollTop = i
84
- } else
85
- e.value += n,
86
- e.focus()
87
- }
88
- rm.rightMenuCommentText = function (e) {
89
- rm.hideRightMenu();
90
- let n = document.getElementsByClassName("el-textarea__inner")[0];
91
- let t = document.createEvent("HTMLEvents");
92
- t.initEvent("input", !0, !0);
93
- let o = replaceAll(e, "\n", "\n> ");
94
- n.value = "> " + o + "\n\n",
95
- n.dispatchEvent(t);
96
- const i = document.querySelector("#post-comment").offsetTop;
97
- window.scrollTo(0, i - 80),
98
- n.focus(),
99
- n.setSelectionRange(-1, -1),
100
- document.getElementById("comment-tips") && document.getElementById("comment-tips").classList.add("show")
101
- }
102
- rm.hideRightMenu = () => rm.showRightMenu(false) || (document.getElementById('rightmenu-mask').style.display = 'none')
103
- document.querySelector("#rightMenu").style.display = "block"
104
- rmWidth = document.querySelector("#rightMenu").offsetWidth;
105
- rmHeight = document.querySelector("#rightMenu").offsetHeight;
106
- document.querySelector("#rightMenu").style.display = 'none'
107
- let domhref = "", domImgSrc = "", globalEvent = null;
108
- rm.switchDarkMode = () => sco.switchDarkMode() || rm.hideRightMenu()
109
- rm.rightmenuCopyText = (e) => navigator.clipboard && navigator.clipboard.writeText(e) || utils.snackbarShow("复制文本成功", !1, 2e3) || rm.hideRightMenu()
110
- rm.copyPageUrl = () => rm.copyUrl(window.location.href) || utils.snackbarShow("复制本页链接地址成功", !1, 2e3) || rm.hideRightMenu()
111
- rm.sharePage = () => rm.copyUrl(url) || utils.snackbarShow("复制本页链接地址成功", !1, 2e3) || rm.hideRightMenu()
112
- var selectTextNow = "";
113
- let selceText = () => selectTextNow = document.selection ? document.selection.createRange().text : window.getSelection() + "" || ""
114
- let replaceAll = (e, n, t) => e.split(n).join(t);
115
- document.onmouseup = document.ondbclick = selceText
116
- rm.readClipboard = () => navigator.clipboard && navigator.clipboard.readText().then((e => rm.insertAtCaret(globalEvent.target, e)))
117
- rm.pasteText = () => rm.readClipboard() || rm.hideRightMenu()
118
- rm.copyLink = () => rm.rightmenuCopyText(domhref) || utils.snackbarShow("已复制链接地址")
119
- window.oncontextmenu = function (e) {
120
- if (document.body.clientWidth <= 768) return;
121
- let n = e.clientX + 10;
122
- let t = e.clientY;
123
- let menuItems = {
124
- other: document.getElementsByClassName('rightMenuOther'),
125
- plugin: document.getElementsByClassName('rightMenuPlugin'),
126
- copytext: document.getElementById('menu-copytext'),
127
- pastetext: document.getElementById('menu-pastetext'),
128
- commenttext: document.getElementById('menu-commenttext'),
129
- newwindow: document.getElementById('menu-newwindow'),
130
- copylink: document.getElementById('menu-copylink'),
131
- copyimg: document.getElementById('menu-copyimg'),
132
- downloadimg: document.getElementById('menu-downloadimg'),
133
- search: document.getElementById('menu-search'),
134
- music: {
135
- toggle: document.getElementById('menu-music-toggle'),
136
- back: document.getElementById('menu-music-back'),
137
- forward: document.getElementById('menu-music-forward'),
138
- playlist: document.getElementById('menu-music-playlist'),
139
- copyMusicName: document.getElementById('menu-music-copyMusicName'),
140
- }
141
- };
142
- let y = e.target.href;
143
- let M = e.target.currentSrc;
144
- let b = false;
145
- Array.from(menuItems.other).forEach(item => item.style.display = 'block');
146
- globalEvent = e;
147
- if (selectTextNow && window.getSelection()) {
148
- b = true;
149
- menuItems.copytext.style.display = 'block';
150
- menuItems.commenttext.style.display = 'block';
151
- menuItems.search.style.display = 'block';
152
- } else {
153
- menuItems.copytext.style.display = 'none';
154
- menuItems.commenttext.style.display = 'none';
155
- menuItems.search.style.display = 'none';
156
- }
157
- if (y) {
158
- b = true;
159
- menuItems.newwindow.style.display = 'block';
160
- menuItems.copylink.style.display = 'block';
161
- domhref = y;
162
- } else {
163
- menuItems.newwindow.style.display = 'none';
164
- menuItems.copylink.style.display = 'none';
165
- }
166
- if (M) {
167
- b = true;
168
- menuItems.copyimg.style.display = 'block';
169
- menuItems.downloadimg.style.display = 'block';
170
- domImgSrc = M;
171
- } else {
172
- menuItems.copyimg.style.display = 'none';
173
- menuItems.downloadimg.style.display = 'none';
174
- }
175
- let tagName = e.target.tagName.toLowerCase();
176
- if (tagName === 'input' || tagName === 'textarea') {
177
- b = true;
178
- menuItems.pastetext.style.display = 'block';
179
- } else {
180
- menuItems.pastetext.style.display = 'none';
181
- }
182
- if (e.target.nodeName === 'METING-JS') {
183
- b = true;
184
- Object.values(menuItems.music).forEach(item => item.style.display = 'block');
185
- } else {
186
- Object.values(menuItems.music).forEach(item => item.style.display = 'none');
187
- }
188
- Array.from(b ? menuItems.other : menuItems.plugin).forEach(item => item.style.display = 'none');
189
- Array.from(b ? menuItems.plugin : menuItems.other).forEach(item => item.style.display = 'block');
190
- rm.reloadrmSize();
191
- n + rmWidth > window.innerWidth && (n -= rmWidth + 10);
192
- t + rmHeight > window.innerHeight && (t -= t + rmHeight - window.innerHeight)
193
- rm.showRightMenu(true, t, n);
194
- document.getElementById('rightmenu-mask').style.display = 'flex';
195
- return false;
196
- };
197
- function addRightMenuClickEvent() {
198
- const addEvent = (id, event, callback) => document.getElementById(id)?.addEventListener(event, callback)
199
- addEvent('menu-backward', 'click', () => window.history.back() || rm.hideRightMenu())
200
- addEvent('menu-forward', 'click', () => window.history.forward() || rm.hideRightMenu())
201
- addEvent('menu-refresh', 'click', () => window.location.reload());
202
- addEvent('menu-top', 'click', () => utils.scrollToDest(0, 500) || rm.hideRightMenu())
203
- Array.from(document.getElementsByClassName('menu-link')).forEach(element => element.addEventListener('click', rm.hideRightMenu))
204
- addEvent('menu-darkmode', 'click', rm.switchDarkMode);
205
- addEvent('menu-randomPost', 'click', () => toRandomPost() || rm.hideRightMenu());
206
- GLOBAL_CONFIG.comment.commentBarrage && addEvent('menu-commentBarrage', 'click', sco.switchCommentBarrage);
207
- addEvent('rightmenu-mask', 'click', rm.hideRightMenu);
208
- addEvent('rightmenu-mask', 'contextmenu', () => rm.hideRightMenu() || false)
209
- addEvent('menu-copy', 'click', rm.copyPageUrl);
210
- addEvent('menu-pastetext', 'click', rm.pasteText);
211
- addEvent('menu-copytext', 'click', () => rm.rightmenuCopyText(selectTextNow) || utils.snackbarShow("复制成功,复制和转载请标注本文地址") || rm.hideRightMenu())
212
- GLOBAL_CONFIG.comment.enable && addEvent('menu-commenttext', 'click', () => rm.rightMenuCommentText(selectTextNow))
213
- addEvent('menu-newwindow', 'click', () => window.open(domhref) || rm.hideRightMenu());
214
- addEvent('menu-copylink', 'click', rm.copyLink);
215
- addEvent('menu-downloadimg', 'click', () => sco.downloadImage(domImgSrc));
216
- addEvent('menu-copyimg', 'click', () => rm.writeClipImg(domImgSrc));
217
- addEvent('menu-music-toggle', 'click', sco.musicToggle);
218
- addEvent('menu-music-back', 'click', sco.musicSkipBack);
219
- addEvent('menu-music-forward', 'click', sco.musicSkipForward);
220
- addEvent('menu-music-copyMusicName', 'click', () => rm.rightmenuCopyText(sco.musicGetName()) || utils.snackbarShow("复制歌曲名称成功", false, 3000))
221
- }
@@ -1,8 +0,0 @@
1
- /**
2
- * @name ScoAI
3
- * @description 一个基于AI的文章摘要生成器
4
- * @version 1.0.0
5
- * @author 王卓Sco
6
- * @license GNU General Public License v3.0
7
- */
8
- var ScoAI={root:"https://summary.tianli0.top",aiTalkMode:!1,aiPostExplanation:"",config:GLOBAL_CONFIG.ai,init(){this.scoGPTIsRunning=!1,this.generate(),this.AIEngine()},getTitleAndContent(){const e=document.title,t=document.getElementById("article-container"),n=t.getElementsByTagName("p"),o=t.querySelectorAll("h1, h2, h3, h4, h5");let i="";for(let e of o)i+=e.innerText+" ";for(let e of n)i+=e.innerText.replace(/https?:\/\/[^\s]+/g,"");return(e+" "+i).slice(0,1e3)},generate(){this.aiShowAnimation(this.fetch(this.getTitleAndContent(),this.config.key))},async fetch(e, t){const n=`${this.root}/?content=${encodeURIComponent(e)}&key=${encodeURIComponent(t)}&url=${encodeURIComponent(window.location.href)}`;try{const e=new AbortController,t=await fetch(n,{signal:e.signal});if(t.ok){const e=await t.json();return this.aiPostExplanation=e.summary,e.summary}throw Error("Request failed")}catch(e){return"AbortError"===e.name?console.error("Request timed out"):console.error("Request failed:",e),"获取文章摘要超时。当你出现这个问题时,可能是因为文章过长导致的AI运算量过大, 您可以稍等一下然后重新尝试。"}},aiShowAnimation(e, t=!1){const n=document.querySelector(".ai-explanation"),o=document.querySelector(".ai-tag");if(!n||this.scoGPTIsRunning)return;this.scoGPTIsRunning=!0,this.cleanSuggestions(),o.classList.add("loadingAI"),n.style.display="block",n.innerHTML='生成中...<span class="blinking-cursor"></span>';let i,s,r=!0,a=0,c=!0;const l=new IntersectionObserver((e=>{r=e[0].isIntersecting,r&&requestAnimationFrame(s)}),{threshold:0});e.then((e=>{i=performance.now(),s=()=>{if(a<e.length&&r){const c=performance.now(),g=c-i,d=e.slice(a,a+1),h=/[,。!、?,.!?]/.test(d),u=/[a-zA-Z0-9]/.test(d);g>=(h?100*Math.random()+100:u?10:25)&&(n.innerText=e.slice(0,a+1),i=c,a++,a<e.length?n.innerHTML=e.slice(0,a)+'<span class="blinking-cursor"></span>':(n.innerHTML=e,n.style.display="block",this.scoGPTIsRunning=!1,o.classList.remove("loadingAI"),l.disconnect(),t&&this.createSuggestions())),r&&requestAnimationFrame(s)}},r&&c&&setTimeout((()=>{requestAnimationFrame(s),c=!1}),3e3),l.observe(n)})).catch((e=>{console.error("检索信息失败:",e),n.innerHTML="检索信息失败",n.style.display="block",this.scoGPTIsRunning=!1,o.classList.remove("loadingAI"),l.disconnect()}))},AIEngine(){const e=document.querySelector(".ai-tag");e&&e.addEventListener("click",(()=>{this.scoGPTIsRunning||(this.aiTalkMode=!0,this.aiShowAnimation(Promise.resolve(this.config.talk),!0))}))},cleanSuggestions(){const e=document.querySelector(".ai-suggestions");e?e.innerHTML="":console.error("没有这个元素:'ai-suggestions'")},createSuggestions(){this.aiTalkMode&&this.cleanSuggestions(),this.createSuggestionItemWithAction("这篇文章讲了什么?",(()=>{this.aiShowAnimation(Promise.resolve(this.aiPostExplanation),!0)})),this.config.randomPost&&this.createSuggestionItemWithAction("带我去看看其他文章",(()=>toRandomPost())),this.aiTalkMode=!0},createSuggestionItemWithAction(e, t){const n=document.querySelector(".ai-suggestions");if(!n)return void console.error("无法找到具有class为ai-suggestions的元素");const o=document.createElement("div");o.classList.add("ai-suggestions-item"),o.textContent=e,o.addEventListener("click",t),n.appendChild(o)}};