Public/ConvertTo-ConfluenceStorageFormat.ps1

function ConvertTo-ConfluenceStorageFormat {
    <#
    .SYNOPSIS
        Wandelt Text/Markdown/einfaches HTML in das Confluence-Storage-Format (XHTML) um.
    .DESCRIPTION
        Bei -PlainText wird jede Zeile zu einem eigenen <p>-Absatz, Sonderzeichen werden escaped.
        Bei -Markdown werden Überschriften (#), Listen (-, *, 1.), Tabellen (| ... | oder || ... ||)
        sowie Inline-Markdown (**fett**, *kursiv*, `code`, [Text](URL)) in Storage-Format umgewandelt.
        Ohne beide Switches wird der Input als bereits gültiges (X)HTML/Storage-Markup durchgereicht
        und nur grob auf Wohlgeformtheit geprüft.
    .PARAMETER InputText
        Der zu konvertierende Text bzw. das HTML/Markdown-Fragment.
    .PARAMETER PlainText
        Behandelt InputText als reinen Text statt als HTML.
    .PARAMETER Markdown
        Behandelt InputText als Markdown (Tabellen, Listen, Überschriften, Inline-Formatierung).
    .EXAMPLE
        ConvertTo-ConfluenceStorageFormat -InputText "Zeile 1`nZeile 2" -PlainText
    .EXAMPLE
        $md = "||Tenant||Beschreibung||`n| Prod | Produktion |`n| Test | Testumgebung |"
        ConvertTo-ConfluenceStorageFormat -InputText $md -Markdown
    #>

    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true, ValueFromPipeline = $true)]
        [AllowEmptyString()]
        [string]
        $InputText,

        [Parameter(Mandatory = $false)]
        [switch]
        $PlainText,

        [Parameter(Mandatory = $false)]
        [switch]
        $Markdown
    )

    process {
        if ($PlainText -and $Markdown) {
            Throw "-PlainText und -Markdown können nicht gemeinsam verwendet werden."
        }

        if ($Markdown) {
            return (Convert-ConfluenceMarkdownToStorage -Markdown $InputText)
        }

        if ($PlainText) {
            $Lines = $InputText -split "`r?`n"
            $Paragraphs = foreach ($Line in $Lines) {
                if ($Line.Trim() -eq "") { continue }
                $Escaped = [System.Net.WebUtility]::HtmlEncode($Line)
                "<p>$Escaped</p>"
            }
            return ($Paragraphs -join "")
        }

        try {
            [xml]$null = "<root>$InputText</root>"
        }
        catch {
            Throw "InputText ist kein wohlgeformtes XHTML-Fragment. Für reinen Text -PlainText oder für Markdown -Markdown verwenden. Fehler: $($_.Exception.Message)"
        }

        return $InputText
    }
}