Lompat ke konten
dokumentasi.id
Commit 120a248
v1
Star0

Kamu membaca versi lama. Halaman ini hanya bisa dibaca.

5

Format Konten Teks

Materi tajwid di repository ini disimpan sebagai teks biasa, dan tata letaknya ditentukan oleh konvensi penulisan di dalam teks itu sendiri. Dua modul membaca konvensi tersebut: lessonLayout memecah satu materi menjadi Section yang berisi Part, sedangkan meetingPlan memecah satu pertemuan kelas menjadi langkah materi, drills, mushaf, dan task (src/lib/lesson-layout.ts:1-4, src/lib/meeting-plan.ts:1-11). Tidak ada schema per materi; yang harus dipatuhi penulis hanyalah bentuk baris dan pemisah blok.

graph TD
  TEKS["content teks biasa"] --> BLOK["blok dipisah baris kosong"]
  BLOK --> LL["lessonLayout"]
  BLOK --> MP["meetingPlan"]
  LL --> SEC["Section + Part"]
  MP --> LANGKAH["MeetingStep"]
  MP --> NOL["null"]
  style TEKS fill:#f59e0b,color:#000
  style BLOK fill:#f59e0b,color:#000
  style LL fill:#2d7d46,color:#fff
  style MP fill:#2d7d46,color:#fff
  style SEC fill:#8b5cf6,color:#fff
  style LANGKAH fill:#8b5cf6,color:#fff
  style NOL fill:#dc2626,color:#fff
%% fig: Satu teks, dua parser
%% desc: Konten teks biasa dipotong menjadi blok, lalu diurai lessonLayout menjadi Section berisi Part atau oleh meetingPlan menjadi MeetingStep, dengan null untuk materi biasa.
Fig. 1: Satu teks, dua parserKonten teks biasa dipotong menjadi blok, lalu diurai lessonLayout menjadi Section berisi Part atau oleh meetingPlan menjadi MeetingStep, dengan null untuk materi biasa.

Blok dan baris

Konten dipotong pada satu baris kosong. Teks dipecah dengan \n\s*\n, tiap blok di-trim, dan blok kosong dibuang (src/lib/lesson-layout.ts:136-139, src/lib/meeting-plan.ts:35-38). Di dalam satu blok, baris juga di-trim dan baris kosong diabaikan (src/lib/lesson-layout.ts:162-165, src/lib/meeting-plan.ts:52).

Blok yang seluruh isinya aksara Arab langsung menjadi satu Part bertipe arabic dan tidak diurai per baris (src/lib/lesson-layout.ts:156-160). Part yang mungkin muncul adalah union paragraph, lead, subheading, list, steps, numbered, symbols, examples, verse, fact, note, dan arabic, sementara butir di dalamnya memakai Item dengan number, term, text, examples, exampleText, dan points (src/lib/lesson-layout.ts:33-45, src/lib/lesson-layout.ts:29).

Bentuk baris dan Part yang dihasilkan

Urutan percabangan di dalam loop baris menentukan bentuk akhirnya: bullet, langkah lingkaran, contoh, penomoran angka, lalu catatan, fakta, simbol, lead, dan sisanya paragraf (src/lib/lesson-layout.ts:186-284).

Bentuk barisPengenalHasil
• …BULLETlist berisi Item, atau fact bila isinya label fakta
① … sampai ⑳ …STEPsteps, dengan forbidden dari lead sebelumnya
1. …NUMBEREDnumbered; • sesudahnya menjadi points milik item terakhir
Contoh: … atau Contoh (nun sukun · tanwin):EXAMPLEexamples, atau lead plus nama columns
Hukum: …, Panjangnya 4 atau 5 harakat.FACTfact dengan label dari factLabels
Penting: …, Catatan: …, Cara membacanya: …NOTEnote dengan NoteTone dari noteTone
Qaf (ق): pangkal lidah terangkat.TERMterm pada Item, atau symbols bila dibuka tanda Arab
baris berakhir :—lead, sekaligus menyetel forbidden bila memuat kata larangan
baris lain—paragraph

Setiap cabang dijaga tes. • menjadi list berisi term dan examples (tests/lesson-layout.test.ts:44-60), Contoh (…): menamai kolom tabel contoh (tests/lesson-layout.test.ts:62-68), forbidden menyala setelah lead yang melarang (tests/lesson-layout.test.ts:70-81), dan catatan, fakta, simbol, ayat, serta blok Arab dikenali berurutan (tests/lesson-layout.test.ts:83-97). Butir • di bawah item bernomor menempel sebagai points (tests/lesson-layout.test.ts:99-105).

