diff options
author | Vincent Ambo <tazjin@google.com> | 2020-02-08T13·33+0000 |
---|---|---|
committer | Vincent Ambo <tazjin@google.com> | 2020-02-08T13·33+0000 |
commit | 15b871806b5ceb0a1c6f563e02c1ef79ee761412 (patch) | |
tree | 30677d52497736f71858b7d722b74f662c2dfff3 /web/blog/fragments.nix | |
parent | 1d7b1334fd4c2a9aff678891ce5f305be21e5c95 (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.nix | 81 |
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 [ "<" ">" "&" "'" ] [ "<" ">" "&" "'" ]; + + header = title: '' + <!DOCTYPE html> + <head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1"> + <meta name="description" content="tazjin'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's blog${lib.optionalString (title != "") ( + ": " + (escape title) + )}</title> + </head> + <body> + <header> + <h1><a class="unstyled-link" href="/">tazjin'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; +} |