Public/Optimize-MarkdownText.ps1

Function Optimize-MarkdownText
{
    <#
        .SYNOPSIS
        Converts text to Markdown-optimized format.
 
        .DESCRIPTION
        Converts text to Markdown-optimized format by escaping syntax characters that can be interpreted by Markdown code.
 
        .PARAMETER String
        The text to be converted.
 
        .PARAMETER SkipEscapeSyntax
        Skips processing of individual characters.
 
        .PARAMETER SkipReturnCharacters
        Skips processing of carriage returns.
 
        .PARAMETER SkipTabCharacters
        Skips processing of preceding whitespace.
 
        .EXAMPLE
        Get-Content C:\Path\To\File.ps1 | Optimize-MarkdownText
 
        .EXAMPLE
        Get-Content -Raw C:\Path\To\File.ps1 | Optimize-MarkdownText -SkipReturnCharacters -SkipTabCharacters | clip
 
        .EXAMPLE
        Get-Content -Raw C:\Path\To\File.ps1 | Optimize-MarkdownText -SkipReturnCharacters | %{$_ | Out-File C:\Path\To\File.md -Encoding ascii -Append -Force}
 
    #>


    [CmdletBinding()]
    PARAM
    (
        [Parameter(Mandatory=$true, Position=0, ValueFromPipeline=$true)]
        [ValidateNotNullOrEmpty()]
        $String,

        [Parameter(Mandatory=$false)]
        [Switch]$SkipEscapeSyntax,

        [Parameter(Mandatory=$false)]
        [Switch]$SkipReturnCharacters,

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

    #region BEGIN Block
    BEGIN
    {
        # Locally scope ErrorActionPreference for predictable behavior of Try/Catch blocks inside the function
        $ErrorActionPreference = 'Stop'

        # Create output variable
        $Results = [System.Collections.ArrayList]::new()
    }
    #endregion BEGIN Block

    #region PROCESS Block
    PROCESS
    {
        FOREACH ($Entry in $String)
        {
            IF (!$SkipEscapeSyntax)
            {
                # Force typecast values to string
                $Entry = $Entry | %{([String]$_)}

                # Escape all markdown syntax characters
                $Entry = $Entry.Replace('\','\\')
                $Entry = $Entry.Replace('`','\`')
                $Entry = $Entry.Replace('*','\*')
                $Entry = $Entry.Replace('_','\_')
                $Entry = $Entry.Replace('{','\{')
                $Entry = $Entry.Replace('}','\}')
                $Entry = $Entry.Replace('[','\[')
                $Entry = $Entry.Replace(']','\]')
                $Entry = $Entry.Replace('<','\<')
                $Entry = $Entry.Replace('>','\>')
                $Entry = $Entry.Replace('(','\(')
                $Entry = $Entry.Replace(')','\)')
                $Entry = $Entry.Replace('#','\#')
                $Entry = $Entry.Replace('+','\+')
                $Entry = $Entry.Replace('-','\-')
                $Entry = $Entry.Replace('.','\.')
                $Entry = $Entry.Replace('!','\!')
                $Entry = $Entry.Replace('|','\|')
                $Entry = $Entry.Replace('=','\=')
                $Entry = $Entry.Replace('$','\$')
            }

            # Escape return characters
            SWITCH ($SkipReturnCharacters)
            {
                $true  {$Entry = $Entry.Split("`r`n")}
                $false {$Entry = $Entry.Replace("`r`n",'<br>')}
            }

            # Escape return characters
            IF (!$SkipTabCharacters)
            {
                $Entry = $Entry.TrimStart(" ")
                $Entry = $Entry.Replace("`t",'(TabChar)')
            }

            # Add to results
            $Results.Add($Entry) | Out-Null
        }
    }
    #endregion PROCESS Block

    #region END Block
    END
    {
        Return $Results
    }
    #endregion END Block
}