chroma.go

 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}