Public/Format-MarkdownTable.ps1

Function Format-MarkDownTable
    {
        <#
        .SYNOPSIS
        Formats a Markdown table for better readability.
        .EXAMPLE
        Format-MarkDownTable -Table $Table
        #>


        [CmdletBinding()]
        param(
            [Parameter(Mandatory=$true, ValueFromPipeline=$true, Position = 1, HelpMessage="The Markdown table string to format for better readability.")]
            [string]$Table,
            [Parameter(Mandatory=$false, Position = 2, HelpMessage="If specified, the formatted table will be copied to the clipboard.")]
            [switch]$Clipboard
        )

        If ($PSBoundParameters['Debug']) {$DebugPreference = 'Continue'}

        $Table = $Table.TrimStart("`r`n")
        $Table = $Table.TrimEnd("`r`n")
        $Rows = $Table -split "\r\n"
        If($Rows.Count -eq 1)
            {
                $Rows = $Table -split "\n"
            }

        $TableDelimiter = '(?<!\\)\|'

        ForEach($Row in $Rows)
            {
                If(($Rows.IndexOf($Row) + 1) -eq 2)
                    {
                        Continue
                    }

                $RowSplit = $Row -split $TableDelimiter
                $TotalColumns = ($RowSplit.Count - 2)

                $RowSplit = $RowSplit[1..$TotalColumns]

                $Column = 1

                While($Column -le $TotalColumns)
                    {
                        $CurrentColumn = $RowSplit[$Column - 1].Trim()

                        $Length = $CurrentColumn.Length
                        $VariableName = "Row$($Rows.IndexOf($Row) + 1)Column$Column"
                        New-Variable -Name $VariableName -Value $Length
                        Write-Debug "Row $($Rows.IndexOf($Row) + 1): Column $Column Length: $Length"

                        $Column += 1
                    }
            }

        $ColumnNumber = 1

        While($ColumnNumber -le $TotalColumns)
            {
                $RowNumber = 1
                $ColumnLength  = 0
                While($RowNumber -le $Rows.Count)
                    {
                        If($RowNumber -eq 2)
                            {
                                $RowNumber += 1
                                Continue
                            }
                        $TempColumnLength = Get-Variable -Name "Row$RowNumber`Column$ColumnNumber" -ValueOnly
                        If($TempColumnLength -gt $ColumnLength)
                            {
                                $ColumnLength = $TempColumnLength
                            }
                        $RowNumber += 1
                    }

                New-Variable -Name "Column$ColumnNumber`Length" -Value $ColumnLength

                Write-Debug "Column$ColumnNumber Length: $ColumnLength"
                $ColumnNumber += 1
            }

        $NewTable = ""
        ForEach($Row in $Rows)
            {
                $NewRow = '|'
                $RowSplit = $Row -split $TableDelimiter
                $TotalColumns = ($RowSplit.Count - 2)

                $RowSplit = $RowSplit[1..$TotalColumns]

                $ColumnNumber = 1

                $NewCharacters = " "
                If($Rows.IndexOf($Row) -eq 1)
                    {
                        $NewCharacters = '-'
                    }

                While($ColumnNumber -le $TotalColumns)
                    {
                        $ColumnLength = Get-Variable -Name "Column$ColumnNumber`Length" -ValueOnly

                        $CurrentValue = $RowSplit[$ColumnNumber - 1]
                        $AddedCharacters = $ColumnLength - ($CurrentValue.Trim()).Length

                        If($CurrentValue.Length -ge 1)
                            {
                                If($AddedCharacters -lt 0)
                                    {
                                        $NewTableValue = ($CurrentValue).Trim().Substring(0,(($CurrentValue.Trim()).Length - ($AddedCharacters * -1)))
                                        Write-Debug "Removing '$NewCharacters' * $($AddedCharacters * -1) from $(($CurrentValue).Trim())"
                                    }
                                Else
                                    {
                                        $NewTableValue = ($CurrentValue).Trim() + ($NewCharacters * $AddedCharacters)
                                        Write-Debug "Adding '$NewCharacters' * $AddedCharacters to $(($CurrentValue).Trim())"
                                    }
                                $NewRow += " $NewTableValue |"
                            }
                        Else
                            {
                                $NewTableValue = ($NewCharacters * $AddedCharacters)
                                $NewRow += " $NewTableValue `|"
                            }

                        $ColumnNumber += 1
                    }

                $NewTable += "$NewRow`r`n"
            }

        Get-Variable -Name Row* | Remove-Variable
        Get-Variable -Name Column* | Remove-Variable

        If($Clipboard -eq $true)
            {
                $NewTable | Set-Clipboard
            }

        Return $NewTable
    }