Functions/Get-HtmlAccordion.ps1

function Get-HtmlAccordion {
    [CmdletBinding()]
    param(                
        [HashTable]$inputData,
        [switch]$Fragment,
        [int]$panelCount = 1
    )
    Add-Type -AssemblyName System.Web

    $result = New-Object Text.StringBuilder

    if (!$Fragment) {
        #Add stylesheet and script
        [void]$result.AppendLine("<!DOCTYPE html>")
        [void]$result.AppendLine("<html><head>")
        [void]$result.AppendLine("<link rel='stylesheet' href='https://cdn.jsdelivr.net/npm/bootstrap@4.4.1/dist/css/bootstrap.min.css' integrity='sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh' crossorigin='anonymous'>")
        [void]$result.AppendLine("<script src='https://cdn.jsdelivr.net/npm/bootstrap@4.4.1/dist/js/bootstrap.min.js' integrity='sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6' crossorigin='anonymous'></script>")
        [void]$result.AppendLine("</head>")
        [void]$result.AppendLine("<body>")
        [void]$result.AppendLine("<div class='container'>")
    }

    
    foreach ($key in $inputData.Keys) {        
        [void]$result.AppendLine("<div class='panel-default'>")
        [void]$result.AppendLine("<div class='panel-heading' >")
        [void]$result.AppendLine("<h4 class='panel-title' id=heading$panelCount>")
        if ($noWrapping) {
            [void]$result.AppendLine("<button class='accordion-button collapsed' type='button' data-bs-toggle='collapse' data-bs-target='#collapse$panelCount' aria-expanded='false' aria-controls='collapse$panelCount'>")
        } else {
            [void]$result.AppendLine("<button class='accordion-button' type='button' data-bs-toggle='collapse' data-bs-target='#collapse$panelCount' aria-expanded='true' aria-controls='collapse$panelCount'>")
        }
        [void]$result.AppendLine([System.Web.HttpUtility]::HtmlEncode($key))
        [void]$result.AppendLine("</button>")   
        [void]$result.AppendLine("</h4>") #'panel-title'
        [void]$result.AppendLine("</div>") #'panel-heading'
        if ($noWrapping) {
            [void]$result.AppendLine("<div id='collapse$panelCount' class='panel-collapse collapse' aria-labelledby='heading$panelCount'>")
        } else {
            [void]$result.AppendLine("<div id='collapse$panelCount' class='panel-collapse collapse show' aria-labelledby='heading$panelCount'>")
        }

        $panelCount++

        [void]$result.AppendLine("<ul class='list-group'>")
        forEach ($panelContent in $inputData[$key]) {            
            [void]$result.AppendLine("<li class='list-group-item'>")
            switch ($panelContent.Gettype().Name) {
                "Hashtable" {
                    #This does not work at this time due to script error...
                    [void]$result.AppendLine((Get-HtmlAccordion -inputData $panelContent -panelCount $panelCount -noWrapping))
                    $panelCount++
                }
                Default {
                    
                    [void]$result.Append([System.Web.HttpUtility]::HtmlEncode($panelContent))
                }
            }        
            [void]$result.AppendLine("</li>") # class='list-group-item'
        }
        [void]$result.AppendLine("</ul>") # class='list-group'
        [void]$result.AppendLine("</div>") #panel-collapse collapse
        [void]$result.AppendLine("</div>") #panel panel-default
    }

    if (!$noWrapping) {
        [void]$result.AppendLine("</div></body></html>")        
    }

    return $result.ToString();
}