72 lines
1.7 KiB
JavaScript
72 lines
1.7 KiB
JavaScript
/**
|
|
* notebooks v1
|
|
*/
|
|
const pagination = require('hexo-pagination')
|
|
|
|
function paginationWithEmpty(base, posts, options={}) {
|
|
const { layout, data = {} } = options
|
|
if (posts.length === 0) {
|
|
base = `${base}/`
|
|
return [{
|
|
path: base,
|
|
layout: layout,
|
|
data: {
|
|
...data,
|
|
base: base,
|
|
total: 1,
|
|
current: 1,
|
|
current_url: base,
|
|
posts: posts,
|
|
prev: 0,
|
|
prev_link: '',
|
|
next: 0,
|
|
next_link: '',
|
|
}
|
|
}]
|
|
} else {
|
|
return pagination(base, posts, options)
|
|
}
|
|
}
|
|
|
|
hexo.extend.generator.register('notebooks', function (locals) {
|
|
const { site_tree, notebooks } = hexo.theme.config
|
|
if (notebooks.tree.length === 0) {
|
|
return []
|
|
}
|
|
|
|
const routes = []
|
|
|
|
// The index page of all notebooks.
|
|
routes.push({
|
|
path: site_tree.notebooks.base_dir + '/index.html',
|
|
layout: ['notebooks'],
|
|
data: {
|
|
layout: 'notebooks',
|
|
menu_id: site_tree.notebooks.menu_id,
|
|
}
|
|
})
|
|
|
|
for (const notebook of Object.values(notebooks.tree)) {
|
|
const pages = locals.pages.filter(p => notebook.noteMap.has(p._id)).sort(notebook.order_by)
|
|
pages.data.sort((a, b) => notebook.noteMap.get(b._id).pin - notebook.noteMap.get(a._id).pin)
|
|
|
|
// Note list pages (for every tag) of current notebook.
|
|
for (const [_, tag] of notebook.tagTree) {
|
|
const notes = pages.filter(p => tag.noteSet.has(p._id))
|
|
const slices = paginationWithEmpty(tag.path, notes, {
|
|
perPage: notebook.per_page,
|
|
layout: ['notes'],
|
|
data: {
|
|
layout: 'notes',
|
|
menu_id: notebook.menu_id,
|
|
notebook: notebook.id,
|
|
activeTag: tag.id,
|
|
}
|
|
})
|
|
routes.push(...slices)
|
|
}
|
|
}
|
|
|
|
return routes
|
|
})
|