| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- package diffview
- import (
- "fmt"
- "image/color"
- "io"
- "strings"
- "charm.land/lipgloss/v2"
- "github.com/alecthomas/chroma/v2"
- "github.com/charmbracelet/crush/internal/ansiext"
- )
- var _ chroma.Formatter = chromaFormatter{}
- // chromaFormatter is a custom formatter for Chroma that uses Lip Gloss for
- // foreground styling, while keeping a forced background color.
- type chromaFormatter struct {
- bgColor color.Color
- }
- // Format implements the chroma.Formatter interface.
- func (c chromaFormatter) Format(w io.Writer, style *chroma.Style, it chroma.Iterator) error {
- for token := it(); token != chroma.EOF; token = it() {
- value := strings.TrimRight(token.Value, "\n")
- value = ansiext.Escape(value)
- entry := style.Get(token.Type)
- if entry.IsZero() {
- if _, err := fmt.Fprint(w, value); err != nil {
- return err
- }
- continue
- }
- s := lipgloss.NewStyle().
- Background(c.bgColor)
- if entry.Bold == chroma.Yes {
- s = s.Bold(true)
- }
- if entry.Underline == chroma.Yes {
- s = s.Underline(true)
- }
- if entry.Italic == chroma.Yes {
- s = s.Italic(true)
- }
- if entry.Colour.IsSet() {
- s = s.Foreground(lipgloss.Color(entry.Colour.String()))
- }
- if _, err := fmt.Fprint(w, s.Render(value)); err != nil {
- return err
- }
- }
- return nil
- }
|