mirror of
https://github.com/wahyd4/vuepress.git
synced 2026-08-10 22:06:22 +10:00
72 lines
1.5 KiB
JavaScript
72 lines
1.5 KiB
JavaScript
import paginationMeta from '@dynamic/pagination'
|
|
|
|
class Pagination {
|
|
constructor (pagination, { pages, route }) {
|
|
let { postsFilter, postsSorter } = pagination
|
|
|
|
/* eslint-disable no-eval */
|
|
postsFilter = eval(postsFilter)
|
|
postsSorter = eval(postsSorter)
|
|
|
|
const { path } = route
|
|
const { paginationPages } = pagination
|
|
|
|
paginationPages.forEach((page, index) => {
|
|
if (page.path === path) {
|
|
this.paginationIndex = index
|
|
}
|
|
})
|
|
|
|
if (!this.paginationIndex) {
|
|
this.paginationIndex = 0
|
|
}
|
|
|
|
this._paginationPages = paginationPages
|
|
this._currentPage = paginationPages[this.paginationIndex]
|
|
this._posts = pages.filter(postsFilter).sort(postsSorter)
|
|
}
|
|
|
|
get length () {
|
|
return this._paginationPages.length
|
|
}
|
|
|
|
get posts () {
|
|
const [start, end] = this._currentPage.interval
|
|
return this._posts.slice(start, end + 1)
|
|
}
|
|
|
|
get hasPrev () {
|
|
return this.paginationIndex !== 0
|
|
}
|
|
|
|
get prevLink () {
|
|
if (this.hasPrev) {
|
|
return this._paginationPages[this.paginationIndex - 1].path
|
|
}
|
|
}
|
|
|
|
get hasNext () {
|
|
return this.paginationIndex !== this.length - 1
|
|
}
|
|
|
|
get nextLink () {
|
|
if (this.hasNext) {
|
|
return this._paginationPages[this.paginationIndex + 1].path
|
|
}
|
|
}
|
|
}
|
|
|
|
export default ({ Vue }) => {
|
|
Vue.mixin({
|
|
computed: {
|
|
$pagination () {
|
|
const { pages } = this.$site
|
|
const pagination = new Pagination(paginationMeta, {
|
|
pages, route: this.$route
|
|
})
|
|
return pagination
|
|
}
|
|
}
|
|
})
|
|
}
|