hexo-theme-stellar 1.24.0 → 1.25.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 (61) hide show
  1. package/_config.yml +69 -45
  2. package/languages/en.yml +2 -1
  3. package/languages/zh-CN.yml +2 -1
  4. package/languages/zh-TW.yml +2 -1
  5. package/layout/404.ejs +1 -3
  6. package/layout/_partial/head.ejs +1 -1
  7. package/layout/_partial/main/article/article_footer.ejs +14 -14
  8. package/layout/_partial/main/article/read_next.ejs +10 -10
  9. package/layout/_partial/main/navbar/breadcrumb.ejs +36 -14
  10. package/layout/_partial/main/navbar/{list_post.ejs → nav_tabs_blog.ejs} +15 -7
  11. package/layout/_partial/main/navbar/{list_wiki.ejs → nav_tabs_wiki.ejs} +15 -1
  12. package/layout/_partial/main/post_list/post_card.ejs +2 -13
  13. package/layout/_partial/main/post_list/topic_card.ejs +16 -0
  14. package/layout/_partial/sidebar/header.ejs +6 -7
  15. package/layout/_partial/sidebar/index.ejs +37 -29
  16. package/layout/_partial/sidebar/menu.ejs +2 -2
  17. package/layout/_partial/widgets/related.ejs +47 -20
  18. package/layout/_partial/widgets/search.ejs +2 -2
  19. package/layout/_partial/widgets/toc.ejs +52 -44
  20. package/layout/archive.ejs +1 -1
  21. package/layout/categories.ejs +1 -1
  22. package/layout/index.ejs +6 -42
  23. package/layout/index_topic.ejs +28 -0
  24. package/layout/index_wiki.ejs +42 -0
  25. package/layout/page.ejs +2 -2
  26. package/layout/tags.ejs +1 -1
  27. package/layout/topic.ejs +28 -0
  28. package/layout/wiki.ejs +11 -22
  29. package/package.json +1 -1
  30. package/scripts/events/index.js +5 -0
  31. package/scripts/events/lib/authors.js +1 -1
  32. package/scripts/events/lib/config.js +2 -2
  33. package/scripts/events/lib/doc_tree.js +1 -1
  34. package/scripts/events/lib/merge_posts.js +47 -0
  35. package/scripts/events/lib/topic_tree.js +45 -0
  36. package/scripts/generators/404.js +8 -3
  37. package/scripts/generators/author.js +4 -2
  38. package/scripts/generators/categories.js +4 -4
  39. package/scripts/generators/tags.js +4 -4
  40. package/scripts/generators/topic.js +21 -0
  41. package/scripts/generators/wiki.js +29 -28
  42. package/scripts/helpers/parse_config.js +2 -2
  43. package/scripts/tags/lib/audio.js +10 -5
  44. package/scripts/tags/lib/navbar.js +1 -1
  45. package/scripts/tags/lib/video.js +13 -5
  46. package/source/css/_common/blur.styl +4 -1
  47. package/source/css/_common/highlight.styl +1 -0
  48. package/source/css/_common/media.styl +1 -6
  49. package/source/css/_layout/partial/paginator.styl +2 -2
  50. package/source/css/_layout/partial/related.styl +3 -0
  51. package/source/css/_layout/tag-plugins/banner.styl +4 -1
  52. package/source/css/_layout/tag-plugins/frame.styl +1 -1
  53. package/source/css/_layout/tag-plugins/media.styl +11 -0
  54. package/source/css/_layout/widgets/search.styl +21 -29
  55. package/source/js/main.js +1 -1
  56. package/source/js/plugins/fcircle.js +1 -1
  57. package/source/js/plugins/friends.js +1 -1
  58. package/source/js/plugins/memos.js +1 -1
  59. package/source/js/plugins/sites.js +2 -2
  60. package/source/js/plugins/weibo.js +1 -1
  61. package/source/js/search/local-search.js +4 -1
package/_config.yml CHANGED
@@ -1,6 +1,6 @@
1
1
  ######## Stellar info ########
2
2
  stellar:
3
- version: '1.24.0'
3
+ version: '1.25.0'
4
4
  homepage: 'https://xaoxuu.com/wiki/stellar/'
5
5
  repo: 'https://github.com/xaoxuu/hexo-theme-stellar'
6
6
  cdn_css: # Use cdn links instead of /css/main.css
@@ -18,42 +18,65 @@ open_graph:
18
18
 
19
19
 
20
20
  ######## Sidebar ########
