Private/Authentication/Get-ModuleBanner.ps1

Function Get-ModuleBanner
{
    Param(
        $ModuleBannerUrl = 'https://github.com/TheJumpCloud/support/blob/master/PowerShell/ModuleBanner.md'
    )
    # Update security protocol
    [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls, [System.Net.SecurityProtocolType]::Tls12
    # Build output object
    $OutputObject = New-Object -TypeName:('PSCustomObject')
    # Define expected Headers to find
    $ModuleBanner_Headers = @('Latest Version', 'Banner Current', 'Banner Old')
    # Define regex patterns
    [regex]$Regex_HtmlTags = '(<)(.*?)(>)'
    [regex]$Regex_Article = '(?is)(?<=<article class="markdown-body entry-content p-3 p-md-6" itemprop="text">)(.*?)(?=<\/article>)'
    [regex]$Regex_H4_Start = '<h4>'
    [regex]$Regex_H4_Content = '(?is)(?<=<\/a>)(.*?)(?=<\/h4>)'
    [regex]$Regex_H4_Body = '(?is)(?<=<\/h4>)(.*?)($)'
    # Get module banner from GitHub page
    $ModuleBannerPage = Invoke-WebRequest -Uri:($ModuleBannerUrl) -UseBasicParsing
    $ModuleBannerPageContent = $ModuleBannerPage.Content
    # Get the body of the GitHub page
    $ModuleBanner_MarkDownBody = ($ModuleBannerPageContent | Select-String -Pattern:($Regex_Article)).Matches.Value
    ForEach ($ModuleBanner_Section In $ModuleBanner_MarkDownBody -split ($Regex_H4_Start))
    {
        # Get matching value
        $ModuleBanner_Section_Header = ($ModuleBanner_Section | Select-String -Pattern:($Regex_H4_Content)).Matches.Value
        $ModuleBanner_Section_Body = ($ModuleBanner_Section | Select-String -Pattern:($Regex_H4_Body)).Matches.Value
        $ModuleBanner_Section_HtmlTags = ($ModuleBanner_Section_Body | Select-String -AllMatches -Pattern:($Regex_HtmlTags)).Matches.Value
        If (-not [System.String]::IsNullOrEmpty($ModuleBanner_Section_Header))
        {
            # Validate the section headers found are in the expected list
            If ($ModuleBanner_Section_Header -in $ModuleBanner_Headers)
            {
                # Remove html tags from the body content
                ForEach ($ModuleBanner_Section_HtmlTag In $ModuleBanner_Section_HtmlTags)
                {
                    $ModuleBanner_Section_Body = ($ModuleBanner_Section_Body.Replace($ModuleBanner_Section_HtmlTag, '')).Trim()
                }
                Add-Member -InputObject:($OutputObject) -MemberType:('NoteProperty') -Name:([System.String]$ModuleBanner_Section_Header) -Value:([System.String]$ModuleBanner_Section_Body)
            }
            Else
            {
                Write-Error ('The Header found is not in the list of expected headers: ' + $ModuleBanner_Section_Header + ' -notin ' + ($ModuleBanner_Headers -join (', ')))
            }
        }
    }
    Add-Member -InputObject:($OutputObject) -MemberType:('NoteProperty') -Name:('GitHubModuleBannerUrl') -Value:([System.String]$ModuleBannerUrl)
    Return $OutputObject
}