hexo-theme-volantis 5.8.1 → 6.0.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 (113) hide show
  1. package/CHANGELOG.md +5 -39
  2. package/_cdn.yml +449 -0
  3. package/_config.yml +155 -157
  4. package/languages/en.yml +9 -10
  5. package/languages/zh-CN.yml +11 -15
  6. package/languages/zh-TW.yml +10 -11
  7. package/layout/_meta/category.ejs +10 -5
  8. package/layout/_meta/counter.ejs +14 -17
  9. package/layout/_meta/tags.ejs +3 -0
  10. package/layout/_meta/walinecount.ejs +1 -1
  11. package/layout/_partial/article.ejs +14 -9
  12. package/layout/_partial/cover.ejs +4 -4
  13. package/layout/_partial/footer.ejs +1 -1
  14. package/layout/_partial/head.ejs +7 -18
  15. package/layout/_partial/header.ejs +6 -6
  16. package/layout/_partial/post.ejs +4 -4
  17. package/layout/_partial/scripts/_ctrl.ejs +43 -2
  18. package/layout/_partial/scripts/config.ejs +69 -0
  19. package/layout/_partial/scripts/global.ejs +136 -60
  20. package/layout/_partial/scripts/index.ejs +16 -23
  21. package/layout/_plugins/_page_plugins/artitalk/index.ejs +1 -1
  22. package/layout/_plugins/_page_plugins/bbtalk/index.ejs +1 -1
  23. package/layout/_plugins/_page_plugins/fcircle/index.ejs +9 -8
  24. package/layout/_plugins/_page_plugins/katex/index.ejs +3 -3
  25. package/layout/_plugins/_page_plugins/mathjax/index.ejs +1 -1
  26. package/layout/_plugins/aplayer/layout.ejs +31 -23
  27. package/layout/_plugins/aplayer/script.ejs +93 -65
  28. package/layout/_plugins/comments/artalk/script.ejs +31 -40
  29. package/layout/_plugins/comments/discuss/script.ejs +1 -1
  30. package/layout/_plugins/comments/disqusjs/script.ejs +2 -2
  31. package/layout/_plugins/comments/gitalk/script.ejs +1 -1
  32. package/layout/_plugins/comments/twikoo/script.ejs +1 -1
  33. package/layout/_plugins/comments/vssue/script.ejs +3 -3
  34. package/layout/_plugins/comments/waline/script.ejs +2 -2
  35. package/layout/_plugins/github-api/script.ejs +3 -3
  36. package/layout/_plugins/lazyload/script.ejs +1 -1
  37. package/layout/_plugins/nodewaves/script.ejs +1 -1
  38. package/layout/_plugins/pace/script.ejs +15 -0
  39. package/layout/_plugins/parallax/script.ejs +1 -1
  40. package/layout/_plugins/pjax/index.ejs +66 -11
  41. package/layout/_plugins/pjax/pdata.ejs +5 -5
  42. package/layout/_plugins/preload/script.ejs +2 -2
  43. package/layout/_plugins/rightmenus/layout.ejs +4 -4
  44. package/layout/_plugins/scrollreveal/script.ejs +2 -2
  45. package/layout/_plugins/search/script.ejs +11 -8
  46. package/layout/_plugins/swiper/script.ejs +2 -2
  47. package/layout/{_partial/scripts/toc.ejs → _plugins/toc/script.ejs} +40 -36
  48. package/layout/_widget/blogger.ejs +4 -4
  49. package/layout/_widget/webinfo.ejs +13 -14
  50. package/layout/friends.ejs +2 -2
  51. package/layout/layout.ejs +1 -15
  52. package/package.json +4 -4
  53. package/scripts/events/lib/cdn.js +206 -0
  54. package/scripts/events/lib/check-configuration.js +7 -7
  55. package/scripts/events/lib/check-environment.js +17 -17
  56. package/scripts/events/lib/config.js +0 -24
  57. package/scripts/events/lib/render-stylus.js +5 -5
  58. package/scripts/events/lib/stellar-tag-utils.js +2 -2
  59. package/scripts/filters/hexo-blog-encrypt-callback.js +44 -0
  60. package/scripts/filters/img.js +1 -1
  61. package/scripts/filters/replace.js +3 -3
  62. package/scripts/filters/z-lazyload.js +3 -5
  63. package/scripts/helpers/first-style.js +2 -2
  64. package/scripts/helpers/head/generate_seo.js +24 -10
  65. package/scripts/helpers/head/generate_title__keywords__description.js +28 -9
  66. package/scripts/helpers/related-posts.js +3 -3
  67. package/scripts/helpers/structured-data/lib/blogposting.js +1 -1
  68. package/scripts/helpers/structured-data/lib/breadcrumblist.js +1 -1
  69. package/scripts/helpers/structured-data/lib/config.js +1 -1
  70. package/scripts/helpers/structured-data/lib/website.js +1 -1
  71. package/scripts/helpers//346/226/207/347/253/240/346/216/250/350/215/220.js +184 -0
  72. package/scripts/tags/btn.js +2 -2
  73. package/scripts/tags/btns.js +3 -3
  74. package/scripts/tags/checkbox.js +6 -6
  75. package/scripts/tags/contributors.js +7 -7
  76. package/scripts/tags/dropmenu.js +8 -8
  77. package/scripts/tags/fancybox.js +6 -6
  78. package/scripts/tags/folding.js +5 -5
  79. package/scripts/tags/frame.js +3 -3
  80. package/scripts/tags/friends.js +8 -8
  81. package/scripts/tags/ghcard.js +7 -7
  82. package/scripts/tags/image.js +6 -6
  83. package/scripts/tags/inline-labels.js +6 -6
  84. package/scripts/tags/link.js +5 -5
  85. package/scripts/tags/md.js +4 -4
  86. package/scripts/tags/media.js +5 -5
  87. package/scripts/tags/note.js +12 -12
  88. package/scripts/tags/pandown.js +29 -29
  89. package/scripts/tags/site.js +4 -4
  90. package/scripts/tags/span.js +4 -4
  91. package/scripts/tags/table.js +2 -2
  92. package/scripts/tags/tabs.js +23 -23
  93. package/scripts/tags/timeline.js +5 -5
  94. package/source/css/_first/base_first.styl +1 -1
  95. package/source/css/_style/_layout/article.styl +43 -0
  96. package/source/css/_style/_layout/main.styl +1 -1
  97. package/source/css/_style/_layout/search.styl +206 -14
  98. package/source/css/_style/_plugins/index.styl +1 -3
  99. package/source/js/app.js +133 -160
  100. package/source/js/plugins/parallax.js +1 -1
  101. package/source/js/plugins/rightMenus.js +24 -20
  102. package/source/js/search/algolia.js +239 -0
  103. package/source/js/search/hexo.js +8 -2
  104. package/source/js/search/meilisearch.js +220 -0
  105. package/layout/_partial/scripts/_ctrl/cdnCtrl.ejs +0 -127
  106. package/layout/_partial/scripts/_ctrl/coverCtrl.ejs +0 -43
  107. package/layout/_plugins/analytics/LCCounter.ejs +0 -207
  108. package/layout/_plugins/pjax/animate.ejs +0 -31
  109. package/layout/_plugins/rightmenu/layout.ejs +0 -119
  110. package/scripts/helpers/revisioned.js +0 -167
  111. package/source/css/_style/_plugins/pjaxanimate.styl +0 -160
  112. package/source/js/plugins/rightMenu.js +0 -577
  113. /package/layout/{_partial/scripts/content-visibility-scroll-fix.ejs → _plugins/content-visibility/script.ejs} +0 -0
