| 12345678910111213141516171819202122232425262728293031323334353637383940414243 |
- 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()
- }
|