Private/Get-DiffHtmlPane.ps1

#Requires -Version 5.1

function Get-DiffHtmlPane {
    <#
    .SYNOPSIS
        変更前または変更後のペインの HTML を生成する。
    .DESCRIPTION
        反対側にしか無い行の位置には空行を配置し、斜線で対応する行が無いことを示します。
    .PARAMETER Rows
        Get-DiffAlignment が返す行の対応付け(TextDiff.DiffRow の配列)。それ以外は受け付けません。
    .PARAMETER Side
        生成する側。'left' は変更前、'right' は変更後です。
    .OUTPUTS
        [string] ペインの HTML。
    #>

    [CmdletBinding()]
    [OutputType([string])]
    param(
        [Parameter(Mandatory)] [AllowEmptyCollection()] [PSTypeName('TextDiff.DiffRow')] [psobject[]]$Rows,
        [Parameter(Mandatory)] [ValidateSet('left', 'right', IgnoreCase = $false)] [string]$Side
    )

    $builder = [System.Text.StringBuilder]::new()
    [void]$builder.AppendLine(" <div class=""pane $Side"">")
    [void]$builder.AppendLine(' <table>')

    foreach ($row in $Rows) {
        $isLeft = ($Side -ceq 'left')
        $number = if ($isLeft) { $row.LeftNo } else { $row.RightNo }
        $text = if ($isLeft) { $row.Left } else { $row.Right }

        $rowClass = switch -CaseSensitive ($row.Kind) {
            'Changed' { ' class="mod"' }
            'Deleted' { ' class="del"' }
            'Added' { ' class="add"' }
            default { '' }
        }

        if ($null -eq $number) {
            # 反対側にしか無い行も空行を配置し、左右の行数を一致させる。一致しないと行が上下にずれ、左右を比較できない。
            [void]$builder.AppendLine(" <tr$rowClass><td class=""ln""></td><td class=""tx empty""></td></tr>")
            continue
        }

        if ($row.Kind -ceq 'Changed') {
            $inline = Get-InlineDiff -Left $row.Left -Right $row.Right
            $body = ConvertTo-HtmlSegment -Segments $(if ($isLeft) { $inline.Left } else { $inline.Right })
        }
        else {
            $body = ConvertTo-HtmlText -Text ([string]$text)
        }
        [void]$builder.AppendLine(" <tr$rowClass><td class=""ln"">$number</td><td class=""tx"">$body</td></tr>")
    }

    [void]$builder.AppendLine(' </table>')
    [void]$builder.Append(' </div>')
    return $builder.ToString()
}