hexo-component-inferno 1.1.0 → 2.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 (124) hide show
  1. package/lib/hexo/generator/insight.js +8 -1
  2. package/lib/hexo/generator/insight.test.js +16 -0
  3. package/lib/hexo/helper/cdn.js +3 -9
  4. package/lib/hexo/helper/cdn.test.js +9 -37
  5. package/lib/hexo/tag/message.test.js +17 -8
  6. package/lib/hexo/tag/tabs.js +16 -15
  7. package/lib/hexo/tag/tabs.test.js +19 -10
  8. package/lib/schema/comment/twikoo.json +28 -0
  9. package/lib/schema/comment/waline.json +34 -22
  10. package/lib/schema/schema/comment/changyan.json +21 -0
  11. package/lib/schema/schema/comment/disqus.json +17 -0
  12. package/lib/schema/schema/comment/disqusjs.json +53 -0
  13. package/lib/schema/schema/comment/facebook.json +13 -0
  14. package/lib/schema/schema/comment/gitalk.json +81 -0
  15. package/lib/schema/schema/comment/gitment.json +47 -0
  16. package/lib/schema/schema/comment/isso.json +17 -0
  17. package/lib/schema/schema/comment/livere.json +17 -0
  18. package/lib/schema/schema/comment/twikoo.json +28 -0
  19. package/lib/schema/schema/comment/utterances.json +59 -0
  20. package/lib/schema/schema/comment/valine.json +105 -0
  21. package/lib/schema/schema/comment/waline.json +176 -0
  22. package/lib/schema/schema/donate/afdian.json +17 -0
  23. package/lib/schema/schema/donate/alipay.json +17 -0
  24. package/lib/schema/schema/donate/buymeacoffee.json +17 -0
  25. package/lib/schema/schema/donate/patreon.json +17 -0
  26. package/lib/schema/schema/donate/paypal.json +22 -0
  27. package/lib/schema/schema/donate/wechat.json +17 -0
  28. package/lib/schema/schema/misc/manifest.json +66 -0
  29. package/lib/schema/schema/misc/meta.json +11 -0
  30. package/lib/schema/schema/misc/open_graph.json +78 -0
  31. package/lib/schema/schema/misc/poly_links.json +35 -0
  32. package/lib/schema/schema/misc/structured_data.json +47 -0
  33. package/lib/schema/schema/plugin/baidu_analytics.json +14 -0
  34. package/lib/schema/schema/plugin/bing_webmaster.json +14 -0
  35. package/lib/schema/schema/plugin/busuanzi.json +7 -0
  36. package/lib/schema/schema/plugin/cnzz.json +19 -0
  37. package/lib/schema/schema/plugin/cookie_consent.json +38 -0
  38. package/lib/schema/schema/plugin/gallery.json +7 -0
  39. package/lib/schema/schema/plugin/google_analytics.json +14 -0
  40. package/lib/schema/schema/plugin/hotjar.json +14 -0
  41. package/lib/schema/schema/plugin/katex.json +7 -0
  42. package/lib/schema/schema/plugin/mathjax.json +7 -0
  43. package/lib/schema/schema/plugin/outdated_browser.json +7 -0
  44. package/lib/schema/schema/plugin/progressbar.json +7 -0
  45. package/lib/schema/schema/plugin/statcounter.json +19 -0
  46. package/lib/schema/schema/plugin/twitter_conversion_tracking.json +14 -0
  47. package/lib/schema/schema/search/algolia.json +13 -0
  48. package/lib/schema/schema/search/baidu.json +13 -0
  49. package/lib/schema/schema/search/google_cse.json +17 -0
  50. package/lib/schema/schema/search/insight.json +19 -0
  51. package/lib/schema/schema/share/addthis.json +17 -0
  52. package/lib/schema/schema/share/addtoany.json +13 -0
  53. package/lib/schema/schema/share/bdshare.json +13 -0
  54. package/lib/schema/schema/share/sharejs.json +13 -0
  55. package/lib/schema/schema/share/sharethis.json +17 -0
  56. package/lib/schema/schema/widget/adsense.json +21 -0
  57. package/lib/schema/schema/widget/archives.json +13 -0
  58. package/lib/schema/schema/widget/categories.json +13 -0
  59. package/lib/schema/schema/widget/followit.json +26 -0
  60. package/lib/schema/schema/widget/links.json +47 -0
  61. package/lib/schema/schema/widget/recent_posts.json +13 -0
  62. package/lib/schema/schema/widget/subscribe_email.json +22 -0
  63. package/lib/schema/schema/widget/tags.json +30 -0
  64. package/lib/schema/schema/widget/toc.json +31 -0
  65. package/lib/schema/search/insight.json +6 -0
  66. package/lib/schema/widget/tags.json +17 -0
  67. package/lib/view/comment/changyan.js +2 -2
  68. package/lib/view/comment/disqus.js +2 -2
  69. package/lib/view/comment/disqusjs.js +2 -2
  70. package/lib/view/comment/facebook.js +2 -2
  71. package/lib/view/comment/gitalk.js +2 -2
  72. package/lib/view/comment/gitment.js +2 -2
  73. package/lib/view/comment/isso.js +2 -2
  74. package/lib/view/comment/livere.js +2 -2
  75. package/lib/view/comment/twikoo.js +113 -0
  76. package/lib/view/comment/utterances.js +3 -3
  77. package/lib/view/comment/valine.js +3 -3
  78. package/lib/view/comment/waline.js +49 -33
  79. package/lib/view/common/article_media.js +2 -2
  80. package/lib/view/donate/afdian.js +2 -2
  81. package/lib/view/donate/alipay.js +2 -2
  82. package/lib/view/donate/buymeacoffee.js +2 -2
  83. package/lib/view/donate/patreon.js +2 -2
  84. package/lib/view/donate/paypal.js +2 -2
  85. package/lib/view/donate/wechat.js +2 -2
  86. package/lib/view/misc/article_licensing.js +2 -2
  87. package/lib/view/misc/meta.js +2 -2
  88. package/lib/view/misc/open_graph.js +12 -4
  89. package/lib/view/misc/paginator.js +2 -2
  90. package/lib/view/misc/structured_data.js +2 -2
  91. package/lib/view/misc/web_app.js +2 -2
  92. package/lib/view/plugin/baidu_analytics.js +2 -2
  93. package/lib/view/plugin/bing_webmaster.js +2 -2
  94. package/lib/view/plugin/busuanzi.js +2 -2
  95. package/lib/view/plugin/cnzz.js +2 -2
  96. package/lib/view/plugin/cookie_consent.js +2 -2
  97. package/lib/view/plugin/gallery.js +2 -2
  98. package/lib/view/plugin/google_analytics.js +2 -2
  99. package/lib/view/plugin/hotjar.js +2 -2
  100. package/lib/view/plugin/katex.js +2 -2
  101. package/lib/view/plugin/mathjax.js +2 -2
  102. package/lib/view/plugin/outdated_browser.js +2 -2
  103. package/lib/view/plugin/progressbar.js +2 -2
  104. package/lib/view/plugin/statcounter.js +2 -2
  105. package/lib/view/plugin/twitter_conversion_tracking.js +2 -2
  106. package/lib/view/search/algolia.js +2 -2
  107. package/lib/view/search/baidu.js +2 -2
  108. package/lib/view/search/google_cse.js +2 -2
  109. package/lib/view/search/insight.js +2 -2
  110. package/lib/view/share/addthis.js +2 -2
  111. package/lib/view/share/addtoany.js +2 -2
  112. package/lib/view/share/bdshare.js +2 -2
  113. package/lib/view/share/sharejs.js +2 -2
  114. package/lib/view/share/sharethis.js +2 -2
  115. package/lib/view/widget/adsense.js +2 -2
  116. package/lib/view/widget/archives.js +2 -2
  117. package/lib/view/widget/categories.js +2 -2
  118. package/lib/view/widget/followit.js +2 -2
  119. package/lib/view/widget/links.js +2 -2
  120. package/lib/view/widget/recent_posts.js +2 -2
  121. package/lib/view/widget/subscribe_email.js +2 -2
  122. package/lib/view/widget/tags.js +16 -15
  123. package/lib/view/widget/toc.js +2 -2
  124. package/package.json +9 -12
