Posts can now specify (optionally) tagfilter=true/false to toggle escaping of HTML tags. Change-Id: Ie4a1a45028570fc166fdffba708bf9d0e0c6ae81 Reviewed-on: https://cl.tvl.fyi/c/depot/+/9277 Tested-by: BuildkiteCI Reviewed-by: Mark Shevchenko <markshevchenko@gmail.com>
		
			
				
	
	
		
			70 lines
		
	
	
	
		
			2 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			70 lines
		
	
	
	
		
			2 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, pkgs, ... }@args:
 | 
						|
 | 
						|
with depot.nix.yants;
 | 
						|
 | 
						|
let
 | 
						|
  inherit (builtins) readFile;
 | 
						|
  inherit (depot.nix) renderMarkdown;
 | 
						|
  inherit (depot.web) atom-feed;
 | 
						|
  inherit (lib) singleton;
 | 
						|
 | 
						|
  # Type definition for a single blog post.
 | 
						|
  post = struct "blog-post" {
 | 
						|
    key = string;
 | 
						|
    title = string;
 | 
						|
    date = int;
 | 
						|
 | 
						|
    # Optional time at which this post was last updated.
 | 
						|
    updated = option int;
 | 
						|
 | 
						|
    # Path to the Markdown file containing the post content.
 | 
						|
    content = path;
 | 
						|
 | 
						|
    # Whether dangerous HTML tags should be filtered in this post. Can
 | 
						|
    # be disabled to, for example, embed videos in a post.
 | 
						|
    tagfilter = option bool;
 | 
						|
 | 
						|
    # Optional name of the author to display.
 | 
						|
    author = option string;
 | 
						|
 | 
						|
    # 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;
 | 
						|
  };
 | 
						|
 | 
						|
  # Rendering fragments for the HTML version of the blog.
 | 
						|
  fragments = import ./fragments.nix args;
 | 
						|
 | 
						|
  # Functions for generating feeds for these blogs using //web/atom-feed.
 | 
						|
  toFeedEntry = { baseUrl, ... }: defun [ post atom-feed.entry ] (post: rec {
 | 
						|
    id = "${baseUrl}/${post.key}";
 | 
						|
    title = post.title;
 | 
						|
    content = readFile (renderMarkdown post.content);
 | 
						|
    published = post.date;
 | 
						|
    updated = post.updated or post.date;
 | 
						|
 | 
						|
    links = singleton {
 | 
						|
      rel = "alternate";
 | 
						|
      href = id;
 | 
						|
    };
 | 
						|
  });
 | 
						|
in
 | 
						|
{
 | 
						|
  inherit post toFeedEntry;
 | 
						|
  inherit (fragments) renderPost;
 | 
						|
 | 
						|
  # Helper function to determine whether a post should be included in
 | 
						|
  # listings (on homepages, feeds, ...)
 | 
						|
  includePost = post: !(fragments.isDraft post) && !(fragments.isUnlisted post);
 | 
						|
}
 |