ProjectTemplate/Build.ps1

<#
.SYNOPSIS
Build a static HTML site from Markdown files.
#>

[string]$SCRIPT:projectDir = Split-Path -Parent $MyInvocation.MyCommand.Path
Import-Module -Name MarkDownToHTML

$OutputEncoding = [System.Text.Encoding]::UTF8 # Send utf8 to external programs

# Load JSON configuration
$SCRIPT:config = Get-Content (Join-Path $projectDir 'Build.json') | ConvertFrom-Json
if (!$config) {
    throw 'No build configuration found!'
}

# Determine the location of the static HTML site to build.
$SCRIPT:staticSite = Join-Path $projectDir $config.site_dir

# Clean up the static HTML site before build.
Remove-Item $staticSite -Recurse -Force -ErrorAction:SilentlyContinue

# Set-up the content mapping rules for replacing template placeholders
# of the form {{name}}.
$SCRIPT:contentMap = @{
    # Add additional mappings here...
    '{{footer}}' = {
        param($fragment)
        $fragment.EffectiveConfiguration.Footer # Fetch footer text from configuration
    }
    '{{nav}}'    = {
        param($fragment) # the annotated html fragment created from a markdown file
        $cfg = $fragment.EffectiveConfiguration
        $navcfg = $cfg.navigation_bar # navigation bar configuration
        # Create the navigation items configured in 'Build.json'
        New-SiteNavigation -NavitemSpecs $cfg.site_navigation `
                           -RelativePath $fragment.RelativePath `
                           -NavTemplate $navcfg.templates
        # Create navigation items to headings on the local page.
        # This requires the `autoidentifiers` extension to be enabled!
        New-PageHeadingNavigation -NavitemSpecs $cfg.page_navigation_header `
                                  -HTMLfragment $fragment `
                                  -NavTemplate $navcfg.templates `
                                  -HeadingLevels $navcfg.capture_page_headings
    }
}

# Conversion pipeline
$SCRIPT:markdown = Join-Path $projectDir $config.markdown_dir
Find-MarkdownFiles $markdown -Exclude $config.Exclude -BuildConfiguration $config `
| Convert-MarkdownToHTMLFragment -IncludeExtension $config.markdown_extensions -Split `
| Convert-SvgbobToSvg -SiteDirectory $staticSite `
| Publish-StaticHTMLSite -Template (Join-Path $projectDir $config.HTML_Template) `
                         -ContentMap  $contentMap `
                         -MediaDirectory $markdown `
                         -SiteDirectory $staticSite

if ($config.github_pages) {
    # Switch off Jekyll publishing when building for GitHub pages
    New-Item -Path $staticSite -Name .nojekyll -ItemType File
}