about summary refs log tree commit diff
path: root/web/blog/fragments.nix
diff options
context:
space:
mode:
authorVincent Ambo <tazjin@google.com>2020-02-08T13·33+0000
committerVincent Ambo <tazjin@google.com>2020-02-08T13·33+0000
commit15b871806b5ceb0a1c6f563e02c1ef79ee761412 (patch)
tree30677d52497736f71858b7d722b74f662c2dfff3 /web/blog/fragments.nix
parent1d7b1334fd4c2a9aff678891ce5f305be21e5c95 (diff)
feat(web/blog): Add Nix-based static blog generator r/484
This introduces a derivation which builds an instance of nginx
statically serving my blog posts, though as of now no indexes are
being generated and no XML feed is available.

This is just the initial draft of this setup and not yet what shall be
yielded in the end.
Diffstat (limited to 'web/blog/fragments.nix')
-rw-r--r--web/blog/fragments.nix81
1 files changed, 81 insertions, 0 deletions
diff --git a/web/blog/fragments.nix b/web/blog/fragments.nix
new file mode 100644
index 000000000000..2c9127b7f713
--- /dev/null
+++ b/web/blog/fragments.nix
@@ -0,0 +1,81 @@
+# This file defines various fragments of the blog, such as the header
+# and footer, as functions that receive arguments to be templated into
+# them.
+#
+# An entire post is rendered by `renderPost`, which assembles the
+# fragments together in a runCommand execution.
+#
+# The post overview is rendered by 'postList'.
+{ pkgs, lib, ... }:
+
+let
+  inherit (builtins) filter map hasAttr replaceStrings toFile;
+  inherit (pkgs.third_party) runCommandNoCC writeText;
+
+  escape = replaceStrings [ "<" ">" "&" "'" ] [ "&lt;" "&gt;" "&amp;" "&#39;" ];
+
+  header = title: ''
+  <!DOCTYPE html>
+  <head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+    <meta name="description" content="tazjin&#39;s blog">
+    <link rel="stylesheet" type="text/css" href="static/blog.css" media="all">
+    <link rel="alternate" type="application/rss+xml" title="RSS-Feed" href="/rss.xml">
+    <title>tazjin&#39;s blog${lib.optionalString (title != "") (
+      ": " + (escape title)
+    )}</title>
+  </head>
+  <body>
+    <header>
+      <h1><a class="unstyled-link" href="/">tazjin&#39;s blog</a> </h1>
+      <hr>
+    </header>
+  '';
+
+  footer = ''
+    <hr>
+    <footer>
+      <p class="footer">
+        <a class="uncoloured-link" href="https://tazj.in">homepage</a>
+        |
+        <a class="uncoloured-link" href="https://git.tazj.in/about">code</a>
+        |
+        <a class="uncoloured-link" href="https://twitter.com/tazjin">twitter</a>
+      </p>
+      <p class="lod">ಠ_ಠ</p>
+    </footer>
+  </body>
+  '';
+
+  renderPost = post: runCommandNoCC "${post.key}.html" {} ''
+    cat ${toFile "header.html" (header post.title)} > $out
+
+    # Write the actual post
+    echo '<article><h2 class="inline">${escape post.title}</h2>' >> $out
+    echo '<aside class="date">${post.date}</aside>' >> $out
+    cat ${post.content} | ${pkgs.tools.cheddar}/bin/cheddar --about-filter ${post.content} >> $out
+    echo '</article>' >> $out
+
+    cat ${toFile "footer.html" footer} >> $out
+  '';
+
+  # Generate a post list for all listed, non-draft posts.
+  isDraft = post: (hasAttr "draft" post) && post.draft;
+  isUnlisted = post: (hasAttr "listed" post) && !post.listed;
+  includePost = post: !(isDraft post) && !(isUnlisted post);
+
+  indexEntry= post: "<li>a blog post</li>";
+  blogIndex = posts: writeText "blog-index.html" (lib.concatStrings (
+    [
+      (header "")
+      "<ul>"
+    ]
+    ++ (map indexEntry (filter includePost posts))
+    ++ [
+      "</ul>"
+      footer
+    ]));
+in {
+  inherit blogIndex renderPost;
+}