diff --git a/README.md b/README.md index e0189ba..6f74c79 100644 --- a/README.md +++ b/README.md @@ -12,9 +12,9 @@ ![](https://cdn.jsdelivr.net/gh/jerryc127/CDN@m2/img/theme-butterfly-readme.png) -Demo: 👍 [Butterfly](https://butterfly.js.org/) || 🤞 [CrazyWong](https://blog.crazywong.com/) +📢 Demo: [Butterfly](https://butterfly.js.org/) || [CrazyWong](https://blog.crazywong.com/) -Docs: 📖 [Butterfly Docs](https://butterfly.js.org/posts/21cfbf15/) +📖 Docs: [English](https://butterfly.js.org/en/posts/butterfly-docs-en-get-started/) || [Chinese](https://butterfly.js.org/posts/21cfbf15/) Based on [hexo-theme-melody](https://github.com/Molunerfinn/hexo-theme-melody) theme. @@ -76,7 +76,7 @@ npm i hexo-theme-butterfly - [x] WordCount - [x] Related articles - [x] Displays outdated notice for a post -- [x] Share (AddThis/Sharejs/Addtoany) +- [x] Share (Sharejs/Addtoany) - [X] Comment (Disqus/Disqusjs/Livere/Gitalk/Valine/Waline/Utterances/Facebook Comments/Twikoo/Giscus/Remark42/artalk) - [x] Multiple Comment System Support - [x] Online Chats (Chatra/Tidio/Daovoice/Crisp/messenger) diff --git a/README_CN.md b/README_CN.md index 441cd79..8b2279b 100644 --- a/README_CN.md +++ b/README_CN.md @@ -12,9 +12,9 @@ ![](https://cdn.jsdelivr.net/gh/jerryc127/CDN@m2/img/theme-butterfly-readme.png) -預覽: 👍 [Butterfly](https://butterfly.js.org/) || 🤞 [CrazyWong](https://blog.crazywong.com/) +📢 預覽: [Butterfly](https://butterfly.js.org/) || [CrazyWong](https://blog.crazywong.com/) -文檔: 📖 [Butterfly Docs](https://butterfly.js.org/posts/21cfbf15/) +📖 文檔: [中文](https://butterfly.js.org/posts/21cfbf15/) || [English](https://butterfly.js.org/en/posts/butterfly-docs-en-get-started/) 一款基於[hexo-theme-melody](https://github.com/Molunerfinn/hexo-theme-melody)修改的主題 @@ -76,7 +76,7 @@ theme: butterfly - [x] 顯示字數統計 - [x] 顯示相關文章 - [x] 過期文章提醒 -- [x] 多種分享系統(AddThis/Sharejs/Addtoany) +- [x] 多種分享系統(Sharejs/Addtoany) - [X] 多種評論系統(Disqus/Disqusjs/Livere/Gitalk/Valine/Waline/Utterances/Facebook Comments/Twikoo/Giscus/Remark42/artalk) - [x] 支持雙評論部署 - [x] 多種在線聊天(Chatra/Tidio/Daovoice/Crisp/messenger) diff --git a/_config.yml b/_config.yml index 5c1b8d1..96cfa5a 100644 --- a/_config.yml +++ b/_config.yml @@ -125,11 +125,10 @@ index_post_content: # anchor anchor: - button: - enable: false - always_show: false - icon: # the unicode value of Font Awesome icon, such as '\3423' - auto_update: false # when you scroll in post, the URL will update according to header id. + # when you scroll, the URL will update according to header id. + auto_update: false + # Click the headline to scroll and update the anchor + click_to_scroll: false # figcaption (圖片描述文字) photofigcaption: false @@ -164,6 +163,7 @@ post_copyright: # Sponsor/reward reward: enable: false + text: QR_code: # - img: /img/wechat.jpg # link: @@ -264,6 +264,10 @@ aside: post_count: true last_push_date: true sort_order: # Don't modify the setting unless you know how it works + card_post_series: + enable: true + orderBy: 'date' # Order by title or date + order: -1 # Sort of order. 1, asc for ascending; -1, desc for descending # busuanzi count for PV / UV in site # 訪問人數 @@ -381,12 +385,6 @@ docsearch: # Share System (分享) # -------------------------------------- -# AddThis -# https://www.addthis.com/ -addThis: - enable: false - pubid: - # Share.js # https://github.com/overtrue/share.js sharejs: @@ -637,6 +635,9 @@ index_top_img_height: category_ui: # 留空或 index tag_ui: # 留空或 index +# Stretches the lines so that each line has equal width(文字向兩側對齊,對最後一行無效) +text_align_justify: false + # Website Background (設置網站背景) # can set it to color or image (可設置圖片 或者 顔色) # The formal of image: url(http://xxxxxx.com/xxx.jpg) @@ -651,7 +652,7 @@ mask: footer: true # the position of bottom right button/default unit: px (右下角按鈕距離底部的距離/默認單位為px) -rightside-bottom: +rightside_bottom: # Enter transitions (開啓網頁進入效果) enter_transitions: true @@ -704,7 +705,7 @@ click_heart: mobile: false # Mouse click effects: words (鼠標點擊效果: 文字) -ClickShowText: +clickShowText: enable: false text: # - I @@ -796,6 +797,13 @@ fancybox: true # Tag Plugins settings (標籤外掛) # -------------------------------------- +# series (系列文章) +series: + enable: true + orderBy: 'title' # Order by title or date + order: 1 # Sort of order. 1, asc for ascending; -1, desc for descending + number: true + # abcjs (樂譜渲染) # See https://github.com/paulrosen/abcjs abcjs: @@ -928,59 +936,58 @@ CDN: custom_format: option: - # main_css: - # main: - # utils: - # translate: - # local_search: + # abcjs_basic_js: + # activate_power_mode: # algolia_js: # algolia_search: - # instantsearch: - # docsearch_js: - # docsearch_css: - # pjax: - # gitalk: - # gitalk_css: - # blueimp_md5: - # valine: - # disqusjs: - # disqusjs_css: - # twikoo: - # waline_js: - # waline_css: - # giscus: - # 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: + # artalk_css: + # artalk_js: + # blueimp_md5: + # busuanzi: + # canvas_fluttering_ribbon: + # canvas_nest: + # canvas_ribbon: + # click_heart: + # clickShowText: + # disqusjs: + # disqusjs_css: + # docsearch_css: + # docsearch_js: + # egjs_infinitegrid: + # fancybox: + # fancybox_css: + # fireworks: + # fontawesome: + # gitalk: + # gitalk_css: + # giscus: + # instantpage: + # instantsearch: + # katex: + # katex_copytex: + # lazyload: + # local_search: + # main: + # main_css: + # mathjax: + # medium_zoom: + # mermaid: # meting_js: + # pangu: + # prismjs_autoloader: # prismjs_js: # prismjs_lineNumber_js: - # prismjs_autoloader: - # artalk_js: - # artalk_css: - # busuanzi: - # abcjs_basic_js: + # pjax: + # sharejs: + # sharejs_css: + # snackbar: + # snackbar_css: + # translate: + # twikoo: + # typed: + # utils: + # valine: + # waline_css: + # waline_js: \ No newline at end of file diff --git a/languages/default.yml b/languages/default.yml index fea921e..59ddd22 100644 --- a/languages/default.yml +++ b/languages/default.yml @@ -3,9 +3,9 @@ footer: theme: Theme copy: - success: Copy successfully - error: Copy error - noSupport: The browser does not support + success: Copy Successful + error: Copy Error + noSupport: Browser Not Supported page: articles: Articles @@ -15,16 +15,15 @@ page: card_post_count: comments -sticky: Sticky -no_title: No title +no_title: Untitled post: created: Created updated: Updated - wordcount: Word count - min2read: Reading time - min2read_unit: min - page_pv: Post View + wordcount: Word Count + min2read: Reading Time + min2read_unit: mins + page_pv: Post Views comments: Comments copyright: author: Author @@ -48,8 +47,8 @@ search: hits_stats: '${hits} results found' pagination: - prev: Previous Post - next: Next Post + prev: Previous + next: Next comment: Comment @@ -66,32 +65,33 @@ aside: headline: Info article_name: Article runtime: - name: Run time + name: Runtime unit: days last_push_date: - name: Last Push + name: Last Update site_wordcount: Total Count site_uv_name: UV site_pv_name: PV - more_button: More + more_button: View More card_newest_comments: - headline: Newest Comments + headline: Latest Comments loading_text: loading... - error: Unable to get the data, please make sure the settings are correct. - zero: No Comment + error: Unable to retrieve comments, please check the configuration + zero: No comments image: image link: link code: code - card_toc: Catalog + card_toc: Contents + card_post_series: Series date_suffix: - just: Just + just: Just now min: minutes ago hour: hours ago day: days ago month: months ago -donate: Donate +donate: Sponsor share: Share rightside: @@ -102,7 +102,7 @@ rightside: toc: Table Of Contents scroll_to_comment: Scroll To Comments setting: Setting - aside: Toggle between single-column and double-column + aside: Toggle between Single-column and Double-column chat: Chat copy_copyright: @@ -112,12 +112,12 @@ copy_copyright: info: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source. 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 + chs_to_cht: You have switched to Traditional Chinese + cht_to_chs: You have switched to Simplified Chinese + day_to_night: You have switched to Dark Mode + night_to_day: You have switched to Light Mode loading: Loading... load_more: Load More -error404: Page not found +error404: Page Not Found diff --git a/languages/en.yml b/languages/en.yml index 1cc937c..489b57b 100644 --- a/languages/en.yml +++ b/languages/en.yml @@ -3,9 +3,9 @@ footer: theme: Theme copy: - success: Copy successfully - error: Copy error - noSupport: The browser does not support + success: Copy Successful + error: Copy Error + noSupport: Browser Not Supported page: articles: Articles @@ -15,16 +15,15 @@ page: card_post_count: comments -sticky: Sticky -no_title: No title +no_title: Untitled post: created: Created updated: Updated - wordcount: Word count - min2read: Reading time - min2read_unit: min - page_pv: Post View + wordcount: Word Count + min2read: Reading Time + min2read_unit: mins + page_pv: Post Views comments: Comments copyright: author: Author @@ -48,8 +47,8 @@ search: hits_stats: '${hits} results found' pagination: - prev: Previous Post - next: Next Post + prev: Previous + next: Next comment: Comment @@ -66,43 +65,44 @@ aside: headline: Info article_name: Article runtime: - name: Run time + name: Runtime unit: days last_push_date: - name: Last Push + name: Last Update site_wordcount: Total Count site_uv_name: UV site_pv_name: PV - more_button: More + more_button: View More card_newest_comments: - headline: Newest Comments + headline: Latest Comments loading_text: loading... - error: Unable to get the data, please make sure the settings are correct. - zero: No Comment + error: Unable to retrieve comments, please check the configuration + zero: No comments image: image link: link code: code - card_toc: Catalog + card_toc: Contents + card_post_series: Series date_suffix: - just: Just + just: Just now min: minutes ago hour: hours ago day: days ago month: months ago -donate: Donate +donate: Sponsor 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 + translate_title: Toggle Between Traditional Chinese And Simplified Chinese + night_mode_title: Toggle 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 + aside: Toggle between Single-column and Double-column chat: Chat copy_copyright: @@ -112,12 +112,12 @@ copy_copyright: info: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source. 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 + chs_to_cht: You have switched to Traditional Chinese + cht_to_chs: You have switched to Simplified Chinese + day_to_night: You have switched to Dark Mode + night_to_day: You have switched to Light Mode loading: Loading... load_more: Load More -error404: Page not found +error404: Page Not Found \ No newline at end of file diff --git a/languages/zh-CN.yml b/languages/zh-CN.yml index 94f85cd..b030079 100644 --- a/languages/zh-CN.yml +++ b/languages/zh-CN.yml @@ -15,7 +15,6 @@ page: card_post_count: 条评论 -sticky: 置顶 no_title: 无题 post: @@ -84,6 +83,7 @@ aside: link: 链接 code: 代码 card_toc: 目录 + card_post_series: 系列文章 date_suffix: just: 刚刚 @@ -92,7 +92,7 @@ date_suffix: day: 天前 month: 个月前 -donate: 打赏 +donate: 赞助 share: 分享 rightside: @@ -113,8 +113,8 @@ copy_copyright: info: 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 Snackbar: - chs_to_cht: 你已切换为繁体 - cht_to_chs: 你已切换为简体 + chs_to_cht: 你已切换为繁体中文 + cht_to_chs: 你已切换为简体中文 day_to_night: 你已切换为深色模式 night_to_day: 你已切换为浅色模式 diff --git a/languages/zh-TW.yml b/languages/zh-TW.yml index 9801d16..4ac63b8 100644 --- a/languages/zh-TW.yml +++ b/languages/zh-TW.yml @@ -15,8 +15,7 @@ page: card_post_count: 條評論 -sticky: 置頂 -no_title: 無題 +no_title: 無標題 post: created: 發表於 @@ -84,6 +83,7 @@ aside: link: 連結 code: 程式碼 card_toc: 目錄 + card_post_series: 文章系列 date_suffix: just: 剛剛 @@ -92,14 +92,14 @@ date_suffix: day: 天前 month: 個月前 -donate: 打賞 +donate: 贊助 share: 分享 rightside: readmode_title: 閱讀模式 translate_title: 簡繁轉換 night_mode_title: 淺色和深色模式轉換 - back_to_top: 回到頂部 + back_to_top: 返回頂部 toc: 目錄 scroll_to_comment: 直達評論 setting: 設定 @@ -110,11 +110,11 @@ copy_copyright: author: 作者 link: 連結 source: 來源 - info: 著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。 + info: 著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。 Snackbar: - chs_to_cht: 你已切換為繁體 - cht_to_chs: 你已切換為簡體 + chs_to_cht: 你已切換為繁體中文 + cht_to_chs: 你已切換為簡體中文 day_to_night: 你已切換為深色模式 night_to_day: 你已切換為淺色模式 diff --git a/layout/archive.pug b/layout/archive.pug index 815cdd1..913dedc 100644 --- a/layout/archive.pug +++ b/layout/archive.pug @@ -3,7 +3,6 @@ extends includes/layout.pug block content include ./includes/mixins/article-sort.pug #archive - - const archiveLength = findArchiveLength(fragment_cache) - .article-sort-title= _p('page.articles') + ' - ' + archiveLength + .article-sort-title= `${_p('page.articles')} - ${getArchiveLength()}` +articleSort(page.posts) include includes/pagination.pug \ No newline at end of file diff --git a/layout/includes/head.pug b/layout/includes/head.pug index 4d30c4a..cd62566 100644 --- a/layout/includes/head.pug +++ b/layout/includes/head.pug @@ -55,14 +55,13 @@ if theme.fancybox !=partial('includes/head/analytics', {}, {cache: true}) //- font -if theme.blog_title_font && theme.blog_title_font.font_link +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()}) diff --git a/layout/includes/head/config.pug b/layout/includes/head/config.pug index 80cbf25..05b046c 100644 --- a/layout/includes/head/config.pug +++ b/layout/includes/head/config.pug @@ -115,11 +115,9 @@ script. 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)}' - } + infinitegrid: { + js: '!{url_for(theme.asset.egjs_infinitegrid)}', + buttonText: '!{_p("load_more")}' }, isPhotoFigcaption: !{theme.photofigcaption}, islazyload: !{theme.lazyload.enable}, diff --git a/layout/includes/head/noscript.pug b/layout/includes/head/noscript.pug deleted file mode 100644 index cc3befa..0000000 --- a/layout/includes/head/noscript.pug +++ /dev/null @@ -1,14 +0,0 @@ -noscript. - \ No newline at end of file diff --git a/layout/includes/head/preconnect.pug b/layout/includes/head/preconnect.pug index 04d3b48..f8af380 100644 --- a/layout/includes/head/preconnect.pug +++ b/layout/includes/head/preconnect.pug @@ -1,4 +1,20 @@ -link(rel="preconnect" href="//cdn.jsdelivr.net") +- + const { internal_provider, third_party_provider, custom_format } = theme.CDN + const providers = { + 'jsdelivr': '//cdn.jsdelivr.net', + 'cdnjs': '//cdnjs.cloudflare.com', + 'unpkg': '//unpkg.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='') diff --git a/layout/includes/header/post-info.pug b/layout/includes/header/post-info.pug index 47a3f19..def2312 100644 --- a/layout/includes/header/post-info.pug +++ b/layout/includes/header/post-info.pug @@ -102,14 +102,12 @@ case whichCount when 'Disqus' +countBlock - span.disqus-comment-count - a(href=full_url_for(page.path) + '#disqus_thread') - i.fa-solid.fa-spinner.fa-spin + a.disqus-comment-count(href=full_url_for(page.path) + '#post-comment') + i.fa-solid.fa-spinner.fa-spin when 'Disqusjs' +countBlock - a(href=full_url_for(page.path) + '#disqusjs') - span.disqus-comment-count(data-disqus-url=full_url_for(page.path)) - i.fa-solid.fa-spinner.fa-spin + a.disqusjs-comment-count(href=full_url_for(page.path) + '#post-comment') + i.fa-solid.fa-spinner.fa-spin when 'Valine' +countBlock a(href=url_for(page.path) + '#post-comment' itemprop="discussionUrl") diff --git a/layout/includes/mixins/post-ui.pug b/layout/includes/mixins/post-ui.pug index 970b5fc..5621b6d 100644 --- a/layout/includes/mixins/post-ui.pug +++ b/layout/includes/mixins/post-ui.pug @@ -19,13 +19,11 @@ mixin postUI(posts) else div.post-bg(style=`background: ${post_cover}`) .recent-post-info(class=no_cover) - a.article-title(href=url_for(link) title=title)= title - .article-meta-wrap + a.article-title(href=url_for(link) title=title) if (is_home() && (article.top || article.sticky > 0)) - span.article-meta - i.fas.fa-thumbtack.sticky - span.sticky= _p('sticky') - span.article-meta-separator | + i.fas.fa-thumbtack.sticky + = title + .article-meta-wrap if (theme.post_meta.page.date_type) span.post-meta-date if (theme.post_meta.page.date_type === 'both') @@ -73,14 +71,10 @@ mixin postUI(posts) if theme.comments.card_post_count && theme.comments.use case theme.comments.use[0] when 'Disqus' - +countBlockInIndex - a(href=full_url_for(link) + '#disqus_thread') - i.fa-solid.fa-spinner.fa-spin when 'Disqusjs' +countBlockInIndex - a(href=full_url_for(link) + '#disqusjs') - span.disqus-comment-count(data-disqus-url=full_url_for(link)) - i.fa-solid.fa-spinner.fa-spin + a.disqus-count(href=full_url_for(link) + '#post-comment') + i.fa-solid.fa-spinner.fa-spin when 'Valine' +countBlockInIndex a(href=url_for(link) + '#post-comment') diff --git a/layout/includes/post/post-copyright.pug b/layout/includes/post/post-copyright.pug index 8c7ca03..e0b09df 100644 --- a/layout/includes/post/post-copyright.pug +++ b/layout/includes/post/post-copyright.pug @@ -5,13 +5,19 @@ if theme.post_copyright.enable && page.copyright !== false - 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 .post-copyright__author - span.post-copyright-meta= _p('post.copyright.author') + ": " + span.post-copyright-meta + i.fas.fa-circle-user.fa-fw + = _p('post.copyright.author') + ": " span.post-copyright-info a(href=authorHref)=author .post-copyright__type - span.post-copyright-meta= _p('post.copyright.link') + ": " + span.post-copyright-meta + i.fas.fa-square-arrow-up-right.fa-fw + = _p('post.copyright.link') + ": " span.post-copyright-info a(href=url_for(url))= theme.post_copyright.decode ? decodeURI(url) : url .post-copyright__notice - span.post-copyright-meta= _p('post.copyright.copyright_notice') + ": " + span.post-copyright-meta + i.fas.fa-circle-exclamation.fa-fw + = _p('post.copyright.copyright_notice') + ": " span.post-copyright-info!= info diff --git a/layout/includes/post/reward.pug b/layout/includes/post/reward.pug index 71daa98..fb55946 100644 --- a/layout/includes/post/reward.pug +++ b/layout/includes/post/reward.pug @@ -1,7 +1,7 @@ .post-reward .reward-button i.fas.fa-qrcode - = ' ' + _p('donate') + = theme.reward.text || _p('donate') .reward-main ul.reward-all each item in theme.reward.QR_code diff --git a/layout/includes/rightside.pug b/layout/includes/rightside.pug index 57d8fba..377813d 100644 --- a/layout/includes/rightside.pug +++ b/layout/includes/rightside.pug @@ -42,15 +42,15 @@ mixin rightsideItem(array) #rightside-config-show if enable if hide - button#rightside_config(type="button" title=_p("rightside.setting")) + button#rightside-config(type="button" title=_p("rightside.setting")) i.fas.fa-cog.fa-spin else if is_post() if (readmode || translate.enable || (darkmode.enable && darkmode.button)) - button#rightside_config(type="button" title=_p("rightside.setting")) + button#rightside-config(type="button" title=_p("rightside.setting")) i.fas.fa-cog.fa-spin else if translate.enable || (darkmode.enable && darkmode.button) - button#rightside_config(type="button" title=_p("rightside.setting")) + button#rightside-config(type="button" title=_p("rightside.setting")) i.fas.fa-cog.fa-spin if showArray diff --git a/layout/includes/third-party/abcjs/abcjs.pug b/layout/includes/third-party/abcjs/abcjs.pug index dc02aea..79f86c4 100644 --- a/layout/includes/third-party/abcjs/abcjs.pug +++ b/layout/includes/third-party/abcjs/abcjs.pug @@ -1,15 +1,15 @@ script. (() => { - function abcjsInit() { - function abcjsFn() { - for (let abcContainer of document.getElementsByClassName("abc-music-sheet")) { - ABCJS.renderAbc(abcContainer, abcContainer.innerHTML, {responsive: 'resize'}) - } + const abcjsInit = () => { + const abcjsFn = () => { + document.querySelectorAll(".abc-music-sheet").forEach(ele => { + ABCJS.renderAbc(ele, ele.innerHTML, {responsive: 'resize'}) + }) } typeof ABCJS === 'object' ? abcjsFn() : getScript('!{url_for(theme.asset.abcjs_basic_js)}').then(abcjsFn) } - window.pjax ? abcjsInit() : document.addEventListener('DOMContentLoaded', abcjsInit) + window.pjax ? abcjsInit() : window.addEventListener('load', abcjsInit) })() \ No newline at end of file diff --git a/layout/includes/third-party/card-post-count/disqus.pug b/layout/includes/third-party/card-post-count/disqus.pug index 1dfe327..92a2d5b 100644 --- a/layout/includes/third-party/card-post-count/disqus.pug +++ b/layout/includes/third-party/card-post-count/disqus.pug @@ -1,16 +1,25 @@ +- const { shortname, apikey } = theme.disqus script. (() => { - const getCount = () => { - if (window.DISQUSWIDGETS === undefined) { - var d = document, s = d.createElement('script'); - s.src = 'https://!{theme.disqus.shortname}.disqus.com/count.js'; - s.id = 'dsq-count-scr'; - (d.head || d.body).appendChild(s); - } else { - DISQUSWIDGETS.getCount({reset: true}); + const getCount = async () => { + try { + const eleGroup = document.querySelectorAll('#recent-posts .disqus-count') + const cleanedLinks = Array.from(eleGroup).map(i => `thread:link=${i.href.replace(/#post-comment$/, '')}`); + + const res = await fetch(`https://disqus.com/api/3.0/threads/set.json?forum=!{shortname}&api_key=!{apikey}&${cleanedLinks.join('&')}`,{ + method: 'GET' + }) + const result = await res.json() + + eleGroup.forEach(i => { + const cleanedLink = i.href.replace(/#post-comment$/, '') + const urlData = result.response.find(data => data.link === cleanedLink) || { posts: 0 } + i.textContent = urlData.posts + }) + } catch (err) { + console.error(err) } } window.pjax ? getCount() : window.addEventListener('load', getCount) - })() diff --git a/layout/includes/third-party/card-post-count/waline.pug b/layout/includes/third-party/card-post-count/waline.pug index c80da57..a8faf96 100644 --- a/layout/includes/third-party/card-post-count/waline.pug +++ b/layout/includes/third-party/card-post-count/waline.pug @@ -1,3 +1,4 @@ +- const serverURL = theme.waline.serverURL.replace(/\/$/, '') script. (() => { async function loadWaline () { @@ -5,7 +6,7 @@ script. const eleGroup = document.querySelectorAll('#recent-posts .waline-comment-count') const keyArray = Array.from(eleGroup).map(i => i.getAttribute('data-path')) - const res = await fetch(`!{theme.waline.serverURL}/api/comment?type=count&url=${keyArray}`, { method: 'GET' }) + const res = await fetch(`!{serverURL}/api/comment?type=count&url=${keyArray}`, { method: 'GET' }) const result = await res.json() result.data.forEach((count, index) => { diff --git a/layout/includes/third-party/comments/artalk.pug b/layout/includes/third-party/comments/artalk.pug index c5844ed..700b91a 100644 --- a/layout/includes/third-party/comments/artalk.pug +++ b/layout/includes/third-party/comments/artalk.pug @@ -1,8 +1,9 @@ - const { server, site, option } = theme.artalk +- const { use, lazyload } = theme.comments script. - function loadArtalk () { - function initArtalk () { + (() => { + const initArtalk = () => { window.artalkItem = new Artalk(Object.assign({ el: '#artalk-wrap', server: '!{server}', @@ -23,28 +24,29 @@ script. }) } - if (typeof window.artalkItem === 'object') initArtalk() - else { - getCSS('!{theme.asset.artalk_css}').then(()=>{ - getScript('!{theme.asset.artalk_js}').then(initArtalk) - }) + const loadArtalk = async () => { + if (typeof window.artalkItem === 'object') initArtalk() + else { + await getCSS('!{theme.asset.artalk_css}') + await getScript('!{theme.asset.artalk_js}') + initArtalk() + } } - } - function artalkChangeMode (theme) { - const artalkWrap = document.getElementById('artalk-wrap') - if (!(artalkWrap && artalkWrap.children.length)) return - const isDark = theme === 'dark' - window.artalkItem.setDarkMode(isDark) - } - - btf.addModeChange('artalk', artalkChangeMode) + const artalkChangeMode = theme => { + const artalkWrap = document.getElementById('artalk-wrap') + if (!(artalkWrap && artalkWrap.children.length)) return + const isDark = theme === 'dark' + window.artalkItem.setDarkMode(isDark) + } - if ('!{theme.comments.use[0]}' === 'Artalk' || !!{theme.comments.lazyload}) { - if (!{theme.comments.lazyload}) btf.loadComment(document.getElementById('artalk-wrap'), loadArtalk) - else loadArtalk() - } else { - function loadOtherComment () { - loadArtalk() + + btf.addGlobalFn('themeChange', artalkChangeMode, 'artalk') + + if ('!{use[0]}' === 'Artalk' || !!{lazyload}) { + if (!{lazyload}) btf.loadComment(document.getElementById('artalk-wrap'), loadArtalk) + else loadArtalk() + } else { + window.loadOtherComment = loadArtalk } - } \ No newline at end of file + })() \ No newline at end of file diff --git a/layout/includes/third-party/comments/disqus.pug b/layout/includes/third-party/comments/disqus.pug index 3a9ba41..8d8864c 100644 --- a/layout/includes/third-party/comments/disqus.pug +++ b/layout/includes/third-party/comments/disqus.pug @@ -1,7 +1,9 @@ -- let disqusPageTitle = page.title.replace(/'/ig,"\\'") +- const disqusPageTitle = page.title.replace(/'/ig,"\\'") +- const { shortname, apikey } = theme.disqus +- const { use, lazyload, count } = theme.comments script. - function loadDisqus () { + (() => { const disqus_config = function () { this.page.url = '!{ page.permalink }' this.page.identifier = '!{ url_for(page.path) }' @@ -9,41 +11,49 @@ script. } const disqusReset = () => { - DISQUS.reset({ + window.DISQUS && window.DISQUS.reset({ reload: true, config: disqus_config }) } - btf.addModeChange('disqus', disqusReset) + btf.addGlobalFn('themeChange', disqusReset, 'disqus') - if (window.DISQUS) disqusReset() - else { - (function() { - var d = document, s = d.createElement('script'); - s.src = 'https://!{theme.disqus.shortname}.disqus.com/embed.js'; - s.setAttribute('data-timestamp', +new Date()); - (d.head || d.body).appendChild(s); - })(); + const loadDisqus = () =>{ + if (window.DISQUS) disqusReset() + else { + const script = document.createElement('script') + script.src = 'https://!{shortname}.disqus.com/embed.js' + script.setAttribute('data-timestamp', +new Date()) + document.head.appendChild(script) + } } - } - if ('!{theme.comments.use[0]}' === 'Disqus' || !!{theme.comments.lazyload}) { - if (!{theme.comments.lazyload}) btf.loadComment(document.getElementById('disqus_thread'), loadDisqus) - else loadDisqus() - } else { - function loadOtherComment () { - loadDisqus() + const getCount = async() => { + try { + const eleGroup = document.querySelector('#post-meta .disqus-comment-count') + if (!eleGroup) return + const cleanedLinks = eleGroup.href.replace(/#post-comment$/, '') + + const res = await fetch(`https://disqus.com/api/3.0/threads/set.json?forum=!{shortname}&api_key=!{apikey}&thread:link=${cleanedLinks}`,{ + method: 'GET' + }) + const result = await res.json() + + const count = result.response.length ? result.response[0].posts : 0 + eleGroup.textContent = count + } catch (err) { + console.error(err) + } } - } -if is_post() && !theme.comments.lazyload && theme.comments.count && theme.comments.use[0] === 'Disqus' - script. - if (window.DISQUSWIDGETS === undefined) { - var d = document, s = d.createElement('script'); - s.src = 'https://!{theme.disqus.shortname}.disqus.com/count.js'; - s.id = 'dsq-count-scr'; - (d.head || d.body).appendChild(s); + if ('!{use[0]}' === 'Disqus' || !!{lazyload}) { + if (!{lazyload}) btf.loadComment(document.getElementById('disqus_thread'), loadDisqus) + else { + loadDisqus() + !{ count ? 'GLOBAL_CONFIG_SITE.isPost && getCount()' : '' } + } } else { - DISQUSWIDGETS.getCount({reset: true}); + window.loadOtherComment = loadDisqus } + })() diff --git a/layout/includes/third-party/comments/disqusjs.pug b/layout/includes/third-party/comments/disqusjs.pug index f0994e5..af41696 100644 --- a/layout/includes/third-party/comments/disqusjs.pug +++ b/layout/includes/third-party/comments/disqusjs.pug @@ -1,18 +1,19 @@ - let disqusjsPageTitle = page.title.replace(/'/ig,"\\'") +- const { shortname:dqShortname, apikey:dqApikey, option:dqOption } = theme.disqusjs script. - function loadDisqusjs () { - function initDisqusjs () { + (() => { + const initDisqusjs = () => { window.disqusjs = null disqusjs = new DisqusJS(Object.assign({ - shortname: '!{theme.disqusjs.shortname}', + shortname: '!{dqShortname}', identifier: '!{ url_for(page.path) }', url: '!{ page.permalink }', title: '!{ disqusjsPageTitle }', - apikey: '!{theme.disqusjs.apikey}', - },!{JSON.stringify(theme.disqusjs.option)})) + apikey: '!{dqApikey}', + },!{JSON.stringify(dqOption)})) - disqusjs.render(document.getElementById('disqusjs')) + disqusjs.render(document.getElementById('disqusjs-wrap')) } const themeChange = () => { @@ -22,36 +23,42 @@ script. initDisqusjs() } + btf.addGlobalFn('themeChange', themeChange, 'disqusjs') - btf.addModeChange('disqusjs', themeChange) - - if (window.disqusJsLoad) initDisqusjs() - else { - getCSS('!{url_for(theme.asset.disqusjs_css)}') - getScript('!{url_for(theme.asset.disqusjs)}').then(initDisqusjs) - window.disqusJsLoad = true + const loadDisqusjs = async() => { + if (window.disqusJsLoad) initDisqusjs() + else { + await getCSS('!{url_for(theme.asset.disqusjs_css)}') + await getScript('!{url_for(theme.asset.disqusjs)}') + initDisqusjs() + window.disqusJsLoad = true + } } - } - if ('!{theme.comments.use[0]}' === 'Disqusjs' || !!{theme.comments.lazyload}) { - if (!{theme.comments.lazyload}) btf.loadComment(document.getElementById('disqusjs'), loadDisqusjs) - else loadDisqusjs() - } - else { - function loadOtherComment () { - loadDisqusjs() + const getCount = async() => { + try { + const eleGroup = document.querySelector('#post-meta .disqusjs-comment-count') + if (!eleGroup) return + const cleanedLinks = eleGroup.href.replace(/#post-comment$/, '') + + const res = await fetch(`https://disqus.com/api/3.0/threads/set.json?forum=!{dqShortname}&api_key=!{dqApikey}&thread:link=${cleanedLinks}`,{ + method: 'GET' + }) + const result = await res.json() + const count = result.response.length ? result.response[0].posts : 0 + eleGroup.textContent = count + } catch (err) { + console.error(err) + } } - } - -if is_post() && !theme.comments.lazyload && theme.comments.count && theme.comments.use[0] === 'Disqusjs' - script. - if (window.DISQUSWIDGETS === undefined) { - var d = document, s = d.createElement('script'); - s.src = 'https://!{theme.disqus.shortname}.disqus.com/count.js'; - s.id = 'dsq-count-scr'; - (d.head || d.body).appendChild(s); + if ('!{theme.comments.use[0]}' === 'Disqusjs' || !!{theme.comments.lazyload}) { + if (!{theme.comments.lazyload}) btf.loadComment(document.getElementById('disqusjs-wrap'), loadDisqusjs) + else { + loadDisqusjs() + !{ theme.comments.count ? 'GLOBAL_CONFIG_SITE.isPost && getCount()' : '' } + } } else { - DISQUSWIDGETS.getCount({reset: true}); + window.loadOtherComment = loadDisqusjs } - + })() \ No newline at end of file diff --git a/layout/includes/third-party/comments/facebook_comments.pug b/layout/includes/third-party/comments/facebook_comments.pug index e0d673a..f0cc916 100644 --- a/layout/includes/third-party/comments/facebook_comments.pug +++ b/layout/includes/third-party/comments/facebook_comments.pug @@ -2,45 +2,45 @@ - const fbSDK = theme.messenger.enable ? `https://connect.facebook.net/${theme.facebook_comments.lang}/sdk/xfbml.customerchat.js#xfbml=1&version=${fbSDKVer}` : `https://connect.facebook.net/${theme.facebook_comments.lang}/sdk.js#xfbml=1&version=${fbSDKVer}` script. - function loadFBComment () { - document.getElementById('fb-root') ? '' : document.body.insertAdjacentHTML('afterend', '
') + (()=>{ + const loadFBComment = () => { + document.getElementById('fb-root') ? '' : document.body.insertAdjacentHTML('afterend', '
') - const themeNow = document.documentElement.getAttribute('data-theme') === 'dark' ? 'dark' : 'light' - const $fbComment = document.getElementsByClassName('fb-comments')[0] - $fbComment.setAttribute('data-colorscheme',themeNow) - $fbComment.setAttribute('data-href', '!{urlNoIndex(page.permalink)}') + const themeNow = document.documentElement.getAttribute('data-theme') === 'dark' ? 'dark' : 'light' + const $fbComment = document.getElementsByClassName('fb-comments')[0] + $fbComment.setAttribute('data-colorscheme',themeNow) + $fbComment.setAttribute('data-href', '!{urlNoIndex(page.permalink)}') - if (typeof FB === 'object') { - FB.XFBML.parse(document.getElementsByClassName('post-meta-commentcount')[0]) - FB.XFBML.parse(document.getElementById('post-comment')) + if (typeof FB === 'object') { + FB.XFBML.parse(document.getElementsByClassName('post-meta-commentcount')[0]) + FB.XFBML.parse(document.getElementById('post-comment')) + } + else { + let ele = document.createElement('script') + ele.setAttribute('src','!{fbSDK}') + ele.setAttribute('async', 'true') + ele.setAttribute('defer', 'true') + ele.setAttribute('crossorigin', 'anonymous') + ele.setAttribute('id', 'facebook-jssdk') + document.getElementById('fb-root').insertAdjacentElement('afterbegin',ele) + } } - else { - let ele = document.createElement('script') - ele.setAttribute('src','!{fbSDK}') - ele.setAttribute('async', 'true') - ele.setAttribute('defer', 'true') - ele.setAttribute('crossorigin', 'anonymous') - ele.setAttribute('id', 'facebook-jssdk') - document.getElementById('fb-root').insertAdjacentElement('afterbegin',ele) + + const fbModeChange = theme => { + const $fbComment = document.getElementsByClassName('fb-comments')[0] + if ($fbComment && typeof FB === 'object') { + $fbComment.setAttribute('data-colorscheme',theme) + FB.XFBML.parse(document.getElementById('post-comment')) + } } - } - function fbModeChange (theme) { - const $fbComment = document.getElementsByClassName('fb-comments')[0] - if ($fbComment && typeof FB === 'object') { - $fbComment.setAttribute('data-colorscheme',theme) - FB.XFBML.parse(document.getElementById('post-comment')) + btf.addGlobalFn('themeChange', fbModeChange, 'facebook_comments') + + if ('!{theme.comments.use[0]}' === 'Facebook Comments' || !!{theme.comments.lazyload}) { + if (!{theme.comments.lazyload}) btf.loadComment(document.querySelector('#post-comment .fb-comments'), loadFBComment) + else loadFBComment() + } else { + window.loadOtherComment = loadFBComment } - } - - btf.addModeChange('facebook_comments', fbModeChange) - - if ('!{theme.comments.use[0]}' === 'Facebook Comments' || !!{theme.comments.lazyload}) { - if (!{theme.comments.lazyload}) btf.loadComment(document.querySelector('#post-comment .fb-comments'), loadFBComment) - else loadFBComment() - } else { - function loadOtherComment () { - loadFBComment() - } - } + })() diff --git a/layout/includes/third-party/comments/giscus.pug b/layout/includes/third-party/comments/giscus.pug index 0a9af83..3e1b518 100644 --- a/layout/includes/third-party/comments/giscus.pug +++ b/layout/includes/third-party/comments/giscus.pug @@ -1,53 +1,54 @@ - const { repo, repo_id, category_id, theme:themes, option } = theme.giscus - const giscusUrl = theme.asset.giscus || 'https://giscus.app/client.js' - const giscusOriginUrl = new URL(giscusUrl).origin +- const { use, lazyload } = theme.comments script. - function getGiscusTheme (theme) { - return theme === 'dark' ? '!{themes.dark}' : '!{themes.light}' - } - - function loadGiscus () { - const config = Object.assign({ - src: '!{giscusUrl}', - 'data-repo': '!{repo}', - 'data-repo-id': '!{repo_id}', - 'data-category-id': '!{category_id}', - 'data-mapping': 'pathname', - 'data-theme': getGiscusTheme(document.documentElement.getAttribute('data-theme')), - 'data-reactions-enabled': '1', - crossorigin: 'anonymous', - async: true - },!{JSON.stringify(option)}) - - let ele = document.createElement('script') - for (let key in config) { - ele.setAttribute(key, config[key]) - } - document.getElementById('giscus-wrap').insertAdjacentElement('afterbegin',ele) - } - - function changeGiscusTheme (theme) { - function sendMessage(message) { - const iframe = document.querySelector('iframe.giscus-frame') - if (!iframe) return - iframe.contentWindow.postMessage({ giscus: message }, '!{giscusOriginUrl}') + (()=>{ + const getGiscusTheme = theme => { + return theme === 'dark' ? '!{themes.dark}' : '!{themes.light}' } - sendMessage({ - setConfig: { - theme: getGiscusTheme(theme) + const loadGiscus = () => { + const config = Object.assign({ + src: '!{giscusUrl}', + 'data-repo': '!{repo}', + 'data-repo-id': '!{repo_id}', + 'data-category-id': '!{category_id}', + 'data-mapping': 'pathname', + '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]) } - }); - } - - btf.addModeChange('giscus', changeGiscusTheme) - - if ('!{theme.comments.use[0]}' === 'Giscus' || !!{theme.comments.lazyload}) { - if (!{theme.comments.lazyload}) btf.loadComment(document.getElementById('giscus-wrap'), loadGiscus) - else loadGiscus() - } else { - function loadOtherComment () { - loadGiscus() + 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) + } + }); + } + + btf.addGlobalFn('themeChange', changeGiscusTheme, 'giscus') + + if ('!{use[0]}' === 'Giscus' || !!{lazyload}) { + if (!{lazyload}) btf.loadComment(document.getElementById('giscus-wrap'), loadGiscus) + else loadGiscus() + } else { + window.loadOtherComment= loadGiscus + } + })() diff --git a/layout/includes/third-party/comments/gitalk.pug b/layout/includes/third-party/comments/gitalk.pug index 922d657..e0a1389 100644 --- a/layout/includes/third-party/comments/gitalk.pug +++ b/layout/includes/third-party/comments/gitalk.pug @@ -1,41 +1,44 @@ +- const { client_id, client_secret, repo, owner, admin, option } = theme.gitalk + script. - function loadGitalk () { - function initGitalk () { - var gitalk = new Gitalk(Object.assign({ - clientID: '!{theme.gitalk.client_id}', - clientSecret: '!{theme.gitalk.client_secret}', - repo: '!{theme.gitalk.repo}', - owner: '!{theme.gitalk.owner}', - admin: ['!{theme.gitalk.admin}'], + (() => { + const initGitalk = () => { + const gitalk = new Gitalk(Object.assign({ + clientID: '!{client_id}', + clientSecret: '!{client_secret}', + repo: '!{repo}', + owner: '!{owner}', + admin: ['!{admin}'], id: '!{md5(page.path)}', updateCountCallback: commentCount - },!{JSON.stringify(theme.gitalk.option)})) + },!{JSON.stringify(option)})) gitalk.render('gitalk-container') } - if (typeof Gitalk === 'function') initGitalk() - else { - getCSS('!{url_for(theme.asset.gitalk_css)}') - getScript('!{url_for(theme.asset.gitalk)}').then(initGitalk) + const loadGitalk = async() => { + if (typeof Gitalk === 'function') initGitalk() + else { + await getCSS('!{url_for(theme.asset.gitalk_css)}') + await getScript('!{url_for(theme.asset.gitalk)}') + initGitalk() + } } - } - - function commentCount(n){ - let isCommentCount = document.querySelector('#post-meta .gitalk-comment-count') - if (isCommentCount) { - isCommentCount.textContent= n + + const commentCount = n => { + const isCommentCount = document.querySelector('#post-meta .gitalk-comment-count') + if (isCommentCount) { + isCommentCount.textContent= n + } } - } - if ('!{theme.comments.use[0]}' === 'Gitalk' || !!{theme.comments.lazyload}) { - if (!{theme.comments.lazyload}) btf.loadComment(document.getElementById('gitalk-container'), loadGitalk) - else loadGitalk() - } else { - function loadOtherComment () { - loadGitalk() + if ('!{theme.comments.use[0]}' === 'Gitalk' || !!{theme.comments.lazyload}) { + if (!{theme.comments.lazyload}) btf.loadComment(document.getElementById('gitalk-container'), loadGitalk) + else loadGitalk() + } else { + window.loadOtherComment = loadGitalk } - } + })() diff --git a/layout/includes/third-party/comments/index.pug b/layout/includes/third-party/comments/index.pug index c797395..3b8ceff 100644 --- a/layout/includes/third-party/comments/index.pug +++ b/layout/includes/third-party/comments/index.pug @@ -7,9 +7,9 @@ hr.custom-hr span= ' ' + _p('comment') if theme.comments.use.length > 1 - #comment-switch + .comment-switch span.first-comment=defaultComment - span.switch-btn + span#switch-btn span.second-comment=theme.comments.use[1] @@ -22,7 +22,7 @@ hr.custom-hr when 'Valine' #vcomment.vcomment when 'Disqusjs' - #disqusjs + #disqusjs-wrap when 'Livere' #lv-container(data-id="city" data-uid=theme.livere.uid) when 'Gitalk' diff --git a/layout/includes/third-party/comments/livere.pug b/layout/includes/third-party/comments/livere.pug index 85b6d78..ecacb59 100644 --- a/layout/includes/third-party/comments/livere.pug +++ b/layout/includes/third-party/comments/livere.pug @@ -1,26 +1,25 @@ -script. - function loadLivere () { - if (typeof LivereTower === 'object') { - window.LivereTower.init() - } - else { - (function(d, s) { - var j, e = d.getElementsByTagName(s)[0]; - if (typeof LivereTower === 'function') { return; } - j = d.createElement(s); - j.src = 'https://cdn-city.livere.com/js/embed.dist.js'; - j.async = true; - e.parentNode.insertBefore(j, e); - })(document, 'script'); - } - } +- const { use, lazyload } = theme.comments - if ('!{theme.comments.use[0]}' === 'Livere' || !!{theme.comments.lazyload}) { - if (!{theme.comments.lazyload}) btf.loadComment(document.getElementById('lv-container'), loadLivere) - else loadLivere() - } - else { - function loadOtherComment () { - loadLivere() +script. + (()=>{ + const loadLivere = () => { + if (typeof LivereTower === 'object') window.LivereTower.init() + else { + (function(d, s) { + var j, e = d.getElementsByTagName(s)[0]; + if (typeof LivereTower === 'function') { return; } + j = d.createElement(s); + j.src = 'https://cdn-city.livere.com/js/embed.dist.js'; + j.async = true; + e.parentNode.insertBefore(j, e); + })(document, 'script'); + } } - } \ No newline at end of file + + if ('!{use[0]}' === 'Livere' || !!{lazyload}) { + if (!{lazyload}) btf.loadComment(document.getElementById('lv-container'), loadLivere) + else loadLivere() + } else { + window.loadOtherComment = loadLivere + } + })() \ No newline at end of file diff --git a/layout/includes/third-party/comments/remark42.pug b/layout/includes/third-party/comments/remark42.pug index 222f9d3..388fb97 100644 --- a/layout/includes/third-party/comments/remark42.pug +++ b/layout/includes/third-party/comments/remark42.pug @@ -56,7 +56,7 @@ script. window.REMARK42.changeTheme(theme) } - btf.addModeChange('remark42', remarkChangeMode) + btf.addGlobalFn('themeChange', remarkChangeMode, 'remark42') if ('!{theme.comments.use[0]}' === 'Remark42' || !!{theme.comments.lazyload}) { if (!{theme.comments.lazyload}) btf.loadComment(document.getElementById('remark42'), loadRemark42) diff --git a/layout/includes/third-party/comments/twikoo.pug b/layout/includes/third-party/comments/twikoo.pug index bdaeb1e..858fad3 100644 --- a/layout/includes/third-party/comments/twikoo.pug +++ b/layout/includes/third-party/comments/twikoo.pug @@ -2,18 +2,23 @@ - const { use, lazyload, count } = theme.comments script. - (()=>{ + (() => { const init = () => { twikoo.init(Object.assign({ el: '#twikoo-wrap', envId: '!{envId}', region: '!{region}', - onCommentLoaded: function () { + onCommentLoaded: () => { btf.loadLightbox(document.querySelectorAll('#twikoo .tk-content img:not(.tk-owo-emotion)')) } }, !{JSON.stringify(option)})) } + const loadTwikoo = () => { + if (typeof twikoo === 'object') setTimeout(init,0) + else getScript('!{url_for(theme.asset.twikoo)}').then(init) + } + const getCount = () => { const countELement = document.getElementById('twikoo-count') if(!countELement) return @@ -22,32 +27,20 @@ script. region: '!{region}', urls: [window.location.pathname], includeReply: false - }).then(function (res) { + }).then(res => { countELement.textContent = res[0].count - }).catch(function (err) { - console.error(err); - }); - } - - const runFn = () => { - init() - !{count ? 'GLOBAL_CONFIG_SITE.isPost && getCount()' : ''} - } - - const loadTwikoo = () => { - if (typeof twikoo === 'object') { - setTimeout(runFn,0) - return - } - getScript('!{url_for(theme.asset.twikoo)}').then(runFn) + }).catch(err => { + console.error(err) + }) } if ('!{use[0]}' === 'Twikoo' || !!{lazyload}) { if (!{lazyload}) btf.loadComment(document.getElementById('twikoo-wrap'), loadTwikoo) - else loadTwikoo() - } else { - window.loadOtherComment = () => { + else { loadTwikoo() + !{count ? 'GLOBAL_CONFIG_SITE.isPost && getCount()' : ''} } + } else { + window.loadOtherComment = loadTwikoo } })() \ No newline at end of file diff --git a/layout/includes/third-party/comments/utterances.pug b/layout/includes/third-party/comments/utterances.pug index c225325..0ca01e7 100644 --- a/layout/includes/third-party/comments/utterances.pug +++ b/layout/includes/third-party/comments/utterances.pug @@ -1,36 +1,39 @@ +- const { use, lazyload } = theme.comments +- const { repo, issue_term, light_theme, dark_theme } = theme.utterances + script. - function loadUtterances () { - let ele = document.createElement('script') - ele.setAttribute('id', 'utterances_comment') - ele.setAttribute('src', 'https://utteranc.es/client.js') - ele.setAttribute('repo', '!{theme.utterances.repo}') - ele.setAttribute('issue-term', '!{theme.utterances.issue_term}') - let nowTheme = document.documentElement.getAttribute('data-theme') === 'dark' ? '#{theme.utterances.dark_theme}' : '#{theme.utterances.light_theme}' - ele.setAttribute('theme', nowTheme) - ele.setAttribute('crossorigin', 'anonymous') - ele.setAttribute('async', 'true') - document.getElementById('utterances-wrap').insertAdjacentElement('afterbegin',ele) - } - - function utterancesTheme (theme) { - const iframe = document.querySelector('.utterances-frame') - if (iframe) { - const theme = theme === 'dark' ? '#{theme.utterances.dark_theme}' : '#{theme.utterances.light_theme}' - const message = { - type: 'set-theme', - theme: theme - }; - iframe.contentWindow.postMessage(message, 'https://utteranc.es'); + (() => { + const loadUtterances = () => { + let ele = document.createElement('script') + ele.id = 'utterances_comment' + ele.src = 'https://utteranc.es/client.js' + ele.setAttribute('repo', '!{repo}') + ele.setAttribute('issue-term', '!{issue_term}') + const nowTheme = document.documentElement.getAttribute('data-theme') === 'dark' ? '#{dark_theme}' : '#{light_theme}' + ele.setAttribute('theme', nowTheme) + ele.crossOrigin = 'anonymous' + ele.async = true + document.getElementById('utterances-wrap').appendChild(ele) } - } - btf.addModeChange('utterances', utterancesTheme) - - if ('!{theme.comments.use[0]}' === 'Utterances' || !!{theme.comments.lazyload}) { - if (!{theme.comments.lazyload}) btf.loadComment(document.getElementById('utterances-wrap'), loadUtterances) - else loadUtterances() - } else { - function loadOtherComment () { - loadUtterances() + const utterancesTheme = theme => { + const iframe = document.querySelector('.utterances-frame') + if (iframe) { + const theme = theme === 'dark' ? '#{dark_theme}' : '#{light_theme}' + const message = { + type: 'set-theme', + theme: theme + }; + iframe.contentWindow.postMessage(message, 'https://utteranc.es'); + } } - } + + btf.addGlobalFn('themeChange', utterancesTheme, 'utterances') + + if ('!{use[0]}' === 'Utterances' || !!{lazyload}) { + if (!{lazyload}) btf.loadComment(document.getElementById('utterances-wrap'), loadUtterances) + else loadUtterances() + } else { + window.loadOtherComment = loadUtterances + } + })() \ No newline at end of file diff --git a/layout/includes/third-party/comments/valine.pug b/layout/includes/third-party/comments/valine.pug index 025849e..85781d5 100644 --- a/layout/includes/third-party/comments/valine.pug +++ b/layout/includes/third-party/comments/valine.pug @@ -1,33 +1,38 @@ +- 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. - function loadValine () { - function initValine () { + (() => { + const initValine = () => { const valine = new Valine(Object.assign({ el: '#vcomment', - appId: '#{theme.valine.appId}', - appKey: '#{theme.valine.appKey}', - avatar: '#{theme.valine.avatar}', - serverURLs: '#{theme.valine.serverURLs}', + appId: '#{appId}', + appKey: '#{appKey}', + avatar: '#{avatar}', + serverURLs: '#{serverURLs}', emojiMaps: !{emojiMaps}, path: window.location.pathname, - visitor: #{theme.valine.visitor} - }, !{JSON.stringify(theme.valine.option)})) + visitor: #{visitor} + }, !{JSON.stringify(option)})) } - if (typeof Valine === 'function') initValine() - else getScript('!{url_for(theme.asset.valine)}').then(initValine) - } - - if ('!{theme.comments.use[0]}' === 'Valine' || !!{theme.comments.lazyload}) { - if (!{theme.comments.lazyload}) btf.loadComment(document.getElementById('vcomment'),loadValine) - else setTimeout(loadValine, 0) - } else { - function loadOtherComment () { - loadValine() + const loadValine = async () => { + if (typeof Valine === 'function') initValine() + else { + await getScript('!{url_for(theme.asset.valine)}') + initValine() + } } - } - + + if ('!{use[0]}' === 'Valine' || !!{lazyload}) { + if (!{lazyload}) btf.loadComment(document.getElementById('vcomment'),loadValine) + else setTimeout(loadValine, 0) + } else { + window.loadOtherComment = loadValine + } + })() diff --git a/layout/includes/third-party/comments/waline.pug b/layout/includes/third-party/comments/waline.pug index 55c7b45..a3bacca 100644 --- a/layout/includes/third-party/comments/waline.pug +++ b/layout/includes/third-party/comments/waline.pug @@ -2,8 +2,8 @@ - const { lazyload, count, use } = theme.comments script. - function loadWaline () { - function initWaline () { + (() => { + const initWaline = () => { const waline = Waline.init(Object.assign({ el: '#waline-wrap', serverURL: '!{serverURL}', @@ -14,21 +14,20 @@ script. }, !{JSON.stringify(option)})) } - if (typeof Waline === 'object') initWaline() - else { - getCSS('!{url_for(theme.asset.waline_css)}').then(() => { - getScript('!{url_for(theme.asset.waline_js)}').then(initWaline) - }) + const loadWaline = async () => { + if (typeof Waline === 'object') initWaline() + else { + await getCSS('!{url_for(theme.asset.waline_css)}') + await getScript('!{url_for(theme.asset.waline_js)}') + initWaline() + } } - } - if ('!{use[0]}' === 'Waline' || !!{lazyload}) { - if (!{lazyload}) btf.loadComment(document.getElementById('waline-wrap'),loadWaline) - else setTimeout(loadWaline, 0) - } else { - function loadOtherComment () { - loadWaline() + if ('!{use[0]}' === 'Waline' || !!{lazyload}) { + if (!{lazyload}) btf.loadComment(document.getElementById('waline-wrap'),loadWaline) + else setTimeout(loadWaline, 0) + } else { + window.loadOtherComment = loadWaline } - } - + })() diff --git a/layout/includes/third-party/effect.pug b/layout/includes/third-party/effect.pug index 275297c..a3b2995 100644 --- a/layout/includes/third-party/effect.pug +++ b/layout/includes/third-party/effect.pug @@ -24,12 +24,12 @@ if theme.activate_power_mode.enable 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 +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}` + 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/layout/includes/third-party/math/mermaid.pug b/layout/includes/third-party/math/mermaid.pug index 119a5dd..2cfc1c7 100644 --- a/layout/includes/third-party/math/mermaid.pug +++ b/layout/includes/third-party/math/mermaid.pug @@ -32,7 +32,7 @@ script. window.loadMermaid ? runMermaid() : getScript('!{url_for(theme.asset.mermaid)}').then(runMermaid) } - btf.addModeChange('mermaid', runMermaid) + btf.addGlobalFn('themeChange', runMermaid, 'mermaid') window.pjax ? loadMermaid() : document.addEventListener('DOMContentLoaded', loadMermaid) })() \ No newline at end of file diff --git a/layout/includes/third-party/newest-comments/waline.pug b/layout/includes/third-party/newest-comments/waline.pug index 00a72d5..be25326 100644 --- a/layout/includes/third-party/newest-comments/waline.pug +++ b/layout/includes/third-party/newest-comments/waline.pug @@ -1,3 +1,5 @@ +- const serverURL = theme.waline.serverURL.replace(/\/$/, '') + script. window.addEventListener('load', () => { const changeContent = content => { @@ -43,7 +45,7 @@ script. const getComment = async () => { try { - const res = await fetch('!{theme.waline.serverURL}/api/comment?type=recent&count=!{theme.newest_comments.limit}', { method: 'GET' }) + 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 { diff --git a/layout/includes/third-party/pjax.pug b/layout/includes/third-party/pjax.pug index a5d926a..2b783c6 100644 --- a/layout/includes/third-party/pjax.pug +++ b/layout/includes/third-party/pjax.pug @@ -26,11 +26,11 @@ script. document.addEventListener('pjax:send', function () { - // removeEventListener scroll - window.tocScrollFn && window.removeEventListener('scroll', window.tocScrollFn) - window.scrollCollect && window.removeEventListener('scroll', scrollCollect) + // removeEventListener + btf.removeGlobalFnEvent('pjax') + btf.removeGlobalFnEvent('themeChange') - document.getElementById('rightside').style.cssText = "opacity: ''; transform: ''" + document.getElementById('rightside').classList.remove('rightside-show') if (window.aplayers) { for (let i = 0; i < window.aplayers.length; i++) { @@ -76,8 +76,8 @@ script. typeof Prism === 'object' && Prism.highlightAll() }) - document.addEventListener('pjax:error', (e) => { + document.addEventListener('pjax:error', e => { if (e.request.status === 404) { - pjax.loadUrl('/404.html') + pjax.loadUrl('!{url_for("/404.html")}') } }) diff --git a/layout/includes/third-party/search/docsearch.pug b/layout/includes/third-party/search/docsearch.pug index 00d8a01..9adad8b 100644 --- a/layout/includes/third-party/search/docsearch.pug +++ b/layout/includes/third-party/search/docsearch.pug @@ -13,11 +13,12 @@ container: '#docsearch', }, !{JSON.stringify(option)})) + const handleClick = () => { + document.querySelector('.DocSearch-Button').click() + } const searchClickFn = () => { - document.querySelector('#search-button > .search').addEventListener('click', () => { - document.querySelector('.DocSearch-Button').click() - }) + btf.addEventListenerPjax(document.querySelector('#search-button > .search'), 'click', handleClick) } searchClickFn() diff --git a/layout/includes/third-party/search/local-search.pug b/layout/includes/third-party/search/local-search.pug index 0c7537b..f22f05b 100644 --- a/layout/includes/third-party/search/local-search.pug +++ b/layout/includes/third-party/search/local-search.pug @@ -15,7 +15,7 @@ .local-search-box input(placeholder=_p("search.local_search.input_placeholder") type="text").local-search-box--input hr - #local-search-results.no-result + #local-search-results #local-search-stats-wrap #search-mask diff --git a/layout/includes/third-party/share/add-this.pug b/layout/includes/third-party/share/add-this.pug deleted file mode 100644 index ab44267..0000000 --- a/layout/includes/third-party/share/add-this.pug +++ /dev/null @@ -1,2 +0,0 @@ -.addthis_inline_share_toolbox -script(src=`//s7.addthis.com/js/300/addthis_widget.js#pubid=${theme.addThis.pubid}` async) \ No newline at end of file diff --git a/layout/includes/third-party/share/index.pug b/layout/includes/third-party/share/index.pug index f28ceab..f8122c0 100644 --- a/layout/includes/third-party/share/index.pug +++ b/layout/includes/third-party/share/index.pug @@ -1,7 +1,5 @@ .post_share - if theme.addThis.enable - !=partial('includes/third-party/share/add-this', {}, {cache: true}) - else if theme.sharejs.enable + if theme.sharejs.enable include ./share-js.pug else if theme.addtoany.enable !=partial('includes/third-party/share/addtoany', {}, {cache: true}) diff --git a/layout/includes/widget/card_post_series.pug b/layout/includes/widget/card_post_series.pug new file mode 100644 index 0000000..c216929 --- /dev/null +++ b/layout/includes/widget/card_post_series.pug @@ -0,0 +1,21 @@ +if theme.aside.card_post_series.enable + - const array = fragment_cache('seriesArr', groupPosts) + .card-widget.card-post-series + .item-headline + i.fa-solid.fa-layer-group + span= _p('aside.card_post_series') + .aside-list + each item in array[page.series] + - const { path, title = _p('no_title'), cover, cover_type, date:dateA } = item + - let link = url_for(path) + - let no_cover = cover === false || !theme.cover.aside_enable ? 'no-cover' : '' + .aside-list-item(class=no_cover) + if cover && theme.cover.aside_enable + a.thumbnail(href=link title=title) + if cover_type === 'img' + img(src=url_for(cover) onerror=`this.onerror=null;this.src='${url_for(theme.error_img.post_page)}'` alt=title) + else + div(style=`background: ${cover}`) + .content + a.title(href=link title=title)= title + time(datetime=date_xml(dateA) title=_p('post.created') + ' ' + full_date(dateA)) #[=date(dateA, config.date_format)] diff --git a/layout/includes/widget/index.pug b/layout/includes/widget/index.pug index 175fcdc..388ea1c 100644 --- a/layout/includes/widget/index.pug +++ b/layout/includes/widget/index.pug @@ -13,6 +13,8 @@ .sticky_layout if showToc include ./card_post_toc.pug + if page.series + include ./card_post_series.pug !=partial('includes/widget/card_recent_post', {}, {cache: true}) !=partial('includes/widget/card_ad', {}, {cache: true}) else diff --git a/package.json b/package.json index 6e97de2..0ed17d4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hexo-theme-butterfly", - "version": "4.9.0", + "version": "4.10.0", "description": "A Simple and Card UI Design theme for Hexo", "main": "package.json", "scripts": { diff --git a/plugins.yml b/plugins.yml index ef96ad0..b25c304 100644 --- a/plugins.yml +++ b/plugins.yml @@ -1,11 +1,11 @@ algolia_search: name: algoliasearch file: dist/algoliasearch-lite.umd.js - version: 4.17.1 + version: 4.20.0 instantsearch: name: instantsearch.js file: dist/instantsearch.production.min.js - version: 4.56.1 + version: 4.57.0 pjax: name: pjax file: pjax.min.js @@ -37,17 +37,17 @@ disqusjs_css: twikoo: name: twikoo file: dist/twikoo.all.min.js - version: 1.6.16 + version: 1.6.22 waline_js: name: '@waline/client' file: dist/waline.js other_name: waline - version: 2.15.5 + version: 2.15.8 waline_css: name: '@waline/client' file: dist/waline.css other_name: waline - version: 2.15.5 + version: 2.15.8 sharejs: name: butterfly-extsrc file: sharejs/dist/js/social-share.min.js @@ -64,16 +64,16 @@ katex: name: katex file: dist/katex.min.css other_name: KaTeX - version: 0.16.7 + version: 0.16.9 katex_copytex: name: katex file: dist/contrib/copy-tex.min.js other_name: KaTeX - version: 0.16.7 + version: 0.16.9 mermaid: name: mermaid file: dist/mermaid.min.js - version: 10.2.2 + version: 10.5.0 canvas_ribbon: name: butterfly-extsrc file: dist/canvas-ribbon.min.js @@ -98,14 +98,14 @@ click_heart: name: butterfly-extsrc file: dist/click-heart.min.js version: 1.1.3 -ClickShowText: +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: 17.8.3 + version: 17.8.4 instantpage: name: instant.page file: instantpage.js @@ -121,12 +121,12 @@ pangu: fancybox_css: name: '@fancyapps/ui' file: dist/fancybox/fancybox.css - version: 5.0.19 + version: 5.0.24 other_name: fancyapps-ui fancybox: name: '@fancyapps/ui' file: dist/fancybox/fancybox.umd.js - version: 5.0.19 + version: 5.0.24 other_name: fancyapps-ui medium_zoom: name: medium-zoom @@ -144,15 +144,12 @@ fontawesome: name: '@fortawesome/fontawesome-free' file: css/all.min.css other_name: font-awesome - version: 6.4.0 -flickr_justified_gallery_js: - name: flickr-justified-gallery - file: dist/fjGallery.min.js - version: 2.1.2 -flickr_justified_gallery_css: - name: flickr-justified-gallery - file: dist/fjGallery.css - version: 2.1.2 + version: 6.4.2 +egjs_infinitegrid: + name: '@egjs/infinitegrid' + other_name: egjs-infinitegrid + file: dist/infinitegrid.min.js + version: 4.10.1 aplayer_css: name: aplayer file: dist/APlayer.min.css @@ -183,11 +180,11 @@ prismjs_autoloader: artalk_js: name: artalk file: dist/Artalk.js - version: 2.5.5 + version: 2.6.3 artalk_css: name: artalk file: dist/Artalk.css - version: 2.5.5 + version: 2.6.3 pace_js: name: pace-js other_name: pace @@ -202,12 +199,12 @@ docsearch_js: name: '@docsearch/js' other_name: docsearch-js file: dist/umd/index.js - version: 3.4.0 + version: 3.5.2 docsearch_css: name: '@docsearch/css' other_name: docsearch-css file: dist/style.css - version: 3.4.0 + version: 3.5.2 abcjs_basic_js: name: abcjs file: dist/abcjs-basic-min.js diff --git a/scripts/events/stylus.js b/scripts/events/stylus.js index 4b95538..2e6b802 100644 --- a/scripts/events/stylus.js +++ b/scripts/events/stylus.js @@ -1,15 +1,16 @@ /** - * stylus + * Stylus renderer */ 'use strict' -hexo.extend.filter.register('stylus:renderer', function (style) { - const { highlight, prismjs } = hexo.config - style - .define('$highlight_enable', highlight && highlight.enable) - .define('$highlight_line_number', highlight && highlight.line_number) - .define('$prismjs_enable', prismjs && prismjs.enable) - .define('$prismjs_line_number', prismjs && prismjs.line_number) - // .import(this.source_dir.replace(/\\/g, '/') + '_data/css/*') +hexo.extend.filter.register('stylus:renderer', style => { + const { enable: highlightEnable, line_number: highlightLineNumber } = hexo.config.highlight + const { enable: prismjsEnable, line_number: prismjsLineNumber } = hexo.config.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/scripts/filters/post_lazyload.js b/scripts/filters/post_lazyload.js index c4267d1..cecc6ce 100644 --- a/scripts/filters/post_lazyload.js +++ b/scripts/filters/post_lazyload.js @@ -8,22 +8,20 @@ const urlFor = require('hexo-util').url_for.bind(hexo) -function lazyload (htmlContent) { +const lazyload = htmlContent => { 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 config = hexo.theme.config.lazyload - if (!config.enable) return - if (config.field !== 'post') return - data.content = lazyload.call(this, data.content) + const { enable, field } = hexo.theme.config.lazyload + if (!enable || field !== 'post') return + data.content = lazyload(data.content) return data }) diff --git a/scripts/filters/random_cover.js b/scripts/filters/random_cover.js index 4ecedce..7dac3cf 100644 --- a/scripts/filters/random_cover.js +++ b/scripts/filters/random_cover.js @@ -5,40 +5,35 @@ 'use strict' -hexo.extend.filter.register('before_post_render', function (data) { +hexo.extend.filter.register('before_post_render', data => { const imgTestReg = /\.(png|jpe?g|gif|svg|webp)(\?.*)?$/i - let randomCover - let coverVal = data.cover + 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) { - const topImg = data.top_img - 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 + 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 theme = hexo.theme.config - if (!(theme.cover && theme.cover.default_cover)) return false - if (!Array.isArray(theme.cover.default_cover)) return theme.cover.default_cover - const num = Math.floor(Math.random() * theme.cover.default_cover.length) - return theme.cover.default_cover[num] + 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 // If cover is not set, use random cover if (!coverVal) { - randomCover = randomCoverFn() + const randomCover = randomCoverFn() data.cover = randomCover coverVal = randomCover // update coverVal } - if (coverVal) { - if (coverVal.indexOf('//') !== -1 || imgTestReg.test(coverVal)) { - data.cover_type = 'img' - return data - } + if (coverVal && (coverVal.indexOf('//') !== -1 || imgTestReg.test(coverVal))) { + data.cover_type = 'img' } return data diff --git a/scripts/helpers/aside_categories.js b/scripts/helpers/aside_categories.js index 0e60b8e..244b163 100644 --- a/scripts/helpers/aside_categories.js +++ b/scripts/helpers/aside_categories.js @@ -31,6 +31,7 @@ hexo.extend.helper.register('aside_categories', function (categories, options) { 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 = '' @@ -59,6 +60,7 @@ hexo.extend.helper.register('aside_categories', function (categories, options) { } if (isExpand && isTopParent && child) { + expandBtn = ' expandBtn' result += `` } @@ -91,7 +93,7 @@ hexo.extend.helper.register('aside_categories', function (categories, options) { ${this._p('aside.card_categories')} ${moreButton()} -