21
- sidebar:
22
- logo:
23
- avatar: '[config.avatar](/about/)' # you can set avatar link in _config.yml or '[https://xxx.png](/about/)'
24
- title: '[config.title](/)' # you can set html tag like: '[<img no-lazy height="32px" src="xxx"/>](/)'
25
- menu:
26
- # post: '[btn.blog](/)'
27
- # wiki: '[btn.wiki](/wiki/)'
28
- # friends: '[友链](/friends/)'
29
- # about: '[关于](/about/)'
30
- # Sidebar widgets
31
- widgets:
32
- #### 自动生成的页面 ####
33
- # 主页
34
- home: search, recent, timeline # for home
35
- # 博客索引页
36
- blog_index: search_blog, recent, timeline # for categories/tags/archives
37
- # 文档索引页
38
- wiki_index: search_docs, recent, timeline # for wiki
39
- # 其它(404)
40
- others: search, recent, timeline # for 404 and ...
41
- #### 手动创建的页面 ####
42
- # 文章内页
43
- post: search_blog, toc, ghrepo, ghissues # for pages using 'layout:post'
44
- # 文档内页
45
- wiki: search, toc, ghissues, related # for pages using 'layout:wiki'
46
- # 其它 layout:page 的页面
47
- page: toc, search # for custom pages using 'layout:page'
48
-
49
- ######## Index ########
50
- post-index: # 近期发布 分类 标签 归档 and ...
51
- # '朋友文章': /friends/rss/
21
+ # 左上角显示的 logo 区域,包含图标、大标题、副标题
22
+ logo:
23
+ avatar: '[config.avatar](/about/)' # you can set avatar link in _config.yml or '[https://xxx.png](/about/)'
24
+ title: '[config.title](/)' # you can set html tag like: '[<img no-lazy height="32px" src="xxx"/>](/)'
25
+ subtitle: '' # '文字1 | 文字2' (鼠标放上去会切换到文字2)
26
+
27
+ # 侧边栏主功能导航菜单
28
+ # 自己可以增加任意的键值对
29
+ # 键:就是 menu_id,后面需要用到
30
+ # 值:就是显示的 md 链接,方括号内支持文字和图片标签
31
+ menu:
32
+ # post: '[btn.blog](/)'
33
+ # wiki: '[btn.wiki](/wiki/)'
34
+ # friends: '[友链](/friends/)'
35
+ # about: '[关于](/about/)'
52
36
 
53
37
 
54
38
  ######## Main ########
55
- breadcrumb:
56
- home: home # config.title / config.author / home or custom content
39
+ # 站点主结构树
40
+ site_tree:
41
+ # 主页配置
42
+ home:
43
+ sidebar: search, recent, timeline
44
+ # 博客配置
45
+ blog:
46
+ base_dir: blog # 只影响自动生成的页面路径
47
+ menu_id: post # 未在 front-matter 中指定 menu_id 时,layout 为 post 的页面默认使用这里配置的 menu_id
48
+ sidebar: search_blog, recent, timeline # for categories/tags/archives
49
+ nav_tabs: # 近期发布 分类 标签 专栏 归档 and ...
50
+ # '朋友文章': /friends/rss/
51
+ # 博客文章配置
52
+ post:
53
+ menu_id: post # 未在 front-matter 中指定 menu_id 时,layout 为 post 的页面默认使用这里配置的 menu_id
54
+ sidebar: search_blog, toc, related, ghrepo, ghissues # for pages using 'layout:post'
55
+ # 博客专栏配置
56
+ topic:
57
+ base_dir: topic # 只影响自动生成的页面路径
58
+ menu_id: post # 未在 front-matter 中指定 menu_id 时,layout 为 topic 的页面默认使用这里配置的 menu_id
59
+ sidebar: search_blog, toc, related # for topic
60
+ # wiki配置
61
+ wiki:
62
+ base_dir: wiki # 只影响自动生成的页面路径
63
+ menu_id: wiki # 未在 front-matter 中指定 menu_id 时,layout 为 wiki 的页面默认使用这里配置的 menu_id
64
+ sidebar: search_docs, ghissues, related, recent, timeline # for wiki
65
+ # 作者信息配置
66
+ author:
67
+ base_dir: author # 只影响自动生成的页面路径
68
+ menu_id: post
69
+ sidebar: search_blog, recent, timeline
70
+ # 错误页配置
71
+ error_page:
72
+ menu_id: post
73
+ '404': '/404.html'
74
+ sidebar: search, recent, timeline
75
+ # 其它自定义页面配置 layout: page
76
+ page:
77
+ sidebar: toc, search
78
+
79
+
57
80
 
58
81
  ######## Article ########
59
82
  article:
@@ -189,16 +212,16 @@ comments:
189
212
  footer:
190
213
  social:
191
214
  # github:
192
- # icon: '<img src="https://gcore.jsdelivr.net/gh/cdn-x/placeholder@1.0.9/social/08a41b181ce68.svg"/>'
215
+ # icon: '<img src="https://gcore.jsdelivr.net/gh/cdn-x/placeholder@1.0.12/social/08a41b181ce68.svg"/>'
193
216
  # url: /
194
217
  # music:
