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: $_" } |