Lompat ke konten
dokumentasi.id
Commit 120a248
v1
Star0

Kamu membaca versi lama. Halaman ini hanya bisa dibaca.

6

Data Qur'an dan Mushaf

src/data/quran.json bukan salinan Al-Qur'an lengkap. Berkas itu hanya memuat ayat yang dipakai kelas Lanjutan: ayat yang dilatih dan seluruh ayat pada halaman mushaf yang dipraktikkan, ditambah data surah untuk ayat-ayat tersebut. src/data/quran.json:1-8

Batas yang sama ditulis di komentar src/lib/quran.ts: berkas JSON menyimpan ayat latihan dan halaman mushaf, sedangkan scripts/build-quran-data.mjs membangunnya ulang dari teks Kemenag. src/lib/quran.ts:3-4

Isi berkas data

KunciIsiRujukan
surahssatu objek per surah terpakai dengan nameArabic, nameLatin, ayahCount, dan locationsrc/data/quran.json:2-8
ayahslarik ayat; tiap ayat memuat id, surahNumber, number, juz, page, dan arabicsrc/data/quran.json:334-342

Larik ayahs hanya berisi ayat yang lolos penyaringan, jadi id tidak berurutan tanpa celah: Al-Fātiḥah hanya menyisakan id 1, 2, 4, dan 6. src/data/quran.json:335-362

src/lib/quran.ts mengimpor berkas JSON itu di tingkat modul, mengambil quran.surahs sebagai peta surah, lalu menempelkan data surah ke setiap ayat sehingga PageAyah selalu membawa nameArabic dan nameLatin. src/lib/quran.ts:1-12

Alur npm run quran:build

Perintah itu hanya alias satu baris ke skrip Node. package.json:19

npm run quran:build -- alquran/surah.csv

Skrip berhenti lebih dulu bila path CSV tidak diberikan; pesannya menyebut contoh pemakaian dan proses keluar dengan kode 1. scripts/build-quran-data.mjs:10-17

sequenceDiagram
  participant CLI as npm run quran:build
  participant Script as build-quran-data.mjs
  participant CSV as surah.csv
  participant Materi as tajwid-pertemuan.ts
  participant Out as quran.json
  CLI->>Script: node scripts/build-quran-data.mjs + path CSV
  Script->>CSV: readFileSync(csvPath)
  Script->>Script: parseCsv(teks)
  Script->>Script: surahs Map + ayahs dengan juz, page, arabic
  Script->>Script: validasi 114 surah dan 6236 ayat
  alt data tidak valid
    Script-->>CLI: process.exit(1) Data tidak valid
  end
  Script->>Materi: baca baris Praktik mushaf dan baris latihan ayat
  Script->>Script: filter ayat halaman dan ayat latihan
  alt latihan ayat tanpa teks
    Script-->>CLI: process.exit(1) Ayat latihan tidak ditemukan
  end
  Script->>Out: writeFileSync({ surahs, ayahs })
  Script-->>CLI: console.log jumlah ayat tersimpan
  style Script fill:#f59e0b,color:#000
  style CSV fill:#336791,color:#fff
  style Out fill:#336791,color:#fff
  style Materi fill:#8b5cf6,color:#fff
%% fig: Siklus npm run quran:build
%% desc: Skrip mengurai surah.csv, memvalidasi jumlah surah dan ayat, menyaring ayat yang dipakai materi Lanjutan, lalu menulis src/data/quran.json.
Fig. 1: Siklus npm run quran:buildSkrip mengurai surah.csv, memvalidasi jumlah surah dan ayat, menyaring ayat yang dipakai materi Lanjutan, lalu menulis src/data/quran.json.

surah.csv dibaca dengan parser RFC 4180 buatan sendiri (parseCsv) karena field berisi kutip bisa memuat koma, kutip ganda, dan baris baru; BOM di awal berkas dibuang sebelum header diurai. scripts/build-quran-data.mjs:19-58 scripts/build-quran-data.mjs:60-63

Setiap record dipetakan menjadi satu entri peta surahs (nama Arab, nama Latin, jumlah ayat, lokasi) dan satu elemen ayahs dengan id, surahNumber, number, juz, page, serta arabic. scripts/build-quran-data.mjs:65-85

README mencatat urutan pengambilan dataset dari Kaggle sebelum build: unduh alquran.zip, ekstrak, lalu jalankan npm run quran:build -- alquran/surah.csv. README.md:30-41

Ayat yang disaring masuk berkas

Skrip membaca src/data/tajwid-pertemuan.ts sebagai teks, bukan mengimpornya. Dua pola regex mengambil nomor halaman dari baris Praktik mushaf: dan pasangan surah:ayat dari baris latihan ayat. scripts/build-quran-data.mjs:101-107

Format kedua baris itu dijelaskan di header berkas materi: satu baris per ayat berbentuk surah:ayat | kata yang diperhatikan | catatan, dan nomor halaman mengikuti mushaf Madinah 15 baris (604 halaman; Juz 30 = halaman 582–604). src/data/tajwid-pertemuan.ts:5-8

Ayat yang dipertahankan adalah ayat yang page-nya ada di himpunan pages atau pasangan surah:ayat-nya ada di himpunan drills. Sesudah itu setiap drill diperiksa ulang agar tidak ada latihan tanpa teks. scripts/build-quran-data.mjs:109-114

Validasi sebelum menulis

Tiga pemeriksaan menahan penulisan berkas: jumlah surah harus 114, jumlah ayat harus 6236, dan setiap ayat harus punya id, number, juz, page berupa integer serta arabic yang tidak kosong. scripts/build-quran-data.mjs:87-95