195
- # icon: '<img src="https://gcore.jsdelivr.net/gh/cdn-x/placeholder@1.0.9/social/3845874.svg"/>'
218
+ # icon: '<img src="https://gcore.jsdelivr.net/gh/cdn-x/placeholder@1.0.12/social/3845874.svg"/>'
196
219
  # url: /
197
220
  # unsplash:
198
- # icon: '<img src="https://gcore.jsdelivr.net/gh/cdn-x/placeholder@1.0.9/social/3616429.svg"/>'
221
+ # icon: '<img src="https://gcore.jsdelivr.net/gh/cdn-x/placeholder@1.0.12/social/3616429.svg"/>'
199
222
  # url: /
200
223
  # comments:
201
- # icon: '<img src="https://gcore.jsdelivr.net/gh/cdn-x/placeholder@1.0.9/social/942ebbf1a4b91.svg"/>'
224
+ # icon: '<img src="https://gcore.jsdelivr.net/gh/cdn-x/placeholder@1.0.12/social/942ebbf1a4b91.svg"/>'
202
225
  # url: /about/#comments
203
226
  sitemap:
204
227
  # '博客':
@@ -443,7 +466,7 @@ style:
443
466
  underline: true # true / false
444
467
  animated_avatar:
445
468
  animate: auto # auto, always
446
- background: https://gcore.jsdelivr.net/gh/cdn-x/placeholder@1.0.9/avatar/round/rainbow64@3x.webp
469
+ background: https://gcore.jsdelivr.net/gh/cdn-x/placeholder@1.0.12/avatar/round/rainbow64@3x.webp
447
470
  codeblock:
448
471
  scrollbar: 4px
449
472
  highlightjs_theme: https://gcore.jsdelivr.net/gh/highlightjs/cdn-release@11.7.0/build/styles/atom-one-dark.min.css
@@ -455,12 +478,13 @@ style:
455
478
  search: 'linear-gradient(to right, #04F3FF, #08FFC6, #DDF730, #FFBD19, #FF1FE0, #C418FF, #04F3FF)'
456
479
 
457
480
  default:
458
- avatar: https://gcore.jsdelivr.net/gh/cdn-x/placeholder@1.0.9/avatar/round/3442075.svg
459
- link: https://gcore.jsdelivr.net/gh/cdn-x/placeholder@1.0.9/link/8f277b4ee0ecd.svg
460
- cover: https://gcore.jsdelivr.net/gh/cdn-x/placeholder@1.0.9/cover/76b86c0226ffd.svg
461
- image: https://gcore.jsdelivr.net/gh/cdn-x/placeholder@1.0.9/image/2659360.svg
462
- project: https://gcore.jsdelivr.net/gh/cdn-x/placeholder@1.0.9/image/2779789.png
463
- banner: https://gcore.jsdelivr.net/gh/cdn-x/placeholder@1.0.9/banner/books.jpg
481
+ avatar: https://gcore.jsdelivr.net/gh/cdn-x/placeholder@1.0.12/avatar/round/3442075.svg
482
+ link: https://gcore.jsdelivr.net/gh/cdn-x/placeholder@1.0.12/link/8f277b4ee0ecd.svg
483
+ cover: https://gcore.jsdelivr.net/gh/cdn-x/placeholder@1.0.12/cover/76b86c0226ffd.svg
484
+ image: https://gcore.jsdelivr.net/gh/cdn-x/placeholder@1.0.12/image/2659360.svg
485
+ project: https://gcore.jsdelivr.net/gh/cdn-x/placeholder@1.0.12/image/2779789.png
486
+ banner: https://gcore.jsdelivr.net/gh/cdn-x/placeholder@1.0.12/banner/books.jpg
487
+ topic: https://gcore.jsdelivr.net/gh/cdn-x/placeholder@1.0.12/image/10433048.png
464
488
 
465
489
  api_host:
466
490
  ghapi: https://api.github.com
package/languages/en.yml CHANGED
@@ -2,6 +2,7 @@ btn:
2
2
  home: Home
3
3
  blog: Blog
4
4
  wiki: Wiki
5
+ topic: Topic
5
6
  recent_publish: Recent
6
7
  all_wiki: All Products
7
8
  category: Category
@@ -23,7 +24,7 @@ meta:
23
24
  related_posts: Related Posts
24
25
  comment_title: Join the discussion
25
26
  back_to_top: Back to top
26
- more: 'More %s'
27
+ more: More
27
28
  created_author: '%s posted on'
28
29
  created: 'Posted on'
29
30
  updated: 'Updated on'
@@ -2,6 +2,7 @@ btn:
2
2
  home: 主页
3
3
  blog: 文章
4
4
  wiki: 项目
5
+ topic: 专栏
5
6
  recent_publish: 近期发布
6
7
  all_wiki: 所有项目
7
8
  category: 分类
