extract method
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);
}