59 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			59 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
# This creates the static files that make up my blog from the Markdown
 | 
						|
# files in this repository.
 | 
						|
#
 | 
						|
# All blog posts are rendered from Markdown by cheddar.
 | 
						|
{ depot, lib, ... }@args:
 | 
						|
 | 
						|
with depot.nix.yants;
 | 
						|
 | 
						|
let
 | 
						|
  inherit (builtins) filter hasAttr map;
 | 
						|
 | 
						|
  # Type definition for a single blog post.
 | 
						|
  post = struct "blog-post" {
 | 
						|
    key = string; #
 | 
						|
    title = string;
 | 
						|
    date = int;
 | 
						|
 | 
						|
    # Path to the Markdown file containing the post content.
 | 
						|
    content = path;
 | 
						|
 | 
						|
    # Should this post be included in the index? (defaults to true)
 | 
						|
    listed = option bool;
 | 
						|
 | 
						|
    # Is this a draft? (adds a banner indicating that the link should
 | 
						|
    # not be shared)
 | 
						|
    draft = option bool;
 | 
						|
 | 
						|
    # Previously each post title had a numeric ID. For these numeric
 | 
						|
    # IDs, redirects are generated so that old URLs stay compatible.
 | 
						|
    oldKey = option string;
 | 
						|
  };
 | 
						|
 | 
						|
  posts = list post (import ./posts.nix);
 | 
						|
  fragments = import ./fragments.nix args;
 | 
						|
 | 
						|
  rendered = depot.third_party.runCommandNoCC "tazjins-blog" {} ''
 | 
						|
    mkdir -p $out
 | 
						|
 | 
						|
    ${lib.concatStringsSep "\n" (map (post:
 | 
						|
      "cp ${fragments.renderPost post} $out/${post.key}.html"
 | 
						|
    ) posts)}
 | 
						|
  '';
 | 
						|
 | 
						|
  includePost = post: !(fragments.isDraft post) && !(fragments.isUnlisted post);
 | 
						|
in {
 | 
						|
  inherit post rendered;
 | 
						|
  static = ./static;
 | 
						|
 | 
						|
  # Only include listed posts
 | 
						|
  posts = filter includePost posts;
 | 
						|
 | 
						|
  # Generate embeddable nginx configuration for redirects from old post URLs
 | 
						|
  oldRedirects = lib.concatStringsSep "\n" (map (post: ''
 | 
						|
    location ~* ^(/en)?/${post.oldKey} {
 | 
						|
      # TODO(tazjin): 301 once this works
 | 
						|
      return 302 https://tazj.in/blog/${post.key};
 | 
						|
    }
 | 
						|
  '') (filter (hasAttr "oldKey") posts));
 | 
						|
}
 |