4
Model Data `quran.json` dan `juz.json`
data/quran.json dan data/juz.json adalah sumber seluruh materi API. Berkas pertama menyimpan array surah yang bersarang array ayat; berkas kedua hanya menyimpan 30 entri batas rentang juz. Keduanya dimuat utuh saat modul di-require, jadi schema di memori sama dengan schema di berkas (api/handlers/surah.js:11, api/lib/juz.js:1-22).
Urutan elemen data pada quran.json mengikuti nomor surah. Handler membacanya dengan quran[surah - 1], sehingga indeks array selalu berselisih satu dari nomor surah (api/handlers/surah.js:19-213).
Kerangka Berkas
| Berkas | Kunci level atas | Isi data | Rujukan |
|---|---|---|---|
data/quran.json | license, source, audioEdition, data | array 114 surah | data/quran.json:1-54 |
data/juz.json | license, source, data | array 30 entri juz | data/juz.json:1-155 |
quran.json dibangun crawler dengan JSON.stringify({ ... }, null, 2), lalu setiap %u diganti \u (crawler/script.js:196-2036). Karena itu seluruh teks Arab tersimpan sebagai escape sequence, bukan huruf Arab mentah. Kunci audioEdition hanya ada di quran.json dan bernilai "Syekh. Mishary Rashid Al-Afasy" (data/quran.json:1-54).
Objek Surah
| Field | Tipe | Isi |
|---|---|---|
number | number | nomor surah 1–114 |
sequence | number | bukan nomor mushaf: surah 114 bernilai 21, surah 9 bernilai 113 |
numberOfVerses | number | jumlah ayat, mis. 7 pada surah 1 dan 6 pada surah 114 |
name.short, name.long | string | nama Arab |
name.transliteration.en, name.transliteration.id | string | "Al-Faatiha" dan "Al-Fatihah" |
name.translation.en, name.translation.id | string | "The Opening" dan "Pembukaan" |
revelation.arab, revelation.en, revelation.id | string | "Meccan" dan "Makkiyyah" |
tafsir.id | string | satu blok teks pengantar surah |
preBismillah | object atau null | lihat Blok yang Dipakai Ulang |
verses | array | daftar ayat, dibahas pada bagian berikutnya |
sequence bukan turunan dari number. Surah 114 punya number 114 tetapi sequence 21, sedangkan surah 9 punya sequence 113 (data/quran.json:254369-2543917, data/quran.json:49756-497808). Jangan memakai sequence sebagai indeks array surah.
Objek Ayat
| Field | Tipe | Isi |
|---|---|---|
number.inQuran | number | nomor ayat global, 1–6236 |
number.inSurah | number | nomor ayat di dalam surah, mulai 1 |
meta.juz | number | juz tempat ayat berada |
meta.page | number | halaman mushaf, 1–604 |
meta.manzil | number | manzil |
meta.ruku | number | ruku |
meta.hizbQuarter | number | hizb quarter |
meta.sajda.recommended | boolean | anjuran sujud |
meta.sajda.obligatory | boolean | kewajiban sujud |
text.arab | string | teks Arab dalam escape \uXXXX |
text.transliteration.en | string | transliterasi Latin |
translation.en, translation.id | string | terjemahan Inggris dan Indonesia |
audio.primary | string | URL cdn.alquran.cloud berbasis nomor ayat global |
audio.secondary | array 2 string | URL cdn.islamic.network bitrate 128 dan 64 |
tafsir.id.short, tafsir.id.long | string | tafsir ringkas dan tafsir panjang |
Setiap ayat membawa meta posisi mushafnya sendiri, termasuk meta.juz. Label juz per ayat karena itu sudah tersedia tanpa membaca juz.json; perhitungan yang memakai batas rentang dibahas di Komputasi Rentang Juz.
Nilai tertinggi yang benar-benar muncul pada ayat terakhir: inQuran 6236, juz 30, page 604, ruku 556, hizbQuarter 240, dan inSurah 6 karena ayat itu berada di surah 114 (data/quran.json:254612-2546559).
Satu asimetri kecil: name.transliteration punya kunci en dan id, sedangkan text.transliteration hanya punya en (data/quran.json:6-2110, data/quran.json:48-7011).
Blok yang Dipakai Ulang
tafsir.id muncul dalam dua bentuk berbeda:
| Lokasi | Bentuk tafsir.id |
|---|---|
| surah | string biasa (data/quran.json:22-3012) |
| ayat | object dengan short dan long (data/quran.json:48-7011) |
preBismillah adalah blok tanpa number, meta, dan tafsir: isinya hanya text, translation, dan audio (data/quran.json:338-35613). Nilainya null pada surah 1 dan surah 9, lalu berisi objek pada surah lain seperti surah 114 (data/quran.json:22-3012, data/quran.json:49756-497808, data/quran.json:254392-25440814).
⚠️
preBismillah.audiomenyalin audio ayat 1.primaryselalu berakhir.../ayah/1dansecondaryselalu menunjuk.../ar.alafasy/1.mp3, pada surah mana pun (data/quran.json:338-35613, data/quran.json:254392-25440814). Jangan memakai URL itu untuk mengidentifikasi surah, dan jangan deduplikasi audio berdasarkan URL tersebut.
Handler menyusun ulang blok yang sama menjadi bentuk response:
graph LR
V["satu ayat di verses[i]"] -->|"spread"| R["data ayah pada response"]
S["objek surah tanpa verses"] -->|"field surah"| R
A["semua 114 surah"] -->|"delete verses dan preBismillah"| G["data daftar surah"]
style V fill:#8b5cf6,color:#fff
style S fill:#8b5cf6,color:#fff
style A fill:#336791,color:#fff
style R fill:#2d7d46,color:#fff
style G fill:#2d7d46,color:#fff
%% fig: Tiga rupa data dari satu sumber
%% desc: Ayat utuh digabung dengan objek surah tanpa verses untuk response ayah, sedangkan daftar surah membuang verses dan preBismillah.Objek surah pada response ayah dibentuk dari salinan yang sudah dibuang verses-nya, lalu digabung sebagai field surah di samping field ayat (api/handlers/surah.js:49-6115). Daftar surah membuang dua field sekaligus, yaitu verses dan preBismillah (api/handlers/surah.js:5-916). Bentuk amplop response-nya dibahas di Kontrak Response dan Penanganan Error.
Tabel Batas Juz
index | start.index | start.verse | end.index | end.verse | Rujukan |
|---|---|---|---|---|---|
| 1 | 1 | 1 | 2 | 141 | data/juz.json:1-155 |
| 2 | 2 | 142 | 2 | 252 | data/juz.json:16-2617 |
| 30 | 78 | 1 | 114 | 6 | data/juz.json:324-33618 |
start.index dan end.index adalah nomor surah, bukan indeks array; verse adalah nomor ayat di dalam surah tersebut. api/lib/juz.js:9-1219 menurunkan keempat nilai itu menjadi indeks array dengan mengurangi satu.
Satu entri juz dapat seluruhnya berada di dalam satu surah, seperti juz 2 yang mulai dan berakhir di surah 2. Konversi batas akhir menjadi batas eksklusif untuk slice dibahas di Komputasi Rentang Juz.
Relasi Surah, Ayat, dan Juz
erDiagram
QURAN_DATA ||--|{ SURAH : "data[]"
SURAH ||--|{ AYAH : "verses[]"
SURAH |o--o| PRE_BISMILLAH : "preBismillah"
JUZ_DATA ||--|{ JUZ : "data[]"
JUZ ||..o{ SURAH : "start.index dan end.index"
SURAH {
int number
int sequence
int numberOfVerses
object name
object revelation
string tafsir
}
AYAH {
int inQuran
int inSurah
object meta
object text
object translation
object audio
object tafsir
}
PRE_BISMILLAH {
object text
object translation
object audio
}
JUZ {
int index
object start
object end
}
style QURAN_DATA fill:#336791,color:#fff
style JUZ_DATA fill:#336791,color:#fff
style JUZ fill:#f59e0b,color:#000
style PRE_BISMILLAH fill:#8b5cf6,color:#fff
%% fig: Relasi surah, ayat, dan batas juz
%% desc: Satu surah memuat banyak ayat dan satu blok preBismillah opsional, sedangkan setiap entri juz hanya menunjuk koordinat surah dan ayat.data pada kedua berkas adalah array, verses hanya ada di dalam surah, dan preBismillah bersifat opsional (data/quran.json:6-2110, data/quran.json:31-4720). Entri juz tidak menyimpan ayat sama sekali; ia hanya menunjuk pasangan index dan verse (data/juz.json:16-2617).
Contoh di dokumentasi ini memakai surah 1, 2, 9, dan 114 beserta juz 1, 2, dan 30.