]> git.r.bdr.sh - rbdr/blog/blobdiff - lib/archivers/gemlog.js
Add rudimentary gemlog archive support
[rbdr/blog] / lib / archivers / gemlog.js
diff --git a/lib/archivers/gemlog.js b/lib/archivers/gemlog.js
new file mode 100644 (file)
index 0000000..d50d411
--- /dev/null
@@ -0,0 +1,45 @@
+const { mkdir, readdir, rm, writeFile } = require('fs/promises');
+const { debuglog, promisify } = require('util');
+const { ncp } = require('ncp');
+const { join } = require('path');
+
+const internals = {
+  kArchiveName: '.gemlog',
+  kIndexName: 'index.gmi',
+  kGeminiRe: /\.gmi$/i,
+
+  ncp: promisify(ncp),
+  debuglog: debuglog('blog'),
+};
+
+module.exports = async function(archiveDirectory) {
+  internals.debuglog(`Reading archive ${archiveDirectory}`);
+  const postIds = await readdir(archiveDirectory)
+  const posts = [];
+  for (const id of postIds) {
+    const postDirectory = join(archiveDirectory, id);
+    const slug = (await readdir(postDirectory))
+        .filter((entry) => internals.kGeminiRe.test(entry))[0];
+
+      posts.push({ id, slug })
+  };
+
+  internals.debuglog(`Read ${posts.length} posts`);
+
+  const index = ['# Unlimited Pizza Gemlog Archive', '',
+    ...posts.map((post) => `=> ./${post.id}/${post.slug}`)].join('\n');
+
+  try {
+    internals.debuglog('Removing index');
+    await rm(internals.kArchiveName, { recursive: true });
+  }
+  finally {
+    internals.debuglog('Creating index');
+    await mkdir(internals.kArchiveName);
+    const indexFile = join(internals.kArchiveName, internals.kIndexName);
+    await writeFile(indexFile, index);
+
+    internals.debuglog('Copying posts to archive');
+    await internals.ncp(archiveDirectory, internals.kArchiveName);
+  }
+};