quran-meta
Version:
Library with meta data and functionality related to Holy Quran
60 lines (53 loc) • 2.06 kB
text/typescript
import { findJuzByAyahId } from "./findJuzByAyahId"
import { findPagebyAyahId } from "./findPagebyAyahId"
import { findRukuByAyahId } from "./findRukuByAyahId"
import { findSurahByAyahId } from "./findSurahByAyahId"
import type { RiwayaData } from "./lists/types"
import type { AyahId, AyahRange, Juz, Page, RangeMode, Ruku, Surah } from "./types"
/**
* Finds the range of ayahs surrounding a given ayah based on specified mode
* @param ayahId - The unique identifier of the ayah
* @param mode - The scope for finding the range:
* - "juz": Returns range of ayahs in the same juz
* - "surah": Returns range of ayahs in the same surah
* - "ayah": Returns the single ayah as both start and end of range
* - "page": Returns range of ayahs on the same page
* - "ruku": Returns range of ayahs on the same ruku
* - "all": Returns range covering all ayahs (1 to total number of ayahs)
* @param data - The Lists object for the riwaya.
* @returns An array of two numbers representing the start and end ayah IDs of the range [startAyahId, endAyahId]
*/
export function findRangeAroundAyah(
ayahId: AyahId,
mode: RangeMode,
data: RiwayaData
): AyahRange {
const JuzList = data.JuzList
const SurahList = data.SurahList
const PageList = data.PageList
const RukuList = data.RukuList
switch (mode) {
case "juz": {
const juz: Juz = findJuzByAyahId(ayahId, data)
return [JuzList[juz], JuzList[juz + 1] - 1]
}
case "surah": {
const surah: Surah = findSurahByAyahId(ayahId, data)
return [SurahList[surah][0], SurahList[surah + 1][0] - 1]
}
case "ayah": {
return [ayahId, ayahId]
}
case "page": {
const page: Page = findPagebyAyahId(ayahId, data)
return [PageList[page], PageList[page + 1] - 1]
}
case "ruku": {
const ruku: Ruku = findRukuByAyahId(ayahId, data)
return [RukuList[ruku], RukuList[ruku + 1] - 1]
}
case "all":
default:
return [1, data.meta.numAyahs]
}
}