Skip to content

Instantly share code, notes, and snippets.

@josheinstein
Created January 25, 2016 23:50
Show Gist options
  • Save josheinstein/aed1a6c89ff18b9dceb5 to your computer and use it in GitHub Desktop.
Save josheinstein/aed1a6c89ff18b9dceb5 to your computer and use it in GitHub Desktop.
Text wrapping module for PowerShell
#.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