mirror of
https://github.com/jerryc127/hexo-theme-butterfly.git
synced 2026-04-16 19:30:54 +08:00
breaking change:
1. 部分配置更改 feat: 1. 移除 messenger 聊天插件 2. 更新 fackbook 版本號 3. 增加 香港繁體、日文和韓語 4. 使用的新的複製api 代替舊的 5. 增加 umami 分析 6. 增加 umami 獲取訪問量/訪客數 7. snackbar 增加透明度 8. 文章頁下, nav fixed 下 顯示文章標題 improvement: 1. 代碼優化 2. 修改部分用語 3. 回復之前的相對時間邏輯 4. timeline tag 樣式優化 5. 優化 seo 6. 優化 artalk 的最新評論 fix: 1. tag-hide toggle 圓角問題 2. lazyload 為 false 時,artalk 無法正常加載評論的 bug 3. 修復 gallery 出現抖動的 bug
This commit is contained in:
@@ -10,11 +10,12 @@
|
||||
const urlFor = require('hexo-util').url_for.bind(hexo)
|
||||
|
||||
const btn = args => {
|
||||
args = args.join(' ').split(',')
|
||||
const [url = '', text = '', icon = '', option = ''] = args.map(arg => arg.trim())
|
||||
const [url = '', text = '', icon = '', option = ''] = args.join(' ').split(',').map(arg => arg.trim())
|
||||
|
||||
return `<a class="btn-beautify ${option}" href="${urlFor(url)}"
|
||||
title="${text}">${icon.length ? `<i class="${icon}"></i>` : ''}${text.length ? `<span>${text}</span>` : ''}</a>`
|
||||
const iconHTML = icon ? `<i class="${icon}"></i>` : ''
|
||||
const textHTML = text ? `<span>${text}</span>` : ''
|
||||
|
||||
return `<a class="btn-beautify ${option}" href="${urlFor(url)}" title="${text}">${iconHTML}${textHTML}</a>`
|
||||
}
|
||||
|
||||
hexo.extend.tag.register('btn', btn, { ends: false })
|
||||
|
||||
@@ -7,30 +7,25 @@
|
||||
const urlFor = require('hexo-util').url_for.bind(hexo)
|
||||
|
||||
const flinkFn = (args, content) => {
|
||||
content = hexo.render.renderSync({ text: content, engine: 'yaml' })
|
||||
|
||||
const data = hexo.render.renderSync({ text: content, engine: 'yaml' })
|
||||
let result = ''
|
||||
|
||||
content.forEach(i => {
|
||||
const className = i.class_name ? `<div class="flink-name">${i.class_name}</div>` : ''
|
||||
const classDesc = i.class_desc ? `<div class="flink-desc">${i.class_desc}</div>` : ''
|
||||
data.forEach(item => {
|
||||
const className = item.class_name ? `<div class="flink-name">${item.class_name}</div>` : ''
|
||||
const classDesc = item.class_desc ? `<div class="flink-desc">${item.class_desc}</div>` : ''
|
||||
|
||||
let listResult = ''
|
||||
const listResult = item.link_list.map(link => `
|
||||
<div class="flink-list-item">
|
||||
<a href="${link.link}" title="${link.name}" target="_blank">
|
||||
<div class="flink-item-icon">
|
||||
<img class="no-lightbox" src="${link.avatar}" onerror='this.onerror=null;this.src="${urlFor(hexo.theme.config.error_img.flink)}"' alt="${link.name}" />
|
||||
</div>
|
||||
<div class="flink-item-name">${link.name}</div>
|
||||
<div class="flink-item-desc" title="${link.descr}">${link.descr}</div>
|
||||
</a>
|
||||
</div>`).join('')
|
||||
|
||||
i.link_list.forEach(j => {
|
||||
listResult += `
|
||||
<div class="flink-list-item">
|
||||
<a href="${j.link}" title="${j.name}" target="_blank">
|
||||
<div class="flink-item-icon">
|
||||
<img class="no-lightbox" src="${j.avatar}" onerror='this.onerror=null;this.src="${urlFor(hexo.theme.config.error_img.flink)}"' alt="${j.name}" />
|
||||
</div>
|
||||
<div class="flink-item-name">${j.name}</div>
|
||||
<div class="flink-item-desc" title="${j.descr}">${j.descr}</div>
|
||||
</a>
|
||||
</div>`
|
||||
})
|
||||
|
||||
result += `${className}${classDesc} <div class="flink-list">${listResult}</div>`
|
||||
result += `${className}${classDesc}<div class="flink-list">${listResult}</div>`
|
||||
})
|
||||
|
||||
return `<div class="flink">${result}</div>`
|
||||
|
||||
@@ -14,9 +14,10 @@ const groups = {}
|
||||
|
||||
hexo.extend.filter.register('before_post_render', data => {
|
||||
if (!hexo.theme.config.series.enable) return data
|
||||
|
||||
const { layout, series } = data
|
||||
if (layout === 'post' && series) {
|
||||
groups[series] = groups[series] || []
|
||||
if (!groups[series]) groups[series] = []
|
||||
groups[series].push({
|
||||
title: data.title,
|
||||
path: data.path,
|
||||
@@ -47,23 +48,16 @@ function series (args) {
|
||||
const itemA = isSortByTitle ? a.title.toUpperCase() : a.date
|
||||
const itemB = isSortByTitle ? b.title.toUpperCase() : b.date
|
||||
|
||||
if (itemA < itemB) {
|
||||
return isAsc ? -1 : 1
|
||||
}
|
||||
if (itemA > itemB) {
|
||||
return isAsc ? 1 : -1
|
||||
}
|
||||
return 0
|
||||
return itemA < itemB ? (isAsc ? -1 : 1) : itemA > itemB ? (isAsc ? 1 : -1) : 0
|
||||
}
|
||||
|
||||
seriesArr.sort(compareFn)
|
||||
|
||||
let result = ''
|
||||
seriesArr.forEach(ele => {
|
||||
result += `<li><a href="${urlFor(ele.path)}" title="${ele.title}">${ele.title}</a></li>`
|
||||
})
|
||||
const listItems = seriesArr.map(ele =>
|
||||
`<li><a href="${urlFor(ele.path)}" title="${ele.title}">${ele.title}</a></li>`
|
||||
).join('')
|
||||
|
||||
return series.number ? `<ol class="series-items">${result}</ol>` : `<ul class="series-items">${result}</ul>`
|
||||
return series.number ? `<ol class="series-items">${listItems}</ol>` : `<ul class="series-items">${listItems}</ul>`
|
||||
}
|
||||
|
||||
hexo.extend.tag.register('series', series, { ends: false })
|
||||
|
||||
@@ -23,35 +23,27 @@ const postTabs = (args, content) => {
|
||||
}
|
||||
|
||||
for (let i = 0; i < matches.length; i += 2) {
|
||||
const tabParameters = matches[i].split('@')
|
||||
const [tabCaption = '', tabIcon = ''] = matches[i].split('@')
|
||||
let postContent = matches[i + 1]
|
||||
let tabCaption = tabParameters[0] || ''
|
||||
let tabIcon = tabParameters[1] || ''
|
||||
|
||||
postContent = hexo.render.renderSync({ text: postContent, engine: 'markdown' }).trim()
|
||||
|
||||
tabId += 1
|
||||
|
||||
if (tabCaption.length === 0 && tabIcon.length === 0) tabCaption = tabName + ' ' + tabId
|
||||
const caption = (tabCaption || tabIcon) ? tabCaption : `${tabName} ${tabId}`
|
||||
const iconHtml = tabIcon ? `<i class="${tabIcon.trim()}"></i>` : ''
|
||||
const isActive = (tabActive > 0 && tabActive === tabId) || (tabActive === 0 && tabId === 1) ? ' active' : ''
|
||||
|
||||
const icon = tabIcon.trim()
|
||||
tabIcon.length > 0 && (tabIcon = `<i class="${icon}"></i>`)
|
||||
if (isActive) noDefault = false
|
||||
|
||||
let isActive = ''
|
||||
if ((tabActive > 0 && tabActive === tabId) || (tabActive === 0 && tabId === 1)) {
|
||||
isActive = ' active'
|
||||
noDefault = false
|
||||
}
|
||||
tabNav += `<button type="button" class="tab${isActive}">${tabIcon + tabCaption.trim()}</button>`
|
||||
tabNav += `<button type="button" class="tab${isActive}">${iconHtml}${caption.trim()}</button>`
|
||||
tabContent += `<div class="tab-item-content${isActive}">${postContent}</div>`
|
||||
}
|
||||
|
||||
const toTop = '<div class="tab-to-top"><button type="button" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div>'
|
||||
|
||||
tabNav = `<div class="nav-tabs${noDefault ? ' no-default' : ''}">${tabNav}</div>`
|
||||
tabContent = `<div class="tab-contents">${tabContent}</div>`
|
||||
|
||||
return `<div class="tabs">${tabNav + tabContent + toTop}</div>`
|
||||
return `<div class="tabs">${tabNav}${tabContent}${toTop}</div>`
|
||||
}
|
||||
|
||||
hexo.extend.tag.register('tabs', postTabs, { ends: true })
|
||||
|
||||
@@ -35,7 +35,7 @@ const timeLineFn = (args, content) => {
|
||||
result += `<div class='timeline-item'>${tlTitleHtml + tlContentHtml}</div>`
|
||||
}
|
||||
|
||||
return `<div class="timeline ${color}">${result}</div>`
|
||||
return `<div class="timeline ${color || ''}">${result}</div>`
|
||||
}
|
||||
|
||||
hexo.extend.tag.register('timeline', timeLineFn, { ends: true })
|
||||
|
||||
Reference in New Issue
Block a user