feat: add wordcount helpers, waline lightbox, and extensive bug fixes

- wordcount/min2read/totalcount built-in helpers (replaces hexo-wordcount)
- cloudTags random sort support
- waline lightbox via MutationObserver
- subtitle: seq guard prevents stale API response race
- newest-comments: escapeHtml XSS fix, unified fetchAndRender with cache fallback
- katex: try/catch asset load, encrypt re-render
- chartjs: destroy charts on pjax, fix theme property check
- mathjax: DOMContentLoaded instead of load
- mermaid: clean stale error elements
- medium-zoom: single instance, detach on pjax
- getScrollPercent: WeakMap cache with resize invalidation
- overflowPaddingR: avoid stale DOM refs
- readmode: dedupe button, pjax cleanup
- hexo-blog-decrypt: null-guard translateFn and encryptFn
- tw_cn: expand skipped translate tags
- localStorage: try/catch setItem
- cdn.js: fix [lib|dist]* character class regex bug
- findArchivesTitle: support custom archive_dir
- shuoshuoFN: guard moment.tz when timezone empty
- umami: no-store cache, error handling, path param
- artalk: vote config option
- bump version 5.7.1.260810
This commit is contained in:
myw
2026-08-10 18:02:27 +08:00 Unverified
parent 51d36ef83a
commit 79e16a5cdd
25 changed files with 726 additions and 624 deletions
+9 -3
View File
@@ -622,7 +622,7 @@ document.addEventListener('DOMContentLoaded', () => {
const currentTop = window.scrollY || document.documentElement.scrollTop
if (isToc && GLOBAL_CONFIG.percent.toc) {
$tocPercentage.textContent = btf.getScrollPercent(currentTop, $article)
$tocPercentage.textContent = btf.getScrollPercent(currentTop, $article, false)
}
if (currentTop === 0) {
@@ -662,6 +662,7 @@ document.addEventListener('DOMContentLoaded', () => {
*/
const rightSideFn = {
readmode: () => { // read mode
if (document.querySelector('.exit-readmode')) return
const $body = document.body
const newEle = document.createElement('button')
@@ -677,6 +678,7 @@ document.addEventListener('DOMContentLoaded', () => {
newEle.innerHTML = '<i class="fas fa-sign-out-alt"></i>'
newEle.addEventListener('click', exitReadMode)
$body.appendChild(newEle)
btf.addGlobalFn('pjaxSendOnce', exitReadMode, 'exitReadMode')
},
darkmode: () => { // switch between light and dark mode
const willChangeMode = document.documentElement.getAttribute('data-theme') === 'dark' ? 'light' : 'dark'
@@ -1010,8 +1012,12 @@ document.addEventListener('DOMContentLoaded', () => {
// 處理 hexo-blog-encrypt 事件
window.addEventListener('hexo-blog-decrypt', e => {
forPostFn()
window.translateFn.translateInitialization()
Object.values(window.globalFn.encrypt).forEach(fn => {
if (window.translateFn && typeof window.translateFn.translateInitialization === 'function') {
window.translateFn.translateInitialization()
}
const encryptFn = window.globalFn && window.globalFn.encrypt ? window.globalFn.encrypt : {}
Object.values(encryptFn).forEach(fn => {
fn()
})
})