Created
January 25, 2016 23:50
-
-
Save josheinstein/aed1a6c89ff18b9dceb5 to your computer and use it in GitHub Desktop.
Text wrapping module for PowerShell
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#.SYNOPSIS | |
# Takes one or more lines of text that were produced by a text-wrapping algorithm | |
# and attempts to 'unwrap' them so that the line breaks that were added are removed. | |
# | |
#.DESCRIPTION | |
# Unwrapping text is an error-prone process, because it is impossible to know for sure | |
# whether or not a hard line break was intentional or added as a result of word-wrapping. | |
# This function makes several assumptions about wrapped text. For example, if there are | |
# spaces at the end of a line and the following line is not blank, it is assumed that the | |
# line was wrapped. If there is a space on a blank line, it is assumed that the line | |
# break is intentional and will not be unwrapped. | |
# | |
#.EXAMPLE | |
# Get-Help ForEach-Object | Select -Expand Description | Undo-TextWrapping | |
# | |
function Undo-TextWrapping | |
{ | |
[CmdletBinding()] | |
[OutputType([String])] | |
param ( | |
# The lines of text to unwrap, which may be supplied | |
# on the pipeline. | |
[Alias('Text')] | |
[AllowEmptyString()] | |
[Parameter(Position=1, Mandatory=$true, ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true)] | |
[String[]]$InputString | |
) | |
begin { | |
$Lines = @() | |
$CurrentLine = "" | |
} | |
process { | |
foreach ($Line in @($InputString -split '[\r\n|\r|\n]')) { | |
# Skip this shit | |
if ($Line -eq $Null) { continue } | |
switch -regex ($Line) { | |
# Special circumstances where we believe this to | |
# definitely be a new line. (ie. list patterns, | |
# space(s) at beginning of line, etc) | |
'^(\s|\d+[\.\)\]]\s|\-\s)' { | |
# Commit the current line | |
if ($CurrentLine) { | |
$Lines += $CurrentLine.TrimEnd() | |
} | |
$CurrentLine = $Line | |
break | |
} | |
# Line is not blank | |
'\S' { | |
$CurrentLine += $Line.TrimEnd() + ' ' | |
break | |
} | |
# Blank or contains only spaces | |
'^\s*$' { | |
# Commit the current line | |
if ($CurrentLine) { | |
$Lines += $CurrentLine.TrimEnd() | |
} | |
$CurrentLine = '' | |
break | |
} | |
} | |
} | |
} | |
end { | |
# If we have anything left over... | |
if ($CurrentLine) { | |
$Lines += $CurrentLine.TrimEnd() | |
} | |
for ($i=0; $i -lt $Lines.Count; $i++) { | |
Write-Verbose $Lines[$i] | |
} | |
$Lines | |
} | |
} | |
Export-ModuleMember -Function Undo-TextWrapping |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment