diff --git a/_config.yml b/_config.yml index 15a05a8..e846571 100644 --- a/_config.yml +++ b/_config.yml @@ -843,13 +843,18 @@ inject: # 非必要請不要修改 CDN: # The CDN provider of internal scripts (主題內部 js 的 cdn 配置) - # option: local/jsdelivr/unpkg - # Dev version cannot choose jsdelivr/unpkg (dev版的主題不能設置為 jsdelivr/unpkg) + # option: local/jsdelivr/unpkg/cdnjs/custom + # Dev version can only choose. ( dev版的主題只能設置為 local ) internal_provider: local # The CDN provider of third party scripts (第三方 js 的 cdn 配置) - # option: local/jsdelivr/unpkg + # option: local/jsdelivr/unpkg/cdnjs/custom # when set it to local, you need to install hexo-butterfly-extjs third_party_provider: jsdelivr + # Custom format + # For example: https://cdn.staticfile.org/${cdnjs_name}/${version}/${min_cdnjs_file} + custom_format: + # Add version number to CDN, true or false + version: false option: # main_css: # main: @@ -874,7 +879,6 @@ CDN: # mathjax: # katex: # katex_copytex: - # katex_copytex_css: # mermaid: # canvas_ribbon: # canvas_fluttering_ribbon: diff --git a/layout/includes/header/index.pug b/layout/includes/header/index.pug index f1e3724..18e7dd7 100644 --- a/layout/includes/header/index.pug +++ b/layout/includes/header/index.pug @@ -19,7 +19,7 @@ if !theme.disable_top_img && page.top_img !== false if top_img !== false - var imgSource = top_img && top_img.indexOf('/') !== -1 ? `background-image: url('${url_for(top_img)}')` : `background: ${top_img}` - var bg_img = top_img ? imgSource : '' - - var site_title = is_archive() ? fragment_cache('findArchivesTitle', function(){return findArchivesTitle(theme.menu);}) : page.title || page.tag || page.category || config.title + - var site_title = is_archive() ? findArchivesTitle(page, theme.menu, date) : page.title || page.tag || page.category || config.title - var isHomeClass = is_home() ? 'full_page' : 'not-home-page' - is_post() ? isHomeClass = 'post-bg' : isHomeClass else diff --git a/layout/includes/third-party/math/katex.pug b/layout/includes/third-party/math/katex.pug index f69e8b8..c1f0bd6 100644 --- a/layout/includes/third-party/math/katex.pug +++ b/layout/includes/third-party/math/katex.pug @@ -1,6 +1,5 @@ link(rel="stylesheet" type="text/css" href=url_for(theme.asset.katex)) script(src=url_for(theme.asset.katex_copytex)) -link(rel="stylesheet" type="text/css" href=url_for(theme.asset.katex_copytex_css)) script. (() => { document.querySelectorAll('#article-container span.katex-display').forEach(item => { diff --git a/package.json b/package.json index 12fbe0b..dac10e9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hexo-theme-butterfly", - "version": "4.3.0-b2", + "version": "4.3.0-b3", "description": "A Simple and Card UI Design theme for Hexo", "main": "package.json", "scripts": { @@ -23,7 +23,7 @@ "email": "my@crazywong.com" }, "dependencies": { - "hexo-renderer-stylus": "^2.0.1", + "hexo-renderer-stylus": "^2.1.0", "hexo-renderer-pug": "^3.0.0" }, "homepage": "https://butterfly.js.org/", diff --git a/plugins.yml b/plugins.yml new file mode 100644 index 0000000..9d29626 --- /dev/null +++ b/plugins.yml @@ -0,0 +1,180 @@ +algolia_search_v4: + name: algoliasearch + file: dist/algoliasearch-lite.umd.js + version: 4.13.1 +instantsearch_v4: + name: instantsearch.js + file: dist/instantsearch.production.min.js + version: 4.41.0 +pjax: + name: pjax + file: pjax.min.js + version: 0.2.8 +gitalk: + name: gitalk + file: dist/gitalk.min.js + version: 1.7.2 +gitalk_css: + name: gitalk + file: dist/gitalk.css + version: 1.7.2 +blueimp_md5: + name: blueimp-md5 + file: js/md5.min.js + version: 2.19.0 +valine: + name: valine + file: dist/Valine.min.js + version: 1.4.18 +disqusjs: + name: disqusjs + file: dist/browser/disqusjs.es2015.umd.min.js + version: 3.0.1 +disqusjs_css: + name: disqusjs + file: dist/browser/styles/disqusjs.css + version: 3.0.1 +twikoo: + name: twikoo + file: dist/twikoo.all.min.js + version: 1.5.11 +waline_js: + name: '@waline/client' + file: dist/waline.js + other_name: waline + version: 2.5.1 +waline_css: + name: '@waline/client' + file: dist/waline.css + other_name: waline + version: 2.5.1 +sharejs: + name: butterfly-extsrc + file: sharejs/dist/js/social-share.min.js + version: 1.1.3 +sharejs_css: + name: butterfly-extsrc + file: sharejs/dist/css/share.min.css + version: 1.1.3 +mathjax: + name: mathjax + file: es5/tex-mml-chtml.js + version: 3.2.2 +katex: + name: katex + file: dist/katex.min.css + other_name: KaTeX + version: 0.16.0 +katex_copytex: + name: katex + file: dist/contrib/copy-tex.min.js + other_name: KaTeX + version: 0.16.0 +mermaid: + name: mermaid + file: dist/mermaid.min.js + version: 9.1.1 +canvas_ribbon: + name: butterfly-extsrc + file: dist/canvas-ribbon.min.js + version: 1.1.3 +canvas_fluttering_ribbon: + name: butterfly-extsrc + file: dist/canvas-fluttering-ribbon.min.js + version: 1.1.3 +canvas_nest: + name: butterfly-extsrc + file: dist/canvas-nest.min.js + version: 1.1.3 +activate_power_mode: + name: butterfly-extsrc + file: dist/activate-power-mode.min.js + version: 1.1.3 +fireworks: + name: butterfly-extsrc + file: dist/fireworks.min.js + version: 1.1.3 +click_heart: + name: butterfly-extsrc + file: dist/click-heart.min.js + version: 1.1.3 +ClickShowText: + name: butterfly-extsrc + file: dist/click-show-text.min.js + version: 1.1.3 +lazyload: + name: vanilla-lazyload + file: dist/lazyload.iife.min.js + version: 17.8.2 +instantpage: + name: instant.page + file: instantpage.js + version: 5.1.0 +typed: + name: typed.js + file: lib/typed.min.js + version: 2.0.12 +pangu: + name: pangu + file: dist/browser/pangu.min.js + version: 4.0.7 +fancybox_css_v4: + name: '@fancyapps/ui' + file: dist/fancybox.css + version: 4.0.27 +fancybox_v4: + name: '@fancyapps/ui' + file: dist/fancybox.umd.js + version: 4.0.27 +medium_zoom: + name: medium-zoom + file: dist/medium-zoom.min.js + version: 1.0.6 +snackbar_css: + name: node-snackbar + file: dist/snackbar.min.css + version: 0.1.16 +snackbar: + name: node-snackbar + file: dist/snackbar.min.js + version: 0.1.16 +fontawesomeV6: + name: '@fortawesome/fontawesome-free' + file: css/all.min.css + other_name: font-awesome + version: 6.1.1 +flickr_justified_gallery_js: + name: flickr-justified-gallery + file: dist/fjGallery.min.js + version: 2.0.0 +flickr_justified_gallery_css: + name: flickr-justified-gallery + file: dist/fjGallery.css + version: 2.0.0 +aplayer_css: + name: aplayer + file: dist/APlayer.min.css + version: 1.10.1 +aplayer_js: + name: aplayer + file: dist/APlayer.min.js + version: 1.10.1 +meting_js: + name: butterfly-extsrc + file: metingjs/dist/Meting.min.js + version: 1.1.3 +prismjs_js: + name: prismjs + file: prism.js + other_name: prism + version: 1.28.0 +prismjs_lineNumber_js: + name: prismjs + file: plugins/line-numbers/prism-line-numbers.min.js + other_name: prism + version: 1.28.0 +prismjs_autoloader: + name: prismjs + file: plugins/autoloader/prism-autoloader.min.js + other_name: prism + version: 1.28.0 diff --git a/scripts/events/cdn.js b/scripts/events/cdn.js new file mode 100644 index 0000000..7d77e63 --- /dev/null +++ b/scripts/events/cdn.js @@ -0,0 +1,94 @@ +/** + * Butterfly + * Merge CDN + */ + +'use strict' + +const { version } = require('../../package.json') +const path = require('path') + +hexo.extend.filter.register('before_generate', () => { + const themeConfig = hexo.theme.config + const { CDN } = themeConfig + + const thirdPartySrc = hexo.render.renderSync({ path: path.join(hexo.theme_dir,'/plugins.yml'), engine: 'yaml'}) + const internalSrc = { + main: { + name: 'hexo-theme-butterfly', + file: 'js/main.js', + version + }, + utils: { + name: 'hexo-theme-butterfly', + file: 'js/utils.js', + version + }, + translate: { + name: 'hexo-theme-butterfly', + file: 'js/tw_cn.js', + version + }, + local_search: { + name: 'hexo-theme-butterfly', + file: 'js/search/local-search.js', + version + }, + algolia_js: { + name: 'hexo-theme-butterfly', + file: 'js/search/algolia.js', + version + } + } + + const minFile = (file) => { + return file.replace(/(? '.min' + ext) + } + + const createCDNLink = (data, type, cond = '') => { + Object.keys(data).map(key => { + let { name, version, file, other_name } = data[key] + + const min_file = minFile(file) + const cdnjs_name = other_name || name + const cdnjs_file = file.replace(/^[lib|dist]*\/|browser\//g, '') + const min_cdnjs_file = minFile(cdnjs_file) + if (cond === 'internal') file = `source/${file}` + const verType = CDN.version ? `@${version}` : '' + + const value = { + version, + name, + file, + cdnjs_file, + min_file, + min_cdnjs_file, + cdnjs_name + } + const cdnSource = { + local: cond === 'internal' ? cdnjs_file : `/pluginsSrc/${name}/${file}`, + jsdelivr: `https://cdn.jsdelivr.net/npm/${name}${verType}/${min_file}`, + unpkg: `https://unpkg.com/${name}${verType}/${file}`, + cdnjs: `https://cdnjs.cloudflare.com/ajax/libs/${cdnjs_name}/${version}/${min_cdnjs_file}`, + custom: (CDN.custom_format || '').replace(/\$\{(.+?)\}/g, (match, $1) => value[$1]) + } + + data[key] = cdnSource[type] + }) + + if (cond === 'internal') data['main_css'] = 'css/index.css' + return data + } + + // delete null value + const deleteNullValue = obj => { + if (!obj) return + for (const i in obj) { + obj[i] === null && delete obj[i] + } + return obj + } + + themeConfig.asset = Object.assign(createCDNLink(internalSrc,CDN.internal_provider,'internal'), + createCDNLink(thirdPartySrc,CDN.third_party_provider), deleteNullValue(CDN.option)) +}) diff --git a/scripts/events/comment.js b/scripts/events/comment.js new file mode 100644 index 0000000..b1ef856 --- /dev/null +++ b/scripts/events/comment.js @@ -0,0 +1,14 @@ +/** + * Capitalize the first letter of comment name + */ + +hexo.extend.filter.register('before_generate', () => { + const themeConfig = hexo.theme.config + let { use } = themeConfig.comments + if (!use) return + if (typeof use === 'string') { + use = use.split(',') + } + const newArray = use.map(item => item.toLowerCase().replace(/\b[a-z]/g, s => s.toUpperCase())) + themeConfig.comments.use = newArray +}) \ No newline at end of file diff --git a/scripts/events/config.js b/scripts/events/config.js deleted file mode 100644 index ffd5d63..0000000 --- a/scripts/events/config.js +++ /dev/null @@ -1,141 +0,0 @@ -/** - * Butterfly - * 1. Merge CDN - * 2. Capitalize the first letter of comment name - */ - -'use strict' - -const { version } = require('../../package.json') -const path = require('path') - -hexo.extend.filter.register('before_generate', () => { - const themeConfig = hexo.theme.config - const { CDN, comments } = themeConfig - const jsdelivr = 'https://cdn.jsdelivr.net/npm/' - const unpkg = 'https://unpkg.com/' - - /** - * Merge CDN - */ - - const internalSrcCDN = (pre) => { - return { - main_css: '/css/index.css', - main: `${pre}hexo-theme-butterfly@${version}/source/js/main.js`, - utils: `${pre}hexo-theme-butterfly@${version}/source/js/utils.js`, - translate: `${pre}hexo-theme-butterfly@${version}/source/js/tw_cn.js`, - local_search: `${pre}hexo-theme-butterfly@${version}/source/js/search/local-search.js`, - algolia_js: `${pre}hexo-theme-butterfly@${version}/source/js/search/algolia.js`, - } - } - - const internalSrcLocal = { - main_css: '/css/index.css', - main: '/js/main.js', - utils: '/js/utils.js', - translate: '/js/tw_cn.js', - local_search: '/js/search/local-search.js', - algolia_js: '/js/search/algolia.js', - } - - const thirdPartySrcCDN = (pre) => { - return { - algolia_search_v4: `${pre}algoliasearch@4/dist/algoliasearch-lite.umd.js`, - instantsearch_v4: `${pre}instantsearch.js@4/dist/instantsearch.production.min.js`, - pjax: `${pre}pjax/pjax.min.js`, - gitalk: `${pre}gitalk@latest/dist/gitalk.min.js`, - gitalk_css: `${pre}gitalk/dist/gitalk.css`, - blueimp_md5: `${pre}blueimp-md5/js/md5.min.js`, - valine: `${pre}valine/dist/Valine.min.js`, - disqusjs: `${pre}disqusjs@3/dist/browser/disqusjs.es2015.umd.min.js`, - disqusjs_css: `${pre}disqusjs@3/dist/browser/styles/disqusjs.css`, - twikoo: `${pre}twikoo@1/dist/twikoo.all.min.js`, - waline_js: `${pre}@waline/client/dist/waline.js`, - waline_css: `${pre}@waline/client/dist/waline.css`, - sharejs: `${pre}butterfly-extsrc@1/ShareJS/dist/js/social-share.min.js`, - sharejs_css: `${pre}butterfly-extsrc@1/ShareJS/dist/css/share.min.css`, - mathjax: `${pre}mathjax@3/es5/tex-mml-chtml.js`, - katex: `${pre}katex@latest/dist/katex.min.css`, - katex_copytex: `${pre}katex@latest/dist/contrib/copy-tex.min.js`, - katex_copytex_css: `${pre}katex@latest/dist/contrib/copy-tex.css`, - mermaid: `${pre}mermaid/dist/mermaid.min.js`, - canvas_ribbon: `${pre}butterfly-extsrc@1/dist/canvas-ribbon.min.js`, - canvas_fluttering_ribbon: `${pre}butterfly-extsrc@1/dist/canvas-fluttering-ribbon.min.js`, - canvas_nest: `${pre}butterfly-extsrc@1/dist/canvas-nest.min.js`, - activate_power_mode: `${pre}butterfly-extsrc@1/dist/activate-power-mode.min.js`, - fireworks: `${pre}butterfly-extsrc@1/dist/fireworks.min.js`, - click_heart: `${pre}butterfly-extsrc@1/dist/click-heart.min.js`, - ClickShowText: `${pre}butterfly-extsrc@1/dist/click-show-text.min.js`, - lazyload: `${pre}vanilla-lazyload/dist/lazyload.iife.min.js`, - instantpage: `${pre}instant.page@5/instantpage.js`, - typed: `${pre}typed.js/lib/typed.min.js`, - pangu: `${pre}pangu@4/dist/browser/pangu.min.js`, - fancybox_css_v4: `${pre}@fancyapps/ui/dist/fancybox.css`, - fancybox_v4: `${pre}@fancyapps/ui/dist/fancybox.umd.js`, - medium_zoom: `${pre}medium-zoom/dist/medium-zoom.min.js`, - snackbar_css: `${pre}node-snackbar/dist/snackbar.min.css`, - snackbar: `${pre}node-snackbar/dist/snackbar.min.js`, - fontawesomeV6: `${pre}@fortawesome/fontawesome-free@6/css/all.min.css`, - flickr_justified_gallery_js: `${pre}flickr-justified-gallery@2/dist/fjGallery.min.js`, - flickr_justified_gallery_css: `${pre}flickr-justified-gallery@2/dist/fjGallery.css`, - aplayer_css: `${pre}aplayer@1/dist/APlayer.min.css`, - aplayer_js: `${pre}aplayer@1/dist/APlayer.min.js`, - meting_js: `${pre}butterfly-extsrc@1/MetingJS/dist/Meting.min.js`, - prismjs_js: `${pre}prismjs@1/prism.js`, - prismjs_lineNumber_js: `${pre}prismjs@1/plugins/line-numbers/prism-line-numbers.min.js`, - prismjs_autoloader: `${pre}prismjs@1/plugins/autoloader/prism-autoloader.min.js`, - } - } - - // delete null value - const deleteNullValue = obj => { - if (!obj) return - for (const i in obj) { - obj[i] === null && delete obj[i] - } - return obj - } - - const defaultVal = (obj, choose) => { - if (obj === 'internal') { - if (choose === 'local') return internalSrcLocal - else if (choose === 'unpkg') return internalSrcCDN(unpkg) - else return internalSrcCDN(jsdelivr) - } - - if (obj === 'external') { - if (choose === 'local') { - let result = {} - try { - const data = path.join(hexo.plugin_dir,'hexo-butterfly-extjs/plugins.yml') - result = hexo.render.renderSync({ path: data, engine: 'yaml'}) - Object.keys(result).map(key => { - result[key] = '/pluginsSrc/' + result[key] - }) - } catch (e) {} - return result - } else if (choose === 'unpkg') return thirdPartySrcCDN(unpkg) - else return thirdPartySrcCDN(jsdelivr) - } - } - - themeConfig.asset = Object.assign(defaultVal('internal', CDN.internal_provider), - defaultVal('external', CDN.third_party_provider), deleteNullValue(CDN.option)) - - /** - * Capitalize the first letter of comment name - */ - - let { use } = comments - - if (!use) return - - if (typeof use === 'string') { - use = use.split(',') - } - - const newArray = use.map(item => item.toLowerCase().replace(/\b[a-z]/g, s => s.toUpperCase())) - - themeConfig.comments.use = newArray -}) diff --git a/scripts/helpers/page.js b/scripts/helpers/page.js index 35c4149..aa2b74b 100644 --- a/scripts/helpers/page.js +++ b/scripts/helpers/page.js @@ -71,7 +71,13 @@ hexo.extend.helper.register('injectHtml', function (data) { return result }) -hexo.extend.helper.register('findArchivesTitle', function (menu) { +hexo.extend.helper.register('findArchivesTitle', function (page, menu, date) { + if (page.year) { + const dateStr = page.month ? `${page.year}-${page.month}` : `${page.year}` + const date_format = page.month ? hexo.theme.config.aside.card_archives.format : 'YYYY' + return date(dateStr, date_format) + } + const defaultTitle = this._p('page.archives') if (!menu) return defaultTitle diff --git a/source/js/search/algolia.js b/source/js/search/algolia.js index 530aa4d..f0b9f3a 100644 --- a/source/js/search/algolia.js +++ b/source/js/search/algolia.js @@ -91,11 +91,19 @@ window.addEventListener('load', () => { templates: { item(data) { const link = data.permalink ? data.permalink : (GLOBAL_CONFIG.root + data.path) + const result = data._highlightResult + const content = result.contentStripTruncate + ? cutContent(result.contentStripTruncate.value) + : result.contentStrip + ? cutContent(result.contentStrip.value) + : result.content + ? cutContent(result.content.value) + : '' return ` - ${data._highlightResult.title.value || 'no-title'} + ${result.title.value || 'no-title'} -

${cutContent(data._highlightResult.contentStripTruncate.value)}

` +

${content}

` }, empty: function (data) { return (