Private/Writers/Write-AssHeader.ps1

function Write-AssHeader {
    <#
    .SYNOPSIS
        Serializes an AssHeader (Script Info + Styles sections) to ASS text.
    #>

    [OutputType([string])]
    param(
        [Parameter(Mandatory)]
        [AssHeader] $Header
    )

    $sb = [System.Text.StringBuilder]::new()

    # Script Info section
    [void]$sb.AppendLine('[Script Info]')
    [void]$sb.AppendLine('; Script generated by SubtitleTools PowerShell module')
    [void]$sb.AppendLine('ScriptType: {0}' -f $Header.ScriptType)
    if ($Header.Title)          { [void]$sb.AppendLine('Title: {0}' -f $Header.Title) }
    if ($Header.OriginalScript) { [void]$sb.AppendLine('Original Script: {0}' -f $Header.OriginalScript) }
    if ($Header.PlayResX)       { [void]$sb.AppendLine('PlayResX: {0}' -f $Header.PlayResX) }
    if ($Header.PlayResY)       { [void]$sb.AppendLine('PlayResY: {0}' -f $Header.PlayResY) }
    if ($Header.YCbCrMatrix)    { [void]$sb.AppendLine('YCbCr Matrix: {0}' -f $Header.YCbCrMatrix) }

    foreach ($key in $Header.ExtraFields.Keys) {
        [void]$sb.AppendLine('{0}: {1}' -f $key, $Header.ExtraFields[$key])
    }

    [void]$sb.AppendLine()

    # Styles section
    $sectionName = if ($Header.ScriptType -eq 'v4.00+') { '[V4+ Styles]' } else { '[V4 Styles]' }
    [void]$sb.AppendLine($sectionName)
    [void]$sb.AppendLine('Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding')

    foreach ($style in $Header.Styles) {
        [void]$sb.AppendLine($style.ToAssLine())
    }

    [void]$sb.AppendLine()

    return $sb.ToString()
}