mirror of
https://github.com/jerryc127/hexo-theme-butterfly.git
synced 2026-04-08 12:07:06 +08:00
- 新增本地搜索分頁配置 (enablePagination, hitsPerPage) - 重構 Algolia 搜索邏輯,支援多索引和更好的錯誤處理 - 優化搜索 UI 樣式,包括分頁按鈕和響應式設計 - 改進搜索結果顯示,新增編號和更好的高亮處理 📦 依賴項更新: - 更新 plugins.yml 中的多個插件版本 (abcjs, algolia, aplayer 等) - 更新 package.json 版本號為 5.5.0 🎨 UI/UX 優化: - 改進側邊欄和目錄的動畫效果 - 優化樣式佈局,調整寬度百分比 - 新增說說頁面的分頁導航組件 - 改進右側邊欄按鈕樣式 🐛 錯誤處理和代碼優化: - 修復 Umami Analytics 的錯誤處理和數據驗證 - 改進懶加載圖片的正則表達式,避免匹配腳本標籤 - 移除未使用的變數和改進代碼結構 - 新增說說內容的 Markdown 渲染支援 🔧 其他改進: - 更新翻譯功能,移除箭頭函數語法以提升相容性
110 lines
3.8 KiB
Plaintext
110 lines
3.8 KiB
Plaintext
- let { serverURL, website_id, option, UV_PV } = theme.umami_analytics
|
|
- const isServerURL = !!serverURL
|
|
- const baseURL = serverURL ? serverURL.replace(/\/$/, '') : 'https://cloud.umami.is'
|
|
- const apiUrl = serverURL ? serverURL.replace(/\/$/, '') + '/api' : 'https://api.umami.is/v1'
|
|
|
|
script.
|
|
(() => {
|
|
const option = !{JSON.stringify(option)}
|
|
const config = !{JSON.stringify(UV_PV)}
|
|
|
|
const runTrack = () => {
|
|
if (typeof umami !== 'undefined' && typeof umami.track === 'function') {
|
|
umami.track(props => ({ ...props, url: window.location.pathname, title: GLOBAL_CONFIG_SITE.title }))
|
|
} else {
|
|
console.warn('Umami Analytics: umami.track is not available')
|
|
}
|
|
}
|
|
|
|
const loadUmamiJS = () => {
|
|
btf.getScript('!{baseURL}/script.js', {
|
|
'data-website-id': '!{website_id}',
|
|
'data-auto-track': 'false',
|
|
...option
|
|
}).then(() => {
|
|
runTrack()
|
|
}).catch(error => {
|
|
console.error('Umami Analytics: Error loading script', error)
|
|
})
|
|
}
|
|
|
|
const getData = async (isPost) => {
|
|
try {
|
|
const now = Date.now()
|
|
const keyUrl = isPost ? `&url=${window.location.pathname}` : ''
|
|
const headerList = { 'Accept': 'application/json' }
|
|
|
|
if (!{isServerURL}) {
|
|
headerList['Authorization'] = `Bearer ${config.token}`
|
|
} else {
|
|
headerList['x-umami-api-key'] = config.token
|
|
}
|
|
|
|
const res = await fetch(`!{apiUrl}/websites/!{website_id}/stats?startAt=0000000000&endAt=${now}${keyUrl}`, {
|
|
method: "GET",
|
|
headers: headerList
|
|
})
|
|
|
|
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 insertData = async () => {
|
|
try {
|
|
if (GLOBAL_CONFIG_SITE.pageType === 'post' && config.page_pv) {
|
|
const pagePV = document.getElementById('umamiPV')
|
|
if (pagePV) {
|
|
const data = await getData(true)
|
|
if (data && data.pageviews && typeof data.pageviews.value !== 'undefined') {
|
|
pagePV.textContent = data.pageviews.value
|
|
} else {
|
|
console.warn('Umami Analytics: Invalid page view data received')
|
|
}
|
|
}
|
|
}
|
|
|
|
if (config.site_uv || config.site_pv) {
|
|
const data = await getData(false)
|
|
|
|
if (config.site_uv) {
|
|
const siteUV = document.getElementById('umami-site-uv')
|
|
if (siteUV && data && data.visitors && typeof data.visitors.value !== 'undefined') {
|
|
siteUV.textContent = data.visitors.value
|
|
} 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 && typeof data.pageviews.value !== 'undefined') {
|
|
sitePV.textContent = data.pageviews.value
|
|
} else if (sitePV) {
|
|
console.warn('Umami Analytics: Invalid site PV data received')
|
|
}
|
|
}
|
|
}
|
|
} catch (error) {
|
|
console.error('Umami Analytics: Failed to insert data', error)
|
|
}
|
|
}
|
|
|
|
btf.addGlobalFn('pjaxComplete', runTrack, 'umami_analytics_run_track')
|
|
btf.addGlobalFn('pjaxComplete', insertData, 'umami_analytics_insert')
|
|
|
|
|
|
loadUmamiJS()
|
|
|
|
if (document.readyState === 'loading') {
|
|
document.addEventListener('DOMContentLoaded', insertData)
|
|
} else {
|
|
setTimeout(insertData, 100)
|
|
}
|
|
})() |