search method

List<Ayah> search(
  1. String query, {
  2. int limit = 50,
  3. 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;
}