@@ -43,11 +43,18 @@ module.exports = function (hexo) {
43
43
  }
44
44
 
45
45
  const site = {
46
- pages: locals.pages.map(mapPost),
47
46
  posts: locals.posts.map(mapPost),
48
47
  tags: locals.tags.map(mapTag),
49
48
  categories: locals.categories.map(mapTag)
50
49
  };
50
+ const index_pages = ((this.theme.config || {}).search || {}).index_pages;
51
+
52
+ if (index_pages === false) {
53
+ site.pages = [];
54
+ } else {
55
+ site.pages = locals.pages.map(mapPost);
56
+ }
57
+
51
58
  return {
52
59
  path: '/content.json',
53
60
  data: JSON.stringify(site)
@@ -79,4 +79,20 @@ test('Export assets file from asset folder', async () => {
79
79
  expect(data.tags.length).toBe(2);
80
80
  expect(data.tags.find(tag => tag.name === 'tag1' && tag.slug === 'tag1' && tag.link.includes('tag1'))).not.toBeUndefined();
81
81
  expect(data.tags.find(tag => tag.name === 'tag2' && tag.slug === 'tag2' && tag.link.includes('tag2'))).not.toBeUndefined();
82
+ });
83
+ test('Exclude pages from index when `index_pages` is false', async () => {
84
+ const locals = hexo.locals.toObject();
85
+ locals.config = hexo.config;
86
+ locals.posts = posts;
87
+ locals.pages = pages;
88
+ locals.categories = categories;
89
+ locals.tags = tags;
90
+ hexo.theme.config.search = {
91
+ index_pages: false
92
+ };
93
+ const generator = hexo.extend.generator.get('insight').bind(hexo);
94
+ const result = await generator(locals);
95
+ const data = JSON.parse(result.data);
96
+ expect(data.posts.length).toBe(2);
97
+ expect(data.pages.length).toBe(0);
82
98
  });
@@ -12,9 +12,7 @@ const PROVIDERS = {
12
12
  cdnjs: '[cdnjs]https://cdnjs.cloudflare.com/ajax/libs/${ package }/${ version }/${ filename }',
13
13
  loli: '[cdnjs]https://cdnjs.loli.net/ajax/libs/${ package }/${ version }/${ filename }',
14
14
  jsdelivr: 'https://cdn.jsdelivr.net/npm/${ package }@${ version }/${ filename }',
15
- unpkg: 'https://unpkg.com/${ package }@${ version }/${ filename }',
16
- bootcdn: '[cdnjs]https://cdn.bootcdn.net/ajax/libs/${ package }/${ version }/${ filename }',
17
- '75cdn': '[cdnjs]https://lib.baomitu.com/${ package }/${ version }/${ filename }'
15
+ unpkg: 'https://unpkg.com/${ package }@${ version }/${ filename }'
18
16
  },
19
17
  FONT: {
20
18
  google: 'https://fonts.googleapis.com/${ type }?family=${ fontname }',
@@ -23,10 +21,8 @@ const PROVIDERS = {
23
21
  ustc: 'https://fonts.lug.ustc.edu.cn/${ type }?family=${ fontname }'
24
22
  },
25
23
  ICON: {
26
- loli: 'https://cdnjs.loli.net/ajax/libs/font-awesome/5.15.2/css/all.min.css',
27
- fontawesome: 'https://use.fontawesome.com/releases/v5.15.2/css/all.css',
28
- bootcdn: 'https://cdn.bootcdn.net/ajax/libs/font-awesome/5.15.3/css/all.min.css',
29
- '75cdn': 'https://lib.baomitu.com/font-awesome/5.12.1/css/all.min.css'
24
+ loli: 'https://cdnjs.loli.net/ajax/libs/font-awesome/6.0.0/css/all.min.css',
25
+ fontawesome: 'https://use.fontawesome.com/releases/v6.0.0/css/all.css'
30
26
  }
31
27
  };
32
28
  /**
@@ -45,8 +41,6 @@ const CDNJS_FIXTURES = {
45
41
  katex: (ver, fname) => ['KaTeX', ver, fname],
46
42
  'pace-js': (ver, fname) => ['pace', ver, fname],
47
43
  clipboard: (ver, fname) => ['clipboard.js', ver, fname],
48
- // disqusjs is not hosted on CDN.js
49
- disqusjs: (ver, fname) => [],
50
44
  cookieconsent: (ver, fname) => ['cookieconsent', ver, fname.startsWith('build/') ? fname.substr(6) : fname],
51
45
  '@waline/client': (ver, fname) => ['waline', ver, fname]
52
46
  };
@@ -17,59 +17,45 @@ describe('Get JavaScript library URL', () => {
17
17
  let cases;
18
18
  beforeEach(async () => {
19
19
  const cdn = hexo.extend.helper.get('cdn').bind(hexo);
20
- cases = [() => cdn('jquery', '3.0.0', 'dist/jquery.min.js'), () => cdn('moment', '2.24.0', 'min/moment.min.js'), () => cdn('outdatedbrowser', '1.1.5', 'outdatedbrowser/outdatedbrowser.min.js'), () => cdn('highlight.js', '9.18.1', 'styles/a11y-dark.css'), () => cdn('mathjax', '2.7.6', 'unpacked/MathJax.min.js'), () => cdn('pace-js', '1.0.2', 'pace.min.js'), () => cdn('katex', '0.11.1', 'dist/katex.min.js'), () => cdn('clipboard', '2.0.6', 'dist/clipboard.min.js'), () => cdn('disqusjs', '1.2.6', 'dist/disqus.min.js'), () => cdn('algoliasearch', '4.0.3', 'dist/algoliasearch-lite.umd.js'), () => cdn('instantsearch.js', '4.3.1', 'dist/instantsearch.production.min.js'), () => cdn('cookieconsent', '3.1.1', 'build/cookieconsent.min.js'), () => cdn('@waline/client', '1.5.4', 'dist/Waline.min.js'), () => cdn('example', '1.0.0', 'example.js')];
20
+ cases = [() => cdn('jquery', '3.0.0', 'dist/jquery.min.js'), () => cdn('moment', '2.24.0', 'min/moment.min.js'), () => cdn('outdatedbrowser', '1.1.5', 'outdatedbrowser/outdatedbrowser.min.js'), () => cdn('highlight.js', '9.18.1', 'styles/a11y-dark.css'), () => cdn('mathjax', '2.7.6', 'unpacked/MathJax.min.js'), () => cdn('pace-js', '1.0.2', 'pace.min.js'), () => cdn('katex', '0.11.1', 'dist/katex.min.js'), () => cdn('clipboard', '2.0.6', 'dist/clipboard.min.js'), () => cdn('disqusjs', '1.3.0', 'dist/disqus.min.js'), () => cdn('algoliasearch', '4.0.3', 'dist/algoliasearch-lite.umd.js'), () => cdn('instantsearch.js', '4.3.1', 'dist/instantsearch.production.min.js'), () => cdn('cookieconsent', '3.1.1', 'build/cookieconsent.min.js'), () => cdn('@waline/client', '2.6.3', 'dist/waline.js'), () => cdn('twikoo', '1.6.6', 'dist/twikoo.all.min.js'), () => cdn('example', '1.0.0', 'example.js')];
21
21
  });
22
22
  test('jsdelivr', () => {
23
- const expected = ['https://cdn.jsdelivr.net/npm/jquery@3.0.0/dist/jquery.min.js', 'https://cdn.jsdelivr.net/npm/moment@2.24.0/min/moment.min.js', 'https://cdn.jsdelivr.net/npm/outdatedbrowser@1.1.5/outdatedbrowser/outdatedbrowser.min.js', 'https://cdn.jsdelivr.net/npm/highlight.js@9.18.1/styles/a11y-dark.css', 'https://cdn.jsdelivr.net/npm/mathjax@2.7.6/unpacked/MathJax.min.js', 'https://cdn.jsdelivr.net/npm/pace-js@1.0.2/pace.min.js', 'https://cdn.jsdelivr.net/npm/katex@0.11.1/dist/katex.min.js', 'https://cdn.jsdelivr.net/npm/clipboard@2.0.6/dist/clipboard.min.js', 'https://cdn.jsdelivr.net/npm/disqusjs@1.2.6/dist/disqus.min.js', 'https://cdn.jsdelivr.net/npm/algoliasearch@4.0.3/dist/algoliasearch-lite.umd.js', 'https://cdn.jsdelivr.net/npm/instantsearch.js@4.3.1/dist/instantsearch.production.min.js', 'https://cdn.jsdelivr.net/npm/cookieconsent@3.1.1/build/cookieconsent.min.js', 'https://cdn.jsdelivr.net/npm/@waline/client@1.5.4/dist/Waline.min.js', 'https://cdn.jsdelivr.net/npm/example@1.0.0/example.js'];
23
+ const expected = ['https://cdn.jsdelivr.net/npm/jquery@3.0.0/dist/jquery.min.js', 'https://cdn.jsdelivr.net/npm/moment@2.24.0/min/moment.min.js', 'https://cdn.jsdelivr.net/npm/outdatedbrowser@1.1.5/outdatedbrowser/outdatedbrowser.min.js', 'https://cdn.jsdelivr.net/npm/highlight.js@9.18.1/styles/a11y-dark.css', 'https://cdn.jsdelivr.net/npm/mathjax@2.7.6/unpacked/MathJax.min.js', 'https://cdn.jsdelivr.net/npm/pace-js@1.0.2/pace.min.js', 'https://cdn.jsdelivr.net/npm/katex@0.11.1/dist/katex.min.js', 'https://cdn.jsdelivr.net/npm/clipboard@2.0.6/dist/clipboard.min.js', 'https://cdn.jsdelivr.net/npm/disqusjs@1.3.0/dist/disqus.min.js', 'https://cdn.jsdelivr.net/npm/algoliasearch@4.0.3/dist/algoliasearch-lite.umd.js', 'https://cdn.jsdelivr.net/npm/instantsearch.js@4.3.1/dist/instantsearch.production.min.js', 'https://cdn.jsdelivr.net/npm/cookieconsent@3.1.1/build/cookieconsent.min.js', 'https://cdn.jsdelivr.net/npm/@waline/client@2.6.3/dist/waline.js', 'https://cdn.jsdelivr.net/npm/twikoo@1.6.6/dist/twikoo.all.min.js', 'https://cdn.jsdelivr.net/npm/example@1.0.0/example.js'];
24
24
  cases.forEach((func, i) => expect(func()).toBe(expected[i]));
25
25
  });
26
26
  test('unpkg', () => {
27
27
  hexo.config.providers = {
28
28
  cdn: 'unpkg'
29
29
  };
30
- const expected = ['https://unpkg.com/jquery@3.0.0/dist/jquery.min.js', 'https://unpkg.com/moment@2.24.0/min/moment.min.js', 'https://unpkg.com/outdatedbrowser@1.1.5/outdatedbrowser/outdatedbrowser.min.js', 'https://unpkg.com/highlight.js@9.18.1/styles/a11y-dark.css', 'https://unpkg.com/mathjax@2.7.6/unpacked/MathJax.js', 'https://unpkg.com/pace-js@1.0.2/pace.min.js', 'https://unpkg.com/katex@0.11.1/dist/katex.min.js', 'https://unpkg.com/clipboard@2.0.6/dist/clipboard.min.js', 'https://unpkg.com/disqusjs@1.2.6/dist/disqus.js', 'https://unpkg.com/algoliasearch@4.0.3/dist/algoliasearch-lite.umd.js', 'https://unpkg.com/instantsearch.js@4.3.1/dist/instantsearch.production.min.js', 'https://unpkg.com/cookieconsent@3.1.1/build/cookieconsent.min.js', 'https://unpkg.com/@waline/client@1.5.4/dist/Waline.min.js', 'https://unpkg.com/example@1.0.0/example.js'];
30
+ const expected = ['https://unpkg.com/jquery@3.0.0/dist/jquery.min.js', 'https://unpkg.com/moment@2.24.0/min/moment.min.js', 'https://unpkg.com/outdatedbrowser@1.1.5/outdatedbrowser/outdatedbrowser.min.js', 'https://unpkg.com/highlight.js@9.18.1/styles/a11y-dark.css', 'https://unpkg.com/mathjax@2.7.6/unpacked/MathJax.js', 'https://unpkg.com/pace-js@1.0.2/pace.min.js', 'https://unpkg.com/katex@0.11.1/dist/katex.min.js', 'https://unpkg.com/clipboard@2.0.6/dist/clipboard.min.js', 'https://unpkg.com/disqusjs@1.3.0/dist/disqus.js', 'https://unpkg.com/algoliasearch@4.0.3/dist/algoliasearch-lite.umd.js', 'https://unpkg.com/instantsearch.js@4.3.1/dist/instantsearch.production.min.js', 'https://unpkg.com/cookieconsent@3.1.1/build/cookieconsent.min.js', 'https://unpkg.com/@waline/client@2.6.3/dist/waline.js', 'https://unpkg.com/twikoo@1.6.6/dist/twikoo.all.min.js', 'https://unpkg.com/example@1.0.0/example.js'];
31
31
  cases.forEach((func, i) => expect(func()).toBe(expected[i]));
32
32
  });
33
33
  test('cdnjs', () => {
34
34
  hexo.config.providers = {
35
35
  cdn: 'cdnjs'
36
36
  };
37
- const expected = ['https://cdnjs.cloudflare.com/ajax/libs/jquery/3.0.0/jquery.min.js', 'https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js', 'https://cdnjs.cloudflare.com/ajax/libs/outdated-browser/1.1.5/outdatedbrowser.min.js', 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.18.1/styles/a11y-dark.min.css', 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.6/MathJax.js', 'https://cdnjs.cloudflare.com/ajax/libs/pace/1.0.2/pace.min.js', 'https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.11.1/katex.min.js', 'https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.6/clipboard.min.js', 'https://cdn.jsdelivr.net/npm/disqusjs@1.2.6/dist/disqus.min.js', 'https://cdnjs.cloudflare.com/ajax/libs/algoliasearch/4.0.3/algoliasearch-lite.umd.js', 'https://cdnjs.cloudflare.com/ajax/libs/instantsearch.js/4.3.1/instantsearch.production.min.js', 'https://cdnjs.cloudflare.com/ajax/libs/cookieconsent/3.1.1/cookieconsent.min.js', 'https://cdnjs.cloudflare.com/ajax/libs/waline/1.5.4/Waline.min.js', 'https://cdnjs.cloudflare.com/ajax/libs/example/1.0.0/example.js'];
37
+ const expected = ['https://cdnjs.cloudflare.com/ajax/libs/jquery/3.0.0/jquery.min.js', 'https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js', 'https://cdnjs.cloudflare.com/ajax/libs/outdated-browser/1.1.5/outdatedbrowser.min.js', 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.18.1/styles/a11y-dark.min.css', 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.6/MathJax.js', 'https://cdnjs.cloudflare.com/ajax/libs/pace/1.0.2/pace.min.js', 'https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.11.1/katex.min.js', 'https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.6/clipboard.min.js', 'https://cdnjs.cloudflare.com/ajax/libs/disqusjs/1.3.0/disqus.min.js', 'https://cdnjs.cloudflare.com/ajax/libs/algoliasearch/4.0.3/algoliasearch-lite.umd.js', 'https://cdnjs.cloudflare.com/ajax/libs/instantsearch.js/4.3.1/instantsearch.production.min.js', 'https://cdnjs.cloudflare.com/ajax/libs/cookieconsent/3.1.1/cookieconsent.min.js', 'https://cdnjs.cloudflare.com/ajax/libs/waline/2.6.3/waline.js', 'https://cdnjs.cloudflare.com/ajax/libs/twikoo/1.6.6/twikoo.all.min.js', 'https://cdnjs.cloudflare.com/ajax/libs/example/1.0.0/example.js'];
38
38
  cases.forEach((func, i) => expect(func()).toBe(expected[i]));
39
39
  });
40
40
  test('loli', () => {
41
41
  hexo.config.providers = {
42
42
  cdn: 'loli'
43
43
  };
44
- const expected = ['https://cdnjs.loli.net/ajax/libs/jquery/3.0.0/jquery.min.js', 'https://cdnjs.loli.net/ajax/libs/moment.js/2.24.0/moment.min.js', 'https://cdnjs.loli.net/ajax/libs/outdated-browser/1.1.5/outdatedbrowser.min.js', 'https://cdnjs.loli.net/ajax/libs/highlight.js/9.18.1/styles/a11y-dark.min.css', 'https://cdnjs.loli.net/ajax/libs/mathjax/2.7.6/MathJax.js', 'https://cdnjs.loli.net/ajax/libs/pace/1.0.2/pace.min.js', 'https://cdnjs.loli.net/ajax/libs/KaTeX/0.11.1/katex.min.js', 'https://cdnjs.loli.net/ajax/libs/clipboard.js/2.0.6/clipboard.min.js', 'https://cdn.jsdelivr.net/npm/disqusjs@1.2.6/dist/disqus.min.js', 'https://cdnjs.loli.net/ajax/libs/algoliasearch/4.0.3/algoliasearch-lite.umd.js', 'https://cdnjs.loli.net/ajax/libs/instantsearch.js/4.3.1/instantsearch.production.min.js', 'https://cdnjs.loli.net/ajax/libs/cookieconsent/3.1.1/cookieconsent.min.js', 'https://cdnjs.loli.net/ajax/libs/waline/1.5.4/Waline.min.js', 'https://cdnjs.loli.net/ajax/libs/example/1.0.0/example.js'];
45
- cases.forEach((func, i) => expect(func()).toBe(expected[i]));
46
- });
47
- test('bootcdn', () => {
48
- hexo.config.providers = {
49
- cdn: 'bootcdn'
50
- };
51
- const expected = ['https://cdn.bootcdn.net/ajax/libs/jquery/3.0.0/jquery.min.js', 'https://cdn.bootcdn.net/ajax/libs/moment.js/2.24.0/moment.min.js', 'https://cdn.bootcdn.net/ajax/libs/outdated-browser/1.1.5/outdatedbrowser.min.js', 'https://cdn.bootcdn.net/ajax/libs/highlight.js/9.18.1/styles/a11y-dark.min.css', 'https://cdn.bootcdn.net/ajax/libs/mathjax/2.7.6/MathJax.js', 'https://cdn.bootcdn.net/ajax/libs/pace/1.0.2/pace.min.js', 'https://cdn.bootcdn.net/ajax/libs/KaTeX/0.11.1/katex.min.js', 'https://cdn.bootcdn.net/ajax/libs/clipboard.js/2.0.6/clipboard.min.js', 'https://cdn.jsdelivr.net/npm/disqusjs@1.2.6/dist/disqus.min.js', 'https://cdn.bootcdn.net/ajax/libs/algoliasearch/4.0.3/algoliasearch-lite.umd.js', 'https://cdn.bootcdn.net/ajax/libs/instantsearch.js/4.3.1/instantsearch.production.min.js', 'https://cdn.bootcdn.net/ajax/libs/cookieconsent/3.1.1/cookieconsent.min.js', 'https://cdn.bootcdn.net/ajax/libs/waline/1.5.4/Waline.min.js', 'https://cdn.bootcdn.net/ajax/libs/example/1.0.0/example.js'];
52
- cases.forEach((func, i) => expect(func()).toBe(expected[i]));
53
- });
54
- test('75cdn', () => {
55
- hexo.config.providers = {
56
- cdn: '75cdn'
57
- };
58
- const expected = ['https://lib.baomitu.com/jquery/3.0.0/jquery.min.js', 'https://lib.baomitu.com/moment.js/2.24.0/moment.min.js', 'https://lib.baomitu.com/outdated-browser/1.1.5/outdatedbrowser.min.js', 'https://lib.baomitu.com/highlight.js/9.18.1/styles/a11y-dark.min.css', 'https://lib.baomitu.com/mathjax/2.7.6/MathJax.js', 'https://lib.baomitu.com/pace/1.0.2/pace.min.js', 'https://lib.baomitu.com/KaTeX/0.11.1/katex.min.js', 'https://lib.baomitu.com/clipboard.js/2.0.6/clipboard.min.js', 'https://cdn.jsdelivr.net/npm/disqusjs@1.2.6/dist/disqus.min.js', 'https://lib.baomitu.com/algoliasearch/4.0.3/algoliasearch-lite.umd.js', 'https://lib.baomitu.com/instantsearch.js/4.3.1/instantsearch.production.min.js', 'https://lib.baomitu.com/cookieconsent/3.1.1/cookieconsent.min.js', 'https://lib.baomitu.com/waline/1.5.4/Waline.min.js', 'https://lib.baomitu.com/example/1.0.0/example.js'];
44
+ const expected = ['https://cdnjs.loli.net/ajax/libs/jquery/3.0.0/jquery.min.js', 'https://cdnjs.loli.net/ajax/libs/moment.js/2.24.0/moment.min.js', 'https://cdnjs.loli.net/ajax/libs/outdated-browser/1.1.5/outdatedbrowser.min.js', 'https://cdnjs.loli.net/ajax/libs/highlight.js/9.18.1/styles/a11y-dark.min.css', 'https://cdnjs.loli.net/ajax/libs/mathjax/2.7.6/MathJax.js', 'https://cdnjs.loli.net/ajax/libs/pace/1.0.2/pace.min.js', 'https://cdnjs.loli.net/ajax/libs/KaTeX/0.11.1/katex.min.js', 'https://cdnjs.loli.net/ajax/libs/clipboard.js/2.0.6/clipboard.min.js', 'https://cdnjs.loli.net/ajax/libs/disqusjs/1.3.0/disqus.min.js', 'https://cdnjs.loli.net/ajax/libs/algoliasearch/4.0.3/algoliasearch-lite.umd.js', 'https://cdnjs.loli.net/ajax/libs/instantsearch.js/4.3.1/instantsearch.production.min.js', 'https://cdnjs.loli.net/ajax/libs/cookieconsent/3.1.1/cookieconsent.min.js', 'https://cdnjs.loli.net/ajax/libs/waline/2.6.3/waline.js', 'https://cdnjs.loli.net/ajax/libs/twikoo/1.6.6/twikoo.all.min.js', 'https://cdnjs.loli.net/ajax/libs/example/1.0.0/example.js'];
59
45
  cases.forEach((func, i) => expect(func()).toBe(expected[i]));
60
46
  });
61
47
  test('Custom CDN', () => {
62
48
  hexo.config.providers = {
63
49
  cdn: 'https://my.cdn/${ package }@${ version }/${ filename }'
64
50
  };
65
- const expected = ['https://my.cdn/jquery@3.0.0/dist/jquery.min.js', 'https://my.cdn/moment@2.24.0/min/moment.min.js', 'https://my.cdn/outdatedbrowser@1.1.5/outdatedbrowser/outdatedbrowser.min.js', 'https://my.cdn/highlight.js@9.18.1/styles/a11y-dark.css', 'https://my.cdn/mathjax@2.7.6/unpacked/MathJax.min.js', 'https://my.cdn/pace-js@1.0.2/pace.min.js', 'https://my.cdn/katex@0.11.1/dist/katex.min.js', 'https://my.cdn/clipboard@2.0.6/dist/clipboard.min.js', 'https://my.cdn/disqusjs@1.2.6/dist/disqus.min.js', 'https://my.cdn/algoliasearch@4.0.3/dist/algoliasearch-lite.umd.js', 'https://my.cdn/instantsearch.js@4.3.1/dist/instantsearch.production.min.js', 'https://my.cdn/cookieconsent@3.1.1/build/cookieconsent.min.js', 'https://my.cdn/@waline/client@1.5.4/dist/Waline.min.js', 'https://my.cdn/example@1.0.0/example.js'];
51
+ const expected = ['https://my.cdn/jquery@3.0.0/dist/jquery.min.js', 'https://my.cdn/moment@2.24.0/min/moment.min.js', 'https://my.cdn/outdatedbrowser@1.1.5/outdatedbrowser/outdatedbrowser.min.js', 'https://my.cdn/highlight.js@9.18.1/styles/a11y-dark.css', 'https://my.cdn/mathjax@2.7.6/unpacked/MathJax.min.js', 'https://my.cdn/pace-js@1.0.2/pace.min.js', 'https://my.cdn/katex@0.11.1/dist/katex.min.js', 'https://my.cdn/clipboard@2.0.6/dist/clipboard.min.js', 'https://my.cdn/disqusjs@1.3.0/dist/disqus.min.js', 'https://my.cdn/algoliasearch@4.0.3/dist/algoliasearch-lite.umd.js', 'https://my.cdn/instantsearch.js@4.3.1/dist/instantsearch.production.min.js', 'https://my.cdn/cookieconsent@3.1.1/build/cookieconsent.min.js', 'https://my.cdn/@waline/client@2.6.3/dist/waline.js', 'https://my.cdn/twikoo@1.6.6/dist/twikoo.all.min.js', 'https://my.cdn/example@1.0.0/example.js'];
66
52
  cases.forEach((func, i) => expect(func()).toBe(expected[i]));
67
53
  });
68
54
  test('Custom CDN.js-style CDN', () => {
69
55
  hexo.config.providers = {
70
56
  cdn: '[cdnjs]https://my.cdn/ajax/libs/${ package }/${ version }/${ filename }'
71
57
  };
72
- const expected = ['https://my.cdn/ajax/libs/jquery/3.0.0/jquery.min.js', 'https://my.cdn/ajax/libs/moment.js/2.24.0/moment.min.js', 'https://my.cdn/ajax/libs/outdated-browser/1.1.5/outdatedbrowser.min.js', 'https://my.cdn/ajax/libs/highlight.js/9.18.1/styles/a11y-dark.min.css', 'https://my.cdn/ajax/libs/mathjax/2.7.6/MathJax.js', 'https://my.cdn/ajax/libs/pace/1.0.2/pace.min.js', 'https://my.cdn/ajax/libs/KaTeX/0.11.1/katex.min.js', 'https://my.cdn/ajax/libs/clipboard.js/2.0.6/clipboard.min.js', 'https://cdn.jsdelivr.net/npm/disqusjs@1.2.6/dist/disqus.min.js', 'https://my.cdn/ajax/libs/algoliasearch/4.0.3/algoliasearch-lite.umd.js', 'https://my.cdn/ajax/libs/instantsearch.js/4.3.1/instantsearch.production.min.js', 'https://my.cdn/ajax/libs/cookieconsent/3.1.1/cookieconsent.min.js', 'https://my.cdn/ajax/libs/waline/1.5.4/Waline.min.js', 'https://my.cdn/ajax/libs/example/1.0.0/example.js'];
58
+ const expected = ['https://my.cdn/ajax/libs/jquery/3.0.0/jquery.min.js', 'https://my.cdn/ajax/libs/moment.js/2.24.0/moment.min.js', 'https://my.cdn/ajax/libs/outdated-browser/1.1.5/outdatedbrowser.min.js', 'https://my.cdn/ajax/libs/highlight.js/9.18.1/styles/a11y-dark.min.css', 'https://my.cdn/ajax/libs/mathjax/2.7.6/MathJax.js', 'https://my.cdn/ajax/libs/pace/1.0.2/pace.min.js', 'https://my.cdn/ajax/libs/KaTeX/0.11.1/katex.min.js', 'https://my.cdn/ajax/libs/clipboard.js/2.0.6/clipboard.min.js', 'https://my.cdn/ajax/libs/disqusjs/1.3.0/disqus.min.js', 'https://my.cdn/ajax/libs/algoliasearch/4.0.3/algoliasearch-lite.umd.js', 'https://my.cdn/ajax/libs/instantsearch.js/4.3.1/instantsearch.production.min.js', 'https://my.cdn/ajax/libs/cookieconsent/3.1.1/cookieconsent.min.js', 'https://my.cdn/ajax/libs/waline/2.6.3/waline.js', 'https://my.cdn/ajax/libs/twikoo/1.6.6/twikoo.all.min.js', 'https://my.cdn/ajax/libs/example/1.0.0/example.js'];
73
59
  cases.forEach((func, i) => expect(func()).toBe(expected[i]));
74
60
  });
75
61
  });
@@ -125,28 +111,14 @@ describe('Get icon font URL', () => {
125
111
  hexo.config.providers = {
126
112
  iconcdn: 'fontawesome'
127
113
  };
128
- const expected = ['https://use.fontawesome.com/releases/v5.15.2/css/all.css'];
114
+ const expected = ['https://use.fontawesome.com/releases/v6.0.0/css/all.css'];
129
115
  cases.forEach((func, i) => expect(func()).toBe(expected[i]));
130
116
  });
131
117
  test('loli', () => {
132
118
  hexo.config.providers = {
133
119
  iconcdn: 'loli'
134
120
  };
135
- const expected = ['https://cdnjs.loli.net/ajax/libs/font-awesome/5.15.2/css/all.min.css'];
136
- cases.forEach((func, i) => expect(func()).toBe(expected[i]));
137
- });
138
- test('bootcdn', () => {
139
- hexo.config.providers = {
140
- iconcdn: 'bootcdn'
141
- };
142
- const expected = ['https://cdn.bootcdn.net/ajax/libs/font-awesome/5.15.3/css/all.min.css'];
143
- cases.forEach((func, i) => expect(func()).toBe(expected[i]));
144
- });
145
- test('75cdn', () => {
146
- hexo.config.providers = {
147
- iconcdn: '75cdn'
148
- };
149
- const expected = ['https://lib.baomitu.com/font-awesome/5.12.1/css/all.min.css'];
121
+ const expected = ['https://cdnjs.loli.net/ajax/libs/font-awesome/6.0.0/css/all.min.css'];
150
122
  cases.forEach((func, i) => expect(func()).toBe(expected[i]));
151
123
  });
152
124
  test('Custom web font CDN', () => {
@@ -6,6 +6,10 @@ const Hexo = require('hexo');
6
6
 
7
7
  const cheerio = require('cheerio');
8
8
 
9
+ const {
10
+ minify
11
+ } = require('html-minifier');
12
+
9
13
  const register = require('./message');
10
14
 
11
15
  const rootDir = join(__dirname, '../../../fixture/site');
@@ -17,20 +21,25 @@ const cheerioOptions = {
17
21
  normalizeWhitespace: true
18
22
  }
19
23
  };
24
+ const minifierOptions = {
25
+ collapseWhitespace: true,
26
+ conservativeCollapse: true,
27
+ keepClosingSlash: true
28
+ };
20
29
  beforeAll(async () => {
21
30
  await hexo.init();
22
31
  await hexo.load();
23
32
  register(hexo);
24
- await hexo.loadPlugin(require.resolve('hexo-renderer-markdown'));
33
+ await hexo.loadPlugin(require.resolve('hexo-renderer-marked'));
25
34
  });
26
35
  test('create default message', async () => {
27
36
  const render = hexo.extend.tag.render.bind(hexo.extend.tag);
28
37
  let source = '{% message %}**content**{% endmessage %}';
29
38
  let actual = cheerio.load(await render(source), cheerioOptions, false).html();
30
- expect(actual).toEqual('<article class="message"> <div class="message-body"> ' + '<p><strong>content</strong></p> </div> </article>');
39
+ expect(minify(actual, minifierOptions)).toEqual('<article class="message"> <div class="message-body"> ' + '<p><strong>content</strong></p> </div> </article>');
31
40
  source = '{% message %}\n# title\n{% endmessage %}';
32
41
  actual = cheerio.load(await render(source), cheerioOptions, false).html();
33
- expect(actual).toEqual('<article class="message"> <div class="message-body"> ' + '<h1 id="title"><a class="header-anchor" href="#title">&#xB6;</a> title</h1> ' + '</div> </article>');
42
+ expect(minify(actual, minifierOptions)).toEqual('<article class="message"> <div class="message-body"> ' + '<h1 id="title"><a href="#title" class="headerlink" title="title"/>title</h1> ' + '</div> </article>');
34
43
  });
35
44
  test('create message with different colors', async () => {
36
45
  const render = hexo.extend.tag.render.bind(hexo.extend.tag);
@@ -38,7 +47,7 @@ test('create message with different colors', async () => {
38
47
  for (const color of ['dark', 'primary', 'link', 'info', 'success', 'warning', 'danger']) {
39
48
  const source = `{% message color:${color} %}content{% endmessage %}`;
40
49
  const actual = cheerio.load(await render(source), cheerioOptions, false).html();
41
- expect(actual).toEqual(`<article class="message is-${color}"> <div class="message-body"> <p>content</p> ` + '</div> </article>');
50
+ expect(minify(actual, minifierOptions)).toEqual(`<article class="message is-${color}"> <div class="message-body"> <p>content</p> ` + '</div> </article>');
42
51
  }
43
52
  });
44
53
  test('create message with different sizes', async () => {
@@ -47,24 +56,24 @@ test('create message with different sizes', async () => {
47
56
  for (const size of ['small', 'medium', 'large']) {
48
57
  const source = `{% message size:${size} %}content{% endmessage %}`;
49
58
  const actual = cheerio.load(await render(source), cheerioOptions, false).html();
50
- expect(actual).toEqual(`<article class="message is-${size}"> <div class="message-body"> <p>content</p> ` + '</div> </article>');
59
+ expect(minify(actual, minifierOptions)).toEqual(`<article class="message is-${size}"> <div class="message-body"> <p>content</p> ` + '</div> </article>');
51
60
  }
52
61
  });
53
62
  test('create message with an icon', async () => {
54
63
  const render = hexo.extend.tag.render.bind(hexo.extend.tag);
55
64
  const source = '{% message "icon:fas fas-file" %}content{% endmessage %}';
56
65
  const actual = cheerio.load(await render(source), cheerioOptions, false).html();
57
- expect(actual).toEqual('<article class="message"> <div class="message-header"><p>' + '<i class="fas fas-file mr-2"/></p> </div> <div class="message-body"> <p>content</p> ' + '</div> </article>');
66
+ expect(minify(actual, minifierOptions)).toEqual('<article class="message"> <div class="message-header"><p>' + '<i class="fas fas-file mr-2"/></p> </div> <div class="message-body"> <p>content</p> ' + '</div> </article>');
58
67
  });
59
68
  test('create message with a title', async () => {
60
69
  const render = hexo.extend.tag.render.bind(hexo.extend.tag);
61
70
  const source = '{% message "title:*message title*" %}content{% endmessage %}';
62
71
  const actual = cheerio.load(await render(source), cheerioOptions, false).html();
63
- expect(actual).toEqual('<article class="message"> <div class="message-header"><p>' + '<em>message title</em></p> </div> <div class="message-body"> <p>content</p> ' + '</div> </article>');
72
+ expect(minify(actual, minifierOptions)).toEqual('<article class="message"> <div class="message-header"><p>' + '<em>message title</em></p> </div> <div class="message-body"> <p>content</p> ' + '</div> </article>');
64
73
  });
65
74
  test('create message with all properties', async () => {
66
75
  const render = hexo.extend.tag.render.bind(hexo.extend.tag);
67
76
  const source = '{% message color:success size:small "icon:fas fas-file" ' + '"title:*message title*" %}content{% endmessage %}';
68
77
  const actual = cheerio.load(await render(source), cheerioOptions, false).html();
69
- expect(actual).toEqual('<article class="message is-success is-small"> <div class="message-header"><p>' + '<i class="fas fas-file mr-2"/><em>message title</em></p> </div> ' + '<div class="message-body"> <p>content</p> </div> </article>');
78
+ expect(minify(actual, minifierOptions)).toEqual('<article class="message is-success is-small"> <div class="message-header"><p>' + '<i class="fas fas-file mr-2"/><em>message title</em></p> </div> ' + '<div class="message-body"> <p>content</p> </div> </article>');
70
79
  });
@@ -73,7 +73,7 @@
73
73
  * This is hello.
74
74
  * <!-- endtab -->
75
75
  * <!-- tab id:tab_info 'icon:fas fa-info' 'title:Info Tab' -->This is info.<!-- endtab -->
76
- * {% endmessage %}
76
+ * {% endtabs %}
77
77
  */
78
78
  module.exports = function (hexo) {
79
79
  function splitTabOptions(s) {
@@ -260,24 +260,25 @@ module.exports = function (hexo) {
260
260
  if (!location.hash) {
261
261
  return;
262
262
  }
263
- Array
264
- .from(document.querySelectorAll('.tab-content'))
265
- .forEach($tab => {
266
- $tab.classList.add('is-hidden');
267
- });
268
- Array
269
- .from(document.querySelectorAll('.tabs li'))
270
- .forEach($tab => {
271
- $tab.classList.remove('is-active');
272
- });
273
- const $activeTab = document.querySelector(location.hash);
274
- if ($activeTab) {
275
- $activeTab.classList.remove('is-hidden');
276
- }
263
+
277
264
  const $tabMenu = document.querySelector(\`a[href="\${location.hash}"]\`);
265
+ if (!$tabMenu) {
266
+ return;
267
+ }
268
+
269
+ const $tabMenuContainer = $tabMenu.parentElement.parentElement;
270
+ Array.from($tabMenuContainer.children).forEach($menu => $menu.classList.remove('is-active'));
271
+ Array.from($tabMenuContainer.querySelectorAll('a'))
272
+ .map($menu => document.getElementById($menu.getAttribute("href").substring(1)))
273
+ .forEach($content => $content.classList.add('is-hidden'));
274
+
278
275
  if ($tabMenu) {
279
276
  $tabMenu.parentElement.classList.add('is-active');
280
277
  }
278
+ const $activeTab = document.querySelector(location.hash);
279
+ if ($activeTab) {
280
+ $activeTab.classList.remove('is-hidden');
281
+ }
281
282
  }
282
283
  switchTab();
283
284
  window.addEventListener('hashchange', switchTab, false);
@@ -4,6 +4,10 @@ const {
4
4
 
5
5
  const Hexo = require('hexo');
6
6
 
7
+ const {
8
+ minify
9
+ } = require('html-minifier');
10
+
7
11
  const cheerio = require('cheerio');
8
12
 
9
13
  const register = require('./tabs');
@@ -17,17 +21,22 @@ const cheerioOptions = {
17
21
  normalizeWhitespace: true
18
22
  }
19
23
  };
24
+ const minifierOptions = {
25
+ collapseWhitespace: true,
26
+ conservativeCollapse: true,
27
+ keepClosingSlash: true
28
+ };
20
29
  beforeAll(async () => {
21
30
  await hexo.init();
22
31
  await hexo.load();
23
32
  register(hexo);
24
- await hexo.loadPlugin(require.resolve('hexo-renderer-markdown'));
33
+ await hexo.loadPlugin(require.resolve('hexo-renderer-marked'));
25
34
  });
26
35
  test('create default tabs', async () => {
27
36
  const render = hexo.extend.tag.render.bind(hexo.extend.tag);
28
37
  let source = '{% tabs %}<!--tab id:tab1-->**content**<!--endtab-->{% endtabs %}';
29
38
  let actual = cheerio.load(await render(source), cheerioOptions, false).html();
30
- expect(actual).toEqual('<div class="tabs my-3"> <ul class="mx-0 my-0"> <li> <a href="#tab1"> </a> </li> </ul> ' + '</div> <div id="tab1" class="tab-content is-hidden"> <p><strong>content</strong></p> </div>');
39
+ expect(minify(actual, minifierOptions)).toEqual('<div class="tabs my-3"> <ul class="mx-0 my-0"> <li> <a href="#tab1"> </a> </li> </ul> ' + '</div> <div id="tab1" class="tab-content is-hidden"> <p><strong>content</strong></p> </div>');
31
40
  source = `{% tabs %}
32
41
  <!-- tab --># title 1<!-- endtab -->
33
42
  <!-- tab --># title 2<!-- endtab -->
@@ -35,7 +44,7 @@ test('create default tabs', async () => {
35
44
  const $ = cheerio.load(await render(source), cheerioOptions, false);
36
45
  const [tabId1, tabId2] = $('.tab-content').get().map(element => $(element).attr('id'));
37
46
  actual = $.html();
38
- expect(actual).toEqual(`<div class="tabs my-3"> <ul class="mx-0 my-0"> <li> <a href="#${tabId1}"> </a> ` + `</li><li> <a href="#${tabId2}"> </a> </li> </ul> </div> ` + `<div id="${tabId1}" class="tab-content is-hidden"> <h1 id="title 1">` + '<a class="header-anchor" href="#title 1">&#xB6;</a> title 1</h1> </div>' + `<div id="${tabId2}" class="tab-content is-hidden"> <h1 id="title 2">` + '<a class="header-anchor" href="#title 2">&#xB6;</a> title 2</h1> </div>');
47
+ expect(minify(actual, minifierOptions)).toEqual(`<div class="tabs my-3"> <ul class="mx-0 my-0"> <li> <a href="#${tabId1}"> </a> ` + `</li><li> <a href="#${tabId2}"> </a> </li> </ul> </div> ` + `<div id="${tabId1}" class="tab-content is-hidden"> <h1 id="title-1">` + '<a href="#title-1" class="headerlink" title="title 1"/>title 1</h1> </div>' + `<div id="${tabId2}" class="tab-content is-hidden"> <h1 id="title-2">` + '<a href="#title-2" class="headerlink" title="title 2"/>title 2</h1> </div>');
39
48
  });
40
49
  test('create tabs with different alignment', async () => {
41
50
  const render = hexo.extend.tag.render.bind(hexo.extend.tag);
@@ -43,7 +52,7 @@ test('create tabs with different alignment', async () => {
43
52
  for (const align of ['left', 'centered', 'right', 'fullwidth']) {
44
53
  const source = `{% tabs align:${align} %}<!--tab id:tab1-->content<!--endtab-->{% endtabs %}`;
45
54
  const actual = cheerio.load(await render(source), cheerioOptions, false).html();
46
- expect(actual).toEqual(`<div class="tabs my-3 is-${align}"> <ul class="mx-0 my-0"> <li> <a href="#tab1"> </a> ` + '</li> </ul> </div> <div id="tab1" class="tab-content is-hidden"> ' + '<p>content</p> </div>');
55
+ expect(minify(actual, minifierOptions)).toEqual(`<div class="tabs my-3 is-${align}"> <ul class="mx-0 my-0"> <li> <a href="#tab1"> </a> ` + '</li> </ul> </div> <div id="tab1" class="tab-content is-hidden"> ' + '<p>content</p> </div>');
47
56
  }
48
57
  });
49
58
  test('create tabs with different sizes', async () => {
@@ -52,7 +61,7 @@ test('create tabs with different sizes', async () => {
52
61
  for (const size of ['small', 'medium', 'large']) {
53
62
  const source = `{% tabs size:${size} %}<!--tab id:tab1-->content<!--endtab-->{% endtabs %}`;
54
63
  const actual = cheerio.load(await render(source), cheerioOptions, false).html();
55
- expect(actual).toEqual(`<div class="tabs my-3 is-${size}"> <ul class="mx-0 my-0"> <li> <a href="#tab1"> </a> ` + '</li> </ul> </div> <div id="tab1" class="tab-content is-hidden"> ' + '<p>content</p> </div>');
64
+ expect(minify(actual, minifierOptions)).toEqual(`<div class="tabs my-3 is-${size}"> <ul class="mx-0 my-0"> <li> <a href="#tab1"> </a> ` + '</li> </ul> </div> <div id="tab1" class="tab-content is-hidden"> ' + '<p>content</p> </div>');
56
65
  }
57
66
  });
58
67
  test('create tabs with different styles', async () => {
@@ -62,7 +71,7 @@ test('create tabs with different styles', async () => {
62
71
  const source = `{% tabs style:${style} %}<!--tab id:tab1-->content<!--endtab-->{% endtabs %}`;
63
72
  const actual = cheerio.load(await render(source), cheerioOptions, false).html();
64
73
  const classname = style === 'toggle-rounded' ? 'toggle is-toggle-rounded' : style;
65
- expect(actual).toEqual(`<div class="tabs my-3 is-${classname}"> <ul class="mx-0 my-0"> <li> <a href="#tab1"> </a> ` + '</li> </ul> </div> <div id="tab1" class="tab-content is-hidden"> ' + '<p>content</p> </div>');
74
+ expect(minify(actual, minifierOptions)).toEqual(`<div class="tabs my-3 is-${classname}"> <ul class="mx-0 my-0"> <li> <a href="#tab1"> </a> ` + '</li> </ul> </div> <div id="tab1" class="tab-content is-hidden"> ' + '<p>content</p> </div>');
66
75
  }
67
76
  });
68
77
  test('create tabs with active status', async () => {
@@ -72,19 +81,19 @@ test('create tabs with active status', async () => {
72
81
  <!-- tab id:tab2 active -->tab 2<!-- endtab -->
73
82
  {% endtabs %}`;
74
83
  const actual = cheerio.load(await render(source), cheerioOptions, false).html();
75
- expect(actual).toEqual('<div class="tabs my-3"> <ul class="mx-0 my-0"> <li> <a href="#tab1"> </a> ' + '</li><li class="is-active"> <a href="#tab2"> </a> </li> </ul> </div> ' + '<div id="tab1" class="tab-content is-hidden"> <p>tab 1</p> </div>' + '<div id="tab2" class="tab-content"> <p>tab 2</p> </div>');
84
+ expect(minify(actual, minifierOptions)).toEqual('<div class="tabs my-3"> <ul class="mx-0 my-0"> <li> <a href="#tab1"> </a> ' + '</li><li class="is-active"> <a href="#tab2"> </a> </li> </ul> </div> ' + '<div id="tab1" class="tab-content is-hidden"> <p>tab 1</p> </div>' + '<div id="tab2" class="tab-content"> <p>tab 2</p> </div>');
76
85
  });
77
86
  test('create tabs with a title', async () => {
78
87
  const render = hexo.extend.tag.render.bind(hexo.extend.tag);
79
88
  const source = '{% tabs %}<!--tab id:tab1 "title:Tab Title"-->tab<!--endtab-->{% endtabs %}';
80
89
  const actual = cheerio.load(await render(source), cheerioOptions, false).html();
81
- expect(actual).toEqual('<div class="tabs my-3"> <ul class="mx-0 my-0"> <li> <a href="#tab1"> <p>Tab Title</p> </a> ' + '</li> </ul> </div> <div id="tab1" class="tab-content is-hidden"> <p>tab</p> </div>');
90
+ expect(minify(actual, minifierOptions)).toEqual('<div class="tabs my-3"> <ul class="mx-0 my-0"> <li> <a href="#tab1"> <p>Tab Title</p> </a> ' + '</li> </ul> </div> <div id="tab1" class="tab-content is-hidden"> <p>tab</p> </div>');
82
91
  });
83
92
  test('create tabs with an icon', async () => {
84
93
  const render = hexo.extend.tag.render.bind(hexo.extend.tag);
85
94
  const source = '{% tabs %}<!--tab id:tab1 "icon:fab fa-github"-->tab<!--endtab-->{% endtabs %}';
86
95
  const actual = cheerio.load(await render(source), cheerioOptions, false).html();
87
- expect(actual).toEqual('<div class="tabs my-3"> <ul class="mx-0 my-0"> <li> <a href="#tab1"> ' + '<span class="icon is-small ml-0"> <i class="fab fa-github" aria-hidden="true"/> ' + '</span> </a> </li> </ul> </div> <div id="tab1" class="tab-content is-hidden"> ' + '<p>tab</p> </div>');
96
+ expect(minify(actual, minifierOptions)).toEqual('<div class="tabs my-3"> <ul class="mx-0 my-0"> <li> <a href="#tab1"> ' + '<span class="icon is-small ml-0"> <i class="fab fa-github" aria-hidden="true"/> ' + '</span> </a> </li> </ul> </div> <div id="tab1" class="tab-content is-hidden"> ' + '<p>tab</p> </div>');
88
97
  });
89
98
  test('create tabs with all properties', async () => {
90
99
  const render = hexo.extend.tag.render.bind(hexo.extend.tag);
@@ -93,5 +102,5 @@ test('create tabs with all properties', async () => {
93
102
  <!-- tab id:tab2 active 'title:Tim\\'s Tab' -->tab 2<!-- endtab -->
94
103
  {% endtabs %}`;
95
104
  const actual = cheerio.load(await render(source), cheerioOptions, false).html();
96
- expect(actual).toEqual('<div class="tabs my-3 is-fullwidth is-large is-boxed"> <ul class="mx-0 my-0"> <li> ' + '<a href="#tab1"> <span class="icon is-small ml-0"> ' + '<i class="fas\\ fa-file" aria-hidden="true"/> </span> </a> </li><li class="is-active"> ' + '<a href="#tab2"> <p>Tim&#x2019;s Tab</p> </a> </li> </ul> </div> ' + '<div id="tab1" class="tab-content is-hidden"> <p>tab 1</p> </div>' + '<div id="tab2" class="tab-content"> <p>tab 2</p> </div>');
105
+ expect(minify(actual, minifierOptions)).toEqual('<div class="tabs my-3 is-fullwidth is-large is-boxed"> <ul class="mx-0 my-0"> <li> ' + '<a href="#tab1"> <span class="icon is-small ml-0"> ' + '<i class="fas\\ fa-file" aria-hidden="true"/> </span> </a> </li><li class="is-active"> ' + '<a href="#tab2"> <p>Tim&apos;s Tab</p> </a> </li> </ul> </div> ' + '<div id="tab1" class="tab-content is-hidden"> <p>tab 1</p> </div>' + '<div id="tab2" class="tab-content"> <p>tab 2</p> </div>');
97
106
  });
@@ -0,0 +1,28 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "/comment/twikoo.json",
4
+ "description": "Twikoo comment plugin configurations",
5
+ "type": "object",
6
+ "properties": {
7
+ "type": {
8
+ "type": "string",
9
+ "const": "twikoo"
10
+ },
11
+ "env_id": {
12
+ "type": "string",
13
+ "description": "envId from Tencent CloudBase or Vercel URL"
14
+ },
15
+ "region": {
16
+ "type": "string",
17
+ "description": "Region of Tencent CloudBase",
18
+ "nullable": true
19
+ },
20
+ "lang": {
21
+ "type": "string",
22
+ "description": "i18n support",
23
+ "default": "zh-CN",
24
+ "nullable": true
25
+ }
26
+ },
27
+ "required": ["type", "env_id"]
28
+ }
@@ -14,19 +14,18 @@
14
14
  },
15
15
  "path": {
16
16
  "type": "string",
17
- "description": "Article path id. Used to distinguish different article pages to ensure loading the correct comment list under the article page."
17
+ "description": "Article path id."
18
18
  },
19
19
  "lang": {
20
20
  "type": "string",
21
21
  "description": "Display language.",
22
- "enum": ["zh", "zh-CN", "zh-TW", "en", "en-US", "jp", "jp-JP"],
22
+ "enum": ["zh", "zh-CN", "zh-TW", "en", "en-US", "jp", "jp-JP", "pt-BR", "ru", "ru-RU"],
23
23
  "default": "zh-CN",
24
24
  "nullable": true
25
25
  },
26
- "visitor": {
27
- "type": "boolean",
28
- "description": "Show visitor count",
29
- "default": false,
26
+ "locale": {
27
+ "type": "object",
28
+ "description": "I18n configurations",
30
29
  "nullable": true
31
30
  },
32
31
  "emoji": {
@@ -73,11 +72,11 @@
73
72
  ]
74
73
  },
75
74
  "description": "Emoji settings.",
76
- "default": ["https://cdn.jsdelivr.net/gh/walinejs/emojis/weibo"],
75
+ "default": ["//unpkg.com/@waline/emojis@1.0.1/weibo"],
77
76
  "nullable": true
78
77
  },
79
78
  "dark": {
80
- "type": "string",
79
+ "type": ["string", "boolean"],
81
80
  "description": "Darkmode support.",
82
81
  "nullable": true
83
82
  },
@@ -126,25 +125,43 @@
126
125
  },
127
126
  "page_size": {
128
127
  "type": "number",
129
- "description": "number of comments per page.",
128
+ "description": "Number of comments per page.",
130
129
  "default": 10,
131
130
  "nullable": true
132
131
  },
133
- "upload_image": {
132
+ "image_uploader": {
134
133
  "type": "boolean",
135
- "description": "If you set it to false, image upload feature will be disabled.",
136
- "default": true,
134
+ "description": "Whether to disable the image upload feature.",
135
+ "default": false,
137
136
  "nullable": true
138
137
  },
139
- "highlight": {
138
+ "highlighter": {
140
139
  "type": "boolean",
141
- "description": "Code highlighting, it's enabled by default, please close it selectively.",
142
- "default": true,
140
+ "description": "Whether to disable the code highlight feature.",
141
+ "default": false,
143
142
  "nullable": true
144
143
  },
145
- "math": {
144
+ "tex_renderer": {
146
145
  "type": "boolean",
147
- "description": "If you set it to 'false', math preview feature will be disabled.",
146
+ "description": "Whether to disable TeX rendering.",
147
+ "default": false,
148
+ "nullable": true
149
+ },
150
+ "search": {
151
+ "type": "boolean",
152
+ "description": "Whether to disable the search feature.",
153
+ "default": false,
154
+ "nullable": true
155
+ },
156
+ "pageview": {
157
+ "type": ["string", "boolean"],
158
+ "description": "Whether to show page view count. It can also be a CSS selector to page view count container.",
159
+ "default": false,
160
+ "nullable": true
161
+ },
162
+ "comment": {
163
+ "type": ["string", "boolean"],
164
+ "description": "Whether to show comment count. It can also be a CSS selector to comment count container.",
148
165
  "default": false,
149
166
  "nullable": true
150
167
  },
@@ -153,11 +170,6 @@
153
170
  "description": "Whether show copyright and version in footer.",
154
171
  "default": true,
155
172
  "nullable": true
156
- },
157
- "locale": {
158
- "type": "object",
159
- "description": "I18n configurations",
160
- "nullable": true
161
173
  }
162
174
  },
163
175
  "required": ["type", "server_url"]
@@ -0,0 +1,21 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "/comment/changyan.json",
4
+ "description": "Changyan comment plugin configurations",
5
+ "type": "object",
6
+ "properties": {
7
+ "type": {
8
+ "type": "string",
9
+ "const": "changyan"
10
+ },
11
+ "app_id": {
12
+ "type": "string",
13
+ "description": "Changyan app ID"
14
+ },
15
+ "conf": {
16
+ "type": "string",
17
+ "description": "Changyan configuration ID"
18
+ }
19
+ },
20
+ "required": ["type", "app_id", "conf"]
21
+ }