Compare commits

...
2 Commits
4 changed files with 114 additions and 91 deletions
+1 -1
View File
@@ -1,4 +1,4 @@
- var pjaxExclude = 'a:not([target="_blank"])' - var pjaxExclude = 'a:not([target="_blank"]):not([data-fancybox])'
if theme.pjax.exclude if theme.pjax.exclude
each val in theme.pjax.exclude each val in theme.pjax.exclude
- pjaxExclude += `:not([href="${val}"])` - pjaxExclude += `:not([href="${val}"])`
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "hexo-theme-butterfly", "name": "hexo-theme-butterfly",
"version": "5.6.0", "version": "5.6.1",
"description": "A Simple and Card UI Design theme for Hexo", "description": "A Simple and Card UI Design theme for Hexo",
"main": "package.json", "main": "package.json",
"scripts": { "scripts": {
+24 -22
View File
@@ -1,22 +1,24 @@
'use strict' 'use strict'
hexo.extend.helper.register('groupPosts', function () { // Read pre-built groups from tag/series.js (hexo._seriesGroups)
const getGroupArray = array => { // and sort each group according to the sidebar card config.
return array.reduce((groups, item) => { hexo.extend.helper.register('groupPosts', function () {
const key = item.series const groups = hexo._seriesGroups || {}
if (key) { const { orderBy = 'date', order = 1 } = this.theme.aside.card_post_series
groups[key] = groups[key] || []
groups[key].push(item) const result = {}
} Object.keys(groups).forEach(key => {
return groups const arr = groups[key].slice() // copy to avoid mutating the shared data
}, {}) if (orderBy === 'title') {
} arr.sort((a, b) => {
const cmp = a.title.toUpperCase().localeCompare(b.title.toUpperCase())
const sortPosts = posts => { return order === 1 ? cmp : -cmp
const { orderBy = 'date', order = 1 } = this.theme.aside.card_post_series })
if (orderBy === 'title') return posts.sort('title', order) } else {
return posts.sort('date', order) arr.sort((a, b) => order === 1 ? a.date - b.date : b.date - a.date)
} }
result[key] = arr
return getGroupArray(sortPosts(this.site.posts)) })
})
return result
})
+88 -67
View File
@@ -1,67 +1,88 @@
/** /**
* series plugin * series plugin
* Syntax: * Syntax:
* {% series [series name] %} * {% series [series name] %}
* Usage: * Usage:
* {% series %} * {% series %}
* {% series series1 %} * {% series series1 %}
*/ */
'use strict' 'use strict'
const urlFor = require('hexo-util').url_for.bind(hexo) const urlFor = require('hexo-util').url_for.bind(hexo)
const groups = {}
// Iterate all posts once and group by series name.
hexo.extend.filter.register('before_generate', () => { // Result is stored on hexo._seriesGroups, shared by both tag and helper.
Object.keys(groups).forEach(k => delete groups[k]) function buildSeriesGroups () {
}) const groups = {}
const posts = hexo.model('Post').toArray()
hexo.extend.filter.register('before_post_render', data => { for (let i = 0, len = posts.length; i < len; i++) {
if (!hexo.theme.config.series.enable) return data const p = posts[i]
if (p.series) {
const { layout, series } = data if (!groups[p.series]) groups[p.series] = []
if (layout === 'post' && series) { groups[p.series].push({
if (!groups[series]) groups[series] = [] title: p.title,
groups[series].push({ path: p.path,
title: data.title, date: p.date.unix()
path: data.path, })
date: data.date.unix() }
}) }
} return groups
return data }
})
// Build once before the first render (hexo generate / hexo server initial load).
function series (args) { // before_generate runs after tag rendering, so we need this as a fallback.
const { series } = hexo.theme.config hexo.extend.filter.register('before_post_render', data => {
if (!series.enable) { if (!hexo.theme.config.series.enable) return data
hexo.log.warn('Series plugin is disabled in the theme config') if (!hexo._seriesGroups) {
return '' hexo._seriesGroups = buildSeriesGroups()
} }
return data
const seriesArr = args.length ? groups[args[0]] : groups[this.series] })
if (!seriesArr) { // Rebuild after each generate cycle in hexo server to reflect latest post data.
hexo.log.warn(`There is no series named "${args[0]}"`) hexo.extend.filter.register('before_generate', () => {
return '' if (!hexo.theme.config.series.enable) return
} hexo._seriesGroups = buildSeriesGroups()
})
const isAsc = (series.order || 1) === 1 // 1: asc, -1: desc
const isSortByTitle = series.orderBy === 'title' function series (args) {
const { series } = hexo.theme.config
const compareFn = (a, b) => { if (!series.enable) {
const itemA = isSortByTitle ? a.title.toUpperCase() : a.date hexo.log.warn('Series plugin is disabled in the theme config')
const itemB = isSortByTitle ? b.title.toUpperCase() : b.date return ''
}
return itemA < itemB ? (isAsc ? -1 : 1) : itemA > itemB ? (isAsc ? 1 : -1) : 0
} const groupName = args.length ? args[0] : this.series
seriesArr.sort(compareFn) if (!groupName) {
hexo.log.warn('No series specified')
const listItems = seriesArr.map(ele => return ''
`<li><a href="${urlFor(ele.path)}" title="${ele.title}">${ele.title}</a></li>` }
).join('')
const groups = hexo._seriesGroups || {}
return series.number ? `<ol class="series-items">${listItems}</ol>` : `<ul class="series-items">${listItems}</ul>` const source = groups[groupName]
}
if (!source || !source.length) {
hexo.extend.tag.register('series', series, { ends: false }) hexo.log.warn(`There is no series named "${groupName}"`)
return ''
}
const isAsc = (series.order || 1) === 1
const isSortByTitle = series.orderBy === 'title'
// .slice() to copy before sorting, so we don't mutate the shared data
const seriesArr = source.slice().sort((a, b) => {
const itemA = isSortByTitle ? a.title.toUpperCase() : a.date
const itemB = isSortByTitle ? b.title.toUpperCase() : b.date
return itemA < itemB ? (isAsc ? -1 : 1) : itemA > itemB ? (isAsc ? 1 : -1) : 0
})
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">${listItems}</ol>` : `<ul class="series-items">${listItems}</ul>`
}
hexo.extend.tag.register('series', series, { ends: false })