getRawMarkers function
Gets the WordMarkers representing the start and end of all given words
in the given text. This may include overlapping and embedded words.
Implementation
List<WordMarker> getRawMarkers({
required final String text,
required final Iterable<String> words,
final bool caseSensitive = false,
}) {
if (text.trim().isEmpty || words.isEmpty) {
return <WordMarker>[];
}
late final String textCased;
late final Iterable<String> wordsCased;
if (caseSensitive) {
textCased = text;
wordsCased = words;
} else {
textCased = text.toLowerCase();
wordsCased = words.map((final String w) => w.toLowerCase());
}
List<WordMarker> rawMarkers = <WordMarker>[];
for (final String word in wordsCased) {
assert(word.isNotEmpty, 'word may not be an empty string');
final Iterable<Match> wordMatches = word.allMatches(textCased);
for (Match match in wordMatches) {
rawMarkers.add(WordMarker(type: MarkerType.start, index: match.start));
// IMPORTANT! end index is 1 character right of the actual word end
rawMarkers.add(WordMarker(type: MarkerType.end, index: match.end));
}
}
return rawMarkers;
}