Private/ConvertTo-PlumberTaskMarkdown.ps1

function ConvertTo-PlumberTaskMarkdown {
    <#
        .SYNOPSIS
        Converts Plumber task help metadata to Markdown.

        .DESCRIPTION
        Builds the generated Markdown page for a parsed Plumber task help
        object.

        .PARAMETER Help
        The parsed task help metadata.

        .PARAMETER AllHelp
        All parsed task help metadata, used to build navigation links.

        .EXAMPLE
        ConvertTo-PlumberTaskMarkdown -Help $help

        Returns Markdown for the task help page.
    #>

    [CmdletBinding()]
    [OutputType([string])]
    param (
        [Parameter(Mandatory)]
        [pscustomobject]
        $Help,

        [pscustomobject[]]
        $AllHelp = @()
    )

    $lines = [System.Collections.Generic.List[string]]::new()
    $lines.Add("# $($Help.Name)")
    $lines.Add('')

    Add-PlumberTaskMarkdownSection -Lines $lines -Title 'Synopsis' -Content $Help.Synopsis
    Add-PlumberTaskMarkdownSection -Lines $lines -Title 'Description' -Content $Help.Description

    if ($Help.Group) {
        Add-PlumberTaskMarkdownSection -Lines $lines -Title 'Group' -Content $Help.Group
    }

    if ($Help.Includes) {
        $includes = @(
            foreach ($include in $Help.Includes) {
                '- `' + $include + '`'
            }
        ) -join "`n"
        Add-PlumberTaskMarkdownSection -Lines $lines -Title 'Includes' -Content $includes
    }

    Add-PlumberTaskMarkdownSection -Lines $lines -Title 'Configuration' -Content $Help.Configuration
    Add-PlumberTaskMarkdownSection -Lines $lines -Title 'Run' -Content $Help.Run
    Add-PlumberTaskMarkdownSection -Lines $lines -Title 'Pass' -Content $Help.Pass
    Add-PlumberTaskMarkdownSection -Lines $lines -Title 'Fail' -Content $Help.Fail

    $navigation = [System.Collections.Generic.List[string]]::new()
    $navigation.Add('- [Task index](index.md)')

    if ($Help.Group) {
        $navigation.Add("- [Group: $($Help.Group)]($($Help.Group).md)")
        $siblings = @(
            $AllHelp |
                Where-Object {$_.Group -eq $Help.Group -and -not $_.Includes} |
                Sort-Object Name
        )
    } else {
        $siblings = @(
            $AllHelp |
                Where-Object Includes |
                Sort-Object Name
        )
    }

    $currentIndex = [array]::IndexOf(@($siblings.Name), $Help.Name)
    if ($currentIndex -gt 0) {
        $previous = $siblings[$currentIndex - 1]
        $navigation.Add("- Previous: [$($previous.Name)]($($previous.Name).md)")
    }
    if ($currentIndex -ge 0 -and $currentIndex -lt ($siblings.Count - 1)) {
        $next = $siblings[$currentIndex + 1]
        $navigation.Add("- Next: [$($next.Name)]($($next.Name).md)")
    }

    Add-PlumberTaskMarkdownSection -Lines $lines -Title 'Navigation' -Content ($navigation -join "`n")

    ($lines -join "`n").TrimEnd() + "`n"
}