RenderSplitDiff renders parsed diff in side-by-side layout.
(parsed ParsedDiff, filename string, styles Styles, t theme.Theme, width int)
| 319 | |
| 320 | // RenderSplitDiff renders parsed diff in side-by-side layout. |
| 321 | func RenderSplitDiff(parsed ParsedDiff, filename string, styles Styles, t theme.Theme, width int) string { |
| 322 | if parsed.Binary { |
| 323 | return RenderBinaryFile(styles, width) |
| 324 | } |
| 325 | initChromaStyle(t.ChromaStyle) |
| 326 | |
| 327 | pairs := PairLines(parsed.Lines) |
| 328 | panelW := (width - 1) / 2 // 1 char for separator |
| 329 | |
| 330 | var b strings.Builder |
| 331 | for _, sl := range pairs { |
| 332 | // Hunk headers span full width |
| 333 | if sl.Left != nil && sl.Left.Type == LineHunkHeader { |
| 334 | b.WriteString(renderHunkLine(*sl.Left, styles, width)) |
| 335 | b.WriteByte('\n') |
| 336 | continue |
| 337 | } |
| 338 | left := renderSplitSide(sl.Left, filename, styles, t, panelW, true) |
| 339 | right := renderSplitSide(sl.Right, filename, styles, t, panelW, false) |
| 340 | b.WriteString(left) |
| 341 | b.WriteString(lipgloss.NewStyle().Foreground(lipgloss.Color(t.BorderFg)).Render("│")) |
| 342 | b.WriteString(right) |
| 343 | b.WriteByte('\n') |
| 344 | } |
| 345 | return b.String() |
| 346 | } |
| 347 | |
| 348 | // RenderNewFileSplit renders untracked file content in split layout (all-added on right). |
| 349 | func RenderNewFileSplit(content, filename string, styles Styles, t theme.Theme, width int) string { |