Private/Write-ColorScriptInformation.ps1

function Test-ColorScriptForcedAnsi {
    $forceAnsiValue = $env:COLOR_SCRIPTS_ENHANCED_FORCE_ANSI
    if ([string]::IsNullOrWhiteSpace($forceAnsiValue)) {
        return $false
    }

    return $forceAnsiValue -match '^(?i)(1|true|yes|force|ansi|color)$'
}

function ConvertTo-ColorScriptConsoleColor {
    param(
        [AllowNull()]
        [string]$Color
    )

    if ([string]::IsNullOrWhiteSpace($Color)) {
        return $null
    }

    try {
        return [System.ConsoleColor][System.Enum]::Parse([System.ConsoleColor], $Color, $true)
    }
    catch {
        return $null
    }
}

function Test-ColorScriptConsoleOutputAvailable {
    param(
        [switch]$PreferConsole,
        [switch]$ForceAnsi
    )

    if ($PreferConsole -or $ForceAnsi) {
        return $true
    }

    try {
        return -not (Test-ConsoleOutputRedirected)
    }
    catch {
        return $false
    }
}

function Test-ColorScriptVirtualTerminalAvailable {
    try {
        return Test-ConsoleSupportsVirtualTerminal
    }
    catch {
        return $false
    }
}

function Write-ColorScriptConsoleOutput {
    param(
        [Parameter(Mandatory)]
        [AllowEmptyString()]
        [string]$Text,

        [AllowNull()]
        [object]$ConsoleColor,

        [switch]$NoAnsiOutput,
        [switch]$ApplyConsoleColor
    )

    $colorSet = $false
    $originalColor = $null

    try {
        if ($ApplyConsoleColor -and $null -ne $ConsoleColor) {
            $originalColor = [Console]::ForegroundColor
            [Console]::ForegroundColor = $ConsoleColor
            $colorSet = $true
        }

        Write-RenderedText -Text $Text -NoAnsiOutput:$NoAnsiOutput
        return $true
    }
    catch {
        return $false
    }
    finally {
        if ($colorSet -and $null -ne $originalColor) {
            [Console]::ForegroundColor = $originalColor
        }
    }
}

function Write-ColorScriptInformation {
    param(
        [AllowNull()][string]$Message,
        [switch]$Quiet,
        [switch]$NoAnsiOutput,
        [switch]$PreferConsole,
        [string]$Color
    )

    if ($Quiet) {
        return
    }

    $output = if ($null -ne $Message) { [string]$Message } else { '' }
    $sanitizedOutput = Remove-ColorScriptAnsiSequence -Text $output
    $consoleColor = ConvertTo-ColorScriptConsoleColor -Color $Color
    $wroteToConsole = $false

    if (-not $NoAnsiOutput.IsPresent) {
        $forceAnsi = Test-ColorScriptForcedAnsi
        $shouldUseConsole = Test-ColorScriptConsoleOutputAvailable -PreferConsole:$PreferConsole -ForceAnsi:$forceAnsi
        $supportsVirtualTerminal = Test-ColorScriptVirtualTerminalAvailable
        $shouldRenderWithAnsi = $shouldUseConsole -and ($forceAnsi -or $supportsVirtualTerminal)

        if ($shouldUseConsole) {
            $wroteToConsole = Write-ColorScriptConsoleOutput -Text $output -ConsoleColor $consoleColor -NoAnsiOutput:(-not $shouldRenderWithAnsi) -ApplyConsoleColor:(-not $shouldRenderWithAnsi)
        }

        if (-not $wroteToConsole -and $null -ne $consoleColor) {
            $wroteToConsole = Write-ColorScriptConsoleOutput -Text $output -ConsoleColor $consoleColor -NoAnsiOutput -ApplyConsoleColor
        }
    }

    $informationAction = if ($wroteToConsole) { 'SilentlyContinue' } else { 'Continue' }
    Write-Information -MessageData $sanitizedOutput -InformationAction $informationAction -Tags 'ColorScripts'
}

function Write-ColorScriptSelectionInfo {
    param(
        [Parameter(Mandatory)]
        [string]$Name,

        [Parameter(Mandatory)]
        [string]$Path,

        [switch]$Quiet,

        [switch]$NoAnsiOutput,

        [switch]$PreferConsole
    )

    if ($Quiet) {
        return
    }

    $nameSegment = New-ColorScriptAnsiText -Text ("[{0}]" -f $Name) -Color 'Cyan' -NoAnsiOutput:$NoAnsiOutput
    $pathSegment = New-ColorScriptAnsiText -Text $Path -Color 'DarkGray' -NoAnsiOutput:$NoAnsiOutput

    $writeParameters = @{
        Message       = "{0} {1}" -f $nameSegment, $pathSegment
        NoAnsiOutput  = $NoAnsiOutput
        PreferConsole = $PreferConsole
    }
    Write-ColorScriptInformation @writeParameters
}