LightScript.format.ps1xml
<?xml version="1.0" encoding="utf-16"?> <!-- Generated with EZOut 1.9.7: Install-Module EZOut or https://github.com/StartAutomating/EZOut --> <Configuration> <ViewDefinitions> <View> <Name>Hue.Capabilities</Name> <ViewSelectedBy> <TypeName>Hue.Capabilities</TypeName> </ViewSelectedBy> <ListControl> <ListEntries> <ListEntry> <ListItems> <ListItem> <Label>Lights</Label> <ScriptBlock> '' + ($_.lights.total - $_.lights.available) + '/' + $_.lights.total </ScriptBlock> </ListItem> <ListItem> <Label>Sensors</Label> <ScriptBlock> '' + ($_.sensors.total - $_.Sensors.available) + '/' + $_.Sensors.total </ScriptBlock> </ListItem> <ListItem> <Label>Groups</Label> <ScriptBlock> '' + ($_.groups.total - $_.groups.available) + '/' + $_.groups.total </ScriptBlock> </ListItem> <ListItem> <PropertyName>Scenes</PropertyName> </ListItem> <ListItem> <Label>schedules</Label> <ScriptBlock> '' + ($_.schedules.total - $_.schedules.available) + '/' + $_.schedules.total </ScriptBlock> </ListItem> <ListItem> <PropertyName>Rules</PropertyName> </ListItem> <ListItem> <PropertyName>ResourceLinks</PropertyName> </ListItem> <ListItem> <PropertyName>Streaming</PropertyName> </ListItem> </ListItems> </ListEntry> </ListEntries> </ListControl> </View> <View> <Name>Hue.Group</Name> <ViewSelectedBy> <TypeName>Hue.Group</TypeName> </ViewSelectedBy> <TableControl> <TableHeaders> <TableColumnHeader> <Alignment>left</Alignment> <Width>4</Width> </TableColumnHeader> <TableColumnHeader> <Alignment>left</Alignment> <Width>20</Width> </TableColumnHeader> <TableColumnHeader> <Alignment>left</Alignment> <Width>15</Width> </TableColumnHeader> <TableColumnHeader> <Label>Lights</Label> <Alignment>left</Alignment> </TableColumnHeader> </TableHeaders> <TableRowEntries> <TableRowEntry> <Wrap /> <TableColumnItems> <TableColumnItem> <PropertyName>ID</PropertyName> </TableColumnItem> <TableColumnItem> <PropertyName>Name</PropertyName> </TableColumnItem> <TableColumnItem> <PropertyName>Type</PropertyName> </TableColumnItem> <TableColumnItem> <ScriptBlock> $group = $_ $lightlist = $_.Lights -join ',' if (-not $script:CachedLightNames) { $script:CachedLightNames = @{} } if (-not $script:CachedLightNames[$lightlist]) { $script:CachedLightNames[$lightlist] = $group.Lights | Get-HueLight -LightID { $_ } | Select-Object -ExpandProperty Name } $script:CachedLightNames[$lightlist] -join [Environment]::NewLine </ScriptBlock> </TableColumnItem> </TableColumnItems> </TableRowEntry> </TableRowEntries> </TableControl> </View> <View> <Name>Master</Name> <ViewSelectedBy> <TypeName>Hue.Light</TypeName> </ViewSelectedBy> <CustomControl> <CustomEntries> <CustomEntry> <CustomItem> <ExpressionBinding> <PropertyName>Name</PropertyName> </ExpressionBinding> <ExpressionBinding> <ItemSelectionCondition> <ScriptBlock> $_.State.On </ScriptBlock> </ItemSelectionCondition> <ScriptBlock> ' * ' </ScriptBlock> </ExpressionBinding> </CustomItem> </CustomEntry> </CustomEntries> </CustomControl> </View> <View> <Name>Detail</Name> <ViewSelectedBy> <TypeName>Hue.Light</TypeName> </ViewSelectedBy> <CustomControl> <CustomEntries> <CustomEntry> <CustomItem> <ExpressionBinding> <PropertyName>Name</PropertyName> </ExpressionBinding> <ExpressionBinding> <ItemSelectionCondition> <ScriptBlock> $_.State.On </ScriptBlock> </ItemSelectionCondition> <ScriptBlock> $_.State | ConvertTo-Json | Out-String </ScriptBlock> </ExpressionBinding> </CustomItem> </CustomEntry> </CustomEntries> </CustomControl> </View> <View> <Name>Hue.Rule</Name> <ViewSelectedBy> <TypeName>Hue.Rule</TypeName> </ViewSelectedBy> <CustomControl> <CustomEntries> <CustomEntry> <CustomItem> <ExpressionBinding> <ScriptBlock> $rule = $_ if ($request -and $response) { } else { $NameLength = $rule.Name.Length + 2 $nameLeft = [Math]::Floor(($NameLength - 4) /2) if ($NameLength %2) { $nameRight = $nameLeft + 1 } else { $nameRight = $nameLeft } $maxConditionLength = 0 $MaxActionLength = 0 $wholeLength = $NameLength + 4 + 10 + 20 + 20 + 4 $extraLength = 0 $conditionLines = ($rule.Conditions | ConvertTo-Json).ToString() -split ([Environment]::NewLine) $actionLines = ($rule.Actions | ConvertTo-Json).ToString() -split ([Environment]::NewLine) foreach ($_ in $conditionLines + $actionLines) { if ($_.Length -gt $wholeLength) { $extraLength+=($_.Length - $wholeLength) $wholeLength = $_.Length } } Write-Host @" +$('-' * $NameLength)+$('-' * 4)+$('-' * 10)+$('-' * 20)+$('-'*20)$('-' * $extraLength)+ |$(' ' * $nameLeft)Name$(' ' * $nameRight)| ID | Status | Created | Last Triggered$(' ' * $extraLength) | +$('-' * $NameLength)+$('-' * 4)+$('-' * 10)+$('-' * 20)+$('-'*20)$('-' * $extraLength)+ | $($rule.Name) | $($rule.ID.ToString().PadRight(3))| $($rule.Status.PadRight(8, ' ')) |$($rule.Created -as [DateTime]) |$($rule.LastTriggered -as [DateTime]) $('-' * $extraLength)| +$('-' * $NameLength)+$('-' * 4)+$('-' * 10)+$('-' * 20)+$('-'*20)$('-' * $extraLength)+ | Conditions$(' ' * ($wholeLength - 'Conditions'.Length -1 ))| +$('-' * $wholelength)+ $(@(foreach ($_ in $conditionLines) { '|' + $_.PadRight($wholeLength, ' ') + '|' }) -join ([Environment]::NewLine)) +$('-' * $wholelength)+ | Actions$(' ' * ($wholeLength - 'Actions'.Length -1 ))| +$('-' * $wholelength)+ $(@(foreach ($_ in $actionLines) { '|' + $_.PadRight($wholeLength, ' ') + '|' }) -join ([Environment]::NewLine)) +$('-' * $wholelength)+ "@ } </ScriptBlock> </ExpressionBinding> </CustomItem> </CustomEntry> </CustomEntries> </CustomControl> </View> <View> <Name>Hue.Schedule</Name> <ViewSelectedBy> <TypeName>Hue.Schedule</TypeName> </ViewSelectedBy> <TableControl> <TableHeaders> <TableColumnHeader> <Alignment>left</Alignment> <Width>4</Width> </TableColumnHeader> <TableColumnHeader> <Alignment>left</Alignment> <Width>40</Width> </TableColumnHeader> <TableColumnHeader> <Label>Status</Label> <Alignment>left</Alignment> <Width>15</Width> </TableColumnHeader> <TableColumnHeader> <Alignment>left</Alignment> <Width>20</Width> </TableColumnHeader> <TableColumnHeader> <Label>Command</Label> <Alignment>left</Alignment> </TableColumnHeader> </TableHeaders> <TableRowEntries> <TableRowEntry> <Wrap /> <TableColumnItems> <TableColumnItem> <PropertyName>ID</PropertyName> </TableColumnItem> <TableColumnItem> <PropertyName>Name</PropertyName> </TableColumnItem> <!-- {ConditionalColor:" if ($_.Status -eq 'Enabled') { '#00ff00' } else { '#ff0000' } "}--> <TableColumnItem> <ScriptBlock>$moduleName = 'LightScript' do { $lm = Get-Module -Name $moduleName -ErrorAction Ignore if (-not $lm) { continue } if ($lm.FormatPartsLoaded) { break } $wholeScript = @(foreach ($formatFilePath in $lm.exportedFormatFiles) { foreach ($partNodeName in Select-Xml -LiteralPath $formatFilePath -XPath "/Configuration/Controls/Control/Name[starts-with(., '$')]") { $ParentNode = $partNodeName.Node.ParentNode "$($ParentNode.Name)={ $($ParentNode.CustomControl.CustomEntries.CustomEntry.CustomItem.ExpressionBinding.ScriptBlock)}" } }) -join [Environment]::NewLine New-Module -Name "${ModuleName}.format.ps1xml" -ScriptBlock ([ScriptBlock]::Create(($wholeScript + ';Export-ModuleMember -Variable *'))) | Import-Module -Global $onRemove = [ScriptBlock]::Create("Remove-Module '${ModuleName}.format.ps1xml'") if (-not $lm.OnRemove) { $lm.OnRemove = $onRemove } else { $lm.OnRemove = [ScriptBlock]::Create($onRemove.ToString() + '' + [Environment]::NewLine + $lm.OnRemove) } $lm | Add-Member NoteProperty FormatPartsLoaded $true -Force } while ($false) $__ = $_ $ci = . { if ($_.Status -eq 'Enabled') { '#00ff00' } else { '#ff0000' } } $_ = $__ if ($ci -is [string]) { $ci = & ${LightScript_Format-RichText} -NoClear -ForegroundColor $ci } else { $ci = & ${LightScript_Format-RichText} -NoClear @ci } $output = . {$_.'Status'} @($ci; $output; & ${LightScript_Format-RichText}) -join "" </ScriptBlock> </TableColumnItem> <TableColumnItem> <PropertyName>Time</PropertyName> </TableColumnItem> <TableColumnItem> <ScriptBlock> $_.Command.Body | ConvertTo-Json </ScriptBlock> </TableColumnItem> </TableColumnItems> </TableRowEntry> </TableRowEntries> </TableControl> </View> <View> <Name>Hue.Schedule</Name> <ViewSelectedBy> <TypeName>Hue.Schedule</TypeName> </ViewSelectedBy> <CustomControl> <CustomEntries> <CustomEntry> <CustomItem> <ExpressionBinding> <ScriptBlock> $schedule = $_ if ($request -and $response) { New-Object PSObject -Property ([Ordered]@{ Name = $schedule.Name ID = $schedule.ID Created = ($schedule.Created -as [DateTime]) Schedule = $schedule.Time }) | Out-HTML "<pre>$($schedule.Command | ConvertTo-Json)</pre>" } else { $NameLength = $Schedule.Name.Length + 2 $TimeLength = $Schedule.LocalTime.Length + 2 $nameLeft = [Math]::Floor(($NameLength - 4) /2) if ($NameLength %2) { $nameRight = $nameLeft + 1 } else { $nameRight = $nameLeft } $maxConditionLength = 0 $MaxActionLength = 0 $wholeLength = $NameLength + 4 + 10 + 20 + $TimeLength + 4 $extraLength = 0 $commandLines = ($schedule.Command | ConvertTo-Json).ToString() -split [Environment]::NewLine foreach ($_ in $commandLines) { if ($_.Length -gt $wholeLength) { $extraLength += ($_.Length - $wholeLength) $wholeLength = $_.Length } } $timeAreaLength = $TimeLength + $extraLength $timeLeft = [Math]::Floor(($timeAreaLength - 6)/2) $timeRight = if ($timeAreaLength %2) { $timeLeft + 1 } else { $timeLeft } $timeValueLeft = [Math]::Floor(($timeAreaLength - $schedule.LocalTime.Length)/2) $timeValueRight = if ($TimeLength % 2) { $timeValueLeft + 1 } else { $timeValueLeft } $timeOccupiedLength = ($timeValueLeft + $Schedule.LocalTime.Length + $timeValueRight) if ($timeOccupiedLength -lt $timeAreaLength) { $timeValueRight += $timeAreaLength - $timeOccupiedLength } Write-Host "+$('-' * $NameLength)+$('-' * 4)+$('-' * 10)+$('-' * 20)+$('-'*$TimeLength)$('-' * $extraLength)+" -ForegroundColor Cyan #region Table Header Write-Host "|" -NoNewline -ForegroundColor Cyan Write-Host "$(' ' * $nameLeft)Name$(' ' * $nameRight)" -NoNewline -ForegroundColor Green Write-Host "|" -NoNewline -ForegroundColor Cyan Write-Host " ID " -NoNewline -ForegroundColor Green Write-Host "|" -NoNewline -ForegroundColor Cyan Write-Host " Status " -NoNewline -ForegroundColor Green Write-Host "|" -NoNewline -ForegroundColor Cyan Write-Host " Created " -NoNewline -ForegroundColor Green Write-Host "|" -NoNewline -ForegroundColor Cyan Write-Host "$(' ' * $timeLeft)@ Time$(' ' * $timeRight)" -ForegroundColor Green -NoNewline Write-Host "|" -ForegroundColor Cyan #endregion Table Header Write-Host "+$('-' * $NameLength)+$('-' * 4)+$('-' * 10)+$('-' * 20)+$('-'*$TimeLength)$('-' * $extraLength)+" -ForegroundColor Cyan #region Table Values Write-Host "|" -NoNewline -ForegroundColor Cyan Write-Host " $($Schedule.Name) " -NoNewline -ForegroundColor Green Write-Host "|" -NoNewline -ForegroundColor Cyan Write-Host " $($Schedule.ID.ToString().PadRight(2)) " -NoNewline -ForegroundColor Green Write-Host "|" -NoNewline -ForegroundColor Cyan Write-Host " $($Schedule.Status.PadRight(8, ' ')) " -NoNewline -ForegroundColor $(if ($Schedule.status -eq 'disabled') {'Red' } else { 'Green' }) Write-Host "|" -NoNewline -ForegroundColor Cyan Write-Host "$(($Schedule.Created -as [DateTime]).ToString('s')) " -NoNewline -ForegroundColor Green Write-Host "|" -NoNewline -ForegroundColor Cyan Write-Host "$(' ' * $timeValueLeft)$($Schedule.localtime)$(' ' * $timeValueRight)" -ForegroundColor Green -NoNewline Write-Host "|" -ForegroundColor Cyan #endregion Table Values Write-Host "+$('-' * $NameLength)+$('-' * 4)+$('-' * 10)+$('-' * 20)+$('-'*$TimeLength)$('-' * $extraLength)+" -ForegroundColor Cyan Write-Host '|' -NoNewline -ForegroundColor Cyan Write-Host " Command$(' ' * ($wholeLength - 'Command'.Length - 1))" -ForegroundColor Green -NoNewline Write-Host '|' -ForegroundColor Cyan Write-Host "+$('-' * $wholelength)+" -ForegroundColor Cyan foreach ($_ in $commandLines) { Write-Host '|' -NoNewline -ForegroundColor Cyan Write-Host $_.PadRight($wholeLength, ' ') -foregroundColor Green -nonewline Write-host '|' -ForegroundColor Cyan } Write-Host "+$('-' * $wholelength)+" -ForegroundColor Cyan } </ScriptBlock> </ExpressionBinding> </CustomItem> </CustomEntry> </CustomEntries> </CustomControl> </View> <View> <Name>Hue.Sensor</Name> <ViewSelectedBy> <TypeName>Hue.Sensor</TypeName> </ViewSelectedBy> <GroupBy> <PropertyName>Manufacturer</PropertyName> </GroupBy> <TableControl> <TableHeaders> <TableColumnHeader> <Alignment>left</Alignment> <Width>4</Width> </TableColumnHeader> <TableColumnHeader> <Alignment>left</Alignment> <Width>20</Width> </TableColumnHeader> <TableColumnHeader> <Alignment>left</Alignment> <Width>10</Width> </TableColumnHeader> <TableColumnHeader> <Label>Config</Label> <Alignment>left</Alignment> <Width>40</Width> </TableColumnHeader> <TableColumnHeader> <Label>State</Label> <Alignment>left</Alignment> </TableColumnHeader> </TableHeaders> <TableRowEntries> <TableRowEntry> <Wrap /> <TableColumnItems> <TableColumnItem> <PropertyName>ID</PropertyName> </TableColumnItem> <TableColumnItem> <PropertyName>Name</PropertyName> </TableColumnItem> <TableColumnItem> <PropertyName>ModelID</PropertyName> </TableColumnItem> <TableColumnItem> <ScriptBlock> ($_.Config | Out-String -Width 40).Trim()</ScriptBlock> </TableColumnItem> <TableColumnItem> <ScriptBlock> ($_.State | Out-String -Width 40).Trim()</ScriptBlock> </TableColumnItem> </TableColumnItems> </TableRowEntry> </TableRowEntries> </TableControl> </View> <View> <Name>Hue.Sensor</Name> <ViewSelectedBy> <TypeName>Hue.Sensor</TypeName> </ViewSelectedBy> <CustomControl> <CustomEntries> <CustomEntry> <CustomItem> <ExpressionBinding> <ScriptBlock> $sensor = $_ $mfgName = try { $null =[Convert]::FromBase64String($sensor.ManufacturerName) } catch { $sensor.ManufacturerName } $sensorNameString = $mfgName, $sensor.ModelId, $sensor.Name, "[ID: $($sensor.ID)]" -ne $null -join ' ' @($sensorNameString "" $sensorState = ($sensor.State | Out-String).Trim() $sensorConfig = if ($sensor.config) { ($sensor.Config | Out-String).Trim() } "State:" $sensorState = $sensorState -replace "($([Environment]::NewLine)|`n)", '$1 ' $sensorState if ($sensorConfig) { "Config:" $($sensorConfig -replace "($([Environment]::NewLine)|`n)", '$1 ') }) -join [Environment]::NewLine </ScriptBlock> </ExpressionBinding> </CustomItem> </CustomEntry> </CustomEntries> </CustomControl> </View> <View> <Name>NanoLeaf.Effect</Name> <ViewSelectedBy> <TypeName>NanoLeaf.Effect</TypeName> </ViewSelectedBy> <GroupBy> <PropertyName>pluginType</PropertyName> </GroupBy> <TableControl> <TableHeaders> <TableColumnHeader> </TableColumnHeader> <TableColumnHeader> </TableColumnHeader> <TableColumnHeader> </TableColumnHeader> <TableColumnHeader> </TableColumnHeader> </TableHeaders> <TableRowEntries> <TableRowEntry> <TableColumnItems> <TableColumnItem> <PropertyName>animName</PropertyName> </TableColumnItem> <TableColumnItem> <PropertyName>animType</PropertyName> </TableColumnItem> <TableColumnItem> <PropertyName>pluginUuid</PropertyName> </TableColumnItem> <TableColumnItem> <PropertyName>palette</PropertyName> </TableColumnItem> </TableColumnItems> </TableRowEntry> </TableRowEntries> </TableControl> </View> <View> <Name>NanoLeaf.Effect.Plugin</Name> <ViewSelectedBy> <TypeName>NanoLeaf.Effect.Plugin</TypeName> </ViewSelectedBy> <GroupBy> <PropertyName>type</PropertyName> </GroupBy> <TableControl> <TableHeaders> <TableColumnHeader> </TableColumnHeader> <TableColumnHeader> </TableColumnHeader> <TableColumnHeader> </TableColumnHeader> <TableColumnHeader> </TableColumnHeader> </TableHeaders> <TableRowEntries> <TableRowEntry> <Wrap /> <TableColumnItems> <TableColumnItem> <PropertyName>name</PropertyName> </TableColumnItem> <TableColumnItem> <PropertyName>author</PropertyName> </TableColumnItem> <TableColumnItem> <PropertyName>uuid</PropertyName> </TableColumnItem> <TableColumnItem> <PropertyName>description</PropertyName> </TableColumnItem> </TableColumnItems> </TableRowEntry> </TableRowEntries> </TableControl> </View> <View> <Name>NanoLeaf.Panel</Name> <ViewSelectedBy> <TypeName>NanoLeaf.Panel</TypeName> </ViewSelectedBy> <GroupBy> <ScriptBlock> $_.ControllerName + ' [ ' + $_.IPAddress + ' ] ' </ScriptBlock> <Label>Controller</Label> </GroupBy> <TableControl> <TableHeaders> <TableColumnHeader> </TableColumnHeader> <TableColumnHeader> </TableColumnHeader> <TableColumnHeader> </TableColumnHeader> <TableColumnHeader> </TableColumnHeader> <TableColumnHeader> </TableColumnHeader> </TableHeaders> <TableRowEntries> <TableRowEntry> <TableColumnItems> <TableColumnItem> <PropertyName>PanelID</PropertyName> </TableColumnItem> <TableColumnItem> <PropertyName>X</PropertyName> </TableColumnItem> <TableColumnItem> <PropertyName>Y</PropertyName> </TableColumnItem> <TableColumnItem> <PropertyName>O</PropertyName> </TableColumnItem> <TableColumnItem> <PropertyName>ShapeType</PropertyName> </TableColumnItem> </TableColumnItems> </TableRowEntry> </TableRowEntries> </TableControl> </View> <View> <Name>Pixoo</Name> <ViewSelectedBy> <TypeName>Pixoo</TypeName> </ViewSelectedBy> <TableControl> <TableHeaders> <TableColumnHeader> </TableColumnHeader> <TableColumnHeader> </TableColumnHeader> </TableHeaders> <TableRowEntries> <TableRowEntry> <TableColumnItems> <TableColumnItem> <PropertyName>IPAddress</PropertyName> </TableColumnItem> <TableColumnItem> <PropertyName>MACAddress</PropertyName> </TableColumnItem> </TableColumnItems> </TableRowEntry> </TableRowEntries> </TableControl> </View> <View> <Name>Pixoo.Weather</Name> <ViewSelectedBy> <TypeName>Pixoo.Weather</TypeName> </ViewSelectedBy> <TableControl> <AutoSize /> <TableHeaders> <TableColumnHeader> </TableColumnHeader> <TableColumnHeader> </TableColumnHeader> <TableColumnHeader> </TableColumnHeader> <TableColumnHeader> </TableColumnHeader> <TableColumnHeader> </TableColumnHeader> <TableColumnHeader> </TableColumnHeader> <TableColumnHeader> </TableColumnHeader> </TableHeaders> <TableRowEntries> <TableRowEntry> <TableColumnItems> <TableColumnItem> <PropertyName>Weather</PropertyName> </TableColumnItem> <TableColumnItem> <PropertyName>CurTemp</PropertyName> </TableColumnItem> <TableColumnItem> <PropertyName>MaxTemp</PropertyName> </TableColumnItem> <TableColumnItem> <PropertyName>MinTemp</PropertyName> </TableColumnItem> <TableColumnItem> <PropertyName>Pressure</PropertyName> </TableColumnItem> <TableColumnItem> <PropertyName>WindSpeed</PropertyName> </TableColumnItem> <TableColumnItem> <PropertyName>Visibility</PropertyName> </TableColumnItem> </TableColumnItems> </TableRowEntry> </TableRowEntries> </TableControl> </View> </ViewDefinitions> <Controls> <Control> <Name>${LightScript_Format-RichText}</Name> <CustomControl> <CustomEntries> <CustomEntry> <CustomItem> <ExpressionBinding> <ScriptBlock> <# .Synopsis Formats the text color of output .Description Formats the text color of output * ForegroundColor * BackgroundColor * Bold * Underline .Notes Stylized Output works in two contexts at present: * Rich consoles (Windows Terminal, PowerShell.exe, Pwsh.exe) (when $host.UI.SupportsVirtualTerminal) * Web pages (Based off the presence of a $Request variable, or when $host.UI.SupportsHTML (you must add this property to $host.UI)) #> [Management.Automation.Cmdlet("Format","Object")] [ValidateScript({ $canUseANSI = $host.UI.SupportsVirtualTerminal $canUseHTML = $Request -or $host.UI.SupportsHTML -or $OutputMode -eq 'HTML' if (-not ($canUseANSI -or $canUseHTML)) { return $false} return $true })] param( # The input object [Parameter(ValueFromPipeline)] [PSObject] $InputObject, # The foreground color [string]$ForegroundColor, # The background color [string]$BackgroundColor, # If set, will render as bold [switch]$Bold, # If set, will render as italic. [Alias('Italics')] [switch]$Italic, # If set, will render as faint [switch]$Faint, # If set, will render as hidden text. [switch]$Hide, # If set, will render as blinking (not supported in all terminals or HTML) [switch]$Blink, # If set, will render as strikethru [Alias('Strikethrough', 'Crossout')] [switch]$Strikethru, # If set, will underline text [switch]$Underline, # If set, will double underline text. [switch]$DoubleUnderline, # If set, will invert text [switch]$Invert, # If set, will not clear formatting [switch]$NoClear ) begin { $canUseANSI = $host.UI.SupportsVirtualTerminal $canUseHTML = $Request -or $host.UI.SupportsHTML -or $OutputMode -eq 'HTML' $knownStreams = @{ Output='';Error='BrightRed';Warning='BrightYellow'; Verbose='BrightCyan';Debug='Yellow';Progress='Cyan'; Success='BrightGreen';Failure='Red';Default=''} $esc = [char]0x1b $standardColors = 'Black', 'Red', 'Green', 'Yellow', 'Blue','Magenta', 'Cyan', 'White' $brightColors = 'BrightBlack', 'BrightRed', 'BrightGreen', 'BrightYellow', 'BrightBlue','BrightMagenta', 'BrightCyan', 'BrightWhite' $n =0 $cssClasses = @() $colorAttributes = @(:nextColor foreach ($hc in $ForegroundColor,$BackgroundColor) { $n++ if (-not $hc) { continue } if ($hc[0] -eq $esc) { if ($canUseANSI) { $hc; continue } } $ansiStartPoint = if ($n -eq 1) { 30 } else { 40 } if ($knownStreams.ContainsKey($hc)) { $i = $brightColors.IndexOf($knownStreams[$hc]) if ($canUseHTML) { $cssClasses += $hc } else { if ($i -ge 0 -and $canUseANSI) { '' + $esc + "[1;$($ansiStartPoint + $i)m" } else { $i = $standardColors.IndexOf($knownStreams[$hc]) if ($i -ge 0 -and $canUseANSI) { '' + $esc + "[1;$($ansiStartPoint + $i)m" } elseif ($i -le 0 -and $canUseANSI) { '' + $esc + "[$($ansistartpoint + 8):5m" } } } continue nextColor } elseif ($standardColors -contains $hc) { for ($i = 0; $i -lt $standardColors.Count;$i++) { if ($standardColors[$i] -eq $hc) { if ($canUseANSI -and -not $canUseHTML) { '' + $esc + "[$($ansiStartPoint + $i)m" } else { $cssClasses += $standardColors[$i] } continue nextColor } } } elseif ($brightColors -contains $hc) { for ($i = 0; $i -lt $brightColors.Count;$i++) { if ($brightColors[$i] -eq $hc) { if ($canUseANSI -and -not $canUseHTML) { '' + $esc + "[1;$($ansiStartPoint + $i)m" } else { $cssClasses += $standardColors[$i] } continue nextColor } } } elseif ($psStyle -and $psStyle.Formatting.$hc -and $psStyle.Formatting.$hc -match '^\e') { if ($canUseANSI -and -not $canUseHTML) { $psStyle.Formatting.$hc } else { $cssClasses += "formatting-$hc" } } elseif (-not $n -and $psStyle -and $psStyle.Foreground.$hc -and $psStyle.Foreground.$hc -match '^\e' ) { if ($canUseANSI -and -not $canUseHTML) { $psStyle.Foreground.$hc } else { $cssClasses += "foreground-$hc" } } elseif ($n -and $psStyle -and $psStyle.Background.$hc -and $psStyle.Background.$hc -match '^\e') { if ($canUseANSI -and -not $canUseHTML) { $psStyle.Background.$hc } else { $cssClasses += "background-$hc" } } if ($hc -and $hc -notmatch '^[\#\e]') { $placesToLook= @(if ($hc.Contains('.')) { $module, $setting = $hc -split '\.', 2 $theModule = Get-Module $module $theModule.PrivateData.Color, $theModule.PrivateData.Colors, $theModule.PrivateData.Colour, $theModule.PrivateData.Colours, $theModule.PrivateData.EZOut, $global:PSColors, $global:PSColours } else { $setting = $hc $moduleColorSetting = $theModule.PrivateData.PSColors.$setting }) foreach ($place in $placesToLook) { if (-not $place) { continue } foreach ($propName in $setting -split '\.') { $place = $place.$propName if (-not $place) { break } } if ($place -and "$place".StartsWith('#') -and 4,7 -contains "$place".Length) { $hc = $place continue } } if (-not $hc.StartsWith -or -not $hc.StartsWith('#')) { continue } } $r,$g,$b = if ($hc.Length -eq 7) { [int]::Parse($hc[1..2]-join'', 'HexNumber') [int]::Parse($hc[3..4]-join '', 'HexNumber') [int]::Parse($hc[5..6] -join'', 'HexNumber') }elseif ($hc.Length -eq 4) { [int]::Parse($hc[1], 'HexNumber') * 16 [int]::Parse($hc[2], 'HexNumber') * 16 [int]::Parse($hc[3], 'HexNumber') * 16 } if ($canUseHTML) { if ($n -eq 1) { "color:$hc" } elseif ($n -eq 2) { "background-color:$hc"} } elseif ($canUseANSI) { if ($n -eq 1) { $esc+"[38;2;$r;$g;${b}m" } elseif ($n -eq 2) { $esc+"[48;2;$r;$g;${b}m" } } }) $styleAttributes = @() + $colorAttributes $styleAttributes += @( if ($Bold) { if ($canUseHTML) {"font-weight:bold"} elseif ($canUseANSI) { '' + $esc + "[1m" } } if ($Faint) { if ($canUseHTML) { "opacity:.5" } elseif ($canUseANSI) { '' + $esc + "[2m" } } if ($Italic) { if ($canUseHTML) { "font-weight:bold" } elseif ($canUseANSI) {'' + $esc + "[3m" } } if ($Underline -and -not $doubleUnderline) { if ($canUseHTML) { "text-decoration:underline"} elseif ($canUseANSI) {'' +$esc + "[4m" } } if ($Blink) { if ($canUseANSI) { '' +$esc + "[5m" } } if ($invert) { if ($canUseHTML) {"filter:invert(100%)"} elseif ($canUseANSI) { '' + $esc + "[7m"} } if ($hide) { if ($canUseHTML) {"opacity:0"} elseif ($canUseANSI) { '' + $esc + "[8m"} } if ($Strikethru) { if ($canUseHTML) {"text-decoration: line-through"} elseif ($canUseANSI) { '' +$esc + "[9m" } } if ($DoubleUnderline) { if ($canUseHTML) { "border-bottom: 3px double;"} elseif ($canUseANSI) {'' +$esc + "[21m" } } ) $header = if ($canUseHTML) { "<span$( if ($styleAttributes) { " style='$($styleAttributes -join ';')'"} )$( if ($cssClasses) { " class='$($cssClasses -join ' ')'"} )>" } elseif ($canUseANSI) { $styleAttributes -join '' } } process { if ($header) { "$header" + "$(if ($inputObject) { $inputObject | Out-String})".Trim() } elseif ($inputObject) { ($inputObject | Out-String).Trim() } } end { if (-not $NoClear) { if ($canUseHTML) { "</span>" } elseif ($canUseANSI) { if ($Bold -or $Faint -or $colorAttributes -match '\[1;') { "$esc[22m" } if ($Italic) { "$esc[23m" } if ($Underline -or $doubleUnderline) { "$esc[24m" } if ($Blink) { "$esc[25m" } if ($Invert) { "$esc[27m" } if ($hide) { "$esc[28m" } if ($Strikethru) { "$esc[29m" } if ($ForegroundColor) { "$esc[39m" } if ($BackgroundColor) { "$esc[49m" } if (-not ($Underline -or $Bold -or $Invert -or $ForegroundColor -or $BackgroundColor)) { '' + $esc + '[0m' } } } } </ScriptBlock> </ExpressionBinding> </CustomItem> </CustomEntry> </CustomEntries> </CustomControl> </Control> </Controls> </Configuration> |