hexo-theme-stellar 1.44.0 → 2.0.0-rc.2
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.
- package/CHANGELOG.md +63 -5
- package/CONTRIBUTING.md +29 -120
- package/README.md +66 -73
- package/README_EN.md +66 -73
- package/_config.yml +890 -743
- package/_data/icons.yml +43 -171
- package/_data/widgets.yml +1 -1
- package/assets/icon-v2-x512.webp +0 -0
- package/languages/en.yml +59 -2
- package/languages/zh-CN.yml +59 -2
- package/languages/zh-TW.yml +59 -2
- package/layout/404.ejs +7 -4
- package/layout/_partial/comments/artalk/layout.ejs +3 -2
- package/layout/_partial/comments/beaudar/layout.ejs +2 -2
- package/layout/_partial/comments/giscus/layout.ejs +2 -5
- package/layout/_partial/comments/layout.ejs +11 -40
- package/layout/_partial/comments/twikoo/layout.ejs +3 -2
- package/layout/_partial/comments/utterances/layout.ejs +2 -2
- package/layout/_partial/comments/waline/layout.ejs +3 -2
- package/layout/_partial/components/collection-item.ejs +30 -13
- package/layout/_partial/components/collection.ejs +2 -2
- package/layout/_partial/cover/index.ejs +5 -2
- package/layout/_partial/cover/wiki_cover.ejs +39 -28
- package/layout/_partial/dropdown.ejs +26 -14
- package/layout/_partial/head.ejs +96 -69
- package/layout/_partial/main/article/contributors.ejs +12 -9
- package/layout/_partial/main/article/post_footer.ejs +47 -0
- package/layout/_partial/main/article/post_read_next.ejs +22 -0
- package/layout/_partial/main/article/post_related.ejs +14 -0
- package/layout/_partial/main/article/post_tags.ejs +12 -0
- package/layout/_partial/main/article/share.ejs +55 -0
- package/layout/_partial/main/footer.ejs +11 -10
- package/layout/_partial/main/{navbar/nav_tabs_blog.ejs → listing_nav/blog.ejs} +21 -18
- package/layout/_partial/main/listing_nav/wiki.ejs +56 -0
- package/layout/_partial/main/navbar/article_banner.ejs +39 -35
- package/layout/_partial/main/navbar/breadcrumb/blog.ejs +15 -28
- package/layout/_partial/main/navbar/breadcrumb/note.ejs +12 -5
- package/layout/_partial/main/navbar/breadcrumb/wiki.ejs +15 -11
- package/layout/_partial/main/navbar/dateinfo.ejs +28 -12
- package/layout/_partial/main/navbar/ghinfo.ejs +5 -3
- package/layout/_partial/main/notebook/note_card.ejs +12 -17
- package/layout/_partial/main/notebook/note_tags.ejs +3 -4
- package/layout/_partial/main/notebook/notebook_card.ejs +11 -4
- package/layout/_partial/main/pin_slider.ejs +48 -43
- package/layout/_partial/main/post_list/archive_item.ejs +8 -4
- package/layout/_partial/main/post_list/latest_post_card.ejs +10 -4
- package/layout/_partial/main/post_list/post_card.ejs +39 -90
- package/layout/_partial/main/post_list/topic_card.ejs +7 -5
- package/layout/_partial/main/post_list/wiki_card.ejs +16 -13
- package/layout/_partial/menubtn.ejs +3 -3
- package/layout/_partial/primitives/item.ejs +8 -0
- package/layout/_partial/primitives/navigation.ejs +17 -0
- package/layout/_partial/primitives/region.ejs +16 -0
- package/layout/_partial/primitives/section.ejs +8 -0
- package/layout/_partial/primitives/shell.ejs +35 -0
- package/layout/_partial/regions/widgets.ejs +84 -0
- package/layout/_partial/scripts/defines.ejs +46 -76
- package/layout/_partial/scripts/runtime.ejs +55 -0
- package/layout/_partial/scripts.ejs +18 -42
- package/layout/_partial/search/dialog.ejs +33 -0
- package/layout/_partial/search/shortcut.ejs +1 -0
- package/layout/_partial/sidebar/brand.ejs +127 -0
- package/layout/_partial/sidebar/menu.ejs +59 -14
- package/layout/_partial/sidebar/search.ejs +58 -41
- package/layout/_partial/widgets/actions.ejs +25 -0
- package/layout/_partial/widgets/author.ejs +9 -5
- package/layout/_partial/widgets/components/linklist.ejs +1 -2
- package/layout/_partial/widgets/ghissues.ejs +7 -10
- package/layout/_partial/widgets/ghrepo.ejs +23 -16
- package/layout/_partial/widgets/ghuser.ejs +3 -3
- package/layout/_partial/widgets/recent.ejs +25 -21
- package/layout/_partial/widgets/related.ejs +25 -34
- package/layout/_partial/widgets/settings.ejs +17 -0
- package/layout/_partial/widgets/tagtree.ejs +18 -10
- package/layout/_partial/widgets/toc.ejs +17 -9
- package/layout/_partial/widgets/tree.ejs +12 -13
- package/layout/archive.ejs +20 -13
- package/layout/categories.ejs +4 -3
- package/layout/collection-preview.ejs +8 -9
- package/layout/index.ejs +32 -43
- package/layout/index_topic.ejs +6 -13
- package/layout/index_wiki.ejs +17 -34
- package/layout/layout.ejs +195 -65
- package/layout/notebooks.ejs +3 -3
- package/layout/notes.ejs +4 -4
- package/layout/page.ejs +95 -50
- package/layout/settings.ejs +109 -0
- package/layout/tags.ejs +4 -3
- package/{THIRD-PARTY-NOTICES.md → legal/THIRD-PARTY-NOTICES.md} +8 -4
- package/package.json +28 -6
- package/scripts/commands/stellar.js +55 -0
- package/scripts/events/index.js +15 -9
- package/scripts/events/lib/authors.js +9 -7
- package/scripts/events/lib/config-hot-reload.js +65 -0
- package/scripts/events/lib/config-schema.js +20 -0
- package/scripts/events/lib/config.js +22 -63
- package/scripts/events/lib/content-config.js +5 -0
- package/scripts/events/lib/doc_tree.js +99 -9
- package/scripts/events/lib/links.js +6 -3
- package/scripts/events/lib/notebooks.js +200 -8
- package/scripts/events/lib/utils.js +4 -4
- package/scripts/events/lib/version-check.js +57 -3
- package/scripts/filters/index.js +2 -27
- package/scripts/filters/lib/img_lazyload.js +4 -126
- package/scripts/filters/lib/img_onerror.js +14 -17
- package/scripts/filters/lib/page-view-model.js +152 -0
- package/scripts/generators/404.js +13 -8
- package/scripts/generators/author.js +16 -11
- package/scripts/generators/notebooks.js +68 -39
- package/scripts/generators/search.js +62 -67
- package/scripts/generators/settings.js +43 -0
- package/scripts/generators/stellar-icons.js +13 -5
- package/scripts/generators/topic.js +24 -13
- package/scripts/generators/wiki.js +49 -21
- package/scripts/helpers/ai_label.js +6 -12
- package/scripts/helpers/brand.js +17 -0
- package/scripts/helpers/browser_runtime_manifest.js +12 -0
- package/scripts/helpers/caption.js +8 -0
- package/scripts/helpers/category_color.js +13 -13
- package/scripts/helpers/collection.js +18 -0
- package/scripts/helpers/comments_model.js +14 -0
- package/scripts/helpers/extension_assets.js +8 -0
- package/scripts/helpers/json_ld.js +16 -7
- package/scripts/helpers/mdrender.js +3 -9
- package/scripts/helpers/menu.js +9 -0
- package/scripts/helpers/post_view_model.js +23 -0
- package/scripts/helpers/regions.js +37 -0
- package/scripts/helpers/scrollreveal.js +7 -7
- package/scripts/helpers/search_domain.js +34 -0
- package/scripts/helpers/service_provider.js +9 -0
- package/scripts/helpers/settings.js +16 -0
- package/scripts/helpers/share_action.js +8 -0
- package/scripts/helpers/stellar_config.js +12 -0
- package/scripts/helpers/stellar_data.js +8 -0
- package/scripts/helpers/stellar_info.js +21 -16
- package/scripts/helpers/stellar_inject.js +9 -0
- package/scripts/helpers/ui_classes.js +12 -0
- package/scripts/lib/ai_label.js +14 -11
- package/scripts/lib/brand.js +41 -0
- package/scripts/lib/browser-runtime.js +115 -0
- package/scripts/lib/caption.js +21 -0
- package/scripts/lib/collection-pipeline/adapters/notebook.js +62 -0
- package/scripts/lib/collection-pipeline/adapters/post.js +20 -0
- package/scripts/lib/collection-pipeline/adapters/topic.js +82 -0
- package/scripts/lib/collection-pipeline/adapters/wiki.js +20 -0
- package/scripts/lib/collection-pipeline/index.js +169 -0
- package/scripts/lib/collection-pipeline/registry.js +27 -0
- package/scripts/lib/collection-pipeline/shared.js +164 -0
- package/scripts/lib/comments.js +60 -0
- package/scripts/lib/config-inject.js +20 -0
- package/scripts/lib/config-schema.js +1095 -0
- package/scripts/lib/content-config.js +157 -0
- package/scripts/lib/content-defaults.js +56 -0
- package/scripts/lib/content-membership.js +233 -0
- package/scripts/lib/contribution-contract.js +165 -0
- package/scripts/lib/contribution-registry.js +429 -0
- package/scripts/lib/doc_tree.js +46 -44
- package/scripts/lib/doctor.js +296 -0
- package/scripts/lib/front-matter.js +29 -0
- package/scripts/lib/hero-effect-registry.js +262 -0
- package/scripts/lib/html-images.js +128 -0
- package/scripts/lib/internal-constants.js +152 -0
- package/scripts/lib/layout-config.js +62 -0
- package/scripts/lib/mdrender_html.js +36 -23
- package/scripts/lib/menu.js +36 -0
- package/scripts/lib/model-schema.js +90 -0
- package/scripts/lib/models/index.js +1542 -0
- package/scripts/lib/new-note.js +172 -0
- package/scripts/lib/page-view-model-registry.js +103 -0
- package/scripts/lib/regions.js +132 -0
- package/scripts/lib/runtime-data.js +23 -0
- package/scripts/lib/safe-path.js +44 -0
- package/scripts/lib/search-domain.js +59 -0
- package/scripts/lib/seo.js +10 -10
- package/scripts/lib/service-provider.js +12 -0
- package/scripts/lib/settings.js +16 -0
- package/scripts/lib/share-services.js +96 -0
- package/scripts/lib/source-config.js +27 -0
- package/scripts/lib/theme-metadata.js +22 -0
- package/scripts/lib/ui-capabilities.js +32 -0
- package/scripts/lib/widget-registry.js +150 -0
- package/scripts/lib/wiki_readme.js +15 -11
- package/scripts/schema/config-rules.js +290 -0
- package/scripts/schema/config-schema.js +163 -0
- package/scripts/schema/content-config-rules.js +264 -0
- package/scripts/schema/content-config-schema.js +321 -0
- package/scripts/schema/model-schema.js +971 -0
- package/scripts/schema/schema-utils.js +48 -0
- package/scripts/tags/index.js +2 -3
- package/scripts/tags/lib/albums.js +6 -6
- package/scripts/tags/lib/banner.js +10 -4
- package/scripts/tags/lib/box.js +1 -1
- package/scripts/tags/lib/button.js +1 -1
- package/scripts/tags/lib/chat.js +9 -31
- package/scripts/tags/lib/checkbox.js +6 -1
- package/scripts/tags/lib/copy.js +4 -1
- package/scripts/tags/lib/dropdown.js +6 -4
- package/scripts/tags/lib/emoji.js +5 -10
- package/scripts/tags/lib/friends.js +4 -4
- package/scripts/tags/lib/gallery.js +7 -7
- package/scripts/tags/lib/ghcard.js +5 -3
- package/scripts/tags/lib/gist.js +16 -0
- package/scripts/tags/lib/grid.js +4 -2
- package/scripts/tags/lib/hashtag.js +1 -1
- package/scripts/tags/lib/icon.js +1 -1
- package/scripts/tags/lib/image.js +1 -1
- package/scripts/tags/lib/link.js +6 -3
- package/scripts/tags/lib/mark.js +8 -3
- package/scripts/tags/lib/md.js +1 -1
- package/scripts/tags/lib/note.js +1 -1
- package/scripts/tags/lib/okr.js +18 -1
- package/scripts/tags/lib/posters.js +6 -6
- package/scripts/tags/lib/quot.js +15 -5
- package/scripts/tags/lib/rating.js +7 -4
- package/scripts/tags/lib/sites.js +8 -6
- package/scripts/tags/lib/tip.js +6 -6
- package/scripts/tags/lib/toc.js +2 -2
- package/scripts/tags/lib/vote.js +8 -5
- package/source/css/_appearances/_mixins.styl +258 -0
- package/source/css/_appearances/card.styl +30 -0
- package/source/css/_appearances/flat.styl +44 -0
- package/source/css/_appearances/glass.styl +138 -0
- package/source/css/_appearances/minimal.styl +325 -0
- package/source/css/_common/base.styl +5 -9
- package/source/css/_common/blockquote.styl +0 -1
- package/source/css/_common/button.styl +1 -1
- package/source/css/_common/device.styl +24 -42
- package/source/css/_common/dropdown.styl +20 -14
- package/source/css/_common/highlight.styl +5 -12
- package/source/css/_common/icon.styl +38 -0
- package/source/css/_common/input.styl +33 -0
- package/source/css/_common/loading.styl +2 -2
- package/source/css/_common/svg.styl +0 -8
- package/source/css/_components/collection.styl +21 -64
- package/source/css/_components/layout.styl +524 -84
- package/source/css/_components/list.styl +36 -22
- package/source/css/_components/main.styl +16 -19
- package/source/css/_components/md.styl +8 -13
- package/source/css/_components/pages/article-indent.styl +1 -1
- package/source/css/_components/pages/article-story.styl +7 -6
- package/source/css/_components/pages/article-tech.styl +5 -5
- package/source/css/_components/pages/collection-preview.styl +1 -5
- package/source/css/_components/pages/settings.styl +184 -0
- package/source/css/_components/partial/article-banner.styl +2 -2
- package/source/css/_components/partial/article-footer.styl +0 -32
- package/source/css/_components/partial/article-share.styl +48 -0
- package/source/css/_components/partial/article-tags.styl +1 -1
- package/source/css/_components/partial/cover.styl +13 -13
- package/source/css/_components/partial/listing-nav.styl +68 -0
- package/source/css/_components/partial/paginator.styl +1 -1
- package/source/css/_components/pin-slider.styl +3 -3
- package/source/css/_components/sidebar/brand.styl +135 -0
- package/source/css/_components/sidebar/footer.styl +14 -31
- package/source/css/_components/sidebar/nav-area.styl +4 -0
- package/source/css/_components/sidebar/search.styl +176 -26
- package/source/css/_components/sidebar/sidebar.styl +76 -110
- package/source/css/_components/tag-plugins/banner.styl +16 -28
- package/source/css/_components/tag-plugins/checkbox.styl +7 -22
- package/source/css/_components/tag-plugins/copy.styl +3 -5
- package/source/css/_components/tag-plugins/gallery.styl +2 -2
- package/source/css/_components/tag-plugins/grid.styl +3 -0
- package/source/css/_components/tag-plugins/image.styl +2 -1
- package/source/css/_components/tag-plugins/link.styl +0 -1
- package/source/css/_components/tag-plugins/mark.styl +19 -4
- package/source/css/_components/tag-plugins/mdrender.styl +2 -2
- package/source/css/_components/tag-plugins/navbar.styl +23 -17
- package/source/css/_components/tag-plugins/note.styl +2 -2
- package/source/css/_components/tag-plugins/okr.styl +1 -2
- package/source/css/_components/tag-plugins/quot.styl +5 -0
- package/source/css/_components/tag-plugins/rating.styl +3 -2
- package/source/css/_components/tag-plugins/timeline.styl +1 -1
- package/source/css/_components/tag-plugins/tip.styl +1 -1
- package/source/css/_components/tag-plugins/vote.styl +3 -2
- package/source/css/_components/widgets/ghrepo.styl +2 -1
- package/source/css/_components/widgets/ghuser.styl +4 -6
- package/source/css/_components/widgets/settings.styl +49 -0
- package/source/css/_components/widgets/timeline.styl +2 -2
- package/source/css/_components/widgets/toc.styl +12 -33
- package/source/css/_components/widgets/widgets.styl +14 -19
- package/source/css/_components/wiki-card.styl +2 -2
- package/source/css/_custom.styl +26 -32
- package/source/css/_defines/func.styl +47 -37
- package/source/css/_defines/theme_base.styl +8 -10
- package/source/css/_plugins/card-hover.styl +1 -1
- package/source/css/_plugins/copycode.styl +16 -19
- package/source/css/_plugins/index.styl +3 -8
- package/source/css/_plugins/lazyload.styl +1 -1
- package/source/css/main.styl +12 -0
- package/source/js/main.js +302 -59
- package/source/js/plugins/adaptive-text.js +33 -16
- package/source/js/plugins/card-hover.js +2 -24
- package/source/js/plugins/copycode.js +10 -16
- package/source/js/plugins/voice.js +51 -48
- package/source/js/profile.js +316 -0
- package/source/js/runtime/asset-loader.js +61 -0
- package/source/js/runtime/extension-registry.js +149 -0
- package/source/js/runtime/extensions/card-hover.js +5 -0
- package/source/js/runtime/extensions/color-scheme-switch.js +101 -0
- package/source/js/runtime/extensions/comments.js +200 -0
- package/source/js/runtime/extensions/deferred-icons.js +53 -0
- package/source/js/{plugins → runtime/extensions}/dropdown.js +69 -30
- package/source/js/runtime/extensions/feature.js +200 -0
- package/source/js/runtime/extensions/hero-effect.js +179 -0
- package/source/js/runtime/extensions/reveal.js +80 -0
- package/source/js/runtime/extensions/search.js +23 -0
- package/source/js/{services.js → runtime/extensions/services.js} +67 -54
- package/source/js/runtime/extensions/settings.js +235 -0
- package/source/js/runtime/hero-effects/ferrofluid.js +385 -0
- package/source/js/{plugins → runtime/hero-effects}/galaxy.js +53 -177
- package/source/js/runtime/hero-effects/light-rays.js +293 -0
- package/source/js/runtime/index.js +75 -0
- package/source/js/runtime/legacy-request-adapter.js +47 -0
- package/source/js/runtime/request-cache.js +219 -0
- package/source/js/search/algolia-search.js +76 -51
- package/source/js/search/highlight.js +1 -1
- package/source/js/search/local-search.js +96 -57
- package/source/js/search/shortcut.js +31 -20
- package/source/js/services/friends_and_posts.js +6 -1
- package/source/js/services/rating.js +14 -6
- package/source/js/services/siteinfo.js +3 -7
- package/source/js/services/timeline.js +1 -1
- package/source/js/services/vote.js +7 -5
- package/source/js/services/weibo.js +1 -1
- package/source/js/utils.js +19 -444
- package/.claude/skills/stellar-theme-dev/SKILL.md +0 -51
- package/_data/chat_users.yml +0 -0
- package/layout/_partial/comments/artalk/script.ejs +0 -76
- package/layout/_partial/comments/beaudar/script.ejs +0 -33
- package/layout/_partial/comments/giscus/script.ejs +0 -31
- package/layout/_partial/comments/script.ejs +0 -3
- package/layout/_partial/comments/twikoo/script.ejs +0 -25
- package/layout/_partial/comments/utterances/script.ejs +0 -33
- package/layout/_partial/comments/waline/script.ejs +0 -43
- package/layout/_partial/main/article/article_footer.ejs +0 -164
- package/layout/_partial/main/article/article_tags.ejs +0 -16
- package/layout/_partial/main/article/read_next.ejs +0 -63
- package/layout/_partial/main/article/related_posts.ejs +0 -16
- package/layout/_partial/main/navbar/nav_tabs_wiki.ejs +0 -52
- package/layout/_partial/scripts/bootstrap.ejs +0 -37
- package/layout/_partial/scripts/lazyload.ejs +0 -89
- package/layout/_partial/sidebar/grad-def.ejs +0 -26
- package/layout/_partial/sidebar/index_leftbar.ejs +0 -191
- package/layout/_partial/sidebar/index_rightbar.ejs +0 -94
- package/layout/_partial/sidebar/logo.ejs +0 -99
- package/layout/_plugins/adaptive_text.ejs +0 -11
- package/layout/_plugins/card_hover.ejs +0 -32
- package/layout/_plugins/copycode.ejs +0 -17
- package/layout/_plugins/fancybox.ejs +0 -53
- package/layout/_plugins/heti.ejs +0 -21
- package/layout/_plugins/index.ejs +0 -50
- package/layout/_plugins/mathjax.ejs +0 -49
- package/layout/_plugins/mermaid.ejs +0 -33
- package/layout/_plugins/preload.ejs +0 -9
- package/layout/_plugins/scrollreveal.ejs +0 -102
- package/layout/_plugins/search/algolia_search.ejs +0 -12
- package/layout/_plugins/search/local_search.ejs +0 -9
- package/layout/_plugins/swiper.ejs +0 -27
- package/layout/_plugins/tianli_gpt.ejs +0 -14
- package/scripts/commands/new-note.js +0 -49
- package/scripts/events/lib/merge_posts.js +0 -48
- package/scripts/events/lib/topic_tree.js +0 -48
- package/scripts/helpers/related_posts.js +0 -51
- package/scripts/helpers/subtitle.js +0 -8
- package/scripts/lib/notebooks.js +0 -181
- package/scripts/lib/subtitle.js +0 -28
- package/scripts/tags/lib/about.js +0 -48
- package/source/css/_components/page-transition.styl +0 -22
- package/source/css/_components/partial/navbar.styl +0 -51
- package/source/css/_components/sidebar/logo.styl +0 -111
- package/source/css/_components/tag-plugins/about.styl +0 -56
- package/source/css/_components/widgets/tree.styl +0 -0
- package/source/css/_plugins/scrollreveal.styl +0 -6
- package/source/css/_plugins/tianli_gpt.styl +0 -213
- package/source/css/plugins/mermaid.styl +0 -137
- package/source/js/icons.js +0 -60
- package/source/js/services/fcircle.js +0 -35
- package/source/js/theme.js +0 -61
package/package.json
CHANGED
|
@@ -1,12 +1,20 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "hexo-theme-stellar",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "2.0.0-rc.2",
|
|
4
|
+
"description": "An all-in-one Hexo theme for blogs, project documentation, knowledge bases, series, and notebooks.",
|
|
5
5
|
"main": "package.json",
|
|
6
6
|
"scripts": {
|
|
7
7
|
"lint": "eslint .",
|
|
8
|
-
"test": "node ci/check-require-decls.js && node --test && node ci/check-
|
|
9
|
-
"
|
|
8
|
+
"test:unit": "node ci/check-require-decls.js && npm run reuse:check && node --test && node ci/check-agent-docs.js",
|
|
9
|
+
"test": "npm run test:unit && npm run contributions:check",
|
|
10
|
+
"reuse:check": "node ci/check-reuse-contracts.js",
|
|
11
|
+
"contributions:check": "node ci/check-contributions.js",
|
|
12
|
+
"knowledge:check": "node ci/check-knowledge.js",
|
|
13
|
+
"integration:check": "node ci/check-package-integration.js",
|
|
14
|
+
"acceptance:prepare": "node ci/check-package-integration.js --prepare",
|
|
15
|
+
"performance:check": "node ci/check-performance.js",
|
|
16
|
+
"check": "npm run lint && npm test",
|
|
17
|
+
"release:check": "npm run check && npm run integration:check && npm run performance:check && npm run knowledge:check",
|
|
10
18
|
"release": "node release.js",
|
|
11
19
|
"release:dry": "node release.js --dry-run"
|
|
12
20
|
},
|
|
@@ -16,20 +24,34 @@
|
|
|
16
24
|
},
|
|
17
25
|
"keywords": [
|
|
18
26
|
"hexo",
|
|
27
|
+
"hexo-theme",
|
|
19
28
|
"theme",
|
|
20
|
-
"stellar"
|
|
29
|
+
"stellar",
|
|
30
|
+
"blog",
|
|
31
|
+
"wiki",
|
|
32
|
+
"documentation",
|
|
33
|
+
"knowledge-base",
|
|
34
|
+
"notebook"
|
|
21
35
|
],
|
|
22
|
-
"author":
|
|
36
|
+
"author": {
|
|
37
|
+
"name": "xaoxuu",
|
|
38
|
+
"url": "https://github.com/xaoxuu/"
|
|
39
|
+
},
|
|
23
40
|
"license": "MIT",
|
|
41
|
+
"engines": {
|
|
42
|
+
"node": ">=22"
|
|
43
|
+
},
|
|
24
44
|
"bugs": {
|
|
25
45
|
"url": "https://github.com/xaoxuu/hexo-theme-stellar/issues/"
|
|
26
46
|
},
|
|
27
47
|
"dependencies": {
|
|
28
48
|
"cheerio": "^1.1.0",
|
|
29
49
|
"glob": "^10.4.0",
|
|
50
|
+
"hexo-front-matter": "^4.2.1",
|
|
30
51
|
"hexo-renderer-ejs": "^2.0.0",
|
|
31
52
|
"hexo-renderer-stylus": "^3.0.1",
|
|
32
53
|
"hexo-pagination": "^3.0.0",
|
|
54
|
+
"js-yaml": "^4.1.0",
|
|
33
55
|
"probe-image-size": "^7.2.3"
|
|
34
56
|
},
|
|
35
57
|
"homepage": "https://xaoxuu.com/wiki/stellar/",
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/* global hexo */
|
|
2
|
+
"use strict";
|
|
3
|
+
|
|
4
|
+
const { formatDoctorJson, formatDoctorText, runDoctor } = require("../lib/doctor");
|
|
5
|
+
const { buildNewNotePlan, formatNewNotePlan, writeNewNotePlan } = require("../lib/new-note");
|
|
6
|
+
|
|
7
|
+
function hexoVersion(ctx) {
|
|
8
|
+
try {
|
|
9
|
+
const file = require.resolve("hexo/package.json", { paths: [ctx.base_dir] });
|
|
10
|
+
return require(file).version;
|
|
11
|
+
} catch (error) {
|
|
12
|
+
return String(ctx.version || "");
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
hexo.extend.console.register("stellar", "Diagnose and author a Stellar v2 site.", {
|
|
17
|
+
usage: "<doctor|new note> [options]",
|
|
18
|
+
commands: [
|
|
19
|
+
{ name: "doctor", desc: "Validate the environment and v2 configuration." },
|
|
20
|
+
{ name: "new note", desc: "Create a Note in a known Notebook." }
|
|
21
|
+
],
|
|
22
|
+
options: [
|
|
23
|
+
{ name: "--dry-run", desc: "Print the new note plan without writing files." },
|
|
24
|
+
{ name: "--format <text|json>", desc: "Doctor output format; use Hexo global --silent with JSON." },
|
|
25
|
+
{ name: "--notebook <id>", desc: "Notebook id for stellar new note." },
|
|
26
|
+
{ name: "--title <title>", desc: "Note title and filename for stellar new note." },
|
|
27
|
+
{ name: "--tags <tags>", desc: "Comma-separated Note tags." }
|
|
28
|
+
]
|
|
29
|
+
}, async function (args) {
|
|
30
|
+
const subcommand = args._[0];
|
|
31
|
+
if (subcommand === "doctor") {
|
|
32
|
+
const format = args.format || "text";
|
|
33
|
+
if (!["text", "json"].includes(format)) throw new Error("--format 必须是 text 或 json");
|
|
34
|
+
const result = runDoctor({ baseDir: this.base_dir, hexoVersion: hexoVersion(this) });
|
|
35
|
+
console.log(format === "json" ? formatDoctorJson(result) : formatDoctorText(result));
|
|
36
|
+
if (!result.ok) process.exitCode = 1;
|
|
37
|
+
return result;
|
|
38
|
+
}
|
|
39
|
+
if (subcommand === "new" && args._[1] === "note") {
|
|
40
|
+
const plan = buildNewNotePlan({
|
|
41
|
+
baseDir: this.base_dir,
|
|
42
|
+
sourceDir: this.source_dir,
|
|
43
|
+
notebook: args.notebook,
|
|
44
|
+
title: args.title,
|
|
45
|
+
tags: args.tags
|
|
46
|
+
});
|
|
47
|
+
console.log(formatNewNotePlan(plan, { dryRun: args.dryRun }));
|
|
48
|
+
if (!args.dryRun) {
|
|
49
|
+
writeNewNotePlan(plan);
|
|
50
|
+
console.log(`Created ${plan.outputPath}`);
|
|
51
|
+
}
|
|
52
|
+
return plan;
|
|
53
|
+
}
|
|
54
|
+
throw new Error("Usage: hexo stellar <doctor|new note>");
|
|
55
|
+
});
|
package/scripts/events/index.js
CHANGED
|
@@ -2,38 +2,44 @@
|
|
|
2
2
|
|
|
3
3
|
'use strict';
|
|
4
4
|
|
|
5
|
+
require('./lib/config-hot-reload').registerConfigHotReload(hexo);
|
|
6
|
+
|
|
5
7
|
hexo.on('generateBefore', () => {
|
|
6
8
|
// 页面路径归一化:xxx.html → xxx/,必须先于所有读取 page.path 的逻辑
|
|
7
9
|
require('./lib/path_normalize')(hexo);
|
|
10
|
+
// v2 声明式配置必须先于所有主题配置消费方完成解析。
|
|
11
|
+
require('./lib/config-schema')(hexo);
|
|
8
12
|
// Merge config.
|
|
9
13
|
require('./lib/config')(hexo);
|
|
10
14
|
require('./lib/links')(hexo);
|
|
11
15
|
require('./lib/authors')(hexo);
|
|
12
|
-
require('./lib/doc_tree')(hexo);
|
|
13
|
-
require('./lib/topic_tree')(hexo);
|
|
14
16
|
require('./lib/utils')(hexo);
|
|
15
|
-
require('./lib/notebooks')(hexo);
|
|
16
17
|
});
|
|
17
18
|
|
|
18
|
-
hexo.
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
hexo.extend.filter.register("before_generate", () => {
|
|
20
|
+
// locals 已失效并从完整 source 库重建;单一 Pipeline 依次完成配置解析、
|
|
21
|
+
// 内容发现、归属、Collection 状态、两阶段 ViewModel、聚合与路由投影。
|
|
22
|
+
require("../lib/collection-pipeline").runCollectionPipeline(hexo);
|
|
23
|
+
}, 1);
|
|
21
24
|
|
|
22
25
|
hexo.on('ready', () => {
|
|
23
26
|
if (process.env.HEXO_READY === '1') return;
|
|
24
27
|
process.env.HEXO_READY = '1';
|
|
28
|
+
// `hexo stellar doctor --format json --silent` 必须保持 stdout 为单一 JSON 文档;
|
|
29
|
+
// init/doctor 不需要常规浏览/构建命令的欢迎信息和版本联网检查。
|
|
30
|
+
if (hexo.env?.cmd === 'stellar') return;
|
|
25
31
|
const isClean = ['cl', 'clean'].some(arg => process.argv.includes(arg));
|
|
26
32
|
if (isClean) {
|
|
27
33
|
return;
|
|
28
34
|
}
|
|
29
|
-
const { version, homepage, repository } = require(
|
|
35
|
+
const { version, homepage, repository } = require("../lib/theme-metadata");
|
|
30
36
|
console.log(``);
|
|
31
37
|
|
|
32
38
|
const line = '------------------------------------------------';
|
|
33
39
|
hexo.log.info(line);
|
|
34
40
|
hexo.log.info(`Welcome to \x1b[33mStellar ${version}\x1b[0m
|
|
35
41
|
\x1b[32mDOCS\x1b[0m ${homepage}
|
|
36
|
-
\x1b[32mREPO\x1b[0m ${repository
|
|
42
|
+
\x1b[32mREPO\x1b[0m ${repository}`);
|
|
37
43
|
hexo.log.info(line);
|
|
38
44
|
console.log(``);
|
|
39
45
|
// version check
|
|
@@ -54,7 +60,7 @@ hexo.extend.filter.register('before_generate', async () => {
|
|
|
54
60
|
hasRun = true;
|
|
55
61
|
|
|
56
62
|
// 读取主题配置开关
|
|
57
|
-
const enabled = hexo.
|
|
63
|
+
const enabled = hexo.stellar.config.features.lazyLoading.autoAspectRatio === true;
|
|
58
64
|
|
|
59
65
|
const generateImageRatios = require('./lib/get_image_ratios');
|
|
60
66
|
const fixMarkdownImages = require('./lib/fix_image_tags');
|
|
@@ -2,11 +2,14 @@
|
|
|
2
2
|
* authors.js v2 | https://github.com/xaoxuu/hexo-theme-stellar/
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
"use strict";
|
|
6
|
+
|
|
7
|
+
const { profilePath, requireLayoutProfiles } = require("../../lib/layout-config");
|
|
8
|
+
const { ensureRuntimeData } = require("../../lib/runtime-data");
|
|
6
9
|
|
|
7
10
|
module.exports = ctx => {
|
|
8
11
|
var authors = ctx.locals.get('data').authors || {}
|
|
9
|
-
let basePath = ctx.
|
|
12
|
+
let basePath = profilePath(requireLayoutProfiles(ctx.stellar?.config).author.path);
|
|
10
13
|
// url
|
|
11
14
|
for (let key of Object.keys(authors)) {
|
|
12
15
|
let author = authors[key]
|
|
@@ -14,8 +17,7 @@ module.exports = ctx => {
|
|
|
14
17
|
}
|
|
15
18
|
// default author
|
|
16
19
|
const keys = Object.keys(authors)
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
}
|
|
20
|
+
const runtimeData = ensureRuntimeData(ctx);
|
|
21
|
+
runtimeData.defaultAuthor = keys.length > 0 ? authors[keys[0]] : null;
|
|
22
|
+
runtimeData.authors = authors;
|
|
23
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/* global hexo */
|
|
2
|
+
"use strict";
|
|
3
|
+
|
|
4
|
+
const fs = require("node:fs");
|
|
5
|
+
const path = require("node:path");
|
|
6
|
+
|
|
7
|
+
const { parseStellarConfig } = require("../../lib/config-schema");
|
|
8
|
+
|
|
9
|
+
const CONFIG_FILENAME = "_config.stellar.yml";
|
|
10
|
+
|
|
11
|
+
function registerConfigHotReload(ctx, options = {}) {
|
|
12
|
+
const watchFile = options.watchFile || fs.watchFile;
|
|
13
|
+
const unwatchFile = options.unwatchFile || fs.unwatchFile;
|
|
14
|
+
const existsSync = options.existsSync || fs.existsSync;
|
|
15
|
+
const runtime = options.runtime || process;
|
|
16
|
+
const debounceMs = Number.isInteger(options.debounceMs) ? options.debounceMs : 100;
|
|
17
|
+
const interval = Number.isInteger(options.interval) ? options.interval : 250;
|
|
18
|
+
const configPath = path.join(ctx.base_dir, CONFIG_FILENAME);
|
|
19
|
+
let watching = false;
|
|
20
|
+
let timer;
|
|
21
|
+
let revision = 0;
|
|
22
|
+
|
|
23
|
+
async function reload(expectedRevision) {
|
|
24
|
+
try {
|
|
25
|
+
const themeConfig = existsSync(configPath)
|
|
26
|
+
? await ctx.render.render({ path: configPath }) || {}
|
|
27
|
+
: {};
|
|
28
|
+
parseStellarConfig({ source: CONFIG_FILENAME, themeConfig, mode: "recover" });
|
|
29
|
+
if (expectedRevision !== revision) return;
|
|
30
|
+
ctx.config.theme_config = themeConfig;
|
|
31
|
+
if (typeof ctx._watchBox !== "function") {
|
|
32
|
+
throw new TypeError("Hexo watcher 尚未初始化");
|
|
33
|
+
}
|
|
34
|
+
ctx.log.info(`Stellar: ${CONFIG_FILENAME} 已重载,正在重新生成。`);
|
|
35
|
+
ctx._watchBox();
|
|
36
|
+
} catch (error) {
|
|
37
|
+
if (expectedRevision !== revision) return;
|
|
38
|
+
ctx.log.warn(`Stellar: ${CONFIG_FILENAME} 重载失败,继续使用上一次有效配置。\n${error.message}`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function schedule() {
|
|
43
|
+
revision += 1;
|
|
44
|
+
const expectedRevision = revision;
|
|
45
|
+
clearTimeout(timer);
|
|
46
|
+
timer = setTimeout(() => reload(expectedRevision), debounceMs);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
ctx.on("server", () => {
|
|
50
|
+
if (watching) return;
|
|
51
|
+
watching = true;
|
|
52
|
+
watchFile(configPath, { interval, persistent: false }, schedule);
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
runtime.once("exit", () => {
|
|
56
|
+
clearTimeout(timer);
|
|
57
|
+
if (watching) unwatchFile(configPath, schedule);
|
|
58
|
+
watching = false;
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
module.exports = {
|
|
63
|
+
CONFIG_FILENAME,
|
|
64
|
+
registerConfigHotReload
|
|
65
|
+
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/* global hexo */
|
|
2
|
+
"use strict";
|
|
3
|
+
|
|
4
|
+
const { formatConfigWarnings, parseStellarConfig } = require("../../lib/config-schema");
|
|
5
|
+
|
|
6
|
+
module.exports = ctx => {
|
|
7
|
+
const hasSiteThemeConfig = ctx.config.theme_config !== undefined;
|
|
8
|
+
const source = hasSiteThemeConfig ? "_config.stellar.yml" : "themes/stellar/_config.yml";
|
|
9
|
+
const themeConfig = hasSiteThemeConfig ? ctx.config.theme_config : {};
|
|
10
|
+
ctx.stellar = ctx.stellar || {};
|
|
11
|
+
const issues = [];
|
|
12
|
+
ctx.stellar.config = parseStellarConfig({
|
|
13
|
+
source,
|
|
14
|
+
themeConfig,
|
|
15
|
+
mode: "recover",
|
|
16
|
+
onIssues: current => issues.push(...current)
|
|
17
|
+
});
|
|
18
|
+
const warning = formatConfigWarnings(issues);
|
|
19
|
+
if (warning) ctx.log.warn(warning);
|
|
20
|
+
};
|
|
@@ -1,76 +1,35 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
* https://github.com/next-theme/hexo-theme-next/blob/master/scripts/events/lib/config.js
|
|
4
|
-
* Volantis:
|
|
5
|
-
* https://github.com/volantis-x/hexo-theme-volantis/blob/master/scripts/events/lib/cdn.js
|
|
6
|
-
*/
|
|
1
|
+
/* global hexo */
|
|
2
|
+
"use strict";
|
|
7
3
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
const path = require('path')
|
|
4
|
+
const path = require("path");
|
|
5
|
+
const { ensureRuntimeData } = require("../../lib/runtime-data");
|
|
11
6
|
|
|
12
7
|
module.exports = ctx => {
|
|
8
|
+
// v2 内部 URL 策略:只支持无 index.html 与无 .html 尾缀的规范路径。
|
|
9
|
+
ctx.config.pretty_urls ||= {};
|
|
10
|
+
ctx.config.pretty_urls.trailing_index = false;
|
|
11
|
+
ctx.config.pretty_urls.trailing_html = false;
|
|
13
12
|
|
|
14
|
-
const
|
|
15
|
-
const
|
|
16
|
-
ctx.log.warn(`Since ${args[0]} is turned on, the ${args[1]} is disabled to avoid potential hazards.`)
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
if (system.override_pretty_urls !== false) {
|
|
20
|
-
// 强制修改 pretty_urls 配置项
|
|
21
|
-
ctx.config.pretty_urls.trailing_index = false
|
|
22
|
-
ctx.config.pretty_urls.trailing_html = false
|
|
23
|
-
}
|
|
13
|
+
const data = ctx.locals.get("data") || {};
|
|
14
|
+
const runtimeData = ensureRuntimeData(ctx);
|
|
24
15
|
|
|
25
|
-
if (cache && cache.enable && language_switcher) {
|
|
26
|
-
warning('language_switcher', 'caching')
|
|
27
|
-
cache.enable = false
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
if (cache && cache.enable && ctx.config.relative_link) {
|
|
31
|
-
warning('caching', '`relative_link` option in Hexo `_config.yml`')
|
|
32
|
-
ctx.config.relative_link = false
|
|
33
|
-
}
|
|
34
|
-
// ctx.config.meta_generator = false;
|
|
35
|
-
|
|
36
|
-
// merge data
|
|
37
|
-
const data = ctx.locals.get('data')
|
|
38
16
|
// merge widgets: 可覆盖删除的合并
|
|
39
|
-
|
|
17
|
+
const widgets = ctx.render.renderSync({ path: path.join(ctx.theme_dir, "_data/widgets.yml"), engine: "yaml" });
|
|
40
18
|
if (data.widgets) {
|
|
41
|
-
for (
|
|
42
|
-
|
|
43
|
-
if (widget == null || widget.length
|
|
44
|
-
|
|
45
|
-
|
|
19
|
+
for (const id of Object.keys(data.widgets)) {
|
|
20
|
+
const widget = data.widgets[id];
|
|
21
|
+
if (widget == null || widget.length === 0) {
|
|
22
|
+
delete widgets[id];
|
|
23
|
+
} else if (widgets[id] == null) {
|
|
24
|
+
widgets[id] = widget;
|
|
46
25
|
} else {
|
|
47
|
-
|
|
48
|
-
if (widgets[i] == null) {
|
|
49
|
-
widgets[i] = widget
|
|
50
|
-
} else {
|
|
51
|
-
// merge
|
|
52
|
-
for (let j of Object.keys(widget)) {
|
|
53
|
-
widgets[i][j] = widget[j]
|
|
54
|
-
}
|
|
55
|
-
}
|
|
26
|
+
Object.assign(widgets[id], widget);
|
|
56
27
|
}
|
|
57
28
|
}
|
|
58
29
|
}
|
|
59
|
-
|
|
30
|
+
runtimeData.widgets = widgets;
|
|
60
31
|
|
|
61
32
|
// merge icons: 简单覆盖合并
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
}
|
|
66
|
-
ctx.theme.config.icons = icons
|
|
67
|
-
|
|
68
|
-
// default menu
|
|
69
|
-
if (ctx.theme.config.menubar == undefined) {
|
|
70
|
-
ctx.theme.config.menubar = {}
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
// chat users
|
|
74
|
-
ctx.theme.config.chat_users = data.chat_users;
|
|
75
|
-
|
|
76
|
-
}
|
|
33
|
+
const themeIcons = ctx.render.renderSync({ path: path.join(ctx.theme_dir, "_data/icons.yml"), engine: "yaml" });
|
|
34
|
+
runtimeData.icons = Object.assign({}, themeIcons, data.icons || {});
|
|
35
|
+
};
|
|
@@ -2,19 +2,109 @@
|
|
|
2
2
|
* doc_tree.js v2 | https://github.com/xaoxuu/hexo-theme-stellar/
|
|
3
3
|
*
|
|
4
4
|
* Wiki 文档树构建入口:委托 scripts/lib/doc_tree.js 的纯函数,
|
|
5
|
-
*
|
|
5
|
+
* 将 Wiki 运行时树写入 ctx.stellar.data.wiki。
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
"use strict";
|
|
9
9
|
|
|
10
|
-
const {
|
|
10
|
+
const { getCollectionId } = require("../../lib/content-config");
|
|
11
|
+
const { buildWikiTree } = require("../../lib/doc_tree");
|
|
12
|
+
const { requireLayoutProfiles } = require("../../lib/layout-config");
|
|
13
|
+
const {
|
|
14
|
+
buildWikiListingRender,
|
|
15
|
+
buildWikiPageViewModelBase,
|
|
16
|
+
buildWikiRelated,
|
|
17
|
+
completeWikiPageViewModel
|
|
18
|
+
} = require("../../lib/models");
|
|
19
|
+
const { ensureRuntimeData } = require("../../lib/runtime-data");
|
|
20
|
+
const {
|
|
21
|
+
setProfileViewModelBase,
|
|
22
|
+
setProfileViewModelInput
|
|
23
|
+
} = require("../../lib/page-view-model-registry");
|
|
24
|
+
const { sourcePathForData } = require("../../lib/source-config");
|
|
25
|
+
|
|
26
|
+
function cloneConfig(value) {
|
|
27
|
+
return value == null ? value : structuredClone(value);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
module.exports = (ctx, pipeline) => {
|
|
31
|
+
if (!pipeline) throw new TypeError("Stellar v2: Wiki 构建必须由 Collection Pipeline 驱动");
|
|
32
|
+
const data = ctx.locals.get("data");
|
|
33
|
+
const records = pipeline.members("wiki");
|
|
34
|
+
const pages = records.map(record => record.page);
|
|
35
|
+
const parsedPages = new Map(records.map(record => [record.page, record.config]));
|
|
36
|
+
const collectionConfigs = new Map(pipeline.collections("wiki").map(([id, config]) => [id, cloneConfig(config)]));
|
|
37
|
+
const normalizedData = { ...data };
|
|
38
|
+
for (const [id, value] of collectionConfigs) {
|
|
39
|
+
normalizedData[`wiki/${id}`] = cloneConfig(value);
|
|
40
|
+
}
|
|
11
41
|
|
|
12
|
-
module.exports = ctx => {
|
|
13
42
|
const wiki = buildWikiTree({
|
|
14
|
-
data:
|
|
15
|
-
pages
|
|
16
|
-
|
|
17
|
-
|
|
43
|
+
data: normalizedData,
|
|
44
|
+
pages,
|
|
45
|
+
pageConfigs: parsedPages,
|
|
46
|
+
shelf: data.wiki || [],
|
|
47
|
+
wikiIndexPath: requireLayoutProfiles(ctx.stellar?.config).wikiIndex.path
|
|
18
48
|
});
|
|
19
|
-
|
|
49
|
+
const runtimeData = ensureRuntimeData(ctx);
|
|
50
|
+
runtimeData.wiki = wiki;
|
|
51
|
+
|
|
52
|
+
const entries = [];
|
|
53
|
+
const homepageEntries = new Map();
|
|
54
|
+
for (const record of records) {
|
|
55
|
+
const page = record.page;
|
|
56
|
+
const config = record.config;
|
|
57
|
+
if (config == null) continue;
|
|
58
|
+
const collectionId = getCollectionId(config, "wiki");
|
|
59
|
+
if (collectionId == null) continue;
|
|
60
|
+
const input = {
|
|
61
|
+
...pipeline.modelInput(record),
|
|
62
|
+
collectionSource: sourcePathForData(`wiki/${collectionId}`),
|
|
63
|
+
collectionId,
|
|
64
|
+
collectionConfig: collectionConfigs.get(collectionId),
|
|
65
|
+
collectionState: wiki.tree[collectionId],
|
|
66
|
+
collectionListed: wiki.shelf.includes(collectionId),
|
|
67
|
+
isBackup: process.env.IS_BACKUP === "true"
|
|
68
|
+
};
|
|
69
|
+
const base = buildWikiPageViewModelBase(input);
|
|
70
|
+
const entry = { page, collectionId, input, base };
|
|
71
|
+
entries.push(entry);
|
|
72
|
+
if (!homepageEntries.has(collectionId) || base.item.route.path === base.collection.route.homepage) {
|
|
73
|
+
homepageEntries.set(collectionId, entry);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const listings = new Map();
|
|
78
|
+
for (const [collectionId, entry] of homepageEntries) {
|
|
79
|
+
listings.set(collectionId, buildWikiListingRender(entry.input, entry.base.collection));
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
for (const entry of entries) {
|
|
83
|
+
const relatedCollections = (wiki.tree[entry.collectionId]?.relatedItems || []).map(group => ({
|
|
84
|
+
name: group.name,
|
|
85
|
+
items: (group.items || [])
|
|
86
|
+
.map(id => homepageEntries.get(id)?.base.collection)
|
|
87
|
+
.filter(Boolean)
|
|
88
|
+
}));
|
|
89
|
+
const related = buildWikiRelated({ relatedCollections });
|
|
90
|
+
const completeInput = Object.freeze({
|
|
91
|
+
...entry.input,
|
|
92
|
+
related,
|
|
93
|
+
listing: listings.get(entry.collectionId)
|
|
94
|
+
});
|
|
95
|
+
entry.page.viewModel = completeWikiPageViewModel(completeInput, entry.base);
|
|
96
|
+
setProfileViewModelInput("wiki", entry.page, completeInput);
|
|
97
|
+
setProfileViewModelBase("wiki", entry.page, entry.base);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
wiki.index = {
|
|
101
|
+
items: wiki.shelf
|
|
102
|
+
.map(id => listings.get(id))
|
|
103
|
+
.filter(item => item?.listed === true),
|
|
104
|
+
tags: Object.values(wiki.all_tags || {}).map(tag => ({
|
|
105
|
+
name: String(tag.name || ""),
|
|
106
|
+
path: String(tag.path || ""),
|
|
107
|
+
itemIds: Array.isArray(tag.items) ? tag.items.slice() : []
|
|
108
|
+
}))
|
|
109
|
+
};
|
|
20
110
|
};
|
|
@@ -2,7 +2,10 @@
|
|
|
2
2
|
* links.js v1 | https://github.com/xaoxuu/hexo-theme-stellar/
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
/* global hexo */
|
|
6
|
+
"use strict";
|
|
7
|
+
|
|
8
|
+
const { ensureRuntimeData } = require("../../lib/runtime-data");
|
|
6
9
|
|
|
7
10
|
module.exports = ctx => {
|
|
8
11
|
var allLinks = {}
|
|
@@ -13,5 +16,5 @@ module.exports = ctx => {
|
|
|
13
16
|
allLinks[newKey] = data[key]
|
|
14
17
|
}
|
|
15
18
|
}
|
|
16
|
-
ctx.
|
|
17
|
-
}
|
|
19
|
+
ensureRuntimeData(ctx).links = allLinks;
|
|
20
|
+
};
|