@@ -1,74 +1,102 @@
1
1
  <script>
2
- volantis.css("<%- theme.plugins.aplayer.css %>");
3
- (async () => {
4
- // APlayer 需要在 MetingJS 之前加载
5
- await volantis.js("<%- theme.plugins.aplayer.js.aplayer %>")
6
- await volantis.js("<%- theme.plugins.aplayer.js.meting %>")
7
- <% if ((theme.rightmenu.enable || theme.rightmenus.enable) && theme.rightmenu.layout.includes('music')) { %>
8
- // 右键 music 需要在 APlayer MetingJS 之后加载
9
- await volantis.js('<%- theme.cdn.addJS("plugins/aplayer") %>')
10
- <% } %>
11
- })();
2
+ volantis.css("<%- theme.cdn.aplayer_css %>");
12
3
 
13
- function SetAPlayerPlugin(){
14
- let Metings = document.querySelectorAll('meting-js');
15
- if (Metings.length === 0) {return;};
16
- if (Metings[0].aplayer && Metings[0].aplayer.on) {
17
- // improve the accessibility https://web.dev/button-name/
18
- document.querySelectorAll(".aplayer-icon-menu").forEach(e=>{
19
- e.setAttribute("aria-label","Aplayer Menu")
20
- })
21
- // message see: /layout/_plugins/message/script.ejs
22
- <% if (theme.plugins.message.enable && theme.plugins.message.aplayer.enable) { %>
23
- try {
24
- setTimeout(() => {
25
- Metings.forEach((item, index) => {
26
- const aplayerItem = item.aplayer; if(!aplayerItem) return;
27
- const rightAplayerCheck = '<%= theme.rightmenu.layout.includes("music") %>' === 'true'
28
- && item.meta.id === '<%= theme.plugins.aplayer.id %>';
29
- if(rightAplayerCheck && typeof RightMenuAplayer !="undefined") RightMenuAplayer.checkAPlayer();
30
- if(aplayerItem.events.events.play.every(item => {return item.name !== 'messagePlay'})) {
31
- aplayerItem.on('play', function messagePlay() {
32
- let index = aplayerItem.list.index;
33
- let title = aplayerItem.list.audios[index].title;
34
- let artist = aplayerItem.list.audios[index].artist;
35
- setTimeout(() => {
36
- VolantisApp.message('音乐通知', title + ' - ' + artist, {
37
- icon: '<%- theme.plugins.message.aplayer.play %>',
38
- transitionIn: 'flipInX',
39
- transitionOut: 'flipOutX'
40
- });
41
- }, 100)
42
- });
43
- }
44
- if(aplayerItem.events.events.pause.every(item => {return item.name !== 'messagePause'})) {
45
- aplayerItem.on('pause', function messagePause() {
46
- let index = aplayerItem.list.index;
47
- let title = aplayerItem.list.audios[index].title;
48
- let artist = aplayerItem.list.audios[index].artist;
49
- setTimeout(() => {
50
- // 歌曲播放结束也会触发 pause 事件,为了避免错误提示,等待一会儿
51
- if(aplayerItem.paused) {
4
+ <% if (theme.plugins.aplayer.source == "meting") { %>
5
+ (async () => {
6
+ // APlayer 需要在 MetingJS 之前加载
7
+ await volantis.js("<%- theme.cdn.aplayer_js %>")
8
+ await volantis.js("<%- theme.cdn.meting %>")
9
+ <% if (theme.rightmenus.enable && theme.rightmenus.order.includes('music')) { %>
10
+ // 右键 music 需要在 APlayer MetingJS 之后加载
11
+ await volantis.js('<%- theme.cdn.volantis_aplayer %>')
12
+ <% } %>
13
+ })();
14
+
15
+ function SetAPlayerPlugin(){
16
+ let Metings = document.querySelectorAll('meting-js');
17
+ if (Metings.length === 0) {return;};
18
+ if (Metings[0].aplayer && Metings[0].aplayer.on) {
19
+ // improve the accessibility https://web.dev/button-name/
20
+ document.querySelectorAll(".aplayer-icon-menu").forEach(e=>{
21
+ e.setAttribute("aria-label","Aplayer Menu")
22
+ })
23
+ // message see: /layout/_plugins/message/script.ejs
24
+ <% if (theme.plugins.message.enable && theme.plugins.message.aplayer.enable) { %>
25
+ try {
26
+ setTimeout(() => {
27
+ Metings.forEach((item, index) => {
28
+ const aplayerItem = item.aplayer; if(!aplayerItem) return;
29
+ const rightAplayerCheck = '<%= theme.rightmenus.order.includes("music") %>' === 'true'
30
+ && item.meta.id === '<%= theme.plugins.aplayer.id %>';
31
+ if(rightAplayerCheck && typeof RightMenuAplayer !="undefined") RightMenuAplayer.checkAPlayer();
32
+ if(aplayerItem.events.events.play.every(item => {return item.name !== 'messagePlay'})) {
33
+ aplayerItem.on('play', function messagePlay() {
34
+ let index = aplayerItem.list.index;
35
+ let title = aplayerItem.list.audios[index].title;
36
+ let artist = aplayerItem.list.audios[index].artist;
37
+ setTimeout(() => {
52
38
  VolantisApp.message('音乐通知', title + ' - ' + artist, {
53
- icon: '<%- theme.plugins.message.aplayer.pause %>',
39
+ icon: '<%- theme.plugins.message.aplayer.play %>',
54
40
  transitionIn: 'flipInX',
55
41
  transitionOut: 'flipOutX'
56
42
  });
57
- }
58
- }, 100)
59
- });
60
- }
61
- });
62
- }, 500)
63
- } catch (error) { console.error(error); }
64
- <% } %>
65
- }else{
66
- volantis.requestAnimationFrame(SetAPlayerPlugin)
43
+ }, 100)
44
+ });
45
+ }
46
+ if(aplayerItem.events.events.pause.every(item => {return item.name !== 'messagePause'})) {
47
+ aplayerItem.on('pause', function messagePause() {
48
+ let index = aplayerItem.list.index;
49
+ let title = aplayerItem.list.audios[index].title;
50
+ let artist = aplayerItem.list.audios[index].artist;
51
+ setTimeout(() => {
52
+ // 歌曲播放结束也会触发 pause 事件,为了避免错误提示,等待一会儿
53
+ if(aplayerItem.paused) {
54
+ VolantisApp.message('音乐通知', title + ' - ' + artist, {
55
+ icon: '<%- theme.plugins.message.aplayer.pause %>',
56
+ transitionIn: 'flipInX',
57
+ transitionOut: 'flipOutX'
58
+ });
59
+ }
60
+ }, 100)
61
+ });
62
+ }
63
+ });
64
+ }, 500)
65
+ } catch (error) { console.error(error); }
66
+ <% } %>
67
+ }else{
68
+ volantis.requestAnimationFrame(SetAPlayerPlugin)
69
+ }
67
70
  }
68
- }
69
71
 
70
- document.addEventListener("DOMContentLoaded", ()=>{
71
- SetAPlayerPlugin();
72
- });
73
- volantis.pjax.push(SetAPlayerPlugin);
72
+ document.addEventListener("DOMContentLoaded", ()=>{
73
+ SetAPlayerPlugin();
74
+ });
75
+ volantis.pjax.push(SetAPlayerPlugin);
76
+ <% } else { %>
77
+ volantis.js("<%- theme.cdn.aplayer_js %>").then(()=>{
78
+ document.querySelectorAll('.aplayer-local').forEach(e=>{
79
+ new APlayer({
80
+ container: e,
81
+ fixed: <%- theme.plugins.aplayer.fixed %>,
82
+ order: "<%-theme.plugins.aplayer.order %>",
83
+ volume: "<%-theme.plugins.aplayer.volume %>",
84
+ autoplay: <%-theme.plugins.aplayer.autoplay %>,
85
+ loop: "<%-theme.plugins.aplayer.loop %>",
86
+ theme: "<%-theme.plugins.aplayer.theme %>",
87
+ listMaxHeight: "<%-theme.plugins.aplayer.list_max_height %>",
88
+ listFolded: "<%-theme.plugins.aplayer.list_folded %>",
89
+ preload: 'auto',
90
+ lrcType: 3,
91
+ audio: <%- JSON.stringify(theme.plugins.aplayer.audio) %>
92
+ });
93
+ })
94
+
95
+ // post.music 迷你模式 pjax todo...
96
+ // document.querySelectorAll('.aplayer-local-min').forEach(e=>{
97
+ // // todo...
98
+ // })
99
+ // 右键 todo...
100
+ })
101
+ <% } %>
74
102
  </script>
@@ -1,37 +1,30 @@
1
1
  <script>
2
- volantis.layoutHelper("comments", `<div id="artalk_container"><i class="fa-solid fa-cog fa-spin fa-fw fa-2x"></i></div>`);
3
-
2
+ volantis.layoutHelper("comments",`<div id="artalk_container"><i class="fa-solid fa-cog fa-spin fa-fw fa-2x"></i></div>`);
4
3
  function load_artalk() {
5
- if (!document.querySelector("#artalk_container")) return;
6
-
7
- volantis.css("<%- theme.comments.artalk.css %>");
8
-
9
- volantis.js("<%- theme.comments.artalk.js %>")
10
- .then(() => {
11
- if (typeof Artalk === 'undefined') {
12
- console.error('Artalk.js loaded but Artalk is not defined');
13
- return;
14
- }
15
- return pjax_artalk();
16
- })
17
- .catch(err => {
18
- console.error('Failed to load Artalk.js:', err);
19
- });
4
+ if(!document.querySelectorAll("#artalk_container")[0])return;
5
+ volantis.css("<%- theme.cdn.artalk_css %>");
6
+ <% if (theme.comments.artalk.latex) { %>
7
+ volantis.css("<%- theme.cdn.katex_css %>");
8
+ volantis.js("<%- theme.cdn.katex_js %>");
9
+ volantis.js("<%- theme.cdn.artalk_js %>");
10
+ volantis.js("<%- theme.cdn.artalk_katex %>").then(pjax_artalk);
11
+ <% } else { %>
12
+ volantis.js("<%- theme.cdn.artalk_js %>").then(pjax_artalk);
13
+ <% } %>
20
14
  }
21
15
 
22
16
  function pjax_artalk() {
23
- if (!document.querySelector("#artalk_container")) return;
24
-
17
+ if(!document.querySelectorAll("#artalk_container")[0])return;
25
18
  let path = pdata.commentPath;
26
19
  let placeholder = pdata.commentPlaceholder || "<%= theme.comments.artalk.placeholder %>" || "";
27
- if (!path) {
20
+ if (path.length == 0) {
28
21
  path = '<%= theme.comments.artalk.path %>' || decodeURI(window.location.pathname);
29
22
  }
30
- if (!'<%= config.permalink %>'.includes('/index.html')) {
31
- path = path.replace(/\/index\.html$/, '/').replace(/\.html$/, '');
23
+ if(!'<%= config.permalink %>'.includes('/index.html')) {
24
+ path = path.replaceAll('/index.html', '/').replaceAll('.html', '')
32
25
  }
33
26
 
34
- volantis.artalk = Artalk.init(Object.assign(<%- JSON.stringify(theme.comments.artalk) %>, {
27
+ volantis.artalk = new Artalk(Object.assign(<%- JSON.stringify(theme.comments.artalk) %>, {
35
28
  el: '#artalk_container',
36
29
  pageKey: path,
37
30
  pageTitle: document.title,
@@ -46,51 +39,49 @@
46
39
  let headers = new Headers();
47
40
  headers.set('Accept', 'application/json');
48
41
  <% if(!!theme.comments.artalk.imageUploader?.token) { %>
49
- headers.set('Authorization', '<%= theme.comments.artalk.imageUploader?.token %>');
42
+ headers.set('Authorization', '<%= theme.comments.artalk.imageUploader?.token %>')
50
43
  <% } %>
51
44
  let formData = new FormData();
52
45
  formData.append('file', file);
53
- return fetch('<%= theme.comments.artalk.imageUploader?.api %>', {
46
+ return fetch('<%= theme.comments.artalk.imageUploader?.api %>',{
54
47
  method: 'POST',
55
48
  body: formData,
56
49
  headers: headers
57
- })
58
- .then(resp => resp.json())
59
- .then(resp => resp.<%= theme.comments.artalk.imageUploader?.resp %>);
50
+ }).then((resp) => resp.json())
51
+ .then((resp) => resp.<%= theme.comments.artalk.imageUploader?.resp %>)
60
52
  },
61
53
  <% } %>
62
54
  }));
63
55
 
64
56
  Artalk.use(ctx => {
65
57
  ctx.on('list-loaded', () => {
66
- if (typeof VolantisFancyBox === "undefined") {
58
+ if (typeof VolantisFancyBox === "undefined"){
67
59
  const checkFancyBox = setInterval(() => {
68
- if (typeof VolantisFancyBox === "undefined") return;
60
+ if(typeof VolantisFancyBox === "undefined") return;
69
61
  clearInterval(checkFancyBox);
70
62
  VolantisFancyBox.groupBind('.atk-content img:not([atk-emoticon])', 'Comments');
71
- }, 100);
63
+ })
72
64
  } else {
73
65
  VolantisFancyBox.groupBind('.atk-content img:not([atk-emoticon])', 'Comments');
74
66
  }
75
- });
76
- });
67
+ })
68
+ })
77
69
  }
