using module ./SoftwareReport.psm1 using module ./SoftwareReport.BaseNodes.psm1 using module ./SoftwareReport.Nodes.psm1 class SoftwareReportDifferenceRender { [String] GenerateMarkdownReport([SoftwareReport] $CurrentReport, [SoftwareReport] $PreviousReport, [ReportDifferenceItem[]] $AddedItems, [ReportDifferenceItem[]] $ChangedItems, [ReportDifferenceItem[]] $DeletedItems) { $sb = [System.Text.StringBuilder]::new() $rootNode = $CurrentReport.Root $imageVersion = $CurrentReport.GetImageVersion() $previousImageVersion = $PreviousReport.GetImageVersion() ############################# ### Render report header #### ############################# $sb.AppendLine("# :desktop_computer: Actions Runner Image: $($rootNode.Title)") # ToolVersionNodes on root level contains main image description so just copy-paste them to final report $rootNode.Children | Where-Object { $_ -is [ToolVersionNode] } | ForEach-Object { $sb.AppendLine($_.ToMarkdown()) } $sb.AppendLine() $sb.AppendLine("## :mega: What's changed?").AppendLine() ########################### ### Render added items #### ########################### [ReportDifferenceItem[]] $addedItemsBaseTools = $AddedItems | Where-Object { $_.IsBaseToolNode() } [ReportDifferenceItem[]] $addedItemsTables = $AddedItems | Where-Object { $_.IsTableNode() } if ($addedItemsBaseTools.Count + $addedItemsTables.Count -gt 0) { $sb.AppendLine("### Added :heavy_plus_sign:").AppendLine() } if ($addedItemsBaseTools.Count -gt 0) { $tableItems = $addedItemsBaseTools | ForEach-Object { [PSCustomObject]@{ "Category" = $this.RenderCategory($_.Headers, $true); "Tool name" = $this.RenderToolName($_.CurrentReportNode.ToolName); "Current ($imageVersion)" = $_.CurrentReportNode.GetValue(); } } $sb.AppendLine($this.RenderHtmlTable($tableItems, "Category")) } if ($addedItemsTables.Count -gt 0) { $addedItemsTables | ForEach-Object { $sb.AppendLine($this.RenderTableNodesDiff($_)) } } ############################# ### Render deleted items #### ############################# [ReportDifferenceItem[]] $deletedItemsBaseTools = $DeletedItems | Where-Object { $_.IsBaseToolNode() } [ReportDifferenceItem[]] $deletedItemsTables = $DeletedItems | Where-Object { $_.IsTableNode() } if ($deletedItemsBaseTools.Count + $deletedItemsTables.Count -gt 0) { $sb.AppendLine("### Deleted :heavy_minus_sign:").AppendLine() } if ($deletedItemsBaseTools.Count -gt 0) { $tableItems = $deletedItemsBaseTools | ForEach-Object { [PSCustomObject]@{ "Category" = $this.RenderCategory($_.Headers, $true); "Tool name" = $this.RenderToolName($_.PreviousReportNode.ToolName); "Previous ($previousImageVersion)" = $_.PreviousReportNode.GetValue(); } } $sb.AppendLine($this.RenderHtmlTable($tableItems, "Category")) } if ($deletedItemsTables.Count -gt 0) { $deletedItemsTables | ForEach-Object { $sb.AppendLine($this.RenderTableNodesDiff($_)) } } ############################# ### Render updated items #### ############################# [ReportDifferenceItem[]] $changedItemsBaseTools = $ChangedItems | Where-Object { $_.IsBaseToolNode() } [ReportDifferenceItem[]] $changedItemsTables = $ChangedItems | Where-Object { $_.IsTableNode() } if ($changedItemsBaseTools.Count + $changedItemsTables.Count -gt 0) { $sb.AppendLine("### Updated").AppendLine() } if ($changedItemsBaseTools.Count -gt 0) { $tableItems = $changedItemsBaseTools | ForEach-Object { [PSCustomObject]@{ "Category" = $this.RenderCategory($_.Headers, $true); "Tool name" = $this.RenderToolName($_.CurrentReportNode.ToolName); "Previous ($previousImageVersion)" = $_.PreviousReportNode.GetValue(); "Current ($imageVersion)" = $_.CurrentReportNode.GetValue(); } } $sb.AppendLine($this.RenderHtmlTable($tableItems, "Category")) } if ($changedItemsTables.Count -gt 0) { $changedItemsTables | ForEach-Object { $sb.AppendLine($this.RenderTableNodesDiff($_)) } } return $sb.ToString() } [String] RenderHtmlTable([PSCustomObject[]] $Table, [String] $RowSpanColumnName) { $headers = $Table[0].PSObject.Properties.Name $sb = [System.Text.StringBuilder]::new() $sb.AppendLine("
| $_ | ") } $sb.AppendLine(" ") $sb.AppendLine(" ") $tableRowSpans = $this.CalculateHtmlTableRowSpan($Table, $RowSpanColumnName) for ($rowIndex = 0; $rowIndex -lt $Table.Count; $rowIndex++) { $row = $Table[$rowIndex] $sb.AppendLine("|
|---|---|
| $($row.$_) | ") } else { # Skip rendering this cell at all } } else { $sb.AppendLine("$($row.$_) | ") } } $sb.AppendLine("