private/ConvertTo-SpectreDecoration.ps1
using namespace Spectre.Console function ConvertTo-SpectreDecoration { param( [Parameter(Mandatory)] [String]$String, [switch]$AllowMarkup ) Write-Debug "Module: $($ExecutionContext.SessionState.Module.Name) Command: $($MyInvocation.MyCommand.Name) Param: $($PSBoundParameters.GetEnumerator())" if (-Not ('PwshSpectreConsole.VTCodes.Parser' -as [type])) { Add-PwshSpectreConsole.VTCodes } $lookup = [PwshSpectreConsole.VTCodes.Parser]::Parse($String) $ht = @{ decoration = [Decoration]::None fg = [Color]::Default bg = [Color]::Default } foreach ($item in $lookup) { # Write-Debug "Type: $($item.type) Value: $($item.value) Position: $($item.position) Color: $($item.color)" if ($item.value -eq 'None') { continue } $conversion = switch ($item.type) { '4bit' { if ($item.value -gt 0 -and $item.value -le 15) { [Color]::FromConsoleColor($item.value) } else { # spectre doesn't appear to have a way to convert from 4bit. # e.g all $PSStyle colors 30-37, 40-47 and 90-97, 100-107 # this will return the closest color in 8bit. [Color]::FromConsoleColor((ConvertFrom-ConsoleColor $item.value)) } } '8bit' { [Color]::FromInt32($item.value) } '24bit' { [Color]::new($item.value.Red, $item.value.Green, $item.value.Blue) } 'decoration' { [Decoration]::Parse([Decoration], $item.Value, $true) } } if ($item.type -eq 'decoration') { $ht.decoration = $conversion } if ($item.position -eq 'foreground') { $ht.fg = $conversion } elseif ($item.position -eq 'background') { $ht.bg = $conversion } } $String = [System.Management.Automation.Host.PSHostUserInterface]::GetOutputString($String, $false) Write-Debug "Clean: '$String' deco: '$($ht.decoration)' fg: '$($ht.fg)' bg: '$($ht.bg)'" if ($AllowMarkup) { return [Markup]::new($String, [Style]::new($ht.fg, $ht.bg, $ht.decoration)) } return [Text]::new($String, [Style]::new($ht.fg, $ht.bg, $ht.decoration)) } |