From e58d6a1718b3358f91fbda10e2291ea4ec01d1e7 Mon Sep 17 00:00:00 2001 From: Alan Pearce Date: Sun, 18 Jun 2017 21:01:14 +0200 Subject: feat: make taxonomies configurable Add "tag" and "category" as defaults --- src/index.js | 21 ++++++++++++++------- src/modules/posts.js | 24 ++++++++++++++++++------ 2 files changed, 32 insertions(+), 13 deletions(-) (limited to 'src') diff --git a/src/index.js b/src/index.js index 6df1530..52bdff0 100644 --- a/src/index.js +++ b/src/index.js @@ -37,14 +37,21 @@ router.get('/post/:filename', async function (ctx) { }) }) -const tags = Posts.toTags(posts) -router.get('/tags/:tag', async function (ctx) { - ctx.assert(tags.has(ctx.params.tag), 404, 'Tag not found') - await ctx.render('tag', { - tag: ctx.params.tag, - posts: tags.get(ctx.params.tag) +const taxonomies = Posts.taxonomise(config.taxonomies, posts) +for (let [term, items] of taxonomies) { + router.get(`/${term}/:value`, async function (ctx) { + const value = ctx.params.value + ctx.assert( + items.has(ctx.params.value), + 404, + `Could not find ${term} ${value}` + ) + await ctx.render('tag', { + [term]: value, + posts: items.get(ctx.params.value) + }) }) -}) +} app.use(router.routes()).use(router.allowedMethods()) diff --git a/src/modules/posts.js b/src/modules/posts.js index cba2372..cf2d80e 100644 --- a/src/modules/posts.js +++ b/src/modules/posts.js @@ -56,21 +56,33 @@ function getFolder (folder) { ) } -function toTags (posts) { - const tags = new Map() +function taxonomise (taxonomies, posts) { + const taxons = new Map(Object.keys(taxonomies).map(t => [t, new Map()])) + for (let [, post] of posts) { - if (post.data.has('tags')) { - for (let tag of post.data.get('tags')) { - tags.set(tag, (tags.get(tag) || []).concat([post])) + for (let [singularName, pluralName] of Object.entries(taxonomies)) { + if (post.data.has(pluralName)) { + for (let term of post.data.get(pluralName)) { + const current = taxons.get(singularName).get(term) + taxons + .get(singularName) + .set(term, current ? current.concat(post) : [post]) + } } } } - return tags + + return taxons +} + +function toTags (posts) { + return taxonomise({ tag: 'tags' }, posts).get('tag') } module.exports = { get, getFolder, toTags, + taxonomise, render } -- cgit 1.4.1