Types/OpenPackage.Part/ReadMarkdown.ps1

<#
.SYNOPSIS
    Reads Part Content as Markdown
.DESCRIPTION
    Reads Package Part Content as Markdown
#>

[Reflection.AssemblyMetadata(
    # This should automatically apply to .md or .markdown files
    'FilePattern', 
    '\.(?>md|markdown)$'
)]
[Reflection.AssemblyMetadata(
    # This should automatically apply to markdown content types
    'ContentTypePattern', 
    '[/\+]markdown'
)]
param(
    # An optional input object
    # If provided, content will be read from this object.
    # If not provided, content will be read from this part.
    [Alias('Input')]
    [PSObject]$InputObject = $null,
 
    # Any options used to read the data.
    [Alias('Options')]
    [Collections.IDictionary]$Option = [Ordered]@{}
)

if (-not $inputObject) {
    if (-not $this.ReadText) { return }

    $partString = $this.ReadText($InputObject, $Option)
} else {
    $partString = "$inputObject"
}


if (-not ('Markdig.MarkdownPipelineBuilder' -as [type])) {
    Write-Warning "Markdig not loaded (ConvertFrom-Markdown is not installed)"
    $partString = [PSObject]::new($partString)
    $partString.pstypenames.add('text/markdown')
    $partString
    return
}

$mdPipelineBuilder = [Markdig.MarkdownPipelineBuilder]::new()
$mdPipeline = [Markdig.MarkdownExtensions]::UseYamlFrontMatter(
    [Markdig.MarkdownExtensions]::UsePipeTables($mdPipelineBuilder)
).Build()

try {
    if ($partString -match '^---') {
        $null, $yamlheader, $md = $partString -split '---', 3
        
        $convertFromYamlCommand = 
            $ExecutionContext.SessionState.InvokeCommand.GetCommand('ConvertFrom-Yaml', 'Cmdlet,Function')
        if (-not $convertFromYamlCommand -or -not 
            $convertFromYamlCommand.Parameters.InputObject
        ) {
            Write-Warning "Convert-FromYaml not found, please install YaYaml to read Yaml Header"
            [PSCustomObject]@{
                PSTypeName = 'text/markdown'
                Html = [Markdig.Markdown]::ToHtml($partString, $mdPipeline)
                Markdown = "$partString"        
            } |
                Add-Member ScriptMethod ToString { "$($this.Html)" } -Force -PassThru
        } else {
            $yamlObject = & $convertFromYamlCommand -InputObject $yamlheader
            if ($yamlObject) {
                [PSCustomObject]@{
                    PSTypeName='text/markdown'
                    Html = [Markdig.Markdown]::ToHtml($partString, $mdPipeline)
                    Markdown = "$md"
                    FrontMatter = $yamlObject
                } |                     
                    Add-Member ScriptMethod ToString { "$($this.Html)" } -Force -PassThru
            }
        }                
    } else {
        [PSCustomObject]@{
            PSTypeName = 'text/markdown'
            Html = [Markdig.Markdown]::ToHtml($partString, $mdPipeline)
            Markdown = "$partString"        
        } |
            Add-Member ScriptMethod ToString { "$($this.Html)" } -Force -PassThru
    }        
} catch {
    Write-Warning "'$($this.Uri)' was not valid markdown: $_"
}