search method
List<Ayah>
search(
- String query, {
- int limit = 50,
- QuranLanguage language = QuranLanguage.arabic,
Synchronous full-text search with Arabic/English normalization.
Implementation
List<Ayah> search(
String query, {
int limit = 50,
QuranLanguage language = QuranLanguage.arabic,
}) {
final normalizedQuery = language == QuranLanguage.english
? _normalizeEnglish(query)
: _normalizeArabic(query);
if (normalizedQuery.isEmpty) return [];
final languageKey = language.code;
if (!_searchIndexByLanguage.containsKey(languageKey)) {
_searchIndexByLanguage[languageKey] =
List<Map<String, dynamic>>.from(_searchDataForLanguage(language));
}
final index = _searchIndexByLanguage[languageKey]!;
final matches = index
.where((item) => (item['t'] as String).contains(normalizedQuery))
.take(limit);
// Group matches by surah to avoid re-parsing the same surah multiple times.
final bySurah = <int, List<int>>{};
for (final m in matches) {
bySurah.putIfAbsent(m['s'] as int, () => []).add(m['a'] as int);
}
final results = <Ayah>[];
for (final entry in bySurah.entries) {
final surah = getSurah(entry.key, language: language);
for (final id in entry.value) {
results.add(surah.verses.firstWhere((v) => v.id == id));
}
}
return results;
}