_includes/Menu.ps1

<#
.SYNOPSIS
    Includes a Menu
.DESCRIPTION


#>

param(
[PSObject]
$Menu,

[string]
$Name
)


filter menuToHtml {
    
    $menu = $_
    
    foreach ($property in $Menu.psobject.properties) {
        "<li>"
            if ($property.Value -is [string] -and 
                $property.Value -match '^/' -or $property.Value -is [uri]) {
                "<a href='$($property.Value)'>$(
                    if ($property.Name -notmatch '^<') {
                        [Web.HttpUtility]::HtmlEncode($property.Name)
                    } else {
                        $property.Name
                    }
                )</a>"

            } else {
                "<details $(if ($name) { "$("name='$(
                    [Web.HttpUtility]::HtmlAttributeEncode($name)
                )'")" } else { 'open' })>"

                    "<summary>$(
                        if ($property.Name -notmatch '^<') {
                            [Web.HttpUtility]::HtmlEncode($property.Name)
                        } else {
                            $property.Name
                        }
                    )</summary>"

                    "<ul>"
                        $property.Value | menuToHtml
                    "</ul>"
                "</details>"
            }
        "</li>"
    }    
}

"<menu>"
    "<ul>"
        $menu | menuToHtml
    "</ul>"
"</menu>"