functions/show-ansi.ps1

Function Show-ANSISequence {
    [cmdletbinding(DefaultParameterSetName = "basic")]
    [OutputType([System.String])]

    Param(
        [Parameter(ParameterSetName = "basic", HelpMessage = "Display basic ANSI escape sequences. This is the default setting.")]
        [switch]$Basic,
        [Parameter(ParameterSetName = "foreback", HelpMessage = "Display foreground ANSI escape sequences")]
        [switch]$Foreground,
        [Parameter(ParameterSetName = "foreback", HelpMessage = "Display background ANSI escape sequences")]
        [switch]$Background,
        [Parameter(ParameterSetName = "foreback")]
        [ValidateSet("All", "Simple", "8Bit")]
        [string]$Type = "All",
        [Parameter(ParameterSetName = "RGB", HelpMessage = "Specify an array of RGB values between 0 and 255")]
        [int[]]$RGB,
        [Parameter(HelpMessage = "Show the value as an unformatted string")]
        [switch]$AsString
    )

    Write-Verbose "Starting $($MyInvocation.MyCommand)"
    Write-Debug "Using parameter set $($PSCmdlet.ParameterSetName)"
    Write-Debug "Bound parameters"
    $PSBoundParameters | Out-String | Write-Debug

    #default to Basic even if the user doesn't specify the -Basic parameter
    if ($PSCmdlet.parametersetname -eq 'basic') {
        $Basic = $True
    }
    elseif ($PSCmdlet.ParameterSetName -eq 'foreback') {
        Write-Debug "Testing bound parameters"
        #9/15/2022 Fixed logic to avoid including Foreground unless specified. Issue #130 JDH
        if ( (-Not ($PSBoundParameters.ContainsKey('foreground'))) -AND (-Not ($PSBoundParameters.ContainsKey('background')))) {
            #default to foreground Issue # 110
            Write-Debug "Setting Foreground as default"
            $Foreground = $True
        }
    }

    # a private function to display results in columns on the screen
    Function display {
        Param([object]$all, [int]$Max)

        $c = 1
        [string]$row = ""

        for ($i = 0; $i -le $all.count; $i++) {
            if ($c -gt $max) {
                $row
                $c = 1
                $row = ""
                #need to reset $i otherwise the entry gets omitted
                # Issue #125
                $i--
            }
            else {
                $row += "$($all[$i]) `t"
                $c++
            }
        }
    } #display function

    if ($IsCoreCLR) {
        Write-Debug "CoreCLR"
        $esc = "`e"
        $escText = '`e'
        $max = 3
    }
    else {
        Write-Debug "Desktop"
        $esc = $([char]27)
        $escText = '$([char]27)'
        $max = 2
    }

    #region basic
    if ($basic) {
        Write-Debug "Get basic settings"
        Add-Border "Basic Sequences" -ANSIText "$esc[1m" | Write-Host

        $basichash = @{
            1 = "Bold"
            2 = "Faint"
            3 = "Italic"
            4 = "Underline"
            5 = "SlowBlink"
            6 = "RapidBlink"
            7 = "Reverse"
            9 = "CrossedOut"
        }

        $basichash.GetEnumerator() | ForEach-Object {
            $sequence = "$esctext[$($_.name)m$($_.value)$esctext[0m"
            if ($AsString) {
                $sequence
            }
            else {
                "$esc[$($_.name)m$sequence$esc[0m"
            }
        }
    }
    #endregion

    #region foreground

    If ($Foreground) {
        Write-Debug "Getting foreground"
        if ($Type -match "All|Simple") {
            Add-Border "Foreground" -ANSIText "$esc[93m" | Write-Host
            $n = [System.Collections.Generic.list[int]]::new()
            30..37 | ForEach-Object {$n.Add($_)}
            90..97 | ForEach-Object {$n.Add($_)}

            $all = $n | ForEach-Object {
                $sequence = "$esctext[$($_)mHello$esctext[0m"
                if ($AsString) {
                    $sequence
                }
                else {
                    "$esc[$($_)m$sequence$esc[0m"
                }
            }

            display -all $all -Max $max

            Write-Host "`n"
        }
        if ($Type -match "All|8bit") {
            Add-Border "8-Bit Foreground" -ANSIText "$esc[38;5;10m" | Write-Host
            $all = 1..255 | ForEach-Object {
                $sequence = "$esctext[38;5;$($_)mHello$esctext[0m"
                if ($AsString) {
                    $sequence
                }
                else {
                    "$esc[38;5;$($_)m$sequence$esc[0m"
                }
            }
            display -all $all -Max $max
        }
    }
    #endregion

    #region background
    If ($Background) {
        Write-Debug "Getting background"
        if ($Type -match "All|Simple") {
            Add-Border "Background" -ANSIText "$esc[46m" | Write-Host
            $n = 40..47
            $n += 100..107
            $all = $n | ForEach-Object {
                $sequence = "$esctext[$($_)mHello$esctext[0m"
                if ($AsString) {
                    $sequence
                }
                else {
                    "$esc[1;$($_)m$sequence$esc[0m"
                }
            }

            display -all $all -Max $max

            Write-Host "`n"
        }

        if ($Type -match "All|8bit") {
            Add-Border "8-Bit Background" -ANSIText "$esc[7;38;5;10m" | Write-Host
            $all = 1..255 | ForEach-Object {
                $sequence = "$esctext[48;5;$($_)mHello$esctext[0m"
                if ($AsString) {
                    $sequence
                }
                else {
                    "$esc[1;48;5;$($_)m$sequence$esc[0m"
                }
            }
            display -all $all -Max $max
        }
    }

    #endregion

    #region RGB

    if ($RGB) {
        Write-Debug "Using RBG values"
        if ($rgb.count -ne 3) {
            Write-Warning "Wrong number of arguments. Specify RED,GREEN and BLUE values"
            return
        }
        $test = $rgb | Where-Object { $_ -gt 255 }
        if ($test.count -gt 0) {
            Write-Warning "Detected a value above 255"
            return $rgb
        }

        $r = $rgb[0]
        $g = $rgb[1]
        $b = $rgb[2]

        Write-Host "`r"
        $sequence = "$esctext[38;2;$r;$g;$($b)m256 Color (R:$r)(G:$g)(B:$b)$esctext[0m"
        if ($AsString) {
            $sequence
        }
        else {
            "$esc[38;2;$r;$g;$($b)m$sequence$esc[0m"
        }

    }
    #endregionm

    #insert a blank line to set off the results
    Write-Host "`r"

    Write-Verbose "Ending $($MyInvocation.MyCommand)"
}