Public/ConvertTo-MarkdownTable.ps1

Function ConvertTo-MarkdownTable
{
    <#
        .SYNOPSIS
        Converts a PowerShell object to a Markdown table.
 
        .DESCRIPTION
        Converts a PowerShell object to a Markdown table.
 
        .PARAMETER InputObject
        The PowerShell object to be converted.
 
        .PARAMETER Alignment
        The direction to align the text to in the table fields.
 
        .PARAMETER EscapeSyntax
        Escapes Markdown syntax characters in all fields. This can be useful when handling nested script blocks.
 
        .EXAMPLE
        ConvertTo-MarkdownTable -InputObject (Get-Service)
 
        .EXAMPLE
        Get-Command -Module Microsoft.PowerShell.Utility | ConvertTo-MarkdownTable -EscapeSyntax | Out-File "C:\Path\To\My\File.md" -Encoding "ASCII" -Append
 
        .EXAMPLE
        Get-Alias | ConvertTo-MarkdownTable -Alignment Center
 
    #>


    [CmdletBinding()]
    PARAM
    (
        [Parameter(Mandatory=$true, Position=0, ValueFromPipeline=$true)]
        [Object]$InputObject,

        [Parameter(Mandatory=$false, Position=1, ValueFromPipeline=$false)]
        [ValidateSet("Center","Left","Right")]
        [String]$Alignment = "Left",

        [Parameter(Mandatory=$false)]
        [Switch]$EscapeSyntax
    )

    #region BEGIN Block
    BEGIN
    {
        # Declare variables
        $Data = @()

        #initialize an empty string for markdown text
        $Results = ''
    }
    #endregion BEGIN Block

    #region PROCESS Block
    PROCESS
    {
        # Add Input Objects to Data
        $Data += $InputObject
    }
    #endregion PROCESS Block

    #region END Block
    END
    {
        IF ($Data)
        {
            # Get Property Names
            $Names = $Data[0].PSObject.Properties.Name

            # Create heading field
            $Heading = "| $($Names -join " | ") |`n"

            # Add to results
            $Results += $Heading

            # Create alignment field for each property
            $AlignmentFields = FOREACH ($Name in $Names)
            {
                SWITCH ($Alignment)
                {
                    Center {":$("-" * ($Name.Length - 2)):"}
                    Left   {":$("-" * ($Name.Length - 1))"}
                    Right  {"$("-" * ($Name.Length - 1)):"}
                }
            }

            # Join alignment fields
            $TableAlignment = "| $($AlignmentFields -join " | ") |`n"

            # Add to results
            $Results += $TableAlignment


            FOREACH ($Entry in $Data)
            {
                # Declare variables
                $values = @()

                # Declare counter
                $i = 0

                # Add value for each property to $Values variable
                WHILE ($i -lt $Names.count)
                {
                    $Values += $Entry.($Names[$i])
                    $i++
                }

                IF ($EscapeSyntax)
                {
                    # Force typecast values to string
                    $Values = $Values | %{([String]$_)}

                    # Escape all markdown syntax characters
                    $Values = $Values.Replace('\','\\')
                    $Values = $Values.Replace('`','\`')
                    $Values = $Values.Replace('*','\*')
                    $Values = $Values.Replace('_','\_')
                    $Values = $Values.Replace('{','\{')
                    $Values = $Values.Replace('}','\}')
                    $Values = $Values.Replace('[','\[')
                    $Values = $Values.Replace(']','\]')
                    $Values = $Values.Replace('<','\<')
                    $Values = $Values.Replace('>','\>')
                    $Values = $Values.Replace('(','\(')
                    $Values = $Values.Replace(')','\)')
                    $Values = $Values.Replace('#','\#')
                    $Values = $Values.Replace('+','\+')
                    $Values = $Values.Replace('-','\-')
                    $Values = $Values.Replace('.','\.')
                    $Values = $Values.Replace('!','\!')
                    $Values = $Values.Replace('|','\|')
                    $Values = $Values.Replace('=','\=')
                    $Values = $Values.Replace('$','\$')
                    $Values = $Values.Replace("`r`n",'(ReturnChar)')
                    $Values = $Values.Replace("`t",'(TabChar)')
                }

                # Join value fields
                $Line = "| $($Values -join " | ") |`n"

                # Add to results
                $Results += $Line
            }
        }

        Return $Results
    }
    #endregion END Block
}