From 65056192ecd07dc614504557bdf891fd757f6430 Mon Sep 17 00:00:00 2001 From: xiongxiao Date: Mon, 12 Jan 2026 12:07:13 +0800 Subject: [PATCH] update --- .gitignore | 1 + Dockerfile | 0 blog/.github/dependabot.yml | 7 + blog/.gitignore | 8 + blog/_config.anzhiyu.yml | 1347 ++++++++ blog/_config.landscape.yml | 0 blog/_config.yml | 110 + blog/package.json | 28 + blog/pnpm-lock.yaml | 2218 +++++++++++++ blog/scaffolds/draft.md | 4 + blog/scaffolds/page.md | 4 + blog/scaffolds/post.md | 5 + blog/source/_posts/hello-world.md | 38 + blog/source/json/music.json | 128 + blog/source/music/index.md | 9 + blog/themes/.gitkeep | 0 .../.github/ISSUE_TEMPLATE/bug_report.yml | 73 + .../anzhiyu/.github/ISSUE_TEMPLATE/config.yml | 13 + .../ISSUE_TEMPLATE/feature_request.yml | 14 + .../workflows/issue_close_question.yml | 22 + .../.github/workflows/issue_close_stale.yml | 21 + .../.github/workflows/issue_duplicate.yml | 25 + .../.github/workflows/issue_invalid.yml | 18 + .../.github/workflows/issue_question.yml | 20 + .../.github/workflows/issue_wontfix.yml | 25 + .../anzhiyu/.github/workflows/publish.yml | 19 + .../anzhiyu/.github/workflows/stale.yml | 19 + blog/themes/anzhiyu/.gitignore | 9 + blog/themes/anzhiyu/LICENSE | 674 ++++ blog/themes/anzhiyu/README.md | 144 + blog/themes/anzhiyu/README_EN.md | 142 + blog/themes/anzhiyu/_config.yml | 1342 ++++++++ blog/themes/anzhiyu/languages/default.yml | 128 + blog/themes/anzhiyu/languages/en.yml | 215 ++ blog/themes/anzhiyu/languages/zh-CN.yml | 218 ++ blog/themes/anzhiyu/languages/zh-TW.yml | 216 ++ blog/themes/anzhiyu/layout/archive.pug | 8 + blog/themes/anzhiyu/layout/category.pug | 23 + blog/themes/anzhiyu/layout/includes/404.pug | 36 + .../anzhiyu/layout/includes/additional-js.pug | 132 + .../layout/includes/anzhiyu/ai-info.pug | 26 + .../anzhiyu/layout/includes/anzhiyu/clock.pug | 29 + .../layout/includes/anzhiyu/console.pug | 47 + .../layout/includes/anzhiyu/log-js.pug | 78 + .../layout/includes/anzhiyu/rightmenu.pug | 82 + .../includes/anzhiyu/tags-group-all.pug | 20 + .../anzhiyu/layout/includes/bbTimeList.pug | 17 + .../layout/includes/bili-banner/index.pug | 2 + .../anzhiyu/layout/includes/categoryGroup.pug | 10 + .../themes/anzhiyu/layout/includes/footer.pug | 93 + blog/themes/anzhiyu/layout/includes/head.pug | 92 + .../layout/includes/head/Open_Graph.pug | 18 + .../layout/includes/head/analytics.pug | 31 + .../anzhiyu/layout/includes/head/config.pug | 223 ++ .../layout/includes/head/config_site.pug | 38 + .../layout/includes/head/google_adsense.pug | 9 + .../anzhiyu/layout/includes/head/noscript.pug | 14 + .../layout/includes/head/preconnect.pug | 39 + .../anzhiyu/layout/includes/head/pwa.pug | 59 + .../includes/head/site_verification.pug | 3 + .../anzhiyu/layout/includes/header/index.pug | 59 + .../layout/includes/header/menu_item.pug | 49 + .../anzhiyu/layout/includes/header/nav.pug | 61 + .../layout/includes/header/post-info.pug | 145 + .../anzhiyu/layout/includes/header/social.pug | 12 + .../themes/anzhiyu/layout/includes/layout.pug | 91 + .../includes/loading/fullpage-loading.pug | 21 + .../anzhiyu/layout/includes/loading/index.pug | 7 + .../anzhiyu/layout/includes/loading/pace.pug | 2 + .../layout/includes/mixins/article-sort.pug | 37 + .../layout/includes/mixins/post-ui.pug | 122 + blog/themes/anzhiyu/layout/includes/mourn.pug | 9 + blog/themes/anzhiyu/layout/includes/music.pug | 7 + .../anzhiyu/layout/includes/page/about.pug | 500 +++ .../anzhiyu/layout/includes/page/album.pug | 22 + .../layout/includes/page/album_detail.pug | 89 + .../layout/includes/page/categories.pug | 2 + .../layout/includes/page/default-page.pug | 2 + .../layout/includes/page/equipment.pug | 32 + .../anzhiyu/layout/includes/page/essay.pug | 67 + .../anzhiyu/layout/includes/page/fcircle.pug | 25 + .../anzhiyu/layout/includes/page/flink.pug | 132 + .../anzhiyu/layout/includes/page/music.pug | 8 + .../anzhiyu/layout/includes/page/room.pug | 278 ++ .../anzhiyu/layout/includes/page/tags.pug | 4 + .../anzhiyu/layout/includes/pagination.pug | 42 + .../anzhiyu/layout/includes/popup/index.pug | 7 + .../layout/includes/post/post-copyright.pug | 63 + .../anzhiyu/layout/includes/post/ptool.pug | 54 + .../anzhiyu/layout/includes/post/reward.pug | 18 + .../anzhiyu/layout/includes/rightside.pug | 63 + .../anzhiyu/layout/includes/shortcutKey.pug | 23 + .../anzhiyu/layout/includes/sidebar.pug | 50 + .../layout/includes/third-party/aplayer.pug | 3 + .../third-party/card-post-count/artalk.pug | 31 + .../third-party/card-post-count/index.pug | 9 + .../third-party/card-post-count/twikoo.pug | 37 + .../third-party/card-post-count/valine.pug | 20 + .../third-party/card-post-count/waline.pug | 21 + .../includes/third-party/chat/chatra.pug | 50 + .../includes/third-party/chat/crisp.pug | 45 + .../includes/third-party/chat/daovoice.pug | 40 + .../includes/third-party/chat/index.pug | 8 + .../includes/third-party/chat/tidio.pug | 47 + .../includes/third-party/comments/artalk.pug | 71 + .../includes/third-party/comments/giscus.pug | 53 + .../includes/third-party/comments/index.pug | 37 + .../includes/third-party/comments/js.pug | 12 + .../includes/third-party/comments/twikoo.pug | 50 + .../includes/third-party/comments/valine.pug | 37 + .../includes/third-party/comments/waline.pug | 44 + .../layout/includes/third-party/effect.pug | 35 + .../third-party/footerBarSubtitle.pug | 128 + .../includes/third-party/math/index.pug | 18 + .../includes/third-party/math/katex.pug | 9 + .../includes/third-party/math/mathjax.pug | 38 + .../includes/third-party/math/mermaid.pug | 38 + .../third-party/newest-comments/artalk.pug | 118 + .../third-party/newest-comments/common.pug | 74 + .../third-party/newest-comments/index.pug | 13 + .../newest-comments/twikoo-comment.pug | 90 + .../third-party/newest-comments/valine.pug | 99 + .../third-party/newest-comments/waline.pug | 81 + .../layout/includes/third-party/pangu.pug | 20 + .../layout/includes/third-party/pjax.pug | 77 + .../layout/includes/third-party/prismjs.pug | 5 + .../third-party/runtime/runtime-js.pug | 66 + .../includes/third-party/search/algolia.pug | 21 + .../includes/third-party/search/docsearch.pug | 26 + .../includes/third-party/search/index.pug | 6 + .../third-party/search/local-search.pug | 20 + .../includes/third-party/share/addtoany.pug | 10 + .../includes/third-party/share/index.pug | 6 + .../includes/third-party/share/share-js.pug | 3 + .../layout/includes/third-party/subtitle.pug | 128 + .../anzhiyu/layout/includes/top/top.pug | 135 + .../layout/includes/widget/card_ad.pug | 3 + .../includes/widget/card_announcement.pug | 6 + .../layout/includes/widget/card_archives.pug | 8 + .../layout/includes/widget/card_author.pug | 20 + .../includes/widget/card_bottom_self.pug | 9 + .../includes/widget/card_categories.pug | 4 + .../includes/widget/card_console_archives.pug | 8 + .../includes/widget/card_console_tags.pug | 10 + .../includes/widget/card_newest_comment.pug | 8 + .../layout/includes/widget/card_post_toc.pug | 15 + .../includes/widget/card_recent_post.pug | 24 + .../layout/includes/widget/card_tags.pug | 10 + .../layout/includes/widget/card_top_self.pug | 8 + .../layout/includes/widget/card_webinfo.pug | 47 + .../layout/includes/widget/card_weixin.pug | 8 + .../anzhiyu/layout/includes/widget/index.pug | 35 + blog/themes/anzhiyu/layout/index.pug | 8 + blog/themes/anzhiyu/layout/page.pug | 35 + blog/themes/anzhiyu/layout/post.pug | 45 + blog/themes/anzhiyu/layout/tag.pug | 16 + blog/themes/anzhiyu/package.json | 32 + blog/themes/anzhiyu/plugins.yml | 234 ++ blog/themes/anzhiyu/scripts/events/404.js | 18 + blog/themes/anzhiyu/scripts/events/cdn.js | 126 + blog/themes/anzhiyu/scripts/events/comment.js | 14 + blog/themes/anzhiyu/scripts/events/init.js | 20 + .../anzhiyu/scripts/events/merge_config.js | 680 ++++ blog/themes/anzhiyu/scripts/events/stylus.js | 24 + blog/themes/anzhiyu/scripts/events/welcome.js | 15 + .../anzhiyu/scripts/filters/post_lazyload.js | 33 + .../anzhiyu/scripts/filters/random_cover.js | 65 + .../anzhiyu/scripts/helpers/aside_archives.js | 116 + .../scripts/helpers/aside_categories.js | 99 + .../anzhiyu/scripts/helpers/catalog_list.js | 13 + .../scripts/helpers/findArchiveLength.js | 58 + .../anzhiyu/scripts/helpers/get_version.js | 4 + .../anzhiyu/scripts/helpers/inject_head_js.js | 190 ++ blog/themes/anzhiyu/scripts/helpers/page.js | 149 + blog/themes/anzhiyu/scripts/helpers/random.js | 86 + .../anzhiyu/scripts/helpers/related_post.js | 102 + .../anzhiyu/scripts/helpers/sort_attr_post.js | 65 + .../anzhiyu/scripts/helpers/tags_page_list.js | 26 + blog/themes/anzhiyu/scripts/helpers/year.js | 18 + .../anzhiyu/scripts/tag/Introduction-card.js | 56 + blog/themes/anzhiyu/scripts/tag/bilibili.js | 47 + blog/themes/anzhiyu/scripts/tag/btns.js | 35 + blog/themes/anzhiyu/scripts/tag/button.js | 28 + blog/themes/anzhiyu/scripts/tag/checkbox.js | 53 + blog/themes/anzhiyu/scripts/tag/dogeplayer.js | 34 + blog/themes/anzhiyu/scripts/tag/flink.js | 70 + blog/themes/anzhiyu/scripts/tag/folding.js | 29 + blog/themes/anzhiyu/scripts/tag/gallery.js | 84 + blog/themes/anzhiyu/scripts/tag/hide.js | 70 + blog/themes/anzhiyu/scripts/tag/iconfont.js | 9 + blog/themes/anzhiyu/scripts/tag/image.js | 91 + .../anzhiyu/scripts/tag/inline-labels.js | 21 + blog/themes/anzhiyu/scripts/tag/inlineImg.js | 17 + blog/themes/anzhiyu/scripts/tag/label.js | 16 + blog/themes/anzhiyu/scripts/tag/link.js | 69 + blog/themes/anzhiyu/scripts/tag/media.js | 29 + blog/themes/anzhiyu/scripts/tag/mermaid.js | 17 + blog/themes/anzhiyu/scripts/tag/note.js | 27 + blog/themes/anzhiyu/scripts/tag/site.js | 54 + blog/themes/anzhiyu/scripts/tag/span.js | 17 + blog/themes/anzhiyu/scripts/tag/tabs.js | 64 + blog/themes/anzhiyu/scripts/tag/timeline.js | 41 + blog/themes/anzhiyu/scripts/tag/tip.js | 16 + .../anzhiyu/source/css/_extra/album/album.css | 121 + .../source/css/_extra/album/album_detail.css | 309 ++ .../source/css/_extra/anzhiyu/custom.css | 216 ++ .../css/_extra/aside_weixin/aside_weixin.css | 53 + .../css/_extra/catalog_list/catalog_list.css | 61 + .../css/_extra/categoryBar/categoryBar.css | 105 + .../anzhiyu/source/css/_extra/clock/clock.css | 137 + .../anzhiyu/source/css/_extra/code/code.css | 83 + .../css/_extra/code/details_summary.css | 70 + .../_extra/commentBarrage/commentBarrage.css | 136 + .../source/css/_extra/console/console.css | 976 ++++++ .../css/_extra/essay_page/essay_page.css | 310 ++ .../css/_extra/essay_page/home_essay_bar.css | 101 + .../anzhiyu/source/css/_extra/fix/aplayer.css | 323 ++ .../css/_extra/fix/bilibili-bangumi.css | 82 + .../source/css/_extra/fix/bilibili-ratio.css | 16 + .../source/css/_extra/fix/categories.css | 15 + .../anzhiyu/source/css/_extra/fix/clock.css | 7 + .../source/css/_extra/fix/comments.css | 9 + .../anzhiyu/source/css/_extra/fix/dark.css | 17 + .../source/css/_extra/fix/fcircle_page.css | 7 + .../source/css/_extra/fix/gitcalendar.css | 6 + .../css/_extra/fix/hexo-tag-dplayer.css | 4 + .../source/css/_extra/fix/hide-block.css | 6 + .../source/css/_extra/fix/link_page.css | 14 + .../source/css/_extra/fix/overflow.css | 15 + .../anzhiyu/source/css/_extra/fix/radius.css | 8 + .../source/css/_extra/fix/site-card.css | 15 + .../source/css/_extra/footer/footer.css | 34 + .../source/css/_extra/friends/friends.css | 95 + .../css/_extra/greeting_box/greeting_box.css | 33 + .../css/_extra/home_top/categorygroup.css | 118 + .../source/css/_extra/home_top/home_top.css | 11 + .../_extra/home_top/home_top_post_group.css | 103 + .../css/_extra/home_top/random-banner.css | 0 .../css/_extra/home_top/swiperstyle.css | 439 +++ .../css/_extra/home_top/top_group_banner.css | 268 ++ .../css/_extra/local_search/local_search.css | 42 + .../anzhiyu/source/css/_extra/reset/reset.css | 3 + .../source/css/_extra/reward/about-reward.css | 13 + .../anzhiyu/source/css/_extra/room/room.css | 2871 +++++++++++++++++ .../source/css/_extra/runtime/runtime.css | 59 + .../css/_extra/single_card/single_card.css | 13 + .../source/css/_extra/skills/skills.css | 51 + .../anzhiyu/source/css/_extra/tag/link.css | 84 + .../anzhiyu/source/css/_extra/tag/site.css | 151 + .../anzhiyu/source/css/_global/function.styl | 422 +++ .../anzhiyu/source/css/_global/icon.styl | 3 + .../anzhiyu/source/css/_global/index.styl | 457 +++ .../anzhiyu/source/css/_global/loading.styl | 50 + .../source/css/_highlight/highlight.styl | 248 ++ .../source/css/_highlight/highlight/diff.styl | 79 + .../css/_highlight/highlight/index.styl | 46 + .../source/css/_highlight/prismjs/diff.styl | 302 ++ .../source/css/_highlight/prismjs/index.styl | 24 + .../css/_highlight/prismjs/line-number.styl | 41 + .../anzhiyu/source/css/_highlight/theme.styl | 119 + .../anzhiyu/source/css/_layout/404.styl | 156 + .../anzhiyu/source/css/_layout/aside.styl | 603 ++++ .../anzhiyu/source/css/_layout/banner.styl | 37 + .../anzhiyu/source/css/_layout/chat.styl | 8 + .../anzhiyu/source/css/_layout/comments.styl | 97 + .../anzhiyu/source/css/_layout/footer.styl | 170 + .../anzhiyu/source/css/_layout/head.styl | 805 +++++ .../anzhiyu/source/css/_layout/home_top.styl | 57 + .../anzhiyu/source/css/_layout/nav.styl | 743 +++++ .../source/css/_layout/oneGraphFlow.styl | 18 + .../source/css/_layout/pagination.styl | 350 ++ .../anzhiyu/source/css/_layout/post.styl | 547 ++++ .../anzhiyu/source/css/_layout/ptool.styl | 110 + .../source/css/_layout/relatedposts.styl | 43 + .../anzhiyu/source/css/_layout/reward.styl | 145 + .../anzhiyu/source/css/_layout/rightmenu.styl | 89 + .../anzhiyu/source/css/_layout/rightside.styl | 55 + .../source/css/_layout/shortcutKey.styl | 57 + .../anzhiyu/source/css/_layout/sidebar.styl | 412 +++ .../source/css/_layout/third-party.styl | 109 + .../anzhiyu/source/css/_mode/darkmode.styl | 123 + .../anzhiyu/source/css/_mode/readmode.styl | 197 ++ blog/themes/anzhiyu/source/css/_page/404.styl | 69 + .../anzhiyu/source/css/_page/about.styl | 1276 ++++++++ .../anzhiyu/source/css/_page/archives.styl | 113 + .../anzhiyu/source/css/_page/categories.styl | 37 + .../anzhiyu/source/css/_page/common.styl | 81 + .../anzhiyu/source/css/_page/equipment.styl | 105 + .../anzhiyu/source/css/_page/flink.styl | 478 +++ .../anzhiyu/source/css/_page/homepage.styl | 407 +++ .../anzhiyu/source/css/_page/music.styl | 377 +++ .../anzhiyu/source/css/_page/reward.styl | 135 + .../anzhiyu/source/css/_page/tag_page.styl | 168 + .../themes/anzhiyu/source/css/_page/tags.styl | 23 + .../anzhiyu/source/css/_search/algolia.styl | 156 + .../anzhiyu/source/css/_search/index.styl | 65 + .../source/css/_search/local-search.styl | 67 + .../source/css/_tags/Introduction-card.styl | 116 + .../anzhiyu/source/css/_tags/bilbili.styl | 108 + .../themes/anzhiyu/source/css/_tags/btns.styl | 211 ++ .../anzhiyu/source/css/_tags/button.styl | 56 + .../anzhiyu/source/css/_tags/checkbox.styl | 193 ++ .../anzhiyu/source/css/_tags/folding.styl | 141 + .../anzhiyu/source/css/_tags/gallery.styl | 139 + .../themes/anzhiyu/source/css/_tags/hexo.styl | 30 + .../themes/anzhiyu/source/css/_tags/hide.styl | 47 + .../anzhiyu/source/css/_tags/image.styl | 10 + .../source/css/_tags/inline-labels.styl | 44 + .../anzhiyu/source/css/_tags/inlineImg.styl | 6 + .../anzhiyu/source/css/_tags/label.styl | 11 + .../anzhiyu/source/css/_tags/media.styl | 57 + .../themes/anzhiyu/source/css/_tags/note.styl | 133 + .../anzhiyu/source/css/_tags/site-card.styl | 79 + .../themes/anzhiyu/source/css/_tags/span.styl | 76 + .../themes/anzhiyu/source/css/_tags/tabs.styl | 83 + .../anzhiyu/source/css/_tags/timeline.styl | 69 + blog/themes/anzhiyu/source/css/_tags/tip.styl | 161 + .../source/css/_third-party/normalize.min.css | 221 ++ .../source/css/_third-party/snackbar.styl | 50 + .../source/css/_third-party/twikoo.styl | 469 +++ blog/themes/anzhiyu/source/css/index.styl | 24 + blog/themes/anzhiyu/source/css/var.styl | 186 ++ blog/themes/anzhiyu/source/favicon.ico | Bin 0 -> 4286 bytes blog/themes/anzhiyu/source/img/404.jpg | Bin 0 -> 141552 bytes blog/themes/anzhiyu/source/img/512.png | Bin 0 -> 4172 bytes blog/themes/anzhiyu/source/img/algolia.svg | 9 + blog/themes/anzhiyu/source/img/comment_bg.png | Bin 0 -> 4246 bytes .../anzhiyu/source/img/default_cover.jpg | Bin 0 -> 14808 bytes blog/themes/anzhiyu/source/img/favicon.ico | Bin 0 -> 4286 bytes blog/themes/anzhiyu/source/img/friend_404.gif | Bin 0 -> 604315 bytes blog/themes/anzhiyu/source/img/loading.gif | Bin 0 -> 738187 bytes .../themes/anzhiyu/source/img/siteicon/16.png | Bin 0 -> 283 bytes .../themes/anzhiyu/source/img/siteicon/32.png | Bin 0 -> 431 bytes .../source/img/siteicon/apple-icon-180.png | Bin 0 -> 2272 bytes .../siteicon/manifest-icon-192.maskable.png | Bin 0 -> 2329 bytes .../siteicon/manifest-icon-512.maskable.png | Bin 0 -> 6723 bytes .../anzhiyu/source/js/anzhiyu/ai_abstract.js | 438 +++ .../source/js/anzhiyu/comment_barrage.js | 179 + .../anzhiyu/source/js/anzhiyu/people.js | 297 ++ .../source/js/anzhiyu/random_friends_post.js | 215 ++ .../source/js/anzhiyu/right_click_menu.js | 514 +++ blog/themes/anzhiyu/source/js/main.js | 1856 +++++++++++ .../anzhiyu/source/js/search/algolia.js | 214 ++ .../anzhiyu/source/js/search/local-search.js | 270 ++ blog/themes/anzhiyu/source/js/tw_cn.js | 130 + blog/themes/anzhiyu/source/js/utils.js | 1453 +++++++++ blog/themes/anzhiyu/sw-rules.js | 137 + 347 files changed, 42204 insertions(+) create mode 100644 .gitignore create mode 100644 Dockerfile create mode 100644 blog/.github/dependabot.yml create mode 100644 blog/.gitignore create mode 100644 blog/_config.anzhiyu.yml create mode 100644 blog/_config.landscape.yml create mode 100644 blog/_config.yml create mode 100644 blog/package.json create mode 100644 blog/pnpm-lock.yaml create mode 100644 blog/scaffolds/draft.md create mode 100644 blog/scaffolds/page.md create mode 100644 blog/scaffolds/post.md create mode 100644 blog/source/_posts/hello-world.md create mode 100644 blog/source/json/music.json create mode 100644 blog/source/music/index.md create mode 100644 blog/themes/.gitkeep create mode 100644 blog/themes/anzhiyu/.github/ISSUE_TEMPLATE/bug_report.yml create mode 100644 blog/themes/anzhiyu/.github/ISSUE_TEMPLATE/config.yml create mode 100644 blog/themes/anzhiyu/.github/ISSUE_TEMPLATE/feature_request.yml create mode 100644 blog/themes/anzhiyu/.github/workflows/issue_close_question.yml create mode 100644 blog/themes/anzhiyu/.github/workflows/issue_close_stale.yml create mode 100644 blog/themes/anzhiyu/.github/workflows/issue_duplicate.yml create mode 100644 blog/themes/anzhiyu/.github/workflows/issue_invalid.yml create mode 100644 blog/themes/anzhiyu/.github/workflows/issue_question.yml create mode 100644 blog/themes/anzhiyu/.github/workflows/issue_wontfix.yml create mode 100644 blog/themes/anzhiyu/.github/workflows/publish.yml create mode 100644 blog/themes/anzhiyu/.github/workflows/stale.yml create mode 100644 blog/themes/anzhiyu/.gitignore create mode 100644 blog/themes/anzhiyu/LICENSE create mode 100644 blog/themes/anzhiyu/README.md create mode 100644 blog/themes/anzhiyu/README_EN.md create mode 100644 blog/themes/anzhiyu/_config.yml create mode 100644 blog/themes/anzhiyu/languages/default.yml create mode 100644 blog/themes/anzhiyu/languages/en.yml create mode 100644 blog/themes/anzhiyu/languages/zh-CN.yml create mode 100644 blog/themes/anzhiyu/languages/zh-TW.yml create mode 100644 blog/themes/anzhiyu/layout/archive.pug create mode 100644 blog/themes/anzhiyu/layout/category.pug create mode 100644 blog/themes/anzhiyu/layout/includes/404.pug create mode 100644 blog/themes/anzhiyu/layout/includes/additional-js.pug create mode 100644 blog/themes/anzhiyu/layout/includes/anzhiyu/ai-info.pug create mode 100644 blog/themes/anzhiyu/layout/includes/anzhiyu/clock.pug create mode 100644 blog/themes/anzhiyu/layout/includes/anzhiyu/console.pug create mode 100644 blog/themes/anzhiyu/layout/includes/anzhiyu/log-js.pug create mode 100644 blog/themes/anzhiyu/layout/includes/anzhiyu/rightmenu.pug create mode 100644 blog/themes/anzhiyu/layout/includes/anzhiyu/tags-group-all.pug create mode 100644 blog/themes/anzhiyu/layout/includes/bbTimeList.pug create mode 100644 blog/themes/anzhiyu/layout/includes/bili-banner/index.pug create mode 100644 blog/themes/anzhiyu/layout/includes/categoryGroup.pug create mode 100644 blog/themes/anzhiyu/layout/includes/footer.pug create mode 100644 blog/themes/anzhiyu/layout/includes/head.pug create mode 100644 blog/themes/anzhiyu/layout/includes/head/Open_Graph.pug create mode 100644 blog/themes/anzhiyu/layout/includes/head/analytics.pug create mode 100644 blog/themes/anzhiyu/layout/includes/head/config.pug create mode 100644 blog/themes/anzhiyu/layout/includes/head/config_site.pug create mode 100644 blog/themes/anzhiyu/layout/includes/head/google_adsense.pug create mode 100644 blog/themes/anzhiyu/layout/includes/head/noscript.pug create mode 100644 blog/themes/anzhiyu/layout/includes/head/preconnect.pug create mode 100644 blog/themes/anzhiyu/layout/includes/head/pwa.pug create mode 100644 blog/themes/anzhiyu/layout/includes/head/site_verification.pug create mode 100644 blog/themes/anzhiyu/layout/includes/header/index.pug create mode 100644 blog/themes/anzhiyu/layout/includes/header/menu_item.pug create mode 100644 blog/themes/anzhiyu/layout/includes/header/nav.pug create mode 100644 blog/themes/anzhiyu/layout/includes/header/post-info.pug create mode 100644 blog/themes/anzhiyu/layout/includes/header/social.pug create mode 100644 blog/themes/anzhiyu/layout/includes/layout.pug create mode 100644 blog/themes/anzhiyu/layout/includes/loading/fullpage-loading.pug create mode 100644 blog/themes/anzhiyu/layout/includes/loading/index.pug create mode 100644 blog/themes/anzhiyu/layout/includes/loading/pace.pug create mode 100644 blog/themes/anzhiyu/layout/includes/mixins/article-sort.pug create mode 100644 blog/themes/anzhiyu/layout/includes/mixins/post-ui.pug create mode 100644 blog/themes/anzhiyu/layout/includes/mourn.pug create mode 100644 blog/themes/anzhiyu/layout/includes/music.pug create mode 100644 blog/themes/anzhiyu/layout/includes/page/about.pug create mode 100644 blog/themes/anzhiyu/layout/includes/page/album.pug create mode 100644 blog/themes/anzhiyu/layout/includes/page/album_detail.pug create mode 100644 blog/themes/anzhiyu/layout/includes/page/categories.pug create mode 100644 blog/themes/anzhiyu/layout/includes/page/default-page.pug create mode 100644 blog/themes/anzhiyu/layout/includes/page/equipment.pug create mode 100644 blog/themes/anzhiyu/layout/includes/page/essay.pug create mode 100644 blog/themes/anzhiyu/layout/includes/page/fcircle.pug create mode 100644 blog/themes/anzhiyu/layout/includes/page/flink.pug create mode 100644 blog/themes/anzhiyu/layout/includes/page/music.pug create mode 100644 blog/themes/anzhiyu/layout/includes/page/room.pug create mode 100644 blog/themes/anzhiyu/layout/includes/page/tags.pug create mode 100644 blog/themes/anzhiyu/layout/includes/pagination.pug create mode 100644 blog/themes/anzhiyu/layout/includes/popup/index.pug create mode 100644 blog/themes/anzhiyu/layout/includes/post/post-copyright.pug create mode 100644 blog/themes/anzhiyu/layout/includes/post/ptool.pug create mode 100644 blog/themes/anzhiyu/layout/includes/post/reward.pug create mode 100644 blog/themes/anzhiyu/layout/includes/rightside.pug create mode 100644 blog/themes/anzhiyu/layout/includes/shortcutKey.pug create mode 100644 blog/themes/anzhiyu/layout/includes/sidebar.pug create mode 100644 blog/themes/anzhiyu/layout/includes/third-party/aplayer.pug create mode 100644 blog/themes/anzhiyu/layout/includes/third-party/card-post-count/artalk.pug create mode 100644 blog/themes/anzhiyu/layout/includes/third-party/card-post-count/index.pug create mode 100644 blog/themes/anzhiyu/layout/includes/third-party/card-post-count/twikoo.pug create mode 100644 blog/themes/anzhiyu/layout/includes/third-party/card-post-count/valine.pug create mode 100644 blog/themes/anzhiyu/layout/includes/third-party/card-post-count/waline.pug create mode 100644 blog/themes/anzhiyu/layout/includes/third-party/chat/chatra.pug create mode 100644 blog/themes/anzhiyu/layout/includes/third-party/chat/crisp.pug create mode 100644 blog/themes/anzhiyu/layout/includes/third-party/chat/daovoice.pug create mode 100644 blog/themes/anzhiyu/layout/includes/third-party/chat/index.pug create mode 100644 blog/themes/anzhiyu/layout/includes/third-party/chat/tidio.pug create mode 100644 blog/themes/anzhiyu/layout/includes/third-party/comments/artalk.pug create mode 100644 blog/themes/anzhiyu/layout/includes/third-party/comments/giscus.pug create mode 100644 blog/themes/anzhiyu/layout/includes/third-party/comments/index.pug create mode 100644 blog/themes/anzhiyu/layout/includes/third-party/comments/js.pug create mode 100644 blog/themes/anzhiyu/layout/includes/third-party/comments/twikoo.pug create mode 100644 blog/themes/anzhiyu/layout/includes/third-party/comments/valine.pug create mode 100644 blog/themes/anzhiyu/layout/includes/third-party/comments/waline.pug create mode 100644 blog/themes/anzhiyu/layout/includes/third-party/effect.pug create mode 100644 blog/themes/anzhiyu/layout/includes/third-party/footerBarSubtitle.pug create mode 100644 blog/themes/anzhiyu/layout/includes/third-party/math/index.pug create mode 100644 blog/themes/anzhiyu/layout/includes/third-party/math/katex.pug create mode 100644 blog/themes/anzhiyu/layout/includes/third-party/math/mathjax.pug create mode 100644 blog/themes/anzhiyu/layout/includes/third-party/math/mermaid.pug create mode 100644 blog/themes/anzhiyu/layout/includes/third-party/newest-comments/artalk.pug create mode 100644 blog/themes/anzhiyu/layout/includes/third-party/newest-comments/common.pug create mode 100644 blog/themes/anzhiyu/layout/includes/third-party/newest-comments/index.pug create mode 100644 blog/themes/anzhiyu/layout/includes/third-party/newest-comments/twikoo-comment.pug create mode 100644 blog/themes/anzhiyu/layout/includes/third-party/newest-comments/valine.pug create mode 100644 blog/themes/anzhiyu/layout/includes/third-party/newest-comments/waline.pug create mode 100644 blog/themes/anzhiyu/layout/includes/third-party/pangu.pug create mode 100644 blog/themes/anzhiyu/layout/includes/third-party/pjax.pug create mode 100644 blog/themes/anzhiyu/layout/includes/third-party/prismjs.pug create mode 100644 blog/themes/anzhiyu/layout/includes/third-party/runtime/runtime-js.pug create mode 100644 blog/themes/anzhiyu/layout/includes/third-party/search/algolia.pug create mode 100644 blog/themes/anzhiyu/layout/includes/third-party/search/docsearch.pug create mode 100644 blog/themes/anzhiyu/layout/includes/third-party/search/index.pug create mode 100644 blog/themes/anzhiyu/layout/includes/third-party/search/local-search.pug create mode 100644 blog/themes/anzhiyu/layout/includes/third-party/share/addtoany.pug create mode 100644 blog/themes/anzhiyu/layout/includes/third-party/share/index.pug create mode 100644 blog/themes/anzhiyu/layout/includes/third-party/share/share-js.pug create mode 100644 blog/themes/anzhiyu/layout/includes/third-party/subtitle.pug create mode 100644 blog/themes/anzhiyu/layout/includes/top/top.pug create mode 100644 blog/themes/anzhiyu/layout/includes/widget/card_ad.pug create mode 100644 blog/themes/anzhiyu/layout/includes/widget/card_announcement.pug create mode 100644 blog/themes/anzhiyu/layout/includes/widget/card_archives.pug create mode 100644 blog/themes/anzhiyu/layout/includes/widget/card_author.pug create mode 100644 blog/themes/anzhiyu/layout/includes/widget/card_bottom_self.pug create mode 100644 blog/themes/anzhiyu/layout/includes/widget/card_categories.pug create mode 100644 blog/themes/anzhiyu/layout/includes/widget/card_console_archives.pug create mode 100644 blog/themes/anzhiyu/layout/includes/widget/card_console_tags.pug create mode 100644 blog/themes/anzhiyu/layout/includes/widget/card_newest_comment.pug create mode 100644 blog/themes/anzhiyu/layout/includes/widget/card_post_toc.pug create mode 100644 blog/themes/anzhiyu/layout/includes/widget/card_recent_post.pug create mode 100644 blog/themes/anzhiyu/layout/includes/widget/card_tags.pug create mode 100644 blog/themes/anzhiyu/layout/includes/widget/card_top_self.pug create mode 100644 blog/themes/anzhiyu/layout/includes/widget/card_webinfo.pug create mode 100644 blog/themes/anzhiyu/layout/includes/widget/card_weixin.pug create mode 100644 blog/themes/anzhiyu/layout/includes/widget/index.pug create mode 100644 blog/themes/anzhiyu/layout/index.pug create mode 100644 blog/themes/anzhiyu/layout/page.pug create mode 100644 blog/themes/anzhiyu/layout/post.pug create mode 100644 blog/themes/anzhiyu/layout/tag.pug create mode 100644 blog/themes/anzhiyu/package.json create mode 100644 blog/themes/anzhiyu/plugins.yml create mode 100644 blog/themes/anzhiyu/scripts/events/404.js create mode 100644 blog/themes/anzhiyu/scripts/events/cdn.js create mode 100644 blog/themes/anzhiyu/scripts/events/comment.js create mode 100644 blog/themes/anzhiyu/scripts/events/init.js create mode 100644 blog/themes/anzhiyu/scripts/events/merge_config.js create mode 100644 blog/themes/anzhiyu/scripts/events/stylus.js create mode 100644 blog/themes/anzhiyu/scripts/events/welcome.js create mode 100644 blog/themes/anzhiyu/scripts/filters/post_lazyload.js create mode 100644 blog/themes/anzhiyu/scripts/filters/random_cover.js create mode 100644 blog/themes/anzhiyu/scripts/helpers/aside_archives.js create mode 100644 blog/themes/anzhiyu/scripts/helpers/aside_categories.js create mode 100644 blog/themes/anzhiyu/scripts/helpers/catalog_list.js create mode 100644 blog/themes/anzhiyu/scripts/helpers/findArchiveLength.js create mode 100644 blog/themes/anzhiyu/scripts/helpers/get_version.js create mode 100644 blog/themes/anzhiyu/scripts/helpers/inject_head_js.js create mode 100644 blog/themes/anzhiyu/scripts/helpers/page.js create mode 100644 blog/themes/anzhiyu/scripts/helpers/random.js create mode 100644 blog/themes/anzhiyu/scripts/helpers/related_post.js create mode 100644 blog/themes/anzhiyu/scripts/helpers/sort_attr_post.js create mode 100644 blog/themes/anzhiyu/scripts/helpers/tags_page_list.js create mode 100644 blog/themes/anzhiyu/scripts/helpers/year.js create mode 100644 blog/themes/anzhiyu/scripts/tag/Introduction-card.js create mode 100644 blog/themes/anzhiyu/scripts/tag/bilibili.js create mode 100644 blog/themes/anzhiyu/scripts/tag/btns.js create mode 100644 blog/themes/anzhiyu/scripts/tag/button.js create mode 100644 blog/themes/anzhiyu/scripts/tag/checkbox.js create mode 100644 blog/themes/anzhiyu/scripts/tag/dogeplayer.js create mode 100644 blog/themes/anzhiyu/scripts/tag/flink.js create mode 100644 blog/themes/anzhiyu/scripts/tag/folding.js create mode 100644 blog/themes/anzhiyu/scripts/tag/gallery.js create mode 100644 blog/themes/anzhiyu/scripts/tag/hide.js create mode 100644 blog/themes/anzhiyu/scripts/tag/iconfont.js create mode 100644 blog/themes/anzhiyu/scripts/tag/image.js create mode 100644 blog/themes/anzhiyu/scripts/tag/inline-labels.js create mode 100644 blog/themes/anzhiyu/scripts/tag/inlineImg.js create mode 100644 blog/themes/anzhiyu/scripts/tag/label.js create mode 100644 blog/themes/anzhiyu/scripts/tag/link.js create mode 100644 blog/themes/anzhiyu/scripts/tag/media.js create mode 100644 blog/themes/anzhiyu/scripts/tag/mermaid.js create mode 100644 blog/themes/anzhiyu/scripts/tag/note.js create mode 100644 blog/themes/anzhiyu/scripts/tag/site.js create mode 100644 blog/themes/anzhiyu/scripts/tag/span.js create mode 100644 blog/themes/anzhiyu/scripts/tag/tabs.js create mode 100644 blog/themes/anzhiyu/scripts/tag/timeline.js create mode 100644 blog/themes/anzhiyu/scripts/tag/tip.js create mode 100644 blog/themes/anzhiyu/source/css/_extra/album/album.css create mode 100644 blog/themes/anzhiyu/source/css/_extra/album/album_detail.css create mode 100644 blog/themes/anzhiyu/source/css/_extra/anzhiyu/custom.css create mode 100644 blog/themes/anzhiyu/source/css/_extra/aside_weixin/aside_weixin.css create mode 100644 blog/themes/anzhiyu/source/css/_extra/catalog_list/catalog_list.css create mode 100644 blog/themes/anzhiyu/source/css/_extra/categoryBar/categoryBar.css create mode 100644 blog/themes/anzhiyu/source/css/_extra/clock/clock.css create mode 100644 blog/themes/anzhiyu/source/css/_extra/code/code.css create mode 100644 blog/themes/anzhiyu/source/css/_extra/code/details_summary.css create mode 100644 blog/themes/anzhiyu/source/css/_extra/commentBarrage/commentBarrage.css create mode 100644 blog/themes/anzhiyu/source/css/_extra/console/console.css create mode 100644 blog/themes/anzhiyu/source/css/_extra/essay_page/essay_page.css create mode 100644 blog/themes/anzhiyu/source/css/_extra/essay_page/home_essay_bar.css create mode 100644 blog/themes/anzhiyu/source/css/_extra/fix/aplayer.css create mode 100644 blog/themes/anzhiyu/source/css/_extra/fix/bilibili-bangumi.css create mode 100644 blog/themes/anzhiyu/source/css/_extra/fix/bilibili-ratio.css create mode 100644 blog/themes/anzhiyu/source/css/_extra/fix/categories.css create mode 100644 blog/themes/anzhiyu/source/css/_extra/fix/clock.css create mode 100644 blog/themes/anzhiyu/source/css/_extra/fix/comments.css create mode 100644 blog/themes/anzhiyu/source/css/_extra/fix/dark.css create mode 100644 blog/themes/anzhiyu/source/css/_extra/fix/fcircle_page.css create mode 100644 blog/themes/anzhiyu/source/css/_extra/fix/gitcalendar.css create mode 100644 blog/themes/anzhiyu/source/css/_extra/fix/hexo-tag-dplayer.css create mode 100644 blog/themes/anzhiyu/source/css/_extra/fix/hide-block.css create mode 100644 blog/themes/anzhiyu/source/css/_extra/fix/link_page.css create mode 100644 blog/themes/anzhiyu/source/css/_extra/fix/overflow.css create mode 100644 blog/themes/anzhiyu/source/css/_extra/fix/radius.css create mode 100644 blog/themes/anzhiyu/source/css/_extra/fix/site-card.css create mode 100644 blog/themes/anzhiyu/source/css/_extra/footer/footer.css create mode 100644 blog/themes/anzhiyu/source/css/_extra/friends/friends.css create mode 100644 blog/themes/anzhiyu/source/css/_extra/greeting_box/greeting_box.css create mode 100644 blog/themes/anzhiyu/source/css/_extra/home_top/categorygroup.css create mode 100644 blog/themes/anzhiyu/source/css/_extra/home_top/home_top.css create mode 100644 blog/themes/anzhiyu/source/css/_extra/home_top/home_top_post_group.css create mode 100644 blog/themes/anzhiyu/source/css/_extra/home_top/random-banner.css create mode 100644 blog/themes/anzhiyu/source/css/_extra/home_top/swiperstyle.css create mode 100644 blog/themes/anzhiyu/source/css/_extra/home_top/top_group_banner.css create mode 100644 blog/themes/anzhiyu/source/css/_extra/local_search/local_search.css create mode 100644 blog/themes/anzhiyu/source/css/_extra/reset/reset.css create mode 100644 blog/themes/anzhiyu/source/css/_extra/reward/about-reward.css create mode 100644 blog/themes/anzhiyu/source/css/_extra/room/room.css create mode 100644 blog/themes/anzhiyu/source/css/_extra/runtime/runtime.css create mode 100644 blog/themes/anzhiyu/source/css/_extra/single_card/single_card.css create mode 100644 blog/themes/anzhiyu/source/css/_extra/skills/skills.css create mode 100644 blog/themes/anzhiyu/source/css/_extra/tag/link.css create mode 100644 blog/themes/anzhiyu/source/css/_extra/tag/site.css create mode 100644 blog/themes/anzhiyu/source/css/_global/function.styl create mode 100644 blog/themes/anzhiyu/source/css/_global/icon.styl create mode 100644 blog/themes/anzhiyu/source/css/_global/index.styl create mode 100644 blog/themes/anzhiyu/source/css/_global/loading.styl create mode 100644 blog/themes/anzhiyu/source/css/_highlight/highlight.styl create mode 100644 blog/themes/anzhiyu/source/css/_highlight/highlight/diff.styl create mode 100644 blog/themes/anzhiyu/source/css/_highlight/highlight/index.styl create mode 100644 blog/themes/anzhiyu/source/css/_highlight/prismjs/diff.styl create mode 100644 blog/themes/anzhiyu/source/css/_highlight/prismjs/index.styl create mode 100644 blog/themes/anzhiyu/source/css/_highlight/prismjs/line-number.styl create mode 100644 blog/themes/anzhiyu/source/css/_highlight/theme.styl create mode 100644 blog/themes/anzhiyu/source/css/_layout/404.styl create mode 100644 blog/themes/anzhiyu/source/css/_layout/aside.styl create mode 100644 blog/themes/anzhiyu/source/css/_layout/banner.styl create mode 100644 blog/themes/anzhiyu/source/css/_layout/chat.styl create mode 100644 blog/themes/anzhiyu/source/css/_layout/comments.styl create mode 100644 blog/themes/anzhiyu/source/css/_layout/footer.styl create mode 100644 blog/themes/anzhiyu/source/css/_layout/head.styl create mode 100644 blog/themes/anzhiyu/source/css/_layout/home_top.styl create mode 100644 blog/themes/anzhiyu/source/css/_layout/nav.styl create mode 100644 blog/themes/anzhiyu/source/css/_layout/oneGraphFlow.styl create mode 100644 blog/themes/anzhiyu/source/css/_layout/pagination.styl create mode 100644 blog/themes/anzhiyu/source/css/_layout/post.styl create mode 100644 blog/themes/anzhiyu/source/css/_layout/ptool.styl create mode 100644 blog/themes/anzhiyu/source/css/_layout/relatedposts.styl create mode 100644 blog/themes/anzhiyu/source/css/_layout/reward.styl create mode 100644 blog/themes/anzhiyu/source/css/_layout/rightmenu.styl create mode 100644 blog/themes/anzhiyu/source/css/_layout/rightside.styl create mode 100644 blog/themes/anzhiyu/source/css/_layout/shortcutKey.styl create mode 100644 blog/themes/anzhiyu/source/css/_layout/sidebar.styl create mode 100644 blog/themes/anzhiyu/source/css/_layout/third-party.styl create mode 100644 blog/themes/anzhiyu/source/css/_mode/darkmode.styl create mode 100644 blog/themes/anzhiyu/source/css/_mode/readmode.styl create mode 100644 blog/themes/anzhiyu/source/css/_page/404.styl create mode 100644 blog/themes/anzhiyu/source/css/_page/about.styl create mode 100644 blog/themes/anzhiyu/source/css/_page/archives.styl create mode 100644 blog/themes/anzhiyu/source/css/_page/categories.styl create mode 100644 blog/themes/anzhiyu/source/css/_page/common.styl create mode 100644 blog/themes/anzhiyu/source/css/_page/equipment.styl create mode 100644 blog/themes/anzhiyu/source/css/_page/flink.styl create mode 100644 blog/themes/anzhiyu/source/css/_page/homepage.styl create mode 100644 blog/themes/anzhiyu/source/css/_page/music.styl create mode 100644 blog/themes/anzhiyu/source/css/_page/reward.styl create mode 100644 blog/themes/anzhiyu/source/css/_page/tag_page.styl create mode 100644 blog/themes/anzhiyu/source/css/_page/tags.styl create mode 100644 blog/themes/anzhiyu/source/css/_search/algolia.styl create mode 100644 blog/themes/anzhiyu/source/css/_search/index.styl create mode 100644 blog/themes/anzhiyu/source/css/_search/local-search.styl create mode 100644 blog/themes/anzhiyu/source/css/_tags/Introduction-card.styl create mode 100644 blog/themes/anzhiyu/source/css/_tags/bilbili.styl create mode 100644 blog/themes/anzhiyu/source/css/_tags/btns.styl create mode 100644 blog/themes/anzhiyu/source/css/_tags/button.styl create mode 100644 blog/themes/anzhiyu/source/css/_tags/checkbox.styl create mode 100644 blog/themes/anzhiyu/source/css/_tags/folding.styl create mode 100644 blog/themes/anzhiyu/source/css/_tags/gallery.styl create mode 100644 blog/themes/anzhiyu/source/css/_tags/hexo.styl create mode 100644 blog/themes/anzhiyu/source/css/_tags/hide.styl create mode 100644 blog/themes/anzhiyu/source/css/_tags/image.styl create mode 100644 blog/themes/anzhiyu/source/css/_tags/inline-labels.styl create mode 100644 blog/themes/anzhiyu/source/css/_tags/inlineImg.styl create mode 100644 blog/themes/anzhiyu/source/css/_tags/label.styl create mode 100644 blog/themes/anzhiyu/source/css/_tags/media.styl create mode 100644 blog/themes/anzhiyu/source/css/_tags/note.styl create mode 100644 blog/themes/anzhiyu/source/css/_tags/site-card.styl create mode 100644 blog/themes/anzhiyu/source/css/_tags/span.styl create mode 100644 blog/themes/anzhiyu/source/css/_tags/tabs.styl create mode 100644 blog/themes/anzhiyu/source/css/_tags/timeline.styl create mode 100644 blog/themes/anzhiyu/source/css/_tags/tip.styl create mode 100644 blog/themes/anzhiyu/source/css/_third-party/normalize.min.css create mode 100644 blog/themes/anzhiyu/source/css/_third-party/snackbar.styl create mode 100644 blog/themes/anzhiyu/source/css/_third-party/twikoo.styl create mode 100644 blog/themes/anzhiyu/source/css/index.styl create mode 100644 blog/themes/anzhiyu/source/css/var.styl create mode 100644 blog/themes/anzhiyu/source/favicon.ico create mode 100644 blog/themes/anzhiyu/source/img/404.jpg create mode 100644 blog/themes/anzhiyu/source/img/512.png create mode 100644 blog/themes/anzhiyu/source/img/algolia.svg create mode 100644 blog/themes/anzhiyu/source/img/comment_bg.png create mode 100644 blog/themes/anzhiyu/source/img/default_cover.jpg create mode 100644 blog/themes/anzhiyu/source/img/favicon.ico create mode 100644 blog/themes/anzhiyu/source/img/friend_404.gif create mode 100644 blog/themes/anzhiyu/source/img/loading.gif create mode 100644 blog/themes/anzhiyu/source/img/siteicon/16.png create mode 100644 blog/themes/anzhiyu/source/img/siteicon/32.png create mode 100644 blog/themes/anzhiyu/source/img/siteicon/apple-icon-180.png create mode 100644 blog/themes/anzhiyu/source/img/siteicon/manifest-icon-192.maskable.png create mode 100644 blog/themes/anzhiyu/source/img/siteicon/manifest-icon-512.maskable.png create mode 100644 blog/themes/anzhiyu/source/js/anzhiyu/ai_abstract.js create mode 100644 blog/themes/anzhiyu/source/js/anzhiyu/comment_barrage.js create mode 100644 blog/themes/anzhiyu/source/js/anzhiyu/people.js create mode 100644 blog/themes/anzhiyu/source/js/anzhiyu/random_friends_post.js create mode 100644 blog/themes/anzhiyu/source/js/anzhiyu/right_click_menu.js create mode 100644 blog/themes/anzhiyu/source/js/main.js create mode 100644 blog/themes/anzhiyu/source/js/search/algolia.js create mode 100644 blog/themes/anzhiyu/source/js/search/local-search.js create mode 100644 blog/themes/anzhiyu/source/js/tw_cn.js create mode 100644 blog/themes/anzhiyu/source/js/utils.js create mode 100644 blog/themes/anzhiyu/sw-rules.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6e194c6 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.pnpm-store \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..e69de29 diff --git a/blog/.github/dependabot.yml b/blog/.github/dependabot.yml new file mode 100644 index 0000000..93385d9 --- /dev/null +++ b/blog/.github/dependabot.yml @@ -0,0 +1,7 @@ +version: 2 +updates: +- package-ecosystem: npm + directory: "/" + schedule: + interval: daily + open-pull-requests-limit: 20 diff --git a/blog/.gitignore b/blog/.gitignore new file mode 100644 index 0000000..63f307b --- /dev/null +++ b/blog/.gitignore @@ -0,0 +1,8 @@ +.DS_Store +Thumbs.db +db.json +*.log +node_modules/ +public/ +.deploy*/ +_multiconfig.yml \ No newline at end of file diff --git a/blog/_config.anzhiyu.yml b/blog/_config.anzhiyu.yml new file mode 100644 index 0000000..dc87d35 --- /dev/null +++ b/blog/_config.anzhiyu.yml @@ -0,0 +1,1347 @@ +menu: + # 文章: + # 隧道: /archives/ || anzhiyu-icon-box-archive + # 分类: /categories/ || anzhiyu-icon-shapes + # 标签: /tags/ || anzhiyu-icon-tags + + # 友链: + # 友人帐: /link/ || anzhiyu-icon-link + # 朋友圈: /fcircle/ || anzhiyu-icon-artstation + # 留言板: /comments/ || anzhiyu-icon-envelope + + 我的: + 音乐馆: /music/ || anzhiyu-icon-music + # 追番页: /bangumis/ || anzhiyu-icon-bilibili + # 相册集: /album/ || anzhiyu-icon-images + # 小空调: /air-conditioner/ || anzhiyu-icon-fan + + # 关于: + # 关于本人: /about/ || anzhiyu-icon-paper-plane + # 闲言碎语: /essay/ || anzhiyu-icon-lightbulb + # 随便逛逛: javascript:toRandomPost() || anzhiyu-icon-shoe-prints1 + +# nav相关配置 +nav: + enable: false + travelling: false + clock: false + menu: + - title: 网页 + item: + - name: 博客 + link: https://hexo.anheyu.com/ + icon: /img/favicon.ico + - title: 项目 + item: + - name: 安知鱼图床 + link: https://image.anheyu.com/ + icon: https://image.anheyu.com/favicon.ico + +# mourn (哀悼日,指定日期网站简单变灰,不包括滚动条) +# 注意: 仅网站首页变灰,其他页面正常显示 +mourn: + enable: false + days: [4-5, 5-12, 7-7, 9-18, 12-13] + +# Code Blocks (代码相关) +# -------------------------------------- + +highlight_theme: light # darker / pale night / light / ocean / mac / mac light / false +highlight_copy: true # copy button +highlight_lang: true # show the code language +highlight_shrink: false # true: shrink the code blocks / false: expand the code blocks | none: expand code blocks and hide the button +highlight_height_limit: 330 # unit: px +code_word_wrap: false + +# copy settings +# copyright: Add the copyright information after copied content (複制的内容后面加上版权信息) +# copy: enable 复制后弹窗提示版权信息 +copy: + enable: true + copyright: + enable: false + limit_count: 50 + +# social settings (社交图标设置) +# formal: +# name: link || icon +social: + # Github: https://github.com/anzhiyu-c || anzhiyu-icon-github + # BiliBili: https://space.bilibili.com/372204786 || anzhiyu-icon-bilibili + +# 作者卡片 状态 +author_status: + enable: false + # 可以是任何图片,建议放表情包或者emoji图片,效果都很好,[表情包速查](https://emotion.xiaokang.me/) + statusImg: "https://bu.dusays.com/2023/08/24/64e6ce9c507bb.png" + skills: + # - 🤖️ 数码科技爱好者 + # - 🔍 分享与热心帮助 + # - 🏠 智能家居小能手 + # - 🔨 设计开发一条龙 + # - 🤝 专修交互与设计 + # - 🏃 脚踏实地行动派 + # - 🧱 团队小组发动机 + # - 💢 壮汉人狠话不多 + +# search (搜索) +# -------------------------------------- + +# Algolia search +algolia_search: + enable: false + hits: + per_page: 6 + tags: + - 前端 + - AI + - 自动化 + - dbpod + - datapod + - + # - Hexo + +# Docsearch +# Apply and Option Docs: see https://docsearch.algolia.com/ +# Crawler Admin Console: see https://crawler.algolia.com/ +# Settings: https://www.algolia.com/ +docsearch: + enable: false + appId: # see email + apiKey: # see email + indexName: # see email + option: + +# Local search +local_search: + enable: false + preload: true + CDN: + +# Math (数学) +# -------------------------------------- +# About the per_page +# if you set it to true, it will load mathjax/katex script in each page (true 表示每一页都加载js) +# if you set it to false, it will load mathjax/katex script according to your setting (add the 'mathjax: true' in page's front-matter) +# (false 需要时加载,须在使用的 Markdown Front-matter 加上 mathjax: true) + +# MathJax +mathjax: + enable: false + per_page: false + +# KaTeX +katex: + enable: false + per_page: false + hide_scrollbar: true + +# Image (图片设置) +# -------------------------------------- + +# Favicon(网站图标) +favicon: /favicon.ico + +# Avatar (头像) +avatar: + img: https://bu.dusays.com/2023/04/27/64496e511b09c.jpg + effect: false + +# Disable all banner image +disable_top_img: false + +# The banner image of home page +index_img: false # "background: url() top / cover no-repeat" + +# If the banner of page not setting, it will show the top_img +default_top_img: false + +cover: + # display the cover or not (是否显示文章封面) + index_enable: true + aside_enable: true + archives_enable: true + # the position of cover in home page (封面显示的位置) + # left/right/both + position: left + # When cover is not set, the default cover is displayed (当没有设置cover时,默认的封面显示) + default_cover: + # - /img/default_cover.jpg + +# Replace Broken Images (替换无法显示的图片) +error_img: + flink: /img/friend_404.gif + post_page: /img/404.jpg + +# A simple 404 page +error_404: + enable: true + subtitle: "请尝试站内搜索寻找文章" + background: https://bu.dusays.com/2023/05/08/645907596997d.gif + +post_meta: + page: # Home Page + date_type: created # created or updated or both 主页文章日期是创建日或者更新日或都显示 + date_format: simple # date/relative/simple 显示日期还是相对日期 或者 简单日期 + categories: true # true or false 主页是否显示分类 + tags: true # true or false 主页是否显示标籤 + label: false # true or false 显示描述性文字 + post: + date_type: both # created or updated or both 文章页日期是创建日或者更新日或都显示 + date_format: date # date/relative 显示日期还是相对日期 + categories: true # true or false 文章页是否显示分类 + tags: true # true or false 文章页是否显示标籤 + label: true # true or false 显示描述性文字 + unread: false # true or false 文章未读功能 + +# 主色调相关配置 +mainTone: + enable: false # true or false 文章是否启用获取图片主色调 + mode: api # colorthief/cdn/api/both colorthief模式为前端获取图片主色调,cdn模式为图片url+imageAve参数获取主色调,api模式为请求API获取主色调,both模式会先请求cdn参数,无法获取的情况下将请求API获取,可以在文章内配置main_color: '#3e5658',使用十六进制颜色,则不会请求colorthief/cdn/api/both获取主色调,而是直接使用配置的颜色 + # 项目地址:https://github.com/anzhiyu-c/img2color-go + api: https://img2color-go.vercel.app/api?img= # mode为api时可填写 + cover_change: true # 整篇文章跟随cover修改主色调 + +# wordcount (字数统计) +wordcount: + enable: false + post_wordcount: true + min2read: true + total_wordcount: true + +# Display the article introduction on homepage +# 1: description +# 2: both (if the description exists, it will show description, or show the auto_excerpt) +# 3: auto_excerpt (default) +# false: do not show the article introduction +index_post_content: + method: 3 + length: 500 # if you set method to 2 or 3, the length need to config + +# anchor +# when you scroll in post, the URL will update according to header id. +anchor: false + +# Post +# -------------------------------------- + +# toc (目录) +toc: + post: true + page: false + number: true + expand: false + style_simple: false # for post + +post_copyright: + enable: true + decode: false + author_href: + location: 长沙 + license: CC BY-NC-SA 4.0 + license_url: https://creativecommons.org/licenses/by-nc-sa/4.0/ + avatarSinks: false # hover时头像下沉 + copyright_author_img_back: + copyright_author_img_front: + copyright_author_link: / + +# Sponsor/reward +reward: + enable: false + QR_code: + - img: https://npm.elemecdn.com/anzhiyu-blog@1.1.6/img/post/common/qrcode-weichat.png + link: + text: 微信 + - img: https://npm.elemecdn.com/anzhiyu-blog@1.1.6/img/post/common/qrcode-alipay.png + link: + text: 支付宝 + +# Post edit +# Easily browse and edit blog source code online. +post_edit: # 目前仅可选择一个平台在线编辑 + enable: false + # github: https://github.com/user-name/repo-name/edit/branch-name/subdirectory-name/ + # For example: https://github.com/jerryc127/butterfly.js.org/edit/main/source/ + github: false + + # yuque: https://www.yuque.com/user-name/repo-name/ + # 示例: https://www.yuque.com/yuque/yuque/ + # 你需要在语雀文章 Front Matter 添加参数 id 并确保其唯一性(例如 “id: yuque”, “id: 01”) + yuque: false + +# Related Articles +related_post: + enable: true + limit: 6 # Number of posts displayed + date_type: created # or created or updated 文章日期显示创建日或者更新日 + +# figcaption (图片描述文字) +photofigcaption: false + +# post_pagination (分页) +# value: 1 || 2 || 3 || 4 || false +# 1: The 'next post' will link to old post +# 2: The 'next post' will link to new post +# 3: 只有下一篇,并且只在文章滚动到评论区时显示下一篇文章(旧文章) +# 4: 只有下一篇,并且只在文章滚动到评论区时显示下一篇文章(旧文章) 显示图片cover +# false: disable pagination +post_pagination: 2 + +# Displays outdated notice for a post (文章过期提醒) +noticeOutdate: + enable: false + style: flat # style: simple/flat + limit_day: 365 # When will it be shown + position: top # position: top/bottom + message_prev: It has been + message_next: days since the last update, the content of the article may be outdated. + +# Share System (分享功能) +# -------------------------------------- + +# Share.js +# https://github.com/overtrue/share.js +sharejs: + enable: true + sites: facebook,twitter,wechat,weibo,qq + +# AddToAny +# https://www.addtoany.com/ +addtoany: + enable: false + item: facebook,twitter,wechat,sina_weibo,email,copy_link + +# Comments System +# -------------------------------------- + +comments: + # Up to two comments system, the first will be shown as default + # Choose: Valine/Waline/Twikoo/Artalk + use: # Twikoo/Waline + text: true # Display the comment name next to the button + # lazyload: The comment system will be load when comment element enters the browser's viewport. + # If you set it to true, the comment count will be invalid + lazyload: false + count: false # Display comment count in post's top_img + card_post_count: false # Display comment count in Home Page + +# valine +# https://valine.js.org +valine: + appId: xxxxx # leancloud application app id + appKey: xxxxx # leancloud application app key + pageSize: 10 # comment list page size + avatar: mp # gravatar style https://valine.js.org/#/avatar + lang: zh-CN # i18n: zh-CN/zh-TW/en/ja + placeholder: 填写QQ邮箱就会使用QQ头像喔~. # valine comment input placeholder (like: Please leave your footprints) + guest_info: nick,mail,link # valine comment header info (nick/mail/link) + recordIP: false # Record reviewer IP + serverURLs: # This configuration is suitable for domestic custom domain name users, overseas version will be automatically detected (no need to manually fill in) + bg: /img/comment_bg.png # valine background + emojiCDN: //i0.hdslb.com/bfs/emote/ # emoji CDN + enableQQ: true # enable the Nickname box to automatically get QQ Nickname and QQ Avatar + requiredFields: nick,mail # required fields (nick/mail) + visitor: false + master: + - xxxxx + friends: + - xxxxxx + tagMeta: "博主,小伙伴,访客" + option: + +# waline - A simple comment system with backend support fork from Valine +# https://waline.js.org/ +waline: + serverURL: # Waline server address url + bg: # Waline background + pageview: false + meta_css: false # 是否引入 waline-meta.css ,以便显示 meta图标 + imageUploader: true # 配置为 > 换行后可自定义图片上传逻辑,示例: https://waline.js.org/cookbook/customize/upload-image.html#案例 + # 以下为可选配置,后续若有新增/修改配置参数可在此自行添加/修改 + option: + +# Twikoo +# https://github.com/imaegoo/twikoo +twikoo: + envId: + region: + visitor: false + option: + +# Artalk +# https://artalk.js.org/guide/frontend/config.html +artalk: + server: + site: + visitor: false + option: + +# giscus +# https://giscus.app/ +giscus: + repo: # GitHub repository name + repo_id: # GitHub repository id + category_id: # GitHub repository category id + theme: + light: light + dark: dark + option: # options + data-lang: zh-CN + data-mapping: + data-category: + data-input-position: + +# Chat Services +# -------------------------------------- + +# Chat Button [recommend] +# It will create a button in the bottom right corner of website, and hide the origin button +chat_btn: false + +# The origin chat button is displayed when scrolling up, and the button is hidden when scrolling down +chat_hide_show: false + +# chatra +# https://chatra.io/ +chatra: + enable: false + id: + +# tidio +# https://www.tidio.com/ +tidio: + enable: false + public_key: + +# daovoice +# http://daovoice.io/ +daovoice: + enable: false + app_id: + +# crisp +# https://crisp.chat/en/ +crisp: + enable: false + website_id: + +# Footer Settings +# -------------------------------------- +footer: + owner: + enable: true + since: 2025 + custom_text: + runtime: + enable: true + launch_time: 12/01/2025 00:00:00 # 网站上线时间 + work_img: https://npm.elemecdn.com/anzhiyu-blog@2.0.4/img/badge/安知鱼-上班摸鱼中.svg + work_description: 距离月入25k也就还差一个大佬带我~ + offduty_img: https://npm.elemecdn.com/anzhiyu-blog@2.0.4/img/badge/安知鱼-下班啦.svg + offduty_description: 下班了就该开开心心的玩耍,嘿嘿~ + # 徽标部分配置项 https://shields.io/ + # https://img.shields.io/badge/CDN-jsDelivr-orange?style=flat&logo=jsDelivr + bdageitem: + enable: false + list: + - link: https://hexo.io/ #徽标指向网站链接 + shields: https://npm.elemecdn.com/anzhiyu-blog@2.1.5/img/badge/Frame-Hexo.svg #徽标API + message: 博客框架为Hexo_v5.4.0 #徽标提示语 + - link: https://hexo.anheyu.com/ + shields: https://npm.elemecdn.com/anzhiyu-theme-static@1.0.9/img/Theme-AnZhiYu-2E67D3.svg + message: 本站使用AnZhiYu主题 + # - link: https://www.dogecloud.com/ + # shields: https://npm.elemecdn.com/anzhiyu-blog@2.2.0/img/badge/CDN-多吉云-3693F3.svg + # message: 本站使用多吉云为静态资源提供CDN加速 + # - link: https://github.com/ + # shields: https://npm.elemecdn.com/anzhiyu-blog@2.1.5/img/badge/Source-Github.svg + # message: 本站项目由Github托管 + # - link: http://creativecommons.org/licenses/by-nc-sa/4.0/ + # shields: https://npm.elemecdn.com/anzhiyu-blog@2.2.0/img/badge/Copyright-BY-NC-SA.svg + # message: 本站采用知识共享署名-非商业性使用-相同方式共享4.0国际许可协议进行许可 + socialBar: + enable: false + centerImg: + left: + # - title: email + # link: mailto:anzhiyu-c@qq.com + # icon: anzhiyu-icon-envelope + # - title: 微博 + # link: https://weibo.com/u/6378063631 + # icon: anzhiyu-icon-weibo + # - title: facebook + # link: https://www.facebook.com/profile.php?id=100092208016287&sk=about + # icon: anzhiyu-icon-facebook1 + # - title: RSS + # link: atom.xml + # icon: anzhiyu-icon-rss + right: + # - title: Github + # link: https://github.com/anzhiyu-c + # icon: anzhiyu-icon-github + # - title: Bilibili + # link: https://space.bilibili.com/372204786 + # icon: anzhiyu-icon-bilibili + # - title: 抖音 + # link: https://v.douyin.com/DwCpMEy/ + # icon: anzhiyu-icon-tiktok + # - title: CC + # link: /copyright + # icon: anzhiyu-icon-copyright-line + list: + enable: false + randomFriends: 3 + project: + # - title: 服务 + # links: + # - title: 51la统计 + # link: https://v6.51.la/ + # - title: 十年之约 + # link: https://www.foreverblog.cn/ + # - title: 开往 + # link: https://github.com/travellings-link/travellings + # - title: 主题 + # links: + # - title: 文档 + # link: /docs/ + # - title: 源码 + # link: https://github.com/anzhiyu-c/hexo-theme-anzhiyu + # - title: 更新日志 + # link: /update/ + # - title: 导航 + # links: + # - title: 即刻短文 + # link: /essay/ + # - title: 友链文章 + # link: /fcircle/ + # - title: 留言板 + # link: /comments/ + # - title: 协议 + # links: + # - title: 隐私协议 + # link: /privacy/ + # - title: Cookies + # link: /cookies/ + # - title: 版权协议 + # link: /copyright/ + footerBar: + enable: true + authorLink: / + cc: + enable: false + link: /copyright + linkList: + - link: https://github.com/anzhiyu-c/hexo-theme-anzhiyu + text: 主题 + # - link: https://image.anheyu.com + # text: 图床 + # - link: https://beian.miit.gov.cn/ + # text: 湘ICP备-xxxxxxx号 + subTitle: + enable: false + # Typewriter Effect (打字效果) + effect: true + # Effect Speed Options (打字效果速度参数) + startDelay: 300 # time before typing starts in milliseconds + typeSpeed: 150 # type speed in milliseconds + backSpeed: 50 # backspacing speed in milliseconds + # loop (循环打字) + loop: true + # source 调用第三方服务 + # source: false 关闭调用 + # source: 1 调用一言网的一句话(简体) https://hitokoto.cn/ + # source: 2 调用一句网(简体) http://yijuzhan.com/ + # source: 3 调用今日诗词(简体) https://www.jinrishici.com/ + # subtitle 会先显示 source , 再显示 sub 的内容 + source: 1 + # 如果关闭打字效果,subtitle 只会显示 sub 的第一行文字 + sub: + # - 生活明朗, 万物可爱, 人间值得, 未来可期. + +# Analysis +# -------------------------------------- + +# Baidu Analytics +# https://tongji.baidu.com/web/welcome/login +baidu_analytics: + +# Google Analytics +# https://analytics.google.com/analytics/web/ +google_analytics: + +# CNZZ Analytics +# https://www.umeng.com/ +cnzz_analytics: + +# Cloudflare Analytics +# https://www.cloudflare.com/zh-tw/web-analytics/ +cloudflare_analytics: + +# Microsoft Clarity +# https://clarity.microsoft.com/ +microsoft_clarity: + +# Advertisement +# -------------------------------------- + +# Google Adsense (谷歌广告) +google_adsense: + enable: false + auto_ads: true + js: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js + client: + enable_page_level_ads: true + +# Insert ads manually (手动插入广告) +# ad: +# index: +# aside: +# post: + +# Verification (站长验证) +# -------------------------------------- + +site_verification: + - name: google-site-verification + content: xxx + - name: baidu-site-verification + content: code-xxx + - name: msvalidate.01 + content: xxx + +# Beautify/Effect (美化/效果) +# -------------------------------------- + +# Theme color for customize +# Notice: color value must in double quotes like "#000" or may cause error! + +theme_color: + enable: true + main: "#425AEF" + dark_main: "#f2b94b" + paginator: "#425AEF" + # button_hover: "#FF7242" + text_selection: "#2128bd" + link_color: "var(--anzhiyu-fontcolor)" + meta_color: "var(--anzhiyu-fontcolor)" + hr_color: "#4259ef23" + code_foreground: "#fff" + code_background: "var(--anzhiyu-code-stress)" + toc_color: "#425AEF" + # blockquote_padding_color: "#425AEF" + # blockquote_background_color: "#425AEF" + scrollbar_color: "var(--anzhiyu-scrollbar)" + meta_theme_color_light: "#f7f9fe" + meta_theme_color_dark: "#18171d" + +# 移动端侧栏 +sidebar: + site_data: + archive: true + tag: true + category: true + menus_items: true + tags_cloud: true + display_mode: true + nav_menu_project: true + +# 文章h2添加分隔线 +h2Divider: false + +# 表格隔行变色 +table_interlaced_discoloration: false + +# 首页双栏显示 +article_double_row: true + +# The top_img settings of home page +# default: top img - full screen, site info - middle (默认top_img全屏,site_info在中间) +# The position of site info, eg: 300px/300em/300rem/10% (主页标题距离顶部距离) +index_site_info_top: +# The height of top_img, eg: 300px/300em/300rem (主页top_img高度) +index_top_img_height: + +# The user interface setting of category and tag page (category和tag页的UI设置) +# index - same as Homepage UI (index 值代表 UI将与首页的UI一样) +# default - same as archives UI 默认跟archives页面UI一样 +category_ui: # 留空或 index +tag_ui: # 留空或 index + +# Footer Background +footer_bg: false + +# the position of bottom right button/default unit: px (右下角按钮距离底部的距离/默认单位为px) +rightside-bottom: 100px + +# Background effects (背景特效) +# -------------------------------------- + +# canvas_ribbon (静止彩带背景) +# See: https://github.com/hustcc/ribbon.js +canvas_ribbon: + enable: false + size: 150 + alpha: 0.6 + zIndex: -1 + click_to_change: false + mobile: false + +# Fluttering Ribbon (动态彩带) +canvas_fluttering_ribbon: + enable: false + mobile: false + +# canvas_nest +# https://github.com/hustcc/canvas-nest.js +canvas_nest: + enable: false + color: "0,0,255" #color of lines, default: '0,0,0'; RGB values: (R,G,B).(note: use ',' to separate.) + opacity: 0.7 # the opacity of line (0~1), default: 0.5. + zIndex: -1 # z-index property of the background, default: -1. + count: 99 # the number of lines, default: 99. + mobile: false + +# Typewriter Effect (打字效果) +# https://github.com/disjukr/activate-power-mode +activate_power_mode: + enable: false + colorful: true # open particle animation (冒光特效) + shake: false # open shake (抖动特效) + mobile: false + +# Mouse click effects: fireworks (鼠标点击效果: 烟火特效) +fireworks: + enable: false + zIndex: 9999 # -1 or 9999 + mobile: false + +# Mouse click effects: Heart symbol (鼠标点击效果: 爱心) +click_heart: + enable: false + mobile: false + +# Mouse click effects: words (鼠标点击效果: 文字) +ClickShowText: + enable: false + text: + # - I + # - LOVE + # - YOU + fontSize: 15px + random: false + mobile: false + +# Default display mode (网站默认的显示模式) +# light (default) / dark +display_mode: light + +# Beautify (美化页面显示) +beautify: + enable: true + field: post # site/post + title-prefix-icon: '\f0c1' + title-prefix-icon-color: "#F47466" + +# Global font settings +# Don't modify the following settings unless you know how they work (非必要不要修改) +font: + global-font-size: 16px + code-font-size: + font-family: + code-font-family: consolas, Menlo, "PingFang SC", "Microsoft JhengHei", "Microsoft YaHei", sans-serif + +# Font settings for the site title and site subtitle +# 左上角网站名字 主页居中网站名字 +blog_title_font: + font_link: + font-family: PingFang SC, 'Hiragino Sans GB', 'Microsoft JhengHei', 'Microsoft YaHei', sans-serif + +# The setting of divider icon (水平分隔线图标设置) +hr_icon: + enable: true + icon: \f0c4 # the unicode value of Font Awesome icon, such as '\f0c4' + icon-top: + +# the subtitle on homepage (主页subtitle) +subtitle: + enable: false + # Typewriter Effect (打字效果) + effect: true + # Effect Speed Options (打字效果速度参数) + startDelay: 300 # time before typing starts in milliseconds + typeSpeed: 150 # type speed in milliseconds + backSpeed: 50 # backspacing speed in milliseconds + # loop (循环打字) + loop: true + # source 调用第三方服务 + # source: false 关闭调用 + # source: 1 调用一言网的一句话(简体) https://hitokoto.cn/ + # source: 2 调用一句网(简体) http://yijuzhan.com/ + # source: 3 调用今日诗词(简体) https://www.jinrishici.com/ + # subtitle 会先显示 source , 再显示 sub 的内容 + source: 1 + # 如果关闭打字效果,subtitle 只会显示 sub 的第一行文字 + sub: + # - 生活明朗,万物可爱,人间值得,未来可期. + +# Loading Animation (加载动画) +preloader: + enable: true + # source + # 1. fullpage-loading + # 2. pace (progress bar) + # else all + source: 3 + # pace theme (see https://codebyzach.github.io/pace/) + pace_css_url: + avatar: https://npm.elemecdn.com/anzhiyu-blog-static@1.0.4/img/avatar.jpg # 自定加载动画义头像 + +# aside (侧边栏) +# -------------------------------------- + +aside: + enable: true + hide: false + button: true + mobile: true # display on mobile + position: right # left or right + display: # 控制对应详情页面是否显示侧边栏 + archive: true + tag: true + category: true + card_author: + enable: true + description: #
这有关于产品、设计、开发相关的问题和看法,还有文章翻译分享
相信你可以在这里找到对你有用的知识教程
# 默认为站点描述 + name_link: / + + card_announcement: + enable: false + content: 欢迎来看我的博客鸭~ + card_weixin: + enable: true + face: https://bu.dusays.com/2023/01/13/63c02edf44033.png + backFace: https://bu.dusays.com/2023/05/13/645fa415e8694.png + card_recent_post: + enable: true + limit: 5 # if set 0 will show all + sort: date # date or updated + sort_order: # Don't modify the setting unless you know how it works + card_categories: + enable: false + limit: 8 # if set 0 will show all + expand: none # none/true/false + sort_order: # Don't modify the setting unless you know how it works + card_tags: + enable: true + limit: 40 # if set 0 will show all + color: false + sort_order: # Don't modify the setting unless you know how it works + highlightTags: + # - Hexo + # - 前端 + card_archives: + enable: true + type: monthly # yearly or monthly + format: MMMM YYYY # eg: YYYY年MM月 + order: -1 # Sort of order. 1, asc for ascending; -1, desc for descending + limit: 8 # if set 0 will show all + sort_order: # Don't modify the setting unless you know how it works + card_webinfo: + enable: true + post_count: true + last_push_date: false + sort_order: # Don't modify the setting unless you know how it works + +# busuanzi count for PV / UV in site +# 访问人数 +busuanzi: + site_uv: false + site_pv: false + page_pv: false + +# Time difference between publish date and now (网页运行时间) +# Formal: Month/Day/Year Time or Year/Month/Day Time +runtimeshow: + enable: true + publish_date: 4/1/2021 00:00:00 + +# Console - Newest Comments +newest_comments: + enable: true + sort_order: # Don't modify the setting unless you know how it works + limit: 6 + storage: 10 # unit: mins, save data to localStorage + avatar: true + +# Bottom right button (右下角按钮) +# -------------------------------------- + +# Conversion between Traditional and Simplified Chinese (简繁转换) +translate: + enable: true + # The text of a button + default: 繁 + # Right-click menu default text + rightMenuMsgDefault: "轉為繁體" + # the language of website (1 - Traditional Chinese/ 2 - Simplified Chinese) + defaultEncoding: 2 + # Time delay + translateDelay: 0 + # The text of the button when the language is Simplified Chinese + msgToTraditionalChinese: "繁" + # The text of the button when the language is Traditional Chinese + msgToSimplifiedChinese: "简" + # Right-click the menu to traditional Chinese + rightMenuMsgToTraditionalChinese: "转为繁体" + # Right-click menu to simplified Chinese + rightMenuMsgToSimplifiedChinese: "转为简体" + +# Read Mode (閲读模式) +readmode: true + +# 中控台 +centerConsole: + enable: true + card_tags: + enable: true + limit: 40 # if set 0 will show all + color: false + sort_order: # Don't modify the setting unless you know how it works + highlightTags: + # - Hexo + # - 前端 + card_archives: + enable: true + type: monthly # yearly or monthly + format: MMMM YYYY # eg: YYYY年MM月 + order: -1 # Sort of order. 1, asc for ascending; -1, desc for descending + limit: 8 # if set 0 will show all + sort_order: # Don't modify the setting unless you know how it works + +# dark mode +darkmode: + enable: true + # Toggle Button to switch dark/light mode + button: true + # Switch dark/light mode automatically (自动切换 dark mode和 light mode) + # autoChangeMode: 1 Following System Settings, if the system doesn't support dark mode, it will switch dark mode between 6 pm to 6 am + # autoChangeMode: 2 Switch dark mode between 6 pm to 6 am + # autoChangeMode: false + autoChangeMode: 1 + start: # 8 + end: # 22 + +# Don't modify the following settings unless you know how they work (非必要请不要修改 ) +# Choose: readmode,translate,darkmode,hideAside,toc,chat,comment +# Don't repeat 不要重複 +rightside_item_order: + enable: false + hide: # readmode,translate,darkmode,hideAside + show: # toc,chat,comment + +# Lightbox (图片大图查看模式) +# -------------------------------------- +# You can only choose one, or neither (只能选择一个 或者 两个都不选) + +# medium-zoom +# https://github.com/francoischalifour/medium-zoom +medium_zoom: false + +# fancybox +# http://fancyapps.com/fancybox/3/ +fancybox: true + +# Tag Plugins settings (标籤外挂) +# -------------------------------------- + +# mermaid +# see https://github.com/mermaid-js/mermaid +mermaid: + enable: false + # built-in themes: default/forest/dark/neutral + theme: + light: default + dark: dark + +# Note (Bootstrap Callout) +note: + # Note tag style values: + # - simple bs-callout old alert style. Default. + # - modern bs-callout new (v2-v3) alert style. + # - flat flat callout style with background, like on Mozilla or StackOverflow. + # - disabled disable all CSS styles import of note tag. + style: flat + icons: true + border_radius: 3 + # Offset lighter of background in % for modern and flat styles (modern: -12 | 12; flat: -18 | 6). + # Offset also applied to label tag variables. This option can work with disabled note tag. + light_bg_offset: 0 + +icons: + ali_iconfont_js: # 阿里图标symbol 引用链接,主题会进行加载 symbol 引用 + fontawesome: false #是否启用fontawesome6图标 + fontawesome_animation_css: #fontawesome_animation 如果有就会加载,示例值:https://npm.elemecdn.com/hexo-butterfly-tag-plugins-plus@1.0.17/lib/assets/font-awesome-animation.min.css + +# other +# -------------------------------------- + +# Pjax +# It may contain bugs and unstable, give feedback when you find the bugs. +# https://github.com/MoOx/pjax +pjax: + enable: true + exclude: + # - xxxx + # - xxxx + +# Inject the css and script (aplayer/meting) +aplayerInject: + enable: true + per_page: true + +# Snackbar (Toast Notification 弹窗) +# https://github.com/polonel/SnackBar +# position 弹窗位置 +# 可选 top-left / top-center / top-right / bottom-left / bottom-center / bottom-right +snackbar: + enable: true + position: top-center + bg_light: "#425AEF" # The background color of Toast Notification in light mode + bg_dark: "#1f1f1f" # The background color of Toast Notification in dark mode + +# https://instant.page/ +# prefetch (预加载) +instantpage: true + +# https://github.com/vinta/pangu.js +# Insert a space between Chinese character and English character (中英文之间添加空格) +pangu: + enable: false + field: site # site/post + +# Lazyload (图片懒加载) +# https://github.com/verlok/vanilla-lazyload +lazyload: + enable: true + field: site # site/post + placeholder: + blur: true + progressive: true + +# PWA +# See https://github.com/JLHwung/hexo-offline +# --------------- +pwa: + enable: false + startup_image_enable: true + manifest: /manifest.json + theme_color: var(--anzhiyu-main) + mask_icon: /img/siteicon/apple-icon-180.png + apple_touch_icon: /img/siteicon/apple-icon-180.png + bookmark_icon: /img/siteicon/apple-icon-180.png + favicon_32_32: /img/siteicon/32.png + favicon_16_16: /img/siteicon/16.png + +# Open graph meta tags +# https://developers.facebook.com/docs/sharing/webmasters/ +Open_Graph_meta: true + +# Add the vendor prefixes to ensure compatibility +css_prefix: true + +# 首页顶部相关配置 +home_top: + enable: true # 开关 + timemode: date #date/updated + title: 生活明朗 + subTitle: 万物可爱。 + siteText: anheyu.com + category: + - name: 前端 + path: /categories/前端开发/ + shadow: var(--anzhiyu-shadow-blue) + class: blue + icon: anzhiyu-icon-dove + - name: AI开发 + path: /categories/AI开发/ + shadow: var(--anzhiyu-shadow-red) + class: red + icon: anzhiyu-icon-fire + - name: 生活 + path: /categories/生活日常/ + shadow: var(--anzhiyu-shadow-green) + class: green + icon: anzhiyu-icon-book + default_descr: 再怎么看我也不知道怎么描述它的啦! + swiper: + enable: false + swiper_css: https://npm.elemecdn.com/anzhiyu-theme-static@1.0.0/swiper/swiper.min.css #swiper css依赖 + swiper_js: https://npm.elemecdn.com/anzhiyu-theme-static@1.0.0/swiper/swiper.min.js #swiper js依赖 + banner: + tips: 新品主题 + title: Theme-AnZhiYu + image: https://bu.dusays.com/2023/05/13/645fa3cf90d70.webp + link: https://docs.anheyu.com/ + +# 朋友圈配置 +friends_vue: + enable: false + vue_js: https://npm.elemecdn.com/anzhiyu-theme-static@1.1.1/friends/index.4f887d95.js + apiurl: # 朋友圈后端地址 + top_tips: 使用 友链朋友圈 订阅友链最新文章 + top_background: + +# 深色模式粒子效果canvas +universe: + enable: true + +# 页面卡片顶部气泡升起效果 +bubble: + enable: false + +# 控制台打印信息 +console: + enable: true + +# 51a统计配置 +LA: + enable: false + ck: + LingQueMonitorID: + +# Umami 统计配置(关于页面访问统计卡片) +# 文档: https://umami.is/docs/api +umami: + enable: false + # Umami API 地址,如 https://analytics.example.com + apiHost: + # 网站 ID + websiteId: + # API Token(在 Umami 后台 Settings -> API Keys 中生成) + token: + +# 标签卖萌 +diytitle: + enable: true + leaveTitle: w(゚Д゚)w 不要走!再看看嘛! + backTitle: ♪(^∇^*)欢迎肥来! + +# 留言弹幕配置 +comment_barrage_config: + enable: false + # 同时最多显示弹幕数 + maxBarrage: 1 + # 弹幕显示间隔时间ms + barrageTime: 4000 + # token,在控制台中获取 + accessToken: "" + # 博主邮箱md5值 + mailMd5: "" + +# 左下角音乐配置项 +# https://github.com/metowolf/MetingJS +nav_music: + enable: true + console_widescreen_music: false # 宽屏状态控制台显示音乐而不是标签 enable为true 控制台依然会显示 + id: 8152976493 + server: netease + volume: 0.7 # 默认音量 + all_playlist: https://y.qq.com/n/ryqq/playlist/8802438608 + +# 路径为 /music 的音乐页面默认加载的歌单 1. nav_music 2. custom +music_page_default: nav_music + +# 评论匿名邮箱 +visitorMail: + enable: true + mail: "" + +# ptool 文章底部工具 +ptool: + enable: true + share_mobile: true + share_weibo: true + share_copyurl: true + categories: false # 是否显示分类 + mode: # 运营模式与责任,不配置不显示 + +# 欢迎语配置 +greetingBox: + enable: false #开启后必须配置下面的list对应的时间段,不然会出现小白条 + default: 晚上好👋 + list: + # - greeting: 晚安😴 + # startTime: 0 + # endTime: 5 + # - greeting: 早上好鸭👋, 祝你一天好心情! + # startTime: 6 + # endTime: 9 + # - greeting: 上午好👋, 状态很好,鼓励一下~ + # startTime: 10 + # endTime: 10 + # - greeting: 11点多啦, 在坚持一下就吃饭啦~ + # startTime: 11 + # endTime: 11 + # - greeting: 午安👋, 宝贝 + # startTime: 12 + # endTime: 14 + # - greeting: 🌈充实的一天辛苦啦! + # startTime: 14 + # endTime: 18 + # - greeting: 19点喽, 奖励一顿丰盛的大餐吧🍔。 + # startTime: 19 + # endTime: 19 + # - greeting: 晚上好👋, 在属于自己的时间好好放松😌~ + # startTime: 20 + # endTime: 24 + +# 文章顶部ai摘要 +post_head_ai_description: + enable: true + gptName: AnZhiYu + mode: local # 默认模式 可选值: tianli/local + switchBtn: false # 可以配置是否显示切换按钮 以切换tianli/local + btnLink: https://afdian.net/item/886a79d4db6711eda42a52540025c377 + randomNum: 3 # 按钮最大的随机次数,也就是一篇文章最大随机出来几种 + basicWordCount: 1000 # 最低获取字符数, 最小1000, 最大1999 + key: xxxx + Referer: https://xx.xx/ + +# 快捷键配置 +shortcutKey: + enable: false + delay: 100 # 所有键位延时触发而不是立即触发(包括shift,以解决和浏览器键位冲突问题) + shiftDelay: 200 # shift按下延时多久开启 + +# 无障碍优化(在首页按下「shift + ?」以查看效果) +accesskey: + enable: true + +# 友情链接顶部相关配置 +linkPageTop: + enable: false + title: 与数百名博主无限进步 + # 添加博主友链的评论自定义格式 + addFriendPlaceholder: "昵称(请勿包含博客等字样):\n网站地址(要求博客地址,请勿提交个人主页):\n头像图片url(请提供尽可能清晰的图片,我会上传到我自己的图床):\n描述:\n站点截图(可选):\n" + +# 缩略图后缀 archive/tag/category 页面单独开启后缀 +pageThumbnailSuffix: "" + +# 隐私协议弹窗 +agreementPopup: + enable: false + url: /privacy + +# 右键菜单 +rightClickMenu: + enable: false + +# 首页随便逛逛people模式 而非技能点模式,关闭后为技能点模式需要配置creativity.yml +peoplecanvas: + enable: true + img: https://upload-bbs.miyoushe.com/upload/2024/07/27/125766904/ba62475f396df9de3316a08ed9e65d86_5680958632268053399..png + +# 动效 +dynamicEffect: + postTopWave: true # 文章顶部波浪效果 + postTopRollZoomInfo: false # 文章顶部滚动时缩放 + pageCommentsRollZoom: false # 非文章页面评论滚动时缩放显示(仅仅Twikoo生效) + +# Inject +# Insert the code to head (before '' tag) and the bottom (before '' tag) +# 插入代码到头部 之前 和 底部 之前 +inject: + head: + # 自定义css + # - + + bottom: + # 自定义js + # - + +# CDN +# Don't modify the following settings unless you know how they work +# 非必要请不要修改 +CDN: + # The CDN provider of internal scripts (主题内部 js 的 cdn 配置) + # option: local/elemecdn/jsdelivr/unpkg/cdnjs/onmicrosoft/cbd/anheyu/custom + # Dev version can only choose. ( dev版的主题只能设置为 local ) + internal_provider: local + + # The CDN provider of third party scripts (第三方 js 的 cdn 配置) + # option: elemecdn/jsdelivr/unpkg/cdnjs/onmicrosoft/cbd/anheyu/custom + third_party_provider: cbd + + # Add version number to CDN, true or false + version: true + + # Custom format + # For example: https://cdn.staticfile.org/${cdnjs_name}/${version}/${min_cdnjs_file} + custom_format: # https://npm.elemecdn.com/${name}@latest/${file} + + option: + # main_css: + # main: + # utils: + # translate: + # random_friends_post_js: + # right_click_menu_js: + # comment_barrage_js: + # ai_abstract_js: + # people_js: + # local_search: + # algolia_js: + # algolia_search: + # instantsearch: + # docsearch_js: + # docsearch_css: + # pjax: + # blueimp_md5: + # valine: + # twikoo: + # waline_js: + # waline_css: + # sharejs: + # sharejs_css: + # mathjax: + # katex: + # katex_copytex: + # mermaid: + # canvas_ribbon: + # canvas_fluttering_ribbon: + # canvas_nest: + # lazyload: + # instantpage: + # typed: + # pangu: + # fancybox_css: + # fancybox: + # medium_zoom: + # snackbar_css: + # snackbar: + # activate_power_mode: + # fireworks: + # click_heart: + # ClickShowText: + # fontawesome: + # flickr_justified_gallery_js: + # flickr_justified_gallery_css: + # aplayer_css: + # aplayer_js: + # meting_js: + # meting_api: + # prismjs_js: + # prismjs_lineNumber_js: + # prismjs_autoloader: + # artalk_js: + # artalk_css: + # pace_js: + # pace_default_css: + # countup_js: + # gsap_js: + # busuanzi: + # rightmenu: + # waterfall: + # ali_iconfont_css: + # accesskey_js: + # colorthief: diff --git a/blog/_config.landscape.yml b/blog/_config.landscape.yml new file mode 100644 index 0000000..e69de29 diff --git a/blog/_config.yml b/blog/_config.yml new file mode 100644 index 0000000..114feb7 --- /dev/null +++ b/blog/_config.yml @@ -0,0 +1,110 @@ +# Hexo Configuration +## Docs: https://hexo.io/docs/configuration.html +## Source: https://github.com/hexojs/hexo/ + +# Site +title: 小熊猫呜呜呜 +subtitle: '无尽的前进' +description: '追着风的人' +keywords: +author: abearxiong +language: zh-CN +timezone: 'Asia/Shanghai' + +# URL +## Set your site url here. For example, if you use GitHub Page, set url as 'https://username.github.io/project' +url: https://blog.xiongxiao.me +permalink: :year/:month/:day/:title/ +permalink_defaults: +pretty_urls: + trailing_index: true # Set to false to remove trailing 'index.html' from permalinks + trailing_html: true # Set to false to remove trailing '.html' from permalinks + +# Directory +source_dir: source +public_dir: public +tag_dir: tags +archive_dir: archives +category_dir: categories +code_dir: downloads/code +i18n_dir: :lang +skip_render: + +# Writing +new_post_name: :title.md # File name of new posts +default_layout: post +titlecase: false # Transform title into titlecase +external_link: + enable: true # Open external links in new tab + field: site # Apply to the whole site + exclude: '' +filename_case: 0 +render_drafts: false +post_asset_folder: false +relative_link: false +future: true +syntax_highlighter: highlight.js +highlight: + line_number: true + auto_detect: false + tab_replace: '' + wrap: true + hljs: false +prismjs: + preprocess: true + line_number: true + tab_replace: '' + +# Home page setting +# path: Root path for your blogs index page. (default = '') +# per_page: Posts displayed per page. (0 = disable pagination) +# order_by: Posts order. (Order by date descending by default) +index_generator: + path: '' + per_page: 10 + order_by: -date + +# Category & Tag +default_category: uncategorized +category_map: +tag_map: + +# Metadata elements +## https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta +meta_generator: true + +# Date / Time format +## Hexo uses Moment.js to parse and display date +## You can customize the date format as defined in +## http://momentjs.com/docs/#/displaying/format/ +date_format: YYYY-MM-DD +time_format: HH:mm:ss +## updated_option supports 'mtime', 'date', 'empty' +updated_option: 'mtime' + +# Pagination +## Set per_page to 0 to disable pagination +per_page: 10 +pagination_dir: page + +# Include / Exclude file(s) +## include:/exclude: options only apply to the 'source/' folder +# include: +# - "src" +# exclude: +# - "assets" +# ignore: + +# Extensions +## Plugins: https://hexo.io/plugins/ +## Themes: https://hexo.io/themes/ +theme: anzhiyu + +# Deployment +## Docs: https://hexo.io/docs/one-command-deployment +deploy: + type: '' + +aplayer: + meting: true + asset_inject: false \ No newline at end of file diff --git a/blog/package.json b/blog/package.json new file mode 100644 index 0000000..dc3bed8 --- /dev/null +++ b/blog/package.json @@ -0,0 +1,28 @@ +{ + "name": "hexo-site", + "version": "0.0.0", + "private": true, + "scripts": { + "build": "hexo generate", + "clean": "hexo clean", + "deploy": "hexo deploy", + "server": "hexo server" + }, + "hexo": { + "version": "8.1.1" + }, + "dependencies": { + "hexo": "^8.0.0", + "hexo-generator-archive": "^2.0.0", + "hexo-generator-category": "^2.0.0", + "hexo-generator-index": "^4.0.0", + "hexo-generator-tag": "^2.0.0", + "hexo-renderer-ejs": "^2.0.0", + "hexo-renderer-marked": "^7.0.0", + "hexo-renderer-pug": "^3.0.0", + "hexo-renderer-stylus": "^1.0.0", + "hexo-server": "^3.0.0", + "hexo-theme-landscape": "^1.0.0", + "hexo-util": "^4.0.0" + } +} \ No newline at end of file diff --git a/blog/pnpm-lock.yaml b/blog/pnpm-lock.yaml new file mode 100644 index 0000000..d594499 --- /dev/null +++ b/blog/pnpm-lock.yaml @@ -0,0 +1,2218 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + hexo: + specifier: ^8.0.0 + version: 8.1.1(chokidar@3.6.0) + hexo-generator-archive: + specifier: ^2.0.0 + version: 2.0.0 + hexo-generator-category: + specifier: ^2.0.0 + version: 2.0.0 + hexo-generator-index: + specifier: ^4.0.0 + version: 4.0.0 + hexo-generator-tag: + specifier: ^2.0.0 + version: 2.0.0 + hexo-renderer-ejs: + specifier: ^2.0.0 + version: 2.0.0 + hexo-renderer-marked: + specifier: ^7.0.0 + version: 7.0.1 + hexo-renderer-pug: + specifier: ^3.0.0 + version: 3.0.0 + hexo-renderer-stylus: + specifier: ^1.0.0 + version: 1.0.0 + hexo-server: + specifier: ^3.0.0 + version: 3.0.0 + hexo-theme-landscape: + specifier: ^1.0.0 + version: 1.1.0 + hexo-util: + specifier: ^4.0.0 + version: 4.0.0 + +packages: + + '@asamuzakjp/css-color@3.2.0': + resolution: {integrity: sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==} + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.28.5': + resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/types@7.28.5': + resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} + engines: {node: '>=6.9.0'} + + '@csstools/color-helpers@5.1.0': + resolution: {integrity: sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==} + engines: {node: '>=18'} + + '@csstools/css-calc@2.1.4': + resolution: {integrity: sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-color-parser@3.1.0': + resolution: {integrity: sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-parser-algorithms@3.0.5': + resolution: {integrity: sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-tokenizer@3.0.4': + resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} + engines: {node: '>=18'} + + '@types/trusted-types@2.0.7': + resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + + a-sync-waterfall@1.0.1: + resolution: {integrity: sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA==} + + abbrev@2.0.0: + resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + abbrev@3.0.1: + resolution: {integrity: sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==} + engines: {node: ^18.17.0 || >=20.5.0} + + acorn@7.4.1: + resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} + engines: {node: '>=0.4.0'} + hasBin: true + + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} + + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + engines: {node: '>=12'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + asap@2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + + assert-never@1.4.0: + resolution: {integrity: sha512-5oJg84os6NMQNl27T9LnZkvvqzvAnHu03ShCnoj6bsJwS7L8AO4lf+C/XjK/nvzEqQB744moC6V128RucQd1jA==} + + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + atob@2.1.2: + resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==} + engines: {node: '>= 4.5.0'} + hasBin: true + + babel-walk@3.0.0-canary-5: + resolution: {integrity: sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==} + engines: {node: '>= 10.0.0'} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + basic-auth@2.0.1: + resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==} + engines: {node: '>= 0.8'} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + bluebird@3.7.2: + resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} + + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + camel-case@4.1.2: + resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} + + character-parser@2.2.0: + resolution: {integrity: sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw==} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + command-exists@1.2.9: + resolution: {integrity: sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==} + + commander@5.1.0: + resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==} + engines: {node: '>= 6'} + + compressible@2.0.18: + resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} + engines: {node: '>= 0.6'} + + compression@1.8.1: + resolution: {integrity: sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==} + engines: {node: '>= 0.8.0'} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + connect@3.7.0: + resolution: {integrity: sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==} + engines: {node: '>= 0.10.0'} + + constantinople@4.0.1: + resolution: {integrity: sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + css-parse@2.0.0: + resolution: {integrity: sha512-UNIFik2RgSbiTwIW1IsFwXWn6vs+bYdq83LKTSOsx7NJR7WII9dxewkHLltfTLVppoUApHV0118a4RZRI9FLwA==} + + css@2.2.4: + resolution: {integrity: sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==} + + cssstyle@4.6.0: + resolution: {integrity: sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==} + engines: {node: '>=18'} + + data-urls@5.0.0: + resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} + engines: {node: '>=18'} + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@3.1.0: + resolution: {integrity: sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decimal.js@10.6.0: + resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} + + decode-uri-component@0.2.2: + resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} + engines: {node: '>=0.10'} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + doctypes@1.1.0: + resolution: {integrity: sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ==} + + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + + dompurify@3.3.1: + resolution: {integrity: sha512-qkdCKzLNtrgPFP1Vo+98FRzJnBRGe4ffyCea9IwHB1fyxPOeNTHpLKYGd4Uk9xvNoH0ZoOjwZxNptyMwqrId1Q==} + + domutils@3.2.2: + resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + ejs@3.1.10: + resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} + engines: {node: '>=0.10.0'} + hasBin: true + + encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + engines: {node: '>=0.12'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + fast-archy@1.0.0: + resolution: {integrity: sha512-j8CNf0sCX92BogtUZAMPhMj7p3nv7xxeETwfpVWQNQocC5b21FAa6bUzfuhcNoEa4f2RtDe5U3uY0NriH9nA7g==} + + fast-equals@3.0.3: + resolution: {integrity: sha512-NCe8qxnZFARSHGztGMZOO/PC1qa5MIFB5Hp66WdzbCRAz8U8US3bx1UTgLS49efBQPcUtO9gf5oVEY8o7y/7Kg==} + + fast-text-table@1.0.1: + resolution: {integrity: sha512-KUwE3MizTzXwhrvTTEpWbug1ngV1zfjwzdxSkeWYGUoVGaaQoid+jxgg4zm4LB+OrtnD+X2xJFq7DCO3pc3fdQ==} + + filelist@1.0.4: + resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + finalhandler@1.1.2: + resolution: {integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==} + engines: {node: '>= 0.8'} + + form-data@4.0.5: + resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} + engines: {node: '>= 6'} + + fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hexo-cli@4.3.2: + resolution: {integrity: sha512-druJeBgLpG9ncDS5AhBHdAXk0G4CFj8Qes09pApyZ6bR+nJW1JYiDMuilhudaKDdq+1l49jWXVTidkcb7p0Jbw==} + engines: {node: '>=14'} + hasBin: true + + hexo-front-matter@4.2.1: + resolution: {integrity: sha512-sJJI0GNmejYiwBvgnGRKn5V3sbODB4dNPr8jyw2Qp0PRHr4Uuyv8iyxw6WfK3+T7yvzYvJOh+tZ7jnwr2BYARA==} + engines: {node: '>=14'} + + hexo-fs@4.1.3: + resolution: {integrity: sha512-Q92zQ5PlVDouvSWFLXQoFSTLIUIODikUJs2BfAXQglyOEjN1dOQn1Z5Nimk/7GHof17R5h/uObCQLnZAjzI2tg==} + engines: {node: '>=14'} + + hexo-fs@5.0.1: + resolution: {integrity: sha512-Zm4m21coQA7TtL9JL0oNZF+ypY/HbqwVdaqGqoKD+GEV7HH2Y1YObNBgl1o/lV1tzStC8f15AoRcHdS2jiWp0w==} + engines: {node: '>=18'} + + hexo-generator-archive@2.0.0: + resolution: {integrity: sha512-KikJk7dGFbtNHOgqtLFGf5T/S8n1paGp+Gy0KfVDz+HKYhGbXOouyiZkmc3O9KrYt6ja14rmkMhq7KKGtvfehw==} + engines: {node: '>=14'} + + hexo-generator-category@2.0.0: + resolution: {integrity: sha512-9OduRBf3WeRDa4BR0kAfRjOVHur7v3fm0NKAwbjUiqULigAdNZVZPO3cHKW2MlBbl/lI5PuWdhQ9zZ99CCCAgQ==} + engines: {node: '>=14'} + + hexo-generator-index@4.0.0: + resolution: {integrity: sha512-KeM7mOCKWINGFAk1E+CkjMMgqFIv8oaRbGxR7ipkQAp44o4aopkVftma4sdIplOq9WQEWfVYDUK5gEv9J3nzUg==} + engines: {node: '>=18'} + + hexo-generator-tag@2.0.0: + resolution: {integrity: sha512-1px/hF3veEohWDN8jjzchQhaiz+uOStUvvMaBJC9vWOlALh30UFcapL8IrvAwwJZjFRVA+WqGgDRqoQ8+yaaFw==} + engines: {node: '>=14'} + + hexo-i18n@2.0.0: + resolution: {integrity: sha512-dkUXecEtChaQMdTHN4WR13c8GwKqjbSOZPJS9qDqV6Ebnb77Wa/nQzWFckhP0dCps3a9lUQBd8hYGOMbOosiQQ==} + engines: {node: '>=14'} + + hexo-log@4.1.0: + resolution: {integrity: sha512-i2Sgxk8Cgx5viSjq5qW5N/rBFfwoCKQcH8qnnW1fawCapcdEAhIsq+Y3vbrs9bssyDlyU6Vqm4oQmosREaNI7Q==} + engines: {node: '>=14'} + + hexo-pagination@3.0.0: + resolution: {integrity: sha512-8oo1iozloZo7TojPVYg4IxL3SJKCBdSJ908fTlIxIK7TWJIKdYnQlW31+12DBJ0NhVZA/lZisPObGF08wT8fKw==} + engines: {node: '>=14'} + + hexo-renderer-ejs@2.0.0: + resolution: {integrity: sha512-qCjE1IdwgDgv65qyb0KMVCwCdSVAkH0vwAe9XihjvaKWkmb9dtt8DgErOdqCXn0HReSyWiEVP2BrLRj3gyHwOQ==} + engines: {node: '>=12'} + + hexo-renderer-marked@7.0.1: + resolution: {integrity: sha512-H9IMnDuhjAL24NjWJuqQG0Utdw09159AI531Dbs7jSqmXSXVImoA7SeWIt4XLDRKr1nfWwn+eDziWo4UT6f1fA==} + engines: {node: '>=18'} + + hexo-renderer-pug@3.0.0: + resolution: {integrity: sha512-PmbLx6VkNv+mPLOe97OC4F8iTzTuj665dSYN7bZKArd4M/q7gb2tNs29VGuAOC50i9tvWY2f+tPQimf0GZ9Hyw==} + engines: {node: '>=12.4.0'} + + hexo-renderer-stylus@1.0.0: + resolution: {integrity: sha512-QyRXpmPu41zBDbV/9bwqVQsiN9TT25VNvaN6liS4Mn+5FHqJg2DtrLBu63VdACCKBHLwFs9FDzMaf0NTar7J0Q==} + engines: {node: '>=8.6.0'} + + hexo-server@3.0.0: + resolution: {integrity: sha512-u4s0ty9Aew6jV+a9oMrXBwhrRpUQ0U8PWM/88a5aHgDru58VY81mVrxOFxs788NAsWQ8OvsJtF5m7mnXoRnSIA==} + engines: {node: '>=12.13.0'} + + hexo-theme-landscape@1.1.0: + resolution: {integrity: sha512-nszjixBEiEDZjf7glAGbHg0nKGHZdUDwzFVVdRDeu4FeHfGcY5CZNl9sF4vSligjnD8IwFXpDfx5E+GRmNKvWg==} + + hexo-util@3.3.0: + resolution: {integrity: sha512-YvGngXijE2muEh5L/VI4Fmjqb+/yAkmY+VuyhWVoRwQu1X7bmWodsfYRXX7CUYhi5LqsvH8FAe/yBW1+f6ZX4Q==} + engines: {node: '>=14'} + + hexo-util@4.0.0: + resolution: {integrity: sha512-oXKXBs1HZ2Wu/eq0paAVqtCmAEcqJPZ4xxSVRuwAplm1hFU41Ul53WA5bmYMEz9Dp+OJ/SdchjXRmYlbGJdt3w==} + engines: {node: '>=18'} + + hexo@8.1.1: + resolution: {integrity: sha512-UnzT4ImjKzMMuVRsvudxrl7MkdZwKe4S9xJN5pQPK9c+K0G+fLFb9kB6CqZZwj2E5ne+QK0ls4XMKqTUbNR3RQ==} + engines: {node: '>=20.19.0'} + hasBin: true + + highlight.js@11.11.1: + resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==} + engines: {node: '>=12.0.0'} + + html-encoding-sniffer@4.0.0: + resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} + engines: {node: '>=18'} + + htmlparser2@10.0.0: + resolution: {integrity: sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==} + + htmlparser2@9.1.0: + resolution: {integrity: sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==} + + http-errors@2.0.1: + resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} + engines: {node: '>= 0.8'} + + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + + is-expression@4.0.0: + resolution: {integrity: sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-plain-object@5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} + + is-potential-custom-element-name@1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + + is-promise@2.2.2: + resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} + + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + + is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + jake@10.9.4: + resolution: {integrity: sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==} + engines: {node: '>=10'} + hasBin: true + + js-stringify@1.0.2: + resolution: {integrity: sha512-rtS5ATOo2Q5k1G+DADISilDA6lv79zIiwFd6CcjuIxGKLFm5C+RLImRscVap9k55i+MOZwgliw+NejvkLuGD5g==} + + js-yaml-js-types@1.0.1: + resolution: {integrity: sha512-5tpfyORs8OQ43alNERbWfYRCtWgykvzYgY46fUhrQi2+kS7N0NuuFYLZ/IrfmVm5muLTndeMublgraXiFRjEPw==} + peerDependencies: + js-yaml: 4.x + + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + hasBin: true + + jsdom@25.0.1: + resolution: {integrity: sha512-8i7LzZj7BF8uplX+ZyOlIz86V6TAsSs+np6m1kpW9u0JWi4z/1t+FzcK1aek+ybTnAC4KhBL4uXCNT0wcUIeCw==} + engines: {node: '>=18'} + peerDependencies: + canvas: ^2.11.2 + peerDependenciesMeta: + canvas: + optional: true + + jsonparse@1.3.1: + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} + engines: {'0': node >= 0.2.0} + + jstransformer@1.0.0: + resolution: {integrity: sha512-C9YK3Rf8q6VAPDCCU9fnqo3mAfOH6vUGnMcP4AQAYIEpWtfGLpwOTmZ+igtdK5y+VvI2n3CyYSzy4Qh34eq24A==} + + lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + marked@15.0.12: + resolution: {integrity: sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA==} + engines: {node: '>= 18'} + hasBin: true + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + micro-memoize@4.2.0: + resolution: {integrity: sha512-dRxIsNh0XosO9sd3aASUabKOzG9dloLO41g74XUGThpHBoGm1ttakPT5in14CuW/EDedkniaShFHbymmmKGOQA==} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + + mime@3.0.0: + resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} + engines: {node: '>=10.0.0'} + hasBin: true + + min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + + moize@6.1.7: + resolution: {integrity: sha512-8/9XgYooMo7/q5tf6zGF4+Wp1jx5sbxV87uK6YvTq9rgDtusLWZCZ8c5C0EhYZbNGudul5EMeMsObO4Ug/gszg==} + deprecated: This library has been deprecated in favor of micro-memoize, which as-of version 5 incorporates most of the functionality that this library offers at nearly half the size and better speed. + + moment-timezone@0.5.48: + resolution: {integrity: sha512-f22b8LV1gbTO2ms2j2z13MuPogNoh5UzxL3nzNAYKGraILnbGc9NEE6dyiiiLv46DGRb8A4kg8UKWLjPthxBHw==} + + moment@2.30.1: + resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==} + + morgan@1.10.1: + resolution: {integrity: sha512-223dMRJtI/l25dJKWpgij2cMtywuG/WiUKXdvwfbhGKBhy1puASqXwFzmWZ7+K73vUPoR7SS2Qz2cI/g9MKw0A==} + engines: {node: '>= 0.8.0'} + + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + negotiator@0.6.4: + resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} + engines: {node: '>= 0.6'} + + nib@1.2.0: + resolution: {integrity: sha512-7HgrnMl/3yOmWykueO8/D0q+0iWwe7Z+CK2Eaq/xQV8w1hK80WN1oReRQkfkrztbAAnp/nTHkUSl5EcVkor6JQ==} + peerDependencies: + stylus: '*' + + no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + nunjucks@3.2.4: + resolution: {integrity: sha512-26XRV6BhkgK0VOxfbU5cQI+ICFUtMLixv1noZn1tGU38kQH5A5nmmbk/O45xdyBhD1esk47nKrY0mvQpZIhRjQ==} + engines: {node: '>= 6.9.0'} + hasBin: true + peerDependencies: + chokidar: ^3.3.0 + peerDependenciesMeta: + chokidar: + optional: true + + nwsapi@2.2.23: + resolution: {integrity: sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ==} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + on-finished@2.3.0: + resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} + engines: {node: '>= 0.8'} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + on-headers@1.1.0: + resolution: {integrity: sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + + parse5@7.3.0: + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + pascal-case@3.1.2: + resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pretty-hrtime@1.0.3: + resolution: {integrity: sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==} + engines: {node: '>= 0.8'} + + prismjs@1.30.0: + resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} + engines: {node: '>=6'} + + promise@7.3.1: + resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==} + + pug-attrs@3.0.0: + resolution: {integrity: sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA==} + + pug-code-gen@3.0.3: + resolution: {integrity: sha512-cYQg0JW0w32Ux+XTeZnBEeuWrAY7/HNE6TWnhiHGnnRYlCgyAUPoyh9KzCMa9WhcJlJ1AtQqpEYHc+vbCzA+Aw==} + + pug-error@2.1.0: + resolution: {integrity: sha512-lv7sU9e5Jk8IeUheHata6/UThZ7RK2jnaaNztxfPYUY+VxZyk/ePVaNZ/vwmH8WqGvDz3LrNYt/+gA55NDg6Pg==} + + pug-filters@4.0.0: + resolution: {integrity: sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A==} + + pug-lexer@5.0.1: + resolution: {integrity: sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w==} + + pug-linker@4.0.0: + resolution: {integrity: sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw==} + + pug-load@3.0.0: + resolution: {integrity: sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ==} + + pug-parser@6.0.0: + resolution: {integrity: sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw==} + + pug-runtime@3.0.1: + resolution: {integrity: sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg==} + + pug-strip-comments@2.0.0: + resolution: {integrity: sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ==} + + pug-walk@2.0.0: + resolution: {integrity: sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ==} + + pug@3.0.3: + resolution: {integrity: sha512-uBi6kmc9f3SZ3PXxqcHiUZLmIXgfgWooKWXcwSGwQd2Zi5Rb0bT14+8CJjJgI8AB+nndLaNgHGrcc6bPIB665g==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + + resolve-url@0.2.1: + resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==} + deprecated: https://github.com/lydell/resolve-url#deprecated + + resolve@1.22.11: + resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} + engines: {node: '>= 0.4'} + hasBin: true + + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + + rrweb-cssom@0.7.1: + resolution: {integrity: sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==} + + rrweb-cssom@0.8.0: + resolution: {integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + sax@1.2.4: + resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} + + saxes@6.0.0: + resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} + engines: {node: '>=v12.22.7'} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + send@0.19.2: + resolution: {integrity: sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==} + engines: {node: '>= 0.8.0'} + + serve-static@1.16.3: + resolution: {integrity: sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==} + engines: {node: '>= 0.8.0'} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + source-map-resolve@0.5.3: + resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==} + deprecated: See https://github.com/lydell/source-map-resolve#deprecated + + source-map-url@0.4.1: + resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==} + deprecated: See https://github.com/lydell/source-map-url#deprecated + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + source-map@0.7.6: + resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} + engines: {node: '>= 12'} + + sprintf-js@1.1.3: + resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + + statuses@1.5.0: + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} + engines: {node: '>= 0.6'} + + statuses@2.0.2: + resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} + engines: {node: '>= 0.8'} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@7.1.2: + resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} + engines: {node: '>=12'} + + strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + + stylus@0.54.8: + resolution: {integrity: sha512-vr54Or4BZ7pJafo2mpf0ZcwA74rpuYCZbxrHBsH8kbcXOwSfvBFwsRfpGO5OD5fhG5HDCFW737PKaawI7OqEAg==} + hasBin: true + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + + through2@4.0.2: + resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} + + tildify@2.0.0: + resolution: {integrity: sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw==} + engines: {node: '>=8'} + + titlecase@1.1.3: + resolution: {integrity: sha512-pQX4oiemzjBEELPqgK4WE+q0yhAqjp/yzusGtlSJsOuiDys0RQxggepYmo0BuegIDppYS3b3cpdegRwkpyN3hw==} + hasBin: true + + tldts-core@6.1.86: + resolution: {integrity: sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==} + + tldts@6.1.86: + resolution: {integrity: sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==} + hasBin: true + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + token-stream@1.0.0: + resolution: {integrity: sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg==} + + tough-cookie@5.1.2: + resolution: {integrity: sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==} + engines: {node: '>=16'} + + tr46@5.1.1: + resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==} + engines: {node: '>=18'} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + urix@0.1.0: + resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==} + deprecated: Please see https://github.com/lydell/urix#deprecated + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + void-elements@3.1.0: + resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==} + engines: {node: '>=0.10.0'} + + w3c-xmlserializer@5.0.0: + resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} + engines: {node: '>=18'} + + warehouse@6.0.0: + resolution: {integrity: sha512-eOlhyPp5HC951QVDgAeculpSxvfum4UZAbqXSzocqbdiziTseFJFYxmhsKqrQ3wrwgtzPGgkVN2rPL31YLQ0SA==} + engines: {node: '>=18'} + + webidl-conversions@7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} + + whatwg-encoding@3.1.1: + resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} + engines: {node: '>=18'} + deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation + + whatwg-mimetype@4.0.0: + resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} + engines: {node: '>=18'} + + whatwg-url@14.2.0: + resolution: {integrity: sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==} + engines: {node: '>=18'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + with@7.0.2: + resolution: {integrity: sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==} + engines: {node: '>= 10.0.0'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + ws@8.19.0: + resolution: {integrity: sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + xml-name-validator@5.0.0: + resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} + engines: {node: '>=18'} + + xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + +snapshots: + + '@asamuzakjp/css-color@3.2.0': + dependencies: + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + lru-cache: 10.4.3 + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.28.5': {} + + '@babel/parser@7.28.5': + dependencies: + '@babel/types': 7.28.5 + + '@babel/types@7.28.5': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + + '@csstools/color-helpers@5.1.0': {} + + '@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/css-color-parser@3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/color-helpers': 5.1.0 + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/css-tokenizer@3.0.4': {} + + '@types/trusted-types@2.0.7': + optional: true + + a-sync-waterfall@1.0.1: {} + + abbrev@2.0.0: {} + + abbrev@3.0.1: {} + + acorn@7.4.1: {} + + agent-base@7.1.4: {} + + ansi-regex@6.2.2: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + argparse@2.0.1: {} + + asap@2.0.6: {} + + assert-never@1.4.0: {} + + async@3.2.6: {} + + asynckit@0.4.0: {} + + atob@2.1.2: {} + + babel-walk@3.0.0-canary-5: + dependencies: + '@babel/types': 7.28.5 + + balanced-match@1.0.2: {} + + basic-auth@2.0.1: + dependencies: + safe-buffer: 5.1.2 + + binary-extensions@2.3.0: {} + + bluebird@3.7.2: {} + + brace-expansion@1.1.12: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.2: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + bytes@3.1.2: {} + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + camel-case@4.1.2: + dependencies: + pascal-case: 3.1.2 + tslib: 2.8.1 + + character-parser@2.2.0: + dependencies: + is-regex: 1.2.1 + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + command-exists@1.2.9: {} + + commander@5.1.0: {} + + compressible@2.0.18: + dependencies: + mime-db: 1.54.0 + + compression@1.8.1: + dependencies: + bytes: 3.1.2 + compressible: 2.0.18 + debug: 2.6.9 + negotiator: 0.6.4 + on-headers: 1.1.0 + safe-buffer: 5.2.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + concat-map@0.0.1: {} + + connect@3.7.0: + dependencies: + debug: 2.6.9 + finalhandler: 1.1.2 + parseurl: 1.3.3 + utils-merge: 1.0.1 + transitivePeerDependencies: + - supports-color + + constantinople@4.0.1: + dependencies: + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + css-parse@2.0.0: + dependencies: + css: 2.2.4 + + css@2.2.4: + dependencies: + inherits: 2.0.4 + source-map: 0.6.1 + source-map-resolve: 0.5.3 + urix: 0.1.0 + + cssstyle@4.6.0: + dependencies: + '@asamuzakjp/css-color': 3.2.0 + rrweb-cssom: 0.8.0 + + data-urls@5.0.0: + dependencies: + whatwg-mimetype: 4.0.0 + whatwg-url: 14.2.0 + + debug@2.6.9: + dependencies: + ms: 2.0.0 + + debug@3.1.0: + dependencies: + ms: 2.0.0 + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + decimal.js@10.6.0: {} + + decode-uri-component@0.2.2: {} + + deepmerge@4.3.1: {} + + define-lazy-prop@2.0.0: {} + + delayed-stream@1.0.0: {} + + depd@2.0.0: {} + + destroy@1.2.0: {} + + doctypes@1.1.0: {} + + dom-serializer@2.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + + domelementtype@2.3.0: {} + + domhandler@5.0.3: + dependencies: + domelementtype: 2.3.0 + + dompurify@3.3.1: + optionalDependencies: + '@types/trusted-types': 2.0.7 + + domutils@3.2.2: + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + ee-first@1.1.1: {} + + ejs@3.1.10: + dependencies: + jake: 10.9.4 + + encodeurl@1.0.2: {} + + encodeurl@2.0.0: {} + + entities@4.5.0: {} + + entities@6.0.1: {} + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + escape-html@1.0.3: {} + + esprima@4.0.1: {} + + etag@1.8.1: {} + + fast-archy@1.0.0: {} + + fast-equals@3.0.3: {} + + fast-text-table@1.0.1: {} + + filelist@1.0.4: + dependencies: + minimatch: 5.1.6 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + finalhandler@1.1.2: + dependencies: + debug: 2.6.9 + encodeurl: 1.0.2 + escape-html: 1.0.3 + on-finished: 2.3.0 + parseurl: 1.3.3 + statuses: 1.5.0 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + form-data@4.0.5: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.2 + mime-types: 2.1.35 + + fresh@0.5.2: {} + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + hexo-cli@4.3.2: + dependencies: + abbrev: 2.0.0 + bluebird: 3.7.2 + command-exists: 1.2.9 + hexo-fs: 4.1.3 + hexo-log: 4.1.0 + hexo-util: 3.3.0 + minimist: 1.2.8 + picocolors: 1.1.1 + resolve: 1.22.11 + tildify: 2.0.0 + + hexo-front-matter@4.2.1: + dependencies: + js-yaml: 4.1.1 + + hexo-fs@4.1.3: + dependencies: + bluebird: 3.7.2 + chokidar: 3.6.0 + graceful-fs: 4.2.11 + hexo-util: 3.3.0 + + hexo-fs@5.0.1: + dependencies: + bluebird: 3.7.2 + chokidar: 4.0.3 + graceful-fs: 4.2.11 + hexo-util: 3.3.0 + + hexo-generator-archive@2.0.0: + dependencies: + hexo-pagination: 3.0.0 + + hexo-generator-category@2.0.0: + dependencies: + hexo-pagination: 3.0.0 + + hexo-generator-index@4.0.0: + dependencies: + hexo-pagination: 3.0.0 + + hexo-generator-tag@2.0.0: + dependencies: + hexo-pagination: 3.0.0 + + hexo-i18n@2.0.0: + dependencies: + sprintf-js: 1.1.3 + + hexo-log@4.1.0: + dependencies: + picocolors: 1.1.1 + + hexo-pagination@3.0.0: {} + + hexo-renderer-ejs@2.0.0: + dependencies: + ejs: 3.1.10 + + hexo-renderer-marked@7.0.1: + dependencies: + dompurify: 3.3.1 + hexo-util: 3.3.0 + jsdom: 25.0.1 + marked: 15.0.12 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + + hexo-renderer-pug@3.0.0: + dependencies: + pug: 3.0.3 + + hexo-renderer-stylus@1.0.0: + dependencies: + nib: 1.2.0(stylus@0.54.8) + stylus: 0.54.8 + transitivePeerDependencies: + - supports-color + + hexo-server@3.0.0: + dependencies: + bluebird: 3.7.2 + compression: 1.8.1 + connect: 3.7.0 + mime: 3.0.0 + morgan: 1.10.1 + open: 8.4.2 + picocolors: 1.1.1 + serve-static: 1.16.3 + transitivePeerDependencies: + - supports-color + + hexo-theme-landscape@1.1.0: {} + + hexo-util@3.3.0: + dependencies: + camel-case: 4.1.2 + cross-spawn: 7.0.6 + deepmerge: 4.3.1 + highlight.js: 11.11.1 + htmlparser2: 9.1.0 + prismjs: 1.30.0 + strip-indent: 3.0.0 + + hexo-util@4.0.0: + dependencies: + camel-case: 4.1.2 + cross-spawn: 7.0.6 + deepmerge: 4.3.1 + highlight.js: 11.11.1 + htmlparser2: 10.0.0 + prismjs: 1.30.0 + strip-indent: 3.0.0 + + hexo@8.1.1(chokidar@3.6.0): + dependencies: + abbrev: 3.0.1 + bluebird: 3.7.2 + fast-archy: 1.0.0 + fast-text-table: 1.0.1 + hexo-cli: 4.3.2 + hexo-front-matter: 4.2.1 + hexo-fs: 5.0.1 + hexo-i18n: 2.0.0 + hexo-log: 4.1.0 + hexo-util: 4.0.0 + js-yaml: 4.1.1 + js-yaml-js-types: 1.0.1(js-yaml@4.1.1) + micromatch: 4.0.8 + moize: 6.1.7 + moment: 2.30.1 + moment-timezone: 0.5.48 + nunjucks: 3.2.4(chokidar@3.6.0) + picocolors: 1.1.1 + pretty-hrtime: 1.0.3 + strip-ansi: 7.1.2 + tildify: 2.0.0 + titlecase: 1.1.3 + warehouse: 6.0.0 + transitivePeerDependencies: + - chokidar + + highlight.js@11.11.1: {} + + html-encoding-sniffer@4.0.0: + dependencies: + whatwg-encoding: 3.1.1 + + htmlparser2@10.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.2.2 + entities: 6.0.1 + + htmlparser2@9.1.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.2.2 + entities: 4.5.0 + + http-errors@2.0.1: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.2 + toidentifier: 1.0.1 + + http-proxy-agent@7.0.2: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + + is-docker@2.2.1: {} + + is-expression@4.0.0: + dependencies: + acorn: 7.4.1 + object-assign: 4.1.1 + + is-extglob@2.1.1: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-number@7.0.0: {} + + is-plain-object@5.0.0: {} + + is-potential-custom-element-name@1.0.1: {} + + is-promise@2.2.2: {} + + is-regex@1.2.1: + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + is-wsl@2.2.0: + dependencies: + is-docker: 2.2.1 + + isexe@2.0.0: {} + + jake@10.9.4: + dependencies: + async: 3.2.6 + filelist: 1.0.4 + picocolors: 1.1.1 + + js-stringify@1.0.2: {} + + js-yaml-js-types@1.0.1(js-yaml@4.1.1): + dependencies: + esprima: 4.0.1 + js-yaml: 4.1.1 + + js-yaml@4.1.1: + dependencies: + argparse: 2.0.1 + + jsdom@25.0.1: + dependencies: + cssstyle: 4.6.0 + data-urls: 5.0.0 + decimal.js: 10.6.0 + form-data: 4.0.5 + html-encoding-sniffer: 4.0.0 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + is-potential-custom-element-name: 1.0.1 + nwsapi: 2.2.23 + parse5: 7.3.0 + rrweb-cssom: 0.7.1 + saxes: 6.0.0 + symbol-tree: 3.2.4 + tough-cookie: 5.1.2 + w3c-xmlserializer: 5.0.0 + webidl-conversions: 7.0.0 + whatwg-encoding: 3.1.1 + whatwg-mimetype: 4.0.0 + whatwg-url: 14.2.0 + ws: 8.19.0 + xml-name-validator: 5.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + jsonparse@1.3.1: {} + + jstransformer@1.0.0: + dependencies: + is-promise: 2.2.2 + promise: 7.3.1 + + lower-case@2.0.2: + dependencies: + tslib: 2.8.1 + + lru-cache@10.4.3: {} + + marked@15.0.12: {} + + math-intrinsics@1.1.0: {} + + micro-memoize@4.2.0: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime-db@1.52.0: {} + + mime-db@1.54.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime@1.6.0: {} + + mime@3.0.0: {} + + min-indent@1.0.1: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.12 + + minimatch@5.1.6: + dependencies: + brace-expansion: 2.0.2 + + minimist@1.2.8: {} + + mkdirp@1.0.4: {} + + moize@6.1.7: + dependencies: + fast-equals: 3.0.3 + micro-memoize: 4.2.0 + + moment-timezone@0.5.48: + dependencies: + moment: 2.30.1 + + moment@2.30.1: {} + + morgan@1.10.1: + dependencies: + basic-auth: 2.0.1 + debug: 2.6.9 + depd: 2.0.0 + on-finished: 2.3.0 + on-headers: 1.1.0 + transitivePeerDependencies: + - supports-color + + ms@2.0.0: {} + + ms@2.1.3: {} + + nanoid@3.3.11: {} + + negotiator@0.6.4: {} + + nib@1.2.0(stylus@0.54.8): + dependencies: + stylus: 0.54.8 + + no-case@3.0.4: + dependencies: + lower-case: 2.0.2 + tslib: 2.8.1 + + normalize-path@3.0.0: {} + + nunjucks@3.2.4(chokidar@3.6.0): + dependencies: + a-sync-waterfall: 1.0.1 + asap: 2.0.6 + commander: 5.1.0 + optionalDependencies: + chokidar: 3.6.0 + + nwsapi@2.2.23: {} + + object-assign@4.1.1: {} + + on-finished@2.3.0: + dependencies: + ee-first: 1.1.1 + + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + on-headers@1.1.0: {} + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + open@8.4.2: + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + + parse5@7.3.0: + dependencies: + entities: 6.0.1 + + parseurl@1.3.3: {} + + pascal-case@3.1.2: + dependencies: + no-case: 3.0.4 + tslib: 2.8.1 + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + pretty-hrtime@1.0.3: {} + + prismjs@1.30.0: {} + + promise@7.3.1: + dependencies: + asap: 2.0.6 + + pug-attrs@3.0.0: + dependencies: + constantinople: 4.0.1 + js-stringify: 1.0.2 + pug-runtime: 3.0.1 + + pug-code-gen@3.0.3: + dependencies: + constantinople: 4.0.1 + doctypes: 1.1.0 + js-stringify: 1.0.2 + pug-attrs: 3.0.0 + pug-error: 2.1.0 + pug-runtime: 3.0.1 + void-elements: 3.1.0 + with: 7.0.2 + + pug-error@2.1.0: {} + + pug-filters@4.0.0: + dependencies: + constantinople: 4.0.1 + jstransformer: 1.0.0 + pug-error: 2.1.0 + pug-walk: 2.0.0 + resolve: 1.22.11 + + pug-lexer@5.0.1: + dependencies: + character-parser: 2.2.0 + is-expression: 4.0.0 + pug-error: 2.1.0 + + pug-linker@4.0.0: + dependencies: + pug-error: 2.1.0 + pug-walk: 2.0.0 + + pug-load@3.0.0: + dependencies: + object-assign: 4.1.1 + pug-walk: 2.0.0 + + pug-parser@6.0.0: + dependencies: + pug-error: 2.1.0 + token-stream: 1.0.0 + + pug-runtime@3.0.1: {} + + pug-strip-comments@2.0.0: + dependencies: + pug-error: 2.1.0 + + pug-walk@2.0.0: {} + + pug@3.0.3: + dependencies: + pug-code-gen: 3.0.3 + pug-filters: 4.0.0 + pug-lexer: 5.0.1 + pug-linker: 4.0.0 + pug-load: 3.0.0 + pug-parser: 6.0.0 + pug-runtime: 3.0.1 + pug-strip-comments: 2.0.0 + + punycode@2.3.1: {} + + range-parser@1.2.1: {} + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + readdirp@4.1.2: {} + + resolve-url@0.2.1: {} + + resolve@1.22.11: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + rfdc@1.4.1: {} + + rrweb-cssom@0.7.1: {} + + rrweb-cssom@0.8.0: {} + + safe-buffer@5.1.2: {} + + safe-buffer@5.2.1: {} + + safer-buffer@2.1.2: {} + + sax@1.2.4: {} + + saxes@6.0.0: + dependencies: + xmlchars: 2.2.0 + + semver@6.3.1: {} + + send@0.19.2: + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.1 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + + serve-static@1.16.3: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.19.2 + transitivePeerDependencies: + - supports-color + + setprototypeof@1.2.0: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + source-map-resolve@0.5.3: + dependencies: + atob: 2.1.2 + decode-uri-component: 0.2.2 + resolve-url: 0.2.1 + source-map-url: 0.4.1 + urix: 0.1.0 + + source-map-url@0.4.1: {} + + source-map@0.6.1: {} + + source-map@0.7.6: {} + + sprintf-js@1.1.3: {} + + statuses@1.5.0: {} + + statuses@2.0.2: {} + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + strip-ansi@7.1.2: + dependencies: + ansi-regex: 6.2.2 + + strip-indent@3.0.0: + dependencies: + min-indent: 1.0.1 + + stylus@0.54.8: + dependencies: + css-parse: 2.0.0 + debug: 3.1.0 + glob: 7.2.3 + mkdirp: 1.0.4 + safer-buffer: 2.1.2 + sax: 1.2.4 + semver: 6.3.1 + source-map: 0.7.6 + transitivePeerDependencies: + - supports-color + + supports-preserve-symlinks-flag@1.0.0: {} + + symbol-tree@3.2.4: {} + + through2@4.0.2: + dependencies: + readable-stream: 3.6.2 + + tildify@2.0.0: {} + + titlecase@1.1.3: {} + + tldts-core@6.1.86: {} + + tldts@6.1.86: + dependencies: + tldts-core: 6.1.86 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + toidentifier@1.0.1: {} + + token-stream@1.0.0: {} + + tough-cookie@5.1.2: + dependencies: + tldts: 6.1.86 + + tr46@5.1.1: + dependencies: + punycode: 2.3.1 + + tslib@2.8.1: {} + + unpipe@1.0.0: {} + + urix@0.1.0: {} + + util-deprecate@1.0.2: {} + + utils-merge@1.0.1: {} + + vary@1.1.2: {} + + void-elements@3.1.0: {} + + w3c-xmlserializer@5.0.0: + dependencies: + xml-name-validator: 5.0.0 + + warehouse@6.0.0: + dependencies: + bluebird: 3.7.2 + graceful-fs: 4.2.11 + hexo-log: 4.1.0 + is-plain-object: 5.0.0 + jsonparse: 1.3.1 + nanoid: 3.3.11 + rfdc: 1.4.1 + through2: 4.0.2 + + webidl-conversions@7.0.0: {} + + whatwg-encoding@3.1.1: + dependencies: + iconv-lite: 0.6.3 + + whatwg-mimetype@4.0.0: {} + + whatwg-url@14.2.0: + dependencies: + tr46: 5.1.1 + webidl-conversions: 7.0.0 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + with@7.0.2: + dependencies: + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + assert-never: 1.4.0 + babel-walk: 3.0.0-canary-5 + + wrappy@1.0.2: {} + + ws@8.19.0: {} + + xml-name-validator@5.0.0: {} + + xmlchars@2.2.0: {} diff --git a/blog/scaffolds/draft.md b/blog/scaffolds/draft.md new file mode 100644 index 0000000..498e95b --- /dev/null +++ b/blog/scaffolds/draft.md @@ -0,0 +1,4 @@ +--- +title: {{ title }} +tags: +--- diff --git a/blog/scaffolds/page.md b/blog/scaffolds/page.md new file mode 100644 index 0000000..f01ba3c --- /dev/null +++ b/blog/scaffolds/page.md @@ -0,0 +1,4 @@ +--- +title: {{ title }} +date: {{ date }} +--- diff --git a/blog/scaffolds/post.md b/blog/scaffolds/post.md new file mode 100644 index 0000000..1f9b9a4 --- /dev/null +++ b/blog/scaffolds/post.md @@ -0,0 +1,5 @@ +--- +title: {{ title }} +date: {{ date }} +tags: +--- diff --git a/blog/source/_posts/hello-world.md b/blog/source/_posts/hello-world.md new file mode 100644 index 0000000..821780c --- /dev/null +++ b/blog/source/_posts/hello-world.md @@ -0,0 +1,38 @@ +--- +title: Hello World +--- +Welcome to [Hexo](https://hexo.io/)! This is your very first post. Check [documentation](https://hexo.io/docs/) for more info. If you get any problems when using Hexo, you can find the answer in [troubleshooting](https://hexo.io/docs/troubleshooting.html) or you can ask me on [GitHub](https://github.com/hexojs/hexo/issues). + +## Quick Start + +### Create a new post + +``` bash +$ hexo new "My New Post" +``` + +More info: [Writing](https://hexo.io/docs/writing.html) + +### Run server + +``` bash +$ hexo server +``` + +More info: [Server](https://hexo.io/docs/server.html) + +### Generate static files + +``` bash +$ hexo generate +``` + +More info: [Generating](https://hexo.io/docs/generating.html) + +### Deploy to remote sites + +``` bash +$ hexo deploy +``` + +More info: [Deployment](https://hexo.io/docs/one-command-deployment.html) diff --git a/blog/source/json/music.json b/blog/source/json/music.json new file mode 100644 index 0000000..51d3121 --- /dev/null +++ b/blog/source/json/music.json @@ -0,0 +1,128 @@ +[ + { + "name": "青花瓷", + "artist": "周杰伦", + "url": "https://npm.elemecdn.com/anzhiyu-music@1.0.4/青花瓷/青花瓷.mp3", + "cover": "https://y.qq.com/music/photo_new/T002R300x300M000002eFUFm2XYZ7z_2.jpg?max_age=2592000", + "lrc": "https://npm.elemecdn.com/anzhiyu-music@1.0.4/青花瓷/青花瓷.lrc" + }, + { + "name": "稻香", + "artist": "周杰伦", + "url": "https://npm.elemecdn.com/anzhiyu-music@1.0.1/周杰伦/稻香/稻香.mp3", + "cover": "https://y.qq.com/music/photo_new/T002R300x300M000002Neh8l0uciQZ_1.jpg?max_age=2592000", + "lrc": "https://npm.elemecdn.com/anzhiyu-music@1.0.1/周杰伦/稻香/稻香.lrc" + }, + { + "name": "晴天", + "artist": "周杰伦", + "url": "https://npm.elemecdn.com/anzhiyu-music@1.0.2/晴天/晴天.mp3", + "cover": "https://y.qq.com/music/photo_new/T002R300x300M000000MkMni19ClKG_3.jpg?max_age=2592000", + "lrc": "https://npm.elemecdn.com/anzhiyu-music@1.0.2/晴天/晴天.lrc" + }, + { + "name": "七里香", + "artist": "周杰伦", + "url": "https://npm.elemecdn.com/anzhiyu-music@1.0.2/七里香/七里香.mp3", + "cover": "https://y.qq.com/music/photo_new/T002R300x300M000003DFRzD192KKD_1.jpg?max_age=2592000", + "lrc": "https://npm.elemecdn.com/anzhiyu-music@1.0.2/七里香/七里香.lrc" + }, + { + "name": "花海", + "artist": "周杰伦", + "url": "https://npm.elemecdn.com/anzhiyu-music-jay@1.0.1/花海/花海.flac", + "cover": "https://y.qq.com/music/photo_new/T002R300x300M000002Neh8l0uciQZ_1.jpg?max_age=2592000", + "lrc": "https://npm.elemecdn.com/anzhiyu-music-jay@1.0.1/花海/花海.lrc" + }, + { + "name": "反方向的钟", + "artist": "周杰伦", + "url": "https://npm.elemecdn.com/anzhiyu-music-jay@1.0.1/反方向的钟/反方向的钟.flac", + "cover": "https://y.qq.com/music/photo_new/T002R300x300M000000f01724fd7TH_1.jpg?max_age=2592000", + "lrc": "https://npm.elemecdn.com/anzhiyu-music-jay@1.0.1/反方向的钟/反方向的钟.lrc" + }, + { + "name": "兰亭序", + "artist": "周杰伦", + "url": "https://npm.elemecdn.com/anzhiyu-music@1.0.1/周杰伦/兰亭序/兰亭序.mp3", + "cover": "https://y.qq.com/music/photo_new/T002R300x300M000002Neh8l0uciQZ_1.jpg?max_age=2592000", + "lrc": "https://npm.elemecdn.com/anzhiyu-music@1.0.1/周杰伦/兰亭序/兰亭序.lrc" + }, + { + "name": "说好的辛福呢", + "artist": "周杰伦", + "url": "https://npm.elemecdn.com/anzhiyu-music@1.0.2/说好的辛福呢/说好的辛福呢.mp3", + "cover": "https://y.qq.com/music/photo_new/T002R300x300M000002Neh8l0uciQZ_1.jpg?max_age=2592000", + "lrc": "https://npm.elemecdn.com/anzhiyu-music@1.0.2/说好的辛福呢/说好的幸福呢.lrc" + }, + { + "name": "等你下课 (with 杨瑞代)", + "artist": "周杰伦", + "url": "https://npm.elemecdn.com/anzhiyu-music@1.0.1/周杰伦/等你下课/等你下课.mp3", + "cover": "https://y.qq.com/music/photo_new/T002R300x300M000003bSL0v4bpKAx_1.jpg?max_age=2592000", + "lrc": "https://npm.elemecdn.com/anzhiyu-music@1.0.1/周杰伦/等你下课/等你下课.lrc" + }, + { + "name": "我落泪情绪零碎", + "artist": "周杰伦", + "url": "https://npm.elemecdn.com/anzhiyu-music@1.0.2/我落泪情绪零碎/我落泪情绪零碎.mp3", + "cover": "https://y.qq.com/music/photo_new/T002R300x300M000000bviBl4FjTpO_1.jpg?max_age=2592000", + "lrc": "https://npm.elemecdn.com/anzhiyu-music@1.0.2/我落泪情绪零碎/我落泪情绪零碎.lrc" + }, + { + "name": "听妈妈的话", + "artist": "周杰伦", + "url": "https://npm.elemecdn.com/anzhiyu-music@1.0.2/听妈妈的话/听妈妈的话.mp3", + "cover": "https://y.qq.com/music/photo_new/T002R300x300M000002jLGWe16Tf1H_1.jpg?max_age=2592000", + "lrc": "https://npm.elemecdn.com/anzhiyu-music@1.0.2/听妈妈的话/听妈妈的话.lrc" + }, + { + "name": "明明就", + "artist": "周杰伦", + "url": "https://npm.elemecdn.com/anzhiyu-music-jay@1.0.1/明明就/明明就.flac", + "cover": "https://y.qq.com/music/photo_new/T002R300x300M000003Ow85E3pnoqi_1.jpg?max_age=2592000", + "lrc": "https://npm.elemecdn.com/anzhiyu-music-jay@1.0.1/明明就/明明就.lrc" + }, + { + "name": "我是如此相信", + "artist": "周杰伦", + "url": "https://npm.elemecdn.com/anzhiyu-music-jay@1.0.1/我是如此相信/我是如此相信.flac", + "cover": "https://y.qq.com/music/photo_new/T002R300x300M000001hGx1Z0so1YX_1.jpg?max_age=2592000", + "lrc": "https://npm.elemecdn.com/anzhiyu-music-jay@1.0.1/我是如此相信/我是如此相信.lrc" + }, + { + "name": "发如雪", + "artist": "周杰伦", + "url": "https://npm.elemecdn.com/anzhiyu-music@1.0.3/发如雪/发如雪.mp3", + "cover": "https://y.qq.com/music/photo_new/T002R300x300M0000024bjiL2aocxT_3.jpg?max_age=2592000", + "lrc": "https://npm.elemecdn.com/anzhiyu-music@1.0.3/发如雪/发如雪.lrc" + }, + { + "name": "以父之名", + "artist": "周杰伦", + "url": "https://npm.elemecdn.com/anzhiyu-music@1.0.3/以父之名/以父之名.mp3", + "cover": "https://y.qq.com/music/photo_new/T002R300x300M000000MkMni19ClKG_3.jpg?max_age=2592000", + "lrc": "https://npm.elemecdn.com/anzhiyu-music@1.0.3/以父之名/以父之名.lrc" + }, + { + "name": "园游会", + "artist": "周杰伦", + "url": "https://npm.elemecdn.com/anzhiyu-music@1.0.3/园游会/园游会.flac", + "cover": "https://y.qq.com/music/photo_new/T002R300x300M000003DFRzD192KKD_1.jpg?max_age=2592000", + "lrc": "https://npm.elemecdn.com/anzhiyu-music@1.0.3/园游会/园游会.lrc" + }, + { + "name": "本草纲目", + "artist": "周杰伦", + "url": "https://npm.elemecdn.com/anzhiyu-music@1.0.4/本草纲目/本草纲目.mp3", + "cover": "https://y.qq.com/music/photo_new/T002R300x300M000002jLGWe16Tf1H_1.jpg?max_age=2592000", + "lrc": "https://npm.elemecdn.com/anzhiyu-music@1.0.4/本草纲目/本草纲目.lrc" + }, + { + "name": "龙卷风", + "artist": "周杰伦", + "url": "https://npm.elemecdn.com/anzhiyu-music@1.0.4/龙卷风/龙卷风.mp3", + "cover": "https://y.qq.com/music/photo_new/T002R300x300M000000f01724fd7TH_1.jpg?max_age=2592000", + "lrc": "https://npm.elemecdn.com/anzhiyu-music@1.0.4/龙卷风/龙卷风.lrc" + } +] \ No newline at end of file diff --git a/blog/source/music/index.md b/blog/source/music/index.md new file mode 100644 index 0000000..9525b87 --- /dev/null +++ b/blog/source/music/index.md @@ -0,0 +1,9 @@ +--- +title: 音乐馆 +date: 2026-01-12 11:58:30 +type: music +aplayer: true +top_img: false +comments: false +aside: false +--- \ No newline at end of file diff --git a/blog/themes/.gitkeep b/blog/themes/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/blog/themes/anzhiyu/.github/ISSUE_TEMPLATE/bug_report.yml b/blog/themes/anzhiyu/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 0000000..b302550 --- /dev/null +++ b/blog/themes/anzhiyu/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,73 @@ +name: Bug report +description: Create a report to help us improve +title: "[Bug]: " + +body: + - type: markdown + attributes: + value: | + 重要:请依照该模板来提交 + Please follow the template to create a new issue + - type: input + id: anzhiyu-ver + attributes: + label: 使用的 AnZhiYu 版本? | What version of AnZhiYu are you use? + description: 检视主题的 package.json | Check the theme's package.json + validations: + required: true + + - type: dropdown + id: browser + attributes: + label: 使用的浏览器? || What browse are you using? + options: + - Chrome + - Edge + - Safari + - Opera + - Other + validations: + required: true + + - type: dropdown + id: modify + attributes: + label: 是否修改过主题文件? || Has the theme files been modified? + options: + - 是 (Yes) + - 不是 (No) + validations: + required: true + + - type: dropdown + id: platform + attributes: + label: 使用的系统? || What operating system are you using? + options: + - Windows + - macOS + - Linux + - Android + - iOS + - Other + validations: + required: true + + - type: textarea + id: description + attributes: + label: 问题描述 | Describe the bug + description: 请描述你的问题现象 | A clear and concise description of what the bug is. + placeholder: 请尽量提供截图来定位你的问题 | If applicable, add screenshots to help explain your problem + value: + validations: + required: true + + - type: input + id: website + attributes: + label: 出现问题的网站 | Website + description: 请提供下可复现的网站地址 | Please supply a website url which can reproduce problem. + placeholder: + validations: + required: true diff --git a/blog/themes/anzhiyu/.github/ISSUE_TEMPLATE/config.yml b/blog/themes/anzhiyu/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..81c1615 --- /dev/null +++ b/blog/themes/anzhiyu/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,13 @@ +blank_issues_enabled: false +contact_links: + - name: Questions about AnZhiYu + url: https://github.com/anzhiyu-c/hexo-theme-anzhiyu/discussions + about: 一些使用问题请到 Discussion 询问。 Please ask questions in Discussion. + + - name: AnZhiYu Q&A + url: https://hexo.anheyu.com/comments/ + about: AnZhiYu Q&A + + - name: QQ群 + url: https://jq.qq.com/?_wv=1027&k=v7NK7ELr + about: "群号 464636182" diff --git a/blog/themes/anzhiyu/.github/ISSUE_TEMPLATE/feature_request.yml b/blog/themes/anzhiyu/.github/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 0000000..99759a7 --- /dev/null +++ b/blog/themes/anzhiyu/.github/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,14 @@ +name: Feature request +description: Suggest an idea for this project +title: "[Feature]: " + +body: + - type: textarea + id: feature-request + attributes: + label: 想要的功能 | What feature do you want? + description: 请描述你需要的新功能 | A clear and concise description of what the feature is. + placeholder: + value: + validations: + require: true diff --git a/blog/themes/anzhiyu/.github/workflows/issue_close_question.yml b/blog/themes/anzhiyu/.github/workflows/issue_close_question.yml new file mode 100644 index 0000000..5844dad --- /dev/null +++ b/blog/themes/anzhiyu/.github/workflows/issue_close_question.yml @@ -0,0 +1,22 @@ +name: Close need info + +on: + schedule: + - cron: "0 0 */1 * *" + workflow_dispatch: + +jobs: + close-need-info: + runs-on: ubuntu-latest + steps: + - name: close-issues + uses: actions-cool/issues-helper@v3 + with: + actions: "close-issues" + token: ${{ secrets.GITHUB_TOKEN }} + labels: "question" + inactive-day: 60 + close-reason: "not_planned" + body: | + Hello @${{ github.event.issue.user.login }}, this issue was closed due to no activities in 60 days. + 你好 @${{ github.event.issue.user.login }},此issue因超过60天未回复被关闭。 diff --git a/blog/themes/anzhiyu/.github/workflows/issue_close_stale.yml b/blog/themes/anzhiyu/.github/workflows/issue_close_stale.yml new file mode 100644 index 0000000..1a2eb61 --- /dev/null +++ b/blog/themes/anzhiyu/.github/workflows/issue_close_stale.yml @@ -0,0 +1,21 @@ +name: Close inactive + +on: + schedule: + - cron: "0 0 */7 * *" + workflow_dispatch: + +jobs: + close-inactive: + runs-on: ubuntu-latest + steps: + - name: close-issues + uses: actions-cool/issues-helper@v3 + with: + actions: "close-issues" + token: ${{ secrets.GITHUB_TOKEN }} + labels: "stale" + inactive-day: 60 + close-reason: "not_planned" + body: | + Hello @${{ github.event.issue.user.login }}, this issue was closed due to inactive more than 60 days. You can reopen or recreate it if you think it should continue. Thank you for your contributions again. diff --git a/blog/themes/anzhiyu/.github/workflows/issue_duplicate.yml b/blog/themes/anzhiyu/.github/workflows/issue_duplicate.yml new file mode 100644 index 0000000..7c881ab --- /dev/null +++ b/blog/themes/anzhiyu/.github/workflows/issue_duplicate.yml @@ -0,0 +1,25 @@ +name: Issue Duplicate + +on: + issues: + types: [labeled] + +jobs: + create-comment: + runs-on: ubuntu-latest + if: github.event.label.name == 'duplicate' + steps: + - name: Create comment + uses: actions-cool/issues-helper@v2 + with: + actions: "create-comment" + token: ${{ secrets.GITHUB_TOKEN }} + issue-number: ${{ github.event.issue.number }} + body: | + Hello @${{ github.event.issue.user.login }}, your issue is duplicated and will be closed. + 你好 @${{ github.event.issue.user.login }},你的issue是重复的,将被关闭。 + - name: Close issue + uses: actions-cool/issues-helper@v2 + with: + actions: "close-issue" + token: ${{ secrets.GITHUB_TOKEN }} diff --git a/blog/themes/anzhiyu/.github/workflows/issue_invalid.yml b/blog/themes/anzhiyu/.github/workflows/issue_invalid.yml new file mode 100644 index 0000000..2aa7ba0 --- /dev/null +++ b/blog/themes/anzhiyu/.github/workflows/issue_invalid.yml @@ -0,0 +1,18 @@ +name: Issue Invalid + +on: + issues: + types: [labeled] + +jobs: + lock-issue: + runs-on: ubuntu-latest + if: github.event.label.name == 'invalid' + steps: + - name: Lock issue + uses: actions-cool/issues-helper@v2 + with: + actions: "lock-issue" + token: ${{ secrets.GITHUB_TOKEN }} + issue-number: ${{ github.event.issue.number }} + lock-reason: "off-topic" diff --git a/blog/themes/anzhiyu/.github/workflows/issue_question.yml b/blog/themes/anzhiyu/.github/workflows/issue_question.yml new file mode 100644 index 0000000..b31cc8c --- /dev/null +++ b/blog/themes/anzhiyu/.github/workflows/issue_question.yml @@ -0,0 +1,20 @@ +name: Issue Question + +on: + issues: + types: [labeled] + +jobs: + create-comment: + runs-on: ubuntu-latest + if: github.event.label.name == 'question' + steps: + - name: Create comment + uses: actions-cool/issues-helper@v2.0.0 + with: + actions: "create-comment" + token: ${{ secrets.ISSUSE_TOKEN }} + issue-number: ${{ github.event.issue.number }} + body: | + Hello @${{ github.event.issue.user.login }}, please input issue by template and add detail. Issues labeled by Need More Info will be closed if no activities in 7 days. + 你好 @${{ github.event.issue.user.login }},请按照issue模板填写, 并详细说明问题和复现步骤等, 60天内未回复issue自动关闭。 diff --git a/blog/themes/anzhiyu/.github/workflows/issue_wontfix.yml b/blog/themes/anzhiyu/.github/workflows/issue_wontfix.yml new file mode 100644 index 0000000..b35e17a --- /dev/null +++ b/blog/themes/anzhiyu/.github/workflows/issue_wontfix.yml @@ -0,0 +1,25 @@ +name: Issue Wontfix + +on: + issues: + types: [labeled] + +jobs: + lock-issue: + runs-on: ubuntu-latest + if: github.event.label.name == 'wontfix' + steps: + - name: Create comment + uses: actions-cool/issues-helper@v3 + with: + actions: "create-comment" + token: ${{ secrets.GITHUB_TOKEN }} + issue-number: ${{ github.event.issue.number }} + body: | + Hello @${{ github.event.issue.user.login }}, this issue will not be worked on and will be closed. + 你好 @${{ github.event.issue.user.login }},这不会被处理,将被关闭。 + - name: Close issue + uses: actions-cool/issues-helper@v3 + with: + actions: "close-issue" + token: ${{ secrets.GITHUB_TOKEN }} diff --git a/blog/themes/anzhiyu/.github/workflows/publish.yml b/blog/themes/anzhiyu/.github/workflows/publish.yml new file mode 100644 index 0000000..d68365d --- /dev/null +++ b/blog/themes/anzhiyu/.github/workflows/publish.yml @@ -0,0 +1,19 @@ +name: npm publish + +on: + release: + types: [created] +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + # Setup .npmrc file to publish to npm + - uses: actions/setup-node@v1 + with: + node-version: '12.x' + registry-url: 'https://registry.npmjs.org' + - run: npm install + - run: npm publish + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} \ No newline at end of file diff --git a/blog/themes/anzhiyu/.github/workflows/stale.yml b/blog/themes/anzhiyu/.github/workflows/stale.yml new file mode 100644 index 0000000..a50d9de --- /dev/null +++ b/blog/themes/anzhiyu/.github/workflows/stale.yml @@ -0,0 +1,19 @@ +name: 'Close stale issues and PRs' +on: + schedule: + - cron: '30 1 * * *' + +jobs: + stale: + runs-on: ubuntu-latest + steps: + - uses: actions/stale@v5 + with: + days-before-issue-stale: 30 + days-before-pr-stale: -1 + days-before-close: 7 + stale-issue-message: 'This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.' + close-pr-message: 'This issue has not seen any activity since it was marked stale. Closing.' + stale-issue-label: 'Stale' + exempt-issue-labels: 'pinned,bug,enhancement,documentation,Plan' + operations-per-run: 1000 \ No newline at end of file diff --git a/blog/themes/anzhiyu/.gitignore b/blog/themes/anzhiyu/.gitignore new file mode 100644 index 0000000..d20a3a0 --- /dev/null +++ b/blog/themes/anzhiyu/.gitignore @@ -0,0 +1,9 @@ +.DS_Store +Thumbs.db +db.json +*.log +node_modules/ +public/ +.deploy*/ +.deploy_git*/ +.idea \ No newline at end of file diff --git a/blog/themes/anzhiyu/LICENSE b/blog/themes/anzhiyu/LICENSE new file mode 100644 index 0000000..f288702 --- /dev/null +++ b/blog/themes/anzhiyu/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/blog/themes/anzhiyu/README.md b/blog/themes/anzhiyu/README.md new file mode 100644 index 0000000..aba1324 --- /dev/null +++ b/blog/themes/anzhiyu/README.md @@ -0,0 +1,144 @@ +

+ Hexo Version + Node Version + License +
+ GitHub Release + Npm Downloads + GitHub Commits +

+ GitHub Watchers + GitHub Stars + GitHub Forks +

+ +

🇨🇳 中文简体 | 🇬🇧 English

+ +预览: 👍 [AnZhiYu](https://hexo.anheyu.com/) || 🤞 [AnZhiYu](https://index.anheyu.com/) + +文档: 📖 [anzhiyu Docs](https://docs.anheyu.com/) + +一款基于[hexo-theme-butterfly](https://github.com/jerryc127/hexo-theme-butterfly)修改的主題 + +如果你希望有一个类似于wordpress的可以后台编辑的,那么你可以看看这个项目 [安和鱼](https://github.com/anzhiyu-c/anheyu-app) + +# hexo-theme-anzhiyu + +![](https://upload-bbs.miyoushe.com/upload/2025/07/04/125766904/658277d773c29a145adf0d05055ce477_909497354353121629.webp?x-oss-process=image///quality,q_100/auto-orient,0/interlace,1/format,avif) + +## 💻 安裝 + +### Git 安裝 + +在博客根目录里安装最新版【推荐】 + +```powershell +git clone -b main https://github.com/anzhiyu-c/hexo-theme-anzhiyu.git themes/anzhiyu +``` + +## ⚙ 应用主题 + +修改 hexo 配置文件`_config.yml`,把主题改为`anzhiyu` + +``` +theme: anzhiyu +``` + +> 如果你没有 pug 以及 stylus 的渲染器,请下载安装: `npm install hexo-renderer-pug hexo-renderer-stylus --save` + +## 覆盖配置 + +覆盖配置可以使`主题配置`放置在 anzhiyu 目录之外,避免在更新主题时丢失自定义的配置。 + +通过 Npm 安装主题的用户可忽略,其他用户建议学习使用。 + +- macos/linux + 在博客根目录运行 + +```bash +cp -rf ./themes/anzhiyu/_config.yml ./_config.anzhiyu.yml +``` + +- windows + 复制`/themes/anzhiyu/_config.yml`此文件到 hexo 根目录,并重命名为`_config.anzhiyu.yml` + +以后如果修改任何主题配置,都只需修改 \_config.anzhiyu.yml 的配置即可。 + +注意: + +- 只要存在于 `_config.anzhiyu.yml` 的配置都是高优先级,修改原 `_config.yml` 是无效的。 +- 每次更新主题可能存在配置变更,请注意更新说明,可能需要手动对 `_config.anzhiyu.yml` 同步修改。 +- 想查看覆盖配置有没有生效,可以通过 `hexo g --debug` 查看命令行输出。 +- 如果想将某些配置覆盖为空,注意不要把主键删掉,不然是无法覆盖的 + +## 功能特性 + +- ✅ 无比详实的[用户文档](https://docs.anheyu.com/) +- ✅ 页面组件懒加载(pjax 方案) +- ✅ 图片懒加载 +- ✅ 多种代码高亮方案 +- ✅ 多语言配置 +- ✅ 内置多款评论插件 +- ✅ 内置网页访问统计 +- ✅ 支持暗色模式 +- ✅ 支持脚注语法 +- ✅ 支持自定义 CDN 静态资源 +- ✅ 丰富多样化的标签选项快速构建你想要的功能 +- ✅ 支持定制化的右键菜单 +- ✅ 支持定制化的主色调随封面图片颜色变化 +- ✅ 支持沉浸式状态栏 +- ✅ 支持文章字数统计 +- ✅ 支持聊天系统 +- ✅ 支持谷歌分析、百度分析、微软分析、cloudflare 分析、cnzz 分析 +- ✅ 支持广告挂载 +- ✅ 支持图片大图查看 +- ✅ 支持瀑布流即刻说说 +- ✅ 支持瀑布流相册集 +- ✅ 支持阿里图标与 fontawesome +- ✅ 支持高速缓存的 swpp,pwa 特性 +- ✅ 优秀的隐私协议支持 +- ✅ 文章 AI 摘要支持 +- ✅ 支持音乐球 +- ✅ 支持全局中控台 +- ✅ 支持快捷键选项 +- ✅ 支持本地搜索/algolia 搜索 🔍/Docsearch +- ✅ 支持 LaTeX 数学公式 +- ✅ 支持 mermaid 流程图 + +## 部分功能展示 + +**沉浸式状态栏** +沉浸阅读。 +![沉浸式状态栏](https://upload-bbs.miyoushe.com/upload/2023/09/04/125766904/3bc088e73d07b4dc25fc62fa4cf63261_4205905123525229755.png?x-oss-process=image///quality,q_100/auto-orient,0/interlace,1/format,avif) + +**高低自定义的右键菜单** +高度定制。 +![高低自定义的右键菜单](https://upload-bbs.miyoushe.com/upload/2023/09/04/125766904/3f66e33b24a758d53717f6c2c44e50af_1884994888952376370.png?x-oss-process=image///quality,q_100/auto-orient,0/interlace,1/format,avif) + +**AI 摘要** +迅速读取文章内容。 +![AI摘要](https://upload-bbs.miyoushe.com/upload/2023/09/04/125766904/184e089d64660f5f72390f547c864633_3266246986824356702.png) + +**让人眼前一亮的清爽界面** + +![让人眼前一亮的清爽界面](https://upload-bbs.miyoushe.com/upload/2023/09/04/125766904/8a16284fd36a9e986d5dbda772f697d0_1356079755877317976.png?x-oss-process=image///quality,q_100/auto-orient,0/interlace,1/format,avif) + +**评论弹幕** + +![评论弹幕](https://upload-bbs.miyoushe.com/upload/2023/09/04/125766904/628aef1dbf52b61c0333682e8ee9954e_6905019516821534667.png) + +## 贡献者 + +[![contributors](https://opencollective.com/hexo-theme-anzhiyu/contributors.svg?width=890&button=false)](https://github.com/anzhiyu-c/hexo-theme-anzhiyu/) + +主题设计:[@张洪 Heo](https://github.com/zhheo) + +文档编写:[@xiaoran](https://github.com/xiaoran) + +[本项目 CDN 加速及安全防护由 Tencent EdgeOne 赞助](https://edgeone.ai/zh?from=github) + +![image](https://github.com/user-attachments/assets/1f3c8f9b-d509-4e64-b8f5-11c318d672a7) + +## 仓库统计 + +![仓库统计](https://repobeats.axiom.co/api/embed/60fcf455cd02123aebe6249deabf8d48e3debcae.svg "Repobeats analytics image") diff --git a/blog/themes/anzhiyu/README_EN.md b/blog/themes/anzhiyu/README_EN.md new file mode 100644 index 0000000..c66be84 --- /dev/null +++ b/blog/themes/anzhiyu/README_EN.md @@ -0,0 +1,142 @@ +

+ Hexo Version + Node Version + License +
+ GitHub Release + Npm Downloads + GitHub Commits +

+ GitHub Watchers + GitHub Stars + GitHub Forks +

+ +

🇨🇳 中文简体 | 🇬🇧 English

+ +Preview: 👍 [AnZhiYu](https://hexo.anheyu.com/) || 🤞 [AnZhiYu](https://index.anheyu.com/) + +Document: 📖 [anzhiyu Docs](https://docs.anheyu.com/) + +A theme based on [hexo-theme-butterfly](https://github.com/jerryc127/hexo-theme-butterfly) modification + +# hexo-theme-anzhiyu + +![](https://bu.dusays.com/2023/07/24/64bdcbfe96762.webp) + +## 💻 安裝 + +### Git 安裝 + +Install the latest version in the root directory of the blog [recommended] + +```powershell +git clone -b main https://github.com/anzhiyu-c/hexo-theme-anzhiyu.git themes/anzhiyu +``` + +## ⚙ 应用主题 + +Modify the hexo configuration file `_ config.yml` and change the theme to `anzhiyu` + +``` +theme: anzhiyu +``` + +> If you do not have a renderer for pug and stylus, please download and install: `npm install hexo-renderer-pug hexo-renderer-stylus --save` + +## Override configuration + +Override configuration allows the `theme configuration `to be placed outside the anzhiyu directory to avoid losing custom configurations when updating the theme. + +Users who install the theme through Npm can ignore it, and other users are recommended to learn to use it. + +- macos/linux + Run in the blog root directory + + ```bash + cp -rf ./themes/anzhiyu/_config.yml ./_config.anzhiyu.yml + ``` + +- windows + Copy the file `/ themes/anzhiyu/_ config.yml` to the hexo root directory and rename it to` _ config.anzhiyu.yml` + +If you modify any theme configuration in the future, you only need to modify the configuration of_config.anzhiyu.yml. + +Note: + +- as long as the configurations that exist in `_ config.anzhiyu.yml` are of high priority, it is invalid to modify the original` _ config.yml`. +- there may be configuration changes each time the topic is updated. Please pay attention to the update instructions. You may need to manually modify `_ config.anzhiyu.yml`. +- to check whether the override configuration has taken effect, you can check the command line output via `override g-- debug`. +- if you want to overwrite some configurations to empty, be careful not to delete the primary key, otherwise it cannot be overwritten + +## Functional characteristics + +-✅ extremely detailed [user documentation] (https://docs.anheyu.com/) +-✅ Page components load lazily (pjax scheme) +-✅ the picture is loaded lazily +-✅ multiple code highlighting schemes +-✅ multilingual configuration +-✅ built-in multiple comment plug-ins +-✅ built-in web page access statistics +-✅ supports dark mode +-✅ supports footnote syntax +-✅ support custom CDN static resources +-✅ A rich variety of tag options to quickly build the features you want +-✅ supports customized right-click menus +-✅ support customized dominant tone to vary with the color of the cover image +-✅ support for immersive status bar +-✅ support article word statistics +-✅ support chat system +-✅ support Google Analytics, Baidu Analytics, Microsoft Analytics, cloudflare Analytics, cnzz Analytics +-✅ Advertising is supported +-✅ large picture view is supported +-✅ support waterfall flow and talk about it right away +-✅ supports waterfall stream album +-✅ supports Ali icon and fontawesome +-✅ supports cached swpp,pwa features +-✅ excellent privacy protocol support +-✅ AI abstract support for articles +-✅ support music ball +-✅ supports the global center console +-✅ supports shortcut key options +-✅ support local search / algolia search 🔍 / Docsearch +-✅ supports LaTeX mathematical formula +-✅ support mermaid flow chart + +## Partial function display + +**Immersive status bar** + +Immerse yourself in reading. + +![Immersive status bar](https://upload-bbs.miyoushe.com/upload/2023/09/04/125766904/3bc088e73d07b4dc25fc62fa4cf63261_4205905123525229755.png) + +**Customized right-click menu** + +Highly customized. + +![ High and low custom right-click menu](https://upload-bbs.miyoushe.com/upload/2023/09/04/125766904/3f66e33b24a758d53717f6c2c44e50af_1884994888952376370.png) + +**AI Summary** +Read articles quickly. +![AI Summary](https://upload-bbs.miyoushe.com/upload/2023/09/04/125766904/184e089d64660f5f72390f547c864633_3266246986824356702.png) + +**A refreshing interface that makes people shine at the moment** + +![A refreshing interface that makes people shine at the moment](https://upload-bbs.miyoushe.com/upload/2023/09/04/125766904/8a16284fd36a9e986d5dbda772f697d0_1356079755877317976.png) + +**Comment Barrage** + +![Comment Barrage](https://upload-bbs.miyoushe.com/upload/2023/09/04/125766904/628aef1dbf52b61c0333682e8ee9954e_6905019516821534667.png) + +## Contributors + +[![contributors](https://opencollective.com/hexo-theme-anzhiyu/contributors.svg?width=890&button=false)](https://github.com/anzhiyu-c/hexo-theme-anzhiyu/) + +Theme Design:[@张洪 Heo](https://github.com/zhheo) + +Document writing:[@xiaoran](https://github.com/xiaoran) + +## Warehouse Statistics + +![Warehouse Statistics](https://repobeats.axiom.co/api/embed/60fcf455cd02123aebe6249deabf8d48e3debcae.svg "Repobeats analytics image") diff --git a/blog/themes/anzhiyu/_config.yml b/blog/themes/anzhiyu/_config.yml new file mode 100644 index 0000000..4685e20 --- /dev/null +++ b/blog/themes/anzhiyu/_config.yml @@ -0,0 +1,1342 @@ +menu: + # 文章: + # 隧道: /archives/ || anzhiyu-icon-box-archive + # 分类: /categories/ || anzhiyu-icon-shapes + # 标签: /tags/ || anzhiyu-icon-tags + + # 友链: + # 友人帐: /link/ || anzhiyu-icon-link + # 朋友圈: /fcircle/ || anzhiyu-icon-artstation + # 留言板: /comments/ || anzhiyu-icon-envelope + + # 我的: + # 音乐馆: /music/ || anzhiyu-icon-music + # 追番页: /bangumis/ || anzhiyu-icon-bilibili + # 相册集: /album/ || anzhiyu-icon-images + # 小空调: /air-conditioner/ || anzhiyu-icon-fan + + # 关于: + # 关于本人: /about/ || anzhiyu-icon-paper-plane + # 闲言碎语: /essay/ || anzhiyu-icon-lightbulb + # 随便逛逛: javascript:toRandomPost() || anzhiyu-icon-shoe-prints1 + +# nav相关配置 +nav: + enable: false + travelling: false + clock: false + menu: + - title: 网页 + item: + - name: 博客 + link: https://hexo.anheyu.com/ + icon: /img/favicon.ico + - title: 项目 + item: + - name: 安知鱼图床 + link: https://image.anheyu.com/ + icon: https://image.anheyu.com/favicon.ico + +# mourn (哀悼日,指定日期网站简单变灰,不包括滚动条) +# 注意: 仅网站首页变灰,其他页面正常显示 +mourn: + enable: false + days: [4-5, 5-12, 7-7, 9-18, 12-13] + +# Code Blocks (代码相关) +# -------------------------------------- + +highlight_theme: light # darker / pale night / light / ocean / mac / mac light / false +highlight_copy: true # copy button +highlight_lang: true # show the code language +highlight_shrink: false # true: shrink the code blocks / false: expand the code blocks | none: expand code blocks and hide the button +highlight_height_limit: 330 # unit: px +code_word_wrap: false + +# copy settings +# copyright: Add the copyright information after copied content (複制的内容后面加上版权信息) +# copy: enable 复制后弹窗提示版权信息 +copy: + enable: true + copyright: + enable: false + limit_count: 50 + +# social settings (社交图标设置) +# formal: +# name: link || icon +social: + # Github: https://github.com/anzhiyu-c || anzhiyu-icon-github + # BiliBili: https://space.bilibili.com/372204786 || anzhiyu-icon-bilibili + +# 作者卡片 状态 +author_status: + enable: false + # 可以是任何图片,建议放表情包或者emoji图片,效果都很好,[表情包速查](https://emotion.xiaokang.me/) + statusImg: "https://bu.dusays.com/2023/08/24/64e6ce9c507bb.png" + skills: + # - 🤖️ 数码科技爱好者 + # - 🔍 分享与热心帮助 + # - 🏠 智能家居小能手 + # - 🔨 设计开发一条龙 + # - 🤝 专修交互与设计 + # - 🏃 脚踏实地行动派 + # - 🧱 团队小组发动机 + # - 💢 壮汉人狠话不多 + +# search (搜索) +# -------------------------------------- + +# Algolia search +algolia_search: + enable: false + hits: + per_page: 6 + tags: + # - 前端 + # - Hexo + +# Docsearch +# Apply and Option Docs: see https://docsearch.algolia.com/ +# Crawler Admin Console: see https://crawler.algolia.com/ +# Settings: https://www.algolia.com/ +docsearch: + enable: false + appId: # see email + apiKey: # see email + indexName: # see email + option: + +# Local search +local_search: + enable: false + preload: true + CDN: + +# Math (数学) +# -------------------------------------- +# About the per_page +# if you set it to true, it will load mathjax/katex script in each page (true 表示每一页都加载js) +# if you set it to false, it will load mathjax/katex script according to your setting (add the 'mathjax: true' in page's front-matter) +# (false 需要时加载,须在使用的 Markdown Front-matter 加上 mathjax: true) + +# MathJax +mathjax: + enable: false + per_page: false + +# KaTeX +katex: + enable: false + per_page: false + hide_scrollbar: true + +# Image (图片设置) +# -------------------------------------- + +# Favicon(网站图标) +favicon: /favicon.ico + +# Avatar (头像) +avatar: + img: https://bu.dusays.com/2023/04/27/64496e511b09c.jpg + effect: false + +# Disable all banner image +disable_top_img: false + +# The banner image of home page +index_img: false # "background: url() top / cover no-repeat" + +# If the banner of page not setting, it will show the top_img +default_top_img: false + +cover: + # display the cover or not (是否显示文章封面) + index_enable: true + aside_enable: true + archives_enable: true + # the position of cover in home page (封面显示的位置) + # left/right/both + position: left + # When cover is not set, the default cover is displayed (当没有设置cover时,默认的封面显示) + default_cover: + # - /img/default_cover.jpg + +# Replace Broken Images (替换无法显示的图片) +error_img: + flink: /img/friend_404.gif + post_page: /img/404.jpg + +# A simple 404 page +error_404: + enable: true + subtitle: "请尝试站内搜索寻找文章" + background: https://bu.dusays.com/2023/05/08/645907596997d.gif + +post_meta: + page: # Home Page + date_type: created # created or updated or both 主页文章日期是创建日或者更新日或都显示 + date_format: simple # date/relative/simple 显示日期还是相对日期 或者 简单日期 + categories: true # true or false 主页是否显示分类 + tags: true # true or false 主页是否显示标籤 + label: false # true or false 显示描述性文字 + post: + date_type: both # created or updated or both 文章页日期是创建日或者更新日或都显示 + date_format: date # date/relative 显示日期还是相对日期 + categories: true # true or false 文章页是否显示分类 + tags: true # true or false 文章页是否显示标籤 + label: true # true or false 显示描述性文字 + unread: false # true or false 文章未读功能 + +# 主色调相关配置 +mainTone: + enable: false # true or false 文章是否启用获取图片主色调 + mode: api # colorthief/cdn/api/both colorthief模式为前端获取图片主色调,cdn模式为图片url+imageAve参数获取主色调,api模式为请求API获取主色调,both模式会先请求cdn参数,无法获取的情况下将请求API获取,可以在文章内配置main_color: '#3e5658',使用十六进制颜色,则不会请求colorthief/cdn/api/both获取主色调,而是直接使用配置的颜色 + # 项目地址:https://github.com/anzhiyu-c/img2color-go + api: https://img2color-go.vercel.app/api?img= # mode为api时可填写 + cover_change: true # 整篇文章跟随cover修改主色调 + +# wordcount (字数统计) +wordcount: + enable: false + post_wordcount: true + min2read: true + total_wordcount: true + +# Display the article introduction on homepage +# 1: description +# 2: both (if the description exists, it will show description, or show the auto_excerpt) +# 3: auto_excerpt (default) +# false: do not show the article introduction +index_post_content: + method: 3 + length: 500 # if you set method to 2 or 3, the length need to config + +# anchor +# when you scroll in post, the URL will update according to header id. +anchor: false + +# Post +# -------------------------------------- + +# toc (目录) +toc: + post: true + page: false + number: true + expand: false + style_simple: false # for post + +post_copyright: + enable: true + decode: false + author_href: + location: 长沙 + license: CC BY-NC-SA 4.0 + license_url: https://creativecommons.org/licenses/by-nc-sa/4.0/ + avatarSinks: false # hover时头像下沉 + copyright_author_img_back: + copyright_author_img_front: + copyright_author_link: / + +# Sponsor/reward +reward: + enable: true + QR_code: + - img: https://npm.elemecdn.com/anzhiyu-blog@1.1.6/img/post/common/qrcode-weichat.png + link: + text: 微信 + - img: https://npm.elemecdn.com/anzhiyu-blog@1.1.6/img/post/common/qrcode-alipay.png + link: + text: 支付宝 + +# Post edit +# Easily browse and edit blog source code online. +post_edit: # 目前仅可选择一个平台在线编辑 + enable: false + # github: https://github.com/user-name/repo-name/edit/branch-name/subdirectory-name/ + # For example: https://github.com/jerryc127/butterfly.js.org/edit/main/source/ + github: false + + # yuque: https://www.yuque.com/user-name/repo-name/ + # 示例: https://www.yuque.com/yuque/yuque/ + # 你需要在语雀文章 Front Matter 添加参数 id 并确保其唯一性(例如 “id: yuque”, “id: 01”) + yuque: false + +# Related Articles +related_post: + enable: true + limit: 6 # Number of posts displayed + date_type: created # or created or updated 文章日期显示创建日或者更新日 + +# figcaption (图片描述文字) +photofigcaption: false + +# post_pagination (分页) +# value: 1 || 2 || 3 || 4 || false +# 1: The 'next post' will link to old post +# 2: The 'next post' will link to new post +# 3: 只有下一篇,并且只在文章滚动到评论区时显示下一篇文章(旧文章) +# 4: 只有下一篇,并且只在文章滚动到评论区时显示下一篇文章(旧文章) 显示图片cover +# false: disable pagination +post_pagination: 2 + +# Displays outdated notice for a post (文章过期提醒) +noticeOutdate: + enable: false + style: flat # style: simple/flat + limit_day: 365 # When will it be shown + position: top # position: top/bottom + message_prev: It has been + message_next: days since the last update, the content of the article may be outdated. + +# Share System (分享功能) +# -------------------------------------- + +# Share.js +# https://github.com/overtrue/share.js +sharejs: + enable: true + sites: facebook,twitter,wechat,weibo,qq + +# AddToAny +# https://www.addtoany.com/ +addtoany: + enable: false + item: facebook,twitter,wechat,sina_weibo,email,copy_link + +# Comments System +# -------------------------------------- + +comments: + # Up to two comments system, the first will be shown as default + # Choose: Valine/Waline/Twikoo/Artalk + use: # Twikoo/Waline + text: true # Display the comment name next to the button + # lazyload: The comment system will be load when comment element enters the browser's viewport. + # If you set it to true, the comment count will be invalid + lazyload: false + count: false # Display comment count in post's top_img + card_post_count: false # Display comment count in Home Page + +# valine +# https://valine.js.org +valine: + appId: xxxxx # leancloud application app id + appKey: xxxxx # leancloud application app key + pageSize: 10 # comment list page size + avatar: mp # gravatar style https://valine.js.org/#/avatar + lang: zh-CN # i18n: zh-CN/zh-TW/en/ja + placeholder: 填写QQ邮箱就会使用QQ头像喔~. # valine comment input placeholder (like: Please leave your footprints) + guest_info: nick,mail,link # valine comment header info (nick/mail/link) + recordIP: false # Record reviewer IP + serverURLs: # This configuration is suitable for domestic custom domain name users, overseas version will be automatically detected (no need to manually fill in) + bg: /img/comment_bg.png # valine background + emojiCDN: //i0.hdslb.com/bfs/emote/ # emoji CDN + enableQQ: true # enable the Nickname box to automatically get QQ Nickname and QQ Avatar + requiredFields: nick,mail # required fields (nick/mail) + visitor: false + master: + - xxxxx + friends: + - xxxxxx + tagMeta: "博主,小伙伴,访客" + option: + +# waline - A simple comment system with backend support fork from Valine +# https://waline.js.org/ +waline: + serverURL: # Waline server address url + bg: # Waline background + pageview: false + meta_css: false # 是否引入 waline-meta.css ,以便显示 meta图标 + imageUploader: true # 配置为 > 换行后可自定义图片上传逻辑,示例: https://waline.js.org/cookbook/customize/upload-image.html#案例 + # 以下为可选配置,后续若有新增/修改配置参数可在此自行添加/修改 + option: + +# Twikoo +# https://github.com/imaegoo/twikoo +twikoo: + envId: + region: + visitor: false + option: + +# Artalk +# https://artalk.js.org/guide/frontend/config.html +artalk: + server: + site: + visitor: false + option: + +# giscus +# https://giscus.app/ +giscus: + repo: # GitHub repository name + repo_id: # GitHub repository id + category_id: # GitHub repository category id + theme: + light: light + dark: dark + option: # options + data-lang: zh-CN + data-mapping: + data-category: + data-input-position: + +# Chat Services +# -------------------------------------- + +# Chat Button [recommend] +# It will create a button in the bottom right corner of website, and hide the origin button +chat_btn: false + +# The origin chat button is displayed when scrolling up, and the button is hidden when scrolling down +chat_hide_show: false + +# chatra +# https://chatra.io/ +chatra: + enable: false + id: + +# tidio +# https://www.tidio.com/ +tidio: + enable: false + public_key: + +# daovoice +# http://daovoice.io/ +daovoice: + enable: false + app_id: + +# crisp +# https://crisp.chat/en/ +crisp: + enable: false + website_id: + +# Footer Settings +# -------------------------------------- +footer: + owner: + enable: true + since: 2020 + custom_text: + runtime: + enable: false + launch_time: 04/01/2021 00:00:00 # 网站上线时间 + work_img: https://npm.elemecdn.com/anzhiyu-blog@2.0.4/img/badge/安知鱼-上班摸鱼中.svg + work_description: 距离月入25k也就还差一个大佬带我~ + offduty_img: https://npm.elemecdn.com/anzhiyu-blog@2.0.4/img/badge/安知鱼-下班啦.svg + offduty_description: 下班了就该开开心心的玩耍,嘿嘿~ + # 徽标部分配置项 https://shields.io/ + # https://img.shields.io/badge/CDN-jsDelivr-orange?style=flat&logo=jsDelivr + bdageitem: + enable: false + list: + - link: https://hexo.io/ #徽标指向网站链接 + shields: https://npm.elemecdn.com/anzhiyu-blog@2.1.5/img/badge/Frame-Hexo.svg #徽标API + message: 博客框架为Hexo_v5.4.0 #徽标提示语 + - link: https://hexo.anheyu.com/ + shields: https://npm.elemecdn.com/anzhiyu-theme-static@1.0.9/img/Theme-AnZhiYu-2E67D3.svg + message: 本站使用AnZhiYu主题 + # - link: https://www.dogecloud.com/ + # shields: https://npm.elemecdn.com/anzhiyu-blog@2.2.0/img/badge/CDN-多吉云-3693F3.svg + # message: 本站使用多吉云为静态资源提供CDN加速 + # - link: https://github.com/ + # shields: https://npm.elemecdn.com/anzhiyu-blog@2.1.5/img/badge/Source-Github.svg + # message: 本站项目由Github托管 + # - link: http://creativecommons.org/licenses/by-nc-sa/4.0/ + # shields: https://npm.elemecdn.com/anzhiyu-blog@2.2.0/img/badge/Copyright-BY-NC-SA.svg + # message: 本站采用知识共享署名-非商业性使用-相同方式共享4.0国际许可协议进行许可 + socialBar: + enable: false + centerImg: + left: + # - title: email + # link: mailto:anzhiyu-c@qq.com + # icon: anzhiyu-icon-envelope + # - title: 微博 + # link: https://weibo.com/u/6378063631 + # icon: anzhiyu-icon-weibo + # - title: facebook + # link: https://www.facebook.com/profile.php?id=100092208016287&sk=about + # icon: anzhiyu-icon-facebook1 + # - title: RSS + # link: atom.xml + # icon: anzhiyu-icon-rss + right: + # - title: Github + # link: https://github.com/anzhiyu-c + # icon: anzhiyu-icon-github + # - title: Bilibili + # link: https://space.bilibili.com/372204786 + # icon: anzhiyu-icon-bilibili + # - title: 抖音 + # link: https://v.douyin.com/DwCpMEy/ + # icon: anzhiyu-icon-tiktok + # - title: CC + # link: /copyright + # icon: anzhiyu-icon-copyright-line + list: + enable: false + randomFriends: 3 + project: + # - title: 服务 + # links: + # - title: 51la统计 + # link: https://v6.51.la/ + # - title: 十年之约 + # link: https://www.foreverblog.cn/ + # - title: 开往 + # link: https://github.com/travellings-link/travellings + # - title: 主题 + # links: + # - title: 文档 + # link: /docs/ + # - title: 源码 + # link: https://github.com/anzhiyu-c/hexo-theme-anzhiyu + # - title: 更新日志 + # link: /update/ + # - title: 导航 + # links: + # - title: 即刻短文 + # link: /essay/ + # - title: 友链文章 + # link: /fcircle/ + # - title: 留言板 + # link: /comments/ + # - title: 协议 + # links: + # - title: 隐私协议 + # link: /privacy/ + # - title: Cookies + # link: /cookies/ + # - title: 版权协议 + # link: /copyright/ + footerBar: + enable: true + authorLink: / + cc: + enable: false + link: /copyright + linkList: + - link: https://github.com/anzhiyu-c/hexo-theme-anzhiyu + text: 主题 + # - link: https://image.anheyu.com + # text: 图床 + # - link: https://beian.miit.gov.cn/ + # text: 湘ICP备-xxxxxxx号 + subTitle: + enable: false + # Typewriter Effect (打字效果) + effect: true + # Effect Speed Options (打字效果速度参数) + startDelay: 300 # time before typing starts in milliseconds + typeSpeed: 150 # type speed in milliseconds + backSpeed: 50 # backspacing speed in milliseconds + # loop (循环打字) + loop: true + # source 调用第三方服务 + # source: false 关闭调用 + # source: 1 调用一言网的一句话(简体) https://hitokoto.cn/ + # source: 2 调用一句网(简体) http://yijuzhan.com/ + # source: 3 调用今日诗词(简体) https://www.jinrishici.com/ + # subtitle 会先显示 source , 再显示 sub 的内容 + source: 1 + # 如果关闭打字效果,subtitle 只会显示 sub 的第一行文字 + sub: + # - 生活明朗, 万物可爱, 人间值得, 未来可期. + +# Analysis +# -------------------------------------- + +# Baidu Analytics +# https://tongji.baidu.com/web/welcome/login +baidu_analytics: + +# Google Analytics +# https://analytics.google.com/analytics/web/ +google_analytics: + +# CNZZ Analytics +# https://www.umeng.com/ +cnzz_analytics: + +# Cloudflare Analytics +# https://www.cloudflare.com/zh-tw/web-analytics/ +cloudflare_analytics: + +# Microsoft Clarity +# https://clarity.microsoft.com/ +microsoft_clarity: + +# Advertisement +# -------------------------------------- + +# Google Adsense (谷歌广告) +google_adsense: + enable: false + auto_ads: true + js: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js + client: + enable_page_level_ads: true + +# Insert ads manually (手动插入广告) +# ad: +# index: +# aside: +# post: + +# Verification (站长验证) +# -------------------------------------- + +site_verification: + - name: google-site-verification + content: xxx + - name: baidu-site-verification + content: code-xxx + - name: msvalidate.01 + content: xxx + +# Beautify/Effect (美化/效果) +# -------------------------------------- + +# Theme color for customize +# Notice: color value must in double quotes like "#000" or may cause error! + +theme_color: + enable: true + main: "#425AEF" + dark_main: "#f2b94b" + paginator: "#425AEF" + # button_hover: "#FF7242" + text_selection: "#2128bd" + link_color: "var(--anzhiyu-fontcolor)" + meta_color: "var(--anzhiyu-fontcolor)" + hr_color: "#4259ef23" + code_foreground: "#fff" + code_background: "var(--anzhiyu-code-stress)" + toc_color: "#425AEF" + # blockquote_padding_color: "#425AEF" + # blockquote_background_color: "#425AEF" + scrollbar_color: "var(--anzhiyu-scrollbar)" + meta_theme_color_light: "#f7f9fe" + meta_theme_color_dark: "#18171d" + +# 移动端侧栏 +sidebar: + site_data: + archive: true + tag: true + category: true + menus_items: true + tags_cloud: true + display_mode: true + nav_menu_project: true + +# 文章h2添加分隔线 +h2Divider: false + +# 表格隔行变色 +table_interlaced_discoloration: false + +# 首页双栏显示 +article_double_row: true + +# The top_img settings of home page +# default: top img - full screen, site info - middle (默认top_img全屏,site_info在中间) +# The position of site info, eg: 300px/300em/300rem/10% (主页标题距离顶部距离) +index_site_info_top: +# The height of top_img, eg: 300px/300em/300rem (主页top_img高度) +index_top_img_height: + +# The user interface setting of category and tag page (category和tag页的UI设置) +# index - same as Homepage UI (index 值代表 UI将与首页的UI一样) +# default - same as archives UI 默认跟archives页面UI一样 +category_ui: # 留空或 index +tag_ui: # 留空或 index + +# Footer Background +footer_bg: false + +# the position of bottom right button/default unit: px (右下角按钮距离底部的距离/默认单位为px) +rightside-bottom: 100px + +# Background effects (背景特效) +# -------------------------------------- + +# canvas_ribbon (静止彩带背景) +# See: https://github.com/hustcc/ribbon.js +canvas_ribbon: + enable: false + size: 150 + alpha: 0.6 + zIndex: -1 + click_to_change: false + mobile: false + +# Fluttering Ribbon (动态彩带) +canvas_fluttering_ribbon: + enable: false + mobile: false + +# canvas_nest +# https://github.com/hustcc/canvas-nest.js +canvas_nest: + enable: false + color: "0,0,255" #color of lines, default: '0,0,0'; RGB values: (R,G,B).(note: use ',' to separate.) + opacity: 0.7 # the opacity of line (0~1), default: 0.5. + zIndex: -1 # z-index property of the background, default: -1. + count: 99 # the number of lines, default: 99. + mobile: false + +# Typewriter Effect (打字效果) +# https://github.com/disjukr/activate-power-mode +activate_power_mode: + enable: false + colorful: true # open particle animation (冒光特效) + shake: false # open shake (抖动特效) + mobile: false + +# Mouse click effects: fireworks (鼠标点击效果: 烟火特效) +fireworks: + enable: false + zIndex: 9999 # -1 or 9999 + mobile: false + +# Mouse click effects: Heart symbol (鼠标点击效果: 爱心) +click_heart: + enable: false + mobile: false + +# Mouse click effects: words (鼠标点击效果: 文字) +ClickShowText: + enable: false + text: + # - I + # - LOVE + # - YOU + fontSize: 15px + random: false + mobile: false + +# Default display mode (网站默认的显示模式) +# light (default) / dark +display_mode: light + +# Beautify (美化页面显示) +beautify: + enable: true + field: post # site/post + title-prefix-icon: '\f0c1' + title-prefix-icon-color: "#F47466" + +# Global font settings +# Don't modify the following settings unless you know how they work (非必要不要修改) +font: + global-font-size: 16px + code-font-size: + font-family: + code-font-family: consolas, Menlo, "PingFang SC", "Microsoft JhengHei", "Microsoft YaHei", sans-serif + +# Font settings for the site title and site subtitle +# 左上角网站名字 主页居中网站名字 +blog_title_font: + font_link: + font-family: PingFang SC, 'Hiragino Sans GB', 'Microsoft JhengHei', 'Microsoft YaHei', sans-serif + +# The setting of divider icon (水平分隔线图标设置) +hr_icon: + enable: true + icon: \f0c4 # the unicode value of Font Awesome icon, such as '\f0c4' + icon-top: + +# the subtitle on homepage (主页subtitle) +subtitle: + enable: false + # Typewriter Effect (打字效果) + effect: true + # Effect Speed Options (打字效果速度参数) + startDelay: 300 # time before typing starts in milliseconds + typeSpeed: 150 # type speed in milliseconds + backSpeed: 50 # backspacing speed in milliseconds + # loop (循环打字) + loop: true + # source 调用第三方服务 + # source: false 关闭调用 + # source: 1 调用一言网的一句话(简体) https://hitokoto.cn/ + # source: 2 调用一句网(简体) http://yijuzhan.com/ + # source: 3 调用今日诗词(简体) https://www.jinrishici.com/ + # subtitle 会先显示 source , 再显示 sub 的内容 + source: 1 + # 如果关闭打字效果,subtitle 只会显示 sub 的第一行文字 + sub: + # - 生活明朗,万物可爱,人间值得,未来可期. + +# Loading Animation (加载动画) +preloader: + enable: true + # source + # 1. fullpage-loading + # 2. pace (progress bar) + # else all + source: 3 + # pace theme (see https://codebyzach.github.io/pace/) + pace_css_url: + avatar: https://npm.elemecdn.com/anzhiyu-blog-static@1.0.4/img/avatar.jpg # 自定加载动画义头像 + +# aside (侧边栏) +# -------------------------------------- + +aside: + enable: true + hide: false + button: true + mobile: true # display on mobile + position: right # left or right + display: # 控制对应详情页面是否显示侧边栏 + archive: true + tag: true + category: true + card_author: + enable: true + description: #
这有关于产品、设计、开发相关的问题和看法,还有文章翻译分享
相信你可以在这里找到对你有用的知识教程
# 默认为站点描述 + name_link: / + + card_announcement: + enable: false + content: 欢迎来看我的博客鸭~ + card_weixin: + enable: true + face: https://bu.dusays.com/2023/01/13/63c02edf44033.png + backFace: https://bu.dusays.com/2023/05/13/645fa415e8694.png + card_recent_post: + enable: true + limit: 5 # if set 0 will show all + sort: date # date or updated + sort_order: # Don't modify the setting unless you know how it works + card_categories: + enable: false + limit: 8 # if set 0 will show all + expand: none # none/true/false + sort_order: # Don't modify the setting unless you know how it works + card_tags: + enable: true + limit: 40 # if set 0 will show all + color: false + sort_order: # Don't modify the setting unless you know how it works + highlightTags: + # - Hexo + # - 前端 + card_archives: + enable: true + type: monthly # yearly or monthly + format: MMMM YYYY # eg: YYYY年MM月 + order: -1 # Sort of order. 1, asc for ascending; -1, desc for descending + limit: 8 # if set 0 will show all + sort_order: # Don't modify the setting unless you know how it works + card_webinfo: + enable: true + post_count: true + last_push_date: false + sort_order: # Don't modify the setting unless you know how it works + +# busuanzi count for PV / UV in site +# 访问人数 +busuanzi: + site_uv: false + site_pv: false + page_pv: false + +# Time difference between publish date and now (网页运行时间) +# Formal: Month/Day/Year Time or Year/Month/Day Time +runtimeshow: + enable: true + publish_date: 4/1/2021 00:00:00 + +# Console - Newest Comments +newest_comments: + enable: true + sort_order: # Don't modify the setting unless you know how it works + limit: 6 + storage: 10 # unit: mins, save data to localStorage + avatar: true + +# Bottom right button (右下角按钮) +# -------------------------------------- + +# Conversion between Traditional and Simplified Chinese (简繁转换) +translate: + enable: true + # The text of a button + default: 繁 + # Right-click menu default text + rightMenuMsgDefault: "轉為繁體" + # the language of website (1 - Traditional Chinese/ 2 - Simplified Chinese) + defaultEncoding: 2 + # Time delay + translateDelay: 0 + # The text of the button when the language is Simplified Chinese + msgToTraditionalChinese: "繁" + # The text of the button when the language is Traditional Chinese + msgToSimplifiedChinese: "简" + # Right-click the menu to traditional Chinese + rightMenuMsgToTraditionalChinese: "转为繁体" + # Right-click menu to simplified Chinese + rightMenuMsgToSimplifiedChinese: "转为简体" + +# Read Mode (閲读模式) +readmode: true + +# 中控台 +centerConsole: + enable: true + card_tags: + enable: true + limit: 40 # if set 0 will show all + color: false + sort_order: # Don't modify the setting unless you know how it works + highlightTags: + # - Hexo + # - 前端 + card_archives: + enable: true + type: monthly # yearly or monthly + format: MMMM YYYY # eg: YYYY年MM月 + order: -1 # Sort of order. 1, asc for ascending; -1, desc for descending + limit: 8 # if set 0 will show all + sort_order: # Don't modify the setting unless you know how it works + +# dark mode +darkmode: + enable: true + # Toggle Button to switch dark/light mode + button: true + # Switch dark/light mode automatically (自动切换 dark mode和 light mode) + # autoChangeMode: 1 Following System Settings, if the system doesn't support dark mode, it will switch dark mode between 6 pm to 6 am + # autoChangeMode: 2 Switch dark mode between 6 pm to 6 am + # autoChangeMode: false + autoChangeMode: 1 + start: # 8 + end: # 22 + +# Don't modify the following settings unless you know how they work (非必要请不要修改 ) +# Choose: readmode,translate,darkmode,hideAside,toc,chat,comment +# Don't repeat 不要重複 +rightside_item_order: + enable: false + hide: # readmode,translate,darkmode,hideAside + show: # toc,chat,comment + +# Lightbox (图片大图查看模式) +# -------------------------------------- +# You can only choose one, or neither (只能选择一个 或者 两个都不选) + +# medium-zoom +# https://github.com/francoischalifour/medium-zoom +medium_zoom: false + +# fancybox +# http://fancyapps.com/fancybox/3/ +fancybox: true + +# Tag Plugins settings (标籤外挂) +# -------------------------------------- + +# mermaid +# see https://github.com/mermaid-js/mermaid +mermaid: + enable: false + # built-in themes: default/forest/dark/neutral + theme: + light: default + dark: dark + +# Note (Bootstrap Callout) +note: + # Note tag style values: + # - simple bs-callout old alert style. Default. + # - modern bs-callout new (v2-v3) alert style. + # - flat flat callout style with background, like on Mozilla or StackOverflow. + # - disabled disable all CSS styles import of note tag. + style: flat + icons: true + border_radius: 3 + # Offset lighter of background in % for modern and flat styles (modern: -12 | 12; flat: -18 | 6). + # Offset also applied to label tag variables. This option can work with disabled note tag. + light_bg_offset: 0 + +icons: + ali_iconfont_js: # 阿里图标symbol 引用链接,主题会进行加载 symbol 引用 + fontawesome: false #是否启用fontawesome6图标 + fontawesome_animation_css: #fontawesome_animation 如果有就会加载,示例值:https://npm.elemecdn.com/hexo-butterfly-tag-plugins-plus@1.0.17/lib/assets/font-awesome-animation.min.css + +# other +# -------------------------------------- + +# Pjax +# It may contain bugs and unstable, give feedback when you find the bugs. +# https://github.com/MoOx/pjax +pjax: + enable: true + exclude: + # - xxxx + # - xxxx + +# Inject the css and script (aplayer/meting) +aplayerInject: + enable: true + per_page: true + +# Snackbar (Toast Notification 弹窗) +# https://github.com/polonel/SnackBar +# position 弹窗位置 +# 可选 top-left / top-center / top-right / bottom-left / bottom-center / bottom-right +snackbar: + enable: true + position: top-center + bg_light: "#425AEF" # The background color of Toast Notification in light mode + bg_dark: "#1f1f1f" # The background color of Toast Notification in dark mode + +# https://instant.page/ +# prefetch (预加载) +instantpage: true + +# https://github.com/vinta/pangu.js +# Insert a space between Chinese character and English character (中英文之间添加空格) +pangu: + enable: false + field: site # site/post + +# Lazyload (图片懒加载) +# https://github.com/verlok/vanilla-lazyload +lazyload: + enable: true + field: site # site/post + placeholder: + blur: true + progressive: true + +# PWA +# See https://github.com/JLHwung/hexo-offline +# --------------- +pwa: + enable: false + startup_image_enable: true + manifest: /manifest.json + theme_color: var(--anzhiyu-main) + mask_icon: /img/siteicon/apple-icon-180.png + apple_touch_icon: /img/siteicon/apple-icon-180.png + bookmark_icon: /img/siteicon/apple-icon-180.png + favicon_32_32: /img/siteicon/32.png + favicon_16_16: /img/siteicon/16.png + +# Open graph meta tags +# https://developers.facebook.com/docs/sharing/webmasters/ +Open_Graph_meta: true + +# Add the vendor prefixes to ensure compatibility +css_prefix: true + +# 首页顶部相关配置 +home_top: + enable: true # 开关 + timemode: date #date/updated + title: 生活明朗 + subTitle: 万物可爱。 + siteText: anheyu.com + category: + - name: 前端 + path: /categories/前端开发/ + shadow: var(--anzhiyu-shadow-blue) + class: blue + icon: anzhiyu-icon-dove + - name: 大学 + path: /categories/大学生涯/ + shadow: var(--anzhiyu-shadow-red) + class: red + icon: anzhiyu-icon-fire + - name: 生活 + path: /categories/生活日常/ + shadow: var(--anzhiyu-shadow-green) + class: green + icon: anzhiyu-icon-book + default_descr: 再怎么看我也不知道怎么描述它的啦! + swiper: + enable: false + swiper_css: https://npm.elemecdn.com/anzhiyu-theme-static@1.0.0/swiper/swiper.min.css #swiper css依赖 + swiper_js: https://npm.elemecdn.com/anzhiyu-theme-static@1.0.0/swiper/swiper.min.js #swiper js依赖 + banner: + tips: 新品主题 + title: Theme-AnZhiYu + image: https://bu.dusays.com/2023/05/13/645fa3cf90d70.webp + link: https://docs.anheyu.com/ + +# 朋友圈配置 +friends_vue: + enable: false + vue_js: https://npm.elemecdn.com/anzhiyu-theme-static@1.1.1/friends/index.4f887d95.js + apiurl: # 朋友圈后端地址 + top_tips: 使用 友链朋友圈 订阅友链最新文章 + top_background: + +# 深色模式粒子效果canvas +universe: + enable: true + +# 页面卡片顶部气泡升起效果 +bubble: + enable: false + +# 控制台打印信息 +console: + enable: true + +# 51a统计配置 +LA: + enable: false + ck: + LingQueMonitorID: + +# Umami 统计配置(关于页面访问统计卡片) +# 文档: https://umami.is/docs/api +umami: + enable: false + # Umami API 地址,如 https://analytics.example.com + apiHost: + # 网站 ID + websiteId: + # API Token(在 Umami 后台 Settings -> API Keys 中生成) + token: + +# 标签卖萌 +diytitle: + enable: true + leaveTitle: w(゚Д゚)w 不要走!再看看嘛! + backTitle: ♪(^∇^*)欢迎肥来! + +# 留言弹幕配置 +comment_barrage_config: + enable: false + # 同时最多显示弹幕数 + maxBarrage: 1 + # 弹幕显示间隔时间ms + barrageTime: 4000 + # token,在控制台中获取 + accessToken: "" + # 博主邮箱md5值 + mailMd5: "" + +# 左下角音乐配置项 +# https://github.com/metowolf/MetingJS +nav_music: + enable: true + console_widescreen_music: false # 宽屏状态控制台显示音乐而不是标签 enable为true 控制台依然会显示 + id: 8152976493 + server: netease + volume: 0.7 # 默认音量 + all_playlist: https://y.qq.com/n/ryqq/playlist/8802438608 + +# 路径为 /music 的音乐页面默认加载的歌单 1. nav_music 2. custom +music_page_default: nav_music + +# 评论匿名邮箱 +visitorMail: + enable: true + mail: "" + +# ptool 文章底部工具 +ptool: + enable: true + share_mobile: true + share_weibo: true + share_copyurl: true + categories: false # 是否显示分类 + mode: # 运营模式与责任,不配置不显示 + +# 欢迎语配置 +greetingBox: + enable: false #开启后必须配置下面的list对应的时间段,不然会出现小白条 + default: 晚上好👋 + list: + # - greeting: 晚安😴 + # startTime: 0 + # endTime: 5 + # - greeting: 早上好鸭👋, 祝你一天好心情! + # startTime: 6 + # endTime: 9 + # - greeting: 上午好👋, 状态很好,鼓励一下~ + # startTime: 10 + # endTime: 10 + # - greeting: 11点多啦, 在坚持一下就吃饭啦~ + # startTime: 11 + # endTime: 11 + # - greeting: 午安👋, 宝贝 + # startTime: 12 + # endTime: 14 + # - greeting: 🌈充实的一天辛苦啦! + # startTime: 14 + # endTime: 18 + # - greeting: 19点喽, 奖励一顿丰盛的大餐吧🍔。 + # startTime: 19 + # endTime: 19 + # - greeting: 晚上好👋, 在属于自己的时间好好放松😌~ + # startTime: 20 + # endTime: 24 + +# 文章顶部ai摘要 +post_head_ai_description: + enable: true + gptName: AnZhiYu + mode: local # 默认模式 可选值: tianli/local + switchBtn: false # 可以配置是否显示切换按钮 以切换tianli/local + btnLink: https://afdian.net/item/886a79d4db6711eda42a52540025c377 + randomNum: 3 # 按钮最大的随机次数,也就是一篇文章最大随机出来几种 + basicWordCount: 1000 # 最低获取字符数, 最小1000, 最大1999 + key: xxxx + Referer: https://xx.xx/ + +# 快捷键配置 +shortcutKey: + enable: false + delay: 100 # 所有键位延时触发而不是立即触发(包括shift,以解决和浏览器键位冲突问题) + shiftDelay: 200 # shift按下延时多久开启 + +# 无障碍优化(在首页按下「shift + ?」以查看效果) +accesskey: + enable: true + +# 友情链接顶部相关配置 +linkPageTop: + enable: false + title: 与数百名博主无限进步 + # 添加博主友链的评论自定义格式 + addFriendPlaceholder: "昵称(请勿包含博客等字样):\n网站地址(要求博客地址,请勿提交个人主页):\n头像图片url(请提供尽可能清晰的图片,我会上传到我自己的图床):\n描述:\n站点截图(可选):\n" + +# 缩略图后缀 archive/tag/category 页面单独开启后缀 +pageThumbnailSuffix: "" + +# 隐私协议弹窗 +agreementPopup: + enable: false + url: /privacy + +# 右键菜单 +rightClickMenu: + enable: false + +# 首页随便逛逛people模式 而非技能点模式,关闭后为技能点模式需要配置creativity.yml +peoplecanvas: + enable: true + img: https://upload-bbs.miyoushe.com/upload/2024/07/27/125766904/ba62475f396df9de3316a08ed9e65d86_5680958632268053399..png + +# 动效 +dynamicEffect: + postTopWave: true # 文章顶部波浪效果 + postTopRollZoomInfo: false # 文章顶部滚动时缩放 + pageCommentsRollZoom: false # 非文章页面评论滚动时缩放显示(仅仅Twikoo生效) + +# Inject +# Insert the code to head (before '' tag) and the bottom (before '' tag) +# 插入代码到头部 之前 和 底部 之前 +inject: + head: + # 自定义css + # - + + bottom: + # 自定义js + # - + +# CDN +# Don't modify the following settings unless you know how they work +# 非必要请不要修改 +CDN: + # The CDN provider of internal scripts (主题内部 js 的 cdn 配置) + # option: local/elemecdn/jsdelivr/unpkg/cdnjs/onmicrosoft/cbd/anheyu/custom + # Dev version can only choose. ( dev版的主题只能设置为 local ) + internal_provider: local + + # The CDN provider of third party scripts (第三方 js 的 cdn 配置) + # option: elemecdn/jsdelivr/unpkg/cdnjs/onmicrosoft/cbd/anheyu/custom + third_party_provider: cbd + + # Add version number to CDN, true or false + version: true + + # Custom format + # For example: https://cdn.staticfile.org/${cdnjs_name}/${version}/${min_cdnjs_file} + custom_format: # https://npm.elemecdn.com/${name}@latest/${file} + + option: + # main_css: + # main: + # utils: + # translate: + # random_friends_post_js: + # right_click_menu_js: + # comment_barrage_js: + # ai_abstract_js: + # people_js: + # local_search: + # algolia_js: + # algolia_search: + # instantsearch: + # docsearch_js: + # docsearch_css: + # pjax: + # blueimp_md5: + # valine: + # twikoo: + # waline_js: + # waline_css: + # sharejs: + # sharejs_css: + # mathjax: + # katex: + # katex_copytex: + # mermaid: + # canvas_ribbon: + # canvas_fluttering_ribbon: + # canvas_nest: + # lazyload: + # instantpage: + # typed: + # pangu: + # fancybox_css: + # fancybox: + # medium_zoom: + # snackbar_css: + # snackbar: + # activate_power_mode: + # fireworks: + # click_heart: + # ClickShowText: + # fontawesome: + # flickr_justified_gallery_js: + # flickr_justified_gallery_css: + # aplayer_css: + # aplayer_js: + # meting_js: + # meting_api: + # prismjs_js: + # prismjs_lineNumber_js: + # prismjs_autoloader: + # artalk_js: + # artalk_css: + # pace_js: + # pace_default_css: + # countup_js: + # gsap_js: + # busuanzi: + # rightmenu: + # waterfall: + # ali_iconfont_css: + # accesskey_js: + # colorthief: diff --git a/blog/themes/anzhiyu/languages/default.yml b/blog/themes/anzhiyu/languages/default.yml new file mode 100644 index 0000000..47562ae --- /dev/null +++ b/blog/themes/anzhiyu/languages/default.yml @@ -0,0 +1,128 @@ +footer: + framework: 框架 + theme: 主题 + +copy: + success: 复制成功 + error: 复制错误 + noSupport: 浏览器不支持 + +page: + articles: 文章总览 + tag: 标签 + category: 分类 + archives: 归档 + +card_post_count: 条评论 + +sticky: 置顶 +no_title: 无题 + +post: + created: 发表于 + updated: 更新于 + wordcount: 字数总计 + min2read: 阅读时长 + min2read_unit: 分钟 + page_pv: 阅读量 + comments: 评论数 + copyright: + author: 文章作者 + link: 文章链接 + copyright_notice: 版权声明 + copyright_content: '本博客所有文章除特别声明外,均采用 + %s 许可协议。转载请注明来自 %s!' + recommend: 喜欢这篇文章的人也看了 + edit: 编辑 + +search: + title: "搜索" + load_data: 数据库加载中 + algolia_search: + input_placeholder: 输入关键词后按下回车查找 + hits_empty: "找不到您查询的内容:${query}" + hits_stats: "找到 ${hits} 条结果,用时 ${time} 毫秒" + + local_search: + input_placeholder: 搜索文章 + hits_empty: "找不到您查询的内容:${query}" + +pagination: + prev: 上一篇 + next: 下一篇 + +comment: 评论 + +aside: + articles: 文章 + tags: 标签 + categories: 分类 + card_announcement: 公告 + card_categories: 分类 + card_tags: 标签 + card_archives: 归档 + card_recent_post: 最近发布 + card_webinfo: + headline: 网站资讯 + article_name: 文章总数 + runtime: + name: 建站天数 + unit: 天 + last_push_date: + name: 最后更新时间 + site_wordcount: 全站字数 + site_uv_name: 全站访客数 + site_pv_name: 全站总访问量 + more_button: 查看更多 + card_newest_comments: + headline: 最新评论 + loading_text: 正在加载中... + error: 无法获取评论,请确认相关配置是否正确 + zero: 没有评论 + image: 图片 + link: 链接 + code: 代码 + card_toc: 文章目录 + display_mode: 显示模式 + function: 功能 + +date_suffix: + just: 刚刚 + min: 分钟前 + hour: 小时前 + day: 天前 + month: 个月前 + +donate: 不给糖果就捣蛋 +share: 分享 + +rightside: + readmode_title: 阅读模式 + translate_title: 简繁转换 + night_mode_title: 浅色和深色模式转换 + back_to_top: 回到顶部 + toc: 目录 + scroll_to_comment: 直达评论 + setting: 设置 + aside: 单栏和双栏切换 + chat: 聊天 + +copy_copyright: + author: 作者 + link: 链接 + source: 来源 + info: 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 + copySuccess: 复制成功,复制和转载请标注本文地址 + +Snackbar: + chs_to_cht: 你已切换为繁体 + cht_to_chs: 你已切换为简体 + day_to_night: 你已切换为深色模式 + night_to_day: 你已切换为浅色模式 + copy_equipment_name: 已复制装备名称 + +loading: 加载中... + +load_more: 加载更多 + +error404: 页面没有找到 diff --git a/blog/themes/anzhiyu/languages/en.yml b/blog/themes/anzhiyu/languages/en.yml new file mode 100644 index 0000000..97cd65c --- /dev/null +++ b/blog/themes/anzhiyu/languages/en.yml @@ -0,0 +1,215 @@ +footer: + framework: Framework + theme: Theme + back_to_top: Back to Top + friend_links: Links + refresh_friends: Refresh Links + cc_license: CC License + +copy: + success: Copy successfully + error: Copy error + noSupport: The browser does not support + +page: + articles: Articles + tag: Tag + category: Category + archives: Archives + +card_post_count: comments + +sticky: Sticky +no_title: No title + +post: + created: Created + updated: Updated + wordcount: Word count + min2read: Reading time + min2read_unit: min + new: New + unread: Unread + page_pv: Post View + comments: Comments + copyright: + author: Author + link: Link + copyright_notice: Copyright Notice + copyright_content: 'All articles in this blog are licensed under %s unless stating additionally.' + recommend: Related Articles + edit: + github: Edited on GitHub + yuque: Edited on Yuque + +search: + title: Search + load_data: Loading the Database + algolia_search: + input_placeholder: Search for Posts + hits_empty: "We didn't find any results for the search: ${query}." + hits_stats: "${hits} results found in ${time} ms" + + local_search: + input_placeholder: Search for Posts + hits_empty: "We didn't find any results for the search: ${query}" + +pagination: + prev: Previous Post + next: Next Post + +comment: Comment + +aside: + articles: Articles + tags: Tags + categories: Categories + card_announcement: Announcement + card_categories: Categories + card_tags: Tags + card_archives: Archives + card_recent_post: Recent Post + card_webinfo: + headline: Info + article_name: Article + runtime: + name: Run time + unit: days + last_push_date: + name: Last Push + site_wordcount: Total Count + site_uv_name: UV + site_pv_name: PV + more_button: More + card_newest_comments: + headline: Newest Comments + loading_text: loading... + error: Unable to get the data, please make sure the settings are correct. + zero: No Comment + image: image + link: link + code: code + card_toc: Catalog + display_mode: Display Mode + function: Function + +date_suffix: + just: Just + min: minutes ago + hour: hours ago + day: days ago + month: months ago + +donate: Donate +share: Share + +rightside: + readmode_title: Read Mode + translate_title: Switch Between Traditional Chinese And Simplified Chinese + night_mode_title: Switch Between Light And Dark Mode + back_to_top: Back To Top + toc: Table Of Contents + scroll_to_comment: Scroll To Comments + setting: Setting + aside: Toggle between single-column and double-column + chat: Chat + +copy_copyright: + author: Author + link: Link + source: Source + info: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source. + copySuccess: Copy success, copy and reprint please mark the address of this article + +Snackbar: + chs_to_cht: Traditional Chinese Activated Manually + cht_to_chs: Simplified Chinese Activated Manually + day_to_night: Dark Mode Activated Manually + night_to_day: Light Mode Activated Manually + copy_equipment_name: Installed device name has been loaded + +loading: Loading... + +load_more: Load More + +error404: Page not found + +shortcut: + title: Keyboard Shortcuts + close_shortcut: Close Shortcuts + toggle_console: Toggle Console + play_music: Play/Pause Music + toggle_mode: Toggle Dark/Light Mode + search: Search + random: Random Post + home: Home + fish_pond: Fish Pond + links: Links + about: About + context_menu: Toggle Context Menu + +flink: + title: Friend Links + friend_links: Links + latest_articles: Latest Articles + about_me: About Me + fishing: 🎣 Fishing + all_links: All Links + random_visit: Random Visit + apply_link: Apply Link + recommend: Hot + +console: + title: Console + interaction: Interaction + music: Music + music_desc: Soul Collision 💥 + interests: Interests + interests_desc: Find your area of interest + articles: Articles + toggle_mode: Toggle Display Mode + toggle_aside: Toggle Sidebar + toggle_barrage: Toggle Comments Barrage + toggle_music: Toggle Music + toggle_keyboard: Toggle Keyboard Shortcuts + +reward: + title: Support Author + button: Donate + thanks: Thanks for your support + list: Supporters + list_desc: Your support motivates me to write more 🙏 + +nav: + travelling: Random Travelling Site + random_post: Random Post + search: Search 🔍 + toggle_menu: Toggle + +about: + title: About Me + hello: Hello, nice to meet you 👋 + im: I'm + data: Data + visit_stats: Visit Statistics + stats_from: Statistics from + enjoy_music_with: Enjoy more music with %s + more_recommend: More + thanks: Thanks + reward_list: Reward List + reward_thanks: Thanks for your support, it motivates me to create more. + last_update: "Last updated: " + charge_for_ta: Support + total_people: "%s people in total" + personality: Personality + personality_img_alt: Personality + selfie_alt: Selfie + learn_more_at: Learn more about %s at %s + stats: + today_visitors: Today Visitors + today_views: Today Views + yesterday_visitors: Yesterday Visitors + yesterday_views: Yesterday Views + month_views: Month Views + total_views: Total Views + fetch_failed: Failed to load statistics diff --git a/blog/themes/anzhiyu/languages/zh-CN.yml b/blog/themes/anzhiyu/languages/zh-CN.yml new file mode 100644 index 0000000..310d502 --- /dev/null +++ b/blog/themes/anzhiyu/languages/zh-CN.yml @@ -0,0 +1,218 @@ +footer: + framework: 框架 + theme: 主题 + back_to_top: 返回顶部 + friend_links: 友链 + refresh_friends: 换一批友情链接 + cc_license: CC协议 + +copy: + success: 复制成功 + error: 复制错误 + noSupport: 浏览器不支持 + +page: + articles: 文章总览 + tag: 标签 + category: 分类 + archives: 归档 + +card_post_count: 条评论 + +sticky: 置顶 +no_title: 无题 + +post: + created: 发表于 + updated: 更新于 + wordcount: 字数总计 + min2read: 阅读时长 + min2read_unit: 分钟 + new: 最新 + unread: 未读 + page_pv: 阅读量 + comments: 评论数 + copyright: + author: 文章作者 + link: 文章链接 + copyright_notice: 版权声明 + copyright_content: '本博客所有文章除特别声明外,均采用 + %s 许可协议。转载请注明来自 %s!' + recommend: 喜欢这篇文章的人也看了 + edit: + github: 在 GitHub 上编辑 + yuque: 在 语雀 上编辑 + # notion: 在 Notion 上编辑 + # flowus: 在 Flowus 上编辑 + +search: + title: "搜索" + load_data: 数据库加载中 + algolia_search: + input_placeholder: 输入关键词后按下回车查找 + hits_empty: "找不到您查询的内容:${query}" + hits_stats: "找到 ${hits} 条结果,用时 ${time} 毫秒" + + local_search: + input_placeholder: 搜索文章 + hits_empty: "找不到您查询的内容:${query}" + +pagination: + prev: 上一篇 + next: 下一篇 + +comment: 评论 + +aside: + articles: 文章 + tags: 标签 + categories: 分类 + card_announcement: 公告 + card_categories: 分类 + card_tags: 标签 + card_archives: 归档 + card_recent_post: 最近发布 + card_webinfo: + headline: 网站资讯 + article_name: 文章总数 + runtime: + name: 建站天数 + unit: 天 + last_push_date: + name: 最后更新 + site_wordcount: 全站字数 + site_uv_name: 总访客数 + site_pv_name: 总访问量 + more_button: 查看更多 + card_newest_comments: + headline: 最新评论 + loading_text: 正在加载中... + error: 无法获取评论,请确认相关配置是否正确 + zero: 没有评论 + image: 图片 + link: 链接 + code: 代码 + card_toc: 文章目录 + display_mode: 显示模式 + function: 功能 + +date_suffix: + just: 刚刚 + min: 分钟前 + hour: 小时前 + day: 天前 + month: 个月前 + +donate: 不给糖果就捣蛋 +share: 分享 + +rightside: + readmode_title: 阅读模式 + translate_title: 简繁转换 + night_mode_title: 浅色和深色模式转换 + back_to_top: 回到顶部 + toc: 目录 + scroll_to_comment: 直达评论 + setting: 设置 + aside: 单栏和双栏切换 + chat: 聊天 + +copy_copyright: + author: 作者 + link: 链接 + source: 来源 + info: 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 + copySuccess: 复制成功,复制和转载请标注本文地址 + +Snackbar: + chs_to_cht: 你已切换为繁体 + cht_to_chs: 你已切换为简体 + day_to_night: 你已切换为深色模式 + night_to_day: 你已切换为浅色模式 + copy_equipment_name: 已复制装备名称 + +loading: 加载中... + +load_more: 加载更多 + +error404: 页面没有找到 + +shortcut: + title: 博客快捷键 + close_shortcut: 关闭快捷键功能 + toggle_console: 打开/关闭中控台 + play_music: 播放/暂停音乐 + toggle_mode: 深色/浅色显示模式 + search: 站内搜索 + random: 随机访问 + home: 返回首页 + fish_pond: 友链鱼塘 + links: 友链页面 + about: 关于本站 + context_menu: 原版/本站右键菜单 + +flink: + title: 友情链接 + friend_links: 友链 + latest_articles: 最新文章订阅 + about_me: 关于本人 + fishing: 🎣 钓鱼 + all_links: 全部友链 + random_visit: 随机访问 + apply_link: 申请友链 + recommend: 荐 + +console: + title: 中控台 + interaction: 互动 + music: 音乐 + music_desc: 灵魂的碰撞💥 + interests: 兴趣点 + interests_desc: 寻找你感兴趣的领域 + articles: 文章 + toggle_mode: 显示模式切换 + toggle_aside: 边栏显示控制 + toggle_barrage: 热评开关 + toggle_music: 音乐开关 + toggle_keyboard: 快捷键开关 + +reward: + title: 赞赏作者 + button: 打赏作者 + thanks: 感谢你赐予我前进的力量 + list: 赞赏者名单 + list_desc: 因为你们的支持让我意识到写文章的价值🙏 + +nav: + travelling: 随机前往一个开往项目网站 + random_post: 随机前往一个文章 + search: 搜索🔍 + toggle_menu: 切换 + +about: + title: 关于我 + hello: 你好,很高兴认识你👋 + im: 我叫 + data: 数据 + visit_stats: 访问统计 + stats_from: 统计信息来自 + enjoy_music_with: 跟 %s 一起欣赏更多音乐 + more_recommend: 更多推荐 + thanks: 致谢 + reward_list: 赞赏名单 + reward_thanks: 感谢因为有你们,让我更加有创作的动力。 + last_update: 最新更新时间: + charge_for_ta: 为TA充电 + total_people: 共 %s 人 + personality: 性格 + personality_img_alt: 人格 + selfie_alt: 自拍 + learn_more_at: 在 %s 了解更多关于 %s + stats: + today_visitors: 今日人数 + today_views: 今日访问 + yesterday_visitors: 昨日人数 + yesterday_views: 昨日访问 + month_views: 本月访问 + total_views: 总访问量 + fetch_failed: 统计数据获取失败 diff --git a/blog/themes/anzhiyu/languages/zh-TW.yml b/blog/themes/anzhiyu/languages/zh-TW.yml new file mode 100644 index 0000000..000db65 --- /dev/null +++ b/blog/themes/anzhiyu/languages/zh-TW.yml @@ -0,0 +1,216 @@ +footer: + framework: 框架 + theme: 主題 + back_to_top: 返回頂部 + friend_links: 友鏈 + refresh_friends: 換一批友情連結 + cc_license: CC協議 + +copy: + success: 複製成功 + error: 複製錯誤 + noSupport: 瀏覽器不支援 + +page: + articles: 文章總覽 + tag: 標籤 + category: 分類 + archives: 歸檔 + +card_post_count: 條評論 + +sticky: 置頂 +no_title: 無題 + +post: + created: 發表於 + updated: 更新於 + wordcount: 字數總計 + min2read: 閱讀時長 + min2read_unit: 分鐘 + new: 最新 + unread: 未讀 + page_pv: 閱讀量 + comments: 評論數 + copyright: + author: 文章作者 + link: 文章連結 + copyright_notice: 版權聲明 + copyright_content: '本部落格所有文章除特別聲明外,均採用 + %s 許可協議。轉載請註明來自 %s!' + recommend: 相關推薦 + edit: + github: 在 GitHub 上編輯 + yuque: 在 語雀 上編輯 + +search: + title: 搜尋 + load_data: 資料庫載入中 + algolia_search: + input_placeholder: 輸入關鍵字後按下回車查找 + hits_empty: "找不到您查詢的內容:${query}" + hits_stats: "找到 ${hits} 條結果,用時 ${time} 毫秒" + + local_search: + input_placeholder: 搜尋文章 + hits_empty: "找不到您查詢的內容:${query}" + +pagination: + prev: 上一篇 + next: 下一篇 + +comment: 評論 + +aside: + articles: 文章 + tags: 標籤 + categories: 分類 + card_announcement: 公告 + card_categories: 分類 + card_tags: 標籤 + card_archives: 歸檔 + card_recent_post: 最近发布 + card_webinfo: + headline: 網站資訊 + article_name: 文章數目 + runtime: + name: 已執行時間 + unit: 天 + last_push_date: + name: 最後更新時間 + site_wordcount: 本站總字數 + site_uv_name: 本站訪客數 + site_pv_name: 本站總訪問量 + more_button: 檢視更多 + card_newest_comments: + headline: 最新評論 + loading_text: 正在載入中... + error: 無法獲取評論,請確認相關配置是否正確 + zero: 沒有評論 + image: 圖片 + link: 連結 + code: 程式碼 + card_toc: 文章目錄 + display_mode: 顯示模式 + function: 功能 + +date_suffix: + just: 剛剛 + min: 分鐘前 + hour: 小時前 + day: 天前 + month: 個月前 + +donate: 打賞 +share: 分享 + +rightside: + readmode_title: 閱讀模式 + translate_title: 簡繁轉換 + night_mode_title: 淺色和深色模式轉換 + back_to_top: 回到頂部 + toc: 目錄 + scroll_to_comment: 直達評論 + setting: 設定 + aside: 單欄和雙欄切換 + chat: 聊天 + +copy_copyright: + author: 作者 + link: 連結 + source: 來源 + info: 著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。 + copySuccess: 複製成功,複製和轉載請標注本文地址 + +Snackbar: + chs_to_cht: 你已切換為繁體 + cht_to_chs: 你已切換為簡體 + day_to_night: 你已切換為深色模式 + night_to_day: 你已切換為淺色模式 + copy_equipment_name: 已複製裝備名稱 + +loading: 載入中... + +load_more: 載入更多 + +error404: 頁面沒有找到 + +shortcut: + title: 部落格快捷鍵 + close_shortcut: 關閉快捷鍵功能 + toggle_console: 打開/關閉中控台 + play_music: 播放/暫停音樂 + toggle_mode: 深色/淺色顯示模式 + search: 站內搜尋 + random: 隨機訪問 + home: 返回首頁 + fish_pond: 友鏈魚塘 + links: 友鏈頁面 + about: 關於本站 + context_menu: 原版/本站右鍵選單 + +flink: + title: 友情連結 + friend_links: 友鏈 + latest_articles: 最新文章訂閱 + about_me: 關於本人 + fishing: 🎣 釣魚 + all_links: 全部友鏈 + random_visit: 隨機訪問 + apply_link: 申請友鏈 + recommend: 薦 + +console: + title: 中控台 + interaction: 互動 + music: 音樂 + music_desc: 靈魂的碰撞💥 + interests: 興趣點 + interests_desc: 尋找你感興趣的領域 + articles: 文章 + toggle_mode: 顯示模式切換 + toggle_aside: 邊欄顯示控制 + toggle_barrage: 熱評開關 + toggle_music: 音樂開關 + toggle_keyboard: 快捷鍵開關 + +reward: + title: 讚賞作者 + button: 打賞作者 + thanks: 感謝你賜予我前進的力量 + list: 讚賞者名單 + list_desc: 因為你們的支持讓我意識到寫文章的價值🙏 + +nav: + travelling: 隨機前往一個開往項目網站 + random_post: 隨機前往一個文章 + search: 搜尋🔍 + toggle_menu: 切換 + +about: + title: 關於我 + hello: 你好,很高興認識你👋 + im: 我叫 + data: 數據 + visit_stats: 訪問統計 + stats_from: 統計資訊來自 + enjoy_music_with: 跟 %s 一起欣賞更多音樂 + more_recommend: 更多推薦 + thanks: 致謝 + reward_list: 讚賞名單 + reward_thanks: 感謝因為有你們,讓我更加有創作的動力。 + last_update: 最新更新時間: + charge_for_ta: 為TA充電 + total_people: 共 %s 人 + personality: 性格 + personality_img_alt: 人格 + selfie_alt: 自拍 + learn_more_at: 在 %s 了解更多關於 %s + stats: + today_visitors: 今日人數 + today_views: 今日訪問 + yesterday_visitors: 昨日人數 + yesterday_views: 昨日訪問 + month_views: 本月訪問 + total_views: 總訪問量 + fetch_failed: 統計數據獲取失敗 diff --git a/blog/themes/anzhiyu/layout/archive.pug b/blog/themes/anzhiyu/layout/archive.pug new file mode 100644 index 0000000..d00fc12 --- /dev/null +++ b/blog/themes/anzhiyu/layout/archive.pug @@ -0,0 +1,8 @@ +extends includes/layout.pug + +block content + include ./includes/mixins/article-sort.pug + #archive + .article-sort-title= `${_p('page.articles')} - ${getArchiveLength()}` + +articleSort(page.posts, page.current) + include includes/pagination.pug \ No newline at end of file diff --git a/blog/themes/anzhiyu/layout/category.pug b/blog/themes/anzhiyu/layout/category.pug new file mode 100644 index 0000000..7bf34da --- /dev/null +++ b/blog/themes/anzhiyu/layout/category.pug @@ -0,0 +1,23 @@ +extends includes/layout.pug + +block content + if theme.category_ui == 'index' + include ./includes/mixins/post-ui.pug + #recent-posts.recent-posts.category_ui + +postUI + include includes/pagination.pug + else + include ./includes/mixins/article-sort.pug + #category + #catalog-bar + i.anzhiyufont.anzhiyu-icon-shapes + #catalog-list + .catalog-list-item + a(href="/") 首页 + !=catalog_list("categories") + .category-bar-next#category-bar-next(onclick="anzhiyu.scrollCategoryBarToRight()") + i.anzhiyufont.anzhiyu-icon-angle-double-right + a.catalog-more(href="/categories/")!= '更多' + .article-sort-title= _p('page.category') + ' - ' + page.category + +articleSort(page.posts, page.current) + include includes/pagination.pug \ No newline at end of file diff --git a/blog/themes/anzhiyu/layout/includes/404.pug b/blog/themes/anzhiyu/layout/includes/404.pug new file mode 100644 index 0000000..b88af28 --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/404.pug @@ -0,0 +1,36 @@ +- let error_404_top_img = theme.error_404.background || theme.default_top_img +- let error_404_bg_img = `background-image: url('${url_for(error_404_top_img)}')` + +#body-wrap.error + include ./header/index.pug + .error-box + #error-wrap + .error-content + .error-img(style=error_404_bg_img) + .error-info + h1.error_title= '404' + .error_subtitle= theme.error_404.subtitle + a.button--animated(href=config.root) + i.anzhiyufont.anzhiyu-icon-rocket + = _p('回到主页') + + .aside-list + .aside-list-group + - let postLimit = theme.aside.card_recent_post.limit === 0 ? site.posts.length : theme.related_post.limit || 6 + - let sort = theme.aside.card_recent_post.sort === 'updated' ? 'updated' : 'date' + - site.posts.sort(sort, -1).limit(postLimit).each(function(article){ + - let link = article.link || article.path + - let title = article.title || _p('no_title') + - let no_cover = article.cover === false || !theme.cover.aside_enable ? 'no-cover' : '' + - let post_cover = article.cover + .aside-list-item(class=no_cover) + if post_cover && theme.cover.aside_enable + a.thumbnail(href=url_for(link) title=title) + img(src=url_for(post_cover) onerror=`this.onerror=null;this.src='${url_for(theme.error_img.post_page)}'` alt=title) + .content + a.title(href=url_for(link) title=title)= title + if theme.aside.card_recent_post.sort === 'updated' + time(datetime=date_xml(article.updated) title=_p('post.updated') + ' ' + full_date(article.updated)) #[=date(article.updated, config.date_format)] + else + time(datetime=date_xml(article.date) title=_p('post.created') + ' ' + full_date(article.date)) #[=date(article.date, config.date_format)] + - }) diff --git a/blog/themes/anzhiyu/layout/includes/additional-js.pug b/blog/themes/anzhiyu/layout/includes/additional-js.pug new file mode 100644 index 0000000..891df76 --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/additional-js.pug @@ -0,0 +1,132 @@ +div + script(src=url_for(theme.asset.utils)) + script(src=url_for(theme.asset.main)) + + if theme.translate.enable + script(src=url_for(theme.asset.translate)) + + if theme.medium_zoom + script(src=url_for(theme.asset.medium_zoom)) + else if theme.fancybox + script(src=url_for(theme.asset.fancybox)) + + if theme.instantpage + script(src=url_for(theme.asset.instantpage), type='module') + + if theme.lazyload.enable + script(src=url_for(theme.asset.lazyload)) + + if theme.snackbar.enable + script(src=url_for(theme.asset.snackbar)) + + if theme.pangu.enable + != partial("includes/third-party/pangu.pug", {}, { cache: true }) + if theme.asset.meting_api + script. + var meting_api = "!{theme.asset.meting_api}"; + + //- 深色模式粒子效果canvas + if theme.universe.enable + canvas(id="universe") + script(async src="https://npm.elemecdn.com/anzhiyu-theme-static@1.0.0/dark/dark.js") + + //- 控制台打印信息 + if theme.console.enable + != partial("includes/anzhiyu/log-js.pug", {}, { cache: true }) + + //- 随机文章 + script(async src="/anzhiyu/random.js") + + //- 页脚计时器 + if theme.footer.runtime.enable + != partial("includes/third-party/runtime/runtime-js.pug", {}, { cache: true }) + + //- search + if theme.algolia_search.enable + script(src=url_for(theme.asset.algolia_search)) + script(src=url_for(theme.asset.instantsearch)) + script(src=url_for(theme.asset.algolia_js)) + else if theme.local_search.enable + script(src=url_for(theme.asset.local_search)) + + //- colorthief + if theme.mainTone.mode === "colorthief" + script(src=url_for(theme.asset.colorthief)) + + .js-pjax + if theme.peoplecanvas.enable && is_home() + script. + if (typeof gsap === "object") { + getScript("!{url_for(theme.asset.people_js)}", {defer:true}) + } else { + getScript("!{url_for(theme.asset.gsap_js)}").then(()=>{ + getScript("!{url_for(theme.asset.people_js)}", {defer:true}) + }); + } + if needLoadCountJs + != partial("includes/third-party/card-post-count/index", {}, { cache: true }) + + if loadSubJs + include ./third-party/subtitle.pug + + include ./third-party/math/index.pug + + if commentsJsLoad + include ./third-party/comments/js.pug + + input(type="hidden" name="page-type" id="page-type" value=(page.type ? page.type : (is_post() ? "post" : (is_category() ? "categories" : "anzhiyu")))) + + //- 评论弹幕 + if theme.comment_barrage_config.enable && theme.comments.use == 'Twikoo' && page.comments + script(async src=url_for(theme.asset.comment_barrage_js)) + + != partial("includes/third-party/prismjs", {}, { cache: true }) + + if theme.aside.enable && theme.newest_comments.enable + if theme.pjax.enable + != partial("includes/third-party/newest-comments/index", {}, { cache: true }) + else if (!is_post() && page.aside !== false) + != partial("includes/third-party/newest-comments/index", {}, { cache: true }) + //- 气泡效果 + if theme.bubble.enable + script(async data-pjax src="https://npm.elemecdn.com/anzhiyu-theme-static@1.0.1/bubble/bubble.js") + if theme.visitorMail.enable + - const mail = theme.visitorMail.mail + script. + var visitorMail = "#{mail}"; + + //- 即刻依赖waterfall + script(async data-pjax src=url_for(theme.asset.waterfall)) + //- 文章二维码 + script(src='https://cdn.cbd.int/qrcodejs@1.0.0/qrcode.min.js') + //- 右键菜单 + if (theme.rightClickMenu && theme.rightClickMenu.enable) + script(src=url_for(theme.asset.right_click_menu_js)) + + //- iconfont依赖 + link(rel="stylesheet" href=url_for(theme.asset.ali_iconfont_css)) + if (theme.icons && theme.icons.ali_iconfont_js) + script(async src=url_for(theme.icons.ali_iconfont_js)) + + != fragment_cache('injectBottom', function(){return injectHtml(theme.inject.bottom)}) + + != partial("includes/third-party/effect", {}, { cache: true }) + + != partial("includes/third-party/chat/index", {}, { cache: true }) + + if theme.aplayerInject && theme.aplayerInject.enable + if theme.pjax.enable || theme.aplayerInject.per_page + include ./third-party/aplayer.pug + else if page.aplayer + include ./third-party/aplayer.pug + + if theme.pjax.enable + != partial("includes/third-party/pjax", {}, { cache: true }) + + if theme.busuanzi.site_uv || theme.busuanzi.site_pv || theme.busuanzi.page_pv + script(async data-pjax src= theme.asset.busuanzi || '//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js') + if theme.accesskey.enable + script(charset="UTF-8" src=url_for(theme.asset.accesskey_js)) + + if is_current("/") && theme.greetingBox.enable + #greetingBox diff --git a/blog/themes/anzhiyu/layout/includes/anzhiyu/ai-info.pug b/blog/themes/anzhiyu/layout/includes/anzhiyu/ai-info.pug new file mode 100644 index 0000000..749fb92 --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/anzhiyu/ai-info.pug @@ -0,0 +1,26 @@ +- let pageFillDescription = get_page_fill_description() +- let gptName = theme.post_head_ai_description.gptName +- let mode = theme.post_head_ai_description.mode +- let switchBtn = theme.post_head_ai_description.switchBtn +if (pageFillDescription && page.ai) + .post-ai-description + .ai-title + i.anzhiyufont.anzhiyu-icon-bilibili + .ai-title-text AI-摘要 + if (switchBtn) + #ai-Toggle 切换 + i.anzhiyufont.anzhiyu-icon-arrow-rotate-right + i.anzhiyufont.anzhiyu-icon-circle-dot(title="朗读摘要") + #ai-tag + if mode == "tianli" + = "Tianli GPT" + else + = gptName + " GPT" + .ai-explanation AI初始化中... + .ai-btn-box + .ai-btn-item 介绍自己 🙈 + .ai-btn-item 生成本文简介 👋 + .ai-btn-item 推荐相关文章 📖 + .ai-btn-item 前往主页 🏠 + .ai-btn-item#go-tianli-blog 前往爱发电购买 + script(data-pjax src=url_for(theme.asset.ai_abstract_js)) diff --git a/blog/themes/anzhiyu/layout/includes/anzhiyu/clock.pug b/blog/themes/anzhiyu/layout/includes/anzhiyu/clock.pug new file mode 100644 index 0000000..95add50 --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/anzhiyu/clock.pug @@ -0,0 +1,29 @@ +#he-plugin-simple +script. + var WIDGET = { + "CONFIG": { + "modules": "0124", + "background": "2", + "tmpColor": "FFFFFF", + "tmpSize": "16", + "cityColor": "FFFFFF", + "citySize": "16", + "aqiColor": "E8D87B", + "aqiSize": "16", + "weatherIconSize": "24", + "alertIconSize": "18", + "padding": "10px 10px 10px 10px", + "shadow": "0", + "language": "auto", + "borderRadius": "20", + "fixed": "true", + "vertical": "top", + "horizontal": "left", + "left": "20", + "top": "7.1", + "key": "df245676fb434a0691ead1c63341cd94" + } + } + +link(rel="stylesheet", href="https://widget.qweather.net/simple/static/css/he-simple.css?v=1.4.0") +script(src="https://widget.qweather.net/simple/static/js/he-simple.js?v=1.4.0") diff --git a/blog/themes/anzhiyu/layout/includes/anzhiyu/console.pug b/blog/themes/anzhiyu/layout/includes/anzhiyu/console.pug new file mode 100644 index 0000000..145b305 --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/anzhiyu/console.pug @@ -0,0 +1,47 @@ +#console + .console-card-group-reward + ul.reward-all.console-card + each item in theme.reward.QR_code + li.reward-item + a(href=url_for(item.link || item.img), target='_blank') + img.post-qr-code-img(alt=item.text, src=url_for(item.img)) + .post-qr-code-desc=item.text + .console-card-group + .console-card-group-left + !=partial('includes/widget/card_newest_comment', {}, {cache: true}) + .console-card-group-right + .console-card.tags + .card-content + if theme.nav_music.enable && theme.nav_music.console_widescreen_music + .author-content-item-tips=_p('console.music') + span.author-content-item-title=_p('console.music_desc') + else + .author-content-item-tips=_p('console.interests') + span.author-content-item-title=_p('console.interests_desc') + !=partial('includes/widget/card_console_tags', {}, {cache: true}) + .console-card.history + .item-headline + i.anzhiyufont.anzhiyu-icon-box-archiv + span=_p('console.articles') + !=partial('includes/widget/card_console_archives', {}, {cache: true}) + .button-group + if theme.darkmode.enable + .console-btn-item + a.darkmode_switchbutton(title=_p('console.toggle_mode'), href='javascript:void(0);') + i.anzhiyufont.anzhiyu-icon-moon + .console-btn-item#consoleHideAside(onclick='anzhiyu.hideAsideBtn()', title=_p('console.toggle_aside')) + a.asideSwitch + i.anzhiyufont.anzhiyu-icon-arrows-left-right + if theme.comment_barrage_config.enable + .console-btn-item.on#consoleCommentBarrage(onclick='anzhiyu.switchCommentBarrage()', title=_p('console.toggle_barrage')) + a.commentBarrage + i.anzhiyufont.anzhiyu-icon-message + if theme.nav_music.enable + .console-btn-item#consoleMusic(onclick='anzhiyu.musicToggle()', title=_p('console.toggle_music')) + a.music-switch + i.anzhiyufont.anzhiyu-icon-music + if theme.shortcutKey.enable + .console-btn-item#consoleKeyboard(onclick='anzhiyu.keyboardToggle()', title=_p('console.toggle_keyboard')) + a.keyboard-switch + i.anzhiyufont.anzhiyu-icon-keyboard + .console-mask(onclick='anzhiyu.hideConsole()', href='javascript:void(0);') diff --git a/blog/themes/anzhiyu/layout/includes/anzhiyu/log-js.pug b/blog/themes/anzhiyu/layout/includes/anzhiyu/log-js.pug new file mode 100644 index 0000000..63d5429 --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/anzhiyu/log-js.pug @@ -0,0 +1,78 @@ +- let author = config.author +- let launch_time = theme.footer.runtime.launch_time +- let since = theme.footer.owner.since +- let version = get_version("tags") +script. + // 消除控制台打印 + var HoldLog = console.log; + console.log = function () {}; + let now1 = new Date(); + queueMicrotask(() => { + const Log = function () { + HoldLog.apply(console, arguments); + }; //在恢复前输出日志 + const grt = new Date("#{launch_time}"); //此处修改你的建站时间或者网站上线时间 + now1.setTime(now1.getTime() + 250); + const days = (now1 - grt) / 1000 / 60 / 60 / 24; + const dnum = Math.floor(days); + const ascll = [ + `欢迎使用安知鱼!`, + `生活明朗, 万物可爱`, + ` + + █████╗ ███╗ ██╗███████╗██╗ ██╗██╗██╗ ██╗██╗ ██╗ + ██╔══██╗████╗ ██║╚══███╔╝██║ ██║██║╚██╗ ██╔╝██║ ██║ + ███████║██╔██╗ ██║ ███╔╝ ███████║██║ ╚████╔╝ ██║ ██║ + ██╔══██║██║╚██╗██║ ███╔╝ ██╔══██║██║ ╚██╔╝ ██║ ██║ + ██║ ██║██║ ╚████║███████╗██║ ██║██║ ██║ ╚██████╔╝ + ╚═╝ ╚═╝╚═╝ ╚═══╝╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝ + + `, + "已上线", + dnum, + "天", + "©#{since} By 安知鱼 V#{version}", + ]; + const ascll2 = [`NCC2-036`, `调用前置摄像头拍照成功,识别为【小笨蛋】.`, `Photo captured: `, `🤪`]; + + setTimeout( + Log.bind( + console, + `\n%c${ascll[0]} %c ${ascll[1]} %c ${ascll[2]} %c${ascll[3]}%c ${ascll[4]}%c ${ascll[5]}\n\n%c ${ascll[6]}\n`, + "color:#425AEF", + "", + "color:#425AEF", + "color:#425AEF", + "", + "color:#425AEF", + "" + ) + ); + setTimeout( + Log.bind( + console, + `%c ${ascll2[0]} %c ${ascll2[1]} %c \n${ascll2[2]} %c\n${ascll2[3]}\n`, + "color:white; background-color:#4fd953", + "", + "", + 'background:url("https://npm.elemecdn.com/anzhiyu-blog@1.1.6/img/post/common/tinggge.gif") no-repeat;font-size:450%' + ) + ); + + setTimeout(Log.bind(console, "%c WELCOME %c 你好,小笨蛋.", "color:white; background-color:#4f90d9", "")); + + setTimeout( + console.warn.bind( + console, + "%c ⚡ Powered by 安知鱼 %c 你正在访问 #{author} 的博客.", + "color:white; background-color:#f0ad4e", + "" + ) + ); + + setTimeout(Log.bind(console, "%c W23-12 %c 你已打开控制台.", "color:white; background-color:#4f90d9", "")); + + setTimeout( + console.warn.bind(console, "%c S013-782 %c 你现在正处于监控中.", "color:white; background-color:#d9534f", "") + ); + }); \ No newline at end of file diff --git a/blog/themes/anzhiyu/layout/includes/anzhiyu/rightmenu.pug b/blog/themes/anzhiyu/layout/includes/anzhiyu/rightmenu.pug new file mode 100644 index 0000000..48bcafe --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/anzhiyu/rightmenu.pug @@ -0,0 +1,82 @@ +- const { translate } = theme +#rightMenu + .rightMenu-group.rightMenu-small + .rightMenu-item#menu-backward + i.anzhiyufont.anzhiyu-icon-arrow-left + .rightMenu-item#menu-forward + i.anzhiyufont.anzhiyu-icon-arrow-right + .rightMenu-item#menu-refresh + i.anzhiyufont.anzhiyu-icon-arrow-rotate-right(style="font-size: 1rem;") + .rightMenu-item#menu-top + i.anzhiyufont.anzhiyu-icon-arrow-up + .rightMenu-group.rightMenu-line.rightMenuPlugin + .rightMenu-item#menu-copytext + i.anzhiyufont.anzhiyu-icon-copy + span 复制选中文本 + .rightMenu-item#menu-pastetext + i.anzhiyufont.anzhiyu-icon-paste + span 粘贴文本 + a.rightMenu-item#menu-commenttext + i.anzhiyufont.anzhiyu-icon-comment-medical + span 引用到评论 + .rightMenu-item#menu-newwindow + i.anzhiyufont.anzhiyu-icon-window-restore + span 新窗口打开 + .rightMenu-item#menu-copylink + i.anzhiyufont.anzhiyu-icon-link + span 复制链接地址 + .rightMenu-item#menu-copyimg + i.anzhiyufont.anzhiyu-icon-images + span 复制此图片 + .rightMenu-item#menu-downloadimg + i.anzhiyufont.anzhiyu-icon-download + span 下载此图片 + .rightMenu-item#menu-newwindowimg + i.anzhiyufont.anzhiyu-icon-window-restore + span 新窗口打开图片 + .rightMenu-item#menu-search + i.anzhiyufont.anzhiyu-icon-magnifying-glass + span 站内搜索 + .rightMenu-item#menu-searchBaidu + i.anzhiyufont.anzhiyu-icon-magnifying-glass + span 百度搜索 + .rightMenu-item#menu-music-toggle + i.anzhiyufont.anzhiyu-icon-play + span 播放音乐 + .rightMenu-item#menu-music-back + i.anzhiyufont.anzhiyu-icon-backward + span 切换到上一首 + .rightMenu-item#menu-music-forward + i.anzhiyufont.anzhiyu-icon-forward + span 切换到下一首 + - const nav_music_all_playlist = theme.nav_music.all_playlist + .rightMenu-item#menu-music-playlist(onclick=`window.open("${nav_music_all_playlist}", "_blank");`, style='display: none;') + i.anzhiyufont.anzhiyu-icon-radio + span 查看所有歌曲 + .rightMenu-item#menu-music-copyMusicName + i.anzhiyufont.anzhiyu-icon-copy + span 复制歌名 + .rightMenu-group.rightMenu-line.rightMenuOther + a.rightMenu-item.menu-link#menu-randomPost + i.anzhiyufont.anzhiyu-icon-shuffle + span 随便逛逛 + a.rightMenu-item.menu-link(href='/categories/') + i.anzhiyufont.anzhiyu-icon-cube + span 博客分类 + a.rightMenu-item.menu-link(href='/tags/') + i.anzhiyufont.anzhiyu-icon-tags + span 文章标签 + .rightMenu-group.rightMenu-line.rightMenuOther + a.rightMenu-item#menu-copy(href='javascript:void(0);') + i.anzhiyufont.anzhiyu-icon-copy + span 复制地址 + a.rightMenu-item#menu-commentBarrage(href='javascript:void(0);') + i.anzhiyufont.anzhiyu-icon-message + span.menu-commentBarrage-text 关闭热评 + a.rightMenu-item#menu-darkmode(href='javascript:void(0);') + i.anzhiyufont.anzhiyu-icon-circle-half-stroke + span.menu-darkmode-text 深色模式 + a.rightMenu-item#menu-translate(href='javascript:void(0);') + i.anzhiyufont.anzhiyu-icon-language + span=translate.rightMenuMsgDefault +#rightmenu-mask \ No newline at end of file diff --git a/blog/themes/anzhiyu/layout/includes/anzhiyu/tags-group-all.pug b/blog/themes/anzhiyu/layout/includes/anzhiyu/tags-group-all.pug new file mode 100644 index 0000000..f2d5e8a --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/anzhiyu/tags-group-all.pug @@ -0,0 +1,20 @@ +if site.data.creativity + #skills-tags-group-all + .tags-group-wrapper + each i in site.data.creativity + - const evenNum = i.creativity_list.filter((x, index) => index % 2 === 0); + - const oddNum = i.creativity_list.filter((x, index) => index % 2 === 1); + each item, index in i.creativity_list + if ((index+1 <= evenNum.length) && (index+1 <= oddNum.length)) + .tags-group-icon-pair + .tags-group-icon(style=`background: ${evenNum[index].color}`) + img.no-lightbox(title=evenNum[index].name, src=evenNum[index].icon, size="60px" alt=evenNum[index].name) + .tags-group-icon(style=`background: ${oddNum[index].color}`) + img.no-lightbox(title=oddNum[index].name, src=oddNum[index].icon, size="60px" alt=oddNum[index].name) + each item, index in i.creativity_list + if ((index+1 <= evenNum.length) && (index+1 <= oddNum.length)) + .tags-group-icon-pair + .tags-group-icon(style=`background: ${evenNum[index].color}`) + img.no-lightbox(title=evenNum[index].name, src=evenNum[index].icon, size="60px" alt=evenNum[index].name) + .tags-group-icon(style=`background: ${oddNum[index].color}`) + img.no-lightbox(title=oddNum[index].name, src=oddNum[index].icon, size="60px" alt=oddNum[index].name) \ No newline at end of file diff --git a/blog/themes/anzhiyu/layout/includes/bbTimeList.pug b/blog/themes/anzhiyu/layout/includes/bbTimeList.pug new file mode 100644 index 0000000..050653b --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/bbTimeList.pug @@ -0,0 +1,17 @@ +if site.data.essay + each i in site.data.essay + if i.home_essay + - let onclick_value = theme.pjax.enable ? `pjax.loadUrl("/essay/");` : ''; + - let href_value = theme.pjax.enable ? 'javascript:void(0);' : `/essay/`; + #bbTimeList.bbTimeList.container + i.anzhiyufont.anzhiyu-icon-jike.bber-logo.fontbold(onclick=onclick_value, title="即刻短文", href=href_value, aria-hidden="true") + #bbtalk.swiper-container.swiper-no-swiping.essay_bar_swiper_container(tabindex="-1") + #bber-talk.swiper-wrapper(onclick=onclick_value) + each i in site.data.essay + each item, index in i.essay_list + if index < 10 + - var contentText = item.image ? item.content + ' [图片]' : (item.video ? item.content + ' [视频]' : item.content) + a.li-style.swiper-slide(href=href_value)= contentText + a.bber-gotobb.anzhiyufont.anzhiyu-icon-circle-arrow-right( onclick=onclick_value, href=href_value, title="查看全文") + + script(src=url_for(theme.home_top.swiper.swiper_js)) diff --git a/blog/themes/anzhiyu/layout/includes/bili-banner/index.pug b/blog/themes/anzhiyu/layout/includes/bili-banner/index.pug new file mode 100644 index 0000000..8ade1ef --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/bili-banner/index.pug @@ -0,0 +1,2 @@ +//- 随机背景 +script(src=url_for("https://npm.elemecdn.com/anzhiyu-theme-static@1.0.0/biliBg/biliBg.js"), data-pjax) \ No newline at end of file diff --git a/blog/themes/anzhiyu/layout/includes/categoryGroup.pug b/blog/themes/anzhiyu/layout/includes/categoryGroup.pug new file mode 100644 index 0000000..263c042 --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/categoryGroup.pug @@ -0,0 +1,10 @@ +#categoryBar + #category-bar.category-bar + #catalog-bar + #catalog-list + .catalog-list-item(id='首页') + a(href="/") 首页 + !=catalog_list("categories") + .category-bar-next#category-bar-next(onclick="anzhiyu.scrollCategoryBarToRight()") + i.anzhiyufont.anzhiyu-icon-angle-double-right + a.catalog-more(href="/categories/")!= '更多' diff --git a/blog/themes/anzhiyu/layout/includes/footer.pug b/blog/themes/anzhiyu/layout/includes/footer.pug new file mode 100644 index 0000000..6f4145c --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/footer.pug @@ -0,0 +1,93 @@ +#footer-wrap + if theme.footer.socialBar.enable + - let centerImg = theme.footer.socialBar.centerImg ? theme.footer.socialBar.centerImg : theme.avatar.img + - let leftInfo = theme.footer.socialBar.left + - let rightInfo = theme.footer.socialBar.right + #footer_deal + each item, index in leftInfo + a.deal_link(href=url_for(item.link) title=item.title) + if (item.icon.startsWith("fa")) + i(class=`${item.icon}`) + else if (item.icon.startsWith("icon")) + svg.icon(aria-hidden="true") + use(xlink:href=`#`+ item.icon) + else if (item.icon.startsWith("anzhiyu")) + i.anzhiyufont(class=`${item.icon}`) + img.footer_mini_logo(title=_p('footer.back_to_top'), alt=_p('footer.back_to_top') onclick="anzhiyu.scrollToDest(0, 500)", src=centerImg, size="50px") + each item, index in rightInfo + a.deal_link(href=url_for(item.link) title=item.title) + if (item.icon.startsWith("fa")) + i(class=`${item.icon}`) + else if (item.icon.startsWith("icon")) + svg.icon(aria-hidden="true") + use(xlink:href=`#`+ item.icon) + else if (item.icon.startsWith("anzhiyu")) + i.anzhiyufont(class=`${item.icon}`) + + if theme.footer.owner.enable && !theme.footer.footerBar.enable + - var nowYear = new Date().getFullYear() + if theme.footer.owner.since && theme.footer.owner.since != nowYear + .copyright!= `©${theme.footer.owner.since} - ${nowYear} By ${config.author}` + else + .copyright!= `©${nowYear} By ${config.author}` + + - let work_img = theme.footer.runtime.work_img + - let work_description = theme.footer.runtime.work_description + if theme.footer.runtime.enable + #workboard + if work_img != null + img(src=`${work_img}`, alt=`${work_description}`, title=`${work_description}`, class="workSituationImg boardsign") + #runtimeTextTip + if theme.footer.custom_text + .footer_custom_text!=`${theme.footer.custom_text}` + + if theme.footer.list.enable + - let projectList = theme.footer.list.project + #anzhiyu-footer + each item, index in projectList + .footer-group + .footer-title=item.title + .footer-links + each iten, indey in item.links + a.footer-item(title=iten.title href=url_for(iten.link))=iten.title + if theme.footer.list.randomFriends > 0 + .footer-group + .footer-title-group + .footer-title=_p('footer.friend_links') + a.random-friends-btn#footer-random-friends-btn(href="javascript:addFriendLinksInFooter();" title=_p('footer.refresh_friends')) + i.anzhiyufont.anzhiyu-icon-arrow-rotate-right + .footer-links#friend-links-in-footer + + if theme.footer.bdageitem.enable + p#ghbdages + each item in theme.footer.bdageitem.list + a.github-badge(target='_blank' href=item.link style='margin-inline:5px' data-title=item.message title=item.message) + img(src=item.shields alt=item.message) + +if theme.footer.footerBar && theme.footer.footerBar.enable + #footer-bar + .footer-bar-links + .footer-bar-left + #footer-bar-tips + if theme.footer.owner.enable + - var nowYear = new Date().getFullYear() + - let authorLink = theme.footer.footerBar.authorLink ? theme.footer.footerBar.authorLink : config.url + if theme.footer.owner.since && theme.footer.owner.since != nowYear + .copyright!= `©${theme.footer.owner.since} - ${nowYear} By ` + a.footer-bar-link(href=url_for(authorLink) title=config.author target="_blank")=config.author + else + .copyright!= `©${nowYear} By ` + a.footer-bar-link(href=url_for(authorLink) title=config.author target="_blank")=config.author + #footer-type-tips + if theme.footer.footerBar && theme.footer.footerBar.subTitle && theme.footer.footerBar.subTitle.enable + .js-pjax + include ./third-party/footerBarSubtitle.pug + .footer-bar-right + each item in theme.footer.footerBar.linkList + a.footer-bar-link(href=url_for(item.link) title=item.text)=item.text + if theme.footer.footerBar.cc.enable + a.footer-bar-link.cc(href=url_for(theme.footer.footerBar.cc.link) title=_p('footer.cc_license')) + i.anzhiyufont.anzhiyu-icon-copyright-line + i.anzhiyufont.anzhiyu-icon-creative-commons-by-line + i.anzhiyufont.anzhiyu-icon-creative-commons-nc-line + i.anzhiyufont.anzhiyu-icon-creative-commons-nd-line diff --git a/blog/themes/anzhiyu/layout/includes/head.pug b/blog/themes/anzhiyu/layout/includes/head.pug new file mode 100644 index 0000000..02e4793 --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/head.pug @@ -0,0 +1,92 @@ +- var pageTitle +- is_archive() ? page.title = findArchivesTitle(page, theme.menu, date) : '' +- if (is_tag()) pageTitle = _p('page.tag') + ': ' + page.tag +- else if (is_category()) pageTitle = _p('page.category') + ': ' + page.category +- else if (is_current('/404.html', [strict])) pageTitle = _p('error404') +- else pageTitle = page.title || config.title || '' + +- var isSubtitle = config.subtitle ? ' - ' + config.subtitle : '' +- var tabTitle = is_home() || !pageTitle ? config.title + isSubtitle : pageTitle + ' | ' + config.title + +- var pageKeywords +- if (page.keywords) pageKeywords = Array.isArray(page.keywords) ? (page.keywords).join(',') : ([]).join(',') || page.keywords +- else if (page.tags && page.tags.length) pageKeywords = page.tags.data.map(function(tag) {return tag.name;}).join(',') +- else pageKeywords = Array.isArray(config.keywords) ? (config.keywords).join(','): ([]).join(',') || config.keywords +- var pageAuthor = config.email ? config.author + ',' + config.email : config.author +- var pageCopyright = config.copyright || config.author +- var themeColorLight = theme.theme_color && theme.theme_color.enable && theme.theme_color.meta_theme_color_light || '#ffffff' +- var themeColorDark = theme.theme_color && theme.theme_color.enable && theme.theme_color.meta_theme_color_dark || '#0d0d0d' +- var themeColor = theme.display_mode === 'dark' ? themeColorDark : themeColorLight + +meta(charset='UTF-8') +meta(http-equiv="X-UA-Compatible" content="IE=edge") +meta(name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no") +title= tabTitle +if pageKeywords + meta(name="keywords" content=pageKeywords) +meta(name="author" content=pageAuthor) +meta(name="copyright" content=pageCopyright) +meta(name ="format-detection" content="telephone=no") +meta(name="theme-color" content=themeColor) +meta(name="mobile-web-app-capable", content="yes") +meta(name="apple-touch-fullscreen", content="yes") +meta(name="apple-mobile-web-app-title", content=pageTitle) +meta(name="application-name", content=pageTitle) +meta(name="apple-mobile-web-app-capable", content="yes") +meta(name="apple-mobile-web-app-status-bar-style", content=themeColor) + + +//- Open_Graph +include ./head/Open_Graph.pug + +!=favicon_tag(theme.favicon || config.favicon) +link(rel="canonical" href=urlNoIndex()) + +//- 預解析 +!=partial('includes/head/preconnect', {}, {cache: true}) + +//- 網站驗證 +!=partial('includes/head/site_verification', {}, {cache: true}) + +//- PWA +if (theme.pwa && theme.pwa.enable) + !=partial('includes/head/pwa', {}, {cache: true}) + + +//- animation依赖 +if (theme.icons && theme.icons.fontawesome_animation_css) + link(rel="stylesheet", href=url_for(theme.icons.fontawesome_animation_css)) + +//- main css +link(rel='stylesheet', href=url_for(theme.asset.main_css)) +if (theme.icons && theme.icons.fontawesome) + link(rel='stylesheet', href=url_for(theme.asset.fontawesome) media="print" onload="this.media='all'") + +if (theme.snackbar && theme.snackbar.enable) + link(rel='stylesheet', href=url_for(theme.asset.snackbar_css) media="print" onload="this.media='all'") + +if theme.fancybox + link(rel='stylesheet' href=url_for(theme.asset.fancybox_css) media="print" onload="this.media='all'") + +if site.data.essay || theme.home_top.swiper.enable + link(rel='stylesheet' href=url_for(theme.home_top.swiper.swiper_css) media="print" onload="this.media='all'") + +//- google_adsense +!=partial('includes/head/google_adsense', {}, {cache: true}) + +//- analytics +!=partial('includes/head/analytics', {}, {cache: true}) + +//- font +if theme.blog_title_font && theme.blog_title_font.font_link + link(rel='stylesheet' href=url_for(theme.blog_title_font.font_link) media="print" onload="this.media='all'") + +//- global config +!=partial('includes/head/config', {}, {cache: true}) + +include ./head/config_site.pug +include ./head/noscript.pug + +!=fragment_cache('injectHeadJs', function(){return inject_head_js()}) + +!=fragment_cache('injectHead', function(){return injectHtml(theme.inject.head)}) \ No newline at end of file diff --git a/blog/themes/anzhiyu/layout/includes/head/Open_Graph.pug b/blog/themes/anzhiyu/layout/includes/head/Open_Graph.pug new file mode 100644 index 0000000..74d8ad2 --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/head/Open_Graph.pug @@ -0,0 +1,18 @@ +if theme.Open_Graph_meta + - let contentType = is_post() ? 'article' : 'website' + - let metaImage = (page.cover || theme.avatar.img) ? full_url_for(page.cover || theme.avatar.img) : '' + + meta(property="og:type", content=contentType) + meta(property="og:title", content=pageTitle) + meta(property="og:url", content=theme.post_copyright.decode ? decodeURI(url) : url) + meta(property="og:site_name", content=config.title) + meta(property="og:description", content=page_description()) + meta(property="og:locale", content=config.language) + meta(property="og:image", content=metaImage) + meta(property="article:author" content=config.author) + meta(property="article:tag" content=config.keywords) + meta(name="twitter:card", content="summary") + meta(name="twitter:image", content=metaImage) + +meta(name="description" content=page_description()) + diff --git a/blog/themes/anzhiyu/layout/includes/head/analytics.pug b/blog/themes/anzhiyu/layout/includes/head/analytics.pug new file mode 100644 index 0000000..6452528 --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/head/analytics.pug @@ -0,0 +1,31 @@ +if theme.baidu_analytics + script. + var _hmt = _hmt || []; + (function() { + var hm = document.createElement("script"); + hm.src = "https://hm.baidu.com/hm.js?!{theme.baidu_analytics}"; + var s = document.getElementsByTagName("script")[0]; + s.parentNode.insertBefore(hm, s); + })(); + +if theme.google_analytics + script(async src=`https://www.googletagmanager.com/gtag/js?id=${theme.google_analytics}`) + script. + window.dataLayer = window.dataLayer || []; + function gtag(){dataLayer.push(arguments);} + gtag('js', new Date()); + gtag('config', '!{theme.google_analytics}'); + +if theme.cnzz_analytics + script(async data-pjax src=`https://s4.cnzz.com/z_stat.php?id=${theme.cnzz_analytics}&web_id=${theme.cnzz_analytics}`) + +if theme.cloudflare_analytics + script(defer data-pjax src='https://static.cloudflareinsights.com/beacon.min.js' data-cf-beacon=`{"token": "${theme.cloudflare_analytics}"}`) + +if theme.microsoft_clarity + script. + (function(c,l,a,r,i,t,y){ + c[a]=c[a]||function(){(c[a].q=c[a].q||[]).push(arguments)}; + t=l.createElement(r);t.async=1;t.src="https://www.clarity.ms/tag/"+i; + y=l.getElementsByTagName(r)[0];y.parentNode.insertBefore(t,y); + })(window, document, "clarity", "script", "!{theme.microsoft_clarity}"); \ No newline at end of file diff --git a/blog/themes/anzhiyu/layout/includes/head/config.pug b/blog/themes/anzhiyu/layout/includes/head/config.pug new file mode 100644 index 0000000..f154e4d --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/head/config.pug @@ -0,0 +1,223 @@ +- + let algolia = 'undefined'; + let env = process.env; + if (theme.algolia_search.enable) { + algolia = JSON.stringify({ + appId: env.ALGOLIA_APP_ID || config.algolia.appId || config.algolia.applicationID, + apiKey: env.ALGOLIA_API_KEY || config.algolia.apiKey, + indexName: env.ALGOLIA_INDEX_NAME || config.algolia.indexName, + hits: theme.algolia_search.hits, + // search languages + languages: { + input_placeholder: _p("search.algolia_search.input_placeholder"), + hits_empty: _p("search.algolia_search.hits_empty"), + hits_stats: _p("search.algolia_search.hits_stats"), + } + }) + } + + let localSearch = 'undefined'; + if (theme.local_search && theme.local_search.enable) { + localSearch = JSON.stringify({ + path: theme.local_search.CDN ? theme.local_search.CDN : config.root + config.search.path, + preload: theme.local_search.preload, + languages: { + // search languages + hits_empty: _p("search.local_search.hits_empty"), + } + }) + } + + let translate = 'undefined'; + if (theme.translate && theme.translate.enable){ + translate = JSON.stringify({ + defaultEncoding: theme.translate.defaultEncoding, + translateDelay: theme.translate.translateDelay, + msgToTraditionalChinese: theme.translate.msgToTraditionalChinese, + msgToSimplifiedChinese: theme.translate.msgToSimplifiedChinese, + rightMenuMsgToTraditionalChinese: theme.translate.rightMenuMsgToTraditionalChinese, + rightMenuMsgToSimplifiedChinese: theme.translate.rightMenuMsgToSimplifiedChinese + }) + } + + let copyright = 'undefined'; + if (theme.copy.enable){ + copyright = JSON.stringify({ + copy: theme.copy.enable, + copyrightEbable: theme.copy.copyright.enable, + limitCount: theme.copy.copyright.limit_count, + languages: { + author: _p("copy_copyright.author") + ': ' + config.author, + link: _p("copy_copyright.link") + ': ', + source: _p("copy_copyright.source") + ': ' + config.title, + info: _p("copy_copyright.info"), + copySuccess: _p("copy_copyright.copySuccess") + } + }) + } + + let Snackbar = 'undefined'; + if (theme.snackbar && theme.snackbar.enable) { + Snackbar = JSON.stringify({ + chs_to_cht: _p("Snackbar.chs_to_cht"), + cht_to_chs: _p("Snackbar.cht_to_chs"), + day_to_night: _p("Snackbar.day_to_night"), + night_to_day: _p("Snackbar.night_to_day"), + bgLight: theme.snackbar.bg_light, + bgDark: theme.snackbar.bg_dark, + position: theme.snackbar.position, + }) + } + + let noticeOutdate = 'undefined'; + if (theme.noticeOutdate && theme.noticeOutdate.enable) { + noticeOutdate = JSON.stringify({ + limitDay: theme.noticeOutdate.limit_day, + position: theme.noticeOutdate.position, + messagePrev: theme.noticeOutdate.message_prev, + messageNext: theme.noticeOutdate.message_next, + }) + } + + let highlight = 'undefined'; + let syntaxHighlighter = config.syntax_highlighter; + let highlightEnable = syntaxHighlighter ? ['highlight.js', 'prismjs'].includes(syntaxHighlighter) : (config.highlight.enable || config.prismjs.enable); + if (highlightEnable) { + highlight = JSON.stringify({ + plugin: syntaxHighlighter ? syntaxHighlighter : config.highlight.enable ? 'highlight.js' : 'prismjs', + highlightCopy: theme.highlight_copy, + highlightLang: theme.highlight_lang, + highlightHeightLimit: theme.highlight_height_limit + }) + } + + let friends_vue_info = 'undefined' + if (theme.friends_vue && theme.friends_vue.enable) { + friends_vue_info = JSON.stringify({ + apiurl: theme.friends_vue.apiurl + }) + } + + let mainTone = 'undefined' + if (theme.mainTone && theme.mainTone.enable) { + mainTone = JSON.stringify({ + mode: theme.mainTone.mode, + api: theme.mainTone.api, + cover_change: theme.mainTone.cover_change, + }) + } + + let authorStatus = 'undefined' + if (theme.author_status && theme.author_status.enable) { + authorStatus = JSON.stringify({ + skills: theme.author_status.skills + }) + } + + let preloader = 'undefined' + if (theme.preloader && theme.preloader.enable) { + preloader = JSON.stringify({ + source: theme.preloader.source + }) + } + + let commentBarrageConfig = 'undefined' + if (theme.comment_barrage_config && theme.comment_barrage_config.enable) { + commentBarrageConfig = JSON.stringify(theme.comment_barrage_config) + } + + let greetingBox = 'undefined' + if (theme.greetingBox && theme.greetingBox.enable) { + greetingBox = JSON.stringify(theme.greetingBox) + } + + let LA51 = 'undefined' + if (theme.LA && theme.LA.enable) { + LA51 = JSON.stringify(theme.LA) + } + + let shortcutKey = 'undefined' + if (theme.shortcutKey && theme.shortcutKey.enable) { + shortcutKey = JSON.stringify(theme.shortcutKey) + } + + let diytitle = 'undefined' + if (theme.diytitle && theme.diytitle.enable) { + diytitle = JSON.stringify(theme.diytitle) + } + + let postHeadAiDescription = 'undefined' + if (theme.post_head_ai_description && theme.post_head_ai_description.enable) { + postHeadAiDescription = JSON.stringify(theme.post_head_ai_description) + } + + let linkPageTop = 'undefined' + if (theme.linkPageTop && theme.linkPageTop.enable) { + linkPageTop = JSON.stringify(theme.linkPageTop) + } + + let peoplecanvas = 'undefined' + if (theme.peoplecanvas && theme.peoplecanvas.enable) { + peoplecanvas = JSON.stringify(theme.peoplecanvas) + } + + let music_page_default = 'undefined' + if (theme.music_page_default) { + music_page_default = JSON.stringify(theme.music_page_default) + } + +script. + const GLOBAL_CONFIG = { + linkPageTop: !{linkPageTop}, + peoplecanvas: !{peoplecanvas}, + postHeadAiDescription: !{postHeadAiDescription}, + diytitle: !{diytitle}, + LA51: !{LA51}, + greetingBox: !{greetingBox}, + twikooEnvId: '!{theme.twikoo.envId}', + commentBarrageConfig:!{commentBarrageConfig}, + music_page_default: !{music_page_default}, + root: '!{config.root}', + preloader: !{preloader}, + friends_vue_info: !{friends_vue_info}, + navMusic: !{theme.nav_music.enable}, + mainTone: !{mainTone}, + authorStatus: !{authorStatus}, + algolia: !{algolia}, + localSearch: !{localSearch}, + translate: !{translate}, + noticeOutdate: !{noticeOutdate}, + highlight: !{highlight}, + copy: { + success: '!{_p("copy.success")}', + error: '!{_p("copy.error")}', + noSupport: '!{_p("copy.noSupport")}' + }, + relativeDate: { + homepage: !{theme.post_meta.page.date_format === 'relative'}, + simplehomepage: !{theme.post_meta.page.date_format === 'simple'}, + post: !{theme.post_meta.post.date_format === 'relative'} + }, + runtime: '!{theme.runtimeshow.enable ? _p("aside.card_webinfo.runtime.unit") : ""}', + date_suffix: { + just: '!{_p("date_suffix.just")}', + min: '!{_p("date_suffix.min")}', + hour: '!{_p("date_suffix.hour")}', + day: '!{_p("date_suffix.day")}', + month: '!{_p("date_suffix.month")}' + }, + copyright: !{copyright}, + lightbox: '!{ theme.medium_zoom ? "mediumZoom" : (theme.fancybox ? "fancybox" : "null" )}', + Snackbar: !{Snackbar}, + source: { + justifiedGallery: { + js: '!{url_for(theme.asset.flickr_justified_gallery_js)}', + css: '!{url_for(theme.asset.flickr_justified_gallery_css)}' + } + }, + isPhotoFigcaption: !{theme.photofigcaption}, + islazyload: !{theme.lazyload.enable}, + isAnchor: !{theme.anchor}, + shortcutKey: !{shortcutKey}, + autoDarkmode: !{theme.darkmode.enable && theme.darkmode.autoChangeMode === 1} + } diff --git a/blog/themes/anzhiyu/layout/includes/head/config_site.pug b/blog/themes/anzhiyu/layout/includes/head/config_site.pug new file mode 100644 index 0000000..f2b6bc3 --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/head/config_site.pug @@ -0,0 +1,38 @@ +- + const escapeQuote = (str) => str ? String(str).replace(/\\/g, '\\\\').replace(/'/g, "\\'").replace(/"/g, '\\"') : '' + const titleVal = escapeQuote(pageTitle) + const configTitleVal = escapeQuote(config.title) + const postAIVal = escapeQuote(page.ai) + const pageFillDescriptionVal = escapeQuote(get_page_fill_description()) + + let isHighlightShrink + if (theme.highlight_shrink == 'none') isHighlightShrink = 'undefined' + else if (page.highlight_shrink === true || page.highlight_shrink === false) isHighlightShrink = page.highlight_shrink + else isHighlightShrink = theme.highlight_shrink + + var showToc = false + if (theme.aside.enable && page.aside !== false) { + let tocEnable = false + if (is_post()) { + if (theme.toc.post) tocEnable = true + } else if (is_page()) { + if (theme.toc.page) tocEnable = true + } + const pageToc = page.toc === true || page.toc === false ? page.toc : tocEnable + showToc = pageToc && (toc(page.content) !== '' || page.encrypt == true ) + } +- + +script#config-diff. + var GLOBAL_CONFIG_SITE = { + configTitle: '!{configTitleVal}', + title: '!{titleVal}', + postAI: '!{postAIVal}', + pageFillDescription: '!{pageFillDescriptionVal}', + isPost: !{is_post()}, + isHome: !{is_home()}, + isHighlightShrink: !{isHighlightShrink}, + isToc: !{showToc}, + postUpdate: '!{full_date(page.updated)}', + postMainColor: '!{page.main_color}', + } diff --git a/blog/themes/anzhiyu/layout/includes/head/google_adsense.pug b/blog/themes/anzhiyu/layout/includes/head/google_adsense.pug new file mode 100644 index 0000000..3ef1af9 --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/head/google_adsense.pug @@ -0,0 +1,9 @@ +if (theme.google_adsense && theme.google_adsense.enable) + script(async src=theme.google_adsense.js) + + if theme.google_adsense.auto_ads + script. + (adsbygoogle = window.adsbygoogle || []).push({ + google_ad_client: '!{theme.google_adsense.client}', + enable_page_level_ads: '!{theme.google_adsense.enable_page_level_ads}' + }); \ No newline at end of file diff --git a/blog/themes/anzhiyu/layout/includes/head/noscript.pug b/blog/themes/anzhiyu/layout/includes/head/noscript.pug new file mode 100644 index 0000000..cc3befa --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/head/noscript.pug @@ -0,0 +1,14 @@ +noscript. + \ No newline at end of file diff --git a/blog/themes/anzhiyu/layout/includes/head/preconnect.pug b/blog/themes/anzhiyu/layout/includes/head/preconnect.pug new file mode 100644 index 0000000..4ab524f --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/head/preconnect.pug @@ -0,0 +1,39 @@ +- + const { internal_provider, third_party_provider, custom_format } = theme.CDN + const providers = { + 'jsdelivr': '//cdn.jsdelivr.net', + 'cdnjs': '//cdnjs.cloudflare.com', + 'unpkg': '//unpkg.com', + 'elemecdn': '//npm.elemecdn.com', + 'onmicrosoft': '//npm.onmicrosoft.cn', + 'cbd': '//cdn.cbd.int', + 'anheyu': '//cdn.anheyu.com', + 'custom': custom_format && custom_format.match(/^((https?:)?(\/\/[^/]+)|([^/]+))(\/|$)/)[1] + } +- + +if internal_provider === third_party_provider && internal_provider !== 'local' + link(rel="preconnect" href=providers[internal_provider]) +else + if internal_provider !== 'local' + link(rel="preconnect" href=providers[internal_provider]) + if third_party_provider !== 'local' + link(rel="preconnect" href=providers[third_party_provider]) + +if theme.google_analytics + link(rel="preconnect" href="//www.google-analytics.com" crossorigin='') + +if theme.baidu_analytics + link(rel="preconnect" href="//hm.baidu.com") + +if theme.cloudflare_analytics + link(rel="preconnect" href="//static.cloudflareinsights.com") + +if theme.microsoft_clarity + link(rel="preconnect" href="//www.clarity.ms") + +if theme.blog_title_font && theme.blog_title_font.font_link && theme.blog_title_font.font_link.indexOf('//fonts.googleapis.com') != -1 + link(rel="preconnect" href="//fonts.googleapis.com" crossorigin='') + +if !theme.asset.busuanzi && (theme.busuanzi.site_uv || theme.busuanzi.site_pv || theme.busuanzi.page_pv) + link(rel="preconnect" href="//busuanzi.ibruce.info") \ No newline at end of file diff --git a/blog/themes/anzhiyu/layout/includes/head/pwa.pug b/blog/themes/anzhiyu/layout/includes/head/pwa.pug new file mode 100644 index 0000000..f03efa3 --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/head/pwa.pug @@ -0,0 +1,59 @@ +link(rel="manifest" href=url_for(theme.pwa.manifest)) +if(theme.pwa.theme_color) + meta(name="msapplication-TileColor" content=theme.pwa.theme_color) +if(theme.pwa.mask_icon) + link(rel="mask-icon" href=url_for(theme.pwa.mask_icon) color="#5bbad5") + +if(theme.pwa.apple_touch_icon) + link(rel="apple-touch-icon" sizes="180x180" href=url_for(theme.pwa.apple_touch_icon)) + link(rel="apple-touch-icon-precomposed", sizes="180x180", href=url_for(theme.pwa.apple_touch_icon)) +if(theme.pwa.favicon_32_32) + link(rel="icon" type="image/png" sizes="32x32" href=url_for(theme.pwa.favicon_32_32)) +if(theme.pwa.favicon_16_16) + link(rel="icon" type="image/png" sizes="16x16" href=url_for(theme.pwa.favicon_16_16)) +if(theme.pwa.bookmark_icon) + link(rel="bookmark", href=url_for(theme.pwa.bookmark_icon)) + +if(theme.pwa.startup_image_enable) + link(rel="apple-touch-startup-image", href="/img/siteicon/apple-splash-2048-2732.jpg", media="(device-width: 1024px) and (device-height: 1366px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)") + link(rel="apple-touch-startup-image", href="/img/siteicon/apple-splash-2732-2048.jpg", media="(device-width: 1024px) and (device-height: 1366px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)") + link(rel="apple-touch-startup-image", href="/img/siteicon/apple-splash-1668-2388.jpg", media="(device-width: 834px) and (device-height: 1194px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)") + link(rel="apple-touch-startup-image", href="/img/siteicon/apple-splash-2388-1668.jpg", media="(device-width: 834px) and (device-height: 1194px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)") + link(rel="apple-touch-startup-image", href="/img/siteicon/apple-splash-1536-2048.jpg", media="(device-width: 768px) and (device-height: 1024px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)") + link(rel="apple-touch-startup-image", href="/img/siteicon/apple-splash-2048-1536.jpg", media="(device-width: 768px) and (device-height: 1024px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)") + link(rel="apple-touch-startup-image", href="/img/siteicon/apple-splash-1668-2224.jpg", media="(device-width: 834px) and (device-height: 1112px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)") + link(rel="apple-touch-startup-image", href="/img/siteicon/apple-splash-2224-1668.jpg", media="(device-width: 834px) and (device-height: 1112px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)") + link(rel="apple-touch-startup-image", href="/img/siteicon/apple-splash-1620-2160.jpg", media="(device-width: 810px) and (device-height: 1080px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)") + link(rel="apple-touch-startup-image", href="/img/siteicon/apple-splash-2160-1620.jpg", media="(device-width: 810px) and (device-height: 1080px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)") + link(rel="apple-touch-startup-image", href="/img/siteicon/apple-splash-1290-2796.jpg", media="(device-width: 430px) and (device-height: 932px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)") + link(rel="apple-touch-startup-image", href="/img/siteicon/apple-splash-2796-1290.jpg", media="(device-width: 430px) and (device-height: 932px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)") + link(rel="apple-touch-startup-image", href="/img/siteicon/apple-splash-1179-2556.jpg", media="(device-width: 393px) and (device-height: 852px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)") + link(rel="apple-touch-startup-image", href="/img/siteicon/apple-splash-2556-1179.jpg", media="(device-width: 393px) and (device-height: 852px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)") + link(rel="apple-touch-startup-image", href="/img/siteicon/apple-splash-1284-2778.jpg", media="(device-width: 428px) and (device-height: 926px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)") + link(rel="apple-touch-startup-image", href="/img/siteicon/apple-splash-2778-1284.jpg", media="(device-width: 428px) and (device-height: 926px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)") + link(rel="apple-touch-startup-image", href="/img/siteicon/apple-splash-1170-2532.jpg", media="(device-width: 390px) and (device-height: 844px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)") + link(rel="apple-touch-startup-image", href="/img/siteicon/apple-splash-2532-1170.jpg", media="(device-width: 390px) and (device-height: 844px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)") + link(rel="apple-touch-startup-image", href="/img/siteicon/apple-splash-1125-2436.jpg", media="(device-width: 375px) and (device-height: 812px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)") + link(rel="apple-touch-startup-image", href="/img/siteicon/apple-splash-2436-1125.jpg", media="(device-width: 375px) and (device-height: 812px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)") + link(rel="apple-touch-startup-image", href="/img/siteicon/apple-splash-1242-2688.jpg", media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)") + link(rel="apple-touch-startup-image", href="/img/siteicon/apple-splash-2688-1242.jpg", media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)") + link(rel="apple-touch-startup-image", href="/img/siteicon/apple-splash-828-1792.jpg", media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)") + link(rel="apple-touch-startup-image", href="/img/siteicon/apple-splash-1792-828.jpg", media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)") + link(rel="apple-touch-startup-image", href="/img/siteicon/apple-splash-1242-2208.jpg", media="(device-width: 414px) and (device-height: 736px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)") + link(rel="apple-touch-startup-image", href="/img/siteicon/apple-splash-2208-1242.jpg", media="(device-width: 414px) and (device-height: 736px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)") + link(rel="apple-touch-startup-image", href="/img/siteicon/apple-splash-750-1334.jpg", media="(device-width: 375px) and (device-height: 667px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)") + link(rel="apple-touch-startup-image", href="/img/siteicon/apple-splash-1334-750.jpg", media="(device-width: 375px) and (device-height: 667px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)") + link(rel="apple-touch-startup-image", href="/img/siteicon/apple-splash-640-1136.jpg", media="(device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)") + link(rel="apple-touch-startup-image", href="/img/siteicon/apple-splash-1136-640.jpg", media="(device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)") + +//- script. +//- if ('serviceWorker' in navigator) { +//- if (navigator.serviceWorker.controller) { +//- navigator.serviceWorker.addEventListener('controllerchange', function() { +//- location.reload() +//- }) +//- } +//- window.addEventListener('load', function() { +//- navigator.serviceWorker.register('/service-worker.js') +//- }) +//- } \ No newline at end of file diff --git a/blog/themes/anzhiyu/layout/includes/head/site_verification.pug b/blog/themes/anzhiyu/layout/includes/head/site_verification.pug new file mode 100644 index 0000000..8947644 --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/head/site_verification.pug @@ -0,0 +1,3 @@ +if theme.site_verification + each item in theme.site_verification + meta(name=item.name content=item.content) \ No newline at end of file diff --git a/blog/themes/anzhiyu/layout/includes/header/index.pug b/blog/themes/anzhiyu/layout/includes/header/index.pug new file mode 100644 index 0000000..9fd6b9f --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/header/index.pug @@ -0,0 +1,59 @@ +if !theme.disable_top_img && page.top_img !== false + if is_post() + - var top_img = page.top_img || page.cover || page.randomcover + else if is_page() + - var top_img = page.top_img || theme.default_top_img + else if is_home() + - var top_img = theme.index_img !== false ? theme.index_img || theme.default_top_img : false + - var home_index_img = theme.index_img !== false ? theme.index_img || theme.default_top_img : false + else + - var top_img = page.top_img || theme.default_top_img + + if top_img !== false + - var imgSource = top_img && top_img.indexOf('/') !== -1 ? url_for(top_img) : top_img + - var bg_img = top_img ? imgSource : '' + - var home_index_img_bg = home_index_img ? home_index_img : '' + - var site_title = page.title || page.tag || page.category || config.title + - var isHomeClass = is_home() ? 'full_page' : 'not-home-page' + - is_post() ? isHomeClass = 'post-bg' : isHomeClass + else + - var isHomeClass = 'not-top-img' +else + - var top_img = false + - var isHomeClass = 'not-top-img' +header#page-header(class=`${isHomeClass}` style=home_index_img_bg) + !=partial('includes/header/nav', {}, {cache: true}) + if top_img !== false + if is_post() + if page.bilibili_bg + !=partial('includes/bili-banner/index') + else + include ./post-info.pug + if theme.dynamicEffect && theme.dynamicEffect.postTopWave + section.main-hero-waves-area.waves-area + svg.waves-svg(xmlns='http://www.w3.org/2000/svg', xlink='http://www.w3.org/1999/xlink', viewBox='0 24 150 28', preserveAspectRatio='none', shape-rendering='auto') + defs + path#gentle-wave(d='M -160 44 c 30 0 58 -18 88 -18 s 58 18 88 18 s 58 -18 88 -18 s 58 18 88 18 v 44 h -352 Z') + g.parallax + use(href='#gentle-wave', x='48', y='0') + use(href='#gentle-wave', x='48', y='3') + use(href='#gentle-wave', x='48', y='5') + use(href='#gentle-wave', x='48', y='7') + #post-top-cover + img#post-top-bg(class='nolazyload' src=bg_img) + + else if is_home() + #site-info + h1#site-title=site_title + if theme.subtitle.enable + - var loadSubJs = true + #site-subtitle + span#subtitle + if(theme.social) + #site_social_icons + !=fragment_cache('social', function(){return partial('includes/header/social')}) + #scroll-down + i.anzhiyufont.anzhiyu-icon-angle-down.scroll-down-effects + else + #page-site-info + h1#site-title=site_title diff --git a/blog/themes/anzhiyu/layout/includes/header/menu_item.pug b/blog/themes/anzhiyu/layout/includes/header/menu_item.pug new file mode 100644 index 0000000..e2e487f --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/header/menu_item.pug @@ -0,0 +1,49 @@ +if theme.menu + //- for mobile sidebar + - let sidebarChildHide = theme.hide_sidebar_menu_child ? 'hide' : '' + + .menus_items + each value, label in theme.menu + if typeof value !== 'object' + .menus_item + a.site-page.faa-parent.animated-hover(href=url_for(trim(value.split('||')[0]))) + if value.split('||')[1] + - var icon_value = trim(value.split('||')[1]) + - var anima_value = value.split('||')[2] ? trim(value.split('||')[2]) : 'faa-tada' + if icon_value.substring(0,2)=="fa" + i(class=icon_value + ' ' + anima_value) + else if icon_value.substring(0,4)=="icon" + svg.icon(aria-hidden="true" class=anima_value) + use(xlink:href=`#`+ icon_value) + else if icon_value.substring(0,4)=="anzhiyu" + i.anzhiyufont(style="font-size: 0.9em;" class=icon_value + ' ' + anima_value) + span=' '+label + else + .menus_item + a.site-page(href='javascript:void(0);') + if label.split('||')[1] + - var icon_label = trim(label.split('||')[1]) + - var anima_label = label.split('||')[2] ? trim(label.split('||')[2]) : 'faa-tada' + if icon_label.substring(0,2)=="fa" + i(class=icon_label + ' ' + anima_label) + else if (icon_label.startsWith("icon")) + svg.icon(aria-hidden="true" class=anima_label) + use(xlink:href=`#`+ icon_label) + else if (icon_label.startsWith("anzhiyu")) + i.anzhiyufont(style="font-size: 0.9em;" class=icon_label + ' ' + anima_label) + span=' '+ trim(label.split('||')[0]) + ul.menus_item_child + each val,lab in value + li + a.site-page.child.faa-parent.animated-hover(href=url_for(trim(val.split('||')[0]))) + if val.split('||')[1] + - var icon_val = trim(val.split('||')[1]) + - var anima_val = val.split('||')[2] ? trim(val.split('||')[2]) : 'faa-tada' + if icon_val.substring(0,2)=="fa" + i(class=icon_val + ' ' + anima_val) + else if (icon_val.startsWith("icon")) + svg.icon(aria-hidden="true" class=anima_val) + use(xlink:href=`#`+ icon_val) + else if (icon_val.startsWith("anzhiyu")) + i.anzhiyufont(style="font-size: 0.9em;" class=icon_val + ' ' + anima_val) + span=' '+ lab \ No newline at end of file diff --git a/blog/themes/anzhiyu/layout/includes/header/nav.pug b/blog/themes/anzhiyu/layout/includes/header/nav.pug new file mode 100644 index 0000000..2997088 --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/header/nav.pug @@ -0,0 +1,61 @@ +- const { darkmode } = theme +nav#nav + #nav-group + span#blog_name + if theme.nav.enable + .back-home-button + i.anzhiyufont.anzhiyu-icon-grip-vertical + .back-menu-list-groups + each group in theme.nav.menu + .back-menu-list-group + .back-menu-list-title= group.title + .back-menu-list + each item in group.item + a.back-menu-item(href=url_for(item.link), title=item.name) + img.back-menu-item-icon(src=item.icon alt=item.name) + span.back-menu-item-text= item.name + a#site-name(href=url_for('/') accesskey="h") + .title #[=config.title] + i.anzhiyufont.anzhiyu-icon-house-chimney + if (theme.nav.clock) + !=partial('includes/anzhiyu/clock', {}, {cache: true}) + + div.mask-name-container + #name-container + a#page-name(href="javascript:anzhiyu.scrollToDest(0, 500)") PAGE_NAME + + #menus + !=partial('includes/header/menu_item', {}, {cache: true}) + #nav-right + if theme.nav.travelling + .nav-button.only-home#travellings_button(title=_p('nav.travelling')) + a.site-page(onclick='anzhiyu.totraveling()', title=_p('nav.travelling'), href='javascript:void(0);', rel='external nofollow', data-pjax-state='external') + i.anzhiyufont.anzhiyu-icon-train + .nav-button#randomPost_button + a.site-page(onclick='toRandomPost()', title=_p('nav.random_post'), href='javascript:void(0);') + i.anzhiyufont.anzhiyu-icon-dice + if (theme.algolia_search.enable || theme.local_search.enable || theme.docsearch.enable) + div.nav-button#search-button + a.site-page.social-icon.search(href='javascript:void(0);', title=_p('nav.search') accesskey="s") + i.anzhiyufont.anzhiyu-icon-magnifying-glass + span=' '+_p('search.title') + + if theme.centerConsole.enable + input#center-console(type="checkbox") + label.widget(for="center-console" title=_p('console.title') onclick="anzhiyu.switchConsole();") + i.left + i.widget.center + i.widget.right + + !=partial('includes/anzhiyu/console', {}, {cache:true}) + + div.nav-button#nav-totop + a.totopbtn(href='javascript:void(0);') + i.anzhiyufont.anzhiyu-icon-arrow-up + span#percent(onclick="anzhiyu.scrollToDest(0,500)") 0 + + #toggle-menu + a.site-page(href='javascript:void(0);' title=_p('nav.toggle_menu')) + i.anzhiyufont.anzhiyu-icon-bars + + diff --git a/blog/themes/anzhiyu/layout/includes/header/post-info.pug b/blog/themes/anzhiyu/layout/includes/header/post-info.pug new file mode 100644 index 0000000..0b47d5e --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/header/post-info.pug @@ -0,0 +1,145 @@ +- let comments = theme.comments +#post-info + #post-firstinfo + .meta-firstline + if (page.copyright_author && page.copyright_author !== config.author) + a.post-meta-original 转载 + else + a.post-meta-original 原创 + if (theme.post_meta.post.categories && page.categories && page.categories.data.length > 0) + span.post-meta-categories + if (theme.post_meta.post.date_type) + span.post-meta-separator + + each item, index in page.categories.data + i.anzhiyufont.anzhiyu-icon-inbox.post-meta-icon + a(href=url_for(item.path) itemprop="url").post-meta-categories #[=item.name] + if (index < page.categories.data.length - 1) + i.anzhiyufont.anzhiyu-icon-angle-right.post-meta-separator + if (theme.post_meta.page.tags) + span.article-meta.tags + each item, index in page.tags.data + a(href=url_for(item.path) tabindex="-1" itemprop="url").article-meta__tags + span + i.anzhiyufont.anzhiyu-icon-hashtag + =item.name + + h1.post-title(itemprop="name headline")= page.title || _p('no_title') + if (theme.post_edit.enable && (theme.post_edit.github !== false)) + a.post-edit-link(href=theme.post_edit.url + page.source title=_p('post.edit.github') + ' - ' + page.title target="_blank") + i.anzhiyufont.anzhiyu-icon-pencil + if (theme.post_edit.enable && (theme.post_edit.yuque !== false)) + a.post-edit-link(href=theme.post_edit.yuque + page.id + '/edit/' title=_p('post.edit.yuque') + ' - ' + page.title target="_blank") + i.anzhiyufont.anzhiyu-icon-pencil + + #post-meta + .meta-firstline + if (theme.post_meta.post.date_type) + span.post-meta-date + if (theme.post_meta.post.date_type === 'both') + i.anzhiyufont.anzhiyu-icon-calendar-days.post-meta-icon + span.post-meta-label= _p('post.created') + time.post-meta-date-created(itemprop="dateCreated datePublished" datetime=date_xml(page.date) title=_p('post.created') + ' ' + full_date(page.date))=date(page.date, config.date_format) + span.post-meta-separator + i.anzhiyufont.anzhiyu-icon-history.post-meta-icon + span.post-meta-label= _p('post.updated') + time.post-meta-date-updated(itemprop="dateCreated datePublished" datetime=date_xml(page.updated) title=_p('post.updated') + ' ' + full_date(page.updated))=date(page.updated, config.date_format) + else + - let data_type_update = theme.post_meta.post.date_type === 'updated' + - let date_type = data_type_update ? 'updated' : 'date' + - let date_icon = data_type_update ? 'anzhiyu-icon-history' :'anzhiyu-icon-calendar-days' + - let date_title = data_type_update ? _p('post.updated') : _p('post.created') + i.post-meta-icon.anzhiyufont(class=date_icon) + span.post-meta-label= date_title + time(itemprop="dateCreated datePublished" datetime=date_xml(page[date_type]) title=date_title + ' ' + full_date(page[date_type]))=date(page[date_type], config.date_format) + + .meta-secondline + - let postWordcount = theme.wordcount.enable && (theme.wordcount.post_wordcount || theme.wordcount.min2read) + if (postWordcount) + span.post-meta-separator + span.post-meta-wordcount + if theme.wordcount.post_wordcount + i.anzhiyufont.anzhiyu-icon-file-word.post-meta-icon(title="文章字数") + span.post-meta-label(title="文章字数")= _p('post.wordcount') + ':' + span.word-count(title="文章字数")= wordcount(page.content) + if theme.wordcount.min2read + span.post-meta-separator + if theme.wordcount.min2read + i.anzhiyufont.anzhiyu-icon-clock.post-meta-icon(title="阅读时长") + span.post-meta-label(title="阅读时长")= _p('post.min2read') + ':' + span= min2read(page.content, {cn: 350, en: 160}) + _p('post.min2read_unit') + + //- for pv and count + mixin pvBlock(parent_id,parent_class,parent_title) + span.post-meta-separator + span(class=parent_class id=parent_id data-flag-title=page.title) + i.anzhiyufont.anzhiyu-icon-fw-eye.post-meta-icon + span.post-meta-label(title="阅读量")=_p('post.page_pv') + ':' + if block + block + + - const commentUse = comments.use + if page.comments !== false && commentUse && !comments.lazyload + if commentUse[0] === 'Valine' && theme.valine.visitor + +pvBlock(url_for(page.path),'leancloud_visitors',page.title) + span.leancloud-visitors-count(title="访问量") + i.anzhiyufont.anzhiyu-icon-spinner.anzhiyu-spin + else if commentUse[0] === 'Waline' && theme.waline.pageview + +pvBlock('','','') + span.waline-pageview-count(data-path=url_for(page.path) title="访问量") + i.anzhiyufont.anzhiyu-icon-spinner.anzhiyu-spin + else if commentUse[0] === 'Twikoo' && theme.twikoo.visitor + +pvBlock('','','') + span#twikoo_visitors(title="访问量") + i.anzhiyufont.anzhiyu-icon-spinner.anzhiyu-spin + else if commentUse[0] === 'Artalk' && theme.artalk.visitor + +pvBlock('','','') + span#ArtalkPV + i.anzhiyufont.anzhiyu-icon-spinner.anzhiyu-spin + else if theme.busuanzi.page_pv + +pvBlock('','post-meta-pv-cv','') + span#busuanzi_value_page_pv + i.anzhiyufont.anzhiyu-icon-spinner.anzhiyu-spin + else if theme.busuanzi.page_pv + +pvBlock('','post-meta-pv-cv','') + span#busuanzi_value_page_pv + i.anzhiyufont.anzhiyu-icon-spinner.anzhiyu-spin + - let location = page.location ? page.location : theme.post_copyright.location + if theme.post_copyright.enable && location + span.post-meta-separator + span.post-meta-position(title="作者IP属地为" + location) + i.anzhiyufont.anzhiyu-icon-location-dot + =location + + if comments.count && !comments.lazyload && page.comments !== false && comments.use + - var whichCount = comments.use[0] + + mixin countBlock + span.post-meta-separator + span.post-meta-commentcount + i.anzhiyufont.anzhiyu-icon-comments.post-meta-icon + span.post-meta-label= _p('post.comments') + ':' + if block + block + + case whichCount + when 'Valine' + +countBlock + a(href=url_for(page.path) + '#post-comment' itemprop="discussionUrl") + span.valine-comment-count(data-xid=url_for(page.path) itemprop="commentCount") + i.anzhiyufont.anzhiyu-icon-spinner.anzhiyu-spin + when 'Waline' + +countBlock + a(href=url_for(page.path) + '#post-comment') + span.waline-comment-count(data-path=url_for(page.path)) + i.anzhiyufont.anzhiyu-icon-spinner.anzhiyu-spin + when 'Twikoo' + +countBlock + a(href=url_for(page.path) + '#post-comment' tabindex="-1") + span#twikoo-count + i.anzhiyufont.anzhiyu-icon-spinner.anzhiyu-spin + when 'Artalk' + +countBlock + a(href=url_for(page.path) + '#post-comment') + span.artalk-count(data-page-key=url_for(page.path)) + i.anzhiyufont.anzhiyu-icon-spinner.anzhiyu-spin \ No newline at end of file diff --git a/blog/themes/anzhiyu/layout/includes/header/social.pug b/blog/themes/anzhiyu/layout/includes/header/social.pug new file mode 100644 index 0000000..44e7162 --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/header/social.pug @@ -0,0 +1,12 @@ +each value, title in theme.social + a.social-icon.faa-parent.animated-hover(href=url_for(trim(value.split('||')[0])) target="_blank" title=title === undefined ? '' : trim(title)) + if value.split('||')[1] + - var icon_value = trim(value.split('||')[1]) + - var anima_value = value.split('||')[2] ? trim(value.split('||')[2]) : 'faa-tada' + if (icon_value.startsWith("fa")) + i(class=icon_value + ' ' + anima_value) + else if (icon_value.startsWith("icon")) + svg.icon(aria-hidden="true" class=anima_value) + use(xlink:href=`#`+ icon_value) + else if (icon_value.startsWith("anzhiyu")) + i.anzhiyufont(class=icon_value) \ No newline at end of file diff --git a/blog/themes/anzhiyu/layout/includes/layout.pug b/blog/themes/anzhiyu/layout/includes/layout.pug new file mode 100644 index 0000000..750d670 --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/layout.pug @@ -0,0 +1,91 @@ +- var htmlClassHideAside = theme.aside.enable && theme.aside.hide ? 'hide-aside' : '' +- page.aside = is_archive() ? theme.aside.display.archive: is_category() ? theme.aside.display.category : is_tag() ? theme.aside.display.tag : page.aside +- var hideAside = !theme.aside.enable || page.aside === false ? 'hide-aside' : '' +- var pageType = is_post() ? 'post' : 'page' + +doctype html +html(lang=config.language data-theme=theme.display_mode class=htmlClassHideAside) + head + include ./head.pug + body(data-type="anzhiyu") + #web_bg + #an_music_bg + if theme.preloader.enable + !=partial('includes/loading/index', {}, {cache: true}) + if (theme.mourn.enable && is_home_first_page()) + include ./mourn.pug + if page.type !== '404' + #body-wrap(class=pageType) + include ./header/index.pug + main#blog-container + if (is_home()) + include ./bbTimeList.pug + if is_current("/") + include ./top/top.pug + if page.top_single + - let background = page.top_single_background + - let tip = page.top_single_tip + - let subTitle = page.top_single_subtitle + - let btn_link = page.top_single_btn_link + - let btn_text = page.top_single_btn_text + #single_top + .author-content.author-content-item.single(style=`${background ? `background: url(${background}) top / cover no-repeat;` : ""}`) + .card-content + .author-content-item-tips=subTitle + span.author-content-item-title=page.title + .content-bottom + .tips=tip + .banner-button-group + a.banner-button(onclick=`pjax.loadUrl("${url_for(btn_link ? btn_link : '/about')}")`) + i.anzhiyufont.anzhiyu-icon-arrow-circle-right(style='font-size: 1.5rem') + span.banner-button-text=btn_text ? btn_text : "关于我" + + #content-inner.layout(class=hideAside) + if body + div!= body + else + block content + if theme.aside.enable && page.aside !== false + include widget/index.pug + + - var footerBg = theme.footer_bg + if (footerBg) + if (footerBg === true) + - var footer_bg = bg_img + else + - var footer_bg = theme.footer_bg.indexOf('/') !== -1 ? `background-image: url('${url_for(footerBg)}')` : `background: ${footerBg}` + else + - var footer_bg = '' + + footer#footer(style=footer_bg) + !=partial('includes/footer', {}, {cache: true}) + + if (theme.agreementPopup && theme.agreementPopup.enable && is_home_first_page()) + - let agreementPopupUrl = theme.agreementPopup.url + script(defer). + var hasShownPopup = sessionStorage.getItem('sessionNegotiatePopupShown'); + + if (!hasShownPopup) { + setTimeout(() => { + anzhiyuPopupManager && anzhiyuPopupManager.enqueuePopup('协议提醒助手', '查看本站为你的个人隐私做出的努力', '#{agreementPopupUrl}', 4000); + sessionStorage.setItem('sessionNegotiatePopupShown', 'true'); + }, 1000); + } + + else + include ./404.pug + + !=partial('includes/sidebar', {}, {cache: true}) + + if theme.shortcutKey.enable + !=partial('includes/shortcutKey', {}, {cache: true}) + include ./rightside.pug + + if (theme.nav_music.enable || theme.nav_music.console_widescreen_music) + include ./music.pug + !=partial('includes/third-party/search/index', {}, {cache: true}) + !=partial('includes/anzhiyu/rightmenu', {}, {cache:true}) + include ./additional-js.pug + + //- 弹窗通知 + !=partial('includes/popup/index', {}, {cache: true}) diff --git a/blog/themes/anzhiyu/layout/includes/loading/fullpage-loading.pug b/blog/themes/anzhiyu/layout/includes/loading/fullpage-loading.pug new file mode 100644 index 0000000..15d13e6 --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/loading/fullpage-loading.pug @@ -0,0 +1,21 @@ +- loading_img = theme.preloader.avatar ? theme.preloader.avatar : theme.avatar.img +#loading-box(onclick='document.getElementById("loading-box").classList.add("loaded")') + .loading-bg + img.loading-img(alt="加载头像" class='nolazyload' src=url_for(loading_img)) + .loading-image-dot +script. + const preloader = { + endLoading: () => { + document.getElementById('loading-box').classList.add("loaded"); + }, + initLoading: () => { + document.getElementById('loading-box').classList.remove("loaded") + } + } + window.addEventListener('load',()=> { preloader.endLoading() }) + setTimeout(function(){preloader.endLoading();},10000) + + if (!{theme.pjax && theme.pjax.enable}) { + document.addEventListener('pjax:send', () => { preloader.initLoading() }) + document.addEventListener('pjax:complete', () => { preloader.endLoading() }) + } diff --git a/blog/themes/anzhiyu/layout/includes/loading/index.pug b/blog/themes/anzhiyu/layout/includes/loading/index.pug new file mode 100644 index 0000000..f585d78 --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/loading/index.pug @@ -0,0 +1,7 @@ +if theme.preloader.source === 1 + include ./fullpage-loading.pug +else if theme.preloader.source === 2 + include ./pace.pug +else + include ./fullpage-loading.pug + include ./pace.pug \ No newline at end of file diff --git a/blog/themes/anzhiyu/layout/includes/loading/pace.pug b/blog/themes/anzhiyu/layout/includes/loading/pace.pug new file mode 100644 index 0000000..8948acf --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/loading/pace.pug @@ -0,0 +1,2 @@ +link(rel="stylesheet", href=url_for(theme.preloader.pace_css_url || theme.asset.pace_default_css)) +script(async src=url_for(theme.asset.pace_js), data-pace-options='{ "restartOnRequestAfter":false,"eventLag":false}') \ No newline at end of file diff --git a/blog/themes/anzhiyu/layout/includes/mixins/article-sort.pug b/blog/themes/anzhiyu/layout/includes/mixins/article-sort.pug new file mode 100644 index 0000000..89890b0 --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/mixins/article-sort.pug @@ -0,0 +1,37 @@ +mixin articleSort(posts, current) + .article-sort + - var year + - let modifiedUrl + - posts.each(function (article, post_index) { + - let tempYear = date(article.date, 'YYYY') + - let no_cover = article.cover === false || !theme.cover.archives_enable ? 'no-article-cover' : '' + - let title = article.title || _p('no_title') + - let pageThumbnailSuffix = theme.pageThumbnailSuffix + if (pageThumbnailSuffix && theme.pageThumbnailSuffix.startsWith("!") && article.cover && article.cover.includes("!")) + - let imageUrl = article.cover.substring(0, article.cover.indexOf("!")) + - modifiedUrl = imageUrl + pageThumbnailSuffix + else + - modifiedUrl = article.cover + if tempYear !== year + - year = tempYear + .article-sort-item.year + span= year + .article-sort-item(class=no_cover) + if article.cover && theme.cover.archives_enable + a.article-sort-item-img(href=url_for(article.path) title=title) + img(src=url_for(modifiedUrl) alt=title onerror=`this.onerror=null;this.src='${url_for(theme.error_img.post_page)}'`) + .article-sort-item-info + a.article-sort-item-title(href=url_for(article.path) title=title)= title + span.article-sort-item-index= (current - 1) * config.per_page + post_index + 1 + .article-meta-wrap + if (theme.post_meta.page.tags && article.tags.data.length > 0) + span.article-sort-item-tags + each item, index in article.tags.data + a(href=url_for(item.path) tabindex="-1").article-meta__tags + span + i.anzhiyufont.anzhiyu-icon-hashtag + =item.name + .article-sort-item-time + i.anzhiyufont.anzhiyu-icon-calendar-alt + time.post-meta-date-created(datetime=date_xml(article.date) title=_p('post.created') + ' ' + full_date(article.date))= date(article.date, config.date_format) + - }) \ No newline at end of file diff --git a/blog/themes/anzhiyu/layout/includes/mixins/post-ui.pug b/blog/themes/anzhiyu/layout/includes/mixins/post-ui.pug new file mode 100644 index 0000000..a75c5b7 --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/mixins/post-ui.pug @@ -0,0 +1,122 @@ +- let maxDate = 0 +each item in site.posts.data + if item.date > maxDate + - maxDate = item.date +mixin postUI(posts) + each article , index in page.posts.data + - let link = article.link || article.path + div(class = (index === 0 ? 'recent-post-item lastestpost-item' : 'recent-post-item') onclick=`pjax.loadUrl('${url_for(link)}')`) + - + let title = article.title || _p('no_title') + const position = theme.cover.position + let leftOrRight = position === 'both' + ? index%2 == 0 ? 'left' : 'right' + : position === 'left' ? 'left' : 'right' + let post_cover = article.cover + let no_cover = article.cover === false || !theme.cover.index_enable ? 'no-cover' : '' + - + - const new_post = is_current('/') && (maxDate === article.date) + + if post_cover && theme.cover.index_enable + .post_cover(class=leftOrRight) + a(href=url_for(link) title=title style='display: flex;height: 100%;') + img.post_bg(src=url_for(post_cover) onerror=`this.onerror=null;this.src='`+ url_for(theme.error_img.post_page) + `'` alt=title style='pointer-events: none') + + .recent-post-info(class=no_cover) + .recent-post-info-top + .recent-post-info-top-tips + if (is_home() && (article.top || article.sticky > 0)) + span.article-meta.sticky-warp + i.anzhiyufont.anzhiyu-icon-thumbtack.sticky + span.sticky= _p('sticky') + if (theme.post_meta.page.categories && article.categories.data.length > 0) + each item, index in article.categories.data + .article-categories-original=item.name + if new_post + span.newPost=_p('post.new') + a.unvisited-post(href=url_for(link) title=title)=_p('post.unread') + a.article-title(href=url_for(link) title=title)= title + .article-meta-wrap + if (theme.post_meta.page.date_type) + span.post-meta-date + if (theme.post_meta.page.date_type === 'both') + i.anzhiyufont.anzhiyu-icon-calendar-alt(style=`${theme.post_meta.page.date_format==="simple" ? "display:none":""}`) + span.article-meta-label=_p('post.created') + time.post-meta-date-created(datetime=date_xml(article.date) title=_p('post.created') + ' ' + full_date(article.date) time=full_date(article.date))=date(article.date, config.date_format) + span.article-meta-separator + i.anzhiyufont.anzhiyu-icon-history(style=`font-size: 15px; ${theme.post_meta.page.date_format==="simple" ? "display:none":""}`) + span.article-meta-label=_p('post.updated') + time.post-meta-date-updated(datetime=date_xml(article.updated) title=_p('post.updated') + ' ' + full_date(article.updated) time=full_date(article.updated))=date(article.updated, config.date_format) + else + - let data_type_updated = theme.post_meta.page.date_type === 'updated' + - let date_type = data_type_updated ? 'updated' : 'date' + - let date_type_other = data_type_updated ? 'date' : 'updated' + - let date_icon = data_type_updated ? 'anzhiyu-icon-history' :'anzhiyu-icon-calendar-days' + - let date_title = data_type_updated ? _p('post.updated') : _p('post.created') + - let date_title_other = data_type_updated ? _p('post.created') : _p('post.updated') + i.anzhiyufont(class=date_icon style=`font-size: 15px; ${theme.post_meta.page.date_format==="simple" ? "display:none":""}`) + span.article-meta-label=date_title + time(datetime=date_xml(article[date_type]) title=date_title + ' ' + full_date(article[date_type]) time=full_date(article[date_type]))=date(article[date_type], config.date_format) + time(datetime=date_xml(article[date_type_other]), class="time_hidden", title=date_title_other + ' ' + full_date(article[date_type_other]) time=full_date(article[date_type_other]))=date(article[date_type_other], config.date_format) + if (theme.post_meta.page.tags && article.tags.data.length > 0) + span.article-meta.tags + each item, index in article.tags.data + a(href=url_for(item.path) event.cancelbubble onclick="window.event.cancelBubble=true;").article-meta__tags + span + i.anzhiyufont.anzhiyu-icon-hashtag + =item.name + + mixin countBlockInIndex + - needLoadCountJs = true + span.article-meta + span.article-meta-separator + i.anzhiyufont.anzhiyu-icon-comments + if block + block + span.article-meta-label= ' ' + _p('card_post_count') + + if theme.comments.card_post_count + case theme.comments.use[0] + when 'Valine' + +countBlockInIndex + a(href=url_for(link) + '#post-comment') + span.valine-comment-count(data-xid=url_for(link)) + i.anzhiyufont.anzhiyu-icon-spinner.anzhiyu-spin + when 'Waline' + +countBlockInIndex + a(href=url_for(link) + '#post-comment') + span.waline-comment-count(id=url_for(link)) + i.anzhiyufont.anzhiyu-icon-spinner.anzhiyu-spin + when 'Twikoo' + +countBlockInIndex + a.twikoo-count(href=url_for(link) + '#post-comment' tabindex="-1") + i.anzhiyufont.anzhiyu-icon-spinner.anzhiyu-spin + when 'Artalk' + +countBlockInIndex + a(href=url_for(link) + '#post-comment') + span.artalk-count(data-page-key=url_for(link)) + i.anzhiyufont.anzhiyu-icon-spinner.anzhiyu-spin + + //- Display the article introduction on homepage + case theme.index_post_content.method + when false + - break + when 1 + .content!= article.description + when 2 + if article.description + .content!= article.description + else + - const content = strip_html(article.content) + - let expert = content.substring(0, theme.index_post_content.length) + - content.length > theme.index_post_content.length ? expert += ' ...' : '' + .content!= expert + default + - const content = strip_html(article.content) + - let expert = content.substring(0, theme.index_post_content.length) + - content.length > theme.index_post_content.length ? expert += ' ...' : '' + .content!= expert + + if theme.ad && theme.ad.index + if (index + 1) % 3 == 0 + .recent-post-item.ads-wrap!=theme.ad.index diff --git a/blog/themes/anzhiyu/layout/includes/mourn.pug b/blog/themes/anzhiyu/layout/includes/mourn.pug new file mode 100644 index 0000000..4055b7b --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/mourn.pug @@ -0,0 +1,9 @@ +script. + function initMourn() { + const date = new Date(); + const today = (date.getMonth() + 1) + "-" + date.getDate() + const mourn_days = !{JSON.stringify(theme.mourn.days)} + if (mourn_days.includes(today)) { + document.documentElement.style.filter = "grayscale(1)"; + }} + initMourn(); \ No newline at end of file diff --git a/blog/themes/anzhiyu/layout/includes/music.pug b/blog/themes/anzhiyu/layout/includes/music.pug new file mode 100644 index 0000000..e2496f8 --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/music.pug @@ -0,0 +1,7 @@ +- const nav_music_id = theme.nav_music.id +- const nav_music_server = theme.nav_music.server +- const nav_music_volume = theme.nav_music.volume +#nav-music + a#nav-music-hoverTips(onclick='anzhiyu.musicToggle()' accesskey="m") 播放音乐 + #console-music-bg + meting-js(id=nav_music_id server=nav_music_server type="playlist" mutex="true" preload="none" theme="var(--anzhiyu-main)" data-lrctype="0" order="random" volume=nav_music_volume) diff --git a/blog/themes/anzhiyu/layout/includes/page/about.pug b/blog/themes/anzhiyu/layout/includes/page/about.pug new file mode 100644 index 0000000..45420c7 --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/page/about.pug @@ -0,0 +1,500 @@ +if site.data.about + - let aboutData = site.data.about + each item in aboutData + - let subtitle = item.subtitle || config.subtitle + - let avatarImg = item.avatarImg || theme.avatar.img + - let aboutName = item.name || theme.author + - let aboutDescription = item.description || config.description + - let helloAbout = item.helloAbout + - let skillsTips = item.skillsTips + - let careers = item.careers + - let crrList = careers.list + - let crrItem = careers.item + - let avatarSkills = item.avatarSkills + #about-page + .author-box + if avatarSkills + .author-tag-left + each item in avatarSkills.left + span.author-tag=item + .author-img + img.no-lightbox(src=url_for(avatarImg) onerror=`this.onerror=null;this.src='` + url_for(theme.error_img.flink) + `'` alt="avatar") + if avatarSkills + .author-tag-right + each item in avatarSkills.right + span.author-tag=item + p.p.center.logo.large=_p('about.title') + p.p.center.small=subtitle + .author-content + .author-content-item.myInfoAndSayHello + .title1=_p('about.hello') + .title2 + =_p('about.im') + | + span.inline-word=aboutName + .title1=aboutDescription + .aboutsiteTips.author-content-item + - let { tips, title1, title2, word } = item.aboutsiteTips + .author-content-item-tips= tips + h2 + = title1 + br + = title2 + .mask + each wordItem, index in word + if index < word.length - 2 + span(class=(index === 0 ? 'first-tips' : ''))= wordItem + span(data-up)= word[word.length - 2] + | + span(data-show)= word[word.length - 1] + + .hello-about + .cursor(style='translate:none;rotate:none;scale:none;transform:translate(721px,180px)') + .shapes + .shape.shape-1(style='translate:none;rotate:none;scale:none;transform:translate(721px,180px)') + .shape.shape-2(style='translate:none;rotate:none;scale:none;transform:translate(721px,180px)') + .shape.shape-3(style='translate:none;rotate:none;scale:none;transform:translate(721px,180px)') + .content + h1=helloAbout + + .author-content + .author-content-item.skills + .card-content + .author-content-item-tips=skillsTips.tips + span.author-content-item-title=skillsTips.title + .skills-style-group + include ../anzhiyu/tags-group-all.pug + if site.data.creativity + .skills-list + each i in site.data.creativity + each item, index in i.creativity_list + .skill-info + .skill-icon(style=`background: ${item.color}`) + img.no-lightbox(title=item.name, src=item.icon, alt=item.name) + .skill-name + span=item.name + .etc ... + .author-content-item.careers + .card-content + .author-content-item-tips=careers.tips + span.author-content-item-title=careers.title + .careers-group + if crrList + each career in crrList + .career-item + .circle(style=`background:${career.color ? career.color : "#357ef5"}`) + .name=career.desc + else + .careers-none + if careers.img + img.author-content-img.no-lightbox(alt=careers.tips, src=url_for(careers.img) onerror=`this.onerror=null;this.src='` + url_for(theme.error_img.flink) + `'`) + + .author-content + if theme.LA.enable || theme.umami.enable + - let cover = item.statistic.cover + - let statisticSource = theme.LA.enable ? '51la' : 'Umami' + - let statisticLink = theme.LA.enable ? 'https://invite.51.la/1NzKqTeb?target=V6' : (theme.umami.apiHost || '#') + .about-statistic.author-content-item(style=`background: url(${cover}) top / cover no-repeat;`) + .card-content + .author-content-item-tips=_p('about.data') + span.author-content-item-title=_p('about.visit_stats') + #statistic + .post-tips + =_p('about.stats_from') + | + a(href=statisticLink, target='_blank', rel='noopener nofollow')= statisticSource + .banner-button-group + - let link = item.statistic.link + - let text = item.statistic.text + a.banner-button(onclick=`pjax.loadUrl("${link}")`) + i.anzhiyufont.anzhiyu-icon-arrow-circle-right + | + span.banner-button-text=text + .author-content-item-group.column.mapAndInfo + - let mapBackground = item.map.background + - let mapBackgroundDark = item.map.backgroundDark + style. + .author-content-item.map { + background-image: url(#{mapBackground}); + } + [data-theme='dark'] .author-content-item.map { + background-image: url(#{mapBackgroundDark}); + } + .author-content-item.map.single + - let mapTitle = item.map.title + - let mapStrengthenTitle = item.map.StrengthenTitle + span.map-title=mapTitle + b=mapStrengthenTitle + .author-content-item.selfInfo.single + - let { selfInfoTips1, selfInfoContentYear, selfInfoTips2, selfInfoContent2, selfInfoTips3, selfInfoContent3 } = item.selfInfo + div + span.selfInfo-title=selfInfoTips1 + | + span.selfInfo-content#selfInfo-content-year(style='color:#43a6c6')=selfInfoContentYear + div + span.selfInfo-title=selfInfoTips2 + | + span.selfInfo-content(style='color:#c69043')=selfInfoContent2 + div + span.selfInfo-title=selfInfoTips3 + | + span.selfInfo-content(style='color:#b04fe6')=selfInfoContent3 + + .author-content + .author-content-item.personalities + - let {author_name, personality_type, photo_url, personality_img, name_url, personality_type_color} = item.personalities + .author-content-item-tips=_p('about.personality') + span.author-content-item-title= author_name + .title2(style=`color:${personality_type_color ? personality_type_color : "#ac899c"}`)= personality_type + .post-tips + - const learnMoreText = _p('about.learn_more_at', '16personalities', '' + author_name + '') + != learnMoreText + .image + img.no-lightbox(src=url_for(personality_img), alt=_p('about.personality_img_alt')) + .author-content-item.myphoto + img.author-content-img.no-lightbox(alt=_p('about.selfie_alt'), src=url_for(photo_url)) + + .author-content + .author-content-item.maxim + - let {maxim_tips, maxim_top, maxim_bottom} = item.maxim + .author-content-item-tips=maxim_tips + span.maxim-title + span(style='opacity:.6;margin-bottom:8px')=maxim_top + | + span=maxim_bottom + .author-content-item.buff + .card-content + - let {buff_tips, buff_top, buff_bottom} = item.buff + .author-content-item-tips=buff_tips + span.buff-title + span(style='opacity:.6;margin-bottom:8px')=buff_top + | + span=buff_bottom + .card-background-icon + i.anzhiyufont.anzhiyu-icon-dice-d20 + + .author-content + - let {game_tips, game_title, game_uid, game_bg} = item.game + .author-content-item.game-yuanshen(style=`background: url(${game_bg}) top / cover no-repeat;`) + .card-content + .author-content-item-tips=game_tips + span.author-content-item-title=game_title + .content-bottom + .icon-group + .loading-bar(role='presentation', aria-hidden='true' style=`${game_title != "原神" ? "display: none": ""}`) + .tips.game-yuanshen-uid=game_uid + .author-content-item.comic-content + .card-content + - let {comic_tips, comic_title, comic_list} = item.comic + .author-content-item-tips=comic_tips + .author-content-item-title=comic_title + .comic-box + if comic_list + each i in comic_list + a.comic-item(href=i.href, target="_blank", title=i.name) + .comic-item-cover + img(src=i.cover, alt=i.name) + + .author-content + - let {music_tips, music_title, music_link, music_bg} = item.music + - let {like_tips, like_title, like_bottom, like_bg} = item.like + .author-content-item.like-technology(style=`background: url(${like_bg}) top / cover no-repeat;`) + .card-content + .author-content-item-tips=like_tips + span.author-content-item-title=like_title + .content-bottom + .tips=like_bottom + .author-content-item.like-music(style=`background: url(${music_bg}) top / cover no-repeat;`) + .card-content + .author-content-item-tips=music_tips + span.author-content-item-title=music_title + .content-bottom + .tips=_p('about.enjoy_music_with', aboutName) + .banner-button-group + a.banner-button(onclick=`pjax.loadUrl("${music_link}")`) + i.anzhiyufont.anzhiyu-icon-arrow-circle-right + | + span.banner-button-text=_p('about.more_recommend') + + if page.content + .author-content + .create-site-post.author-content-item.single + != page.content + + - let rawData = item.reward_list + if rawData + - let sortedByDate = rawData.slice().sort((a, b) => new Date(b.datatime) - new Date(a.datatime)); + .author-content + .author-content-item.single.reward#about-reward + .author-content-item-tips=_p('about.thanks') + span.author-content-item-title=_p('about.reward_list') + .author-content-item-description=_p('about.reward_thanks') + .reward-list-all + - let reward_list_amount = item.reward_list.sort((a,b)=>b.amount - a.amount) + each item, index in reward_list_amount + .reward-list-item + .reward-list-item-name=item.name + .reward-list-bottom-group + if item.amount >= 50 + .reward-list-item-money(style='background:var(--anzhiyu-yellow)')=`¥${item.amount}` + else + .reward-list-item-money=`¥${item.amount + (item.suffix ? item.suffix : "")}` + .datatime.reward-list-item-time(datatime=item.datatime)=new Date(item.datatime).toISOString().slice(0, -14) + .reward-list-updateDate + =_p('about.last_update') + time.datatime.reward-list-updateDate-time(datatime=sortedByDate[0].datatime)=new Date(sortedByDate[0].datatime).toISOString().slice(0, -14) + .about-reward + #con + #TA-con(onclick="anzhiyu.rewardShowConsole()") + #text-con + #linght + #TA=_p('about.charge_for_ta') + #tube-con + svg(viewBox='0 0 1028 385', fill='none', xmlns='http://www.w3.org/2000/svg') + path(d='M1 77H234.226L307.006 24H790', stroke='#e5e9ef', stroke-width='20') + path(d='M0 140H233.035L329.72 71H1028', stroke='#e5e9ef', stroke-width='20') + path(d='M1 255H234.226L307.006 307H790', stroke='#e5e9ef', stroke-width='20') + path(d='M0 305H233.035L329.72 375H1028', stroke='#e5e9ef', stroke-width='20') + rect(y='186', width='236', height='24', fill='#e5e9ef') + ellipse(cx='790', cy='25.5', rx='25', ry='25.5', fill='#e5e9ef') + circle(r='14', transform='matrix(1 0 0 -1 790 25)', fill='white') + ellipse(cx='790', cy='307.5', rx='25', ry='25.5', fill='#e5e9ef') + circle(r='14', transform='matrix(1 0 0 -1 790 308)', fill='white') + #mask + svg(viewBox='0 0 1028 385', fill='none', xmlns='http://www.w3.org/2000/svg') + path(d='M1 77H234.226L307.006 24H790', stroke='#f25d8e', stroke-width='20') + path(d='M0 140H233.035L329.72 71H1028', stroke='#f25d8e', stroke-width='20') + path(d='M1 255H234.226L307.006 307H790', stroke='#f25d8e', stroke-width='20') + path(d='M0 305H233.035L329.72 375H1028', stroke='#f25d8e', stroke-width='20') + rect(y='186', width='236', height='24', fill='#f25d8e') + ellipse(cx='790', cy='25.5', rx='25', ry='25.5', fill='#f25d8e') + circle(r='14', transform='matrix(1 0 0 -1 790 25)', fill='white') + ellipse(cx='790', cy='307.5', rx='25', ry='25.5', fill='#f25d8e') + circle(r='14', transform='matrix(1 0 0 -1 790 308)', fill='white') + #orange-mask + svg(viewBox='0 0 1028 385', fill='none', xmlns='http://www.w3.org/2000/svg') + path(d='M1 77H234.226L307.006 24H790', stroke='#ffd52b', stroke-width='20') + path(d='M0 140H233.035L329.72 71H1028', stroke='#ffd52b', stroke-width='20') + path(d='M1 255H234.226L307.006 307H790', stroke='#ffd52b', stroke-width='20') + path(d='M0 305H233.035L329.72 375H1028', stroke='#ffd52b', stroke-width='20') + rect(y='186', width='236', height='24', fill='#ffd52b') + ellipse(cx='790', cy='25.5', rx='25', ry='25.5', fill='#ffd52b') + circle(r='14', transform='matrix(1 0 0 -1 790 25)', fill='white') + ellipse(cx='790', cy='307.5', rx='25', ry='25.5', fill='#ffd52b') + circle(r='14', transform='matrix(1 0 0 -1 790 308)', fill='white') + - const totalPeopleText = _p('about.total_people', '' + item.reward_list.length + '') + p#people!= totalPeopleText + + + script(src=url_for(theme.asset.countup_js)) + - const ck = theme.LA.ck + - const umamiEnable = theme.umami.enable + - const umamiApiHost = theme.umami.apiHost || '' + - const umamiWebsiteId = theme.umami.websiteId || '' + - const umamiToken = theme.umami.token || '' + - const laEnable = theme.LA.enable + - + const i18nStats = { + today_visitors: _p('about.stats.today_visitors'), + today_views: _p('about.stats.today_views'), + yesterday_visitors: _p('about.stats.yesterday_visitors'), + yesterday_views: _p('about.stats.yesterday_views'), + month_views: _p('about.stats.month_views'), + total_views: _p('about.stats.total_views'), + fetch_failed: _p('about.stats.fetch_failed') + } + script(defer). + function initAboutPage() { + const statisticEl = document.getElementById("statistic"); + let statistic = []; + let numValues = []; + + const i18nStats = !{JSON.stringify(i18nStats)}; + + // 统计数据渲染函数 + function renderStatistic(title, num) { + if (!statisticEl) return; + numValues = num; + statistic = []; + + for (let i = 0; i < num.length; i++) { + statisticEl.innerHTML += + "
" + title[i] + "" + num[i] + "
"; + queueMicrotask(() => { + statistic.push( + new CountUp("stat-" + i, 0, num[i], 0, 2, { + useEasing: true, + useGrouping: true, + separator: ",", + decimal: ".", + prefix: "", + suffix: "", + }) + ); + }); + } + } + + // 统计数字动画 + function statisticUP() { + let statisticElement = document.querySelector(".about-statistic.author-content-item"); + if (!statisticElement) return; + + const callback = (entries, observer) => { + entries.forEach(entry => { + if (entry.isIntersecting) { + for (let i = 0; i < statistic.length; i++) { + queueMicrotask(() => { + statistic[i].start(); + }); + } + observer.disconnect(); + } + }); + }; + + const options = { root: null, rootMargin: "0px", threshold: 0 }; + const observer = new IntersectionObserver(callback, options); + observer.observe(statisticElement); + } + + // 51la 统计 + if (#{laEnable}) { + fetch("https://v6-widget.51.la/v6/#{ck}/quote.js") + .then(res => res.text()) + .then(data => { + let title = [i18nStats.today_visitors, i18nStats.today_views, i18nStats.yesterday_visitors, i18nStats.yesterday_views, i18nStats.month_views, i18nStats.total_views]; + let num = data.match(/(<\/span>).*?(\/span><\/p>)/g); + + num = num.map(el => { + let val = el.replace(/(<\/span>)/g, ""); + let str = val.replace(/(<\/span><\/p>)/g, ""); + return str; + }); + + // 跳过第一个"最近活跃" + num = num.slice(1); + renderStatistic(title, num); + statisticUP(); + }) + .catch(err => { + console.error("51la stats fetch failed:", err); + if (statisticEl) statisticEl.innerHTML = "
" + i18nStats.fetch_failed + "
"; + }); + } + + // Umami 统计 + if (#{umamiEnable}) { + const apiHost = "#{umamiApiHost}"; + const websiteId = "#{umamiWebsiteId}"; + const token = "#{umamiToken}"; + + const now = Date.now(); + const todayStart = new Date().setHours(0, 0, 0, 0); + const yesterdayStart = todayStart - 86400000; + const monthStart = new Date(new Date().getFullYear(), new Date().getMonth(), 1).getTime(); + + const fetchStats = async (startAt, endAt) => { + const res = await fetch(`${apiHost}/api/websites/${websiteId}/stats?startAt=${startAt}&endAt=${endAt}`, { + headers: { 'Authorization': `Bearer ${token}` } + }); + return res.json(); + }; + + Promise.all([ + fetchStats(todayStart, now), // today + fetchStats(yesterdayStart, todayStart), // yesterday + fetchStats(monthStart, now), // month + fetchStats(0, now) // total + ]) + .then(([today, yesterday, month, total]) => { + const title = [i18nStats.today_visitors, i18nStats.today_views, i18nStats.yesterday_visitors, i18nStats.yesterday_views, i18nStats.month_views, i18nStats.total_views]; + const num = [ + today.visitors?.value || today.uniques?.value || 0, + today.pageviews?.value || 0, + yesterday.visitors?.value || yesterday.uniques?.value || 0, + yesterday.pageviews?.value || 0, + month.pageviews?.value || 0, + total.pageviews?.value || 0 + ]; + + renderStatistic(title, num); + statisticUP(); + }) + .catch(err => { + console.error("Umami stats fetch failed:", err); + if (statisticEl) statisticEl.innerHTML = "
" + i18nStats.fetch_failed + "
"; + }); + } + + // 出生年份动画 + const selfInfoContentYear = new CountUp("selfInfo-content-year", 0, #{selfInfoContentYear}, 0, 2, { + useEasing: true, + useGrouping: false, + separator: ",", + decimal: ".", + prefix: "", + suffix: "", + }); + + let selfInfoContentYearElement = document.querySelector(".author-content-item.selfInfo.single"); + function selfInfoContentYearUp() { + if (!selfInfoContentYearElement) return; + + const callback = (entries, observer) => { + entries.forEach(entry => { + if (entry.isIntersecting) { + selfInfoContentYear.start(); + observer.disconnect(); + } + }); + }; + + const options = { root: null, rootMargin: "0px", threshold: 0 }; + const observer = new IntersectionObserver(callback, options); + observer.observe(selfInfoContentYearElement); + } + + selfInfoContentYearUp(); + + var pursuitInterval = null; + pursuitInterval = setInterval(function () { + const show = document.querySelector("span[data-show]"); + const next = show.nextElementSibling || document.querySelector(".first-tips"); + const up = document.querySelector("span[data-up]"); + + if (up) { + up.removeAttribute("data-up"); + } + + show.removeAttribute("data-show"); + show.setAttribute("data-up", ""); + + next.setAttribute("data-show", ""); + }, 2000); + + document.addEventListener("pjax:send", function () { + pursuitInterval && clearInterval(pursuitInterval); + }); + + var helloAboutEl = document.querySelector(".hello-about"); + helloAboutEl.addEventListener("mousemove", evt => { + const mouseX = evt.offsetX; + const mouseY = evt.offsetY; + gsap.set(".cursor", { + x: mouseX, + y: mouseY, + }); + + gsap.to(".shape", { + x: mouseX, + y: mouseY, + stagger: -0.1, + }); + }); + } + if (typeof gsap === "object") { + initAboutPage() + } else { + getScript("!{url_for(theme.asset.gsap_js)}").then(initAboutPage); + } \ No newline at end of file diff --git a/blog/themes/anzhiyu/layout/includes/page/album.pug b/blog/themes/anzhiyu/layout/includes/page/album.pug new file mode 100644 index 0000000..c35ec25 --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/page/album.pug @@ -0,0 +1,22 @@ +#album + - let album_background = page.top_background + .author-content.author-content-item.album.single(style=`${album_background ? `background: url(${album_background}) top / cover no-repeat;` : ""}`) + .card-content + .author-content-item-tips 相册集 + span.author-content-item-title 这里是我的相册集哦😯 + .content-bottom + .tips 每一张照片都是一次美好的记忆。 + .banner-button-group + a.banner-button(onclick='pjax.loadUrl("/about/")') + i.anzhiyufont.anzhiyu-icon-arrow-circle-right(style='font-size: 1.5rem') + span.banner-button-text 关于本人 + .card-album + each i in site.data.album + .card(onclick=`pjax.loadUrl("${i.path_name}")`) + img.card_cover(src=i.cover) + .card__content + p.card__category=i.class_name + h3.card__heading=i.description + .album-content-nocover + .album-content-nocover + .album-content-nocover diff --git a/blog/themes/anzhiyu/layout/includes/page/album_detail.pug b/blog/themes/anzhiyu/layout/includes/page/album_detail.pug new file mode 100644 index 0000000..aa8a375 --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/page/album_detail.pug @@ -0,0 +1,89 @@ +#album_detail + each i in site.data.album + - let path_name = (is_current(i.path_name)) ? true : false + - type = i.type + - let album_detail_background = i.top_background + - let album_detail_top_link = i.top_link + - let album_detail_top_btn_text = i.top_btn_text + if (path_name && i.album_list) + .author-content.author-content-item.album.single(style=`${album_detail_background ? `background: url(${album_detail_background}) top / cover no-repeat;` : ""}`) + .card-content + .author-content-item-tips 相册集 + span.author-content-item-title=i.class_name + .content-bottom + .tips=i.description + .banner-button-group + a.banner-button(onclick=`pjax.loadUrl("${url_for(album_detail_top_link ? album_detail_top_link : '/about')}")`, data-pjax-state) + i.anzhiyufont.anzhiyu-icon-arrow-circle-right(style='font-size: 1.5rem') + span.banner-button-text=album_detail_top_btn_text ? album_detail_top_btn_text : "关于我" + section.timeline.page-1 + if type == 1 + ul#waterfall.list + each item, index in i.album_list + li.album-item + .album-content + p.datacont= item.content + if item.image + .album-container-img + each iten, indey in item.image + a.album-content-img(href=item.image[indey], target="_blank", data-fancybox="gallery", data-caption="") + img(src=item.image[indey]) + .album-content-noimg + .album-content-noimg + .album-content-noimg + if item.aplayer + .album-music + .aplayer.no-destroy(data-id=item.aplayer.id data-server=item.aplayer.server data-type="song" data-order="list" data-preload="none" data-autoplay="false" data-mutex="true" data-theme='var(--anzhiyu-main)') + hr + .album-bottom + .album-info + .album-info-time + - var datedata = new Date(item.date).toISOString() + i.anzhiyufont.anzhiyu-icon-instagram + time.datatime(datetime= item.date)= datedata + if item.link + a.album-content-link(target="_blank", title="跳转到短文指引的链接", href=item.link, rel="external nofollow") + i.anzhiyufont.anzhiyu-icon-link + | 链接 + if item.address + .album-info-address + i.anzhiyufont.anzhiyu-icon-location-dot + span=item.address + if item.from + .album-info-from + i.anzhiyufont.anzhiyu-icon-fw-fire + span=item.from + .album-reply(onclick="rm.rightMenuCommentText(" + `'${item.content}'` + ")") + i.anzhiyufont.anzhiyu-icon-message + else if type == 2 + .type-gallery + - const rowHeight = i.rowHeight != "undefined" ? i.rowHeight : 220 + - const limit = i.limit != "undefined" ? i.limit : 10 + - const lazyload = i.lazyload != "undefined" ? i.lazyload : true + - const lazyloadClass = lazyload == true ? "lazyload" : ""; + - const btn = i.btnLazyload != "undefined" ? i.btnLazyload : false + - const btnLazyloadClass = btn == true ? " btn_album_detail_lazyload" : ""; + - const imgType = i.url ? " url" : " data"; + - let dataStr = [] + - let durl = i.url ?? false + each item, index in i.album_list + each iten, indey in item.image + - let obj = {} + - obj.url = iten + - obj.alt = item.content + - obj.title = item.content + - obj.address = item.address + - dataStr.push(obj) + .gallery + .fj-gallery(data-rowHeight=rowHeight data-limit=limit class=`${lazyloadClass + btnLazyloadClass + imgType}`) + if durl + span.gallery-data=durl + else + span.gallery-data=JSON.stringify(dataStr) + if btn + button.gallery-load-more + span=_p('load_more') + i.anzhiyufont.anzhiyu-icon-arrow-down + else + #album_detail_gallery_load_more + diff --git a/blog/themes/anzhiyu/layout/includes/page/categories.pug b/blog/themes/anzhiyu/layout/includes/page/categories.pug new file mode 100644 index 0000000..4b54d25 --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/page/categories.pug @@ -0,0 +1,2 @@ +#tag + .category-lists#tag-page-tags!= tags_page_list("categories") \ No newline at end of file diff --git a/blog/themes/anzhiyu/layout/includes/page/default-page.pug b/blog/themes/anzhiyu/layout/includes/page/default-page.pug new file mode 100644 index 0000000..e7057f7 --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/page/default-page.pug @@ -0,0 +1,2 @@ +#article-container + != page.content \ No newline at end of file diff --git a/blog/themes/anzhiyu/layout/includes/page/equipment.pug b/blog/themes/anzhiyu/layout/includes/page/equipment.pug new file mode 100644 index 0000000..4c091d6 --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/page/equipment.pug @@ -0,0 +1,32 @@ +#equipment + if site.data.equipment + each i in site.data.equipment + .author-content.author-content-item.fcirclePage.single(style = `background: url(${i.top_background}) left 37% / cover no-repeat !important;`) + .card-content + .author-content-item-tips=i.class_name + span.author-content-item-title=i.description + .content-bottom + .tips=i.tip + each item in i.good_things + .goodthings-item + h2.goodthings-title= item.title + .goodthings-item-description= item.description + .equipment-item + .equipment-item-content + each iten, indey in item.equipment_list + .equipment-item-content-item + .equipment-item-content-item-cover + img.equipment-item-content-item-image(data-lazy-src=url_for(iten.image) onerror=`this.onerror=null;this.src='` + url_for(theme.error_img.flink) + `'` alt=iten.name) + .equipment-item-content-item-info + .equipment-item-content-item-name(onclick=`rm.rightmenuCopyText("${iten.name}");anzhiyu.snackbarShow("${_p('Snackbar.copy_equipment_name') + " 【" + iten.name + "】"}");` title=iten.name)= iten.name + .equipment-item-content-item-specification= iten.specification + .equipment-item-content-item-description= iten.description + .equipment-item-content-item-toolbar + if iten.link.includes('https://') || iten.link.includes('http://') + a.equipment-item-content-item-link(href= iten.link, target='_blank') 详情 + .bber-reply(onclick="rm.rightMenuCommentText(" + `'${iten.name + " " + iten.specification + " " + iten.description}'` + ")") + i.anzhiyufont.anzhiyu-icon-message + else + a.equipment-item-content-item-link(href= iten.link, target='_blank') 查看文章 + .bber-reply(onclick="rm.rightMenuCommentText(" + `'${iten.name + " " + iten.specification + " " + iten.description}'` + ")") + i.anzhiyufont.anzhiyu-icon-message diff --git a/blog/themes/anzhiyu/layout/includes/page/essay.pug b/blog/themes/anzhiyu/layout/includes/page/essay.pug new file mode 100644 index 0000000..7f18a60 --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/page/essay.pug @@ -0,0 +1,67 @@ +if site.data.essay + each i in site.data.essay + #essay_page + .author-content.author-content-item.essayPage.single(style = i.top_background ? `background: url(${i.top_background}) left 28% / cover no-repeat;` : "") + .card-content + .author-content-item-tips=i.title + span.author-content-item-title=i.subTitle + .content-bottom + .tips=i.tips + .banner-button-group + a.banner-button(href=i.buttonLink) + i.anzhiyufont.anzhiyu-icon-arrow-circle-right + span.banner-button-text=i.buttonText + #bber + section.timeline.page-1 + ul#waterfall.list + each item, index in i.essay_list + if index < i.limit + li.bber-item + .bber-content + p.datacont= item.content + if item.image + .bber-container-img + each iten, indey in item.image + a.bber-content-img(href=url_for(item.image[indey]), target="_blank", data-fancybox="gallery", data-caption="") + img(src=url_for(item.image[indey])) + .bber-content-noimg + .bber-content-noimg + .bber-content-noimg + if item.video + .bber-container-img + each iten, indey in item.video + if (item.video[indey].includes('player.bilibili.com')) + div(style="position: relative; padding: 30% 45%;margin-top: 10px;margin-bottom: 10px;") + iframe(style="position: absolute; width: 100%; height: 100%; left: 0; top: 0;margin: 0;border-radius: 12px;border: var(--style-border);" src=url_for(item.video[indey]) scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true") + else + a.bber-content-video(href=url_for(item.video[indey]) data-fancybox="gallery", data-caption="") + video(src=url_for(item.video[indey])) + .bber-content-noimg + .bber-content-noimg + .bber-content-noimg + if item.aplayer + .bber-music + meting-js(id=item.aplayer.id, server=item.aplayer.server, type="song", mutex="true",preload="none", theme="var(--anzhiyu-main)", data-lrctype="0", order="list") + hr + .bber-bottom + .bber-info + .bber-info-time + - var datedata = new Date(item.date).toISOString() + i.anzhiyufont.anzhiyu-icon-clock + time.datatime(datetime= item.date)= datedata + if item.link + a.bber-content-link(title="跳转到短文指引的链接", href=url_for(item.link), rel="external nofollow") + i.anzhiyufont.anzhiyu-icon-link + | 链接 + if item.from + .bber-info-from + i.anzhiyufont.anzhiyu-icon-fw-fire + span=item.from + if item.address + .bber-info-from + i.anzhiyufont.anzhiyu-icon-location-dot + span=item.address + .bber-reply(onclick="rm.rightMenuCommentText(" + `'${item.content}'` + ")") + i.anzhiyufont.anzhiyu-icon-message + #bber-tips(style='color: var(--anzhiyu-secondtext);') + ="- 只展示最近" + i.limit + "条短文 -" diff --git a/blog/themes/anzhiyu/layout/includes/page/fcircle.pug b/blog/themes/anzhiyu/layout/includes/page/fcircle.pug new file mode 100644 index 0000000..1fe9e11 --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/page/fcircle.pug @@ -0,0 +1,25 @@ +if theme.friends_vue.enable + .fcircle_page + .author-content.author-content-item.fcirclePage.single(style = `background: url(${theme.friends_vue.top_background}) left 28% / cover no-repeat !important;`) + .card-content + .author-content-item-tips=_p('flink.friend_links') + span.author-content-item-title=_p('flink.latest_articles') + .content-bottom + .tips=theme.friends_vue.top_tips + .banner-button-group + a.banner-button(onclick='pjax.loadUrl("/about")') + i.anzhiyufont.anzhiyu-icon-arrow-circle-right(style='font-size: 22px; margin-right: 0.25rem') + span.banner-button-text=_p('flink.about_me') + .title-h2-a + .title-h2-a-left + h2(style='padding-top:0;margin:.6rem 0 .6rem')=_p('flink.fishing') + a.random-post-start(href='javascript:fetchRandomPost();') + i.anzhiyufont.anzhiyu-icon-arrow-rotate-right + .title-h2-a-right + a.random-post-all(href='/link/')=_p('flink.all_links') + #random-post + #hexo-circle-of-friends-root + + if (theme.friends_vue.apiurl) + script(defer data-pjax src=url_for(theme.asset.random_friends_post_js)) + script(defer data-pjax src=url_for(theme.friends_vue.vue_js)) diff --git a/blog/themes/anzhiyu/layout/includes/page/flink.pug b/blog/themes/anzhiyu/layout/includes/page/flink.pug new file mode 100644 index 0000000..747da16 --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/page/flink.pug @@ -0,0 +1,132 @@ +#article-container + if theme.linkPageTop && theme.linkPageTop.enable + #flink-banners + .banner-top-box + .flink-banners-title + .banners-title-small=_p('flink.title') + .banners-title-big=theme.linkPageTop ? theme.linkPageTop.title : _p('flink.title') + .banner-button-group + if (theme.friends_vue.apiurl) + a.banner-button.secondary.no-text-decoration(onclick="friendChainRandomTransmission()") + i.anzhiyufont.anzhiyu-icon-paper-plane1 + span.banner-button-text=_p('flink.random_visit') + if theme.linkPageTop.addFriendPlaceholder && theme.comments.use == 'Twikoo' && theme.twikoo.envId + a.banner-button.no-text-decoration(onclick="anzhiyu.addFriendLink()") + i.anzhiyufont.anzhiyu-icon-arrow-circle-right + span.banner-button-text=_p('flink.apply_link') + #skills-tags-group-all + .tags-group-wrapper + - function getAvatarWithoutExclamationMark(url) { + - const index = url.indexOf('!'); + - return index !== -1 ? url.substring(0, index) : url; + - } + each y in [1,2] + each i, index in site.data.link.slice(0, 15) + - const link_list = i.link_list.slice() + - const hundredSuffix = i.hundredSuffix ? i.hundredSuffix : "" + - const evenNum = link_list.filter((x, index) => index % 2 === 0); + - const oddNum = link_list.filter((x, index) => index % 2 === 1); + each item, index2 in link_list.slice(0, Math.min(evenNum.length, oddNum.length)) + - const index = index2 * 2 + if (index <= 15 && typeof evenNum[index] !== 'undefined' && typeof oddNum[index] !== 'undefined') + - let oddNumAvatar = getAvatarWithoutExclamationMark(oddNum[index].avatar); + - let evenNumAvatar = getAvatarWithoutExclamationMark(evenNum[index].avatar); + .tags-group-icon-pair + a.tags-group-icon.no-text-decoration(href=url_for(evenNum[index].link), title=evenNum[index].name) + img.no-lightbox(title=evenNum[index].name, src=url_for(evenNumAvatar + hundredSuffix) onerror=`this.onerror=null;this.src='` + url_for(theme.error_img.flink) + `'` alt=evenNum[index].name) + a.tags-group-icon.no-text-decoration(href=url_for(oddNum[index].link), title=oddNum[index].name) + img.no-lightbox(title=oddNum[index].name, src=url_for(oddNumAvatar + hundredSuffix) onerror=`this.onerror=null;this.src='` + url_for(theme.error_img.flink) + `'` alt=oddNum[index].name) + if theme.friends_vue && theme.friends_vue.enable + .title-h2-a + .title-h2-a-left + h2(style='padding-top:0;margin:.6rem 0 .6rem')=_p('flink.fishing') + a.random-post-start.no-text-decoration(href='javascript:fetchRandomPost();') + i.anzhiyufont.anzhiyu-icon-arrow-rotate-right + .title-h2-a-right + a.random-post-all.no-text-decoration(href='/link/')=_p('flink.all_links') + #random-post + script(defer data-pjax src=url_for(theme.asset.random_friends_post_js)) + + .flink + if site.data.link + each i in site.data.link + if i.class_name + h2!= i.class_name + "(" + i.link_list.length + ")" + if i.class_desc + .flink-desc!=i.class_desc + if i.flink_style === 'anzhiyu' + div(class=i.lost_contact ? 'anzhiyu-flink-list cf-friends-lost-contact' : 'anzhiyu-flink-list') + if i.link_list + each item in i.link_list + - let color = item.color || "" + - let tag = item.tag || "" + + .flink-list-item + if color == "vip" && tag + span.site-card-tag.vip #[=tag] + i.light + else if color == "speed" && tag + span.site-card-tag.speed #[=tag] + else if tag + span.site-card-tag(style=`background-color: ${color}`) #[=tag] + else if item.recommend + span.site-card-tag=_p('flink.recommend') + if i.lost_contact + a.cf-friends-link(href=url_for(item.link) title=item.name target="_blank") + if theme.lazyload.enable + img.no-lightbox(data-lazy-src=url_for(item.avatar) onerror=`this.onerror=null;this.src='` + url_for(theme.error_img.flink) + `'` alt=item.name ) + else + img.cf-friends-avatar.no-lightbox(src=url_for(item.avatar) onerror=`this.onerror=null;this.src='` + url_for(theme.error_img.flink) + `'` alt=item.name ) + .flink-item-info + .flink-item-name.cf-friends-name-lost-contact= item.name + else + a.cf-friends-link(href=url_for(item.link) cf-href=url_for(item.link) title=item.name target="_blank") + if theme.lazyload.enable + img.cf-friends-avatar.no-lightbox(data-lazy-src=url_for(item.avatar), cf-src=url_for(item.avatar), onerror=`this.onerror=null;this.src='` + url_for(theme.error_img.flink) + `'` alt=item.name ) + else + img.cf-friends-avatar.no-lightbox(src=url_for(item.avatar) cf-src=url_for(item.avatar) onerror=`this.onerror=null;this.src='` + url_for(theme.error_img.flink) + `'` alt=item.name ) + .flink-item-info + .flink-item-name.cf-friends-name= item.name + .flink-item-desc(title=item.descr)= item.descr + + else if i.flink_style === 'telescopic' + .telescopic-site-card-group + each item in i.link_list + - let color = item.color || "" + - let tag = item.tag || "" + - let siteshot = item.siteshot || `https://image.thum.io/get/width/400/crop/800/allowJPG/wait/20/noanimate/${item.link}` || theme.default_img + .site-card + if color == "vip" && tag + span.site-card-tag.vip #[=tag] + i.light + else if color == "speed" && tag + span.site-card-tag.speed #[=tag] + else if tag + span.site-card-tag(style=`background-color: ${color}`) #[=tag] + else if item.recommend + span.site-card-tag=_p('flink.recommend') + a.img.no-text-decoration(target='_blank', title=`${item.name}`, href=`${item.link}`, rel='external nofollow') + img.flink-avatar(data-lazy-src=siteshot, onerror=`this.onerror=null;this.src='${theme.default_img}'`, alt=item.name, style="pointer-events: none;", src=`${siteshot}`) + a.info.cf-friends-link.no-text-decoration(target='_blank', title=`${item.name}`, href=`${item.link}`, cf-href=url_for(item.link), rel='external nofollow') + .site-card-avatar + img.flink-avatar.cf-friends-avatar.no-fancybox(data-lazy-src=item.avatar, cf-src=url_for(item.avatar), onerror=`this.onerror=null;this.src='${theme.default_img}'`, alt=item.name, src=item.avatar) + .site-card-text + span.title.cf-friends-name #[=item.name] + span.desc(title=`${item.descr}`) #[=item.descr] + else if i.flink_style === 'flexcard' + .flexcard-flink-list + each item in i.link_list + a.flink-list-card.cf-friends-link(href=url_for(item.link) cf-href=url_for(item.link) target='_blank' data-title=item.descr) + .wrapper.cover + - var siteshot = item.siteshot ? url_for(item.siteshot) : 'https://image.thum.io/get/width/400/crop/800/allowJPG/wait/20/noanimate/' + item.link + if theme.lazyload.enable + img.cover.fadeIn(data-lazy-src=siteshot onerror=`this.onerror=null;this.src='` + url_for(theme.error_img.post_page) + `'` alt='cover' ) + else + img.cover.fadeIn(src=siteshot onerror=`this.onerror=null;this.src='` + url_for(theme.error_img.post_page) + `'` alt='cover' ) + .info + if theme.lazyload.enable + img.cf-friends-avatar.no-lightbox.flink-avatar(data-lazy-src=url_for(item.avatar) cf-src=url_for(item.avatar) onerror=`this.onerror=null;this.src='` + url_for(theme.error_img.flink) + `'` alt='cover' ) + else + img.cf-friends-avatar.no-lightbox(src=url_for(item.avatar) cf-src=url_for(item.avatar) onerror=`this.onerror=null;this.src='` + url_for(theme.error_img.flink) + `'` alt='cover' ) + span.flink-sitename.cf-friends-name= item.name + != page.content diff --git a/blog/themes/anzhiyu/layout/includes/page/music.pug b/blog/themes/anzhiyu/layout/includes/page/music.pug new file mode 100644 index 0000000..fcc7f51 --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/page/music.pug @@ -0,0 +1,8 @@ +#anMusic-page + #anMusicBtnGetSong(title="随机周董单曲,打开异世界的大梦") + i(class="anzhiyufont anzhiyu-icon-shuffle") + #anMusicRefreshBtn(title="立即刷新最新歌单") + i(class="anzhiyufont anzhiyu-icon-arrows-rotate") + #anMusicSwitching(title="切换歌单") + i(class="anzhiyufont anzhiyu-icon-repeat") + #anMusic-page-meting \ No newline at end of file diff --git a/blog/themes/anzhiyu/layout/includes/page/room.pug b/blog/themes/anzhiyu/layout/includes/page/room.pug new file mode 100644 index 0000000..06603ef --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/page/room.pug @@ -0,0 +1,278 @@ +#room_page + div.house#h + div.h-lights + div.h-light + div.h-light + div.h-light + div.h-light + div.h-light + div.h-light + + div.h-shadow + //--------------------- + div.alt + div.alt__front.face + div.alt__back.face + div.alt__right.face + div.alt__left.face + div.alt__top.face + div.light + div.light + div.light + div.light + div.light + div.light + div.light + div.light + div.light + div.alt__bottom.face + div.alb + div.alb__front.face + div.alb__back.face + div.alb__right.face + div.alb__left.face + div.alb__top.face + div.alb__bottom.face + div.arb + div.arb__front.face + div.arb__back.face + div.arb__right.face + div.arb__left.face + div.arb__top.face + div.arb__bottom.face + //--------------------- + div.blt + div.blt__front.face + div.blt__back.face + div.blt__right.face + div.blt__left.face + div.blt__top.face + div.blt__bottom.face + div.blt2 + div.blt2__front.face + div.blt2__back.face + div.blt2__right.face + div.blt2__left.face + div.blt2__top.face + div.blt2__bottom.face + div.blb + div.blb__front.face + div.blb__back.face + div.blb__right.face + div.blb__left.face + div.blb__top.face + div.blb__bottom.face + div.blb2 + div.blb2__front.face + div.blb2__back.face + div.blb2__right.face + div.blb2__left.face + div.blb2__top.face + div.blb2__bottom.face + //--------------------- + div.puerta-c + div.puerta + div.puerta__front.face + div.puerta__back.face + div.puerta__right.face + div.puerta__left.face + div.puerta__top.face + div.puerta__bottom.face + div.puerta-l + div.puerta-l__front.face + div.puerta-l__back.face + div.puerta-l__right.face + div.puerta-l__left.face + div.puerta-l__top.face + div.puerta-l__bottom.face + div.puerta-r + div.puerta-r__front.face + div.puerta-r__back.face + div.puerta-r__right.face + div.puerta-r__left.face + div.puerta-r__top.face + div.puerta-r__bottom.face + div.puerta-t + div.puerta-t__front.face + div.puerta-t__back.face + div.puerta-t__right.face + div.puerta-t__left.face + div.puerta-t__top.face + div.puerta-t__bottom.face + div.cuadro-l + div.cuadro-l__front.face + div.cuadro-l__back.face + div.cuadro-l__right.face + div.cuadro-l__left.face + div.cuadro-l__top.face + div.cuadro-l__bottom.face + div.cuadro-r + div.cuadro-r__front.face + div.cuadro-r__back.face + div.cuadro-r__right.face + div.cuadro-r__left.face + div.cuadro-r__top.face + div.cuadro-r__bottom.face + div.librero + div.librero__front.face + div.librero__back.face + div.librero__right.face + div.librero__left.face + div.librero__top.face + div.librero__bottom.face + div.libros + - let lb = 0 + while lb < 6 + div.libro + div.libro__front.face + div.libro__back.face + div.libro__right.face + div.libro__left.face + div.libro__top.face + div.libro__bottom.face + - lb++ + div.fotos + - let ft = 0 + while ft < 2 + div.foto + div.foto__front.face + div.foto__back.face + div.foto__right.face + div.foto__left.face + div.foto__top.face + div.foto__bottom.face + - ft++ + div.cajas + - let cj = 0 + while cj < 3 + div.caja + div.caja__front.face + div.caja__back.face + div.caja__right.face + div.caja__left.face + div.caja__top.face + div.caja__bottom.face + - cj++ + div.tv + div.tv__front.face + div.tv__back.face + div.tv__right.face + div.tv__left.face + div.tv__top.face + div.tv__bottom.face + div.repisa-t + div.repisa-t__front.face + div.repisa-t__back.face + div.repisa-t__right.face + div.repisa-t__left.face + div.repisa-t__top.face + div.repisa-t__bottom.face + div.repisa-b + div.repisa-b__front.face + div.repisa-b__back.face + div.repisa-b__right.face + div.repisa-b__left.face + div.repisa-b__top.face + div.repisa-b__bottom.face + div.bocina-l + div.bocina-l__front.face + div.bocina-l__back.face + div.bocina-l__right.face + div.bocina-l__left.face + div.bocina-l__top.face + div.bocina-l__bottom.face + div.bocina-r + div.bocina-r__front.face + div.bocina-r__back.face + div.bocina-r__right.face + div.bocina-r__left.face + div.bocina-r__top.face + div.bocina-r__bottom.face + div.muro + div.muro__front.face + div.muro__back.face + div.muro__right.face + div.muro__left.face + div.muro__top.face + div.muro__bottom.face + div.sillon-c + div.sillon-b + div.sillon-b__front.face + div.sillon-b__back.face + div.sillon-b__right.face + div.sillon-b__left.face + div.sillon-b__top.face + div.sillon-b__bottom.face + div.sillon-t + div.sillon-t__front.face + div.sillon-t__back.face + div.sillon-t__right.face + div.sillon-t__left.face + div.sillon-t__top.face + div.sillon-t__bottom.face + div.sillon-l + div.sillon-l__front.face + div.sillon-l__back.face + div.sillon-l__right.face + div.sillon-l__left.face + div.sillon-l__top.face + div.sillon-l__bottom.face + div.sillon-r + div.sillon-r__front.face + div.sillon-r__back.face + div.sillon-r__right.face + div.sillon-r__left.face + div.sillon-r__top.face + div.sillon-r__bottom.face + div.mesa-c + div.mesa + div.mesa__front.face + div.mesa__back.face + div.mesa__right.face + div.mesa__left.face + div.mesa__top.face + div.mesa__bottom.face + + - let np = 0 + while np < 4 + div.mesa-p + div.mesa-p__front.face + div.mesa-p__back.face + div.mesa-p__right.face + div.mesa-p__left.face + div.mesa-p__top.face + div.mesa-p__bottom.face + - np++ + + div.mesa-shadow + div.tablet + div.tablet__front.face + div.tablet__back.face + div.tablet__right.face + div.tablet__left.face + div.tablet__top.face + div.tablet__bottom.face + + .description + span 哇,被你发现了,这里是我的小房间,要一起玩游戏🎮嘛 + .banner-button-group + a.banner-button(onclick='pjax.loadUrl("/about/")') + i.anzhiyufont.anzhiyu-icon-arrow-circle-right(style='font-size: 1.5rem') + span.banner-button-text 立刻玩 + script(async). + const h = document.querySelector("#h"); + const b = document.body; + + let base = e => { + var x = e.pageX / window.innerWidth - 0.5; + var y = e.pageY / window.innerHeight - 0.5; + h.style.transform = ` + perspective(90vw) + rotateX(${y * 4 + 75}deg) + rotateZ(${-x * 12 + 45}deg) + translateZ(-9vw) + translateX(-50%) + `; + }; + + b.addEventListener("pointermove", base); \ No newline at end of file diff --git a/blog/themes/anzhiyu/layout/includes/page/tags.pug b/blog/themes/anzhiyu/layout/includes/page/tags.pug new file mode 100644 index 0000000..b9e7d8c --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/page/tags.pug @@ -0,0 +1,4 @@ +.tag-cloud-list.is-center + #tag + #tag-page-tags + !=tags_page_list("tags") \ No newline at end of file diff --git a/blog/themes/anzhiyu/layout/includes/pagination.pug b/blog/themes/anzhiyu/layout/includes/pagination.pug new file mode 100644 index 0000000..c840e48 --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/pagination.pug @@ -0,0 +1,42 @@ +- + var options = { + prev_text: '
上页
', + next_text: '
下页
', + mid_size: 1, + escape: false + } + +if is_post() + - let prev = theme.post_pagination === 1 || theme.post_pagination === 3 || theme.post_pagination === 4 ? page.prev : page.next + - let next = theme.post_pagination === 1 || theme.post_pagination === 3 || theme.post_pagination === 4 ? page.next : page.prev + nav#pagination.pagination-post + if(prev) + - var hasPageNext = next ? 'pull-left' : 'pull-full' + .prev-post(class=hasPageNext) + - var pagination_cover = prev.cover === false ? prev.randomcover : prev.cover + a(href=url_for(prev.path)) + img.prev-cover(src=url_for(pagination_cover) onerror=`onerror=null;src='${url_for(theme.error_img.post_page)}'` alt='cover of previous post') + .pagination-info + .label=_p('pagination.prev') + .prev_info=prev.title + + if(next) + - var hasPagePrev = prev ? 'pull-right' : 'pull-full' + - var pagination_cover = next.cover == false ? next.randomcover : next.cover + .next-post(class=hasPagePrev) + a(href=url_for(next.path)) + img.next-cover(src=url_for(pagination_cover) onerror=`onerror=null;src='${url_for(theme.error_img.post_page)}'` alt='cover of next post') + .pagination-info + .label=_p('pagination.next') + .next_info=next.title +else + nav#pagination + .pagination + if is_home() + - options.format = 'page/%d/#content-inner' + !=paginator(options) + if is_home() + div(class="toPageGroup") + input(id="toPageText" oninput="value=value.replace(/[^0-9]/g,'')" maxlength="3" onkeyup="this.value=this.value.replace(/[^u4e00-u9fa5w]/g,'')" aria-label="toPage") + a(id="toPageButton" onclick="anzhiyu.toPage()") + i.anzhiyufont.anzhiyu-icon-angles-right(style="font-weight: inherit; font-size: 1rem;") \ No newline at end of file diff --git a/blog/themes/anzhiyu/layout/includes/popup/index.pug b/blog/themes/anzhiyu/layout/includes/popup/index.pug new file mode 100644 index 0000000..23b6132 --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/popup/index.pug @@ -0,0 +1,7 @@ +#popup-window + .popup-window-title 通知 + .popup-window-divider + .popup-window-content + .popup-tip 你好呀 + .popup-link + i.anzhiyufont.anzhiyu-icon-arrow-circle-right diff --git a/blog/themes/anzhiyu/layout/includes/post/post-copyright.pug b/blog/themes/anzhiyu/layout/includes/post/post-copyright.pug new file mode 100644 index 0000000..dcd50c8 --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/post/post-copyright.pug @@ -0,0 +1,63 @@ +if theme.post_copyright.enable && page.copyright !== false + - let author = page.copyright_author || config.author + - let url = page.copyright_url || page.permalink + - let info = page.copyright_info || _p('post.copyright.copyright_content', theme.post_copyright.license_url, theme.post_copyright.license, config.url, config.title) + .post-copyright + .copyright-cc-box + i.anzhiyufont.anzhiyu-icon-copyright + .post-copyright__author_box + - let copyright_author_img_back = theme.post_copyright.copyright_author_img_back ? theme.post_copyright.copyright_author_img_back : theme.avatar.img + - let copyright_author_img_front = theme.post_copyright.copyright_author_img_front ? theme.post_copyright.copyright_author_img_front : theme.avatar.img + - let copyright_author_link = theme.post_copyright.copyright_author_link ? theme.post_copyright.copyright_author_link : '/' + a.post-copyright__author_img(href=url_for(copyright_author_link) title='头像') + img.post-copyright__author_img_back(src=url_for(copyright_author_img_back) title='头像' alt='头像') + img.post-copyright__author_img_front(src=url_for(copyright_author_img_front) title="头像" alt='头像') + .post-copyright__author_name=author + .post-copyright__author_desc=config.subtitle + .post-copyright__post__info + if (page.copyright_author && page.copyright_author !== config.author) + a.post-copyright__reprint(title="该文章为转载文章,注意版权协议" href=url_for(url)) 转载 + else + a.post-copyright__original(title="该文章为原创文章,注意版权协议" href=url_for(url)) 原创 + a.post-copyright-title + span(onclick=`rm.copyPageUrl('${theme.post_copyright.decode ? decodeURI(url) : url}')`)=pageTitle + //- ptool + if theme.ptool.enable + include ./ptool.pug + .post-copyright__notice + span.post-copyright-info!= info + .post-tools-right + if (!theme.ptool.categories) + .tag_share + .post-meta__box + if (theme.post_meta.post.tags) + .post-meta__box__tag-list + each item, index in page.tags.data + a(href=url_for(item.path)).post-meta__box__tags + span.tags-punctuation + i.anzhiyufont.anzhiyu-icon-tag + =item.name + span.tagsPageCount=item.length + + !=partial('includes/third-party/share/index.pug', {}, {cache: true}) + else + .tag_share + .post-meta__box + if (page.categories.data.length > 0) + .post-meta__box__category-list + each item, index in page.categories.data + a(href=url_for(item.path)).post-meta__box__categoryes + span.categoryes-punctuation + i.anzhiyufont.anzhiyu-icon-inbox + =item.name + span.categoryesPageCount=item.length + if (theme.post_meta.post.tags) + .post-meta__box__tag-list + each item, index in page.tags.data + a(href=url_for(item.path)).post-meta__box__tags + span.tags-punctuation + i.anzhiyufont.anzhiyu-icon-tag + =item.name + span.tagsPageCount=item.length + + !=partial('includes/third-party/share/index.pug', {}, {cache: true}) diff --git a/blog/themes/anzhiyu/layout/includes/post/ptool.pug b/blog/themes/anzhiyu/layout/includes/post/ptool.pug new file mode 100644 index 0000000..a462b92 --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/post/ptool.pug @@ -0,0 +1,54 @@ +- let url = page.copyright_url || page.permalink +if !theme.disable_top_img && page.top_img !== false + if is_post() + - var top_img = page.top_img || page.cover || page.randomcover + else if is_page() + - var top_img = page.top_img || theme.default_top_img + else if is_home() + - var top_img = theme.index_img !== false ? theme.index_img || theme.default_top_img : false + else + - var top_img = page.top_img || theme.default_top_img + + if top_img !== false + - var imgSource = top_img && top_img.indexOf('/') !== -1 ? url_for(top_img) : top_img + - var bg_img = top_img ? imgSource : '' + - var site_title = page.title || page.tag || page.category || config.title +#post-tools.post-tools + .post-tools-left + div.rewardLeftButton + if theme.reward.enable && theme.reward.QR_code + !=partial('includes/post/reward', {}, {cache: true}) + if theme.ptool.mode + .reward-link.mode + a.reward-link-button(href=url_for(theme.ptool.mode)) + i.anzhiyufont.anzhiyu-icon-plant-fill + | 运营模式与责任 + div.shareRight + if theme.ptool.share_mobile + .share-link.mobile + .share-qrcode + .share-button(title='使用手机访问这篇文章') + i.anzhiyufont.anzhiyu-icon-qrcode + .share-main + .share-main-all + #qrcode(title=url) + .reward-dec 使用手机访问这篇文章 + if theme.ptool.share_weibo + .share-link.weibo + a.share-button(target='_blank' href=`https://service.weibo.com/share/share.php?title=${site_title}&url=${url}&pic=${bg_img}` rel='external nofollow noreferrer noopener') + i.anzhiyufont.anzhiyu-icon-weibo + if theme.ptool.share_copyurl + script. + function copyCurrentPageUrl() { + var currentPageUrl = window.location.href; + var input = document.createElement("input"); + input.setAttribute("value", currentPageUrl); + document.body.appendChild(input); + input.select(); + input.setSelectionRange(0, 99999); + document.execCommand("copy"); + document.body.removeChild(input); + } + .share-link.copyurl + #post-share-url.share-button(title='复制链接' onclick='copyCurrentPageUrl()') + i.anzhiyufont.anzhiyu-icon-link diff --git a/blog/themes/anzhiyu/layout/includes/post/reward.pug b/blog/themes/anzhiyu/layout/includes/post/reward.pug new file mode 100644 index 0000000..335ab21 --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/post/reward.pug @@ -0,0 +1,18 @@ +.post-reward(onclick='anzhiyu.addRewardMask()') + .reward-button.button--animated(title=_p('reward.title')) + i.anzhiyufont.anzhiyu-icon-hand-heart-fill + =_p('reward.button') + .reward-main + .reward-all + span.reward-title=_p('reward.thanks') + ul.reward-group + each item in theme.reward.QR_code + - var clickTo = item.link ? item.link : item.img + li.reward-item + a(href=url_for(clickTo) target='_blank') + img.post-qr-code-img(src=url_for(item.img) alt=item.text) + .post-qr-code-desc=item.text + a.reward-main-btn(href='/about/#about-reward' target='_blank') + .reward-text=_p('reward.list') + .reward-dec=_p('reward.list_desc') +#quit-box(onclick="anzhiyu.removeRewardMask()" style="display: none") \ No newline at end of file diff --git a/blog/themes/anzhiyu/layout/includes/rightside.pug b/blog/themes/anzhiyu/layout/includes/rightside.pug new file mode 100644 index 0000000..4835636 --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/rightside.pug @@ -0,0 +1,63 @@ +- const { readmode, translate, darkmode, aside, chat_btn } = theme +mixin rightsideItem(array) + each item in array + case item + when 'readmode' + if is_post() && readmode + button#readmode(type="button" title=_p('rightside.readmode_title')) + i.anzhiyufont.anzhiyu-icon-book-open + when 'translate' + if translate.enable + button#translateLink(type="button" title=_p('rightside.translate_title'))= translate.default + when 'darkmode' + if darkmode.enable && darkmode.button + button#darkmode(type="button" title=_p('rightside.night_mode_title')) + i.anzhiyufont.anzhiyu-icon-circle-half-stroke + when 'hideAside' + if aside.enable && aside.button && page.aside !== false + button#hide-aside-btn(type="button" title=_p('rightside.aside')) + i.anzhiyufont.anzhiyu-icon-arrows-left-right + when 'toc' + if showToc + button#mobile-toc-button.close(type="button" title=_p("rightside.toc")) + i.anzhiyufont.anzhiyu-icon-list-ul + when 'chat' + if chat_btn && (theme.chatra.enable || theme.tidio.enable || theme.daovoice.enable || theme.crisp.enable) + button#chat-btn(type="button" title=_p("rightside.chat")) + i.anzhiyufont.anzhiyu-icon-comment-sms + when 'comment' + if commentsJsLoad + a#to_comment(href="#post-comment" title=_p("rightside.scroll_to_comment")) + i.anzhiyufont.anzhiyu-icon-comments + if theme.comment_barrage_config && theme.comment_barrage_config.enable + a#switch-commentBarrage(href="javascript:anzhiyu.switchCommentBarrage();" title="开关弹幕") + i.anzhiyufont.anzhiyu-icon-danmu + +#rightside + - const { enable, hide, show } = theme.rightside_item_order + - const hideArray = enable ? hide && hide.split(',') : ['readmode','translate','darkmode','hideAside'] + - const showArray = enable ? show && show.split(',') : ['toc','chat','comment'] + + + #rightside-config-hide + if hideArray + +rightsideItem(hideArray) + #rightside-config-show + if enable + if hide + button#rightside-config(type="button" title=_p("rightside.setting")) + i.anzhiyufont.anzhiyu-icon-gear + else + if is_post() + if (readmode || translate.enable || (darkmode.enable && darkmode.button)) + button#rightside-config(type="button" title=_p("rightside.setting")) + i.anzhiyufont.anzhiyu-icon-gear + else if translate.enable || (darkmode.enable && darkmode.button) + button#rightside-config(type="button" title=_p("rightside.setting")) + i.anzhiyufont.anzhiyu-icon-gear + + if showArray + +rightsideItem(showArray) + + button#go-up(type="button" title=_p("rightside.back_to_top")) + i.anzhiyufont.anzhiyu-icon-arrow-up \ No newline at end of file diff --git a/blog/themes/anzhiyu/layout/includes/shortcutKey.pug b/blog/themes/anzhiyu/layout/includes/shortcutKey.pug new file mode 100644 index 0000000..b793fbd --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/shortcutKey.pug @@ -0,0 +1,23 @@ +- + const shortcutItems = [ + { key: 'K', content: _p('shortcut.close_shortcut') }, + { key: 'A', content: _p('shortcut.toggle_console') }, + { key: 'M', content: _p('shortcut.play_music') }, + { key: 'D', content: _p('shortcut.toggle_mode') }, + { key: 'S', content: _p('shortcut.search') }, + { key: 'R', content: _p('shortcut.random') }, + { key: 'H', content: _p('shortcut.home') }, + { key: 'F', content: _p('shortcut.fish_pond') }, + { key: 'L', content: _p('shortcut.links') }, + { key: 'P', content: _p('shortcut.about') }, + { key: 'I', content: _p('shortcut.context_menu') } + ] +#keyboard-tips(class='') + .keyboardTitle=_p('shortcut.title') + .keybordList + each item in shortcutItems + .keybordItem + .keyGroup + .key= "shift " + item.key + .keyContent + .content= item.content diff --git a/blog/themes/anzhiyu/layout/includes/sidebar.pug b/blog/themes/anzhiyu/layout/includes/sidebar.pug new file mode 100644 index 0000000..98c3568 --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/sidebar.pug @@ -0,0 +1,50 @@ +#sidebar + #menu-mask + #sidebar-menus + if theme.sidebar && theme.sidebar.site_data + .sidebar-site-data.site-data.is-center + if theme.sidebar.site_data.archive + a(href=url_for(config.archive_dir) + '/', title='archive') + .headline= _p('aside.articles') + .length-num= site.posts.length + if theme.sidebar.site_data.tag + a(href=url_for(config.tag_dir) + '/', title='tag' ) + .headline= _p('aside.tags') + .length-num= site.tags.length + if theme.sidebar.site_data.category + a(href=url_for(config.category_dir) + '/', title='category') + .headline= _p('aside.categories') + .length-num= site.categories.length + if theme.sidebar && theme.sidebar.display_mode + span.sidebar-menu-item-title=_p("aside.function") + .sidebar-menu-item + a.darkmode_switchbutton.menu-child(href='javascript:void(0);' title=_p("aside.display_mode")) + i.anzhiyufont.anzhiyu-icon-circle-half-stroke + span=_p("aside.display_mode") + if theme.sidebar && theme.sidebar.nav_menu_project + .back-menu-list-groups + each group in theme.nav.menu + .back-menu-list-group + .back-menu-list-title= group.title + .back-menu-list + each item in group.item + a.back-menu-item(href=url_for(item.link), title=item.name) + img.back-menu-item-icon(src=item.icon alt=item.name) + span.back-menu-item-text= item.name + + if theme.sidebar && theme.sidebar.menus_items + !=partial('includes/header/menu_item', {}, {cache: true}) + + if theme.sidebar && theme.sidebar.tags_cloud + span.sidebar-menu-item-title 标签 + if theme.aside.card_tags.enable + if site.tags.length + .card-tags + .item-headline + - let tagLimit = theme.aside.card_tags.limit === 0 ? 0 : theme.aside.card_tags.limit || 40 + if theme.aside.card_tags.color + .card-tag-cloud!= cloudTags({source: site.tags, minfontsize: 0.875, maxfontsize: 0.875, limit: tagLimit, unit: 'rem', color: true, highlightTags: theme.aside.card_tags.highlightTags}) + else + .card-tag-cloud!= cloudTags({source: site.tags, minfontsize: 0.875, maxfontsize: 0.875, limit: tagLimit, unit: 'rem', color: false, highlightTags: theme.aside.card_tags.highlightTags}) + hr + diff --git a/blog/themes/anzhiyu/layout/includes/third-party/aplayer.pug b/blog/themes/anzhiyu/layout/includes/third-party/aplayer.pug new file mode 100644 index 0000000..c439c4c --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/third-party/aplayer.pug @@ -0,0 +1,3 @@ +link(rel='stylesheet' href=url_for(theme.asset.aplayer_css) media="print" onload="this.media='all'") +script(src=url_for(theme.asset.aplayer_js)) +script(src=url_for(theme.asset.meting_js)) \ No newline at end of file diff --git a/blog/themes/anzhiyu/layout/includes/third-party/card-post-count/artalk.pug b/blog/themes/anzhiyu/layout/includes/third-party/card-post-count/artalk.pug new file mode 100644 index 0000000..b5a1056 --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/third-party/card-post-count/artalk.pug @@ -0,0 +1,31 @@ +- const { server, site } = theme.artalk + +script. + (() => { + const getArtalkCount = async() => { + try { + const eleGroup = document.querySelectorAll('#recent-posts .artalk-count') + const keyArray = Array.from(eleGroup).map(i => i.getAttribute('data-page-key')) + + const headerList = { + method: 'GET', + } + + const searchParams = new URLSearchParams({ + 'site_name': '!{site}', + 'page_keys': keyArray + }) + + const res = await fetch(`!{server}/api/v2/stats/page_comment?${searchParams}`, headerList) + const result = await res.json() + + keyArray.forEach((key, index) => { + eleGroup[index].textContent = result.data[key] || 0 + }) + } catch (err) { + console.error(err) + } + } + + window.pjax ? getArtalkCount() : window.addEventListener('load', getArtalkCount) + })() \ No newline at end of file diff --git a/blog/themes/anzhiyu/layout/includes/third-party/card-post-count/index.pug b/blog/themes/anzhiyu/layout/includes/third-party/card-post-count/index.pug new file mode 100644 index 0000000..695f93a --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/third-party/card-post-count/index.pug @@ -0,0 +1,9 @@ +case theme.comments.use[0] + when 'Twikoo' + include ./twikoo.pug + when 'Valine' + include ./valine.pug + when 'Waline' + include ./waline.pug + when 'Artalk' + include ./artalk.pug \ No newline at end of file diff --git a/blog/themes/anzhiyu/layout/includes/third-party/card-post-count/twikoo.pug b/blog/themes/anzhiyu/layout/includes/third-party/card-post-count/twikoo.pug new file mode 100644 index 0000000..72a4223 --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/third-party/card-post-count/twikoo.pug @@ -0,0 +1,37 @@ +script. + (() => { + const getCommentUrl = () => { + const eleGroup = document.querySelectorAll('#recent-posts .article-title') + let urlArray = [] + eleGroup.forEach(i=>{ + urlArray.push(i.getAttribute('href')) + }) + return urlArray + } + + const getCount = () => { + const runTwikoo = () => { + twikoo.getCommentsCount({ + envId: '!{theme.twikoo.envId}', + region: '!{theme.twikoo.region}', + urls: getCommentUrl(), + includeReply: false + }).then(function (res) { + document.querySelectorAll('#recent-posts .twikoo-count').forEach((item,index) => { + item.textContent = res[index].count + }) + }).catch(function (err) { + console.log(err) + }) + } + + if (typeof twikoo === 'object') { + runTwikoo() + } else { + getScript('!{url_for(theme.asset.twikoo)}').then(runTwikoo) + } + } + + window.pjax ? getCount() : window.addEventListener('load', getCount) + + })() \ No newline at end of file diff --git a/blog/themes/anzhiyu/layout/includes/third-party/card-post-count/valine.pug b/blog/themes/anzhiyu/layout/includes/third-party/card-post-count/valine.pug new file mode 100644 index 0000000..dfe9b6d --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/third-party/card-post-count/valine.pug @@ -0,0 +1,20 @@ +script. + (() => { + function loadValine () { + function initValine () { + let initData = { + el: '#vcomment', + appId: '#{theme.valine.appId}', + appKey: '#{theme.valine.appKey}', + serverURLs: '#{theme.valine.serverURLs}' + } + + const valine = new Valine(initData) + } + + if (typeof Valine === 'function') initValine() + else getScript('!{url_for(theme.asset.valine)}').then(initValine) + } + + window.pjax ? loadValine() : window.addEventListener('load', loadValine) + })() diff --git a/blog/themes/anzhiyu/layout/includes/third-party/card-post-count/waline.pug b/blog/themes/anzhiyu/layout/includes/third-party/card-post-count/waline.pug new file mode 100644 index 0000000..5d26e00 --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/third-party/card-post-count/waline.pug @@ -0,0 +1,21 @@ +- const serverURL = theme.waline.serverURL.replace(/\/$/, '') +script. + (() => { + async function loadWaline () { + try { + const eleGroup = document.querySelectorAll('#recent-posts .waline-comment-count') + const keyArray = Array.from(eleGroup).map(i => i.getAttribute('data-path')) + + const res = await fetch(`!{serverURL}/api/comment?type=count&url=${keyArray}`, { method: 'GET' }) + const result = await res.json() + + result.data.forEach((count, index) => { + eleGroup[index].textContent = count + }) + } catch (err) { + console.error(err) + } + } + + window.pjax ? loadWaline() : window.addEventListener('load', loadWaline) + })() \ No newline at end of file diff --git a/blog/themes/anzhiyu/layout/includes/third-party/chat/chatra.pug b/blog/themes/anzhiyu/layout/includes/third-party/chat/chatra.pug new file mode 100644 index 0000000..5cc7b5a --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/third-party/chat/chatra.pug @@ -0,0 +1,50 @@ +//- https://chatra.io/help/api/ +script. + (() => { + const isChatBtn = !{theme.chat_btn} + const isChatHideShow = !{theme.chat_hide_show} + + if (isChatBtn) { + const close = () => { + Chatra('minimizeWidget') + Chatra('hide') + } + + const open = () => { + Chatra('openChat', true) + Chatra('show') + } + + window.ChatraSetup = { + startHidden: true + } + + window.chatBtnFn = () => { + const isShow = document.getElementById('chatra').classList.contains('chatra--expanded') + isShow ? close() : open() + } + } else if (isChatHideShow) { + window.chatBtn = { + hide: () => { + Chatra('hide') + }, + show: () => { + Chatra('show') + } + } + } + + (function(d, w, c) { + w.ChatraID = '#{theme.chatra.id}' + var s = d.createElement('script') + w[c] = w[c] || function() { + (w[c].q = w[c].q || []).push(arguments) + } + s.async = true + s.src = 'https://call.chatra.io/chatra.js' + if (d.head) d.head.appendChild(s) + })(document, window, 'Chatra') + + })() + + diff --git a/blog/themes/anzhiyu/layout/includes/third-party/chat/crisp.pug b/blog/themes/anzhiyu/layout/includes/third-party/chat/crisp.pug new file mode 100644 index 0000000..6c8b6bf --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/third-party/chat/crisp.pug @@ -0,0 +1,45 @@ +script. + (() => { + window.$crisp = []; + window.CRISP_WEBSITE_ID = "!{theme.crisp.website_id}"; + (function () { + d = document; + s = d.createElement("script"); + s.src = "https://client.crisp.chat/l.js"; + s.async = 1; + d.getElementsByTagName("head")[0].appendChild(s); + })(); + $crisp.push(["safe", true]) + + const isChatBtn = !{theme.chat_btn} + const isChatHideShow = !{theme.chat_hide_show} + + if (isChatBtn) { + const open = () => { + $crisp.push(["do", "chat:show"]) + $crisp.push(["do", "chat:open"]) + } + + const close = () => { + $crisp.push(["do", "chat:hide"]) + } + + close() + $crisp.push(["on", "chat:closed", function() { + close() + }]) + + window.chatBtnFn = () => { + $crisp.is("chat:visible") ? close() : open() + } + } else if (isChatHideShow) { + window.chatBtn = { + hide: () => { + $crisp.push(["do", "chat:hide"]) + }, + show: () => { + $crisp.push(["do", "chat:show"]) + } + } + } + })() \ No newline at end of file diff --git a/blog/themes/anzhiyu/layout/includes/third-party/chat/daovoice.pug b/blog/themes/anzhiyu/layout/includes/third-party/chat/daovoice.pug new file mode 100644 index 0000000..5a7c33d --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/third-party/chat/daovoice.pug @@ -0,0 +1,40 @@ +//- https://guide.daocloud.io/daovoice/javascript-api-5869833.html +script. + (() => { + (function(i,s,o,g,r,a,m){i["DaoVoiceObject"]=r;i[r]=i[r]||function(){(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;a.charset="utf-8";m.parentNode.insertBefore(a,m)})(window,document,"script",('https:' == document.location.protocol ? 'https:' : 'http:') + "//widget.daovoice.io/widget/!{theme.daovoice.app_id}.js","daovoice") + + const isChatBtn = !{theme.chat_btn} + const isChatHideShow = !{theme.chat_hide_show} + + daovoice('init', { + app_id: '!{theme.daovoice.app_id}',},{ + launcher: { + disableLauncherIcon: isChatBtn + }, + }); + daovoice('update'); + + if (isChatBtn) { + window.chatBtnFn = () => { + const isShow = document.getElementById('daodream-messenger').classList.contains('daodream-messenger-active') + isShow ? daovoice('hide') : daovoice('show') + } + } else if (isChatHideShow) { + window.chatBtn = { + hide: () => { + daovoice('update', {},{ + launcher: { + disableLauncherIcon: true + } + }) + }, + show: () => { + daovoice('update', {}, { + launcher: { + disableLauncherIcon: false + } + }) + } + } + } + })() \ No newline at end of file diff --git a/blog/themes/anzhiyu/layout/includes/third-party/chat/index.pug b/blog/themes/anzhiyu/layout/includes/third-party/chat/index.pug new file mode 100644 index 0000000..b4c06b6 --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/third-party/chat/index.pug @@ -0,0 +1,8 @@ +if theme.chatra && theme.chatra.enable + include ./chatra.pug +else if theme.tidio && theme.tidio.enable + include ./tidio.pug +else if theme.daovoice && theme.daovoice.enable + include ./daovoice.pug +else if theme.crisp && theme.crisp.enable + include ./crisp.pug \ No newline at end of file diff --git a/blog/themes/anzhiyu/layout/includes/third-party/chat/tidio.pug b/blog/themes/anzhiyu/layout/includes/third-party/chat/tidio.pug new file mode 100644 index 0000000..5d0fe49 --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/third-party/chat/tidio.pug @@ -0,0 +1,47 @@ +script(src=`//code.tidio.co/${theme.tidio.public_key}.js` async) +script. + (() => { + const isChatBtn = !{theme.chat_btn} + const isChatHideShow = !{theme.chat_hide_show} + + if (isChatBtn) { + let isShow = false + const close = () => { + window.tidioChatApi.hide() + isShow = false + document.body.style.position = 'relative'; + document.documentElement.style.overflow = 'auto' + } + + const open = () => { + window.tidioChatApi.open() + window.tidioChatApi.show() + isShow = true + } + + const onTidioChatApiReady = () => { + window.tidioChatApi.hide() + window.tidioChatApi.on("close", close) + } + if (window.tidioChatApi) { + window.tidioChatApi.on("ready", onTidioChatApiReady) + } else { + document.addEventListener("tidioChat-ready", onTidioChatApiReady) + } + + window.chatBtnFn = () => { + if (!window.tidioChatApi) return + isShow ? close() : open() + } + } else if (isChatHideShow) { + window.chatBtn = { + hide: () => { + window.tidioChatApi && window.tidioChatApi.hide() + }, + show: () => { + window.tidioChatApi && window.tidioChatApi.show() + } + } + } + })() + diff --git a/blog/themes/anzhiyu/layout/includes/third-party/comments/artalk.pug b/blog/themes/anzhiyu/layout/includes/third-party/comments/artalk.pug new file mode 100644 index 0000000..2b44613 --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/third-party/comments/artalk.pug @@ -0,0 +1,71 @@ +- const { server, site, visitor, option } = theme.artalk +- const { use, lazyload, count } = theme.comments + +script. + (() => { + const getArtalkDark = () => document.documentElement.getAttribute('data-theme') === 'dark' + + const init = () => { + window.artalkItem = Artalk.init(Object.assign({ + el: '#artalk-wrap', + pageKey: window.location.pathname, + pageTitle: document.title, + server: '!{server}', + site: '!{site}', + darkMode: getArtalkDark(), + }, !{JSON.stringify(option || {})})) + + window.artalkItem.on('list-loaded', () => { + anzhiyu.loadLightbox(document.querySelectorAll('#artalk-wrap .atk-content img:not(.atk-emoticon)')) + }) + } + + const loadArtalk = () => { + if (typeof Artalk === 'function') setTimeout(init, 0) + else { + getCSS('!{url_for(theme.asset.artalk_css)}') + getScript('!{url_for(theme.asset.artalk_js)}').then(init) + } + } + + const changeArtalkTheme = (theme) => { + if (window.artalkItem) { + window.artalkItem.setDarkMode(theme === 'dark') + } + } + + anzhiyu.addGlobalFn('themeChange', changeArtalkTheme, 'artalk') + + // 获取文章顶部评论数(使用与首页卡片相同的 API) + const getCommentCount = async () => { + const countElement = document.querySelector('.post-meta-commentcount .artalk-count') + if (!countElement) return + + try { + const pageKey = countElement.getAttribute('data-page-key') || window.location.pathname + const searchParams = new URLSearchParams({ + 'site_name': '!{site}', + 'page_keys': pageKey + }) + const res = await fetch(`!{server}/api/v2/stats/page_comment?${searchParams}`) + const result = await res.json() + if (result && result.data) { + countElement.textContent = result.data[pageKey] || 0 + } + } catch (err) { + console.error('Artalk comment count fetch error:', err) + } + } + + if ('!{use[0]}' === 'Artalk' || !!{lazyload}) { + if (!{lazyload}) anzhiyu.loadComment(document.getElementById('artalk-wrap'), loadArtalk) + else setTimeout(loadArtalk, 0) + } else { + window.loadOtherComment = loadArtalk + } + + // 获取评论数 + if (!!{count} && GLOBAL_CONFIG_SITE.isPost) { + getCommentCount() + } + })() diff --git a/blog/themes/anzhiyu/layout/includes/third-party/comments/giscus.pug b/blog/themes/anzhiyu/layout/includes/third-party/comments/giscus.pug new file mode 100644 index 0000000..48de80c --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/third-party/comments/giscus.pug @@ -0,0 +1,53 @@ +- const { repo, repo_id, category_id, theme:themes, option } = theme.giscus +- const giscusUrl = 'https://giscus.app/client.js' +- const giscusOriginUrl = new URL(giscusUrl).origin +- const { use, lazyload } = theme.comments + +script. + (()=>{ + const getGiscusTheme = theme => { + return theme === 'dark' ? '!{themes.dark}' : '!{themes.light}' + } + + const loadGiscus = () => { + const config = Object.assign({ + src: '!{giscusUrl}', + 'data-repo': '!{repo}', + 'data-repo-id': '!{repo_id}', + 'data-category-id': '!{category_id}', + 'data-theme': getGiscusTheme(document.documentElement.getAttribute('data-theme')), + 'data-reactions-enabled': '1', + crossorigin: 'anonymous', + async: true + },!{JSON.stringify(option)}) + + const ele = document.createElement('script') + for (let key in config) { + ele.setAttribute(key, config[key]) + } + document.getElementById('giscus-wrap').appendChild(ele) + } + + const changeGiscusTheme = theme => { + const sendMessage = message => { + const iframe = document.querySelector('iframe.giscus-frame') + if (!iframe) return + iframe.contentWindow.postMessage({ giscus: message }, '!{giscusOriginUrl}') + } + + sendMessage({ + setConfig: { + theme: getGiscusTheme(theme) + } + }); + } + + anzhiyu.addGlobalFn('themeChange', changeGiscusTheme, 'giscus') + + if ('!{use[0]}' === 'Giscus' || !!{lazyload}) { + if (!{lazyload}) anzhiyu.loadComment(document.getElementById('giscus-wrap'), loadGiscus) + else loadGiscus() + } else { + window.loadOtherComment = loadGiscus + } + })() \ No newline at end of file diff --git a/blog/themes/anzhiyu/layout/includes/third-party/comments/index.pug b/blog/themes/anzhiyu/layout/includes/third-party/comments/index.pug new file mode 100644 index 0000000..763d29e --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/third-party/comments/index.pug @@ -0,0 +1,37 @@ +- let defaultComment = theme.comments.use[0] +hr +#post-comment + .comment-head + .comment-headline + i.anzhiyufont.anzhiyu-icon-comments + span= ' ' + _p('comment') + .comment-randomInfo + a(onclick="anzhiyu.addRandomCommentInfo()" href="javascript:void(0)" style=theme.visitorMail.enable ? "" : "display: none") 匿名评论 + a(href=url_for('/privacy') style="margin-left: 4px") 隐私政策 + + if theme.comments.use.length > 1 + .comment-switch + span.first-comment=defaultComment + span#switch-btn + span.second-comment=theme.comments.use[1] + + if defaultComment == "Twikoo" + .comment-tips#comment-tips + span ✅ 你无需删除空行,直接评论以获取最佳展示效果 + + .comment-wrap + each name in theme.comments.use + div + case name + when 'Valine' + #vcomment.vcomment + when 'Twikoo' + #twikoo-wrap + when 'Waline' + #waline-wrap + when 'Artalk' + #artalk-wrap + when 'Giscus' + #giscus-wrap + +.comment-barrage \ No newline at end of file diff --git a/blog/themes/anzhiyu/layout/includes/third-party/comments/js.pug b/blog/themes/anzhiyu/layout/includes/third-party/comments/js.pug new file mode 100644 index 0000000..c767eba --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/third-party/comments/js.pug @@ -0,0 +1,12 @@ +each name in theme.comments.use + case name + when 'Valine' + !=partial('includes/third-party/comments/valine', {}, {cache: true}) + when 'Twikoo' + !=partial('includes/third-party/comments/twikoo', {}, {cache: true}) + when 'Waline' + !=partial('includes/third-party/comments/waline', {}, {cache: true}) + when 'Artalk' + !=partial('includes/third-party/comments/artalk', {}, {cache: true}) + when 'Giscus' + !=partial('includes/third-party/comments/giscus', {}, {cache: true}) \ No newline at end of file diff --git a/blog/themes/anzhiyu/layout/includes/third-party/comments/twikoo.pug b/blog/themes/anzhiyu/layout/includes/third-party/comments/twikoo.pug new file mode 100644 index 0000000..1340fa9 --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/third-party/comments/twikoo.pug @@ -0,0 +1,50 @@ +- const { envId, region, option } = theme.twikoo +- const { use, lazyload, count } = theme.comments + +script. + (() => { + const init = () => { + twikoo.init(Object.assign({ + el: '#twikoo-wrap', + envId: '!{envId}', + region: '!{region}', + onCommentLoaded: () => { + anzhiyu.loadLightbox(document.querySelectorAll('#twikoo .tk-content img:not(.tk-owo-emotion)')) + } + }, !{JSON.stringify(option)})) + } + + const loadTwikoo = () => { + if (typeof twikoo === 'object') setTimeout(runFn,0) + else getScript('!{url_for(theme.asset.twikoo)}').then(runFn) + } + + const getCount = () => { + const countELement = document.getElementById('twikoo-count') + if(!countELement) return + twikoo.getCommentsCount({ + envId: '!{envId}', + region: '!{region}', + urls: [window.location.pathname], + includeReply: false + }).then(res => { + countELement.textContent = res[0].count + }).catch(err => { + console.error(err) + }) + } + + const runFn = () => { + init(); + !{count ? 'GLOBAL_CONFIG_SITE.isPost && getCount()' : ''} + } + + if ('!{use[0]}' === 'Twikoo' || !!{lazyload}) { + if (!{lazyload}) anzhiyu.loadComment(document.getElementById('twikoo-wrap'), loadTwikoo) + else { + loadTwikoo() + } + } else { + window.loadOtherComment = loadTwikoo + } + })() \ No newline at end of file diff --git a/blog/themes/anzhiyu/layout/includes/third-party/comments/valine.pug b/blog/themes/anzhiyu/layout/includes/third-party/comments/valine.pug new file mode 100644 index 0000000..4faa53d --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/third-party/comments/valine.pug @@ -0,0 +1,37 @@ +- const { use, lazyload } = theme.comments +- const { appId, appKey, avatar, serverURLs, visitor, option } = theme.valine + +- let emojiMaps = '""' +if site.data.valine + - emojiMaps = JSON.stringify(site.data.valine) + +script. + (() => { + const initValine = () => { + const valine = new Valine(Object.assign({ + el: '#vcomment', + appId: '#{appId}', + appKey: '#{appKey}', + avatar: '#{avatar}', + serverURLs: '#{serverURLs}', + emojiMaps: !{emojiMaps}, + path: window.location.pathname, + visitor: #{visitor} + }, !{JSON.stringify(option)})) + } + + const loadValine = async () => { + if (typeof Valine === 'function') initValine() + else { + await getScript('!{url_for(theme.asset.valine)}') + initValine() + } + } + + if ('!{use[0]}' === 'Valine' || !!{lazyload}) { + if (!{lazyload}) anzhiyu.loadComment(document.getElementById('vcomment'),loadValine) + else setTimeout(loadValine, 0) + } else { + window.loadOtherComment = loadValine + } + })() \ No newline at end of file diff --git a/blog/themes/anzhiyu/layout/includes/third-party/comments/waline.pug b/blog/themes/anzhiyu/layout/includes/third-party/comments/waline.pug new file mode 100644 index 0000000..de98668 --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/third-party/comments/waline.pug @@ -0,0 +1,44 @@ +- const { serverURL, option, pageview, meta_css, imageUploader } = theme.waline +- const { lazyload, count, use } = theme.comments + +script. + (() => { + let initFn = window.walineFn || null + + const initWaline = (Fn) => { + const waline = Fn(Object.assign({ + el: '#waline-wrap', + serverURL: '!{serverURL}', + pageview: !{lazyload ? false : pageview}, + dark: 'html[data-theme="dark"]', + path: window.location.pathname, + comment: !{lazyload ? false : count}, + imageUploader: !{imageUploader}, + }, !{JSON.stringify(option)})) + + const destroyWaline = () => { + waline.destroy() + } + + anzhiyu.addGlobalFn('pjax', destroyWaline, 'destroyWaline') + } + + const loadWaline = async () => { + if (initFn) initWaline(initFn) + else { + await getCSS('!{url_for(theme.asset.waline_css)}') + if (!{meta_css}) await getCSS('!{url_for(theme.asset.waline_meta_css)}') + const { init } = await import('!{url_for(theme.asset.waline_js)}') + initFn = init || Waline.init + initWaline(initFn) + window.walineFn = initFn + } + } + + if ('!{use[0]}' === 'Waline' || !!{lazyload}) { + if (!{lazyload}) anzhiyu.loadComment(document.getElementById('waline-wrap'),loadWaline) + else setTimeout(loadWaline, 0) + } else { + window.loadOtherComment = loadWaline + } + })() diff --git a/blog/themes/anzhiyu/layout/includes/third-party/effect.pug b/blog/themes/anzhiyu/layout/includes/third-party/effect.pug new file mode 100644 index 0000000..275297c --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/third-party/effect.pug @@ -0,0 +1,35 @@ +if theme.fireworks && theme.fireworks.enable + canvas.fireworks(mobile=`${theme.fireworks.mobile}`) + script(src=url_for(theme.asset.fireworks)) + +if (theme.canvas_ribbon && theme.canvas_ribbon.enable) + script(defer id="ribbon" src=url_for(theme.asset.canvas_ribbon) size=theme.canvas_ribbon.size + alpha=theme.canvas_ribbon.alpha zIndex=theme.canvas_ribbon.zIndex mobile=`${theme.canvas_ribbon.mobile}` data-click=`${theme.canvas_ribbon.click_to_change}`) + +if (theme.canvas_fluttering_ribbon && theme.canvas_fluttering_ribbon.enable) + script(defer id="fluttering_ribbon" mobile=`${theme.canvas_fluttering_ribbon.mobile}` src=url_for(theme.asset.canvas_fluttering_ribbon)) + +if (theme.canvas_nest && theme.canvas_nest.enable) + script#canvas_nest(defer color=theme.canvas_nest.color opacity=theme.canvas_nest.opacity zIndex=theme.canvas_nest.zIndex count=theme.canvas_nest.count mobile=`${theme.canvas_nest.mobile}` src=url_for(theme.asset.canvas_nest)) + +if theme.activate_power_mode.enable + script(src=url_for(theme.asset.activate_power_mode)) + script. + POWERMODE.colorful = !{theme.activate_power_mode.colorful}; + POWERMODE.shake = !{theme.activate_power_mode.shake}; + POWERMODE.mobile = !{theme.activate_power_mode.mobile}; + document.body.addEventListener('input', POWERMODE); + +//- 鼠標特效 +if theme.click_heart && theme.click_heart.enable + script#click-heart(src=url_for(theme.asset.click_heart) async mobile=`${theme.click_heart.mobile}`) + +if theme.ClickShowText && theme.ClickShowText.enable + script#click-show-text( + src= url_for(theme.asset.ClickShowText) + data-mobile= `${theme.ClickShowText.mobile}` + data-text= theme.ClickShowText.text.join(",") + data-fontsize= theme.ClickShowText.fontSize + data-random= `${theme.ClickShowText.random}` + async + ) \ No newline at end of file diff --git a/blog/themes/anzhiyu/layout/includes/third-party/footerBarSubtitle.pug b/blog/themes/anzhiyu/layout/includes/third-party/footerBarSubtitle.pug new file mode 100644 index 0000000..cfa61f7 --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/third-party/footerBarSubtitle.pug @@ -0,0 +1,128 @@ +- const { effect,loop,source,sub,startDelay,typeSpeed,backSpeed } = theme.footer.footerBar.subTitle +- let subContent = sub || new Array() + +case source + when 1 + script. + function subtitleType () { + fetch('https://v1.hitokoto.cn') + .then(response => response.json()) + .then(data => { + if (!{effect}) { + const from = '出自 ' + data.from + const sub = !{JSON.stringify(subContent)} + sub.unshift(data.hitokoto, from) + window.typed = new Typed('#footer-type-tips', { + strings: sub, + startDelay: !{startDelay}, + typeSpeed: !{typeSpeed}, + loop: !{loop}, + backSpeed: !{backSpeed}, + }) + } else { + document.getElementById('footer-type-tips').innerHTML = data.hitokoto + } + }) + } + + if (!{effect}) { + if (typeof Typed === 'function') { + subtitleType() + } else { + getScript('!{url_for(theme.asset.typed)}').then(subtitleType) + } + } else { + subtitleType() + } + + when 2 + script. + function subtitleType () { + getScript('https://yijuzhan.com/api/word.php?m=js').then(() => { + const con = str[0] + if (!{effect}) { + const from = '出自 ' + str[1] + const sub = !{JSON.stringify(subContent)} + sub.unshift(con, from) + window.typed = new Typed('#footer-type-tips', { + strings: sub, + startDelay: !{startDelay}, + typeSpeed: !{typeSpeed}, + loop: !{loop}, + backSpeed: !{backSpeed}, + }) + } else { + document.getElementById('footer-type-tips').innerHTML = con + } + }) + } + + if (!{effect}) { + if (typeof Typed === 'function') { + subtitleType() + } else { + getScript('!{url_for(theme.asset.typed)}').then(subtitleType) + } + } else { + subtitleType() + } + + when 3 + script. + function subtitleType () { + getScript('https://sdk.jinrishici.com/v2/browser/jinrishici.js').then(() => { + jinrishici.load(result =>{ + if (!{effect}) { + const sub = !{JSON.stringify(subContent)} + const content = result.data.content + sub.unshift(content) + window.typed = new Typed('#footer-type-tips', { + strings: sub, + startDelay: !{startDelay}, + typeSpeed: !{typeSpeed}, + loop: !{loop}, + backSpeed: !{backSpeed}, + }) + } else { + document.getElementById('footer-type-tips').innerHTML = result.data.content + } + }) + }) + } + + if (!{effect}) { + if (typeof Typed === 'function') { + subtitleType() + } else { + getScript('!{url_for(theme.asset.typed)}').then(subtitleType) + } + } else { + subtitleType() + } + + default + - subContent = subContent.length ? subContent : new Array(config.subtitle) + script. + function subtitleType () { + if (!{effect}) { + window.typed = new Typed("#footer-type-tips", { + strings: !{JSON.stringify(subContent)}, + startDelay: !{startDelay}, + typeSpeed: !{typeSpeed}, + loop: !{loop}, + backSpeed: !{backSpeed} + }) + } else { + document.getElementById("footer-type-tips").innerHTML = '!{subContent[0]}' + } + } + + if (!{effect}) { + if (typeof Typed === 'function') { + subtitleType() + } else { + getScript('!{url_for(theme.asset.typed)}').then(subtitleType) + } + } else { + subtitleType() + } diff --git a/blog/themes/anzhiyu/layout/includes/third-party/math/index.pug b/blog/themes/anzhiyu/layout/includes/third-party/math/index.pug new file mode 100644 index 0000000..2b16302 --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/third-party/math/index.pug @@ -0,0 +1,18 @@ +if theme.mathjax && theme.mathjax.enable + if theme.mathjax.per_page + if is_post() || is_page() + include ./mathjax.pug + else + if page.mathjax + include ./mathjax.pug + +if theme.katex && theme.katex.enable + if theme.katex.per_page + if is_post() || is_page() + include ./katex.pug + else + if page.katex + include ./katex.pug + +if theme.mermaid.enable + include ./mermaid.pug \ No newline at end of file diff --git a/blog/themes/anzhiyu/layout/includes/third-party/math/katex.pug b/blog/themes/anzhiyu/layout/includes/third-party/math/katex.pug new file mode 100644 index 0000000..34c486b --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/third-party/math/katex.pug @@ -0,0 +1,9 @@ +link(rel="stylesheet" type="text/css" href=url_for(theme.asset.katex)) +script(src=url_for(theme.asset.katex_copytex)) +script. + (() => { + document.querySelectorAll('#article-container span.katex-display').forEach(item => { + anzhiyu.wrap(item, 'div', { class: 'katex-wrap'}) + }) + })() + \ No newline at end of file diff --git a/blog/themes/anzhiyu/layout/includes/third-party/math/mathjax.pug b/blog/themes/anzhiyu/layout/includes/third-party/math/mathjax.pug new file mode 100644 index 0000000..470aa45 --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/third-party/math/mathjax.pug @@ -0,0 +1,38 @@ +//- Mathjax 3 +script. + if (!window.MathJax) { + window.MathJax = { + tex: { + inlineMath: [['$', '$'], ['\\(', '\\)']], + tags: 'ams' + }, + chtml: { + scale: 1.1 + }, + options: { + renderActions: { + findScript: [10, doc => { + for (const node of document.querySelectorAll('script[type^="math/tex"]')) { + const display = !!node.type.match(/; *mode=display/) + const math = new doc.options.MathItem(node.textContent, doc.inputJax[0], display) + const text = document.createTextNode('') + node.parentNode.replaceChild(text, node) + math.start = {node: text, delim: '', n: 0} + math.end = {node: text, delim: '', n: 0} + doc.math.push(math) + } + }, ''] + } + } + } + + const script = document.createElement('script') + script.src = '!{url_for(theme.asset.mathjax)}' + script.id = 'MathJax-script' + script.async = true + document.head.appendChild(script) + } else { + MathJax.startup.document.state(0) + MathJax.texReset() + MathJax.typesetPromise() + } \ No newline at end of file diff --git a/blog/themes/anzhiyu/layout/includes/third-party/math/mermaid.pug b/blog/themes/anzhiyu/layout/includes/third-party/math/mermaid.pug new file mode 100644 index 0000000..445e018 --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/third-party/math/mermaid.pug @@ -0,0 +1,38 @@ +script. + (() => { + const $mermaid = document.querySelectorAll('#article-container .mermaid-wrap') + if ($mermaid.length === 0) return + const runMermaid = () => { + window.loadMermaid = true + const theme = document.documentElement.getAttribute('data-theme') === 'dark' ? '!{theme.mermaid.theme.dark}' : '!{theme.mermaid.theme.light}' + + Array.from($mermaid).forEach((item, index) => { + const mermaidSrc = item.firstElementChild + const mermaidThemeConfig = '%%{init:{ \'theme\':\'' + theme + '\'}}%%\n' + const mermaidID = 'mermaid-' + index + const mermaidDefinition = mermaidThemeConfig + mermaidSrc.textContent + + const renderFn = mermaid.render(mermaidID, mermaidDefinition) + + const renderV10 = () => { + renderFn.then(({svg}) => { + mermaidSrc.insertAdjacentHTML('afterend', svg) + }) + } + + const renderV9 = svg => { + mermaidSrc.insertAdjacentHTML('afterend', svg) + } + + typeof renderFn === 'string' ? renderV9(renderFn) : renderV10() + }) + } + + const loadMermaid = () => { + window.loadMermaid ? runMermaid() : getScript('!{url_for(theme.asset.mermaid)}').then(runMermaid) + } + + anzhiyu.addGlobalFn('themeChange', runMermaid, 'mermaid') + + window.pjax ? loadMermaid() : document.addEventListener('DOMContentLoaded', loadMermaid) + })() \ No newline at end of file diff --git a/blog/themes/anzhiyu/layout/includes/third-party/newest-comments/artalk.pug b/blog/themes/anzhiyu/layout/includes/third-party/newest-comments/artalk.pug new file mode 100644 index 0000000..35f88b6 --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/third-party/newest-comments/artalk.pug @@ -0,0 +1,118 @@ +- const { server, site, option } = theme.artalk +- const avatarCdn = (option !== null && option.gravatar && option.gravatar.mirror) || '' +- const avatarDefault = (option !== null && option.gravatar && (option.gravatar.params || option.gravatar.default)) || '' + +script. + window.addEventListener('load', () => { + const keyName = 'artalk-newest-comments' + + const changeContent = (content) => { + if (content === '') return content + + content = content.replace(/]+>/ig, '[!{_p("aside.card_newest_comments.image")}]') // replace image link + content = content.replace(/]+?href=["']?([^"']+)["']?[^>]*>([^<]+)<\/a>/gi, '[!{_p("aside.card_newest_comments.link")}]') // replace url + content = content.replace(/
.*?<\/pre>/gi, '[!{_p("aside.card_newest_comments.code")}]') // replace code
+      content = content.replace(/<[^>]+>/g,"") // remove html tag
+
+      if (content.length > 150) {
+        content = content.substring(0,150) + '...'
+      }
+      return content
+    }
+
+    const generateHtml = array => {
+      let result = ''
+
+      if (array.length) {
+        for (let i = 0; i < array.length; i++) {
+          result += '
' + + if (!{theme.newest_comments.avatar}) { + const name = '!{theme.lazyload.enable ? "data-lazy-src" : "src"}' + result += `${array[i].nick}` + } + + result += `
+ ${array[i].content} +
${array[i].nick} /
+
` + } + } else { + result += '!{_p("aside.card_newest_comments.zero")}' + } + + let $dom = document.querySelector('#card-newest-comments .aside-list') + $dom && ($dom.innerHTML= result) + window.lazyLoadInstance && window.lazyLoadInstance.update() + window.pjax && window.pjax.refresh($dom) + } + + const getAvatarValue = async () => { + const predefinedAvatarCdn = '!{avatarCdn}' + const predefinedAvatarDefault = '!{avatarDefault}' + + const avatarDefaultFormat = e => e.startsWith('d=') ? e : `d=${e}` + + if (predefinedAvatarCdn && predefinedAvatarDefault) { + return { avatarCdn: predefinedAvatarCdn, avatarDefault: avatarDefaultFormat(predefinedAvatarDefault) } + } + + try { + const res = await fetch('!{server}/api/v2/conf') + const result = await res.json() + const { mirror, params, default: defaults } = result.frontend_conf.gravatar + const avatarCdn = predefinedAvatarCdn || mirror + let avatarDefault = avatarDefaultFormat(predefinedAvatarDefault || params || defaults) + return { avatarCdn, avatarDefault} + } catch (e) { + console.error(e) + return { avatarCdn: predefinedAvatarCdn, avatarDefault: avatarDefaultFormat(predefinedAvatarDefault) } + } + } + + const searchParams = new URLSearchParams({ + 'site_name': '!{site}', + 'limit': '!{theme.newest_comments.limit * 2}', // Fetch more comments to filter pending comments + }) + + const getComment = async () => { + try { + const res = await fetch(`!{server}/api/v2/stats/latest_comments?${searchParams}`) + const result = await res.json() + const { avatarCdn, avatarDefault } = await getAvatarValue() + const artalk = result.data + .filter(e => !e.is_pending) // Filter pending comments + .slice(0, !{theme.newest_comments.limit}) // Limit the number of comments + .map(e => { + const avatar = avatarCdn && e.email_encrypted ? `${avatarCdn}${e.email_encrypted}?${avatarDefault}` : '' + return { + 'avatar': avatar, + 'content': changeContent(e.content_marked), + 'nick': e.nick, + 'url': e.page_url, + 'date': e.date, + } + }) + saveToLocal.set(keyName, JSON.stringify(artalk), !{theme.newest_comments.storage}/(60*24)) + generateHtml(artalk) + } catch (e) { + console.log(e) + const $dom = document.querySelector('#card-newest-comments .aside-list') + $dom && ($dom.textContent= "!{_p('aside.card_newest_comments.error')}") + } + } + + const newestCommentInit = () => { + if (document.querySelector('#card-newest-comments .aside-list')) { + const data = saveToLocal.get(keyName) + if (data) { + generateHtml(JSON.parse(data)) + } else { + getComment() + } + } + } + + newestCommentInit() + document.addEventListener('pjax:complete', newestCommentInit) + }) \ No newline at end of file diff --git a/blog/themes/anzhiyu/layout/includes/third-party/newest-comments/common.pug b/blog/themes/anzhiyu/layout/includes/third-party/newest-comments/common.pug new file mode 100644 index 0000000..1d05e70 --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/third-party/newest-comments/common.pug @@ -0,0 +1,74 @@ +script. + window.newestComments = { + changeContent: (content) => { + if (content === '') return content + + content = content.replace(/]+>/ig, '[!{_p("aside.card_newest_comments.image")}]') // replace image link + content = content.replace(/]+?href=["']?([^"']+)["']?[^>]*>([^<]+)<\/a>/gi, '[!{_p("aside.card_newest_comments.link")}]') // replace url + content = content.replace(/
.*?<\/pre>/gi, '[!{_p("aside.card_newest_comments.code")}]') // replace code
+      content = content.replace(/<[^>]+>/g,"") // remove html tag
+
+      if (content.length > 150) {
+        content = content.substring(0,150) + '...'
+      }
+      return content
+    },
+
+    generateHtml: (array, ele) => {
+      let result = ''
+
+      if (array.length) {
+        for (let i = 0; i < array.length; i++) {
+          result += '
' + + if (!{theme.newest_comments.avatar}) { + const name = '!{theme.lazyload.enable ? "data-lazy-src" : "src"}' + result += `${array[i].nick}` + } + + result += `
+ ${array[i].content} +
${array[i].nick} /
+
` + } + } else { + result += '!{_p("aside.card_newest_comments.zero")}' + } + + if (ele) { + ele.innerHTML = result + window.lazyLoadInstance && window.lazyLoadInstance.update() + window.pjax && window.pjax.refresh(ele) + } else { + let $dom = document.querySelector('#card-newest-comments .aside-list') + $dom && ($dom.innerHTML= result) + window.lazyLoadInstance && window.lazyLoadInstance.update() + window.pjax && window.pjax.refresh($dom) + } + }, + + run: (keyName, getComment) => { + const ele = document.querySelector('#card-newest-comments .aside-list') + if (!ele) return + + const data = saveToLocal.get(keyName) + if (data) { + window.newestComments.generateHtml(JSON.parse(data), ele) + } else { + getComment(ele) + } + + document.addEventListener('pjax:complete', () => { + const ele = document.querySelector('#card-newest-comments .aside-list') + if (ele) { + const data = saveToLocal.get(keyName) + if (data) { + window.newestComments.generateHtml(JSON.parse(data), ele) + } else { + getComment(ele) + } + } + }) + } + } + diff --git a/blog/themes/anzhiyu/layout/includes/third-party/newest-comments/index.pug b/blog/themes/anzhiyu/layout/includes/third-party/newest-comments/index.pug new file mode 100644 index 0000000..e7afa57 --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/third-party/newest-comments/index.pug @@ -0,0 +1,13 @@ +- let { use } = theme.comments + +if use + - let forum,apiKey,userRepo + case use[0] + when 'Valine' + include ./valine.pug + when 'Waline' + include ./waline.pug + when 'Twikoo' + include ./twikoo-comment.pug + when 'Artalk' + include ./artalk.pug \ No newline at end of file diff --git a/blog/themes/anzhiyu/layout/includes/third-party/newest-comments/twikoo-comment.pug b/blog/themes/anzhiyu/layout/includes/third-party/newest-comments/twikoo-comment.pug new file mode 100644 index 0000000..ea4024f --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/third-party/newest-comments/twikoo-comment.pug @@ -0,0 +1,90 @@ +script. + window.addEventListener('load', () => { + const changeContent = (content) => { + if (content === '') return content + + content = content.replace(/]+>/ig, '[!{_p("aside.card_newest_comments.image")}]') // replace image link + content = content.replace(/]+?href=["']?([^"']+)["']?[^>]*>([^<]+)<\/a>/gi, '[!{_p("aside.card_newest_comments.link")}]') // replace url + content = content.replace(/
.*?<\/pre>/gi, '[!{_p("aside.card_newest_comments.code")}]') // replace code
+      content = content.replace(/<[^>]+>/g,"") // remove html tag
+
+      if (content.length > 150) {
+        content = content.substring(0,150) + '...'
+      }
+      return content
+    }
+
+    const getComment = () => {
+      const runTwikoo = () => {
+        twikoo.getRecentComments({
+          envId: '!{theme.twikoo.envId}',
+          region: '!{theme.twikoo.region}',
+          pageSize: !{theme.newest_comments.limit},
+          includeReply: true
+        }).then(function (res) {
+          const twikooArray = res.map(e => {
+            return {
+              'content': changeContent(e.comment),
+              'avatar': e.avatar,
+              'nick': e.nick,
+              'url': e.url + '#' + e.id,
+              'date': new Date(e.created).toISOString()
+            }
+          })
+
+          saveToLocal.set('twikoo-newest-comments', JSON.stringify(twikooArray), !{theme.newest_comments.storage}/(60*24))
+          generateHtml(twikooArray)
+        }).catch(function (err) {
+          const $dom = document.querySelector('#card-newest-comments .aside-list')
+          $dom.textContent= "!{_p('aside.card_newest_comments.error')}"
+        })
+      }
+
+      if (typeof twikoo === 'object') {
+        runTwikoo()
+      } else {
+        getScript('!{url_for(theme.asset.twikoo)}').then(runTwikoo)
+      }
+    }
+
+    const generateHtml = array => {
+      let result = ''
+
+      if (array.length) {
+        for (let i = 0; i < array.length; i++) {
+          result += '
' + + if (!{theme.newest_comments.avatar}) { + const name = '!{theme.lazyload.enable ? "data-lazy-src" : "src"}' + result += `${array[i].nick}
${array[i].nick}
` + } + + result += `
+ ${array[i].content} +
+
` + } + } else { + result += '!{_p("aside.card_newest_comments.zero")}' + } + + let $dom = document.querySelector('#card-newest-comments .aside-list') + $dom && ($dom.innerHTML= result) + window.lazyLoadInstance && window.lazyLoadInstance.update() + window.pjax && window.pjax.refresh($dom) + } + + const newestCommentInit = () => { + if (document.querySelector('#card-newest-comments .aside-list')) { + const data = saveToLocal.get('twikoo-newest-comments') + if (data) { + generateHtml(JSON.parse(data)) + } else { + getComment() + } + } + } + + newestCommentInit() + document.addEventListener('pjax:complete', newestCommentInit) + }) diff --git a/blog/themes/anzhiyu/layout/includes/third-party/newest-comments/valine.pug b/blog/themes/anzhiyu/layout/includes/third-party/newest-comments/valine.pug new file mode 100644 index 0000000..3a779d7 --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/third-party/newest-comments/valine.pug @@ -0,0 +1,99 @@ +- let default_avatar = theme.valine.avatar + +script(src=url_for(theme.asset.blueimp_md5)) +script. + window.addEventListener('load', () => { + const changeContent = (content) => { + if (content === '') return content + + content = content.replace(/]+>/ig, '[!{_p("aside.card_newest_comments.image")}]') // replace image link + content = content.replace(/]+?href=["']?([^"']+)["']?[^>]*>([^<]+)<\/a>/gi, '[!{_p("aside.card_newest_comments.link")}]') // replace url + content = content.replace(/
.*?<\/pre>/gi, '[!{_p("aside.card_newest_comments.code")}]') // replace code
+      content = content.replace(/<[^>]+>/g,"") // remove html tag
+
+      if (content.length > 150) {
+        content = content.substring(0,150) + '...'
+      }
+      return content
+    }
+
+    const getIcon = (icon, mail) => {
+      if (icon) return icon
+      let defaultIcon = '!{ default_avatar ? `?d=${default_avatar}` : ''}'
+      let iconUrl = `https://gravatar.loli.net/avatar/${md5(mail.toLowerCase()) + defaultIcon}`
+      return iconUrl
+    }
+
+    const generateHtml = array => {
+      let result = ''
+
+      if (array.length) {
+        for (let i = 0; i < array.length; i++) {
+          result += '
' + + if (!{theme.newest_comments.avatar}) { + const name = '!{theme.lazyload.enable ? "data-lazy-src" : "src"}' + result += `${array[i].nick}` + } + + result += `
+ ${array[i].content} +
${array[i].nick} /
+
` + } + } else { + result += '!{_p("aside.card_newest_comments.zero")}' + } + + let $dom = document.querySelector('#card-newest-comments .aside-list') + $dom && ($dom.innerHTML= result) + window.lazyLoadInstance && window.lazyLoadInstance.update() + window.pjax && window.pjax.refresh($dom) + } + + const getComment = () => { + const serverURL = '!{theme.valine.serverURLs || `https://${theme.valine.appId.substring(0,8)}.api.lncldglobal.com` }' + + var settings = { + "method": "GET", + "headers": { + "X-LC-Id": '!{theme.valine.appId}', + "X-LC-Key": '!{theme.valine.appKey}', + "Content-Type": "application/json" + }, + } + + fetch(`${serverURL}/1.1/classes/Comment?limit=!{theme.newest_comments.limit}&order=-createdAt`,settings) + .then(response => response.json()) + .then(data => { + const valineArray = data.results.map(function (e) { + return { + 'avatar': getIcon(e.QQAvatar, e.mail), + 'content': changeContent(e.comment), + 'nick': e.nick, + 'url': e.url + '#' + e.objectId, + 'date': e.updatedAt, + } + }) + saveToLocal.set('valine-newest-comments', JSON.stringify(valineArray), !{theme.newest_comments.storage}/(60*24)) + generateHtml(valineArray) + }).catch(e => { + const $dom = document.querySelector('#card-newest-comments .aside-list') + $dom.textContent= "!{_p('aside.card_newest_comments.error')}" + }) + } + + const newestCommentInit = () => { + if (document.querySelector('#card-newest-comments .aside-list')) { + const data = saveToLocal.get('valine-newest-comments') + if (data) { + generateHtml(JSON.parse(data)) + } else { + getComment() + } + } + } + + newestCommentInit() + document.addEventListener('pjax:complete', newestCommentInit) + }) \ No newline at end of file diff --git a/blog/themes/anzhiyu/layout/includes/third-party/newest-comments/waline.pug b/blog/themes/anzhiyu/layout/includes/third-party/newest-comments/waline.pug new file mode 100644 index 0000000..68cd4f8 --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/third-party/newest-comments/waline.pug @@ -0,0 +1,81 @@ +- const serverURL = theme.waline.serverURL.replace(/\/$/, '') + +script. + window.addEventListener('load', () => { + const changeContent = content => { + if (content === '') return content + + content = content.replace(/]+>/ig, '[!{_p("aside.card_newest_comments.image")}]') // replace image link + content = content.replace(/]+?href=["']?([^"']+)["']?[^>]*>([^<]+)<\/a>/gi, '[!{_p("aside.card_newest_comments.link")}]') // replace url + content = content.replace(/
.*?<\/pre>/gi, '[!{_p("aside.card_newest_comments.code")}]') // replace code
+      content = content.replace(/<[^>]+>/g,"") // remove html tag
+
+      if (content.length > 150) {
+        content = content.substring(0,150) + '...'
+      }
+      return content
+    }
+
+    const generateHtml = array => {
+      let result = ''
+
+      if (array.length) {
+        for (let i = 0; i < array.length; i++) {
+          result += '
' + + if (!{theme.newest_comments.avatar}) { + const name = '!{theme.lazyload.enable ? "data-lazy-src" : "src"}' + result += `${array[i].nick}` + } + + result += `
+ ${array[i].content} +
${array[i].nick} /
+
` + } + } else { + result += '!{_p("aside.card_newest_comments.zero")}' + } + + let $dom = document.querySelector('#card-newest-comments .aside-list') + $dom && ($dom.innerHTML= result) + window.lazyLoadInstance && window.lazyLoadInstance.update() + window.pjax && window.pjax.refresh($dom) + } + + const getComment = async () => { + try { + const res = await fetch('!{serverURL}/api/comment?type=recent&count=!{theme.newest_comments.limit}', { method: 'GET' }) + const result = await res.json() + const walineArray = result.data.map(e => { + return { + 'content': changeContent(e.comment), + 'avatar': e.avatar, + 'nick': e.nick, + 'url': e.url + '#' + e.objectId, + 'date': e.time || e.insertedAt + } + }) + saveToLocal.set('waline-newest-comments', JSON.stringify(walineArray), !{theme.newest_comments.storage}/(60*24)) + generateHtml(walineArray) + } catch (err) { + console.error(err) + const $dom = document.querySelector('#card-newest-comments .aside-list') + $dom.textContent= "!{_p('aside.card_newest_comments.error')}" + } + } + + const newestCommentInit = () => { + if (document.querySelector('#card-newest-comments .aside-list')) { + const data = saveToLocal.get('waline-newest-comments') + if (data) { + generateHtml(JSON.parse(data)) + } else { + getComment() + } + } + } + + newestCommentInit() + document.addEventListener('pjax:complete', newestCommentInit) + }) \ No newline at end of file diff --git a/blog/themes/anzhiyu/layout/includes/third-party/pangu.pug b/blog/themes/anzhiyu/layout/includes/third-party/pangu.pug new file mode 100644 index 0000000..2027ca7 --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/third-party/pangu.pug @@ -0,0 +1,20 @@ +script. + function panguFn () { + if (typeof pangu === 'object') pangu.autoSpacingPage() + else { + getScript('!{url_for(theme.asset.pangu)}') + .then(() => { + pangu.autoSpacingPage() + }) + } + } + + function panguInit () { + if (!{theme.pangu.field === 'post'}){ + GLOBAL_CONFIG_SITE.isPost && panguFn() + } else { + panguFn() + } + } + + document.addEventListener('DOMContentLoaded', panguInit) diff --git a/blog/themes/anzhiyu/layout/includes/third-party/pjax.pug b/blog/themes/anzhiyu/layout/includes/third-party/pjax.pug new file mode 100644 index 0000000..9916364 --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/third-party/pjax.pug @@ -0,0 +1,77 @@ +- var pjaxExclude = 'a:not([target="_blank"])' +if theme.pjax.exclude + each val in theme.pjax.exclude + - pjaxExclude = pjaxExclude + `:not([href="${val}"])` + +- let pjaxSelectors = ['head > title','#config-diff', '#body-wrap','#rightside-config-hide','#rightside-config-show','.js-pjax'] + +- let choose = theme.comments.use +if choose + if theme.Open_Graph_meta && (choose.includes('Twikoo')) + - pjaxSelectors.unshift('meta[property="og:image"]', 'meta[property="og:title"]', 'meta[property="og:url"]', 'meta[property="og:type"]', 'meta[property="og:site_name"]', 'meta[property="og:description"]') + +script(src=url_for(theme.asset.pjax)) +script. + let pjaxSelectors = !{JSON.stringify(pjaxSelectors)} + var pjax = new Pjax({ + elements: '!{pjaxExclude}', + selectors: pjaxSelectors, + cacheBust: false, + analytics: !{theme.google_analytics ? true : false}, + scrollRestoration: false + }) + + document.addEventListener('pjax:send', function () { + // removeEventListener scroll + anzhiyu.removeGlobalFnEvent('pjax') + anzhiyu.removeGlobalFnEvent('themeChange') + + document.getElementById('rightside').classList.remove('rightside-show') + + if (window.aplayers) { + for (let i = 0; i < window.aplayers.length; i++) { + if (!window.aplayers[i].options.fixed) { + window.aplayers[i].destroy() + } + } + } + + typeof typed === 'object' && typed.destroy() + + //reset readmode + const $bodyClassList = document.body.classList + $bodyClassList.contains('read-mode') && $bodyClassList.remove('read-mode') + }) + + document.addEventListener('pjax:complete', function () { + window.refreshFn() + + document.querySelectorAll('script[data-pjax]').forEach(item => { + const newScript = document.createElement('script') + const content = item.text || item.textContent || item.innerHTML || "" + Array.from(item.attributes).forEach(attr => newScript.setAttribute(attr.name, attr.value)) + newScript.appendChild(document.createTextNode(content)) + item.parentNode.replaceChild(newScript, item) + }) + + GLOBAL_CONFIG.islazyload && window.lazyLoadInstance.update() + + typeof panguInit === 'function' && panguInit() + + // google analytics + typeof gtag === 'function' && gtag('config', '!{theme.google_analytics}', {'page_path': window.location.pathname}); + + // baidu analytics + typeof _hmt === 'object' && _hmt.push(['_trackPageview',window.location.pathname]); + + typeof loadMeting === 'function' && document.getElementsByClassName('aplayer').length && loadMeting() + + // prismjs + typeof Prism === 'object' && Prism.highlightAll() + }) + + document.addEventListener('pjax:error', e => { + if (e.request.status === 404) { + pjax.loadUrl('!{url_for("/404.html")}') + } + }) diff --git a/blog/themes/anzhiyu/layout/includes/third-party/prismjs.pug b/blog/themes/anzhiyu/layout/includes/third-party/prismjs.pug new file mode 100644 index 0000000..6af44dd --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/third-party/prismjs.pug @@ -0,0 +1,5 @@ +if config.prismjs && config.prismjs.enable && !config.prismjs.preprocess + script(src=url_for(theme.asset.prismjs_js)) + script(src=url_for(theme.asset.prismjs_autoloader)) + if config.prismjs.line_number + script(src=url_for(theme.asset.prismjs_lineNumber_js)) diff --git a/blog/themes/anzhiyu/layout/includes/third-party/runtime/runtime-js.pug b/blog/themes/anzhiyu/layout/includes/third-party/runtime/runtime-js.pug new file mode 100644 index 0000000..d2d92ad --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/third-party/runtime/runtime-js.pug @@ -0,0 +1,66 @@ +- let launch_time = theme.footer.runtime.launch_time +- let offduty_img = theme.footer.runtime.offduty_img +- let offduty_description = theme.footer.runtime.offduty_description +script(async=true). + (function () { + var grt = new Date("#{launch_time}"); //设置网站上线时间 + var now = new Date(); + var dnum; + var hnum; + var mnum; + var snum; + var nowHour; + + // 计算并更新天数、小时数、分钟数和秒数 + function updateTime() { + now = new Date(); // 更新 now 的值 + nowHour = now.getHours(); // 更新 nowHour 的值 + var days = (now - grt) / 1000 / 60 / 60 / 24; + dnum = Math.floor(days); + var hours = (now - grt) / 1000 / 60 / 60 - 24 * dnum; + hnum = Math.floor(hours); + if (String(hnum).length == 1) { + hnum = "0" + hnum; + } + var minutes = (now - grt) / 1000 / 60 - 24 * 60 * dnum - 60 * hnum; + mnum = Math.floor(minutes); + if (String(mnum).length == 1) { + mnum = "0" + mnum; + } + var seconds = (now - grt) / 1000 - 24 * 60 * 60 * dnum - 60 * 60 * hnum - 60 * mnum; + snum = Math.round(seconds); + if (String(snum).length == 1) { + snum = "0" + snum; + } + } + + // 更新网页中显示的网站运行时间 + function updateHtml() { + const footer = document.getElementById("footer"); + if (!footer) return + let currentTimeHtml = ""; + if (nowHour < 18 && nowHour >= 9) { + // 如果是上班时间,默认就是"安知鱼-上班摸鱼中.svg"图片,不需要更改 + currentTimeHtml = `本站居然运行了 ${dnum} 天 ${hnum} 小时 ${mnum} 分 ${snum} 秒 `; + } else { + // 如果是下班时间,插入"安知鱼-下班啦.svg"图片 + let img = document.querySelector("#workboard .workSituationImg"); + if (img != null) { + img.src = "#{offduty_img}"; + img.title = "#{offduty_description}"; + img.alt = "#{offduty_description}"; + } + + currentTimeHtml = `本站居然运行了 ${dnum} 天 ${hnum} 小时 ${mnum} 分 ${snum} 秒 `; + } + + if (document.getElementById("runtimeTextTip")) { + document.getElementById("runtimeTextTip").innerHTML = currentTimeHtml; + } + } + + setInterval(() => { + updateTime(); + updateHtml(); + }, 1000); + })(); diff --git a/blog/themes/anzhiyu/layout/includes/third-party/search/algolia.pug b/blog/themes/anzhiyu/layout/includes/third-party/search/algolia.pug new file mode 100644 index 0000000..3988af3 --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/third-party/search/algolia.pug @@ -0,0 +1,21 @@ +#algolia-search + .search-dialog + nav.search-nav + span.search-dialog-title= _p('search.title') + button.search-close-button + i.anzhiyufont.anzhiyu-icon-xmark + + .search-wrap + #algolia-search-input + hr + #algolia-search-results + #algolia-hits + if theme.algolia_search.enable && theme.algolia_search.tags + each item, index in theme.algolia_search.tags + a.tag-list(href=url_for("/tags/" + item), title=item)=item + #algolia-pagination + #algolia-info + .algolia-stats + .algolia-poweredBy + + #search-mask diff --git a/blog/themes/anzhiyu/layout/includes/third-party/search/docsearch.pug b/blog/themes/anzhiyu/layout/includes/third-party/search/docsearch.pug new file mode 100644 index 0000000..760d8a7 --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/third-party/search/docsearch.pug @@ -0,0 +1,26 @@ +- const { appId, apiKey, indexName, option } = theme.docsearch + +.docsearch-wrap + #docsearch(style="display:none") + link(rel="stylesheet" href=url_for(theme.asset.docsearch_css)) + script(src=url_for(theme.asset.docsearch_js)) + script. + (() => { + docsearch(Object.assign({ + appId: '!{appId}', + apiKey: '!{apiKey}', + indexName: '!{indexName}', + container: '#docsearch', + }, !{JSON.stringify(option)})) + + const handleClick = () => { + document.querySelector('.DocSearch-Button').click() + } + + const searchClickFn = () => { + anzhiyu.addEventListenerPjax(document.querySelector('#search-button > .search'), 'click', handleClick) + } + + searchClickFn() + window.addEventListener('pjax:complete', searchClickFn) + })() diff --git a/blog/themes/anzhiyu/layout/includes/third-party/search/index.pug b/blog/themes/anzhiyu/layout/includes/third-party/search/index.pug new file mode 100644 index 0000000..160df79 --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/third-party/search/index.pug @@ -0,0 +1,6 @@ +if theme.algolia_search.enable + include ./algolia.pug +else if theme.local_search.enable + include ./local-search.pug +else if theme.docsearch.enable + include ./docsearch.pug \ No newline at end of file diff --git a/blog/themes/anzhiyu/layout/includes/third-party/search/local-search.pug b/blog/themes/anzhiyu/layout/includes/third-party/search/local-search.pug new file mode 100644 index 0000000..fe57a1d --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/third-party/search/local-search.pug @@ -0,0 +1,20 @@ +#local-search + .search-dialog + nav.search-nav + span.search-dialog-title= _p('search.title') + span#loading-status + button.search-close-button + i.anzhiyufont.anzhiyu-icon-xmark + + #loading-database.is-center + i.anzhiyufont.anzhiyu-icon-spinner.anzhiyu-pulse-icon + span= ' ' + _p("search.load_data") + + .search-wrap + #local-search-input + .local-search-box + input(placeholder=_p("search.local_search.input_placeholder") type="text").local-search-box--input + hr + #local-search-results + + #search-mask \ No newline at end of file diff --git a/blog/themes/anzhiyu/layout/includes/third-party/share/addtoany.pug b/blog/themes/anzhiyu/layout/includes/third-party/share/addtoany.pug new file mode 100644 index 0000000..d42f3be --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/third-party/share/addtoany.pug @@ -0,0 +1,10 @@ +.addtoany + .a2a_kit.a2a_kit_size_32.a2a_default_style + - let addtoanyItem = theme.addtoany.item.split(',') + each name in addtoanyItem + a(class="a2a_button_" + name) + + a.a2a_dd(href="https://www.addtoany.com/share") +script(async src='https://static.addtoany.com/menu/page.js') + + diff --git a/blog/themes/anzhiyu/layout/includes/third-party/share/index.pug b/blog/themes/anzhiyu/layout/includes/third-party/share/index.pug new file mode 100644 index 0000000..c3ad53a --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/third-party/share/index.pug @@ -0,0 +1,6 @@ +if (theme.sharejs.enable || theme.addtoany.enable) + .post_share + if theme.sharejs.enable + include ./share-js.pug + else if theme.addtoany.enable + !=partial('includes/third-party/share/addtoany', {}, {cache: true}) diff --git a/blog/themes/anzhiyu/layout/includes/third-party/share/share-js.pug b/blog/themes/anzhiyu/layout/includes/third-party/share/share-js.pug new file mode 100644 index 0000000..0a566fa --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/third-party/share/share-js.pug @@ -0,0 +1,3 @@ +.social-share(data-image=url_for(page.cover|| theme.avatar.img) data-sites= theme.sharejs.sites) +link(rel='stylesheet' href=url_for(theme.asset.sharejs_css) media="print" onload="this.media='all'") +script(src=url_for(theme.asset.sharejs) defer) \ No newline at end of file diff --git a/blog/themes/anzhiyu/layout/includes/third-party/subtitle.pug b/blog/themes/anzhiyu/layout/includes/third-party/subtitle.pug new file mode 100644 index 0000000..9236757 --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/third-party/subtitle.pug @@ -0,0 +1,128 @@ +- const { effect,loop,source,sub,startDelay,typeSpeed,backSpeed } = theme.subtitle +- let subContent = sub || new Array() + +case source + when 1 + script. + function subtitleType () { + fetch('https://v1.hitokoto.cn') + .then(response => response.json()) + .then(data => { + if (!{effect}) { + const from = '出自 ' + data.from + const sub = !{JSON.stringify(subContent)} + sub.unshift(data.hitokoto, from) + window.typed = new Typed('#subtitle', { + strings: sub, + startDelay: !{startDelay}, + typeSpeed: !{typeSpeed}, + loop: !{loop}, + backSpeed: !{backSpeed}, + }) + } else { + document.getElementById('subtitle').innerHTML = data.hitokoto + } + }) + } + + if (!{effect}) { + if (typeof Typed === 'function') { + subtitleType() + } else { + getScript('!{url_for(theme.asset.typed)}').then(subtitleType) + } + } else { + subtitleType() + } + + when 2 + script. + function subtitleType () { + getScript('https://yijuzhan.com/api/word.php?m=js').then(() => { + const con = str[0] + if (!{effect}) { + const from = '出自 ' + str[1] + const sub = !{JSON.stringify(subContent)} + sub.unshift(con, from) + window.typed = new Typed('#subtitle', { + strings: sub, + startDelay: !{startDelay}, + typeSpeed: !{typeSpeed}, + loop: !{loop}, + backSpeed: !{backSpeed}, + }) + } else { + document.getElementById('subtitle').innerHTML = con + } + }) + } + + if (!{effect}) { + if (typeof Typed === 'function') { + subtitleType() + } else { + getScript('!{url_for(theme.asset.typed)}').then(subtitleType) + } + } else { + subtitleType() + } + + when 3 + script. + function subtitleType () { + getScript('https://sdk.jinrishici.com/v2/browser/jinrishici.js').then(() => { + jinrishici.load(result =>{ + if (!{effect}) { + const sub = !{JSON.stringify(subContent)} + const content = result.data.content + sub.unshift(content) + window.typed = new Typed('#subtitle', { + strings: sub, + startDelay: !{startDelay}, + typeSpeed: !{typeSpeed}, + loop: !{loop}, + backSpeed: !{backSpeed}, + }) + } else { + document.getElementById('subtitle').innerHTML = result.data.content + } + }) + }) + } + + if (!{effect}) { + if (typeof Typed === 'function') { + subtitleType() + } else { + getScript('!{url_for(theme.asset.typed)}').then(subtitleType) + } + } else { + subtitleType() + } + + default + - subContent = subContent.length ? subContent : new Array(config.subtitle) + script. + function subtitleType () { + if (!{effect}) { + window.typed = new Typed("#subtitle", { + strings: !{JSON.stringify(subContent)}, + startDelay: !{startDelay}, + typeSpeed: !{typeSpeed}, + loop: !{loop}, + backSpeed: !{backSpeed} + }) + } else { + document.getElementById("subtitle").innerHTML = '!{subContent[0]}' + } + } + + if (!{effect}) { + if (typeof Typed === 'function') { + subtitleType() + } else { + getScript('!{url_for(theme.asset.typed)}').then(subtitleType) + } + } else { + subtitleType() + } diff --git a/blog/themes/anzhiyu/layout/includes/top/top.pug b/blog/themes/anzhiyu/layout/includes/top/top.pug new file mode 100644 index 0000000..b2e863a --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/top/top.pug @@ -0,0 +1,135 @@ +- let home_top_config = theme.home_top +- let { title, subTitle, siteText,default_descr } = home_top_config +if home_top_config.enable + #home_top + .swiper_container_card(style='height: auto;width: 100%') + #bannerGroup + #random-banner + if theme.peoplecanvas.enable + canvas#peoplecanvas + else + .banners-title + .banners-title-big=title + .banners-title-big=subTitle + .banners-title-small=siteText + include ../anzhiyu/tags-group-all.pug + + a#random-hover(href='javascript:toRandomPost()') + i.anzhiyufont.anzhiyu-icon-paper-plane + .bannerText 随便逛逛 + i.anzhiyufont.anzhiyu-icon-arrow-right + .categoryGroup + each item in home_top_config.category + .categoryItem(style=`box-shadow:${item.shadow}`) + a.categoryButton(href=url_for(item.path) class=`${item.class}`) + span.categoryButtonText=item.name + if (item.icon.startsWith("fa")) + i(class=`${item.icon}`) + else if (item.icon.startsWith("icon")) + svg.icon(aria-hidden="true") + use(xlink:href=`#`+ item.icon) + else if (item.icon.startsWith("anzhiyu")) + i.anzhiyufont(class=`${item.icon}`) + if theme.home_top.swiper.enable + #swiper_container_blog + #swiper_container.blog-slider.swiper-container-fade.swiper-container-horizontal + .blog-slider__wrp.swiper-wrapper(style='transition-duration: 0ms;') + //- 文章卡片 + - let swiper_list = sort_attr_post("swiper_list") + each item in swiper_list + .blog-slider__item.swiper-slide(style='width: 750px; opacity: 1; transform: translate3d(0px, 0px, 0px); transition-duration: 0ms;') + a.blog-slider__img(href=item.path, title=item.title) + img(width='48' height='48' src=item.cover alt='图片' onerror=`this.src=` + error_img + `; this.onerror = null;`) + .blog-slider__content + if (timemode === 'updated' ) + span.blog-slider__code= item.updated.format('YYYY-MM-DD') + else + span.blog-slider__code= item.date.format('YYYY-MM-DD') + - const content = strip_html(item.content) + - let expert = content.substring(0, theme.index_post_content.length) + - content.length > theme.index_post_content.length ? expert += ' ...' : '' + a.blog-slider__title(href=item.path, alt=item.title)= item.title + .blog-slider__text= item.description ? item.description : expert + a.blog-slider__button(href=item.path, alt=item.title) 详情 + //- 轮播图组件 + .blog-slider__pagination.swiper-pagination-clickable.swiper-pagination-bullets + + #topPostGroup + - let top_group_list = sort_attr_post("top_group_list").splice(0, 4) + each item in top_group_list + .top-group-list-item + .post_cover.left_radius + a(href=item.path title=item.title) + span.top-group-text 荐 + img.post_bg(alt=item.title, src=item.cover, onerror=`this.src=` + error_img + `; this.onerror = null;`) + .top-group-info + a.article-title(href=item.path title=item.title)=item.title + .top-group-list-none + .top-group-list-none + .top-group-list-none + else + .topGroup + - let top_group_list = sort_attr_post("top_group_list").splice(0, 6) + - let top_group_banner_tips = theme.home_top.banner.tips + - let top_group_banner_title = theme.home_top.banner.title + - let top_group_banner_image = theme.home_top.banner.image + - let top_group_banner_link = url_for(theme.home_top.banner.link) + + each item, index in top_group_list.slice(0, 6) + .recent-post-item(onclick=`pjax.loadUrl("${url_for(item.path)}")`) + .post_cover.left_radius + a(href=item.path, title=item.title) + span.recent-post-top-text 荐 + img.post_bg(onerror=`this.onerror=null;this.src='${url_for(theme.error_img.post_page)}'`, alt='cover', src=item.cover) + .recent-post-info + a.article-title(href=item.path, title=item.title)=item.title + a#todayCard.todayCard(href=top_group_banner_link, style='z-index: 1;') + .todayCard-info + .todayCard-tips=top_group_banner_tips + .todayCard-title=top_group_banner_title + img.todayCard-cover(src=url_for(top_group_banner_image) onerror=`this.onerror=null;this.src='${url_for(theme.error_img.post_page)}'` alt='封面') + .banner-button-group + .banner-button(onclick='event.stopPropagation();event.preventDefault();anzhiyu.hideTodayCard();') + i.anzhiyufont.anzhiyu-icon-arrow-circle-right + span.banner-button-text 更多推荐 + + link(rel="stylesheet", href=theme.home_top.banner.top_group_banner_css) + + if theme.home_top.swiper.enable + if !site.data.essay + script(src=url_for(theme.home_top.swiper.swiper_js)) + script. + function initBlogSlider() { + var swiper = new Swiper(".blog-slider", { + passiveListeners: true, + spaceBetween: 30, + effect: "fade", + loop: true, + autoplay: { + disableOnInteraction: true, + delay: 3000, + }, + mousewheel: { + passive: true, // 将 mousewheel 事件处理程序标记为被动的 + }, + // autoHeight: true, + pagination: { + el: ".blog-slider__pagination", + clickable: true, + }, + }); + + var comtainer = document.getElementById("swiper_container"); + if (comtainer !== null) { + comtainer.onmouseenter = function () { + swiper.autoplay.stop(); + }; + comtainer.onmouseleave = function () { + swiper.autoplay.start(); + }; + } + } + setTimeout(()=>{ + initBlogSlider() + }, 100) + diff --git a/blog/themes/anzhiyu/layout/includes/widget/card_ad.pug b/blog/themes/anzhiyu/layout/includes/widget/card_ad.pug new file mode 100644 index 0000000..b8e00fd --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/widget/card_ad.pug @@ -0,0 +1,3 @@ +if theme.ad && theme.ad.aside + .card-widget.ads-wrap + != theme.ad.aside diff --git a/blog/themes/anzhiyu/layout/includes/widget/card_announcement.pug b/blog/themes/anzhiyu/layout/includes/widget/card_announcement.pug new file mode 100644 index 0000000..e23088f --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/widget/card_announcement.pug @@ -0,0 +1,6 @@ +if theme.aside.card_announcement.enable + .card-widget.card-announcement + .item-headline + i.anzhiyufont.anzhiyu-icon-bullhorn.anzhiyu-shake + span= _p('aside.card_announcement') + .announcement_content!= theme.aside.card_announcement.content \ No newline at end of file diff --git a/blog/themes/anzhiyu/layout/includes/widget/card_archives.pug b/blog/themes/anzhiyu/layout/includes/widget/card_archives.pug new file mode 100644 index 0000000..e5347f6 --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/widget/card_archives.pug @@ -0,0 +1,8 @@ +if theme.aside.card_archives.enable + .card-archives + - let type = theme.aside.card_archives.type || 'monthly' + - let format = theme.aside.card_archives.format || 'MMMM YYYY' + - let order = theme.aside.card_archives.order || -1 + - let limit = theme.aside.card_archives.limit === 0 ? 0 : theme.aside.card_archives.limit || 8 + != aside_archives({ type:type, format: format, order: order, limit: limit }) + hr diff --git a/blog/themes/anzhiyu/layout/includes/widget/card_author.pug b/blog/themes/anzhiyu/layout/includes/widget/card_author.pug new file mode 100644 index 0000000..2555465 --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/widget/card_author.pug @@ -0,0 +1,20 @@ +if theme.aside.card_author.enable + .card-widget.card-info + .card-content + if theme.author_status.enable + .author-info__sayhi#author-info__sayhi(onclick="anzhiyu.changeSayHelloText()") + .author-info-avatar + img.avatar-img(src=url_for(theme.avatar.img) onerror=`this.onerror=null;this.src='` + url_for(theme.error_img.flink) + `'` alt="avatar") + if theme.author_status.enable && theme.author_status.statusImg + .author-status + img(src=url_for(theme.author_status.statusImg) class='g-status' alt="status") + + .author-info__description!= theme.aside.card_author.description || config.description + + if(theme.social) + .author-info__bottom-group + a.author-info__bottom-group-left(href=url_for(theme.aside.card_author.name_link)) + h1.author-info__name=config.author + .author-info__desc=config.subtitle + .card-info-social-icons.is-center + !=fragment_cache('social', function(){return partial('includes/header/social')}) diff --git a/blog/themes/anzhiyu/layout/includes/widget/card_bottom_self.pug b/blog/themes/anzhiyu/layout/includes/widget/card_bottom_self.pug new file mode 100644 index 0000000..e32907d --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/widget/card_bottom_self.pug @@ -0,0 +1,9 @@ +if site.data.widget && site.data.widget.bottom + each item in site.data.widget.bottom + .card-widget(class=item.class_name id=item.id_name style=item.order ? `order: ${item.order}` : '') + .item-headline + i(class=item.icon) + span=item.name + .item-content + !=item.html + diff --git a/blog/themes/anzhiyu/layout/includes/widget/card_categories.pug b/blog/themes/anzhiyu/layout/includes/widget/card_categories.pug new file mode 100644 index 0000000..529ea55 --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/widget/card_categories.pug @@ -0,0 +1,4 @@ +if theme.aside.card_categories.enable + if site.categories.length + .card-widget.card-categories + !=aside_categories({ limit: theme.aside.card_categories.limit === 0 ? 0 : theme.aside.card_categories.limit || 8 , expand: theme.aside.card_categories.expand }) diff --git a/blog/themes/anzhiyu/layout/includes/widget/card_console_archives.pug b/blog/themes/anzhiyu/layout/includes/widget/card_console_archives.pug new file mode 100644 index 0000000..547631a --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/widget/card_console_archives.pug @@ -0,0 +1,8 @@ +if theme.centerConsole.card_archives.enable + .card-archives + - let type = theme.centerConsole.card_archives.type || 'monthly' + - let format = theme.centerConsole.card_archives.format || 'MMMM YYYY' + - let order = theme.centerConsole.card_archives.order || -1 + - let limit = theme.centerConsole.card_archives.limit === 0 ? 0 : theme.centerConsole.card_archives.limit || 8 + != aside_archives({ type:type, format: format, order: order, limit: limit }) + hr diff --git a/blog/themes/anzhiyu/layout/includes/widget/card_console_tags.pug b/blog/themes/anzhiyu/layout/includes/widget/card_console_tags.pug new file mode 100644 index 0000000..353a1d5 --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/widget/card_console_tags.pug @@ -0,0 +1,10 @@ +if theme.centerConsole.card_tags.enable + if site.tags.length + .card-tags + .item-headline + - let tagLimit = theme.centerConsole.card_tags.limit === 0 ? 0 : theme.centerConsole.card_tags.limit || 40 + if theme.centerConsole.card_tags.color + .card-tag-cloud!= cloudTags({source: site.tags, minfontsize: 1.05, maxfontsize: 1.05, limit: tagLimit, unit: 'rem', color: true, highlightTags: theme.centerConsole.card_tags.highlightTags}) + else + .card-tag-cloud!= cloudTags({source: site.tags, minfontsize: 1.05, maxfontsize: 1.05, limit: tagLimit, unit: 'rem', color: false, highlightTags: theme.centerConsole.card_tags.highlightTags}) + hr diff --git a/blog/themes/anzhiyu/layout/includes/widget/card_newest_comment.pug b/blog/themes/anzhiyu/layout/includes/widget/card_newest_comment.pug new file mode 100644 index 0000000..46e8b7e --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/widget/card_newest_comment.pug @@ -0,0 +1,8 @@ +if theme.newest_comments.enable + .console-card#card-newest-comments + .card-content + .author-content-item-tips=_p('console.interaction') + span.author-content-item-title + != _p('aside.card_newest_comments.headline') + .aside-list + span= _p('aside.card_newest_comments.loading_text') diff --git a/blog/themes/anzhiyu/layout/includes/widget/card_post_toc.pug b/blog/themes/anzhiyu/layout/includes/widget/card_post_toc.pug new file mode 100644 index 0000000..e0263a7 --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/widget/card_post_toc.pug @@ -0,0 +1,15 @@ +- let tocNumber = page.toc_number !== undefined ? page.toc_number : theme.toc.number +- let tocExpand = page.toc_expand !== undefined ? page.toc_expand : theme.toc.expand +- let tocExpandClass = tocExpand ? 'is-expand' : '' + +#card-toc.card-widget + .item-headline + i.anzhiyufont.anzhiyu-icon-bars + span= _p('aside.card_toc') + span.toc-percentage + + if (page.encrypt == true) + .toc-content.toc-div-class(class=tocExpandClass style="display:none")!=toc(page.origin, {list_number: tocNumber}) + else + .toc-content(class=tocExpandClass)!=toc(page.content, {list_number: tocNumber}) + \ No newline at end of file diff --git a/blog/themes/anzhiyu/layout/includes/widget/card_recent_post.pug b/blog/themes/anzhiyu/layout/includes/widget/card_recent_post.pug new file mode 100644 index 0000000..2a29493 --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/widget/card_recent_post.pug @@ -0,0 +1,24 @@ +if theme.aside.card_recent_post.enable + .card-widget.card-recent-post + .item-headline + i.anzhiyufont.anzhiyu-icon-history + span= _p('aside.card_recent_post') + .aside-list + - let postLimit = theme.aside.card_recent_post.limit === 0 ? site.posts.length : theme.aside.card_recent_post.limit || 5 + - let sort = theme.aside.card_recent_post.sort === 'updated' ? 'updated' : 'date' + - site.posts.sort(sort, -1).limit(postLimit).each(function(article){ + - let link = article.link || article.path + - let title = article.title || _p('no_title') + - let no_cover = article.cover === false || !theme.cover.aside_enable ? 'no-cover' : '' + - let post_cover = article.cover + .aside-list-item(class=no_cover) + if post_cover && theme.cover.aside_enable + a.thumbnail(href=url_for(link) title=title) + img(src=url_for(post_cover) onerror=`this.onerror=null;this.src='${url_for(theme.error_img.post_page)}'` alt=title) + .content + a.title(href=url_for(link) title=title)= title + if theme.aside.card_recent_post.sort === 'updated' + time(datetime=date_xml(article.updated) title=_p('post.updated') + ' ' + full_date(article.updated)) #[=date(article.updated, config.date_format)] + else + time(datetime=date_xml(article.date) title=_p('post.created') + ' ' + full_date(article.date)) #[=date(article.date, config.date_format)] + - }) \ No newline at end of file diff --git a/blog/themes/anzhiyu/layout/includes/widget/card_tags.pug b/blog/themes/anzhiyu/layout/includes/widget/card_tags.pug new file mode 100644 index 0000000..c49dea0 --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/widget/card_tags.pug @@ -0,0 +1,10 @@ +if theme.aside.card_tags.enable + if site.tags.length + .card-tags + .item-headline + - let tagLimit = theme.aside.card_tags.limit === 0 ? 0 : theme.aside.card_tags.limit || 40 + if theme.aside.card_tags.color + .card-tag-cloud!= cloudTags({source: site.tags, minfontsize: 1.05, maxfontsize: 1.05, limit: tagLimit, unit: 'rem', color: true, highlightTags: theme.aside.card_tags.highlightTags}) + else + .card-tag-cloud!= cloudTags({source: site.tags, minfontsize: 1.05, maxfontsize: 1.05, limit: tagLimit, unit: 'rem', color: false, highlightTags: theme.aside.card_tags.highlightTags}) + hr diff --git a/blog/themes/anzhiyu/layout/includes/widget/card_top_self.pug b/blog/themes/anzhiyu/layout/includes/widget/card_top_self.pug new file mode 100644 index 0000000..6e81059 --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/widget/card_top_self.pug @@ -0,0 +1,8 @@ +if site.data.widget && site.data.widget.top + each item in site.data.widget.top + .card-widget(class=item.class_name id=item.id_name) + .item-headline + i(class=item.icon) + span=item.name + .item-content + !=item.html \ No newline at end of file diff --git a/blog/themes/anzhiyu/layout/includes/widget/card_webinfo.pug b/blog/themes/anzhiyu/layout/includes/widget/card_webinfo.pug new file mode 100644 index 0000000..c6f982d --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/widget/card_webinfo.pug @@ -0,0 +1,47 @@ +if theme.aside.card_webinfo.enable + .card-webinfo + .item-headline + i.anzhiyufont.anzhiyu-icon-chart-line + span= _p('aside.card_webinfo.headline') + .webinfo + if theme.aside.card_webinfo.post_count + .webinfo-item + .webinfo-item-title + i.anzhiyufont.anzhiyu-icon-file-lines + .item-name= _p('aside.card_webinfo.article_name') + " :" + .item-count= site.posts.length + if theme.runtimeshow.enable + .webinfo-item + .webinfo-item-title + i.anzhiyufont.anzhiyu-icon-stopwatch + .item-name= _p('aside.card_webinfo.runtime.name') + " :" + .item-count#runtimeshow(data-publishDate=date_xml(theme.runtimeshow.publish_date)) + i.anzhiyufont.anzhiyu-icon-spinner.anzhiyu-spin + if theme.wordcount.enable && theme.wordcount.total_wordcount + .webinfo-item + .webinfo-item-title + i.anzhiyufont.anzhiyu-icon-font + .item-name=_p('aside.card_webinfo.site_wordcount') + " :" + .item-count=totalcount(site) + if theme.busuanzi.site_uv + .webinfo-item + .webinfo-item-title + i.anzhiyufont.anzhiyu-icon-universal-access + .item-name= _p('aside.card_webinfo.site_uv_name') + " :" + .item-count#busuanzi_value_site_uv + i.anzhiyufont.anzhiyu-icon-spinner.anzhiyu-spin + if theme.busuanzi.site_pv + .webinfo-item + .webinfo-item-title + i.anzhiyufont.anzhiyu-icon-square-poll-vertical + .item-name= _p('aside.card_webinfo.site_pv_name') + " :" + .item-count#busuanzi_value_site_pv + i.anzhiyufont.anzhiyu-icon-spinner.anzhiyu-spin + if theme.aside.card_webinfo.last_push_date + .webinfo-item + .webinfo-item-title + i.anzhiyufont.anzhiyu-icon-hourglass-start + .item-name= _p('aside.card_webinfo.last_push_date.name') + " :" + .item-count#last-push-date(data-lastPushDate=date_xml(Date.now())) + i.anzhiyufont.anzhiyu-icon-spinner.anzhiyu-spin + diff --git a/blog/themes/anzhiyu/layout/includes/widget/card_weixin.pug b/blog/themes/anzhiyu/layout/includes/widget/card_weixin.pug new file mode 100644 index 0000000..76c3ef1 --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/widget/card_weixin.pug @@ -0,0 +1,8 @@ +- let faceImg = theme.aside.card_weixin.face +- let backFaceImg = theme.aside.card_weixin.backFace +if theme.aside.card_weixin.enable + .card-widget.anzhiyu-right-widget#card-wechat(onclick="window.open("/")") + #flip-wrapper + #flip-content + .face(style=`background: url(${faceImg}) center center / 100% no-repeat`) + .back.face(style=`background: url(${backFaceImg}) center center / 100% no-repeat`) \ No newline at end of file diff --git a/blog/themes/anzhiyu/layout/includes/widget/index.pug b/blog/themes/anzhiyu/layout/includes/widget/index.pug new file mode 100644 index 0000000..c8c932b --- /dev/null +++ b/blog/themes/anzhiyu/layout/includes/widget/index.pug @@ -0,0 +1,35 @@ +#aside-content.aside-content + //- post + if is_post() + - const tocStyle = page.toc_style_simple + - const tocStyleVal = tocStyle === true || tocStyle === false ? tocStyle : theme.toc.style_simple + if showToc && tocStyleVal + .sticky_layout + include ./card_post_toc.pug + else + !=partial('includes/widget/card_author', {}, {cache: true}) + !=partial('includes/widget/card_announcement', {}, {cache: true}) + !=partial('includes/widget/card_weixin', {}, {cache: true}) + !=partial('includes/widget/card_top_self', {}, {cache: true}) + .sticky_layout + if showToc + include ./card_post_toc.pug + !=partial('includes/widget/card_recent_post', {}, {cache: true}) + !=partial('includes/widget/card_ad', {}, {cache: true}) + else + //- page + !=partial('includes/widget/card_author', {}, {cache: true}) + !=partial('includes/widget/card_announcement', {}, {cache: true}) + !=partial('includes/widget/card_weixin', {}, {cache: true}) + !=partial('includes/widget/card_top_self', {}, {cache: true}) + !=partial('includes/widget/card_categories', {}, {cache: true}) + + .sticky_layout + if showToc + include ./card_post_toc.pug + .card-widget + !=partial('includes/widget/card_ad', {}, {cache: true}) + !=partial('includes/widget/card_tags', {}, {cache: true}) + !=partial('includes/widget/card_archives', {}, {cache: true}) + !=partial('includes/widget/card_webinfo', {}, {cache: true}) + !=partial('includes/widget/card_bottom_self', {}, {cache: true}) \ No newline at end of file diff --git a/blog/themes/anzhiyu/layout/index.pug b/blog/themes/anzhiyu/layout/index.pug new file mode 100644 index 0000000..8a28f68 --- /dev/null +++ b/blog/themes/anzhiyu/layout/index.pug @@ -0,0 +1,8 @@ +extends includes/layout.pug + +block content + include ./includes/mixins/post-ui.pug + #recent-posts.recent-posts + include includes/categoryGroup.pug + +postUI + include includes/pagination.pug diff --git a/blog/themes/anzhiyu/layout/page.pug b/blog/themes/anzhiyu/layout/page.pug new file mode 100644 index 0000000..13eed16 --- /dev/null +++ b/blog/themes/anzhiyu/layout/page.pug @@ -0,0 +1,35 @@ +extends includes/layout.pug + +block content + #page + if top_img === false && !page.top_single + h1.page-title= page.title + case page.type + when 'tags' + include includes/page/tags.pug + when 'link' + include includes/page/flink.pug + when 'categories' + include includes/page/categories.pug + when 'essay' + include includes/page/essay.pug + when 'room' + include includes/page/room.pug + when 'about' + include includes/page/about.pug + when 'album' + include includes/page/album.pug + when 'fcircle' + include includes/page/fcircle.pug + when 'album_detail' + include includes/page/album_detail.pug + when 'music' + include includes/page/music.pug + when 'equipment' + include includes/page/equipment.pug + default + include includes/page/default-page.pug + + if page.comments !== false && theme.comments && theme.comments.use + - var commentsJsLoad = true + !=partial('includes/third-party/comments/index', {}, {cache: true}) \ No newline at end of file diff --git a/blog/themes/anzhiyu/layout/post.pug b/blog/themes/anzhiyu/layout/post.pug new file mode 100644 index 0000000..6c7e0d2 --- /dev/null +++ b/blog/themes/anzhiyu/layout/post.pug @@ -0,0 +1,45 @@ +extends includes/layout.pug + +block content + #post + if top_img === false || page.bilibili_bg + include includes/header/post-info.pug + if theme.post_head_ai_description + include includes/anzhiyu/ai-info.pug + - let url = page.copyright_url || page.permalink + article#article-container.post-content(itemscope itemtype=url_for(url)) + header + if (theme.post_meta.post.categories && page.categories && page.categories.data.length > 0) + each item, index in page.categories.data + a(href=url_for(item.path) itemprop="url").post-meta-categories #[=item.name] + if (theme.post_meta.page.tags) + each item, index in page.tags.data + a(href=url_for(item.path) tabindex="-1" itemprop="url")=item.name + h1#CrawlerTitle(itemprop="name headline")= page.title || _p('no_title') + - let author = page.copyright_author || config.author + span(itemprop="author" itemscope itemtype="http://schema.org/Person")=author + if (theme.post_meta.post.date_type) + if (theme.post_meta.post.date_type === 'both') + time(itemprop="dateCreated datePublished" datetime=date_xml(page.date) title=_p('post.created') + ' ' + full_date(page.date))=date(page.date, config.date_format) + time(itemprop="dateCreated datePublished" datetime=date_xml(page.updated) title=_p('post.updated') + ' ' + full_date(page.updated))=date(page.updated, config.date_format) + else + - let data_type_update = theme.post_meta.post.date_type === 'updated' + - let date_type = data_type_update ? 'updated' : 'date' + time(itemprop="dateCreated datePublished" datetime=date_xml(page[date_type]) title=date_title + ' ' + full_date(page[date_type]))=date(page[date_type], config.date_format) + !=page.content + + include includes/post/post-copyright.pug + + //- ad + if theme.ad && theme.ad.post + .ads-wrap!=theme.ad.post + + if theme.post_pagination + include includes/pagination.pug + if theme.related_post && theme.related_post.enable + != related_posts(page,site.posts) + + if page.comments !== false && theme.comments && theme.comments.use + - var commentsJsLoad = true + !=partial('includes/third-party/comments/index', {}, {cache: true}) + \ No newline at end of file diff --git a/blog/themes/anzhiyu/layout/tag.pug b/blog/themes/anzhiyu/layout/tag.pug new file mode 100644 index 0000000..dc46b8d --- /dev/null +++ b/blog/themes/anzhiyu/layout/tag.pug @@ -0,0 +1,16 @@ +extends includes/layout.pug + +block content + if theme.tag_ui == 'index' + include ./includes/mixins/post-ui.pug + #recent-posts.recent-posts + +postUI + include includes/pagination.pug + else + include ./includes/mixins/article-sort.pug + #tag + #tag-page-tags + !=tags_page_list("tags") + .article-sort-title= page.tag + +articleSort(page.posts, page.current) + include includes/pagination.pug \ No newline at end of file diff --git a/blog/themes/anzhiyu/package.json b/blog/themes/anzhiyu/package.json new file mode 100644 index 0000000..9e122b9 --- /dev/null +++ b/blog/themes/anzhiyu/package.json @@ -0,0 +1,32 @@ +{ + "name": "hexo-theme-anzhiyu", + "version": "1.7.1", + "description": "A Simple and Card UI Design theme for Hexo", + "main": "package.json", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [ + "hexo", + "theme", + "anzhiyu", + "Card UI Design", + "AnZhiYu", + "hexo-theme-anzhiyu" + ], + "repository": { + "type": "git", + "url": "https://github.com/anzhiyu-c/hexo-theme-anzhiyu.git" + }, + "bugs": { + "url": "https://github.com/anzhiyu-c/hexo-theme-anzhiyu/issues", + "email": "me@anheyu.com" + }, + "dependencies": { + "hexo-renderer-stylus": "^3.0.0", + "hexo-renderer-pug": "^3.0.0" + }, + "homepage": "https://hexo.anheyu.com/", + "author": "anzhiyu ", + "license": "GPL-3.0" +} diff --git a/blog/themes/anzhiyu/plugins.yml b/blog/themes/anzhiyu/plugins.yml new file mode 100644 index 0000000..2283086 --- /dev/null +++ b/blog/themes/anzhiyu/plugins.yml @@ -0,0 +1,234 @@ +algolia_search: + name: algoliasearch + file: dist/algoliasearch-lite.umd.js + version: 4.18.0 +instantsearch: + name: instantsearch.js + file: dist/instantsearch.production.min.js + version: 4.84.0 +docsearch_js: + name: "@docsearch/js" + other_name: docsearch-js + file: dist/umd/index.js + version: 4.3.2 +docsearch_css: + name: "@docsearch/css" + other_name: docsearch-css + file: dist/style.css + version: 4.3.2 +pjax: + name: pjax + file: pjax.min.js + version: 0.2.8 +blueimp_md5: + name: blueimp-md5 + file: js/md5.min.js + version: 2.19.0 +valine: + name: valine + file: dist/Valine.min.js + version: 1.5.1 +twikoo: + name: twikoo + file: dist/twikoo.all.min.js + version: 1.6.44 +waline_js: + name: "@waline/client" + file: dist/waline.js + other_name: waline + version: 3.8.0 +waline_css: + name: "@waline/client" + file: dist/waline.css + other_name: waline + version: 3.8.0 +waline_meta_css: + name: "@waline/client" + file: dist/waline-meta.css + other_name: waline + version: 3.8.0 +sharejs: + name: butterfly-extsrc + file: sharejs/dist/js/social-share.min.js + version: 1.1.3 +sharejs_css: + name: butterfly-extsrc + file: sharejs/dist/css/share.min.css + version: 1.1.3 +mathjax: + name: mathjax + file: es5/tex-mml-chtml.js + version: 4.0.0 +katex: + name: katex + file: dist/katex.min.css + other_name: KaTeX + version: 0.16.25 +katex_copytex: + name: katex + file: dist/contrib/copy-tex.min.js + other_name: KaTeX + version: 0.16.25 +mermaid: + name: mermaid + file: dist/mermaid.min.js + version: 11.12.2 +canvas_ribbon: + name: butterfly-extsrc + file: dist/canvas-ribbon.min.js + version: 1.1.3 +canvas_fluttering_ribbon: + name: butterfly-extsrc + file: dist/canvas-fluttering-ribbon.min.js + version: 1.1.3 +canvas_nest: + name: butterfly-extsrc + file: dist/canvas-nest.min.js + version: 1.1.3 +activate_power_mode: + name: butterfly-extsrc + file: dist/activate-power-mode.min.js + version: 1.1.3 +fireworks: + name: butterfly-extsrc + file: dist/fireworks.min.js + version: 1.1.3 +click_heart: + name: butterfly-extsrc + file: dist/click-heart.min.js + version: 1.1.3 +ClickShowText: + name: butterfly-extsrc + file: dist/click-show-text.min.js + version: 1.1.3 +lazyload: + name: vanilla-lazyload + file: dist/lazyload.iife.min.js + version: 19.1.3 +instantpage: + name: instant.page + file: instantpage.js + version: 5.2.0 +typed: + name: typed.js + file: dist/typed.umd.js + version: 2.1.0 +pangu: + name: pangu + file: dist/browser/pangu.min.js + version: 4.0.7 +fancybox_css: + name: "@fancyapps/ui" + file: dist/fancybox/fancybox.css + version: 6.1.6 + other_name: fancyapps-ui +fancybox: + name: "@fancyapps/ui" + file: dist/fancybox/fancybox.umd.js + version: 6.1.6 + other_name: fancyapps-ui +medium_zoom: + name: medium-zoom + file: dist/medium-zoom.min.js + version: 1.1.0 +snackbar_css: + name: node-snackbar + file: dist/snackbar.min.css + version: 0.1.16 +snackbar: + name: node-snackbar + file: dist/snackbar.min.js + version: 0.1.16 +fontawesome: + name: "@fortawesome/fontawesome-free" + file: css/all.min.css + other_name: font-awesome + version: 7.1.0 +flickr_justified_gallery_js: + name: flickr-justified-gallery + file: dist/fjGallery.min.js + version: 2.2.0 +flickr_justified_gallery_css: + name: flickr-justified-gallery + file: dist/fjGallery.css + version: 2.2.0 +aplayer_css: + name: anzhiyu-theme-static + file: aplayer/APlayer.min.css + version: 1.0.0 +aplayer_js: + name: anzhiyu-blog-static + file: js/APlayer.min.js + version: 1.0.1 +meting_js: + name: hexo-anzhiyu-music + file: assets/js/Meting2.min.js + version: 1.0.1 +prismjs_js: + name: prismjs + file: prism.js + other_name: prism + version: 1.30.0 +prismjs_lineNumber_js: + name: prismjs + file: plugins/line-numbers/prism-line-numbers.min.js + other_name: prism + version: 1.30.0 +prismjs_autoloader: + name: prismjs + file: plugins/autoloader/prism-autoloader.min.js + other_name: prism + version: 1.30.0 +artalk_js: + name: artalk + file: dist/Artalk.js + version: 2.9.1 +artalk_css: + name: artalk + file: dist/Artalk.css + version: 2.9.1 +pace_js: + name: pace-js + other_name: pace + file: pace.min.js + version: 1.2.4 +pace_default_css: + name: anzhiyu-theme-static + file: progress_bar/progress_bar.css + version: 1.1.10 +coin_js: + name: anzhiyu-theme-static + file: coin/coin.js + version: 1.0.0 +coin_css: + name: anzhiyu-theme-static + file: coin/coin.min.css + version: 1.0.0 +countup_js: + name: anzhiyu-theme-static + file: countup/countup.js + version: 1.0.0 +gsap_js: + name: anzhiyu-theme-static + file: gsap/gsap.min.js + version: 1.0.0 +rightmenu: + name: anzhiyu-theme-static + file: rightmenu/rightmenu.js + version: 1.0.0 +waterfall: + name: anzhiyu-theme-static + file: waterfall/waterfall.js + version: 1.0.0 +ali_iconfont_css: + name: anzhiyu-theme-static + file: icon/ali_iconfont_css.css + version: 1.1.9 +accesskey_js: + name: anzhiyu-theme-static + file: accesskey/accesskey.js + version: 1.1.5 +colorthief: + name: colorthief + file: dist/color-thief.umd.min.js + version: 2.6.0 diff --git a/blog/themes/anzhiyu/scripts/events/404.js b/blog/themes/anzhiyu/scripts/events/404.js new file mode 100644 index 0000000..0ea74ac --- /dev/null +++ b/blog/themes/anzhiyu/scripts/events/404.js @@ -0,0 +1,18 @@ +/** + * AnZhiYu + * 404 error page + */ + +'use strict' + +hexo.extend.generator.register('404', function (locals) { + if (!hexo.theme.config.error_404.enable) return + return { + path: '404.html', + layout: ['page'], + data: { + type: '404', + top_img: false + } + } +}) diff --git a/blog/themes/anzhiyu/scripts/events/cdn.js b/blog/themes/anzhiyu/scripts/events/cdn.js new file mode 100644 index 0000000..b68c724 --- /dev/null +++ b/blog/themes/anzhiyu/scripts/events/cdn.js @@ -0,0 +1,126 @@ +/** + * AnZhiYu + * Merge CDN + */ + +"use strict"; + +const { version } = require("../../package.json"); +const path = require("path"); + +hexo.extend.filter.register("before_generate", () => { + const themeConfig = hexo.theme.config; + const { CDN } = themeConfig; + + const thirdPartySrc = hexo.render.renderSync({ path: path.join(hexo.theme_dir, "/plugins.yml"), engine: "yaml" }); + const internalSrc = { + main: { + name: "hexo-theme-anzhiyu", + file: "js/main.js", + version, + }, + utils: { + name: "hexo-theme-anzhiyu", + file: "js/utils.js", + version, + }, + translate: { + name: "hexo-theme-anzhiyu", + file: "js/tw_cn.js", + version, + }, + local_search: { + name: "hexo-theme-anzhiyu", + file: "js/search/local-search.js", + version, + }, + algolia_js: { + name: "hexo-theme-anzhiyu", + file: "js/search/algolia.js", + version, + }, + random_friends_post_js: { + name: "hexo-theme-anzhiyu", + file: "js/anzhiyu/random_friends_post.js", + version, + }, + right_click_menu_js: { + name: "hexo-theme-anzhiyu", + file: "js/anzhiyu/right_click_menu.js", + version, + }, + comment_barrage_js: { + name: "hexo-theme-anzhiyu", + file: "js/anzhiyu/comment_barrage.js", + version, + }, + ai_abstract_js: { + name: "hexo-theme-anzhiyu", + file: "js/anzhiyu/ai_abstract.js", + version, + }, + people_js: { + name: "hexo-theme-anzhiyu", + file: "js/anzhiyu/people.js", + version, + }, + }; + + const minFile = file => { + return file.replace(/(? ".min" + ext); + }; + + const createCDNLink = (data, type, cond = "") => { + Object.keys(data).map(key => { + let { name, version, file, other_name } = data[key]; + + const cdnjs_name = other_name || name; + const cdnjs_file = file.replace(/^[lib|dist]*\/|browser\//g, ""); + const min_cdnjs_file = minFile(cdnjs_file); + if (cond === "internal") file = `source/${file}`; + const min_file = minFile(file); + const verType = CDN.version ? `@${version}` : ""; + + const value = { + version, + name, + file, + cdnjs_file, + min_file, + min_cdnjs_file, + cdnjs_name, + }; + const cdnSource = { + local: cond === "internal" ? cdnjs_file : `/pluginsSrc/${name}/${file}`, + jsdelivr: `https://cdn.jsdelivr.net/npm/${name}${verType}/${min_file}`, + unpkg: `https://unpkg.com/${name}${verType}/${file}`, + cdnjs: `https://cdnjs.cloudflare.com/ajax/libs/${cdnjs_name}/${version}/${min_cdnjs_file}`, + elemecdn: `https://npm.elemecdn.com/${name}${verType}/${file}`, + onmicrosoft: `https://npm.onmicrosoft.cn/${name}${verType}/${file}`, + cbd: `https://cdn.cbd.int/${name}${verType}/${file}`, + anheyu: `https://cdn.anheyu.com/npm/${name}${verType}/${min_file}`, + custom: (CDN.custom_format || "").replace(/\$\{(.+?)\}/g, (match, $1) => value[$1]), + }; + + data[key] = cdnSource[type]; + }); + + if (cond === "internal") data["main_css"] = "css/index.css"; + return data; + }; + + // delete null value + const deleteNullValue = obj => { + if (!obj) return; + for (const i in obj) { + obj[i] === null && delete obj[i]; + } + return obj; + }; + + themeConfig.asset = Object.assign( + createCDNLink(internalSrc, CDN.internal_provider, "internal"), + createCDNLink(thirdPartySrc, CDN.third_party_provider), + deleteNullValue(CDN.option) + ); +}); diff --git a/blog/themes/anzhiyu/scripts/events/comment.js b/blog/themes/anzhiyu/scripts/events/comment.js new file mode 100644 index 0000000..b1ef856 --- /dev/null +++ b/blog/themes/anzhiyu/scripts/events/comment.js @@ -0,0 +1,14 @@ +/** + * Capitalize the first letter of comment name + */ + +hexo.extend.filter.register('before_generate', () => { + const themeConfig = hexo.theme.config + let { use } = themeConfig.comments + if (!use) return + if (typeof use === 'string') { + use = use.split(',') + } + const newArray = use.map(item => item.toLowerCase().replace(/\b[a-z]/g, s => s.toUpperCase())) + themeConfig.comments.use = newArray +}) \ No newline at end of file diff --git a/blog/themes/anzhiyu/scripts/events/init.js b/blog/themes/anzhiyu/scripts/events/init.js new file mode 100644 index 0000000..bbcda67 --- /dev/null +++ b/blog/themes/anzhiyu/scripts/events/init.js @@ -0,0 +1,20 @@ +hexo.extend.filter.register("before_generate", () => { + // Get first two digits of the Hexo version number + const hexoVer = hexo.version.replace(/(^.*\..*)\..*/, "$1"); + const logger = hexo.log; + + if (hexoVer < 5.3) { + logger.error("Please update Hexo to V5.3.0 or higher!"); + logger.error("请把 Hexo 升级到 V5.3.0 或更高的版本!"); + process.exit(-1); + } + + if (hexo.locals.get) { + const data = hexo.locals.get("data"); + if (data && data.anzhiyu) { + logger.error(" 'anzhiyu.yml' is deprecated. Please use '_config.anzhiyu.yml' "); + logger.error(" 'anzhiyu.yml' 已经弃用,请使用 '_config.anzhiyu.yml' "); + process.exit(-1); + } + } +}); diff --git a/blog/themes/anzhiyu/scripts/events/merge_config.js b/blog/themes/anzhiyu/scripts/events/merge_config.js new file mode 100644 index 0000000..633c058 --- /dev/null +++ b/blog/themes/anzhiyu/scripts/events/merge_config.js @@ -0,0 +1,680 @@ +hexo.extend.filter.register( + "before_generate", + () => { + const defaultConfig = { + nav: { + travelling: true, + clock: false, + }, + menu: null, + highlight_theme: "light", + highlight_copy: true, + highlight_lang: true, + highlight_shrink: false, + highlight_height_limit: false, + code_word_wrap: false, + social: null, + favicon: "/favicon.ico", + avatar: { + img: "https://npm.elemecdn.com/anzhiyu-blog-static@1.0.4/img/avatar.jpg", + effect: false, + }, + disable_top_img: false, + index_img: null, + default_top_img: null, + archive_img: null, + tag_img: null, + tag_per_img: null, + category_img: null, + category_per_img: null, + cover: { + index_enable: true, + aside_enable: true, + archives_enable: true, + position: "left", + default_cover: null, + }, + error_img: { + flink: "/img/friend_404.gif", + post_page: "/img/404.jpg", + }, + error_404: { + enable: true, + subtitle: "请尝试站内搜索寻找文章", + background: "https://bu.dusays.com/2023/05/08/645907596997d.gif", + }, + post_meta: { + page: { + date_type: "created", + date_format: "simple", + categories: true, + tags: true, + label: false, + }, + post: { + date_type: "both", + date_format: "date", + categories: true, + tags: true, + label: true, + unread: false, + }, + }, + index_post_content: { + method: 3, + length: 500, + }, + anchor: false, + photofigcaption: false, + copy: { + enable: true, + copyright: { + enable: false, + limit_count: 50, + }, + }, + toc: { + post: true, + page: false, + number: true, + expand: false, + style_simple: false, + }, + mainTone: { + enable: false, + mode: "api", + api: "https://img2color-go.vercel.app/api?img=", + cover_change: true, + }, + post_copyright: { + enable: true, + decode: false, + author_href: null, + location: "长沙", + license: "CC BY-NC-SA 4.0", + license_url: "https://creativecommons.org/licenses/by-nc-sa/4.0/", + avatarSinks: false, + copyright_author_img_back: null, + copyright_author_img_front: null, + copyright_author_link: "/", + }, + reward: { + enable: false, + text: null, + QR_code: null, + }, + post_edit: { + enable: true, + github: false, + yuque: false, + }, + related_post: { + enable: true, + limit: 6, + date_type: "created", + }, + post_pagination: 2, + noticeOutdate: { + enable: false, + style: "flat", + limit_day: 365, + position: "top", + message_prev: "It has been", + message_next: "days since the last update, the content of the article may be outdated.", + }, + footer: { + owner: { + enable: true, + since: 2020, + }, + custom_text: null, + runtime: { + enable: false, + launch_time: "04/01/2021 00:00:00", + work_img: "https://npm.elemecdn.com/anzhiyu-blog@2.0.4/img/badge/安知鱼-上班摸鱼中.svg", + work_description: "距离月入25k也就还差一个大佬带我~", + offduty_img: "https://npm.elemecdn.com/anzhiyu-blog@2.0.4/img/badge/安知鱼-下班啦.svg", + offduty_description: "下班了就该开开心心的玩耍,嘿嘿~", + }, + bdageitem: { + enable: false, + list: [ + { + link: "https://hexo.io/", + shields: "https://npm.elemecdn.com/anzhiyu-blog@2.1.5/img/badge/Frame-Hexo.svg", + message: "博客框架为Hexo_v5.4.0", + }, + { + link: "https://hexo.anheyu.com/", + shields: "https://npm.elemecdn.com/anzhiyu-theme-static@1.0.9/img/Theme-AnZhiYu-2E67D3.svg", + message: "本站使用AnZhiYu主题", + }, + ], + }, + socialBar: { + enable: false, + centerImg: null, + left: null, + right: null, + }, + list: { + enable: false, + randomFriends: 3, + project: null, + }, + footerBar: { + enable: true, + authorLink: "/", + cc: { + enable: false, + link: "/copyright", + }, + linkList: [ + { + link: "https://github.com/anzhiyu-c/hexo-theme-anzhiyu", + text: "主题", + }, + ], + subTitle: { + enable: false, + effect: true, + startDelay: 300, + typeSpeed: 150, + backSpeed: 50, + loop: true, + source: 1, + sub: null, + }, + }, + }, + h2Divider: false, + table_interlaced_discoloration: false, + article_double_row: true, + aside: { + enable: true, + hide: false, + button: true, + mobile: true, + position: "right", + display: { + archive: true, + tag: true, + category: true, + }, + card_author: { + enable: true, + description: null, + name_link: "/", + }, + card_announcement: { + enable: false, + content: "欢迎来看我的博客鸭~", + }, + card_weixin: { + enable: true, + face: "https://bu.dusays.com/2023/01/13/63c02edf44033.png", + backFace: "https://bu.dusays.com/2023/05/13/645fa415e8694.png", + }, + card_recent_post: { + enable: true, + limit: 5, + sort: "date", + sort_order: null, + }, + card_categories: { + enable: true, + limit: 8, + expand: "none", + sort_order: null, + }, + card_tags: { + enable: true, + limit: 40, + color: false, + orderby: "random", + order: 1, + sort_order: null, + highlightTags: null, + }, + card_archives: { + enable: true, + type: "monthly", + format: "MMMM YYYY", + order: -1, + limit: 8, + sort_order: null, + }, + card_webinfo: { + enable: true, + post_count: true, + last_push_date: true, + sort_order: null, + }, + card_post_series: { + enable: false, + orderBy: "date", + order: -1, + }, + }, + busuanzi: { + site_uv: true, + site_pv: true, + page_pv: true, + }, + runtimeshow: { + enable: false, + publish_date: null, + }, + newest_comments: { + enable: false, + sort_order: null, + limit: 6, + storage: 10, + avatar: true, + }, + translate: { + enable: false, + default: "繁", + defaultEncoding: 2, + translateDelay: 0, + msgToTraditionalChinese: "繁", + msgToSimplifiedChinese: "簡", + rightMenuMsgToTraditionalChinese: "转为繁体", + rightMenuMsgToSimplifiedChinese: "转为简体", + }, + readmode: true, + centerConsole: { + enable: true, + card_tags: { + enable: true, + limit: 40, + color: false, + sort_order: null, + highlightTags: null, + }, + card_archives: { + enable: true, + type: "monthly", + format: "MMMM YYYY", + order: -1, + limit: 8, + sort_order: null, + }, + }, + darkmode: { + enable: true, + button: true, + autoChangeMode: false, + start: null, + end: null, + }, + rightside_item_order: { + enable: false, + hide: null, + show: null, + }, + mathjax: { + enable: false, + per_page: false, + }, + katex: { + enable: false, + per_page: false, + hide_scrollbar: true, + }, + algolia_search: { + enable: false, + hits: { + per_page: 6, + }, + }, + local_search: { + enable: false, + preload: false, + top_n_per_article: 1, + unescape: false, + CDN: null, + }, + docsearch: { + enable: false, + appId: null, + apiKey: null, + indexName: null, + option: null, + }, + sharejs: { + enable: true, + sites: "facebook,twitter,wechat,weibo,qq", + }, + addtoany: { + enable: false, + item: "facebook,twitter,wechat,sina_weibo,facebook_messenger,email,copy_link", + }, + comments: { + use: null, + text: true, + lazyload: false, + count: false, + card_post_count: false, + }, + valine: { + appId: null, + appKey: null, + avatar: "monsterid", + serverURLs: null, + bg: null, + visitor: false, + option: null, + }, + waline: { + serverURL: null, + bg: null, + pageview: false, + option: null, + }, + facebook_comments: { + app_id: null, + user_id: null, + pageSize: 10, + order_by: "social", + lang: "zh_TW", + }, + twikoo: { + envId: null, + region: null, + visitor: false, + option: null, + }, + artalk: { + server: null, + site: null, + visitor: false, + option: null, + }, + chat_btn: false, + chat_hide_show: false, + chatra: { + enable: false, + id: null, + }, + tidio: { + enable: false, + public_key: null, + }, + daovoice: { + enable: false, + app_id: null, + }, + crisp: { + enable: false, + website_id: null, + }, + baidu_analytics: null, + google_analytics: null, + cloudflare_analytics: null, + microsoft_clarity: null, + google_adsense: { + enable: false, + auto_ads: true, + js: "https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js", + client: null, + enable_page_level_ads: true, + }, + site_verification: null, + index_site_info_top: null, + index_top_img_height: null, + category_ui: null, + tag_ui: null, + text_align_justify: false, + background: null, + footer_bg: false, + mask: { + header: true, + footer: true, + }, + rightside_bottom: null, + enter_transitions: true, + activate_power_mode: { + enable: false, + colorful: true, + shake: true, + mobile: false, + }, + canvas_ribbon: { + enable: false, + size: 150, + alpha: 0.6, + zIndex: -1, + click_to_change: false, + mobile: false, + }, + canvas_fluttering_ribbon: { + enable: false, + mobile: false, + }, + canvas_nest: { + enable: false, + color: "0,0,255", + opacity: 0.7, + zIndex: -1, + count: 99, + mobile: false, + }, + fireworks: { + enable: false, + zIndex: 9999, + mobile: false, + }, + click_heart: { + enable: false, + mobile: false, + }, + clickShowText: { + enable: false, + text: null, + fontSize: "15px", + random: false, + mobile: false, + }, + display_mode: "light", + beautify: { + enable: false, + field: "post", + "title-prefix-icon": null, + "title-prefix-icon-color": null, + }, + font: { + "global-font-size": null, + "code-font-size": null, + "font-family": null, + "code-font-family": null, + }, + blog_title_font: { + font_link: null, + "font-family": null, + }, + hr_icon: { + enable: true, + icon: null, + "icon-top": null, + }, + subtitle: { + enable: false, + effect: true, + typed_option: null, + source: false, + sub: null, + }, + preloader: { + enable: false, + source: 1, + pace_css_url: null, + }, + wordcount: { + enable: false, + post_wordcount: true, + min2read: true, + total_wordcount: true, + }, + medium_zoom: false, + fancybox: true, + series: { + enable: true, + orderBy: "title", + order: 1, + number: true, + }, + abcjs: { + enable: false, + per_page: true, + }, + mermaid: { + enable: false, + theme: { + light: "default", + dark: "dark", + }, + }, + note: { + style: "flat", + icons: true, + border_radius: 3, + light_bg_offset: 0, + }, + pjax: { + enable: true, + exclude: null, + }, + universe: { + enable: true, + }, + bubble: { + enable: false, + }, + LA: { + enable: false, + ck: null, + LingQueMonitorID: null, + }, + diytitle: { + enable: true, + leaveTitle: "w(゚Д゚)w 不要走!再看看嘛!", + backTitle: "♪(^∇^*)欢迎肥来!", + }, + comment_barrage_config: { + enable: false, + maxBarrage: 1, + barrageTime: 4000, + accessToken: "", + mailMd5: "", + }, + nav_music: { + enable: true, + console_widescreen_music: false, + id: 8152976493, + server: "netease", + all_playlist: "https://y.qq.com/n/ryqq/playlist/8802438608", + }, + visitorMail: { + enable: true, + mail: "", + }, + ptool: { + enable: true, + share_mobile: true, + share_weibo: true, + share_copyurl: true, + categories: false, + mode: null, + }, + greetingBox: { + enable: false, + default: "晚上好👋", + list: null, + }, + post_head_ai_description: { + enable: true, + gptName: "AnZhiYu", + mode: "local", + switchBtn: false, + btnLink: "https://afdian.net/item/886a79d4db6711eda42a52540025c377", + randomNum: 3, + basicWordCount: 1000, + key: null, + Referer: null, + }, + accesskey: { + enable: true, + }, + linkPageTop: { + enable: false, + title: "与数百名博主无限进步", + addFriendPlaceholder: + "昵称(请勿包含博客等字样):\n网站地址(要求博客地址,请勿提交个人主页):\n头像图片url(请提供尽可能清晰的图片,我会上传到我自己的图床):\n描述:\n站点截图(可选):\n", + }, + pageThumbnailSuffix: null, + agreementPopup: { + enable: false, + url: "/privacy", + }, + rightClickMenu: { enable: false }, + peoplecanvas: { + enable: true, + img: "https://upload-bbs.miyoushe.com/upload/2023/09/03/125766904/ee23df8517f3c3e3efc4145658269c06_5714860933110284659.png", + }, + dynamicEffect: { + postTopWave: true, + postTopRollZoomInfo: false, + pageCommentsRollZoom: false, + }, + shortcutKey: { + enable: false, + delay: 100, + shiftDelay: 200, + }, + console: { + enable: true, + }, + aplayerInject: { + enable: false, + per_page: true, + }, + snackbar: { + enable: false, + position: "bottom-left", + bg_light: "#49b1f5", + bg_dark: "#1f1f1f", + }, + instantpage: false, + pangu: { + enable: false, + field: "site", + }, + lazyload: { + enable: false, + field: "site", + placeholder: null, + blur: false, + }, + Open_Graph_meta: { + enable: true, + option: null, + }, + css_prefix: true, + inject: { + head: null, + bottom: null, + }, + CDN: { + internal_provider: "local", + third_party_provider: "cbd", + version: true, + custom_format: null, + option: null, + }, + }; + + hexo.theme.config = Object.assign(defaultConfig, hexo.theme.config); + }, + 1 +); diff --git a/blog/themes/anzhiyu/scripts/events/stylus.js b/blog/themes/anzhiyu/scripts/events/stylus.js new file mode 100644 index 0000000..cd27ab2 --- /dev/null +++ b/blog/themes/anzhiyu/scripts/events/stylus.js @@ -0,0 +1,24 @@ +/** + * Stylus renderer + */ + +"use strict"; + +hexo.extend.filter.register("stylus:renderer", style => { + const { syntax_highlighter: syntaxHighlighter, highlight, prismjs } = hexo.config; + let { enable: highlightEnable, line_number: highlightLineNumber } = highlight; + let { enable: prismjsEnable, line_number: prismjsLineNumber } = prismjs; + + // for hexo > 7.0 + if (syntaxHighlighter) { + highlightEnable = syntaxHighlighter === "highlight.js"; + prismjsEnable = syntaxHighlighter === "prismjs"; + } + + style + .define("$highlight_enable", highlightEnable) + .define("$highlight_line_number", highlightLineNumber) + .define("$prismjs_enable", prismjsEnable) + .define("$prismjs_line_number", prismjsLineNumber); + // .import(`${this.source_dir.replace(/\\/g, '/')}_data/css/*`) +}); diff --git a/blog/themes/anzhiyu/scripts/events/welcome.js b/blog/themes/anzhiyu/scripts/events/welcome.js new file mode 100644 index 0000000..a5017dc --- /dev/null +++ b/blog/themes/anzhiyu/scripts/events/welcome.js @@ -0,0 +1,15 @@ +hexo.on("ready", () => { + const { version } = require("../../package.json"); + hexo.log.info(` + =================================================================== + + █████╗ ███╗ ██╗███████╗██╗ ██╗██╗██╗ ██╗██╗ ██╗ + ██╔══██╗████╗ ██║╚══███╔╝██║ ██║██║╚██╗ ██╔╝██║ ██║ + ███████║██╔██╗ ██║ ███╔╝ ███████║██║ ╚████╔╝ ██║ ██║ + ██╔══██║██║╚██╗██║ ███╔╝ ██╔══██║██║ ╚██╔╝ ██║ ██║ + ██║ ██║██║ ╚████║███████╗██║ ██║██║ ██║ ╚██████╔╝ + ╚═╝ ╚═╝╚═╝ ╚═══╝╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝ + + ${version} + ===================================================================`); +}); diff --git a/blog/themes/anzhiyu/scripts/filters/post_lazyload.js b/blog/themes/anzhiyu/scripts/filters/post_lazyload.js new file mode 100644 index 0000000..2660fb8 --- /dev/null +++ b/blog/themes/anzhiyu/scripts/filters/post_lazyload.js @@ -0,0 +1,33 @@ +/** + * AnZhiYu + * lazyload + * replace src to data-lazy-src + */ + +"use strict"; + +const urlFor = require("hexo-util").url_for.bind(hexo); + +const lazyload = htmlContent => { + const error_img = hexo.theme.config.error_img.post_page + const bg = hexo.theme.config.lazyload.placeholder + ? urlFor(hexo.theme.config.lazyload.placeholder) + : "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"; + return htmlContent.replace( + /( { + const { enable, field } = hexo.theme.config.lazyload + if (!enable || field !== 'site') return + return lazyload(data) +}) + +hexo.extend.filter.register('after_post_render', data => { + const { enable, field } = hexo.theme.config.lazyload + if (!enable || field !== 'post') return + data.content = lazyload(data.content) + return data +}) diff --git a/blog/themes/anzhiyu/scripts/filters/random_cover.js b/blog/themes/anzhiyu/scripts/filters/random_cover.js new file mode 100644 index 0000000..83873a4 --- /dev/null +++ b/blog/themes/anzhiyu/scripts/filters/random_cover.js @@ -0,0 +1,65 @@ +/** + * Butterfly + * ramdom cover + */ + +'use strict' + +hexo.extend.filter.register('before_post_render', data => { + const imgTestReg = /\.(png|jpe?g|gif|svg|webp)(\?.*)?$/i + let { cover: coverVal, top_img: topImg } = data + + // Add path to top_img and cover if post_asset_folder is enabled + if (hexo.config.post_asset_folder) { + if (topImg && topImg.indexOf('/') === -1 && imgTestReg.test(topImg)) data.top_img = `${data.path}${topImg}` + if (coverVal && coverVal.indexOf('/') === -1 && imgTestReg.test(coverVal)) data.cover = `${data.path}${coverVal}` + } + + const randomCoverFn = () => { + const { cover: { default_cover: defaultCover } } = hexo.theme.config + if (!defaultCover) return false + if (!Array.isArray(defaultCover)) return defaultCover + const num = Math.floor(Math.random() * defaultCover.length) + return defaultCover[num] + } + + if (coverVal === false) return data + + const uuid = () => { + var timestamp = new Date().getTime() + return 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { + var r = (timestamp + Math.random() * 16) % 16 | 0 + timestamp = Math.floor(timestamp / 16) + return (c == 'x' ? r : (r & 0x3 | 0x8)).toString(16) + }) + } + + const addUuidToUrl = (url) => { + try { + let urlParts = new URL(url) + let params = urlParts.searchParams + if (params.size > 0) { + params.append('_r_', uuid()) + } else { + params.set('_r_', uuid()) + } + return urlParts.toString() + } catch (error) { + return url + } + } + + // If cover is not set, use random cover + if (!coverVal) { + const randomCover = randomCoverFn() + const cover = randomCover ? addUuidToUrl(randomCover) : randomCover + data.cover = cover + coverVal = cover // update coverVal + } + + if (coverVal && (coverVal.indexOf('//') !== -1 || imgTestReg.test(coverVal))) { + data.cover_type = 'img' + } + + return data +}) \ No newline at end of file diff --git a/blog/themes/anzhiyu/scripts/helpers/aside_archives.js b/blog/themes/anzhiyu/scripts/helpers/aside_archives.js new file mode 100644 index 0000000..591c226 --- /dev/null +++ b/blog/themes/anzhiyu/scripts/helpers/aside_archives.js @@ -0,0 +1,116 @@ +/** + * AnZhiYu + * for aside archives + */ + +"use strict"; + +hexo.extend.helper.register("aside_archives", function (options = {}) { + const { config } = this; + const archiveDir = config.archive_dir; + const { timezone } = config; + const lang = toMomentLocale(this.page.lang || this.page.language || config.language); + let { format } = options; + const type = options.type || "monthly"; + const { transform } = options; + const showCount = Object.prototype.hasOwnProperty.call(options, "show_count") ? options.show_count : true; + const order = options.order || -1; + const compareFunc = + type === "monthly" + ? (yearA, monthA, yearB, monthB) => yearA === yearB && monthA === monthB + : (yearA, monthA, yearB, monthB) => yearA === yearB; + const limit = options.limit; + let result = ""; + + if (!format) { + format = type === "monthly" ? "MMMM YYYY" : "YYYY"; + } + + const posts = this.site.posts.sort("date", order); + if (!posts.length) return result; + + const data = []; + let length = 0; + + posts.forEach(post => { + // Clone the date object to avoid pollution + let date = post.date.clone(); + + if (timezone) date = date.tz(timezone); + + const year = date.year(); + const month = date.month() + 1; + const lastData = data[length - 1]; + + if (!lastData || !compareFunc(lastData.year, lastData.month, year, month)) { + if (lang) date = date.locale(lang); + const name = date.format(format); + length = data.push({ + name, + year, + month, + count: 1, + }); + } else { + lastData.count++; + } + }); + + const link = item => { + let url = `${archiveDir}/${item.year}/`; + + if (type === "monthly") { + if (item.month < 10) url += "0"; + url += `${item.month}/`; + } + + return this.url_for(url); + }; + + const len = data.length; + const Judge = limit === 0 ? len : Math.min(len, limit); + + result += `
${this._p( + "aside.card_archives" + )}`; + + if (len > Judge) { + result += ` + `; + } + + result += '
"; + return result; +}); + +const toMomentLocale = function (lang) { + if (lang === undefined) { + return undefined; + } + + // moment.locale('') equals moment.locale('en') + // moment.locale(null) equals moment.locale('en') + if (!lang || lang === "en" || lang === "default") { + return "en"; + } + return lang.toLowerCase().replace("_", "-"); +}; diff --git a/blog/themes/anzhiyu/scripts/helpers/aside_categories.js b/blog/themes/anzhiyu/scripts/helpers/aside_categories.js new file mode 100644 index 0000000..92d04b4 --- /dev/null +++ b/blog/themes/anzhiyu/scripts/helpers/aside_categories.js @@ -0,0 +1,99 @@ +/** + * AnZhiYu + * for aside categories + */ + +'use strict' + +hexo.extend.helper.register('aside_categories', function (categories, options) { + if (!options && (!categories || !Object.prototype.hasOwnProperty.call(categories, 'length')) + ) { + options = categories + categories = this.site.categories + } + + if (!categories || !categories.length) return '' + options = options || {} + const { config } = this + const showCount = Object.prototype.hasOwnProperty.call(options, 'show_count') + ? options.show_count + : true + const depth = options.depth ? parseInt(options.depth, 10) : 0 + const orderby = options.orderby || 'name' + const order = options.order || 1 + const categoryDir = this.url_for(config.category_dir) + const limit = options.limit === 0 ? categories.length : options.limit + const isExpand = options.expand !== 'none' + const expandClass = isExpand && options.expand === true ? 'expand' : '' + const buttonLabel = this._p('aside.more_button') + const prepareQuery = (parent) => { + const query = {} + if (parent) { query.parent = parent } else { query.parent = { $exists: false } } + return categories.find(query).sort(orderby, order).filter((cat) => cat.length) + } + let expandBtn = '' + + const hierarchicalList = (t, level, parent, topparent = true) => { + let result = '' + const isTopParent = topparent + if (t > 0) { + prepareQuery(parent).forEach((cat, i) => { + if (t > 0) { + t = t - 1 + let child + if (!depth || level + 1 < depth) { + const childList = hierarchicalList(t, level + 1, cat._id, false) + child = childList[0] + t = childList[1] + } + + const parentClass = isExpand && isTopParent && child ? 'parent' : '' + + result += `
  • ` + + result += `` + + result += `${cat.name}` + + if (showCount) { + result += `${cat.length}` + } + + if (isExpand && isTopParent && child) { + expandBtn = ' expandBtn' + result += `` + } + + result += '' + + if (child) { + result += `
      ${child}
    ` + } + + result += '
  • ' + } + }) + } + + return [result, t] + } + + const list = hierarchicalList(limit, 0) + + const moreButton = function () { + if (categories.length <= limit) return '' + const moreHtml = ` + ` + + return moreHtml + } + + return `
    + + ${this._p('aside.card_categories')} + ${moreButton()} +
    +
      + ${list[0]} +
    ` +}) \ No newline at end of file diff --git a/blog/themes/anzhiyu/scripts/helpers/catalog_list.js b/blog/themes/anzhiyu/scripts/helpers/catalog_list.js new file mode 100644 index 0000000..72e7bc1 --- /dev/null +++ b/blog/themes/anzhiyu/scripts/helpers/catalog_list.js @@ -0,0 +1,13 @@ +hexo.extend.helper.register("catalog_list", function (type) { + let html = ``; + hexo.locals.get(type).map(function (item) { + html += ` + + `; + }); + return html; +}); diff --git a/blog/themes/anzhiyu/scripts/helpers/findArchiveLength.js b/blog/themes/anzhiyu/scripts/helpers/findArchiveLength.js new file mode 100644 index 0000000..6202380 --- /dev/null +++ b/blog/themes/anzhiyu/scripts/helpers/findArchiveLength.js @@ -0,0 +1,58 @@ +hexo.extend.helper.register('getArchiveLength', function () { + const { archive_generator: archiveGenerator } = hexo.config + if (archiveGenerator && archiveGenerator.enable === false) return this.site.posts.length + const { yearly, monthly, daily } = archiveGenerator + const { year, month, day } = this.page + if (yearly === false || !year) return this.site.posts.length + + const posts = this.site.posts.sort('date') + + const compareFunc = (type, y1, m1, d1, y2, m2, d2) => { + switch (type) { + case 'year': + return y1 === y2 + case 'month': + return y1 === y2 && m1 === m2 + case 'day': + return y1 === y2 && m1 === m2 && d1 === d2 + default: + return false + } + } + + const generateDateObj = (type) => { + return posts.reduce((dateObj, post) => { + const date = post.date.clone() + const year = date.year() + const month = date.month() + 1 + const day = date.date() + const lastData = dateObj[dateObj.length - 1] + + if (!lastData || !compareFunc(type, lastData.year, lastData.month, lastData.day, year, month, day)) { + const name = type === 'year' ? year : type === 'month' ? `${year}-${month}` : `${year}-${month}-${day}` + dateObj.push({ + name, + year, + month, + day, + count: 1 + }) + } else { + lastData.count++ + } + + return dateObj + }, []) + } + + const data = this.fragment_cache('createArchiveObj', () => { + const dateObjs = [] + if (yearly) dateObjs.push(...generateDateObj('year')) + if (monthly) dateObjs.push(...generateDateObj('month')) + if (daily) dateObjs.push(...generateDateObj('day')) + return dateObjs + }) + + const name = month ? (day ? `${year}-${month}-${day}` : `${year}-${month}`) : year + return data.find(item => item.name === name).count +}) \ No newline at end of file diff --git a/blog/themes/anzhiyu/scripts/helpers/get_version.js b/blog/themes/anzhiyu/scripts/helpers/get_version.js new file mode 100644 index 0000000..5b21b6e --- /dev/null +++ b/blog/themes/anzhiyu/scripts/helpers/get_version.js @@ -0,0 +1,4 @@ +hexo.extend.helper.register("get_version", function () { + const { version } = require("../../package.json"); + return version; +}); diff --git a/blog/themes/anzhiyu/scripts/helpers/inject_head_js.js b/blog/themes/anzhiyu/scripts/helpers/inject_head_js.js new file mode 100644 index 0000000..c391ae0 --- /dev/null +++ b/blog/themes/anzhiyu/scripts/helpers/inject_head_js.js @@ -0,0 +1,190 @@ +/** + * Butterfly + * inject js to head + */ + +"use strict"; + +hexo.extend.helper.register("inject_head_js", function () { + const { darkmode, aside } = this.theme; + const start = darkmode.start || 6; + const end = darkmode.end || 18; + const { theme_color } = hexo.theme.config; + const themeColorLight = (theme_color && theme_color.enable && theme_color.meta_theme_color_light) || "#ffffff"; + const themeColorDark = (theme_color && theme_color.enable && theme_color.meta_theme_color_dark) || "#0d0d0d"; + + const createLocalStore = () => { + return ` + win.saveToLocal = { + set: (key, value, ttl) => { + if (ttl === 0) return + const now = Date.now() + const expiry = now + ttl * 86400000 + const item = { + value, + expiry + } + localStorage.setItem(key, JSON.stringify(item)) + }, + + get: key => { + const itemStr = localStorage.getItem(key) + + if (!itemStr) { + return undefined + } + const item = JSON.parse(itemStr) + const now = Date.now() + + if (now > item.expiry) { + localStorage.removeItem(key) + return undefined + } + return item.value + } + } + `; + }; + + // https://stackoverflow.com/questions/16839698/jquery-getscript-alternative-in-native-javascript + const createGetScript = () => { + return ` + win.getScript = (url, attr = {}) => new Promise((resolve, reject) => { + const script = document.createElement('script') + script.src = url + script.async = true + script.onerror = reject + script.onload = script.onreadystatechange = function() { + const loadState = this.readyState + if (loadState && loadState !== 'loaded' && loadState !== 'complete') return + script.onload = script.onreadystatechange = null + resolve() + } + + Object.keys(attr).forEach(key => { + script.setAttribute(key, attr[key]) + }) + + document.head.appendChild(script) + }) + `; + }; + + const createGetCSS = () => { + return ` + win.getCSS = (url, id = false) => new Promise((resolve, reject) => { + const link = document.createElement('link') + link.rel = 'stylesheet' + link.href = url + if (id) link.id = id + link.onerror = reject + link.onload = link.onreadystatechange = function() { + const loadState = this.readyState + if (loadState && loadState !== 'loaded' && loadState !== 'complete') return + link.onload = link.onreadystatechange = null + resolve() + } + document.head.appendChild(link) + }) + `; + }; + + const createDarkmodeJs = () => { + if (!darkmode.enable) return ""; + + let darkmodeJs = ` + win.activateDarkMode = () => { + document.documentElement.setAttribute('data-theme', 'dark') + if (document.querySelector('meta[name="theme-color"]') !== null) { + document.querySelector('meta[name="theme-color"]').setAttribute('content', '${themeColorDark}') + } + } + win.activateLightMode = () => { + document.documentElement.setAttribute('data-theme', 'light') + if (document.querySelector('meta[name="theme-color"]') !== null) { + document.querySelector('meta[name="theme-color"]').setAttribute('content', '${themeColorLight}') + } + } + const t = saveToLocal.get('theme') + `; + + const autoChangeMode = darkmode.autoChangeMode; + + if (autoChangeMode === 1) { + darkmodeJs += ` + const isDarkMode = window.matchMedia('(prefers-color-scheme: dark)').matches + const isLightMode = window.matchMedia('(prefers-color-scheme: light)').matches + const isNotSpecified = window.matchMedia('(prefers-color-scheme: no-preference)').matches + const hasNoSupport = !isDarkMode && !isLightMode && !isNotSpecified + + if (t === undefined) { + if (isLightMode) activateLightMode() + else if (isDarkMode) activateDarkMode() + else if (isNotSpecified || hasNoSupport) { + const now = new Date() + const hour = now.getHours() + const isNight = hour <= ${start} || hour >= ${end} + isNight ? activateDarkMode() : activateLightMode() + } + window.matchMedia('(prefers-color-scheme: dark)').addListener(e => { + if (saveToLocal.get('theme') === undefined) { + e.matches ? activateDarkMode() : activateLightMode() + } + }) + } else if (t === 'light') activateLightMode() + else activateDarkMode() + `; + } else if (autoChangeMode === 2) { + darkmodeJs += ` + const now = new Date() + const hour = now.getHours() + const isNight = hour <= ${start} || hour >= ${end} + if (t === undefined) isNight ? activateDarkMode() : activateLightMode() + else if (t === 'light') activateLightMode() + else activateDarkMode() + `; + } else { + darkmodeJs += ` + if (t === 'dark') activateDarkMode() + else if (t === 'light') activateLightMode() + `; + } + + return darkmodeJs; + }; + + const createAsideStatus = () => { + if (!aside.enable || !aside.button) return ""; + + return ` + const asideStatus = saveToLocal.get('aside-status') + if (asideStatus !== undefined) { + if (asideStatus === 'hide') { + document.documentElement.classList.add('hide-aside') + } else { + document.documentElement.classList.remove('hide-aside') + } + } + `; + }; + + const createDetectApple = () => { + return ` + const detectApple = () => { + if(/iPad|iPhone|iPod|Macintosh/.test(navigator.userAgent)){ + document.documentElement.classList.add('apple') + } + } + detectApple() + `; + }; + + return ``; +}); diff --git a/blog/themes/anzhiyu/scripts/helpers/page.js b/blog/themes/anzhiyu/scripts/helpers/page.js new file mode 100644 index 0000000..7319f8f --- /dev/null +++ b/blog/themes/anzhiyu/scripts/helpers/page.js @@ -0,0 +1,149 @@ +/** + * AnZhiYu + * @example + * page_description() + * cloudTags(source, minfontsize, maxfontsize, limit) + */ + +"use strict"; + +const { stripHTML, escapeHTML, prettyUrls } = require("hexo-util"); +const crypto = require("crypto"); + +hexo.extend.helper.register('page_description', function () { + const { config, page } = this + let description = page.description || page.content || page.title || config.description + + if (description) { + description = escapeHTML(stripHTML(description).substring(0, 150) + .trim() + ).replace(/\n/g, ' ') + return description + } +}) + +hexo.extend.helper.register("get_page_fill_description", function () { + const { config, page } = this; + let description = page.content || page.description || page.title || config.description; + + if (description) { + // 使用正则表达式匹配 h1-h6 标签中的文本内容 + const regex = /]*>(.*?)<\/h[1-6]>/g; + const headings = []; + let match; + while ((match = regex.exec(description))) { + headings.push(match[0]); + } + + const contents = headings.map(heading => { + // 去掉 a 标签及其内容 + const text = heading.replace(/]*>.*?<\/a>/g, ""); + // 去除特殊符号 &,:,; 等 + return text.replace(/<\/?[^>]+>|&|:|;|quot;|,|,|“|”|"|'|#/g, ""); + }); + + // 排除 div.post-ai-description 元素中的内容 + const excludedDivRegex = /]*class="?post-ai-description"?.*?>[\s\S]*?<\/div>/gi; + description = description.replace(excludedDivRegex, ""); + + description = escapeHTML(stripHTML(description).trim()) + .replace(/\n/g, " ") + .replace(/[^\u4e00-\u9fa5]/gi, ""); + + return contents.join(", ") + description; + } +}); + +hexo.extend.helper.register("cloudTags", function (options = {}) { + const env = this; + let source = options.source; + const minfontsize = options.minfontsize; + const maxfontsize = options.maxfontsize; + const limit = options.limit; + const unit = options.unit || "px"; + const colorful = options.color || false; + const highlightTags = options.highlightTags || []; + + let result = ""; + if (limit > 0) { + source = source.limit(limit); + } + + const sizes = []; + source.sort("length").forEach(tag => { + const { length } = tag; + if (sizes.includes(length)) return; + sizes.push(length); + }); + + const length = sizes.length - 1; + source.sort("name").forEach(tag => { + const ratio = length ? sizes.indexOf(tag.length) / length : 0; + const size = minfontsize + (maxfontsize - minfontsize) * ratio; + let style = `font-size: ${parseFloat(size.toFixed(2))}${unit};`; + if (colorful) { + const color = + "rgb(" + + Math.floor(Math.random() * 201) + + ", " + + Math.floor(Math.random() * 201) + + ", " + + Math.floor(Math.random() * 201) + + ")"; // 0,0,0 -> 200,200,200 + style += ` color: ${color};`; + } + + const matchingTag = highlightTags.find(highlightTag => highlightTag === tag.name); + if (matchingTag) { + style += ` font-weight: 500; color: var(--anzhiyu-lighttext)`; + } + result += `${tag.name}${tag.length}`; + }); + return result; +}); + +hexo.extend.helper.register("urlNoIndex", function (url = null) { + return prettyUrls(url || this.url, { trailing_index: false, trailing_html: true }); +}); + +hexo.extend.helper.register("md5", function (path) { + return crypto + .createHash("md5") + .update(decodeURI(this.url_for(path))) + .digest("hex"); +}); + +hexo.extend.helper.register('injectHtml', function (data) { + if (!data) return '' + return data.join('') +}) + +hexo.extend.helper.register("findArchivesTitle", function (page, menu, date) { + if (page.year) { + const dateStr = page.month ? `${page.year}-${page.month}` : `${page.year}`; + const date_format = page.month ? hexo.theme.config.aside.card_archives.format : "YYYY"; + return date(dateStr, date_format); + } + + const defaultTitle = this._p("page.archives"); + if (!menu) return defaultTitle; + + const loop = m => { + for (const key in m) { + if (typeof m[key] === "object") { + loop(m[key]); + } + + if (/\/archives\//.test(m[key])) { + return key; + } + } + }; + + return loop(menu) || defaultTitle; +}); + +hexo.extend.helper.register('isImgOrUrl', function (path) { + const imgTestReg = /\.(png|jpe?g|gif|svg|webp)(\?.*)?$/i + return path.indexOf('//') !== -1 || imgTestReg.test(path) +}) \ No newline at end of file diff --git a/blog/themes/anzhiyu/scripts/helpers/random.js b/blog/themes/anzhiyu/scripts/helpers/random.js new file mode 100644 index 0000000..549747d --- /dev/null +++ b/blog/themes/anzhiyu/scripts/helpers/random.js @@ -0,0 +1,86 @@ +hexo.extend.generator.register("random", function (locals) { + const config = hexo.config.random || {}; + const themeConfig = hexo.theme.config; + const pjaxEn = themeConfig.pjax.enable; + const randomNumberFriend = themeConfig.footer.list.randomFriends || 0; + const posts = []; + const link = locals.data.link || []; + for (const post of locals.posts.data) { + if (post.random !== false) posts.push(post.path); + } + + const link_list = []; + + link.forEach(element => { + element.link_list.forEach(link_list_item => { + link_list.push(link_list_item); + }); + }); + + let result = `var posts=${JSON.stringify( + posts + )};function toRandomPost(){ + ${pjaxEn ? "pjax.loadUrl('/'+posts[Math.floor(Math.random() * posts.length)]);" : "window.location.href='/'+posts[Math.floor(Math.random() * posts.length)];"} + };`; + + if (themeConfig.footer.list.enable && randomNumberFriend > 0) { + result += `var friend_link_list=${JSON.stringify(link_list)}; + var refreshNum = 1; + function friendChainRandomTransmission() { + const randomIndex = Math.floor(Math.random() * friend_link_list.length); + const { name, link } = friend_link_list.splice(randomIndex, 1)[0]; + Snackbar.show({ + text: + "点击前往按钮进入随机一个友链,不保证跳转网站的安全性和可用性。本次随机到的是本站友链:「" + name + "」", + duration: 8000, + pos: "top-center", + actionText: "前往", + onActionClick: function (element) { + element.style.opacity = 0; + window.open(link, "_blank"); + }, + }); + } + function addFriendLinksInFooter() { + var footerRandomFriendsBtn = document.getElementById("footer-random-friends-btn"); + if(!footerRandomFriendsBtn) return; + footerRandomFriendsBtn.style.opacity = "0.2"; + footerRandomFriendsBtn.style.transitionDuration = "0.3s"; + footerRandomFriendsBtn.style.transform = "rotate(" + 360 * refreshNum++ + "deg)"; + const finalLinkList = []; + + let count = 0; + + while (friend_link_list.length && count < ${randomNumberFriend}) { + const randomIndex = Math.floor(Math.random() * friend_link_list.length); + const { name, link, avatar } = friend_link_list.splice(randomIndex, 1)[0]; + + finalLinkList.push({ + name, + link, + avatar, + }); + count++; + } + + let html = finalLinkList + .map(({ name, link }) => { + const returnInfo = "" + name + "" + return returnInfo; + }) + .join(""); + + html += "更多"; + + document.getElementById("friend-links-in-footer").innerHTML = html; + + setTimeout(()=>{ + footerRandomFriendsBtn.style.opacity = "1"; + }, 300) + };`; + } + return { + path: config.path || "anzhiyu/random.js", + data: result, + }; +}); diff --git a/blog/themes/anzhiyu/scripts/helpers/related_post.js b/blog/themes/anzhiyu/scripts/helpers/related_post.js new file mode 100644 index 0000000..a2ce54a --- /dev/null +++ b/blog/themes/anzhiyu/scripts/helpers/related_post.js @@ -0,0 +1,102 @@ +/** + * AnZhiYu + * Related Posts + * According the tag + */ + +"use strict"; + +hexo.extend.helper.register("related_posts", function (currentPost, allPosts) { + let relatedPosts = []; + currentPost.tags.forEach(function (tag) { + allPosts.forEach(function (post) { + if (isTagRelated(tag.name, post.tags)) { + const relatedPost = { + title: post.title, + path: post.path, + cover: post.cover, + randomcover: post.randomcover, + weight: 1, + updated: post.updated, + created: post.date, + }; + const index = findItem(relatedPosts, "path", post.path); + if (index !== -1) { + relatedPosts[index].weight += 1; + } else { + if (currentPost.path !== post.path) { + relatedPosts.push(relatedPost); + } + } + } + }); + }); + if (relatedPosts.length === 0) { + return ""; + } + let result = ""; + const hexoConfig = hexo.config; + const config = hexo.theme.config; + + const limitNum = config.related_post.limit || 6; + const dateType = config.related_post.date_type || "created"; + const headlineLang = this._p("post.recommend"); + + relatedPosts = relatedPosts.sort(compare("weight")); + + if (relatedPosts.length > 0) { + result += '