Label fakta dipetakan ke bentuk pendek oleh factLabels, misalnya Hukumnya dan Hukum menjadi Hukum, Panjangnya menjadi Panjang (src/lib/lesson-layout.ts:59-66). Label catatan dipetakan ke NoteTone oleh noteTone: Penting dan Ingat menjadi important, Catatan menjadi note, Cara membaca… menjadi howto, sisanya tip (src/lib/lesson-layout.ts:68-73). TERM hanya menerima bagian sebelum : sepanjang 1–48 karakter (src/lib/lesson-layout.ts:57), dan bagian itu tidak boleh berakhir tanda baca agar jadi term (src/lib/lesson-layout.ts:113-114).

Sesudah semua baris dibaca, list yang seluruh itemnya aksara Arab murni diubah menjadi examples, dan list yang semua itemnya terbaca verseParts dipecah menjadi verse (src/lib/lesson-layout.ts:288-295). Bagian tanpa parts, title, maupun group dibuang (src/lib/lesson-layout.ts:297).

Judul, subjudul, dan grup

heading menolak baris yang dibuka bullet atau langkah, baris lebih dari 80 karakter, dan baris tanpa huruf Latin (src/lib/lesson-layout.ts:79). Bentuk Hukum 1: … membaca nomor dan judul (src/lib/lesson-layout.ts:81-82), A. … menjadi subheading (src/lib/lesson-layout.ts:85-86), sedangkan baris yang berakhir tanda baca atau memuat : bukan judul (src/lib/lesson-layout.ts:88). Sisanya dibaca sebagai 1. Judul atau judul polos (src/lib/lesson-layout.ts:90-91).

⚠️ Judul yang salah tulis tidak menimbulkan error: baris berakhiran titik atau memuat : diam-diam menjadi paragraph biasa (src/lib/lesson-layout.ts:88). Baris lebih dari 80 karakter juga kehilangan status judul (src/lib/lesson-layout.ts:79).

Bagian pertama selalu pengantar (src/lib/lesson-layout.ts:145-146). id bagian di-slug dari judulnya: NFKD, diakritik dibuang, non-alfanumerik menjadi -, maksimum 48 karakter, duplikat diberi akhiran -2 dan seterusnya, dengan cadangan bagian (src/lib/lesson-layout.ts:119-133). Paragraf pertama blok berupa ① Waqaf Idhthirari, karena terpaksa yang diikuti penjelasan membuka bagian bernomor 1 dan memakai sisa baris sebagai isi (src/lib/lesson-layout.ts:167-175, tests/lesson-layout.test.ts:30-42).

Blok yang hanya berisi judul dan diikuti blok berjudul lain menjadi group, bukan bagian baru (src/lib/lesson-layout.ts:176-180). Tes pertama memeriksa pemisahan bagian, group, dan Rujukan: sekaligus (tests/lesson-layout.test.ts:7-28).

Langkah pertemuan

meetingPlan memindai blok dengan STEP_HEADING (Materi, Latihan ayat), MUSHAF, dan TASK (src/lib/meeting-plan.ts:26-29). Isi tiap langkah diurai oleh lessonLayout lewat pembungkus partsOf (src/lib/meeting-plan.ts:31).

stateDiagram-v2
  [*] --> Materi
  Materi --> Materi: blok tanpa penanda langkah
  Materi --> Drills: STEP_HEADING Latihan ayat
  Materi --> Mushaf: baris MUSHAF
  Materi --> Tugas: blok TASK
  Materi --> Lain: blok lain berjudul
  Drills --> Mushaf: baris MUSHAF
  Mushaf --> Tugas: blok TASK
  Tugas --> [*]
  classDef jalur fill:#2d7d46,color:#fff
  classDef turunan fill:#8b5cf6,color:#fff
  classDef lainnya fill:#f59e0b,color:#000
  class Materi,Tugas jalur
  class Drills,Mushaf turunan
  class Lain lainnya
%% fig: Perpindahan antar langkah pertemuan
%% desc: Setiap blok menambah isi Materi atau membuka langkah baru; urutan materi, drills, mushaf, tugas adalah bentuk yang dipakai tes.
Fig. 2: Perpindahan antar langkah pertemuanSetiap blok menambah isi Materi atau membuka langkah baru; urutan materi, drills, mushaf, tugas adalah bentuk yang dipakai tes.
Blok pembukaPengenalMeetingStep
MateriSTEP_HEADINGmateri berisi Section hasil lessonLayout
Latihan ayatSTEP_HEADING + DRILLdrills berisi Drill dengan surah, ayah, words, note
Praktik mushaf: 603–604MUSHAFmushaf dengan from, to, dan parts
Tugas mandiri: …TASKtask berisi satu text
blok lainlessonLayoutother per Section, memakai title atau group

