extract method

List<PassageMatch> extract(
  1. String source, {
  2. BibleLanguageEnum? language,
})

Finds deterministic, non-overlapping passages in source.

Implementation

List<PassageMatch> extract(
  String source, {
  BibleLanguageEnum? language,
}) {
  if (source.isEmpty) return const [];

  final normalization = ReferenceInputNormalizer.normalizeDetailed(source);
  final searchText = normalization.normalizedText;
  final candidates = <(int, int), PassageMatch>{};
  final anchors = _numericAnchors(searchText);
  for (final anchor in anchors) {
    final minimumStart =
        _clamp(anchor.$1 - maxLookBehind, 0, searchText.length);
    final maximumEnd = _clamp(anchor.$2 + maxLookAhead, 0, searchText.length);
    _searchWindow(
      searchText,
      normalization: normalization,
      minimumStart: minimumStart,
      requiredStartBefore: anchor.$1,
      requiredEndAfter: anchor.$2,
      maximumEnd: maximumEnd,
      language: language,
      output: candidates,
    );
  }

  if (includeBareBooks) {
    _searchBarePassages(
      searchText,
      normalization: normalization,
      language: language,
      output: candidates,
    );
  }

  final ordered = candidates.values.toList()
    ..sort((left, right) {
      final startComparison = left.start.compareTo(right.start);
      if (startComparison != 0) return startComparison;
      return right.end.compareTo(left.end);
    });

  final selected = <PassageMatch>[];
  var consumedThrough = 0;
  for (final candidate in ordered) {
    if (candidate.start < consumedThrough) continue;
    selected.add(candidate);
    consumedThrough = candidate.end;
  }
  return List.unmodifiable(selected);
}