From ecf4d341e6524d97bfda2bb2429b0489a102551f Mon Sep 17 00:00:00 2001 From: GZTime Date: Wed, 16 Nov 2022 03:36:24 +0800 Subject: [PATCH 1/9] fix: `TypeError: require(...) is not a function` --- scripts/events/init.js | 2 +- scripts/events/welcome.js | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/scripts/events/init.js b/scripts/events/init.js index 69c2807..99f85e7 100644 --- a/scripts/events/init.js +++ b/scripts/events/init.js @@ -1,4 +1,4 @@ -const logger = require('hexo-log')() +const logger = hexo.log; hexo.extend.filter.register('before_generate', () => { // Get first two digits of the Hexo version number diff --git a/scripts/events/welcome.js b/scripts/events/welcome.js index 77eb662..6952f3c 100644 --- a/scripts/events/welcome.js +++ b/scripts/events/welcome.js @@ -1,16 +1,16 @@ -const logger = require('hexo-log')() +const logger = hexo.log; hexo.on('ready', () => { const { version } = require('../../package.json') logger.info(` =================================================================== - - ##### # # ##### ##### ###### ##### ###### # # # - # # # # # # # # # # # # # - ##### # # # # ##### # # ##### # # - # # # # # # # ##### # # # - # # # # # # # # # # # # - ##### #### # # ###### # # # ###### # + + ##### # # ##### ##### ###### ##### ###### # # # + # # # # # # # # # # # # # + ##### # # # # ##### # # ##### # # + # # # # # # # ##### # # # + # # # # # # # # # # # # + ##### #### # # ###### # # # ###### # ${version} ===================================================================`) From 4bd5edd955b11654ec8220774c9bc25c37cfbf16 Mon Sep 17 00:00:00 2001 From: GZTime Date: Wed, 16 Nov 2022 03:45:54 +0800 Subject: [PATCH 2/9] chore: remove semicolons --- scripts/events/init.js | 2 +- scripts/events/welcome.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/events/init.js b/scripts/events/init.js index 99f85e7..20e9fab 100644 --- a/scripts/events/init.js +++ b/scripts/events/init.js @@ -1,4 +1,4 @@ -const logger = hexo.log; +const logger = hexo.log hexo.extend.filter.register('before_generate', () => { // Get first two digits of the Hexo version number diff --git a/scripts/events/welcome.js b/scripts/events/welcome.js index 6952f3c..161516a 100644 --- a/scripts/events/welcome.js +++ b/scripts/events/welcome.js @@ -1,4 +1,4 @@ -const logger = hexo.log; +const logger = hexo.log hexo.on('ready', () => { const { version } = require('../../package.json') From f07823903f64af0d5509daa203c0460fa757d570 Mon Sep 17 00:00:00 2001 From: Jerry Wong Date: Fri, 18 Nov 2022 13:32:03 +0800 Subject: [PATCH 3/9] Update init.js --- scripts/events/init.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/scripts/events/init.js b/scripts/events/init.js index 20e9fab..9c1bfe8 100644 --- a/scripts/events/init.js +++ b/scripts/events/init.js @@ -1,8 +1,7 @@ -const logger = hexo.log - 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!') From eb88a5bb4a4159c7be6ea7264e93ec276f7d4a4b Mon Sep 17 00:00:00 2001 From: Jerry Wong Date: Fri, 18 Nov 2022 13:32:35 +0800 Subject: [PATCH 4/9] Update welcome.js --- scripts/events/welcome.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/scripts/events/welcome.js b/scripts/events/welcome.js index 161516a..2655d05 100644 --- a/scripts/events/welcome.js +++ b/scripts/events/welcome.js @@ -1,8 +1,6 @@ -const logger = hexo.log - hexo.on('ready', () => { const { version } = require('../../package.json') - logger.info(` + hexo.log.info(` =================================================================== ##### # # ##### ##### ###### ##### ###### # # # From f218a0a14aaa4d02affe05ddd009506e9edc3025 Mon Sep 17 00:00:00 2001 From: Jerry Date: Fri, 18 Nov 2022 18:30:25 +0800 Subject: [PATCH 5/9] =?UTF-8?q?breaking=20changes:=20=E7=A7=BB=E9=99=A4=20?= =?UTF-8?q?subtitle=20=E4=B8=80=E5=8F=A5=E7=B6=B2=E8=AA=BF=E7=94=A8?= =?UTF-8?q?=EF=BC=88api=20=E5=B7=B2=E5=A4=B1=E6=95=88)=20feat:=20=E5=8F=B3?= =?UTF-8?q?=E4=B8=8B=E8=A7=92=E6=8C=89=E9=88=95=E5=A2=9E=E5=8A=A0=E9=A0=90?= =?UTF-8?q?=E8=A6=BD=E9=80=B2=E5=BA=A6=E9=A1=AF=E7=A4=BA=20feat:=20toc?= =?UTF-8?q?=E5=8F=AF=E8=A8=AD=E7=BD=AE=E6=98=AF=E5=90=A6=E9=A1=AF=E7=A4=BA?= =?UTF-8?q?=E9=A0=90=E8=A6=BD=E9=80=B2=E5=BA=A6=20fix:=20=E4=BF=AE?= =?UTF-8?q?=E5=BE=A9=20TypeError:=20require(...)=20is=20not=20a=20function?= =?UTF-8?q?=20=E7=9A=84=E5=A0=B1=E9=8C=AF=20#1102=20improvement:=20?= =?UTF-8?q?=E6=97=A5=E6=9C=9F=E8=A8=AD=E7=BD=AE=E7=9B=B8=E5=B0=8D=E6=97=A5?= =?UTF-8?q?=E6=9C=9F=E6=99=82=EF=BC=8C=E6=96=87=E7=AB=A0=E7=9A=84=E6=97=A5?= =?UTF-8?q?=E6=9C=9F=E6=A0=BC=E5=BC=8F=E5=92=8C=E6=9C=80=E6=96=B0=E8=A9=95?= =?UTF-8?q?=E8=AB=96=E7=9A=84=E6=97=A5=E6=9C=9F=E6=A0=BC=E5=BC=8F=E7=B5=B1?= =?UTF-8?q?=E4=B8=80=E7=82=BA=20=E5=B9=B4=E6=9C=88=E6=97=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _config.yml | 11 +++--- layout/includes/head/config.pug | 6 +++- layout/includes/rightside.pug | 1 + layout/includes/third-party/subtitle.pug | 32 ----------------- package.json | 2 +- scripts/events/init.js | 7 ++-- scripts/events/welcome.js | 18 ++++------ source/css/_layout/rightside.styl | 19 ++++++++++ source/js/main.js | 45 ++++++++++++++---------- source/js/utils.js | 13 ++++++- 10 files changed, 83 insertions(+), 71 deletions(-) diff --git a/_config.yml b/_config.yml index d0ba6de..bf08b04 100644 --- a/_config.yml +++ b/_config.yml @@ -185,6 +185,7 @@ toc: number: true expand: false style_simple: false # for post + scroll_percent: true post_copyright: enable: true @@ -632,8 +633,7 @@ subtitle: # source 調用第三方服務 # source: false 關閉調用 # source: 1 調用一言網的一句話(簡體) https://hitokoto.cn/ - # source: 2 調用一句網(簡體) http://yijuzhan.com/ - # source: 3 調用今日詩詞(簡體) https://www.jinrishici.com/ + # source: 2 調用今日詩詞(簡體) https://www.jinrishici.com/ # subtitle 會先顯示 source , 再顯示 sub 的內容 source: false # 如果關閉打字效果,subtitle 只會顯示 sub 的第一行文字 @@ -753,6 +753,9 @@ darkmode: # autoChangeMode: false autoChangeMode: false +# show scroll percent in scroll-to-top button +rightside_scroll_percent: false + # Don't modify the following settings unless you know how they work (非必要請不要修改 ) # Choose: readmode,translate,darkmode,hideAside,toc,chat,comment # Don't repeat 不要重複 @@ -894,7 +897,7 @@ CDN: # when set it to local, you need to install hexo-butterfly-extjs third_party_provider: jsdelivr - # Add version number to CDN, true or false + # Add version number to CDN, true or false version: false # Custom format @@ -952,4 +955,4 @@ CDN: # prismjs_lineNumber_js: # prismjs_autoloader: # artalk_js: - # artalk_css: \ No newline at end of file + # artalk_css: diff --git a/layout/includes/head/config.pug b/layout/includes/head/config.pug index 5a8b8f5..ed81219 100644 --- a/layout/includes/head/config.pug +++ b/layout/includes/head/config.pug @@ -120,5 +120,9 @@ script. }, isPhotoFigcaption: !{theme.photofigcaption}, islazyload: !{theme.lazyload.enable}, - isAnchor: !{theme.anchor.auto_update || false} + isAnchor: !{theme.anchor.auto_update || false}, + percent: { + toc: !{theme.toc.scroll_percent}, + rightside: !{theme.rightside_scroll_percent}, + } } diff --git a/layout/includes/rightside.pug b/layout/includes/rightside.pug index 9696d0b..03c6aaa 100644 --- a/layout/includes/rightside.pug +++ b/layout/includes/rightside.pug @@ -57,4 +57,5 @@ mixin rightsideItem(array) +rightsideItem(showArray) button#go-up(type="button" title=_p("rightside.back_to_top")) + span.scroll-percent i.fas.fa-arrow-up \ No newline at end of file diff --git a/layout/includes/third-party/subtitle.pug b/layout/includes/third-party/subtitle.pug index 9236757..a565a66 100644 --- a/layout/includes/third-party/subtitle.pug +++ b/layout/includes/third-party/subtitle.pug @@ -36,38 +36,6 @@ case source } 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(() => { diff --git a/package.json b/package.json index 38882af..3dd25be 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hexo-theme-butterfly", - "version": "4.5.1", + "version": "4.6.0-b1", "description": "A Simple and Card UI Design theme for Hexo", "main": "package.json", "scripts": { diff --git a/scripts/events/init.js b/scripts/events/init.js index 69c2807..1bd0570 100644 --- a/scripts/events/init.js +++ b/scripts/events/init.js @@ -1,8 +1,7 @@ -const logger = require('hexo-log')() - 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!') @@ -13,7 +12,9 @@ hexo.extend.filter.register('before_generate', () => { if (hexo.locals.get) { const data = hexo.locals.get('data') if (data && data.butterfly) { - logger.error(" 'butterfly.yml' is deprecated. Please use '_config.butterfly.yml' ") + logger.error( + " 'butterfly.yml' is deprecated. Please use '_config.butterfly.yml' " + ) logger.error(" 'butterfly.yml' 已經棄用,請使用 '_config.butterfly.yml' ") process.exit(-1) } diff --git a/scripts/events/welcome.js b/scripts/events/welcome.js index 77eb662..f4c018a 100644 --- a/scripts/events/welcome.js +++ b/scripts/events/welcome.js @@ -1,17 +1,13 @@ -const logger = require('hexo-log')() - hexo.on('ready', () => { const { version } = require('../../package.json') - logger.info(` + hexo.log.info(` =================================================================== - - ##### # # ##### ##### ###### ##### ###### # # # - # # # # # # # # # # # # # - ##### # # # # ##### # # ##### # # - # # # # # # # ##### # # # - # # # # # # # # # # # # - ##### #### # # ###### # # # ###### # - + ##### # # ##### ##### ###### ##### ###### # # # + # # # # # # # # # # # # # + ##### # # # # ##### # # ##### # # + # # # # # # # ##### # # # + # # # # # # # # # # # # + ##### #### # # ###### # # # ###### # ${version} ===================================================================`) }) diff --git a/source/css/_layout/rightside.styl b/source/css/_layout/rightside.styl index 6daea56..0c25205 100644 --- a/source/css/_layout/rightside.styl +++ b/source/css/_layout/rightside.styl @@ -47,3 +47,22 @@ +maxWidth900() #hide-aside-btn display: none + + if hexo-config('rightside_scroll_percent') + #go-up + .scroll-percent + display: none + + &.show-percent + .scroll-percent + display: block + + & + i + display: none + + &:hover + .scroll-percent + display: none + + & + i + display: block diff --git a/source/js/main.js b/source/js/main.js index 2e29ac8..4c62fca 100644 --- a/source/js/main.js +++ b/source/js/main.js @@ -251,6 +251,21 @@ document.addEventListener('DOMContentLoaded', function () { getScript(`${GLOBAL_CONFIG.source.justifiedGallery.js}`).then(() => { btf.initJustifiedGallery(ele) }) } + /** + * rightside scroll percent + */ + const rightsideScrollPercent = currentTop => { + const perNum = btf.getScrollPercent(currentTop,document.body) + const $goUp = document.getElementById('go-up') + if ( perNum < 95 ) { + $goUp.classList.add('show-percent') + $goUp.querySelector('.scroll-percent').textContent = perNum + } + else { + $goUp.classList.remove('show-percent') + } + } + /** * 滾動處理 */ @@ -276,6 +291,7 @@ document.addEventListener('DOMContentLoaded', function () { const $header = document.getElementById('page-header') const isChatBtnHide = typeof chatBtnHide === 'function' const isChatBtnShow = typeof chatBtnShow === 'function' + const isShowPercent = GLOBAL_CONFIG.percent.rightside const scrollTask = btf.throttle(() => { const currentTop = window.scrollY || document.documentElement.scrollTop @@ -305,9 +321,12 @@ document.addEventListener('DOMContentLoaded', function () { $rightside.style.cssText = "opacity: ''; transform: ''" } + isShowPercent && rightsideScrollPercent(currentTop) + if (document.body.scrollHeight <= innerHeight) { $rightside.style.cssText = 'opacity: 0.8; transform: translateX(-58px)' } + }, 200) window.scrollCollect = scrollTask @@ -325,26 +344,15 @@ document.addEventListener('DOMContentLoaded', function () { if (!($article && (isToc || isAnchor))) return - let $tocLink, $cardToc, scrollPercent, autoScrollToc, isExpand + let $tocLink, $cardToc, autoScrollToc, $tocPercentage, isExpand if (isToc) { const $cardTocLayout = document.getElementById('card-toc') $cardToc = $cardTocLayout.getElementsByClassName('toc-content')[0] $tocLink = $cardToc.querySelectorAll('.toc-link') - const $tocPercentage = $cardTocLayout.querySelector('.toc-percentage') + $tocPercentage = $cardTocLayout.querySelector('.toc-percentage') isExpand = $cardToc.classList.contains('is-expand') - scrollPercent = currentTop => { - const docHeight = $article.clientHeight - const winHeight = document.documentElement.clientHeight - const headerHeight = $article.offsetTop - const contentMath = (docHeight > winHeight) ? (docHeight - winHeight) : (document.documentElement.scrollHeight - winHeight) - const scrollPercent = (currentTop - headerHeight) / (contentMath) - const scrollPercentRounded = Math.round(scrollPercent * 100) - const percentage = (scrollPercentRounded > 100) ? 100 : (scrollPercentRounded <= 0) ? 0 : scrollPercentRounded - $tocPercentage.textContent = percentage - } - window.mobileToc = { open: () => { $cardTocLayout.style.cssText = 'animation: toc-open .3s; opacity: 1; right: 55px' @@ -433,13 +441,14 @@ document.addEventListener('DOMContentLoaded', function () { } // main of scroll - window.tocScrollFn = function () { - return btf.throttle(function () { + window.tocScrollFn = btf.throttle(()=>{ const currentTop = window.scrollY || document.documentElement.scrollTop - isToc && scrollPercent(currentTop) + if (isToc && GLOBAL_CONFIG.percent.toc) { + $tocPercentage.textContent = btf.getScrollPercent(currentTop,$article) + } findHeadPosition(currentTop) - }, 100)() - } + }, 100) + window.addEventListener('scroll', tocScrollFn) } diff --git a/source/js/utils.js b/source/js/utils.js index a1be368..3460b6a 100644 --- a/source/js/utils.js +++ b/source/js/utils.js @@ -88,7 +88,7 @@ const btf = { const minuteCount = dateDiff / minute if (monthCount > 12) { - result = datePost.toLocaleDateString().replace(/\//g, '-') + result = datePost.toISOString().slice(0,10) } else if (monthCount >= 1) { result = parseInt(monthCount) + ' ' + GLOBAL_CONFIG.date_suffix.month } else if (dayCount >= 1) { @@ -274,5 +274,16 @@ const btf = { title: title }, title, anchor) } + }, + + getScrollPercent: (currentTop,ele) => { + const docHeight = ele.clientHeight + const winHeight = document.documentElement.clientHeight + const headerHeight = ele.offsetTop + const contentMath = (docHeight > winHeight) ? (docHeight - winHeight) : (document.documentElement.scrollHeight - winHeight) + const scrollPercent = (currentTop - headerHeight) / (contentMath) + const scrollPercentRounded = Math.round(scrollPercent * 100) + const percentage = (scrollPercentRounded > 100) ? 100 : (scrollPercentRounded <= 0) ? 0 : scrollPercentRounded + return percentage } } From e2565a9f39d5bd891e9e3a91fefbb1e99954c0d4 Mon Sep 17 00:00:00 2001 From: Jerry Date: Tue, 13 Dec 2022 01:23:50 +0800 Subject: [PATCH 6/9] =?UTF-8?q?breaking=20changes:=20cover=20=E7=9A=84?= =?UTF-8?q?=E9=A1=AF=E7=A4=BA=E5=84=AA=E5=8C=96=20#1101=20feature:=20defau?= =?UTF-8?q?lt=5Fcover=20=E5=8F=AF=E9=85=8D=E7=BD=AE=E9=A1=8F=E8=89=B2=20fi?= =?UTF-8?q?x:=20=E4=BF=AE=E5=BE=A9=E4=BD=BF=E7=94=A8=E6=9C=AC=E5=9C=B0?= =?UTF-8?q?=E6=90=9C=E7=B4=A2=E6=99=82=EF=BC=8C=E8=BC=B8=E5=85=A5=E7=89=B9?= =?UTF-8?q?=E6=AE=8A=E7=AC=A6=E8=99=9F=E6=B2=92=E6=9C=89=E9=A1=AF=E7=A4=BA?= =?UTF-8?q?=E7=B5=90=E6=9E=9C=E7=9A=84=20bug=20closed=20#1110=20fix:=20?= =?UTF-8?q?=E4=BF=AE=E5=BE=A9=20=E9=A0=82=E9=83=A8=E5=9C=96=E5=92=8C=20foo?= =?UTF-8?q?ter=20=E9=85=8D=E7=BD=AE=E5=B8=B6=E6=9C=89/=E7=9A=84=E9=A1=8F?= =?UTF-8?q?=E8=89=B2=E5=8F=83=E6=95=B8=E6=99=82=EF=BC=8C=E7=84=A1=E6=B3=95?= =?UTF-8?q?=E9=A1=AF=E7=A4=BA=E9=A1=8F=E8=89=B2=E7=9A=84=20bug=20improveme?= =?UTF-8?q?nt:=20=E9=BC=A0=E6=A8=99=E7=A7=BB=E5=8B=95=E5=88=B0=E5=88=86?= =?UTF-8?q?=E9=A0=81=E6=99=82=EF=BC=8C=E6=96=87=E7=AB=A0=E5=88=86=E9=A0=81?= =?UTF-8?q?=E6=8C=89=E9=88=95=E5=A2=9E=E5=8A=A0=E8=AA=AC=E6=98=8E=E6=96=87?= =?UTF-8?q?=E5=AD=97=20improvement:=20=E6=96=87=E7=AB=A0=E9=A0=81=E7=9A=84?= =?UTF-8?q?=E9=A0=82=E9=83=A8=E5=9C=96=E9=A1=AF=E7=A4=BA=E6=AC=A1=E5=BA=8F?= =?UTF-8?q?=E7=82=BA=20top=5Fimg=20>=20cover=20>=20default=5Ftop=5Fimg=20i?= =?UTF-8?q?mprovement:=20canonical=20=E7=9A=84=E9=8F=88=E6=8E=A5=E6=A0=B9?= =?UTF-8?q?=E6=93=9A=E9=85=8D=E7=BD=AE=E7=94=9F=E6=88=90=20#1111?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- layout/includes/head.pug | 2 +- layout/includes/head/Open_Graph.pug | 3 +- layout/includes/header/index.pug | 4 +- layout/includes/layout.pug | 2 +- layout/includes/mixins/article-sort.pug | 5 +- layout/includes/mixins/post-ui.pug | 5 +- layout/includes/pagination.pug | 16 +++-- .../includes/third-party/share/share-js.pug | 3 +- layout/includes/widget/card_recent_post.pug | 5 +- package.json | 2 +- scripts/filters/random_cover.js | 58 +++++++++---------- scripts/helpers/page.js | 12 +++- scripts/helpers/related_post.js | 13 +++-- source/css/_global/function.styl | 4 +- source/css/_global/index.styl | 1 + source/css/_layout/aside.styl | 2 +- source/css/_layout/footer.styl | 2 +- source/css/_page/archives.styl | 2 +- source/css/_page/homepage.styl | 4 +- source/js/search/local-search.js | 12 +++- 20 files changed, 95 insertions(+), 62 deletions(-) diff --git a/layout/includes/head.pug b/layout/includes/head.pug index d8ff883..8d0674b 100644 --- a/layout/includes/head.pug +++ b/layout/includes/head.pug @@ -26,7 +26,7 @@ meta(name="theme-color" content=themeColor) include ./head/Open_Graph.pug !=favicon_tag(theme.favicon || config.favicon) -link(rel="canonical" href=urlNoIndex()) +link(rel="canonical" href=urlNoIndex(null,config.pretty_urls.trailing_index,config.pretty_urls.trailing_html)) //- 預解析 !=partial('includes/head/preconnect', {}, {cache: true}) diff --git a/layout/includes/head/Open_Graph.pug b/layout/includes/head/Open_Graph.pug index 1d04b47..8fe04e0 100644 --- a/layout/includes/head/Open_Graph.pug +++ b/layout/includes/head/Open_Graph.pug @@ -1,8 +1,9 @@ if theme.Open_Graph_meta.enable - + const coverVal = page.cover_type === 'img' ? page.cover : theme.avatar.img let ogOption = Object.assign({ type: is_post() ? 'article' : 'website', - image: (page.cover || theme.avatar.img) ? full_url_for(page.cover || theme.avatar.img) : '', + image: coverVal ? full_url_for(coverVal) : '', fb_admins: theme.facebook_comments.user_id || '', fb_app_id: theme.facebook_comments.app_id || '', }, theme.Open_Graph_meta.option) diff --git a/layout/includes/header/index.pug b/layout/includes/header/index.pug index d1aa7c0..df6f3da 100644 --- a/layout/includes/header/index.pug +++ b/layout/includes/header/index.pug @@ -1,6 +1,6 @@ if !theme.disable_top_img && page.top_img !== false if is_post() - - var top_img = page.top_img || page.cover || page.randomcover + - var top_img = page.top_img || page.cover || theme.default_top_img else if is_page() - var top_img = page.top_img || theme.default_top_img else if is_tag() @@ -17,7 +17,7 @@ if !theme.disable_top_img && page.top_img !== false - var top_img = page.top_img || theme.default_top_img if top_img !== false - - var imgSource = top_img && top_img.indexOf('/') !== -1 ? `background-image: url('${url_for(top_img)}')` : `background: ${top_img}` + - var imgSource = top_img && isImgOrUrl(top_img) ? `background-image: url('${url_for(top_img)}')` : `background: ${top_img}` - var bg_img = top_img ? imgSource : '' - var site_title = page.title || page.tag || page.category || config.title - var isHomeClass = is_home() ? 'full_page' : 'not-home-page' diff --git a/layout/includes/layout.pug b/layout/includes/layout.pug index eb1dfe1..dcd2c54 100644 --- a/layout/includes/layout.pug +++ b/layout/includes/layout.pug @@ -33,7 +33,7 @@ html(lang=config.language data-theme=theme.display_mode class=htmlClassHideAside 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}` + - var footer_bg = isImgOrUrl(theme.footer_bg) ? `background-image: url('${url_for(footerBg)}')` : `background: ${footerBg}` else - var footer_bg = '' diff --git a/layout/includes/mixins/article-sort.pug b/layout/includes/mixins/article-sort.pug index 01e9ef2..3eaf038 100644 --- a/layout/includes/mixins/article-sort.pug +++ b/layout/includes/mixins/article-sort.pug @@ -11,7 +11,10 @@ mixin articleSort(posts) .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(article.cover) alt=title onerror=`this.onerror=null;this.src='${url_for(theme.error_img.post_page)}'`) + if article.cover_type === 'img' + img(src=url_for(article.cover) alt=title onerror=`this.onerror=null;this.src='${url_for(theme.error_img.post_page)}'`) + else + div(style=`background: ${article.cover}`) .article-sort-item-info .article-sort-item-time i.far.fa-calendar-alt diff --git a/layout/includes/mixins/post-ui.pug b/layout/includes/mixins/post-ui.pug index 3dd364d..4ed053b 100644 --- a/layout/includes/mixins/post-ui.pug +++ b/layout/includes/mixins/post-ui.pug @@ -14,7 +14,10 @@ mixin postUI(posts) if post_cover && theme.cover.index_enable .post_cover(class=leftOrRight) a(href=url_for(link) title=title) - img.post_bg(src=url_for(post_cover) onerror=`this.onerror=null;this.src='`+ url_for(theme.error_img.post_page) + `'` alt=title) + if article.cover_type === 'img' + img.post-bg(src=url_for(post_cover) onerror=`this.onerror=null;this.src='${url_for(theme.error_img.post_page)}'` alt=title) + 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 diff --git a/layout/includes/pagination.pug b/layout/includes/pagination.pug index c50b81a..2af0e00 100644 --- a/layout/includes/pagination.pug +++ b/layout/includes/pagination.pug @@ -13,19 +13,23 @@ if is_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') + a(href=url_for(prev.path) title=prev.title) + if prev.cover_type === 'img' + img.cover(src=url_for(prev.cover) onerror=`onerror=null;src='${url_for(theme.error_img.post_page)}'` alt='cover of previous post') + else + .cover(style=`background: ${prev.cover || 'var(--default-bg-color)'}`) .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') + a(href=url_for(next.path) title=next.title) + if next.cover_type === 'img' + img.cover(src=url_for(next.cover) onerror=`onerror=null;src='${url_for(theme.error_img.post_page)}'` alt='cover of next post') + else + .cover(style=`background: ${next.cover || 'var(--default-bg-color)'}`) .pagination-info .label=_p('pagination.next') .next_info=next.title diff --git a/layout/includes/third-party/share/share-js.pug b/layout/includes/third-party/share/share-js.pug index 0a566fa..612332c 100644 --- a/layout/includes/third-party/share/share-js.pug +++ b/layout/includes/third-party/share/share-js.pug @@ -1,3 +1,4 @@ -.social-share(data-image=url_for(page.cover|| theme.avatar.img) data-sites= theme.sharejs.sites) +- const coverVal = page.cover_type === 'img' ? page.cover : theme.avatar.img +.social-share(data-image=url_for(coverVal) 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/layout/includes/widget/card_recent_post.pug b/layout/includes/widget/card_recent_post.pug index 60a0e07..dddf0fc 100644 --- a/layout/includes/widget/card_recent_post.pug +++ b/layout/includes/widget/card_recent_post.pug @@ -14,7 +14,10 @@ if theme.aside.card_recent_post.enable .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) + if article.cover_type === 'img' + img(src=url_for(post_cover) onerror=`this.onerror=null;this.src='${url_for(theme.error_img.post_page)}'` alt=title) + else + div(style=`background: ${post_cover}`) .content a.title(href=url_for(link) title=title)= title if theme.aside.card_recent_post.sort === 'updated' diff --git a/package.json b/package.json index 3dd25be..c2d5961 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hexo-theme-butterfly", - "version": "4.6.0-b1", + "version": "4.6.0-b2", "description": "A Simple and Card UI Design theme for Hexo", "main": "package.json", "scripts": { diff --git a/scripts/filters/random_cover.js b/scripts/filters/random_cover.js index 47ed4fe..dacf563 100644 --- a/scripts/filters/random_cover.js +++ b/scripts/filters/random_cover.js @@ -6,40 +6,40 @@ 'use strict' hexo.extend.filter.register('before_post_render', function (data) { - const { config } = this - if (config.post_asset_folder) { - const imgTestReg = /\.(png|jpe?g|gif|svg|webp)(\?.*)?$/ + const imgTestReg = /\.(png|jpe?g|gif|svg|webp)(\?.*)?$/ + let randomCover + let coverVal = data.cover + + // Add path to top_img and cover if post_asset_folder is enabled + if (hexo.config.post_asset_folder) { const topImg = data.top_img - const cover = data.cover if (topImg && topImg.indexOf('/') === -1 && imgTestReg.test(topImg)) data.top_img = data.path + topImg - if (cover && cover.indexOf('/') === -1) data.cover = data.path + cover + if (coverVal && coverVal.indexOf('/') === -1 && imgTestReg.test(coverVal)) data.cover = data.path + coverVal } - if (data.cover === false) { - data.randomcover = randomCover() - return data + 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] + } + + if (coverVal === false) return data + + // If cover is not set, use random cover + if (!coverVal) { + randomCover = randomCoverFn() + data.cover = randomCover + coverVal = randomCover // update coverVal } - data.cover = data.cover || randomCover() - return data -}) - -function randomCover () { - const theme = hexo.theme.config - let cover - let num - - if (theme.cover && theme.cover.default_cover) { - if (!Array.isArray(theme.cover.default_cover)) { - cover = theme.cover.default_cover - return cover - } else { - num = Math.floor(Math.random() * theme.cover.default_cover.length) - cover = theme.cover.default_cover[num] - return cover + if (coverVal) { + if (coverVal.indexOf('//') !== -1 || imgTestReg.test(coverVal)) { + data.cover_type = 'img' + return data } - } else { - cover = theme.default_top_img || 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7' - return cover } -} + + return data +}) \ No newline at end of file diff --git a/scripts/helpers/page.js b/scripts/helpers/page.js index aa2b74b..8e3f892 100644 --- a/scripts/helpers/page.js +++ b/scripts/helpers/page.js @@ -54,8 +54,8 @@ hexo.extend.helper.register('cloudTags', function (options = {}) { return result }) -hexo.extend.helper.register('urlNoIndex', function (url = null) { - return prettyUrls(url || this.url, { trailing_index: false, trailing_html: false }) +hexo.extend.helper.register('urlNoIndex', function (url = null, trailingIndex = false, trailingHtml = false) { + return prettyUrls(url || this.url, { trailing_index: trailingIndex, trailing_html: trailingHtml }) }) hexo.extend.helper.register('md5', function (path) { @@ -95,3 +95,11 @@ hexo.extend.helper.register('findArchivesTitle', function (page, menu, date) { return loop(menu) || defaultTitle }) + +hexo.extend.helper.register('isImgOrUrl', function (path) { + const imgTestReg = /\.(png|jpe?g|gif|svg|webp)(\?.*)?$/ + if (path.indexOf('//') !== -1 || imgTestReg.test(path)) { + return true + } + return false +}) \ No newline at end of file diff --git a/scripts/helpers/related_post.js b/scripts/helpers/related_post.js index 6809ac7..9a46f68 100644 --- a/scripts/helpers/related_post.js +++ b/scripts/helpers/related_post.js @@ -15,7 +15,7 @@ hexo.extend.helper.register('related_posts', function (currentPost, allPosts) { title: post.title, path: post.path, cover: post.cover, - randomcover: post.randomcover, + cover_type: post.cover_type, weight: 1, updated: post.updated, created: post.date @@ -50,13 +50,14 @@ hexo.extend.helper.register('related_posts', function (currentPost, allPosts) { result += '