78
70
 
79
71
  load_artalk();
80
-
81
- volantis.pjax.push(() => {
72
+ volantis.pjax.push(()=>{
82
73
  if (typeof Artalk === "undefined") {
83
74
  load_artalk();
84
75
  } else {
85
76
  pjax_artalk();
86
77
  }
87
- }, 'artalk');
78
+ },'artalk');
88
79
 
89
80
  function dark_artalk() {
90
- if (!document.querySelector("#artalk_container")) return;
91
- if (volantis.artalk && typeof volantis.artalk.setDarkMode === 'function') {
92
- volantis.artalk.setDarkMode(volantis.dark.mode === "dark");
93
- }
81
+ if(!document.querySelectorAll("#artalk_container")[0]) return;
82
+ volantis.artalk.then(ctx => {
83
+ ctx.setDarkMode(volantis.dark.mode === "dark")
84
+ })
94
85
  }
95
86
  volantis.dark.push(dark_artalk);
96
87
  </script>
@@ -2,7 +2,7 @@
2
2
  volantis.layoutHelper("comments",`<div id="discuss_container"></div>`)
3
3
  function load_discuss() {
4
4
  if(!document.querySelectorAll("#discuss_container")[0])return;
5
- volantis.js("<%- theme.comments.discuss.js %>", pjax_discuss)
5
+ volantis.js("<%- theme.cdn.discuss %>", pjax_discuss)
6
6
  }
