mirror of
https://github.com/charmbracelet/lipgloss.git
synced 2024-11-27 11:43:06 +03:00
44 lines
891 B
Go
44 lines
891 B
Go
package lipgloss
|
|
|
|
import (
|
|
"strings"
|
|
)
|
|
|
|
// StyleRunes apply a given style to runes at the given indices in the string.
|
|
// Note that you must provide styling options for both matched and unmatched
|
|
// runes. Indices out of bounds will be ignored.
|
|
func StyleRunes(str string, indices []int, matched, unmatched Style) string {
|
|
// Convert slice of indices to a map for easier lookups
|
|
m := make(map[int]struct{})
|
|
for _, i := range indices {
|
|
m[i] = struct{}{}
|
|
}
|
|
|
|
var (
|
|
out strings.Builder
|
|
group strings.Builder
|
|
style Style
|
|
runes = []rune(str)
|
|
)
|
|
|
|
for i, r := range runes {
|
|
group.WriteRune(r)
|
|
|
|
_, matches := m[i]
|
|
_, nextMatches := m[i+1]
|
|
|
|
if matches != nextMatches || i == len(runes)-1 {
|
|
// Flush
|
|
if matches {
|
|
style = matched
|
|
} else {
|
|
style = unmatched
|
|
}
|
|
out.WriteString(style.Render(group.String()))
|
|
group.Reset()
|
|
}
|
|
}
|
|
|
|
return out.String()
|
|
}
|