chroma.go 1.1 KB

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