From be406906136e570e15f7476daef587f6896fcac8 Mon Sep 17 00:00:00 2001 From: KRLHY <65041981+KRLHY@users.noreply.github.com> Date: Sun, 11 Jun 2023 21:21:15 +0800 Subject: [PATCH 1/7] =?UTF-8?q?=E5=85=81=E8=AE=B8=E4=B8=8D=E6=98=BE?= =?UTF-8?q?=E7=A4=BAfooter=E4=B8=AD=E7=9A=84since=E5=B9=B4=E4=BB=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit since设置为false即不显示since年份,否则正常显示 --- layout/includes/footer.pug | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/layout/includes/footer.pug b/layout/includes/footer.pug index 4d2ae79..0e4f513 100644 --- a/layout/includes/footer.pug +++ b/layout/includes/footer.pug @@ -2,10 +2,11 @@ if theme.footer.owner.enable - var now = new Date() - var nowYear = now.getFullYear() - if theme.footer.owner.since && theme.footer.owner.since != nowYear - .copyright!= `©${theme.footer.owner.since} - ${nowYear} By ${config.author}` - else - .copyright!= `©${nowYear} By ${config.author}` + if theme.footer.owner.since != false + if theme.footer.owner.since != nowYear + .copyright!= `©${theme.footer.owner.since} - ${nowYear} By ${config.author}` + else + .copyright!= `©${nowYear} By ${config.author}` if theme.footer.copyright .framework-info span= _p('footer.framework') + ' ' From c67b4304d2535dba5cedd1d345894e13db882dc8 Mon Sep 17 00:00:00 2001 From: Jerry Date: Sat, 24 Jun 2023 16:12:23 +0800 Subject: [PATCH 2/7] =?UTF-8?q?breaking=20changes:=20=E6=9B=B4=E6=94=B9=20?= =?UTF-8?q?rightside-bottom=20=E7=82=BA=20rightside=5Fbottom=20feat:=20?= =?UTF-8?q?=E7=BD=AE=E9=A0=82=E5=9C=96=E6=A8=99=E6=94=B9=E7=82=BA=E5=9C=A8?= =?UTF-8?q?=E6=A8=99=E9=A1=8C=E5=B7=A6=E5=81=B4=20feat:=20=E5=8F=AF?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E6=89=93=E8=B3=9E=E6=8C=89=E9=88=95=E7=9A=84?= =?UTF-8?q?=E6=96=87=E5=AD=97=20feat:=20=E5=81=B4=E9=82=8A=E6=AC=84?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20=E7=B3=BB=E5=88=97=E6=96=87=E7=AB=A0?= =?UTF-8?q?=E9=A1=AF=E7=A4=BA=20feat:=20=E5=A2=9E=E5=8A=A0=20series=20?= =?UTF-8?q?=E7=B3=BB=E5=88=97=E6=96=87=E7=AB=A0=20=E6=A8=99=E7=B1=A4?= =?UTF-8?q?=E5=A4=96=E6=8E=9B=20feat:=20=E7=A7=BB=E9=99=A4=20addthis=20?= =?UTF-8?q?=E5=88=86=E4=BA=AB=20improvement:=20=E4=BB=A3=E7=A2=BC=E5=84=AA?= =?UTF-8?q?=E5=8C=96=20improvement:=20tabs=20=E6=A8=99=E7=B1=A4=E5=A4=96?= =?UTF-8?q?=E6=8E=9B=E7=9A=84=E5=9B=9E=E5=88=B0=E9=A0=82=E9=83=A8=E7=AE=AD?= =?UTF-8?q?=E9=A0=AD=E4=BD=8D=E7=BD=AE=E8=AA=BF=E6=95=B4=20improvement:=20?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=20plugin.yml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- README_CN.md | 2 +- _config.yml | 19 +++-- languages/default.yml | 2 +- languages/en.yml | 2 +- languages/zh-CN.yml | 2 +- languages/zh-TW.yml | 2 +- layout/includes/mixins/post-ui.pug | 10 ++- layout/includes/post/reward.pug | 2 +- .../includes/third-party/share/add-this.pug | 2 - layout/includes/third-party/share/index.pug | 4 +- layout/includes/widget/card_post_series.pug | 21 ++++++ layout/includes/widget/index.pug | 2 + plugins.yml | 14 ++-- scripts/helpers/series.js | 22 ++++++ scripts/tag/button.js | 12 +--- scripts/tag/gallery.js | 15 ++-- scripts/tag/hide.js | 53 +++++++------- scripts/tag/inlineImg.js | 14 ++-- scripts/tag/label.js | 6 +- scripts/tag/mermaid.js | 2 +- scripts/tag/note.js | 6 +- scripts/tag/score.js | 26 +++---- scripts/tag/series.js | 69 +++++++++++++++++++ scripts/tag/tabs.js | 7 +- scripts/tag/timeline.js | 8 +-- source/css/_layout/reward.styl | 3 + source/css/_page/homepage.styl | 8 ++- source/css/_tags/tabs.styl | 4 +- source/css/var.styl | 2 +- 30 files changed, 222 insertions(+), 121 deletions(-) delete mode 100644 layout/includes/third-party/share/add-this.pug create mode 100644 layout/includes/widget/card_post_series.pug create mode 100644 scripts/helpers/series.js create mode 100644 scripts/tag/series.js diff --git a/README.md b/README.md index e0189ba..2dfcfab 100644 --- a/README.md +++ b/README.md @@ -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..2b3c3b6 100644 --- a/README_CN.md +++ b/README_CN.md @@ -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..3c4f5c5 100644 --- a/_config.yml +++ b/_config.yml @@ -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: @@ -651,7 +649,7 @@ mask: footer: true # the position of bottom right button/default unit: px (右下角按鈕距離底部的距離/默認單位為px) -rightside-bottom: +rightside_bottom: # Enter transitions (開啓網頁進入效果) enter_transitions: true @@ -796,6 +794,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: diff --git a/languages/default.yml b/languages/default.yml index fea921e..0f80672 100644 --- a/languages/default.yml +++ b/languages/default.yml @@ -15,7 +15,6 @@ page: card_post_count: comments -sticky: Sticky no_title: No title post: @@ -83,6 +82,7 @@ aside: link: link code: code card_toc: Catalog + card_post_series: Series date_suffix: just: Just diff --git a/languages/en.yml b/languages/en.yml index 1cc937c..3c14a5d 100644 --- a/languages/en.yml +++ b/languages/en.yml @@ -15,7 +15,6 @@ page: card_post_count: comments -sticky: Sticky no_title: No title post: @@ -83,6 +82,7 @@ aside: link: link code: code card_toc: Catalog + card_post_series: Series date_suffix: just: Just diff --git a/languages/zh-CN.yml b/languages/zh-CN.yml index 94f85cd..3cd8964 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: 刚刚 diff --git a/languages/zh-TW.yml b/languages/zh-TW.yml index 9801d16..b2f8f68 100644 --- a/languages/zh-TW.yml +++ b/languages/zh-TW.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: 剛剛 diff --git a/layout/includes/mixins/post-ui.pug b/layout/includes/mixins/post-ui.pug index 970b5fc..200e900 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') 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/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/plugins.yml b/plugins.yml index ef96ad0..e006d32 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.18.0 instantsearch: name: instantsearch.js file: dist/instantsearch.production.min.js - version: 4.56.1 + version: 4.56.3 pjax: name: pjax file: pjax.min.js @@ -64,16 +64,16 @@ katex: name: katex file: dist/katex.min.css other_name: KaTeX - version: 0.16.7 + version: 0.16.8 katex_copytex: name: katex file: dist/contrib/copy-tex.min.js other_name: KaTeX - version: 0.16.7 + version: 0.16.8 mermaid: name: mermaid file: dist/mermaid.min.js - version: 10.2.2 + version: 10.2.3 canvas_ribbon: name: butterfly-extsrc file: dist/canvas-ribbon.min.js @@ -202,12 +202,12 @@ docsearch_js: name: '@docsearch/js' other_name: docsearch-js file: dist/umd/index.js - version: 3.4.0 + version: 3.5.1 docsearch_css: name: '@docsearch/css' other_name: docsearch-css file: dist/style.css - version: 3.4.0 + version: 3.5.1 abcjs_basic_js: name: abcjs file: dist/abcjs-basic-min.js diff --git a/scripts/helpers/series.js b/scripts/helpers/series.js new file mode 100644 index 0000000..e1c9338 --- /dev/null +++ b/scripts/helpers/series.js @@ -0,0 +1,22 @@ +'use strict' + +hexo.extend.helper.register('groupPosts', function () { + const getGroupArray = array => { + const groups = {} + array.forEach(item => { + const Key = item.series + if (!Key) return + groups[Key] = groups[Key] || [] + groups[Key].push(item) + }) + return groups + } + + const sortPosts = posts => { + const { orderBy = 'date', order = 1 } = this.theme.aside.card_post_series + if (orderBy === 'title') return posts.sort('title', order) + return posts.sort('date', order) + } + + return getGroupArray(sortPosts(this.site.posts)) +}) diff --git a/scripts/tag/button.js b/scripts/tag/button.js index 33a0e53..624cdd3 100644 --- a/scripts/tag/button.js +++ b/scripts/tag/button.js @@ -9,17 +9,9 @@ const urlFor = require('hexo-util').url_for.bind(hexo) -function btn (args) { +const btn = args => { args = args.join(' ').split(',') - let url = args[0] || '' - let text = args[1] || '' - let icon = args[2] || '' - let option = args[3] || '' - - url = url.trim() - text = text.trim() - icon = icon.trim() - option = option.trim() + const [url = '', text = '', icon = '', option = ''] = args.map(arg => arg.trim()) return `${icon.length ? `` : ''}${text.length ? `${text}` : ''}` diff --git a/scripts/tag/gallery.js b/scripts/tag/gallery.js index 632c514..14cdee3 100644 --- a/scripts/tag/gallery.js +++ b/scripts/tag/gallery.js @@ -10,7 +10,7 @@ const urlFor = require('hexo-util').url_for.bind(hexo) -function gallery (args, content) { +const gallery = (args, content) => { const { data, languages } = hexo.theme.i18n args = args.join(' ').split(',') let rowHeight, limit, lazyload, type, dataStr @@ -47,19 +47,18 @@ function gallery (args, content) { ` } -function galleryGroup (args) { - const name = args[0] - const descr = args[1] - const url = urlFor(args[2]) - const img = urlFor(args[3]) +const galleryGroup = args => { + const [name, descr, url, img] = args + const imgUrl = urlFor(img) + const urlLink = urlFor(url) return ` ` diff --git a/scripts/tag/hide.js b/scripts/tag/hide.js index ccf9365..a788172 100644 --- a/scripts/tag/hide.js +++ b/scripts/tag/hide.js @@ -16,51 +16,46 @@ 'use strict' -function hideInline (args) { - args = args.join(' ').split(',') - const content = args[0] - const display = args[1] || 'Click' - const bg = args[2] || false - const color = args[3] || false - let group = 'style="' +const parseArgs = args => { + return args.join(' ').split(',') +} - if (bg) group += `background-color: ${bg};` - if (color) group += `color: ${color}` - group += '"' +const generateStyle = (bg, color) => { + let style = 'style="' + if (bg) { + style += `background-color: ${bg};` + } + if (color) { + style += `color: ${color}` + } + style += '"' + return style +} + +const hideInline = args => { + const [content, display = 'Click', bg = false, color = false] = parseArgs(args) + const group = generateStyle(bg, color) return `${content}` } -function hideBlock (args, content) { - args = args.join(' ').split(',') - const display = args[0] || 'Click' - const bg = args[1] || false - const color = args[2] || false - let group = 'style="' - - if (bg) group += `background-color: ${bg};` - if (color) group += `color: ${color}` - group += '"' +const hideBlock = (args, content) => { + const [display = 'Click', bg = false, color = false] = parseArgs(args) + const group = generateStyle(bg, color) return `
${hexo.render.renderSync({ text: content, engine: 'markdown' })}
` } -function hideToggle (args, content) { - args = args.join(' ').split(',') - const display = args[0] - const bg = args[1] || false - const color = args[2] || false - let group = 'style="' +const hideToggle = (args, content) => { + const [display, bg = false, color = false] = parseArgs(args) + const group = generateStyle(bg, color) let border = '' if (bg) { border = `style="border: 1px solid ${bg}"` - group += `background-color: ${bg};` } - if (color) group += `color: ${color}` - group += '"' return `
${display}
${hexo.render.renderSync({ text: content, engine: 'markdown' })}
` } diff --git a/scripts/tag/inlineImg.js b/scripts/tag/inlineImg.js index 9bcbfdb..753add0 100644 --- a/scripts/tag/inlineImg.js +++ b/scripts/tag/inlineImg.js @@ -1,17 +1,19 @@ /** * inlineImg 圖片 - * {% inlineImg src height %} + * @param {Array} args 圖片名稱和高度 + * @param {string} args[0] 圖片名稱 + * @param {number} args[1] 圖片高度 + * @returns {string} 圖片標籤 */ 'use strict' const urlFor = require('hexo-util').url_for.bind(hexo) -function inlineImg (args) { - const img = args[0] - const height = args[1] ? `style="height:${args[1]}"` : '' - - return `` +const inlineImg = ([img, height = '']) => { + const heightStyle = height ? `style="height:${height}"` : '' + const src = urlFor(img) + return `` } hexo.extend.tag.register('inlineImg', inlineImg, { ends: false }) diff --git a/scripts/tag/label.js b/scripts/tag/label.js index 877c909..4c9e692 100644 --- a/scripts/tag/label.js +++ b/scripts/tag/label.js @@ -6,10 +6,8 @@ 'use strict' -function addLabel (args, content) { - const text = args[0] - const className = args[1] || 'default' - +const addLabel = args => { + const [text, className = 'default'] = args return `${text} ` } diff --git a/scripts/tag/mermaid.js b/scripts/tag/mermaid.js index 237b7ee..ba25c0f 100644 --- a/scripts/tag/mermaid.js +++ b/scripts/tag/mermaid.js @@ -8,7 +8,7 @@ const { escapeHTML } = require('hexo-util') -function mermaid (args, content) { +const mermaid = (args, content) => { return `
` diff --git a/scripts/tag/note.js b/scripts/tag/note.js index aa19129..125bc61 100644 --- a/scripts/tag/note.js +++ b/scripts/tag/note.js @@ -6,10 +6,10 @@ 'use strict' -function postNote (args, content) { +const postNote = (args, content) => { const styleConfig = hexo.theme.config.note.style - const lastArgs = args[args.length - 1] - if (!(lastArgs === 'flat' || lastArgs === 'modern' || lastArgs === 'simple' || lastArgs === 'disabled')) { + const noteTag = ['flat', 'modern', 'simple', 'disabled'] + if (!noteTag.includes(args[args.length - 1])) { args.push(styleConfig) } diff --git a/scripts/tag/score.js b/scripts/tag/score.js index 3157245..441247b 100644 --- a/scripts/tag/score.js +++ b/scripts/tag/score.js @@ -3,20 +3,20 @@ * {% score %} */ -'use strict'; +'use strict' -function score(args, content) { - function escapeHtmlTags(s) { - let lookup = { - '&': "&", - '"': """, - '\'': "'", - '<': "<", - '>': ">" - }; - return s.replace(/[&"'<>]/g, c => lookup[c]); +const score = (args, content) => { + const escapeHtmlTags = s => { + const lookup = { + '&': '&', + '"': '"', + '\'': ''', + '<': '<', + '>': '>' } - return `
${escapeHtmlTags(content)}
`; + return s.replace(/[&"'<>]/g, c => lookup[c]) + } + return `
${escapeHtmlTags(content)}
` } -hexo.extend.tag.register('score', score, {ends: true}); +hexo.extend.tag.register('score', score, { ends: true }) diff --git a/scripts/tag/series.js b/scripts/tag/series.js new file mode 100644 index 0000000..4a901df --- /dev/null +++ b/scripts/tag/series.js @@ -0,0 +1,69 @@ +/** + * series plugin + * Syntax: + * {% series [series name] %} + * Usage: + * {% series %} + * {% series series1 %} + */ + +'use strict' + +const urlFor = require('hexo-util').url_for.bind(hexo) +const groups = {} + +hexo.extend.filter.register('before_post_render', data => { + if (!hexo.theme.config.series.enable) return data + const { layout, series } = data + if (layout === 'post' && series) { + groups[series] = groups[series] || [] + groups[series].push({ + title: data.title, + path: data.path, + date: data.date.unix() + }) + } + return data +}) + +function series (args) { + const { series } = hexo.theme.config + if (!series.enable) { + hexo.log.warn('Series plugin is disabled in the theme config') + return '' + } + + const seriesArr = args.length ? groups[args[0]] : groups[this.series] + + if (!seriesArr) { + hexo.log.warn(`There is no series named "${args[0]}"`) + return '' + } + + const isAsc = (series.order || 1) === 1 // 1: asc, -1: desc + const isSortByTitle = series.orderBy === 'title' + + const compareFn = (a, b) => { + const itemA = isSortByTitle ? a.title.toUpperCase() : a.date + const itemB = isSortByTitle ? b.title.toUpperCase() : b.date + + if (itemA < itemB) { + return isAsc ? -1 : 1 + } + if (itemA > itemB) { + return isAsc ? 1 : -1 + } + return 0 + } + + seriesArr.sort(compareFn) + + let result = '' + seriesArr.forEach(ele => { + result += `
  • ${ele.title}
  • ` + }) + + return series.number ? `
      ${result}
    ` : `` +} + +hexo.extend.tag.register('series', series, { ends: false }) diff --git a/scripts/tag/tabs.js b/scripts/tag/tabs.js index 050aeee..6dc8bfa 100644 --- a/scripts/tag/tabs.js +++ b/scripts/tag/tabs.js @@ -6,13 +6,11 @@ 'use strict' -function postTabs (args, content) { +const postTabs = (args, content) => { const tabBlock = /\n([\w\W\s\S]*?)/g - args = args.join(' ').split(',') const tabName = args[0] const tabActive = Number(args[1]) || 0 - const matches = [] let match let tabId = 0 @@ -22,8 +20,7 @@ function postTabs (args, content) { !tabName && hexo.log.warn('Tabs block must have unique name!') while ((match = tabBlock.exec(content)) !== null) { - matches.push(match[1]) - matches.push(match[2]) + matches.push(match[1], match[2]) } for (let i = 0; i < matches.length; i += 2) { diff --git a/scripts/tag/timeline.js b/scripts/tag/timeline.js index 6c87a6b..6dde854 100644 --- a/scripts/tag/timeline.js +++ b/scripts/tag/timeline.js @@ -5,15 +5,15 @@ 'use strict' -function timeLineFn (args, content) { +const timeLineFn = (args, content) => { const tlBlock = /\n([\w\W\s\S]*?)/g let result = '' let color = '' + let text = '' if (args.length) { - args = args.join(' ').split(',') - color = args[1] - const mdContent = hexo.render.renderSync({ text: args[0], engine: 'markdown' }) + [text, color] = args.join(' ').split(',') + const mdContent = hexo.render.renderSync({ text, engine: 'markdown' }) result += `
    ${mdContent}
    ` } diff --git a/source/css/_layout/reward.styl b/source/css/_layout/reward.styl index e570967..4043aa2 100644 --- a/source/css/_layout/reward.styl +++ b/source/css/_layout/reward.styl @@ -15,6 +15,9 @@ color: var(--btn-color) cursor: pointer + i + margin-right: 5px + &:hover .reward-button background: var(--btn-hover-color) diff --git a/source/css/_page/homepage.styl b/source/css/_page/homepage.styl index 9269f97..e81311a 100644 --- a/source/css/_page/homepage.styl +++ b/source/css/_page/homepage.styl @@ -62,6 +62,11 @@ transition: all .2s ease-in-out -webkit-line-clamp: 2 + .sticky + margin-right: 10px + color: $sticky-color + transform: rotate(45deg) + +maxWidth768() font-size: 1.43em @@ -76,9 +81,6 @@ & > .post-meta-date cursor: default - .sticky - color: $sticky-color - i margin: 0 4px 0 0 diff --git a/source/css/_tags/tabs.styl b/source/css/_tags/tabs.styl index 90ede9c..a4a30be 100644 --- a/source/css/_tags/tabs.styl +++ b/source/css/_tags/tabs.styl @@ -61,9 +61,9 @@ animation: tabshow .5s .tab-to-top - position: relative + position: absolute + right: 15px display: block - margin: 0 0 0 auto color: $tab-to-top-color @keyframes tabshow diff --git a/source/css/var.styl b/source/css/var.styl index 04d4326..4c27eeb 100644 --- a/source/css/var.styl +++ b/source/css/var.styl @@ -101,7 +101,7 @@ $tag-hide-toggle-bg = #f0f0f0 $preloader-bg = #37474f $preloader-word-color = #fff // rightside -$rightside-bottom = hexo-config('rightside-bottom') ? convert(hexo-config('rightside-bottom')) : 40px +$rightside-bottom = hexo-config('rightside_bottom') ? convert(hexo-config('rightside_bottom')) : 40px // fireworks $fireworks-zIndex = hexo-config('fireworks.zIndex') ? hexo-config('fireworks.zIndex') : 99999 // Tag Plugins - Note From 7dded29438b6e049818fa3976463d62a468f38a4 Mon Sep 17 00:00:00 2001 From: Jerry Wong Date: Fri, 30 Jun 2023 10:51:57 +0800 Subject: [PATCH 3/7] =?UTF-8?q?Revert=20"=E5=85=81=E8=AE=B8=E4=B8=8D?= =?UTF-8?q?=E6=98=BE=E7=A4=BAfooter=E4=B8=AD=E7=9A=84since=E5=B9=B4?= =?UTF-8?q?=E4=BB=BD"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- layout/includes/footer.pug | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/layout/includes/footer.pug b/layout/includes/footer.pug index 0e4f513..4d2ae79 100644 --- a/layout/includes/footer.pug +++ b/layout/includes/footer.pug @@ -2,11 +2,10 @@ if theme.footer.owner.enable - var now = new Date() - var nowYear = now.getFullYear() - if theme.footer.owner.since != false - if theme.footer.owner.since != nowYear - .copyright!= `©${theme.footer.owner.since} - ${nowYear} By ${config.author}` - else - .copyright!= `©${nowYear} By ${config.author}` + if theme.footer.owner.since && theme.footer.owner.since != nowYear + .copyright!= `©${theme.footer.owner.since} - ${nowYear} By ${config.author}` + else + .copyright!= `©${nowYear} By ${config.author}` if theme.footer.copyright .framework-info span= _p('footer.framework') + ' ' From 775942ae3e0f592d2c279de0c54cdb2981ccb15d Mon Sep 17 00:00:00 2001 From: Jerry Date: Sun, 6 Aug 2023 18:43:39 +0800 Subject: [PATCH 4/7] =?UTF-8?q?breaking=20change:=20=E9=87=8D=E6=A7=8B=20g?= =?UTF-8?q?allery=20=E6=A8=99=E7=B1=A4=E5=A4=96=E6=8E=9B=20improvement:=20?= =?UTF-8?q?=E9=A6=96=E9=A0=81=E7=A4=BE=E4=BA=A4=E5=9C=96=E6=A8=99=E5=B7=A6?= =?UTF-8?q?=E5=8F=B3=E9=82=8A=E8=B7=9D=E8=AA=BF=E6=95=B4=20feat:=20?= =?UTF-8?q?=E6=96=87=E7=AB=A0=E7=89=88=E6=AC=8A=E5=A2=9E=E5=8A=A0=E5=9C=96?= =?UTF-8?q?=E6=A8=99=20improvement:=20=E9=87=8D=E6=A7=8B=20main.js=20?= =?UTF-8?q?=E4=BB=A3=E7=A2=BC=20improvement:=20=E5=84=AA=E5=8C=96=20pjax?= =?UTF-8?q?=20=E4=B8=8B=E7=9A=84=E6=80=A7=E8=83=BD=20fix:=20=E4=BF=AE?= =?UTF-8?q?=E5=BE=A9=E5=AD=90=E7=9B=AE=E9=8C=84=E4=B8=8B,pjax=20=E8=B7=B3?= =?UTF-8?q?=E8=BD=89=20404=20=E9=8C=AF=E8=AA=A4=20feat:=20getScript=20?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20attribute=20=E9=85=8D=E7=BD=AE=20improveme?= =?UTF-8?q?nt:=20=E5=84=AA=E5=8C=96=E6=89=8B=E6=A9=9F=E7=AB=AF=20toc=20?= =?UTF-8?q?=E6=89=93=E9=96=8B=E5=92=8C=E9=97=9C=E9=96=89=E7=89=B9=E6=95=88?= =?UTF-8?q?=20improvement:=20=E6=96=87=E7=AB=A0=E9=80=B2=E5=85=A5=E7=89=B9?= =?UTF-8?q?=E6=95=88=E6=94=B9=E7=82=BA=20transform,=20=E5=84=AA=E5=8C=96?= =?UTF-8?q?=20stylus=20improvement:=20=E7=9B=AE=E9=8C=84=E5=81=B4=E9=82=8A?= =?UTF-8?q?=E6=AC=84=E5=87=BA=E7=8F=BE=E6=BB=BE=E5=8B=95=E6=A2=9D=E6=99=82?= =?UTF-8?q?=EF=BC=8C=E5=85=83=E7=B4=A0=E4=B8=8D=E6=9C=83=E8=A2=AB=E6=93=A0?= =?UTF-8?q?=E5=A3=93=20feat:=20=E6=96=87=E7=AB=A0=E5=B7=A6=E5=8F=B3?= =?UTF-8?q?=E5=B0=8D=E9=BD=8A=20improvement:=20=E8=99=95=E7=90=86=20waline?= =?UTF-8?q?=20=E7=9A=84=20url=20=E5=BE=8C=E9=9D=A2=E5=A4=9A=20/=20?= =?UTF-8?q?=E5=B0=8E=E8=87=B4=E8=B7=A8=E5=9F=9F=E7=9A=84=E5=95=8F=E9=A1=8C?= =?UTF-8?q?=20fix:=20=E4=BF=AE=E5=BE=A9=E5=A4=9C=E9=96=93=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F=E4=B8=8B=EF=BC=8C=E5=B0=8F=E5=B1=8F=E5=B9=95=E7=9A=84?= =?UTF-8?q?toc=20=E6=BB=BE=E5=8B=95=E6=A2=9D=E9=A1=8F=E8=89=B2=E4=B8=8D?= =?UTF-8?q?=E6=98=8E=E9=A1=AF=E7=9A=84=20bug=20fix:=20=E4=BF=AE=E5=BE=A9?= =?UTF-8?q?=E8=A8=AD=E7=BD=AE=E5=AD=97=E9=AB=94=E8=B6=85=E9=81=8E17px?= =?UTF-8?q?=E6=99=82=EF=BC=8Ctoc=20=E8=A3=8F=E9=9D=A2=E7=9A=84=E9=82=8A?= =?UTF-8?q?=E6=A1=86=E7=95=B0=E5=B8=B8=E7=9A=84=20bug=20improvement:=20?= =?UTF-8?q?=E5=84=AA=E5=8C=96=E8=AA=9E=E8=A8=80=E6=96=87=E4=BB=B6=E9=83=A8?= =?UTF-8?q?=E5=88=86=E7=94=A8=E8=A9=9E=20improvement:=20disqus=20=E5=92=8C?= =?UTF-8?q?=20disqusjs=20=E7=9A=84=E8=A9=95=E8=AB=96=E6=95=B8=E7=8D=B2?= =?UTF-8?q?=E5=8F=96=E4=B8=8D=E5=88=B0=E6=99=82=EF=BC=8C=E9=A1=AF=E7=A4=BA?= =?UTF-8?q?=E7=82=BA=200=20improvement:=20disqusjs=20=E7=9A=84=E8=A9=95?= =?UTF-8?q?=E8=AB=96=E6=95=B8=E6=94=B9=E7=82=BA=20api=20=E7=8D=B2=E5=8F=96?= =?UTF-8?q?=20improvement:=20=E4=BB=A3=E7=A2=BC=E5=84=AA=E5=8C=96=20improv?= =?UTF-8?q?ement:=20=E6=9B=B4=E6=96=B0=20plugins.yml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _config.yml | 3 +- languages/default.yml | 50 +- languages/en.yml | 54 +- languages/zh-CN.yml | 6 +- languages/zh-TW.yml | 14 +- layout/archive.pug | 3 +- layout/includes/footer.pug | 4 +- layout/includes/head.pug | 2 +- layout/includes/head/config.pug | 8 +- layout/includes/head/noscript.pug | 4 - layout/includes/header/post-info.pug | 10 +- layout/includes/mixins/post-ui.pug | 8 +- layout/includes/post/post-copyright.pug | 12 +- layout/includes/rightside.pug | 6 +- layout/includes/third-party/abcjs/abcjs.pug | 12 +- .../third-party/card-post-count/disqus.pug | 27 +- .../third-party/card-post-count/waline.pug | 3 +- .../includes/third-party/comments/artalk.pug | 48 +- .../includes/third-party/comments/disqus.pug | 66 +- .../third-party/comments/disqusjs.pug | 71 +- .../comments/facebook_comments.pug | 70 +- .../includes/third-party/comments/giscus.pug | 89 +-- .../includes/third-party/comments/gitalk.pug | 57 +- .../includes/third-party/comments/index.pug | 6 +- .../includes/third-party/comments/livere.pug | 47 +- .../third-party/comments/remark42.pug | 2 +- .../includes/third-party/comments/twikoo.pug | 37 +- .../third-party/comments/utterances.pug | 67 +- .../includes/third-party/comments/valine.pug | 45 +- .../includes/third-party/comments/waline.pug | 31 +- layout/includes/third-party/math/mermaid.pug | 2 +- .../third-party/newest-comments/waline.pug | 4 +- layout/includes/third-party/pjax.pug | 12 +- .../includes/third-party/search/docsearch.pug | 7 +- package.json | 2 +- plugins.yml | 23 +- scripts/events/stylus.js | 19 +- scripts/filters/post_lazyload.js | 18 +- scripts/filters/random_cover.js | 29 +- scripts/helpers/aside_categories.js | 4 +- scripts/helpers/findArchiveLength.js | 52 +- scripts/helpers/inject_head_js.js | 177 ++--- scripts/helpers/page.js | 18 +- scripts/tag/gallery.js | 29 +- scripts/tag/tabs.js | 19 +- source/css/_global/function.styl | 12 +- source/css/_highlight/highlight.styl | 23 +- source/css/_layout/aside.styl | 32 +- source/css/_layout/comments.styl | 32 +- source/css/_layout/head.styl | 5 +- source/css/_layout/post.styl | 4 + source/css/_layout/rightside.styl | 4 + source/css/_layout/sidebar.styl | 8 +- source/css/_mode/darkmode.styl | 14 +- source/css/_mode/readmode.styl | 13 +- source/css/_tags/gallery.styl | 114 ++- source/css/_tags/tabs.styl | 62 +- source/css/var.styl | 1 + source/js/main.js | 653 ++++++++++-------- source/js/search/algolia.js | 2 +- source/js/search/local-search.js | 2 +- source/js/tw_cn.js | 9 +- source/js/utils.js | 113 ++- 63 files changed, 1267 insertions(+), 1113 deletions(-) diff --git a/_config.yml b/_config.yml index 3c4f5c5..8081204 100644 --- a/_config.yml +++ b/_config.yml @@ -977,8 +977,7 @@ CDN: # click_heart: # ClickShowText: # fontawesome: - # flickr_justified_gallery_js: - # flickr_justified_gallery_css: + # egjs_infinitegrid: # aplayer_css: # aplayer_js: # meting_js: diff --git a/languages/default.yml b/languages/default.yml index 0f80672..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,15 +15,15 @@ page: card_post_count: comments -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 @@ -47,8 +47,8 @@ search: hits_stats: '${hits} results found' pagination: - prev: Previous Post - next: Next Post + prev: Previous + next: Next comment: Comment @@ -65,33 +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 3c14a5d..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,15 +15,15 @@ page: card_post_count: comments -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 @@ -47,8 +47,8 @@ search: hits_stats: '${hits} results found' pagination: - prev: Previous Post - next: Next Post + prev: Previous + next: Next comment: Comment @@ -65,44 +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 3cd8964..b030079 100644 --- a/languages/zh-CN.yml +++ b/languages/zh-CN.yml @@ -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 b2f8f68..4ac63b8 100644 --- a/languages/zh-TW.yml +++ b/languages/zh-TW.yml @@ -15,7 +15,7 @@ page: card_post_count: 條評論 -no_title: 無題 +no_title: 無標題 post: created: 發表於 @@ -83,7 +83,7 @@ aside: link: 連結 code: 程式碼 card_toc: 目錄 - card_post_series: 系列文章 + 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/footer.pug b/layout/includes/footer.pug index 0e4f513..d625720 100644 --- a/layout/includes/footer.pug +++ b/layout/includes/footer.pug @@ -4,9 +4,9 @@ - var nowYear = now.getFullYear() if theme.footer.owner.since != false if theme.footer.owner.since != nowYear - .copyright!= `©${theme.footer.owner.since} - ${nowYear} By ${config.author}` + .copyright!= `©${theme.footer.owner.since} - ${nowYear} By ${config.author}` else - .copyright!= `©${nowYear} By ${config.author}` + .copyright!= `©${nowYear} By ${config.author}` if theme.footer.copyright .framework-info span= _p('footer.framework') + ' ' diff --git a/layout/includes/head.pug b/layout/includes/head.pug index 4d30c4a..ff1da04 100644 --- a/layout/includes/head.pug +++ b/layout/includes/head.pug @@ -55,7 +55,7 @@ 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 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 index cc3befa..c0c0c48 100644 --- a/layout/includes/head/noscript.pug +++ b/layout/includes/head/noscript.pug @@ -3,10 +3,6 @@ noscript. #nav { opacity: 1 } - .justified-gallery img { - opacity: 1 - } - #recent-posts time, #post-meta time { display: inline !important 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 200e900..5621b6d 100644 --- a/layout/includes/mixins/post-ui.pug +++ b/layout/includes/mixins/post-ui.pug @@ -71,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/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/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/package.json b/package.json index 6e97de2..2f973e3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hexo-theme-butterfly", - "version": "4.9.0", + "version": "4.10.0-b1", "description": "A Simple and Card UI Design theme for Hexo", "main": "package.json", "scripts": { diff --git a/plugins.yml b/plugins.yml index e006d32..ce67425 100644 --- a/plugins.yml +++ b/plugins.yml @@ -5,7 +5,7 @@ algolia_search: instantsearch: name: instantsearch.js file: dist/instantsearch.production.min.js - version: 4.56.3 + version: 4.56.5 pjax: name: pjax file: pjax.min.js @@ -73,7 +73,7 @@ katex_copytex: mermaid: name: mermaid file: dist/mermaid.min.js - version: 10.2.3 + version: 10.2.4 canvas_ribbon: name: butterfly-extsrc file: dist/canvas-ribbon.min.js @@ -105,7 +105,7 @@ ClickShowText: 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.20 other_name: fancyapps-ui fancybox: name: '@fancyapps/ui' file: dist/fancybox/fancybox.umd.js - version: 5.0.19 + version: 5.0.20 other_name: fancyapps-ui medium_zoom: name: medium-zoom @@ -145,14 +145,11 @@ fontawesome: 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 +egjs_infinitegrid: + name: '@egjs/infinitegrid' + other_name: egjs-infinitegrid + file: dist/infinitegrid.min.js + version: 4.10.0 aplayer_css: name: aplayer file: dist/APlayer.min.css 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()} -
      +
        ${list[0]}
      ` }) diff --git a/scripts/helpers/findArchiveLength.js b/scripts/helpers/findArchiveLength.js index 56e9bcb..152b15e 100644 --- a/scripts/helpers/findArchiveLength.js +++ b/scripts/helpers/findArchiveLength.js @@ -1,36 +1,36 @@ -hexo.extend.helper.register('findArchiveLength', function (func) { - const allPostsLength = this.site.posts.length - if (hexo.config.archive_generator && hexo.config.archive_generator.enable === false) return allPostsLength - const { yearly, monthly, daily } = hexo.config.archive_generator +hexo.extend.helper.register('getArchiveLength', function () { + const { archive_generator: archiveGenerator } = hexo.config + if (archiveGenerator && archiveGenerator.enable === false) return this.site.posts.length + const { yearly, monthly, daily } = archiveGenerator const { year, month, day } = this.page - if (yearly === false || !year) return allPostsLength + if (yearly === false || !year) return this.site.posts.length const posts = this.site.posts.sort('date') const compareFunc = (type, y1, m1, d1, y2, m2, d2) => { - if (type === 'year') { - return y1 === y2 - } else if (type === 'month') { - return y1 === y2 && m1 === m2 - } else if (type === 'day') { - return y1 === y2 && m1 === m2 && d1 === d2 + switch (type) { + case 'year': + return y1 === y2 + case 'month': + return y1 === y2 && m1 === m2 + case 'day': + return y1 === y2 && m1 === m2 && d1 === d2 + default: + return false } } const generateDateObj = (type) => { - const dateObj = [] - let length = 0 - - posts.forEach(post => { + return posts.reduce((dateObj, post) => { const date = post.date.clone() const year = date.year() const month = date.month() + 1 const day = date.date() - const lastData = dateObj[length - 1] + const lastData = dateObj[dateObj.length - 1] if (!lastData || !compareFunc(type, lastData.year, lastData.month, lastData.day, year, month, day)) { const name = type === 'year' ? year : type === 'month' ? `${year}-${month}` : `${year}-${month}-${day}` - length = dateObj.push({ + dateObj.push({ name, year, month, @@ -40,19 +40,19 @@ hexo.extend.helper.register('findArchiveLength', function (func) { } else { lastData.count++ } - }) - return dateObj + return dateObj + }, []) } - const data = func('createArchiveObj', () => { - const yearObj = yearly ? generateDateObj('year') : [] - const monthObj = monthly ? generateDateObj('month') : [] - const dayObj = daily ? generateDateObj('day') : [] - const fullObj = [...yearObj, ...monthObj, ...dayObj] - return fullObj + const data = this.fragment_cache('createArchiveObj', () => { + const dateObjs = [] + if (yearly) dateObjs.push(...generateDateObj('year')) + if (monthly) dateObjs.push(...generateDateObj('month')) + if (daily) dateObjs.push(...generateDateObj('day')) + return dateObjs }) - const name = month ? day ? `${year}-${month}-${day}` : `${year}-${month}` : year + const name = month ? (day ? `${year}-${month}-${day}` : `${year}-${month}`) : year return data.find(item => item.name === name).count }) diff --git a/scripts/helpers/inject_head_js.js b/scripts/helpers/inject_head_js.js index e4ad6fb..5871fd7 100644 --- a/scripts/helpers/inject_head_js.js +++ b/scripts/helpers/inject_head_js.js @@ -7,87 +7,99 @@ hexo.extend.helper.register('inject_head_js', function () { const { darkmode, aside } = this.theme - const start = darkmode.start ? darkmode.start : 6 - const end = darkmode.end ? darkmode.end : 18 + const start = darkmode.start || 6 + const end = darkmode.end || 18 const { theme_color } = hexo.theme.config const themeColorLight = (theme_color && theme_color.enable && theme_color.meta_theme_color_light) || '#ffffff' const themeColorDark = (theme_color && theme_color.enable && theme_color.meta_theme_color_dark) || '#0d0d0d' - const localStore = ` - win.saveToLocal = { - set: function setWithExpiry(key, value, ttl) { - if (ttl === 0) return - const now = new Date() - const expiryDay = ttl * 86400000 - const item = { - value: value, - expiry: now.getTime() + expiryDay, + const createLocalStore = () => { + return ` + win.saveToLocal = { + set: (key, value, ttl) => { + if (ttl === 0) return + const now = Date.now() + const expiry = now + ttl * 86400000 + const item = { + value, + expiry + } + localStorage.setItem(key, JSON.stringify(item)) + }, + + get: key => { + const itemStr = localStorage.getItem(key) + + if (!itemStr) { + return undefined + } + const item = JSON.parse(itemStr) + const now = Date.now() + + if (now > item.expiry) { + localStorage.removeItem(key) + return undefined + } + return item.value } - localStorage.setItem(key, JSON.stringify(item)) - }, - - get: function getWithExpiry(key) { - const itemStr = localStorage.getItem(key) - - if (!itemStr) { - return undefined - } - const item = JSON.parse(itemStr) - const now = new Date() - - if (now.getTime() > item.expiry) { - localStorage.removeItem(key) - return undefined - } - return item.value } - } - ` + ` + } // https://stackoverflow.com/questions/16839698/jquery-getscript-alternative-in-native-javascript - const getScript = ` - win.getScript = url => new Promise((resolve, reject) => { - const script = document.createElement('script') - script.src = url - script.async = true - script.onerror = reject - script.onload = script.onreadystatechange = function() { - const loadState = this.readyState - if (loadState && loadState !== 'loaded' && loadState !== 'complete') return - script.onload = script.onreadystatechange = null - resolve() - } - document.head.appendChild(script) - }) - ` + const createGetScript = () => { + return ` + win.getScript = (url, attr = {}) => new Promise((resolve, reject) => { + const script = document.createElement('script') + script.src = url + script.async = true + script.onerror = reject + script.onload = script.onreadystatechange = function() { + const loadState = this.readyState + if (loadState && loadState !== 'loaded' && loadState !== 'complete') return + script.onload = script.onreadystatechange = null + resolve() + } - const getCSS = ` - win.getCSS = (url,id = false) => new Promise((resolve, reject) => { - const link = document.createElement('link') - link.rel = 'stylesheet' - link.href = url - if (id) link.id = id - link.onerror = reject - link.onload = link.onreadystatechange = function() { - const loadState = this.readyState - if (loadState && loadState !== 'loaded' && loadState !== 'complete') return - link.onload = link.onreadystatechange = null - resolve() - } - document.head.appendChild(link) - }) - ` + Object.keys(attr).forEach(key => { + script.setAttribute(key, attr[key]) + }) - let darkmodeJs = '' - if (darkmode.enable) { - darkmodeJs = ` - win.activateDarkMode = function () { + document.head.appendChild(script) + }) + ` + } + + const createGetCSS = () => { + return ` + win.getCSS = (url, id = false) => new Promise((resolve, reject) => { + const link = document.createElement('link') + link.rel = 'stylesheet' + link.href = url + if (id) link.id = id + link.onerror = reject + link.onload = link.onreadystatechange = function() { + const loadState = this.readyState + if (loadState && loadState !== 'loaded' && loadState !== 'complete') return + link.onload = link.onreadystatechange = null + resolve() + } + document.head.appendChild(link) + }) + ` + } + + const createDarkmodeJs = () => { + if (!darkmode.enable) return '' + + let darkmodeJs = ` + win.activateDarkMode = () => { document.documentElement.setAttribute('data-theme', 'dark') if (document.querySelector('meta[name="theme-color"]') !== null) { document.querySelector('meta[name="theme-color"]').setAttribute('content', '${themeColorDark}') } } - win.activateLightMode = function () { + win.activateLightMode = () => { document.documentElement.setAttribute('data-theme', 'light') if (document.querySelector('meta[name="theme-color"]') !== null) { document.querySelector('meta[name="theme-color"]').setAttribute('content', '${themeColorLight}') @@ -114,7 +126,7 @@ hexo.extend.helper.register('inject_head_js', function () { const isNight = hour <= ${start} || hour >= ${end} isNight ? activateDarkMode() : activateLightMode() } - window.matchMedia('(prefers-color-scheme: dark)').addListener(function (e) { + window.matchMedia('(prefers-color-scheme: dark)').addListener(e => { if (saveToLocal.get('theme') === undefined) { e.matches ? activateDarkMode() : activateLightMode() } @@ -133,15 +145,18 @@ hexo.extend.helper.register('inject_head_js', function () { ` } else { darkmodeJs += ` - if (t === 'dark') activateDarkMode() - else if (t === 'light') activateLightMode() - ` + if (t === 'dark') activateDarkMode() + else if (t === 'light') activateLightMode() + ` } + + return darkmodeJs } - let asideStatus = '' - if (aside.enable && aside.button) { - asideStatus = ` + const createAsideStatus = () => { + if (!aside.enable || !aside.button) return '' + + return ` const asideStatus = saveToLocal.get('aside-status') if (asideStatus !== undefined) { if (asideStatus === 'hide') { @@ -153,14 +168,16 @@ hexo.extend.helper.register('inject_head_js', function () { ` } - const detectApple = ` - const detectApple = () => { - if(/iPad|iPhone|iPod|Macintosh/.test(navigator.userAgent)){ - document.documentElement.classList.add('apple') + const createDetectApple = () => { + return ` + const detectApple = () => { + if(/iPad|iPhone|iPod|Macintosh/.test(navigator.userAgent)){ + document.documentElement.classList.add('apple') + } } - } - detectApple() + detectApple() ` + } - return `` + return `` }) diff --git a/scripts/helpers/page.js b/scripts/helpers/page.js index 22622c3..6c773e3 100644 --- a/scripts/helpers/page.js +++ b/scripts/helpers/page.js @@ -1,10 +1,3 @@ -/** - * Butterfly - * @example - * page_description() - * cloudTags(source, minfontsize, maxfontsize, limit) - */ - 'use strict' const { stripHTML, escapeHTML, prettyUrls } = require('hexo-util') @@ -60,12 +53,8 @@ hexo.extend.helper.register('md5', function (path) { }) hexo.extend.helper.register('injectHtml', function (data) { - let result = '' if (!data) return '' - for (let i = 0; i < data.length; i++) { - result += data[i] - } - return result + return data.join('') }) hexo.extend.helper.register('findArchivesTitle', function (page, menu, date) { @@ -95,8 +84,5 @@ hexo.extend.helper.register('findArchivesTitle', function (page, menu, date) { hexo.extend.helper.register('isImgOrUrl', function (path) { const imgTestReg = /\.(png|jpe?g|gif|svg|webp)(\?.*)?$/i - if (path.indexOf('//') !== -1 || imgTestReg.test(path)) { - return true - } - return false + return path.indexOf('//') !== -1 || imgTestReg.test(path) }) diff --git a/scripts/tag/gallery.js b/scripts/tag/gallery.js index 14cdee3..f8bceb6 100644 --- a/scripts/tag/gallery.js +++ b/scripts/tag/gallery.js @@ -2,8 +2,9 @@ * Butterfly * galleryGroup and gallery * {% galleryGroup [name] [descr] [url] [img] %} - * {% gallery [lazyload],[rowHeight],[limit] %} - * {% gallery url,[url],[lazyload],[rowHeight],[limit] %} + * + * {% gallery [button],%} + * {% gallery url,[url],[button]%} */ 'use strict' @@ -11,14 +12,15 @@ const urlFor = require('hexo-util').url_for.bind(hexo) const gallery = (args, content) => { - const { data, languages } = hexo.theme.i18n args = args.join(' ').split(',') - let rowHeight, limit, lazyload, type, dataStr + let button = false + let type = 'data' + let dataStr = '' if (args[0] === 'url') { - [type, dataStr, lazyload, rowHeight = 220, limit = 10] = args // url,[link],[lazyload],[rowHeight],[limit] + [type, dataStr, button] = args // url,[link],[lazyload] } else { - [lazyload, rowHeight = 220, limit = 10] = args // [lazyload],[rowHeight],[limit] + [button] = args // [lazyload] const regex = /!\[(.*?)\]\(([^\s]*)\s*(?:["'](.*?)["']?)?\s*\)/g let m const arr = [] @@ -36,14 +38,10 @@ const gallery = (args, content) => { dataStr = JSON.stringify(arr) } - type = type ? ' url' : ' data' - const lazyloadClass = lazyload === 'true' ? 'lazyload' : '' - - return `