KondisiPesan yang dicetakRujukan
path CSV tidak diberikanSertakan path ke surah.csv, misalnya: npm run quran:build -- ./alquran/surah.csvscripts/build-quran-data.mjs:14-17
jumlah surah bukan 114jumlah surah ${surahs.size}, seharusnya 114scripts/build-quran-data.mjs:88-89
jumlah ayat bukan 6236jumlah ayat ${ayahs.length}, seharusnya 6236scripts/build-quran-data.mjs:90
field ayat tidak lengkapayat ${ayah.surahNumber}:${number} tidak lengkapscripts/build-quran-data.mjs:91-95
ada temuanData tidak valid: diikuti maksimal 20 temuan pertama, lalu process.exit(1)scripts/build-quran-data.mjs:96-99
latihan ayat tanpa teksAyat latihan tidak ditemukan: ...scripts/build-quran-data.mjs:110-114

Setelah semua pemeriksaan lolos, skrip menimpa seluruh berkas dengan writeFileSync dan JSON.stringify indentasi satu spasi, lalu mencetak jumlah ayat, halaman mushaf, dan drill yang tersimpan. scripts/build-quran-data.mjs:116-119

⚠️ Skrip menimpa src/data/quran.json sepenuhnya. Setiap suntingan manual pada berkas JSON itu hilang pada build berikutnya; ubah baris Praktik mushaf atau latihan ayat di materi Lanjutan, lalu jalankan ulang perintah build. src/data/tajwid-pertemuan.ts:7-8

Membaca data saat render

graph LR
  JSON["src/data/quran.json"] --> Q["src/lib/quran.ts"]
  Q --> R["route /lanjutan/:slug"]
  Q --> VIEW["MushafPageView"]
  M["src/lib/mushaf.ts"] --> VIEW
  M --> TEXT["QuranText"]
  T["tests/quran.test.ts"] --> Q
  T --> M
  style JSON fill:#336791,color:#fff
  style Q fill:#8b5cf6,color:#fff
  style M fill:#8b5cf6,color:#fff
  style R fill:#2d7d46,color:#fff
  style VIEW fill:#2d7d46,color:#fff
  style TEXT fill:#2d7d46,color:#fff
  style T fill:#f59e0b,color:#000
%% fig: Pembaca data Qur'an dan helper mushaf
%% desc: quran.ts membaca quran.json dan menyuapi route Lanjutan serta MushafPageView, mushaf.ts menyuapi teks ayat dan halaman cetak, dan tests menguji keduanya.
Fig. 2: Pembaca data Qur'an dan helper mushafquran.ts membaca quran.json dan menyuapi route Lanjutan serta MushafPageView, mushaf.ts menyuapi teks ayat dan halaman cetak, dan tests menguji keduanya.

Dua fungsi di src/lib/quran.ts menjadi pintu masuk data ayat:

FungsiRujukanPerilaku
listPagesAyahs(pages)src/lib/quran.ts:14-19memfilter ayat yang page-nya termasuk himpunan pages; urutan mushaf terjaga karena ayahs sudah terurut
listAyahsByRef(refs)src/lib/quran.ts:21-24memfilter pasangan { surah, ayah }; pasangan yang tidak ada di data dilewati

Halaman pelajaran Lanjutan memanggil keduanya dari rencana pertemuan: meetingDrills(plan) menjadi argumen listAyahsByRef, dan meetingPages(plan) menjadi argumen listPagesAyahs. src/app/lanjutan/[slug]/page.tsx:44-47

Kedua pengambil nomor itu hanya meratakan langkah rencana: meetingPages mengambil semua langkah berjenis mushaf lewat mushafRange, sedangkan meetingDrills mengambil semua step.drills. src/lib/meeting-plan.ts:106-114

Rincian penyajian ayat dan halamannya ada di Komponen UI Pelajaran.

Menyiapkan teks mushaf

src/lib/mushaf.ts tidak membaca berkas data mana pun; isinya helper penyiapan teks yang dipakai komponen.

FungsiRujukanPerilaku
toArabicDigits(value)src/lib/mushaf.ts:3-8mengganti setiap digit Latin dengan digit Arab-Indic
pauseSegments(text)src/lib/mushaf.ts:12-34memecah teks ayat di sekitar tanda waqaf
groupBySurah(ayahs)src/lib/mushaf.ts:36-46mengelompokkan ayat berurutan yang berasal dari surah sama
showsBismillah(surahNumber)src/lib/mushaf.ts:48-50false hanya untuk surah 1 dan 9

pauseSegments memisahkan tanda waqaf U+06D6–U+06DC dan U+08D6 karena di dalam teks tanda itu berupa combining mark yang tidak bisa dikecilkan terpisah dari hurufnya; setiap segmen menyimpan lead, word, dan pause. src/lib/mushaf.ts:12-18

Satu pengecualian penting: mim iqlab U+06E2 juga muncul setelah spasi, tetapi milik tanwin sebelumnya, jadi spasi di depannya dibuang agar mim menempel pada kata yang benar. src/lib/mushaf.ts:19-20

Tanda waqaf hasil pemecahan digambar oleh QuranText sebagai elemen kecil di atas celah setelah katanya, sehingga lebar celah tidak berubah. src/components/quran-text.tsx:8-24

MushafPageView memakai tiga helper: groupBySurah untuk memisahkan pembuka tiap surah src/components/mushaf/mushaf-page-view.tsx:59-61, showsBismillah untuk menahan basmalah pada surah 1 dan 9 src/components/mushaf/mushaf-page-view.tsx:34, dan toArabicDigits untuk nomor halaman src/components/mushaf/mushaf-page-view.tsx:79-83.

Pengujian

tests/quran.test.ts menjaga dua sisi sekaligus: isi berkas data dan perilaku helper.

Langkah verifikasi menyeluruh ada di Pengujian dan Deploy.