getRawMarkers function

List<WordMarker> getRawMarkers({
  1. required String text,
  2. required List<String> words,
  3. bool caseSensitive = false,
})

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 List<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;
}