@@ -23,7 +24,7 @@ meta:
23
24
  related_posts: 您可能感兴趣的文章
24
25
  comment_title: 快来参与讨论吧
25
26
  back_to_top: 回到顶部
26
- more: '更多「%s」'
27
+ more: 更多
27
28
  created_author: 本文由 %s 发布于
28
29
  created: 发布于
29
30
  updated: 更新于
@@ -2,6 +2,7 @@ btn:
2
2
  home: 首頁
3
3
  blog: 網誌
4
4
  wiki: Wiki
5
+ topic: 專欄
5
6
  recent_publish: 近期發布
6
7
  all_wiki: 所有 Wiki
7
8
  category: 分類
@@ -23,7 +24,7 @@ meta:
23
24
  related_posts: 您可能感興趣的文章
24
25
  comment_title: 參與討論
25
26
  back_to_top: 回到頁首
26
- more: '更多「%s」'
27
+ more: 更多
27
28
  created_author: 本文由 %s 發布於
28
29
  created: 發布於
29
30
  updated: 更新於
package/layout/404.ejs CHANGED
@@ -1,12 +1,10 @@
1
1
  <%
2
- page.menu_id = '404';
3
- page.layout = '404';
4
2
  page.comment_title = '';
5
3
  page.header = 'auto';
6
4
  page.robots = 'none';
7
5
  %>
8
6
  <article class='md-text error-page'>
9
- <h1><img id='error' src='https://gcore.jsdelivr.net/gh/cdn-x/placeholder@1.0.9/404/1c830bfcd517d.svg' alt='404'></h1>
7
+ <h1><img id='error' src='https://gcore.jsdelivr.net/gh/cdn-x/placeholder@1.0.12/404/1c830bfcd517d.svg' alt='404'></h1>
10
8
  <p class='what'>
11
9
  <strong>
12
10
  <%- __('page.error.what') %>
