'use strict' 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] } } function canonicaliseMetadata (meta) { if (meta.data) { meta.data = new Map(lowercaseKeys(Object.entries(meta.data))) } else { meta.data = new Map() } return meta } 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) return canonicaliseMetadata(fileMatter) } function getFolder (folder) { return new Map( fs .readdirSync(folder) .map(f => path.resolve(folder, f)) .map(get) .map(f => [getTitle(f), f]) ) } function toTags (posts) { const tags = 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])) } } } return tags } module.exports = { get, getFolder, toTags, render }