Private/Convert-ConfluenceMarkdownToStorage.ps1
|
function Convert-ConfluenceMarkdownToStorage { <# .SYNOPSIS Wandelt einen vollständigen Markdown-Text in Confluence-Storage-Format (XHTML) um. .DESCRIPTION Zerlegt den Text in durch Leerzeilen getrennte Blöcke und erkennt je Block: Tabellen (| ... | oder || ... ||), Überschriften (#), Listen (-, *, + oder 1.) und Absätze. Innerhalb von Absätzen, Listen und Tabellenzellen werden fett/kursiv/Code/Links umgewandelt. #> [CmdletBinding()] param ( [Parameter(Mandatory = $true)] [AllowEmptyString()] [string] $Markdown ) process { $Lines = $Markdown -split "`r?`n" $Blocks = New-Object System.Collections.Generic.List[string[]] $Current = New-Object System.Collections.Generic.List[string] foreach ($Line in $Lines) { if ($Line.Trim() -eq "") { if ($Current.Count -gt 0) { $Blocks.Add($Current.ToArray()) $Current.Clear() } } else { $Current.Add($Line) } } if ($Current.Count -gt 0) { $Blocks.Add($Current.ToArray()) } $Html = foreach ($Block in $Blocks) { $First = $Block[0].Trim() if ($Block | Where-Object { $_.Trim() -match '^\|' }) { Convert-ConfluenceMarkdownTable -Lines $Block } elseif ($First -match '^(#{1,6})\s+(.*)$') { $Level = $Matches[1].Length "<h$Level>$(Convert-ConfluenceMarkdownInline -Text $Matches[2])</h$Level>" } elseif ($First -match '^[-*+]\s+') { $Items = foreach ($BlockLine in $Block) { if ($BlockLine.Trim() -match '^[-*+]\s+(.*)$') { "<li>$(Convert-ConfluenceMarkdownInline -Text $Matches[1])</li>" } } "<ul>$($Items -join '')</ul>" } elseif ($First -match '^\d+\.\s+') { $Items = foreach ($BlockLine in $Block) { if ($BlockLine.Trim() -match '^\d+\.\s+(.*)$') { "<li>$(Convert-ConfluenceMarkdownInline -Text $Matches[1])</li>" } } "<ol>$($Items -join '')</ol>" } else { $ParagraphLines = $Block | ForEach-Object { Convert-ConfluenceMarkdownInline -Text $_.Trim() } "<p>$($ParagraphLines -join '<br/>')</p>" } } } end { return ($Html -join '') } } |