7
7
  function pjax_discuss() {
8
8
  if(!document.querySelectorAll("#discuss_container")[0])return;
@@ -2,8 +2,8 @@
2
2
  volantis.layoutHelper("comments",`<div id="disqus_thread"></div>`)
3
3
  // from: https://github.com/ChrAlpha/hexo-theme-cards/blob/master/layout/_plugins/comments/disqusjs/source.ejs
4
4
  function loadDisqusJS() {
5
- volantis.js('<%= theme.comments.disqusjs.js %>', pjax_DisqusJS)
6
- volantis.css('<%= theme.comments.disqusjs.css %>')
5
+ volantis.js('<%= theme.cdn.disqusjs_js %>', pjax_DisqusJS)
6
+ volantis.css('<%= theme.cdn.disqusjs_css %>')
7
7
  }
8
8
  let path = pdata.commentPath;
9
9
  if (path.length == 0) {
@@ -19,6 +19,6 @@
19
19
  gitalk.render('gitalk-container');
20
20
  }
21
21
  }
22
- volantis.js('<%= theme.comments.gitalk.js %>').then(pjax_gitalk)
22
+ volantis.js('<%= theme.cdn.gitalk %>').then(pjax_gitalk)
23
23
  volantis.pjax.push(pjax_gitalk);
