chore: bump version to 5.5.1 and update dependencies

- Upgrade version from 5.5.0 to 5.5.1
- Update third-party dependencies: algolia, disqusjs, docsearch, fancybox, fontawesome, mermaid
- Replace Twitter with X in share configurations
- Enable CDN version numbers by default
- Fix shuoshuo page JSON security with safeJSON helper
- Improve image lazy loading regex to handle minified HTML
- Fix search result HTML structure and styling
- Add margin-top to search result numbering for better alignment
This commit is contained in:
Jerry
2025-10-02 14:32:08 +08:00
parent 4226c95818
commit 5e766ac40a
9 changed files with 38 additions and 32 deletions

View File

@@ -515,12 +515,12 @@ share:
# Share.js
# https://github.com/overtrue/share.js
sharejs:
sites: facebook,twitter,wechat,weibo,qq
sites: facebook,x,wechat,weibo,qq
# AddToAny
# https://www.addtoany.com/
addtoany:
item: facebook,twitter,wechat,sina_weibo,facebook_messenger,email,copy_link
item: facebook,x,wechat,sina_weibo,facebook_messenger,email,copy_link
# --------------------------------------
# Comments System
@@ -1067,7 +1067,7 @@ CDN:
third_party_provider: jsdelivr
# Add version number to url, true or false
version: false
version: true
# Custom format
# For example: https://cdn.staticfile.org/${cdnjs_name}/${version}/${min_cdnjs_file}

View File

