It's alive!

The static site generator has seen its first iteration and is spitting out static HTML pages.
The implementation is based on a simple templating system. All HTML pages are created with the following basic boiler plate:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>{{Title}}</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-T3c6CoIi6uLrA9TneNEoa7RxnatzjcDSCmG1MXxSR1GAsXEV/Dwwykc2MPK8M2HN" crossorigin="anonymous">
    <link rel="stylesheet" href="{{BasePath}}style.css">
</head>
<body class="d-flex flex-column min-vh-100 bg-light">
    <header>
        <nav class="navbar navbar-expand-md navbar-light bg-white border-bottom">
            <div class="container">
                <a class="navbar-brand fw-semibold" href="/">Home</a>
                {{PageNavHtml}}
            </div>
        </nav>
    </header>
    <main class="flex-grow-1 py-5">
        <div class="container">
            {{Content}}
        </div>
    </main>
    <footer class="py-4 mt-auto bg-white border-top">
        <div class="container">
            <p class="text-muted small mb-0">sorenlorentzen</p>
        </div>
    </footer>
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-C6RzsynM9kWDrMNeT87bh95OGNyZPhcTNXj1NW7RuBCsyN/o0jlpcV8Qyq46cDfL" crossorigin="anonymous"></script>
</body>
</html>

Currently, the system supports two types of content; blog posts and pages. Both types of content will be handled by the HTML generator, but the output will be slightly different.
Pages are stand-alone pages (like the About Me page), and each page will have its own link in the navbar in the template. Blog posts will initially have no references or index beyond the front page, so there's a discoverability problem I'll have to solve at some point.

Each blog post will be created with the following template. Static pages will use an identical template, just without the two dates. In a later iteration the two templates might be consolidated for simplicity.

<article class="card shadow-sm">
    <div class="card-body p-4 p-md-5">
        <header class="border-bottom pb-3 mb-4">
            <h1 class="card-title display-5 mb-2">{{Title}}</h1>
            <div class="text-muted small">
                <time datetime="{{CreatedDateIso}}">{{CreatedDate}}</time>
                <span class="mx-1">·</span>
                <time datetime="{{UpdatedDateIso}}">Updated {{UpdatedDate}}</time>
            </div>
        </header>
        <div class="post-content">
            {{HtmlContents}}
        </div>
    </div>
</article>

I have created an initial landing page with links to the individual blog posts. For now it will display the title of every blog post along with a summary of the blog post (created from the first 100 characters). I might have to implement a limit on the number of posts to display here, but for now it's everything. Here's the template:

<div class="card shadow-sm">
    <div class="card-body p-4 p-md-5">
        <h1 class="card-title display-5 mb-4">Latest posts</h1>
        <ul class="list-unstyled mb-0">
            {{PostListHtml}}
        </ul>
    </div>
</div>

Code highlighting - as seen above - is provided by highlight.js using the built-in github-min theme.