about summary refs log tree commit diff stats
path: root/src/domain
diff options
context:
space:
mode:
authorAlan Pearce2017-06-24 22:05:18 +0200
committerAlan Pearce2017-06-24 22:05:18 +0200
commitdd819c45b58088f9a98384ab237268d865836fe0 (patch)
treeabf2c2847571041454a9119dff7ccfc6b7d0f854 /src/domain
parentbdd6610208e9fe5971e6aed4378598092f2b9b5a (diff)
downloadhomestead-dd819c45b58088f9a98384ab237268d865836fe0.tar.lz
homestead-dd819c45b58088f9a98384ab237268d865836fe0.tar.zst
homestead-dd819c45b58088f9a98384ab237268d865836fe0.zip
refactor: re-architect to be closer to ADR
Diffstat (limited to 'src/domain')
-rw-r--r--src/domain/posts.js74
1 files changed, 74 insertions, 0 deletions
diff --git a/src/domain/posts.js b/src/domain/posts.js
new file mode 100644
index 0000000..14bc7cc
--- /dev/null
+++ b/src/domain/posts.js
@@ -0,0 +1,74 @@
+'use strict'
+
+const fs = require('fs')
+const path = require('path')
+const matter = require('gray-matter')
+
+const grayMatterOptions = {
+  lang: 'toml',
+  delims: '+++'
+}
+
+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 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 taxonomise (taxonomies, posts) {
+  const taxons = new Map(Object.keys(taxonomies).map(t => [t, new Map()]))
+
+  for (let [, post] of posts) {
+    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 taxons
+}
+
+module.exports = function (config) {
+  const posts = getFolder(config.folder)
+  const taxonomies = taxonomise(config.taxonomies, posts)
+  return {
+    posts,
+    taxonomies,
+    get
+  }
+}