Materi menampung blok berikutnya sampai penanda langkah baru muncul (src/lib/meeting-plan.ts:62-65, tests/meeting-plan.test.ts:46-63). Baris latihan berbentuk 1:2 | kata | catatan dibaca DRILL; baris yang tidak cocok masuk ke intro (src/lib/meeting-plan.ts:82-92, tests/meeting-plan.test.ts:65-69). MUSHAF menerima tanda pisah – atau -, dan nomor tunggal berarti satu halaman (src/lib/meeting-plan.ts:75-80, tests/meeting-plan.test.ts:35-44). Tugas mandiri: mengambil seluruh sisa blok sebagai teks tugas (src/lib/meeting-plan.ts:69-73, tests/meeting-plan.test.ts:21-33). Blok di luar materi seperti Bentuk ujian tetap disimpan sebagai langkah bertajuk (src/lib/meeting-plan.ts:94-96).

⚠️ meetingPlan mengembalikan null bila tidak ada satu pun langkah drills, mushaf, atau task (src/lib/meeting-plan.ts:100). Materi tajwid biasa seperti itu bukan pertemuan, sehingga tidak punya langkah yang bisa ditampilkan (tests/meeting-plan.test.ts:71-73).

mushafRange membentang from sampai to, meetingPages mengumpulkan seluruh halaman, dan meetingDrills mengumpulkan seluruh ayat latihan (src/lib/meeting-plan.ts:104-114). Daftar itu dipakai ulang oleh skrip data Qur'an, yang memakai pola baris yang sama untuk Praktik mushaf: dan 1:2 | … (scripts/build-quran-data.mjs:101-107); rinciannya ada di Data Qur'an dan Mushaf. Seluruh 26 pertemuan yang di-seed wajib lolos pemeriksaan ini (tests/meeting-plan.test.ts:90-99).

Aksara Arab, contoh, dan ayat

isArabicOnly menandai teks yang hanya berisi aksara Arab tanpa kata Latin, dan itulah syarat banyak cabang di atas (src/lib/lesson-layout.ts:6-10). exampleGroups memakai · sebagai pemisah kelompok atau kolom dan ، sebagai pemisah kata di dalam kelompok (src/lib/lesson-layout.ts:13-19). verseParts memisahkan kutipan dari rujukannya, misalnya … (Al-Baqarah: 2) menjadi arabic dan reference, dan mengembalikan null untuk teks Latin (src/lib/lesson-layout.ts:22-27). Kedua helper ini diuji langsung (tests/lesson-layout.test.ts:109-117).

Di sisi tampilan, arabicRuns memotong teks menjadi potongan bertanda arabic agar rentetan aksara Arab bisa disetel dengan typeface Arab tanpa memotong kalimat Latin di sekitarnya (src/lib/lesson-layout.ts:301-308, tests/lesson-layout.test.ts:119-125). Cara komponen memakainya dijelaskan di Komponen UI Pelajaran.

Rujukan dan batas angka

Blok terakhir yang dibuka Rujukan: diambil sebagai source dan dikeluarkan dari daftar blok, pada kedua parser (src/lib/lesson-layout.ts:142, src/lib/meeting-plan.ts:41). Nilainya diverifikasi tes sebagai layout.source dan plan.source (tests/lesson-layout.test.ts:7-28, tests/meeting-plan.test.ts:21-33).

BatasNilaiRujukan
panjang baris maksimum agar jadi judul80 karaktersrc/lib/lesson-layout.ts:79
panjang term sebelum :1–48 karaktersrc/lib/lesson-layout.ts:57
panjang id bagian48 karaktersrc/lib/lesson-layout.ts:119-133
panjang baris latihan surah dan ayah1–3 digitsrc/lib/meeting-plan.ts:26-29
kecepatan readingMinutes180 kata per menit, minimal 1 menitsrc/lib/lesson-layout.ts:311-313

readingMinutes membulatkan jumlah kata dibagi 180 dan tidak pernah menghasilkan nol (src/lib/lesson-layout.ts:311-313, tests/lesson-layout.test.ts:127-130).