24
24
  </script>
@@ -2,7 +2,7 @@
2
2
  volantis.layoutHelper("comments",`<div id="twikoo_container"><i class="fa-solid fa-cog fa-spin fa-fw fa-2x"></i></div>`)
3
3
  function load_twikoo() {
4
4
  if(!document.querySelectorAll("#twikoo_container")[0])return;
5
- volantis.js("<%- theme.comments.twikoo.js %>", pjax_twikoo)
5
+ volantis.js("<%- theme.cdn.twikoo %>", pjax_twikoo)
6
6
  }
7
7
  function pjax_twikoo() {
8
8
  if(!document.querySelectorAll("#twikoo_container")[0])return;
@@ -1,8 +1,8 @@
1
1
 
2
- <script src="<%- theme.comments.vssue.vue %>"></script>
3
- <script src="<%- theme.comments.vssue.js %>"></script>
2
+ <script src="<%- theme.cdn.vssue_vue %>"></script>
3
+ <script src="<%- theme.cdn.vssue_js %>"></script>
4
4
  <script>
5
- volantis.css("<%- theme.comments.vssue.css %>");
5
+ volantis.css("<%- theme.cdn.vssue_css %>");
6
6
  function fancybox_vssue() {
7
7
  if(typeof VolantisFancyBox === "undefined") {
8
8
  const checkFancyBox = setInterval(() => {
@@ -56,7 +56,7 @@
56
56
  }
57
57
  }
58
58
 
59
- volantis.css('<%= theme.comments.waline.css %>')
60
- volantis.js('<%- theme.comments.waline.js %>').then(pjax_waline)
59
+ volantis.css('<%= theme.cdn.waline_css %>')
60
+ volantis.js('<%- theme.cdn.waline_js %>').then(pjax_waline)
61
61
  volantis.pjax.push(pjax_waline);
62
62
  </script>
@@ -3,19 +3,19 @@
3
3
  <% if (theme.plugins.sitesjs.enable) { %>
4
4
  const sites_api = document.getElementById('sites-api');
5
5
  if (sites_api != undefined && typeof SitesJS === 'undefined') {
6
- volantis.js("<%- theme.cdn.map.js.sites %>")
6
+ volantis.js("<%- theme.cdn.volantis_tags_sites %>")
7
7
  }
8
8
  <% } %>
9
9
  <% if (theme.plugins.friendsjs.enable) { %>
10
10
  const friends_api = document.getElementById('friends-api');
11
11
  if (friends_api != undefined && typeof FriendsJS === 'undefined') {
12
- volantis.js("<%- theme.cdn.map.js.friends %>")
12
+ volantis.js("<%- theme.cdn.volantis_tags_friends %>")
13
13
  }
14
14
  <% } %>
15
15
  <% if (theme.plugins.contributorsjs.enable) { %>
16
16
  const contributors_api = document.getElementById('contributors-api');
17
17
  if (contributors_api != undefined && typeof ContributorsJS === 'undefined') {
18
- volantis.js("<%- theme.cdn.map.js.contributors %>")
18
+ volantis.js("<%- theme.cdn.volantis_tags_contributors %>")
19
19
  }
20
20
  <% } %>
21
21
  };
@@ -1,4 +1,4 @@
1
- <script defer src="<%- theme.plugins.lazyload.js %>"></script>
1
+ <script defer src="<%- theme.cdn['vanilla-lazyload'] %>"></script>
2
2
  <script>
3
3
  // https://www.npmjs.com/package/vanilla-lazyload
4
4
  // Set the options globally
@@ -1,4 +1,4 @@
1
- <%- js({src: theme.plugins.nodewaves.js}) %>
1
+ <%- js({src: theme.cdn.nodewaves_js}) %>
2
2
  <script type="text/javascript">
3
3
  document.addEventListener("DOMContentLoaded", function () {
4
4
  Waves.attach('.flat-btn', ['waves-button']);
@@ -0,0 +1,15 @@
1
+ <script>
2
+ volantis.css("<%- theme.cdn.pace_css %>");
3
+ volantis.js("<%- theme.cdn.pace_js %>").then(() => {
4
+ Pace.options.restartOnPushState = false;
5
+ volantis.pjax.send(Pace.restart);
6
+ // 阅读进度
7
+ volantis.scroll.push(() => {
8
+ Pace.stop();
9
+ Pace.trigger('start');
10
+ Pace.bar.update(volantis.scroll.progress() * 100);
11
+ document.body.className = document.body.className.replaceAll("pace-running ","");
12
+ },"阅读进度")
13
+ // todo:配置项开关, 哪些页面添加阅读进度
14
+ })
15
+ </script>
@@ -63,7 +63,7 @@ _%>
63
63
  var runningOnBrowser = typeof window !== "undefined";
64
64
  var isBot = runningOnBrowser && !("onscroll" in window) || typeof navigator !== "undefined" && /(gle|ing|ro|msn)bot|crawl|spider|yand|duckgo/i.test(navigator.userAgent);
65
65
  if (!isBot) {
66
- volantis.js('<%- theme.cdn.map.js.parallax %>').then(()=>{
66
+ volantis.js('<%- theme.cdn.volantis_parallax %>').then(()=>{
67
67
  parallax()
68
68
  })
69
69
  volantis.pjax.send(()=>{
@@ -6,18 +6,47 @@
6
6
  4. .pjax
7
7
  -->
8
8
  <%
9
- var banUrl = theme.plugins.pjax.banUrl || [];
9
+ var excludeList = theme.plugins.pjax.exclude || [];
10
10
  %>
11
11
 
12
- <%- js(theme.plugins.pjax.js) %>
13
- <% if (theme.plugins.pjax.animation){ %>
14
- <%- partial('animate') %>
15
- <% } %>
12
+ <%- js(theme.cdn.pjax) %>
16
13
  <script>
14
+ // 性能监控与降级控制
15
+ const performanceMonitor = {
16
+ slowThreshold: 800, // 慢请求阈值(毫秒)
17
+ slowCount: 0, // 连续慢请求计数
18
+ maxSlowAllowed: 2, // 允许的最大连续慢请求数
19
+ requestStartTime: 0, // 请求开始时间戳
20
+
21
+ // 记录请求开始时间
22
+ start() {
23
+ this.requestStartTime = Date.now();
24
+ },
25
+
26
+ // 计算请求耗时并判断
27
+ check() {
28
+ const duration = Date.now() - this.requestStartTime;
29
+
30
+ if (duration > this.slowThreshold) {
31
+ this.slowCount++;
32
+ } else {
33
+ this.slowCount = 0; // 耗时正常,重置计数
34
+ }
35
+ },
36
+ // 测试结果
37
+ res(){
38
+ // 连续慢请求达到阈值,强制刷新
39
+ if (this.slowCount >= this.maxSlowAllowed) {
40
+ return true; // 需要降级
41
+ }
42
+ return false; // 无需降级
43
+ }
44
+ };
17
45
  var pjax;
18
46
  document.addEventListener('DOMContentLoaded', function () {
19
47
  pjax = new Pjax({
20
48
  elements: 'a[href]:not([href^="#"]):not([href="javascript:void(0)"]):not([pjax-fancybox]):not([onclick="return false;"]):not([onclick="return!1"]):not([target="_blank"]):not([target="view_window"]):not([href$=".xml"])',
49
+ // 这里的 selectors 需要保证每个页面都含有相同的数目
21
50
  selectors: [
22
51
  "head title",
23
52
  "head meta[name=keywords]",
@@ -27,7 +56,14 @@
27
56
  "#pjax-header-nav-list",
28
57
  ".pjax",
29
58
  "pjax", // <pjax></pjax> 标签
30
- "script[data-pjax], .pjax-reload script" // script标签添加data-pjax 或 script标签外层添加.pjax-reload 的script代码段重载
59
+ // 临时测试
60
+ "meta[name=robots]",
61
+ "link[rel=canonical]",
62
+ "meta[property='og:title']",
63
+ "meta[property='og:description']",
64
+ "meta[property='og:url']",
65
+ "meta[property='og:image']",
66
+ "script[type='application/ld+json']",
31
67
  ],
32
68
  cacheBust: <%= theme.plugins.pjax.cacheBust %>, // url 地址追加时间戳,用以避免浏览器缓存
33
69
  timeout: <%= theme.plugins.pjax.timeout %>,
@@ -36,19 +72,23 @@
36
72
  });
37
73
 
38
74
  document.addEventListener('pjax:send', function (e) {
39
- //window.stop(); // 相当于点击了浏览器的停止按钮
75
+ window.stop(); // 相当于点击了浏览器的停止按钮
76
+ performanceMonitor.start(); // 请求开始计时
40
77
 
41
78
  try {
42
79
  var currentUrl = window.location.pathname;
43
80
  var targetUrl = e.triggerElement.href;
44
- var banUrl = <%- '["' + banUrl.join('", "') + '"]' %>;
45
- if (banUrl[0] != "") {
46
- banUrl.forEach(item => {
81
+ var excludeList = <%- '["' + excludeList.join('", "') + '"]' %>;
82
+ if (excludeList[0] != "") {
83
+ excludeList.forEach(item => {
47
84
  if(currentUrl.indexOf(item) != -1 || targetUrl.indexOf(item) != -1) {
48
85
  window.location.href = targetUrl;
49
86
  }
50
87
  });
51
88
  }
89
+ if (performanceMonitor.res()){
90
+ window.location.href = targetUrl;
91
+ }
52
92
  } catch (error) {}
53
93
 
54
94
  // 使用 volantis.pjax.send 方法传入pjax:send回调函数 参见layout/_partial/scripts/global.ejs
@@ -56,12 +96,27 @@
56
96
  });
57
97
 
58
98
  document.addEventListener('pjax:complete', function () {
99
+ // 降级控制检测
100
+ performanceMonitor.check()
101
+ // 这里的 script 不需要保证每个页面都含有相同的数目
102
+ document.querySelectorAll('script[data-pjax], .pjax-reload script').forEach(e=>{
103
+ const code = e.text || e.textContent || e.innerHTML || '';
104
+ const script = document.createElement('script');
105
+ Object.keys(e.attributes).forEach(i=>{
106
+ script.setAttribute(e.attributes[i].nodeName,e.attributes[i].nodeValue)
107
+ })
108
+ if (code) {
109
+ script.appendChild(document.createTextNode(code));
110
+ }
111
+ e.parentNode.replaceChild(script, e);
112
+ });
113
+
59
114
  // 使用 volantis.pjax.push 方法传入重载函数 参见layout/_partial/scripts/global.ejs
60
115
  volantis.pjax.method.complete.start();
61
116
  });
62
117
 
63
118
  document.addEventListener('pjax:error', function (e) {
64
- if(volantis.debug) {
119
+ if(volantis.debug === "pjax") {
65
120
  console.error(e);
66
121
  console.log('pjax error: \n' + JSON.stringify(e));
67
122
  }else{
@@ -34,11 +34,11 @@ if (page && page.layout == 'post' && page.title) {
34
34
  pdata.commentPath="<%=commentPath%>";
35
35
  pdata.commentPlaceholder="<%=commentPlaceholder%>";
36
36
  pdata.commentConfig=<%- JSON.stringify(commentConfig) %>;
37
- // see: /layout/_partial/scripts/_ctrl/coverCtrl.ejs
37
+ // see: /layout/_partial/scripts/_ctrl.ejs
38
38
  <% if (theme.plugins.pjax.enable) {%>
39
39
  // header
40
40
  var l_header=document.getElementById("l_header");
41
- <% if (theme.pjax_cover.frontMatterCover == "none") {%>
41
+ <% if (theme.cover_ctrl.frontMatterCover == "none") {%>
42
42
  l_header.classList.add("show");
43
43
  <% } else {%>
44
44
  l_header.classList.remove("show");
@@ -47,9 +47,9 @@ if (page && page.layout == 'post' && page.title) {
47
47
  // cover
48
48
  var cover_wrapper=document.querySelector('#l_cover .cover-wrapper');
49
49
  var scroll_down=document.getElementById('scroll-down');
50
- cover_wrapper.id="<%=theme.pjax_cover.frontMatterCover%>";
51
- cover_wrapper.style.display="<%=theme.pjax_cover.coverWrapperDisplay%>";
52
- scroll_down.style.display="<%=theme.pjax_cover.scrollDownDisplay%>";
50
+ cover_wrapper.id="<%=theme.cover_ctrl.frontMatterCover%>";
51
+ cover_wrapper.style.display="<%=theme.cover_ctrl.coverWrapperDisplay%>";
52
+ scroll_down.style.display="<%=theme.cover_ctrl.scrollDownDisplay%>";
53
53
  <% }%>
54
54
  <% }%>
55
55
  </script>
@@ -1,6 +1,6 @@
1
1
  <% let preload = theme.plugins.preload; %>
2
2
  <% if (preload.service == 'instant_page') { %>
3
- <script async src="<%- preload.instant_page %>" type="module" defer integrity="sha384-OeDn4XE77tdHo8pGtE1apMPmAipjoxUQ++eeJa6EtJCfHlvijigWiJpD7VDPWXV1"></script>
3
+ <script async src="<%- theme.cdn.instant_page %>" type="module" defer integrity="sha384-OeDn4XE77tdHo8pGtE1apMPmAipjoxUQ++eeJa6EtJCfHlvijigWiJpD7VDPWXV1"></script>
4
4
  <% } else if (preload.service == 'flying_pages') { %>
5
5
  <script>
6
6
  window.FPConfig = {
@@ -10,5 +10,5 @@
10
10
  hoverDelay: 0
11
11
  };
12
12
  </script>
13
- <script defer src="<%- preload.flying_pages %>"></script>
13
+ <script defer src="<%- theme.cdn['flying-pages'] %>"></script>
14
14
  <% } %>
@@ -100,13 +100,13 @@
100
100
  <p class='nav music-title fix-cursor-default'></p>
101
101
  </li>
102
102
  <li class='music ctrl'>
103
- <a class='nav icon-only backward fix-cursor-default' href="/" onclick="return false;" title="backward">
103
+ <a class='nav icon-only backward fix-cursor-default' title="backward">
104
104
  <i class='<%= theme.rightmenus.options.iconPrefix %> fa-step-backward fa-fw'></i>
105
105
  </a>
106
- <a class='nav icon-only toggle fix-cursor-default' href="/" onclick="return false;" title="toggle">
106
+ <a class='nav icon-only toggle fix-cursor-default' title="toggle">
107
107
  <i class='<%= theme.rightmenus.options.iconPrefix %> fa-play fa-fw'></i>
108
108
  </a>
109
- <a class='nav icon-only forward fix-cursor-default' href="/" onclick="return false;" title="forward">
109
+ <a class='nav icon-only forward fix-cursor-default' title="forward">
110
110
  <i class='<%= theme.rightmenus.options.iconPrefix %> fa-step-forward fa-fw'></i>
111
111
  </a>
112
112
  </li>
@@ -130,7 +130,7 @@
130
130
  <% rightMenu.initMenu() %>
131
131
  </ul>
132
132
  </div>
133
- <script src="<%- theme.cdn.map.js.rightMenus %>"></script>
133
+ <script src="<%- theme.cdn.volantis_rightMenus %>"></script>
134
134
  <script>
135
135
  const RightMenusFunction = {};
136
136
  <% rightMenu.initFunction() %>
@@ -15,8 +15,8 @@
15
15
  pjax_scrollrebeal();
16
16
  }
17
17
  }
18
- volantis.js("<%- theme.plugins.scrollreveal.js %>");
19
- document.addEventListener("DOMContentLoaded", init_scrollrebeal);
18
+ volantis.js("<%- theme.cdn.scrollreveal %>");
19
+ document.addEventListener("DOMContentLoaded", init_scrollrebeal)
20
20
  volantis.pjax.push(
21
21
  pjax_scrollrebeal,
22
22
  "pjax_scrollrebeal",