2021-03-26 22:57:47 +03:00
|
|
|
package lipgloss
|
|
|
|
|
|
|
|
import (
|
|
|
|
"strings"
|
|
|
|
|
|
|
|
"github.com/muesli/reflow/ansi"
|
|
|
|
"github.com/muesli/termenv"
|
|
|
|
)
|
|
|
|
|
|
|
|
// whitespace is a whitespace renderer.
|
|
|
|
type whitespace struct {
|
|
|
|
style termenv.Style
|
|
|
|
chars string
|
|
|
|
}
|
|
|
|
|
|
|
|
// Render spacespace.
|
|
|
|
func (w whitespace) render(width int) string {
|
|
|
|
if w.chars == "" {
|
|
|
|
w.chars = " "
|
|
|
|
}
|
|
|
|
|
2021-03-30 17:45:47 +03:00
|
|
|
r := []rune(w.chars)
|
|
|
|
j := 0
|
|
|
|
b := strings.Builder{}
|
2021-03-26 22:57:47 +03:00
|
|
|
|
2021-03-30 17:45:47 +03:00
|
|
|
// Cycle through runes and print them into the whitespace.
|
|
|
|
for i := 0; i < width; {
|
|
|
|
b.WriteRune(r[j])
|
|
|
|
j++
|
|
|
|
if j >= len(r) {
|
|
|
|
j = 0
|
|
|
|
}
|
|
|
|
i += ansi.PrintableRuneWidth(string(r[j]))
|
|
|
|
}
|
|
|
|
|
|
|
|
// Fill any extra gaps white spaces. This might be necessary if any runes
|
|
|
|
// are more than one cell wide, which could leave a one-rune gap.
|
|
|
|
short := width - ansi.PrintableRuneWidth(b.String())
|
2021-03-26 22:57:47 +03:00
|
|
|
if short > 0 {
|
2021-03-30 17:45:47 +03:00
|
|
|
b.WriteString(strings.Repeat(" ", short))
|
2021-03-26 22:57:47 +03:00
|
|
|
}
|
|
|
|
|
2021-03-30 17:45:47 +03:00
|
|
|
return w.style.Styled(b.String())
|
2021-03-26 22:57:47 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
// WhiteSpaceOption sets a styling rule for rendering whitespace.
|
|
|
|
type WhitespaceOption func(*whitespace)
|
|
|
|
|
2021-03-30 17:45:47 +03:00
|
|
|
// WithWhitespaceForeground sets the color of the characters in the whitespace.
|
|
|
|
func WithWhitespaceForeground(c ColorType) WhitespaceOption {
|
|
|
|
return func(w *whitespace) {
|
|
|
|
w.style = w.style.Foreground(c.color())
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-03-26 22:57:47 +03:00
|
|
|
// WithWhiteSpaceBackground sets the background color of the whitespace.
|
2021-03-30 17:45:47 +03:00
|
|
|
func WithWhitespaceBackground(c ColorType) WhitespaceOption {
|
2021-03-26 22:57:47 +03:00
|
|
|
return func(w *whitespace) {
|
|
|
|
w.style = w.style.Background(c.color())
|
|
|
|
}
|
|
|
|
}
|
2021-03-30 17:45:47 +03:00
|
|
|
|
|
|
|
// WithWhitespaceChars sets the characters to be rendered in the whitespace.
|
|
|
|
func WithWhitespaceChars(s string) WhitespaceOption {
|
|
|
|
return func(w *whitespace) {
|
|
|
|
w.chars = s
|
|
|
|
}
|
|
|
|
}
|