ps/Modules/Cole.PowerShell.Developer/Public/Format-TextJustified.ps1

56 lines
1.7 KiB
PowerShell
Raw Normal View History

2023-05-30 22:51:22 -07:00
function Format-TextJustified {
param(
[string[]]$Words,
[int]$MaxWidth,
[switch]$ExceptLastLine
)
if ($Words.Count -eq 1) {
$Words = $Words -split '\s+'
}
$preProcess = @()
$row = @{ Letters = 0; Words = @() }
foreach ($word in $Words) {
if (($row.Words.Count -gt 0) -and ($row.Letters + $row.Words.Count + $word.Length -gt $MaxWidth)) {
# adding this word to the array would make it cross the magic threshold
# Add a new row to the array and start using that.
$preProcess += $row
$row = @{ Letters = 0; Words = @() }
}
$row.Words += $word
$row.Letters += $word.Length
}
# push the final row
$preProcess += $row
$results = @()
$rowCounter = 0
foreach ($row in $preProcess) {
if ($row.Words.Count -eq 1 -or $rowCounter -eq $preProcess.Count) {
$results += (($row.Words -join ' ') + "".PadRight($MaxWidth - $row.Letters - $row.Words.Count + 1))
continue
}
$rowWordCount = $row.Words.Count
$countLessOne = $rowWordCount - 1
$spaces = $MaxWidth - $row.Letters
$minSpaces = "".PadRight(([Math]::Floor($spaces/$countLessOne)))
$addSpace = $spaces % $countLessOne
$result = $row.Words[0]
for($i = 1; $i -lt $rowWordCount; $i++) {
$extraSpaces = ""
if ($i -le $addSpace) {
$extraSpaces = ' '
}
$word = $row.Words[$i]
$result += "$minSpaces$extraSpaces$word"
}
$results += $result
}
if ($ExceptLastLine) {
$results[-1] = ($results[-1] -split '\s+') -join ' '
}
return $results -join "`n"
}