diff options
author | Alan Pearce | 2017-07-20 18:08:12 +0200 |
---|---|---|
committer | Alan Pearce | 2017-07-20 18:08:12 +0200 |
commit | 7bf25f232569aa62edf1c88e7014a9f3c1b37014 (patch) | |
tree | 7d7d40cfa295c405427cb3bc859757b1effb0e71 /src | |
parent | a62fb1e7584ffa53a256ff8ce4d6a451ca542f20 (diff) | |
download | homestead-7bf25f232569aa62edf1c88e7014a9f3c1b37014.tar.lz homestead-7bf25f232569aa62edf1c88e7014a9f3c1b37014.tar.zst homestead-7bf25f232569aa62edf1c88e7014a9f3c1b37014.zip |
feat: Create feed handler for root
Diffstat (limited to 'src')
-rw-r--r-- | src/app.js | 13 | ||||
-rw-r--r-- | src/domain/posts.js | 2 | ||||
-rw-r--r-- | src/responders.js | 42 | ||||
-rw-r--r-- | src/templates/feed.xml | 24 |
4 files changed, 79 insertions, 2 deletions
diff --git a/src/app.js b/src/app.js index 912dda2..a323b9c 100644 --- a/src/app.js +++ b/src/app.js @@ -13,6 +13,13 @@ const config = require("./modules/config.js"); const Router = require("koa-router"); const router = new Router(); +const makeTagURI = (authority, startDate) => specific => + `tag:${authority},${startDate}:${specific}`; + +app.context.makeTagURI = makeTagURI( + config.feed.originalDomainName, + config.feed.domainStartDate +); app.context.getURL = router.url.bind(router); module.exports = async function() { @@ -35,6 +42,12 @@ module.exports = async function() { ); router.get( + "feed", + "/index.xml", + actions.posts(config, responders.feed, Posts.posts) + ); + + router.get( "post", "/post/:filename", actions.post(config, responders.post, Posts.posts) diff --git a/src/domain/posts.js b/src/domain/posts.js index 98488ba..ab35518 100644 --- a/src/domain/posts.js +++ b/src/domain/posts.js @@ -86,7 +86,9 @@ function taxonomise(taxonomies, posts) { module.exports = async function(config, getURL) { const posts = await getFolder(config.folder, getURL); const taxonomies = taxonomise(config.taxonomies, posts); + const lastPostDate = Math.max(Array.from(posts.values(), p => p.date)); return { + lastPostDate, posts, taxonomies, get diff --git a/src/responders.js b/src/responders.js index 8f084a3..f4ea0a6 100644 --- a/src/responders.js +++ b/src/responders.js @@ -1,6 +1,7 @@ "use strict"; const fs = require("fs"); +const URL = require("url").URL; const Case = require("case"); const hyperfast = require("hyperfast"); const indent = require("indent-string"); @@ -25,7 +26,7 @@ const findPostContent = /^(\s+)<div class="e-content/m; const postIndentLevel = baseIndentLevel + getTemplateIndent(findPostContent, "post.html"); -function indentForTemplate(text, indentLevel) { +function indentForTemplate(text, indentLevel = 0) { return indent(text, indentLevel).slice(indentLevel).replace(/\n+$/, ""); } @@ -37,7 +38,8 @@ const templates = { layout: templateReader("layout.html"), home: templateReader("home.html", baseIndentLevel), post: templateReader("post.html", baseIndentLevel), - list: templateReader("list.html", baseIndentLevel) + list: templateReader("list.html", baseIndentLevel), + feed: templateReader("feed.xml") }; function title(siteTitle, pageTitle) { @@ -62,6 +64,22 @@ const renderPost = ctx => post => { }; }; +const renderPostAtom = (ctx, config) => post => { + return { + id: ctx.makeTagURI(`post:${post.basename}`), + title: post.data.get("title"), + updated: post.data.get("date"), + summary: post.data.get("summary"), + "link[rel=alternate]": { + href: new URL(ctx.getURL("post", post.basename), config.site.baseURL) + }, + "content > div": { + _html: post.body + }, + "author > name": config.author.name + }; +}; + function layout(config, pageTitle, pageElement) { return hyperfast(templates.layout, { title: title(config.author.name, pageTitle), @@ -125,5 +143,25 @@ module.exports = { post.data.get("title"), hyperfast(templates.post, renderPost(ctx)(post)) ); + }, + + feed(ctx, config, { posts, lastPostDate }) { + ctx.type = "atom"; + + ctx.body = hyperfast( + templates.feed, + { + "feed > title": config.author.name, + "feed > link": { + href: config.site.baseURL + }, + "feed > id": { + _text: ctx.makeTagURI("feed") + }, + "feed > updated": lastPostDate, + "feed > entry": posts.map(renderPostAtom(ctx, config)) + }, + { xmlMode: true } + ).outerHTML; } }; diff --git a/src/templates/feed.xml b/src/templates/feed.xml new file mode 100644 index 0000000..03d68d7 --- /dev/null +++ b/src/templates/feed.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8"?> +<feed xmlns="http://www.w3.org/2005/Atom"> + <title>Example Feed</title> + <link href="http://example.org/"/> + <id>urn:uuid:60a76c80-d399-11d9-b91C-0003939e0af6</id> + <updated>2003-12-13T18:30:02Z</updated> + + <entry> + <title>Atom-Powered Robots Run Amok</title> + <link rel="alternate" type="text/html" href="http://example.org/2003/12/13/atom03.html"/> + <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id> + <updated>2003-12-13T18:30:02Z</updated> + <summary>Some text.</summary> + <content type="xhtml"> + <div xmlns="http://www.w3.org/1999/xhtml"> + <p>This is the entry content.</p> + </div> + </content> + <author> + <name>John Doe</name> + </author> + </entry> + +</feed> |