1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
|
package reader
import (
"github.com/walles/moor/v2/internal/linemetadata"
"github.com/walles/moor/v2/internal/search"
"github.com/walles/moor/v2/internal/textstyles"
"github.com/walles/moor/v2/twin"
)
// Returns a representation of the string split into styled tokens. Any regexp
// matches are highlighted. A nil regexp means no highlighting.
//
// maxTokensCount: at most this many tokens will be included in the result. If
// 0, do all runes. For BenchmarkRenderHugeLine() performance.
func (line *Line) HighlightedTokens(
plainTextStyle twin.Style,
searchHitStyle twin.Style,
search search.Search,
lineIndex linemetadata.Index,
maxTokensCount int,
) textstyles.StyledRunesWithTrailer {
matchRanges := search.GetMatchRanges(line.Plain(lineIndex))
fromString := textstyles.StyledRunesFromString(plainTextStyle, string(line.raw), &lineIndex, maxTokensCount)
returnRunes := make([]textstyles.CellWithMetadata, 0, len(fromString.StyledRunes))
lastWasSearchHit := false
for _, token := range fromString.StyledRunes {
style := token.Style
searchHit := matchRanges.InRange(len(returnRunes))
if searchHit {
// Highlight the search hit
style = searchHitStyle
}
returnRunes = append(returnRunes, textstyles.CellWithMetadata{
Rune: token.Rune,
Style: style,
IsSearchHit: searchHit,
StartsSearchHit: searchHit && !lastWasSearchHit,
})
lastWasSearchHit = searchHit
}
return textstyles.StyledRunesWithTrailer{
StyledRunes: returnRunes,
Trailer: fromString.Trailer,
ContainsSearchHit: !matchRanges.Empty(),
}
}
func (line *Line) HasManPageFormatting() bool {
return textstyles.HasManPageFormatting(string(line.raw))
}
|