1package diffview
2
3import (
4 "fmt"
5 "image/color"
6 "io"
7
8 "github.com/alecthomas/chroma/v2"
9 "github.com/charmbracelet/lipgloss/v2"
10)
11
12var _ chroma.Formatter = chromaFormatter{}
13
14// chromaFormatter is a custom formatter for Chroma that uses Lip Gloss for
15// foreground styling, while keeping a forced background color.
16type chromaFormatter struct {
17 bgColor color.Color
18}
19
20// Format implements the chroma.Formatter interface.
21func (c chromaFormatter) Format(w io.Writer, style *chroma.Style, it chroma.Iterator) error {
22 for token := it(); token != chroma.EOF; token = it() {
23 entry := style.Get(token.Type)
24 if entry.IsZero() {
25 if _, err := fmt.Fprint(w, token.Value); err != nil {
26 return err
27 }
28 continue
29 }
30
31 s := lipgloss.NewStyle().
32 Background(c.bgColor)
33
34 if entry.Bold == chroma.Yes {
35 s = s.Bold(true)
36 }
37 if entry.Underline == chroma.Yes {
38 s = s.Underline(true)
39 }
40 if entry.Italic == chroma.Yes {
41 s = s.Italic(true)
42 }
43 if entry.Colour.IsSet() {
44 s = s.Foreground(lipgloss.Color(entry.Colour.String()))
45 }
46
47 if _, err := fmt.Fprint(w, s.Render(token.Value)); err != nil {
48 return err
49 }
50 }
51 return nil
52}