From 33171a749162685e42650f82041cd2af0136718d Mon Sep 17 00:00:00 2001 From: Alan Pearce Date: Sun, 18 Jun 2017 17:42:21 +0200 Subject: feat(posts): render posts as markdown --- package.json | 3 ++- src/index.js | 4 +++- src/modules/posts.js | 15 ++++++++++++++- src/views/post.html | 2 +- test/index.test.js | 2 +- yarn.lock | 28 ++++++++++++++++++++++++++++ 6 files changed, 49 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 03179cd..e25d390 100644 --- a/package.json +++ b/package.json @@ -29,9 +29,10 @@ "supertest": "^3.0.0" }, "dependencies": { + "gray-matter": "^2.1.1", "koa": "^2.2.0", "koa-nunjucks-next": "^1.1.3", "koa-router": "^7.2.1", - "gray-matter": "^2.1.1" + "markdown-it": "^8.3.1" } } diff --git a/src/index.js b/src/index.js index 07d7249..fce4c09 100644 --- a/src/index.js +++ b/src/index.js @@ -24,8 +24,10 @@ router.get('/', async function (ctx) { router.get('/post/:filename', async function (ctx) { ctx.assert(posts.has(ctx.params.filename), 404, 'Post not found') + const post = posts.get(ctx.params.filename) + post.body = Posts.render(post) await ctx.render('post', { - post: posts.get(ctx.params.filename) + post: post }) }) diff --git a/src/modules/posts.js b/src/modules/posts.js index 011292b..cba2372 100644 --- a/src/modules/posts.js +++ b/src/modules/posts.js @@ -3,12 +3,20 @@ const fs = require('fs') const path = require('path') const matter = require('gray-matter') +const Markdown = require('markdown-it') const grayMatterOptions = { lang: 'toml', delims: '+++' } +const markdownOptions = { + html: true, + typographer: true +} + +const markdown = new Markdown(markdownOptions) + function* lowercaseKeys (iterator) { for (let [k, v] of iterator) { yield [String(k).toLowerCase(), v] @@ -28,6 +36,10 @@ function getTitle (file) { return path.basename(file.path, path.extname(file.path)) } +function render (post) { + return markdown.render(post.content) +} + function get (filename) { const fileMatter = matter.read(filename, grayMatterOptions) fileMatter.basename = getTitle(fileMatter) @@ -59,5 +71,6 @@ function toTags (posts) { module.exports = { get, getFolder, - toTags + toTags, + render } diff --git a/src/views/post.html b/src/views/post.html index fcc4dbd..81f7e3d 100644 --- a/src/views/post.html +++ b/src/views/post.html @@ -1,3 +1,3 @@ {{ post.data.title }} -{{ post.content }} +{{ post.body | safe }} diff --git a/test/index.test.js b/test/index.test.js index a81dbb6..e13e52c 100644 --- a/test/index.test.js +++ b/test/index.test.js @@ -18,7 +18,7 @@ test('post', t => { return request(app.listen()) .get('/post/testfile') .expect(200) - .expect(/Lorem ipsum/) + .expect(/

Lorem ipsum<\/h1>/) .then(() => t.pass()) }) diff --git a/yarn.lock b/yarn.lock index f92a4f8..297ce30 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1263,6 +1263,10 @@ empower-core@^0.6.1: call-signature "0.0.2" core-js "^2.0.0" +entities@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" + equal-length@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/equal-length/-/equal-length-1.0.1.tgz#21ca112d48ab24b4e1e7ffc0e5339d31fdfc274c" @@ -2596,6 +2600,12 @@ levn@^0.3.0, levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" +linkify-it@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-2.0.3.tgz#d94a4648f9b1c179d64fa97291268bdb6ce9434f" + dependencies: + uc.micro "^1.0.1" + lint-staged@^3.6.1: version "3.6.1" resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-3.6.1.tgz#24423c8b7bd99d96e15acd1ac8cb392a78e58582" @@ -2795,6 +2805,16 @@ map-obj@^1.0.0, map-obj@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" +markdown-it@^8.3.1: + version "8.3.1" + resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-8.3.1.tgz#2f4b622948ccdc193d66f3ca2d43125ac4ac7323" + dependencies: + argparse "^1.0.7" + entities "~1.1.1" + linkify-it "^2.0.0" + mdurl "^1.0.1" + uc.micro "^1.0.3" + matcher@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/matcher/-/matcher-0.1.2.tgz#ef20cbde64c24c50cc61af5b83ee0b1b8ff00101" @@ -2817,6 +2837,10 @@ md5-o-matic@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/md5-o-matic/-/md5-o-matic-0.1.1.tgz#822bccd65e117c514fab176b25945d54100a03c3" +mdurl@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" + media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" @@ -4196,6 +4220,10 @@ typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" +uc.micro@^1.0.1, uc.micro@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.3.tgz#7ed50d5e0f9a9fb0a573379259f2a77458d50192" + uid-number@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" -- cgit 1.4.1