mirror of
https://github.com/jerryc127/hexo-theme-butterfly.git
synced 2026-08-10 20:48:42 +08:00
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:
+32
-38
@@ -30,29 +30,25 @@ script.
|
||||
|
||||
const extractValue = stat => (stat && typeof stat.value !== 'undefined') ? stat.value : stat
|
||||
|
||||
const getData = async (isPost) => {
|
||||
try {
|
||||
const now = Date.now()
|
||||
const pathQuery = isPost ? `&url=${window.location.pathname}&path=${window.location.pathname}` : ''
|
||||
const headers = {
|
||||
'Accept': 'application/json',
|
||||
[!{isServerURL} ? 'Authorization' : 'x-umami-api-key']: !{isServerURL} ? `Bearer ${config.token}` : config.token
|
||||
}
|
||||
|
||||
const res = await fetch(`!{apiUrl}/websites/!{website_id}/stats?startAt=0000000000&endAt=${now}${pathQuery}`, {
|
||||
method: 'GET',
|
||||
headers
|
||||
})
|
||||
|
||||
if (!res.ok) {
|
||||
throw new Error(`HTTP error! status: ${res.status}`)
|
||||
}
|
||||
|
||||
return await res.json()
|
||||
} catch (error) {
|
||||
console.error('Umami Analytics: Failed to fetch data', error)
|
||||
throw error
|
||||
const getData = async (isPost, path = window.location.pathname) => {
|
||||
const now = Date.now()
|
||||
const pathQuery = isPost ? `&url=${path}&path=${path}` : ''
|
||||
const headers = {
|
||||
'Accept': 'application/json',
|
||||
[!{isServerURL} ? 'Authorization' : 'x-umami-api-key']: !{isServerURL} ? `Bearer ${config.token}` : config.token
|
||||
}
|
||||
|
||||
const res = await fetch(`!{apiUrl}/websites/!{website_id}/stats?startAt=0000000000&endAt=${now}${pathQuery}`, {
|
||||
method: 'GET',
|
||||
headers,
|
||||
cache: 'no-store'
|
||||
})
|
||||
|
||||
if (!res.ok) {
|
||||
throw new Error(`HTTP error! status: ${res.status}`)
|
||||
}
|
||||
|
||||
return await res.json()
|
||||
}
|
||||
|
||||
const insertData = async () => {
|
||||
@@ -63,7 +59,8 @@ script.
|
||||
tasks.push((async () => {
|
||||
const pagePV = document.getElementById('umamiPV')
|
||||
if (pagePV) {
|
||||
const data = await getData(true)
|
||||
const path = pagePV.dataset.path || window.location.pathname
|
||||
const data = await getData(true, path)
|
||||
if (data && data.pageviews) {
|
||||
pagePV.textContent = extractValue(data.pageviews)
|
||||
} else {
|
||||
@@ -73,26 +70,23 @@ script.
|
||||
})())
|
||||
}
|
||||
|
||||
if (config.site_uv || config.site_pv) {
|
||||
const siteUV = config.site_uv ? document.getElementById('umami-site-uv') : null
|
||||
const sitePV = config.site_pv ? document.getElementById('umami-site-pv') : null
|
||||
|
||||
if (siteUV || sitePV) {
|
||||
tasks.push((async () => {
|
||||
const data = await getData(false)
|
||||
|
||||
if (config.site_uv) {
|
||||
const siteUV = document.getElementById('umami-site-uv')
|
||||
if (siteUV && data && data.visitors) {
|
||||
siteUV.textContent = extractValue(data.visitors)
|
||||
} else if (siteUV) {
|
||||
console.warn('Umami Analytics: Invalid site UV data received')
|
||||
}
|
||||
if (siteUV && data && data.visitors) {
|
||||
siteUV.textContent = extractValue(data.visitors)
|
||||
} else if (siteUV) {
|
||||
console.warn('Umami Analytics: Invalid site UV data received')
|
||||
}
|
||||
|
||||
if (config.site_pv) {
|
||||
const sitePV = document.getElementById('umami-site-pv')
|
||||
if (sitePV && data && data.pageviews) {
|
||||
sitePV.textContent = extractValue(data.pageviews)
|
||||
} else if (sitePV) {
|
||||
console.warn('Umami Analytics: Invalid site PV data received')
|
||||
}
|
||||
if (sitePV && data && data.pageviews) {
|
||||
sitePV.textContent = extractValue(data.pageviews)
|
||||
} else if (sitePV) {
|
||||
console.warn('Umami Analytics: Invalid site PV data received')
|
||||
}
|
||||
})())
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user