@@ -26,7 +26,7 @@ function generate_description() {
26
26
  if (theme.open_graph && theme.open_graph.enable) {
27
27
  return '';
28
28
  }
29
- if (page.layout == 'wiki' && page.wiki) {
29
+ if (page.wiki) {
30
30
  let proj = theme.wiki.tree[page.wiki];
31
31
  if (proj && proj.description) {
32
32
  return '<meta name="description" content="' + proj.description + '">';
@@ -38,11 +38,7 @@ function layoutDiv() {
38
38
  }
39
39
 
40
40
  var license = ''
41
- if (page.layout == 'post') {
42
- if (theme.article.license && (page.license != false)) {
43
- license = page.license || theme.article.license
44
- }
45
- } else if (page.layout == 'wiki' && page.wiki) {
41
+ if (page.wiki) {
46
42
  let proj = theme.wiki.tree[page.wiki]
47
43
  if (page.license != null) {
48
44
  license = page.license || theme.article.license
@@ -53,6 +49,10 @@ function layoutDiv() {
53
49
  license = proj.license
54
50
  }
55
51
  }
52
+ } else if (page.layout == 'post') {
53
+ if (theme.article.license && (page.license != false)) {
54
+ license = page.license || theme.article.license
55
+ }
56
56
  }
57
57
  if (license.length > 0) {
58
58
  var author = null
@@ -75,15 +75,15 @@ function layoutDiv() {
75
75
  }
76
76
 
77
77
  var showSharePlugin = false
78
- if (page.layout == 'post') {
79
- showSharePlugin = page.share != false
80
- } else if (page.layout == 'wiki' && page.wiki) {
78
+ if (page.wiki) {
81
79
  let proj = theme.wiki.tree[page.wiki]
82
80
  if (page.share != null) {
83
81
  showSharePlugin = page.share == true
84
82
  } else if (proj != null) {
85
83
  showSharePlugin = proj.share == true
86
84
  }
85
+ } else if (page.layout == 'post') {
86
+ showSharePlugin = page.share != false
87
87
  }
88
88
  if (theme.article.share && showSharePlugin) {
89
89
  function socialButtons() {
@@ -101,8 +101,8 @@ function layoutDiv() {
101
101
  el += '&title=' + (page.seo_title || (page.title + ' - ' + config.title));
102
102
  if (page.layout == 'post' && page.cover) {
103
103
  el += '&pics=' + page.cover;
104
- } else if (page.layout == 'wiki' && page.logo && page.logo.src) {
105
- el += '&pics=' + page.logo.src;
104
+ } else if (page.layout == 'wiki' && page.icon) {
105
+ el += '&pics=' + page.icon;
106
106
  }
107
107
  el += '&summary=' + truncate(page.description || strip_html(page.excerpt || page.content), {length: 120});
108
108
  el += '"';
@@ -114,13 +114,13 @@ function layoutDiv() {
114
114
  }
115
115
  el += '>';
116
116
  if (item == 'wechat') {
117
- el += '<img src="https://gcore.jsdelivr.net/gh/cdn-x/placeholder@1.0.9/social/b32ef3da1162a.svg"/>';
117
+ el += '<img src="https://gcore.jsdelivr.net/gh/cdn-x/placeholder@1.0.12/social/b32ef3da1162a.svg"/>';
118
118
  } else if (item == 'weibo') {
119
- el += '<img src="https://gcore.jsdelivr.net/gh/cdn-x/placeholder@1.0.9/social/80c07e4dbb303.svg"/>';
119
+ el += '<img src="https://gcore.jsdelivr.net/gh/cdn-x/placeholder@1.0.12/social/80c07e4dbb303.svg"/>';
120
120
  } else if (item == 'email') {
121
- el += '<img src="https://gcore.jsdelivr.net/gh/cdn-x/placeholder@1.0.9/social/a1b00e20f425d.svg"/>';
121
+ el += '<img src="https://gcore.jsdelivr.net/gh/cdn-x/placeholder@1.0.12/social/a1b00e20f425d.svg"/>';
122
122
  } else if (item == 'link') {
123
- el += '<img src="https://gcore.jsdelivr.net/gh/cdn-x/placeholder@1.0.9/social/8411ed322ced6.svg"/>';
123
+ el += '<img src="https://gcore.jsdelivr.net/gh/cdn-x/placeholder@1.0.12/social/8411ed322ced6.svg"/>';
124
124
  }
125
125
  el += '</a>';
126
126
  }
@@ -1,15 +1,15 @@
1
1
  <%
2
2
  function layoutDiv() {
3
- var prev,next;
4
- var title = __('meta.read_next');
5
- var title_prev = __('meta.prev');
6
- var title_next = __('meta.next');
7
- if (page.layout === 'post') {
8
- prev = page.prev;
9
- next = page.next;
10
- title_prev = __('meta.newer');
11
- title_next = __('meta.older');
12
- } else if (page.layout === 'wiki' && page.wiki && page.wiki.length > 0) {
3
+ var prev,next
4
+ var title = __('meta.read_next')
5
+ title_prev = __('meta.newer')
6
+ title_next = __('meta.older')
7
+ if (page.layout === 'post' || page.layout === 'topic') {
8
+ prev = page.prev
9
+ next = page.next
10
+ } else if (page.layout === 'wiki' && page.wiki?.length > 0) {
11
+ var title_prev = __('meta.prev');
12
+ var title_next = __('meta.next');
13
13
  let proj = theme.wiki.tree[page.wiki];
14
14
  if (proj) {
15
15
  let ps = proj.pages?.filter(p => p.path == page.path)
@@ -5,15 +5,6 @@ function layoutDiv() {
5
5
  return el;
6
6
  }
7
7
  var home_title = __("btn.home");
8
- if (theme.breadcrumb && theme.breadcrumb.home) {
9
- if (theme.breadcrumb.home === 'config.title') {
10
- home_title = config.title;
11
- } else if (theme.breadcrumb.home === 'config.author') {
12
- home_title = config.author;
13
- } else if (theme.breadcrumb.home !== 'home') {
14
- home_title = theme.breadcrumb.home;
15
- }
16
- }
17
8
  if (page.layout === "post") {
18
9
  var firstCat = "";
19
10
  if (page.categories && page.categories.length > 0) {
@@ -63,7 +54,38 @@ function layoutDiv() {
63
54
 
64
55
  el += '</div>';
65
56
  el += '</div>';
66
- } else if (page.layout === "wiki" && page.wiki && page.wiki.length > 0) {
57
+ } else if (page.layout === 'topic' && page.topic?.length > 0) {
58
+ el += '<div class="bread-nav fs12">';
59
+ el += '<div class="left">';
60
+ el += '<div id="breadcrumb">';
61
+ var nodes = [];
62
+ // home
63
+ el += '<a class="cap breadcrumb" id="home" href="' + url_for(config.root) + '">' + home_title + '</a>';
64
+ nodes.push('/');
65
+ // menu_id
66
+ el += '<span class="sep"></span>';
67
+ let url = url_for(theme.site_tree.topic.base_dir);
68
+ nodes.push(url);
69
+ el += '<a class="cap breadcrumb" id="menu" href="' + url + '">' + __("btn.topic") + '</a>';
70
+ // 专栏名
71
+ let topicObject = theme.topic.tree[page.topic];
72
+ if (topicObject != null) {
73
+ let url_proj = url_for(topicObject.homepage?.path);
74
+ if (nodes.includes(url_proj) === false) {
75
+ el += '<span class="sep"></span>';
76
+ el += '<a class="cap breadcrumb" id="proj" href="' + url_proj + '">' + (topicObject.name || topicObject.title) + '</a>';
77
+ }
78
+ }
79
+ el += '</div>';
80
+ // 更新日期
81
+ el += '<div id="post-meta">';
82
+ el += `
83
+ <span>${__("meta.updated")}&nbsp;<time datetime="${date_xml(page.updated)}">${date(page.updated, config.date_format)}</time></span>
84
+ `;
85
+ el += '</div>';
86
+ el += '</div>';
87
+ el += '</div>';
88
+ } else if (page.layout === "wiki" && page.wiki?.length > 0) {
67
89
  el += '<div class="bread-nav fs12">';
68
90
  el += '<div class="left">';
69
91
  el += '<div id="breadcrumb">';
@@ -73,12 +95,12 @@ function layoutDiv() {
73
95
  nodes.push('/');
74
96
  // menu_id
75
97
  el += '<span class="sep"></span>';
76
- if (page.menu_id && theme.sidebar.menu[page.menu_id] && md_link(theme.sidebar.menu[page.menu_id])) {
77
- let url = url_for(md_link(theme.sidebar.menu[page.menu_id]));
98
+ if (page.menu_id && theme.menu[page.menu_id] && md_link(theme.menu[page.menu_id])) {
99
+ let url = url_for(md_link(theme.menu[page.menu_id]));
78
100
  nodes.push(url);
79
- el += '<a class="cap breadcrumb" id="menu" href="' + url + '">' + __(md_text(theme.sidebar.menu[page.menu_id])) + '</a>';
101
+ el += '<a class="cap breadcrumb" id="menu" href="' + url + '">' + __(md_text(theme.menu[page.menu_id])) + '</a>';
80
102
  } else {
81
- let url = url_for(config.wiki_dir || "/wiki/");
103
+ let url = url_for(theme.site_tree.wiki.base_dir);
82
104
  nodes.push(url);
83
105
  el += '<a class="cap breadcrumb" id="menu" href="' + url + '">' + __("btn.wiki") + '</a>';
84
106
  }
@@ -29,6 +29,14 @@ function layoutDiv() {
29
29
  }
30
30
  }
31
31
 
32
+ if (theme.topic?.publish_list?.length > 0) {
33
+ if (page.layout == 'index_topic') {
34
+ el += '<a class="active" href="' + url_for(theme.site_tree.topic.base_dir) + '">' + __("btn.topic") + '</a>';
35
+ } else {
36
+ el += '<a href="' + url_for(theme.site_tree.topic.base_dir) + '">' + __("btn.topic") + '</a>';
37
+ }
38
+ }
39
+
32
40
  if (site.posts && site.posts.length > 0) {
33
41
  if (is_archive()) {
34
42
  el += '<a class="active" href="' + url_for(config.archive_dir) + '">' + __("btn.archives") + '</a>';
@@ -37,15 +45,15 @@ function layoutDiv() {
37
45
  }
38
46
  }
39
47
 
40
- if (theme['post-index']) {
41
- const obj = theme['post-index'];
42
- for (let key of Object.keys(obj)) {
48
+ const { nav_tabs } = theme.site_tree.blog
49
+ if (nav_tabs) {
50
+ for (let key of Object.keys(nav_tabs)) {
43
51
  // 当 page 的末尾为 index.html 或者处于该 page 的某个子页面时也应该匹配
44
- // if (full_url_for(page.path) == full_url_for(obj[key])) {
45
- if (full_url_for(page.path).startsWith(full_url_for(obj[key]))){
46
- el += '<a class="active" href="' + url_for(obj[key]) + '">' + key + '</a>';
52
+ // if (full_url_for(page.path) == full_url_for(nav_tabs[key])) {
53
+ if (full_url_for(page.path).startsWith(full_url_for(nav_tabs[key]))){
54
+ el += '<a class="active" href="' + url_for(nav_tabs[key]) + '">' + key + '</a>';
47
55
  } else {
48
- el += '<a href="' + url_for(obj[key]) + '">' + key + '</a>';
56
+ el += '<a href="' + url_for(nav_tabs[key]) + '">' + key + '</a>';
49
57
  }
50
58
  }
51
59
  }
@@ -8,7 +8,7 @@ function layoutDiv() {
8
8
  if (page.filter === false) {
9
9
  el += ' class="active"';
10
10
  }
11
- el += ' href="' + url_for(config.wiki_dir || "/wiki/") + '">' + __("btn.all_wiki") + '</a>';
11
+ el += ' href="' + url_for(theme.site_tree.wiki.base_dir) + '">' + __("btn.all_wiki") + '</a>';
12
12
  el += '</a>';
13
13
  // 项目分类
14
14
  const { shelf, all_tags } = theme.wiki;
@@ -24,6 +24,20 @@ function layoutDiv() {
24
24
  el += '</a>';
25
25
  }
26
26
  }
27
+
28
+ const { nav_tabs } = theme.site_tree.wiki
29
+ if (nav_tabs) {
30
+ for (let key of Object.keys(nav_tabs)) {
31
+ // 当 page 的末尾为 index.html 或者处于该 page 的某个子页面时也应该匹配
32
+ // if (full_url_for(page.path) == full_url_for(nav_tabs[key])) {
33
+ if (full_url_for(page.path).startsWith(full_url_for(nav_tabs[key]))){
34
+ el += '<a class="active" href="' + url_for(nav_tabs[key]) + '">' + key + '</a>';
35
+ } else {
36
+ el += '<a href="' + url_for(nav_tabs[key]) + '">' + key + '</a>';
37
+ }
38
+ }
39
+ }
40
+
27
41
  el += '</nav>';
28
42
  el += '</div>';
29
43
  return el;
@@ -69,18 +69,7 @@ function div_default() {
69
69
  // meta
70
70
  el += '<div class="meta cap">';
71
71
  el += '<span class="cap" id="post-meta">';
72
- // author
73
- var author = null
74
- if (theme.authors) {
75
- if (page.author?.length > 0 && theme.authors[page.author] != null) {
76
- author = theme.authors[page.author]
77
- } else {
78
- author = theme.default_author
79
- }
80
- }
81
- if (author) {
82
- el += author.name + '&nbsp;'
83
- }
72
+
84
73
  // time
85
74
  el += __("meta.created") + '&nbsp;' + '<time datetime="' + date_xml(post.date) + '">' + date(post.date, config.date_format) + '</time>';
86
75
  el += '</span>';
@@ -102,7 +91,7 @@ function div_default() {
102
91
  }
103
92
  }
104
93
  if (post.pin) {
105
- el += '<span class="pin"><img src="https://gcore.jsdelivr.net/gh/cdn-x/placeholder@1.0.9/badge/3279dd441df8b.svg"/></span>';
94
+ el += '<span class="pin"><img src="https://gcore.jsdelivr.net/gh/cdn-x/placeholder@1.0.12/badge/3279dd441df8b.svg"/></span>';
106
95
  }
107
96
  el += '</div>';
108
97
  el += '</article>';
@@ -0,0 +1,16 @@
1
+ <%
2
+ function layoutDiv() {
3
+ var el = '';
4
+ el += '<article class="md-text">';
5
+ el += `<div class="preview"><img src="${topic.icon ? topic.icon : theme.default.topic}"/></div>`
6
+ el += '<div class="excerpt">';
7
+ el += '<h2 class="post-title">' + (topic.title || topic.name) + '</h2>';
8
+ if (topic.description) {
9
+ el += '<p>' + topic.description + '</p>';
10
+ }
11
+ el += '</div>';
12
+ el += '</article>';
13
+ return el;
14
+ }
15
+ %>
16
+ <%- layoutDiv() %>
@@ -32,19 +32,18 @@ function layoutDiv() {
32
32
  el += '">';
33
33
 
34
34
  el += '<div class="logo-wrap">';
35
- if (md_text(theme.sidebar.logo.avatar)) {
36
- el += '<a class="avatar" href="' + url_for(md_link(theme.sidebar.logo.avatar) || "/") + '">';
35
+ if (md_text(theme.logo.avatar)) {
36
+ el += '<a class="avatar" href="' + url_for(md_link(theme.logo.avatar) || "/") + '">';
37
37
  if (theme.style.animated_avatar.animate) {
38
38
  el += '<div class="bg" style="opacity:0;background-image:url(' + theme.style.animated_avatar.background + ');"></div>';
39
39
  }
40
- el += '<img no-lazy class="avatar" src="' + md_text(theme.sidebar.logo.avatar) + '">';
40
+ el += '<img no-lazy class="avatar" src="' + md_text(theme.logo.avatar) + '">';
41
41
  el += '</a>';
42
42
  }
43
- let main = md_text(theme.sidebar.logo.title);
43
+ let main = md_text(theme.logo.title);
44
44
  if (main) {
45
- let url = md_link(theme.sidebar.logo.title);
46
- let sub = config.subtitle;
47
- el += layoutTitle(main, url, sub);
45
+ let url = md_link(theme.logo.title);
46
+ el += layoutTitle(main, url, theme.logo.subtitle);
48
47
  }
49
48
  el += '</div>';
50
49
 
@@ -1,32 +1,35 @@
1
1
  <%
2
- var proj;
3
- if (page.layout === 'wiki' && page.wiki) {
4
- proj = theme.wiki.tree[page.wiki];
5
- }
6
- // 默认组件
7
- if (page.sidebar == undefined) {
8
- if (page.layout == 'post' && page.content) {
9
- page.sidebar = theme.sidebar.widgets.post;
10
- } else if (page.layout == 'wiki' && page.wiki) {
11
- let proj = theme.wiki.tree[page.wiki];
12
- if (proj?.sidebar) {
13
- page.sidebar = proj.sidebar;
14
- } else {
15
- page.sidebar = theme.sidebar.widgets.wiki;
16
- }
17
- } else if (is_home()) {
18
- page.sidebar = theme.sidebar.widgets.home;
2
+ if (page.sidebar == null) {
3
+ const { site_tree } = theme
4
+ var sidebar
5
+ if (is_home()) {
6
+ sidebar = site_tree.home.sidebar
19
7
  } else if (is_category() || is_tag() || is_archive() || ['categories', 'tags', 'archives'].includes(page.layout)) {
20
- page.sidebar = theme.sidebar.widgets.blog_index;
21
- } else if (['wiki_index'].includes(page.layout)) {
22
- page.sidebar = theme.sidebar.widgets.wiki_index;
23
- } else if (['404', undefined].includes(page.layout)) {
24
- page.sidebar = theme.sidebar.widgets.others;
25
- } else if (page.layout == 'page') {
26
- page.sidebar = theme.sidebar.widgets.page;
8
+ sidebar = site_tree.blog.sidebar
9
+ } else if (page.layout === 'index_topic' || page.layout === 'topic') {
10
+ sidebar = site_tree.topic.sidebar
11
+ } else if (page.layout === 'index_wiki' || page.layout === 'wiki') {
12
+ sidebar = site_tree.wiki.sidebar
13
+ } else if (page.layout === '404') {
14
+ sidebar = site_tree.error_page.sidebar
15
+ } else if (page.layout === 'page') {
16
+ sidebar = site_tree.page.sidebar
17
+ } else if (page.layout === 'post') {
18
+ sidebar = site_tree.post.sidebar
19
+ } else if (page.layout == null) {
20
+ sidebar = site_tree.page.sidebar
27
21
  } else {
28
- page.sidebar = [];
22
+ sidebar = []
23
+ }
24
+
25
+ if (page.layout === 'topic' && page.topic && theme.topic?.tree[page.topic]?.sidebar) {
26
+ sidebar = theme.topic.tree[page.topic].sidebar
27
+ }
28
+ if (page.layout == 'wiki' && page.wiki && theme.wiki?.tree[page.wiki]?.sidebar) {
29
+ sidebar = theme.wiki.tree[page.wiki].sidebar
29
30
  }
31
+
32
+ page.sidebar = sidebar
30
33
  }
31
34
 
32
35
  // parse array string
@@ -51,21 +54,25 @@ function layoutTitle(main, url, sub) {
51
54
  }
52
55
  function layoutWidgets() {
53
56
  var el = '';
57
+ var proj;
58
+ if (page.layout === 'wiki' && page.wiki) {
59
+ proj = theme.wiki.tree[page.wiki];
60
+ }
54
61
  el += '<div class="widgets">';
55
62
  if (page.layout == 'wiki' && proj && page.menu_id == 'wiki') {
56
63
  el += '<widget class="widget-wrapper logo-wrap wiki"><div class="widget-body">';
57
64
  // all products
58
- el += '<a style="filter: grayscale(100%)" class="wiki-home cap" href="' + url_for(config.wiki_dir) + '">';
65
+ el += '<a style="filter: grayscale(100%)" class="wiki-home cap" href="' + url_for(theme.site_tree.wiki.base_dir) + '">';
59
66
  el += '<svg aria-hidden="true" viewBox="0 0 16 16" width="1.2em" height="1.2em" fill="currentColor"><path fill-rule="evenodd" d="M7.78 12.53a.75.75 0 01-1.06 0L2.47 8.28a.75.75 0 010-1.06l4.25-4.25a.75.75 0 011.06 1.06L4.81 7h7.44a.75.75 0 010 1.5H4.81l2.97 2.97a.75.75 0 010 1.06z"></path></svg>';
60
67
  el += __('btn.all_wiki');
61
68
  el += '</a>';
62
69
  // this product
63
70
  if (proj == undefined) {
64
71
  // 如果没有项目名,则使用menu中显示的名字
65
- if (page.menu_id && theme.sidebar.menu[page.menu_id] && md_link(theme.sidebar.menu[page.menu_id])) {
72
+ if (page.menu_id && theme.menu[page.menu_id] && md_link(theme.menu[page.menu_id])) {
66
73
  proj = {
67
- path: md_link(theme.sidebar.menu[page.menu_id]),
68
- wiki: __(md_text(theme.sidebar.menu[page.menu_id]))
74
+ path: md_link(theme.menu[page.menu_id]),
75
+ wiki: __(md_text(theme.menu[page.menu_id]))
69
76
  };
70
77
  }
71
78
  }
@@ -134,6 +141,7 @@ function layoutFooterDiv() {
134
141
  return '';
135
142
  }
136
143
  }
144
+
137
145
  %>
138
146
  <% if (page.header == undefined || page.header == 'left' || page.header == 'auto') { %>
139
147
  <%- partial('header', {where: 'sidebar'}) %>