@@ -46,6 +46,9 @@
- const localDate = page.shuoshuo_url ? [] : shuoshuoFN(site.data.shuoshuo, page)
if !page.shuoshuo_url
script(type='application/json' id='shuoshuo-data')!= safeJSON(localDate)
script.
(() => {
const limitConfig = !{ JSON.stringify(page.limit || {}) }
@@ -280,7 +283,8 @@
const response = await fetch('!{url_for(page.shuoshuo_url)}')
originData = await response.json()
} else {
originData = !{JSON.stringify(localDate)}
const dataElement = document.getElementById('shuoshuo-data')
originData = dataElement ? JSON.parse(dataElement.textContent) : []
}
data = filterDataByLimit(sortDataByDate(originData), limitConfig)

View File

@@ -1,6 +1,6 @@
{
"name": "hexo-theme-butterfly",
"version": "5.5.0",
"version": "5.5.1",
"description": "A Simple and Card UI Design theme for Hexo",
"main": "package.json",
"scripts": {

View File

@@ -9,7 +9,7 @@ activate_power_mode:
algolia_search:
name: algoliasearch
file: dist/lite/builds/browser.umd.js
version: 5.37.0
version: 5.39.0
aplayer_css:
name: aplayer
file: dist/APlayer.min.css
@@ -57,21 +57,21 @@ click_heart:
disqusjs:
name: disqusjs
file: dist/browser/disqusjs.es2015.umd.min.js
version: 3.1.0
version: 3.1.1
disqusjs_css:
name: disqusjs
file: dist/browser/styles/disqusjs.css
version: 3.1.0
version: 3.1.1
docsearch_css:
name: '@docsearch/css'
other_name: docsearch-css
file: dist/style.css
version: 3.9.0
version: 4.1.0
docsearch_js:
name: '@docsearch/js'
other_name: docsearch-js
file: dist/umd/index.js
version: 3.9.0
version: 4.1.0
egjs_infinitegrid:
name: '@egjs/infinitegrid'
other_name: egjs-infinitegrid
@@ -80,12 +80,12 @@ egjs_infinitegrid:
fancybox:
name: '@fancyapps/ui'
file: dist/fancybox/fancybox.umd.js
version: 6.0.29
version: 6.0.33
other_name: fancyapps-ui
fancybox_css:
name: '@fancyapps/ui'
file: dist/fancybox/fancybox.css
version: 6.0.29
version: 6.0.33
other_name: fancyapps-ui
fireworks:
name: butterfly-extsrc
@@ -95,7 +95,7 @@ fontawesome:
name: '@fortawesome/fontawesome-free'
file: css/all.min.css
other_name: font-awesome
version: 7.0.1
version: 7.1.0
gitalk:
name: gitalk
file: dist/gitalk.min.js
@@ -133,7 +133,7 @@ medium_zoom:
mermaid:
name: mermaid
file: dist/mermaid.min.js
version: 11.11.0
version: 11.12.0
meting_js:
name: butterfly-extsrc
file: metingjs/dist/Meting.min.js

View File

@@ -290,10 +290,10 @@ module.exports = {
share: {
use: 'sharejs',
sharejs: {
sites: 'facebook,twitter,wechat,weibo,qq'
sites: 'facebook,x,wechat,weibo,qq'
},
addtoany: {
item: 'facebook,twitter,wechat,sina_weibo,facebook_messenger,email,copy_link'
item: 'facebook,x,wechat,sina_weibo,facebook_messenger,email,copy_link'
}
},
comments: {
@@ -591,7 +591,7 @@ module.exports = {
CDN: {
internal_provider: 'local',
third_party_provider: 'jsdelivr',
version: false,
version: true,
custom_format: null,
option: null
}

View File

@@ -18,20 +18,12 @@ const lazyload = htmlContent => {
const bg = hexo.theme.config.lazyload.placeholder ? urlFor(hexo.theme.config.lazyload.placeholder) : 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7'
// Use more precise replacement: handle src attributes with double and single quotes, but avoid replacing content inside script tags
let result = htmlContent
// Handle src attributes with double quotes
result = result.replace(/(<img(?![^>]*?\bdata-lazy-src=)(?:\s[^>]*?)?\ssrc="([^"]+)")(?![^<]*<\/script>)/gi, (match, tag, src) => {
return tag.replace(`src="${src}"`, `src="${bg}" data-lazy-src="${src}"`)
// Handle src attributes with double quotes, single quotes, or no quotes (unified approach)
// Matches: src="..." or src='...' or src=... (e.g., after minification by hexo-minify)
return htmlContent.replace(/(<img(?![^>]*?\bdata-lazy-src=)(?:\s[^>]*?)?\ssrc=)(?:"([^"]*)"|'([^']*)'|([^\s>]+))(?![^<]*<\/script>)/gi, (match, prefix, srcDoubleQuote, srcSingleQuote, srcNoQuote) => {
const src = srcDoubleQuote || srcSingleQuote || srcNoQuote
return `${prefix}"${bg}" data-lazy-src="${src}"`
})
// Handle src attributes with single quotes
result = result.replace(/(<img(?![^>]*?\bdata-lazy-src=)(?:\s[^>]*?)?\ssrc='([^']+)')(?![^<]*<\/script>)/gi, (match, tag, src) => {
return tag.replace(`src='${src}'`, `src='${bg}' data-lazy-src='${src}'`)
})
return result
}
hexo.extend.filter.register('after_render:html', data => {

View File

@@ -157,3 +157,12 @@ hexo.extend.helper.register('getVersion', () => {
const { version } = require('../../package.json')
return { hexo: hexo.version, theme: version }
})
hexo.extend.helper.register('safeJSON', data => {
// Safely serialize JSON for embedding in <script> tags
return JSON.stringify(data)
.replace(/</g, '\\u003c')
.replace(/>/g, '\\u003e')
.replace(/\u2028/g, '\\u2028')
.replace(/\u2029/g, '\\u2029')
})

View File

@@ -91,6 +91,7 @@
justify-content: center
align-items: center
margin-right: 6px
margin-top: 3px
min-width: 24px
color: $search-color
content: attr(value) '.'

View File

@@ -156,10 +156,10 @@ class LocalSearch {
}
slicesOfContent.forEach(slice => {
resultItem += `<p class="search-result">${this.highlightKeyword(content, slice)}...</p></a>`
resultItem += `<p class="search-result">${this.highlightKeyword(content, slice)}...</p>`
})
resultItem += '</li>'
resultItem += '</a></li>'
resultItems.push({
item: resultItem,
id: resultItems.length,