diff --git a/README.md b/README.md index 408d6a8..dca1865 100644 --- a/README.md +++ b/README.md @@ -277,6 +277,39 @@ Untuk materi logika pemrograman menggunakan flowchart: | `---INITIAL_FLOWCHART---` | Struktur flowchart awal untuk latihan | | `---EXPECTED_FLOWCHART---` | Validasi struktur flowchart (JSON) | +#### Blok Khusus Quiz (Opsional) + +LMS mendukung pembuatan kuis interaktif (Flashcard dan Pilihan Ganda) dalam dua format: + +| Blok | Fungsi | +|------|--------| +| `---QUIZ_FLASHCARD---` | Kuis format Markdown (Flashcard & Pilihan Ganda) | +| `---INITIAL_QUIZ---` | Kuis format JSON | + +##### Format Markdown (`QUIZ_FLASHCARD`) + +Format ini sangat mudah digunakan untuk membuat kuis cepat. + +```markdown +---QUIZ_FLASHCARD--- +### Pertanyaan Flashcard +Ini adalah jawaban yang akan muncul di balik kartu. +> Penjelasan: Muncul setelah kartu dibalik. + +### Apa output dari printf("%d", 10 + 5)? +- [] 105 +- [x] 15 +- [] 10 +> Penjelasan: Operasi aritmatika dikerjakan dulu sebelum dicetak. +---END_QUIZ_FLASHCARD--- +``` + +**Aturan Penulisan:** +1. Pertanyaan harus diawali dengan `###`. +2. Untuk **Pilihan Ganda**, gunakan `- []` untuk pilihan salah dan `- [x]` untuk pilihan benar. +3. Untuk **Flashcard**, cukup tulis jawaban langsung di bawah pertanyaan (tanpa `- []`). +4. Penjelasan opsional bisa ditambahkan di akhir pertanyaan dengan awalan `>`. + ### 5. Keamanan & Akses Anonim Sistem dilengkapi fitur keamanan untuk menjaga stabilitas: diff --git a/documentation.md b/documentation.md index 5dc3da5..af24596 100644 --- a/documentation.md +++ b/documentation.md @@ -1,7 +1,7 @@ # Elemes LMS — Dokumentasi Teknis **Project:** LMS-C (Learning Management System untuk Pemrograman C & Arduino) -**Terakhir diupdate:** 22 April 2026 +**Terakhir diupdate:** 10 Mei 2026 --- @@ -286,6 +286,7 @@ Elemes mendukung beberapa mode lesson melalui **marker** di file markdown. Mode | **Circuit** | `---INITIAL_CIRCUIT---` | Circuit + Output | node voltage + key_text | | **Arduino/Velxio** | `---INITIAL_CODE_ARDUINO---` | Velxio (iframe) + Output | serial + wiring + key_text | | **Velxio circuit-only** | `---VELXIO_CIRCUIT---` (tanpa code) | Velxio (no editor) + Output | wiring + key_text | +| **Quiz** | `---QUIZ_FLASHCARD---` atau `---INITIAL_QUIZ---` | Quiz | Completion status | | **Hybrid** | C/Python + Circuit | Editor + Circuit + Output | AND-logic: kedua harus pass | ### Markdown Sections yang Dikenali @@ -297,7 +298,8 @@ Elemes mendukung beberapa mode lesson melalui **marker** di file markdown. Mode | `---INITIAL_CODE---` / `---END_INITIAL_CODE---` | Kode awal C | | `---INITIAL_PYTHON---` / `---END_INITIAL_PYTHON---` | Kode awal Python | | `---INITIAL_CIRCUIT---` / `---END_INITIAL_CIRCUIT---` | Circuit text awal (CircuitJS format) | -| `---INITIAL_QUIZ---` / `---END_INITIAL_QUIZ---` | Quiz data | +| `---INITIAL_QUIZ---` / `---END_INITIAL_QUIZ---` | Quiz data (JSON) | +| `---QUIZ_FLASHCARD---` / `---END_QUIZ_FLASHCARD---` | Quiz data (Markdown/Flashcard format) | | `---INITIAL_CODE_ARDUINO---` / `---END_INITIAL_CODE_ARDUINO---` | Kode awal Arduino | | `---VELXIO_CIRCUIT---` / `---END_VELXIO_CIRCUIT---` | Circuit JSON untuk Velxio (komponen + wires) | | `---EXPECTED_OUTPUT---` / `---END_EXPECTED_OUTPUT---` | Expected stdout (C/Python) atau node voltage JSON (Circuit) | @@ -457,6 +459,32 @@ Saat siswa klik "Cek Rangkaian", fungsi `evaluateCircuit()` menjalankan: --- +## Quiz Integration + +Elemes mendukung kuis interaktif yang terintegrasi langsung dengan sistem progres. Kuis dapat berupa Flashcard (Tanya-Jawab) atau Pilihan Ganda (MCQ). + +### Arsitektur Parsing (`QUIZ_FLASHCARD`) + +Untuk memudahkan pengajar, Elemes menyediakan parser Markdown khusus di `lesson_service.py` (`_parse_flashcards`): + +1. **Detection**: Mencari blok `---QUIZ_FLASHCARD---`. +2. **Splitting**: Membagi konten berdasarkan heading `###`. +3. **MCQ vs Flashcard**: + - Jika ditemukan pola `- []` atau `- [x]`, elemen diparse sebagai `type: 'mcq'`. + - Jika tidak, diparse sebagai `type: 'flashcard'`. +4. **Explanation**: Menangkap blok kutipan `>` sebagai penjelasan yang muncul setelah kuis dijawab. +5. **Rendering**: Pertanyaan dan jawaban di-render menggunakan filter Markdown standar (mendukung formatting, code snippets, dll). + +### Quiz State Management + +**File:** `frontend/src/lib/components/QuizTab.svelte` + +1. **Shuffle**: Pertanyaan diacak setiap kali kuis dimulai (opsional). +2. **Tracking**: Menggunakan state lokal untuk melacak jawaban benar/salah. +3. **Completion**: Setelah semua pertanyaan dijawab, memicu `completeLesson('completed')` yang mengirimkan progres ke backend. + +--- + ## Anti Copy-Paste System Sistem berlapis untuk mencegah siswa meng-copy konten pelajaran dan mem-paste kode dari sumber eksternal. diff --git a/examples/content/flowchart_test.md b/examples/content/flowchart_test.md new file mode 100644 index 0000000..9e58958 --- /dev/null +++ b/examples/content/flowchart_test.md @@ -0,0 +1,72 @@ +---LESSON_INFO--- +**Learning Objectives:** +- Memahami alur logika sistem otomatis berbasis sensor. +- Mengimplementasikan percabangan (IF-ELSE) dalam flowchart. +- Membuat siklus perulangan (LOOP) untuk pemantauan berkelanjutan. + +**Prerequisites:** +- Variabel + +**Challenge:** +Buatlah flowchart untuk **Sistem Penyiraman Tanaman Otomatis**. +1. Mulai sistem. +2. Inisialisasi sensor kelembapan tanah. +3. Baca nilai kelembapan secara terus-menerus. +4. JIKA tanah **Kering**, maka **Nyalakan Pompa Air**. +5. JIKA tanah **Basah**, maka **Matikan Pompa Air**. +6. Setelah tindakan (nyala/mati), kembali baca sensor. + +---END_LESSON_INFO--- + +# Tantangan: Penyiram Tanaman Otomatis +Gunakan elemen di sebelah kiri untuk menyusun logika sistem penyiraman otomatis Anda. + +Berikut adalah contoh visualisasi alur logika dasar: + +```flowchart,100%,300px +start[roundrect] "Mulai" +setup[rect] "Setup LED" +loop[circle] "Loop" +on[parallelogram] "LED ON" +off[parallelogram] "LED OFF" + +start --> setup +setup --> loop +loop --> on +on --> off +off --> loop +``` + +---INITIAL_FLOWCHART--- +start[roundrect] "Mulai Sistem" +init[rect] "Inisialisasi Sensor" +read[rect] "Baca Kelembapan Tanah" +check[diamond] "Apakah Tanah Kering?" +on[parallelogram] "Nyalakan Pompa Air" +off[parallelogram] "Matikan Pompa Air" + +start --> init +init --> read +read --> check +check --> on "Ya" +check --> off "Tidak" +on --> read +off --> read +---END_INITIAL_FLOWCHART--- + +---EXPECTED_FLOWCHART--- +start[roundrect] "mulai" +init[rect] "inisialisasi" +read[rect] "baca" +check[diamond] "kering" +on[parallelogram] "nyalakan" +off[parallelogram] "matikan" + +start --> init +init --> read +read --> check +check --> on +check --> off +on --> read +off --> read +---END_EXPECTED_FLOWCHART--- diff --git a/examples/content/home.md b/examples/content/home.md index 5979c45..d5458d7 100644 --- a/examples/content/home.md +++ b/examples/content/home.md @@ -15,24 +15,27 @@ Semua materi bisa dikerjakan langsung di browser! ### Dasar-Dasar 1. [Hello, World!](lesson/hello_world.md) 2. [Variabel](lesson/variabel.md) -3. [Uji Coba Flowchart](/lesson/flowchart_test) -4. [Uji Coba LaTeX](/lesson/latex_test) +3. [Uji Coba Flowchart](lesson/flowchart_test.md) +4. [Uji Coba Kuis](lesson/quiz_test.md) +5. [Uji Coba LaTeX](lesson/latex_test.md) ### Elektronika (Hybrid) -3. [Rangkaian Dasar](lesson/rangkaian_dasar.md) +6. [Rangkaian Dasar](lesson/rangkaian_dasar.md) ### Arduino (Velxio) -4. [LED Blink](lesson/led_blink_arduino.md) -5. [Hello Serial](lesson/hello_serial_arduino.md) -6. [Button Input](lesson/button_input_arduino.md) -7. [Traffic Light](lesson/traffic_light_arduino.md) +7. [LED Blink](lesson/led_blink_arduino.md) +8. [Hello Serial](lesson/hello_serial_arduino.md) +9. [Button Input](lesson/button_input_arduino.md) +10. [Traffic Light](lesson/traffic_light_arduino.md) ----Available_Lessons---- 1. [Hello, World!](lesson/hello_world.md) 2. [Variabel](lesson/variabel.md) -3. [Rangkaian Dasar](lesson/rangkaian_dasar.md) -4. [LED Blink](lesson/led_blink_arduino.md) -5. [Hello Serial](lesson/hello_serial_arduino.md) -6. [Button Input](lesson/button_input_arduino.md) -7. [Traffic Light](lesson/traffic_light_arduino.md) +3. [Uji Coba Flowchart](lesson/flowchart_test.md) +4. [Uji Coba Kuis](lesson/quiz_test.md) +5. [Rangkaian Dasar](lesson/rangkaian_dasar.md) +6. [LED Blink](lesson/led_blink_arduino.md) +7. [Hello Serial](lesson/hello_serial_arduino.md) +8. [Button Input](lesson/button_input_arduino.md) +9. [Traffic Light](lesson/traffic_light_arduino.md) diff --git a/examples/content/quiz_test.md b/examples/content/quiz_test.md new file mode 100644 index 0000000..e1b9767 --- /dev/null +++ b/examples/content/quiz_test.md @@ -0,0 +1,37 @@ +# Uji Coba Kuis Komprehensif + +Pelajaran ini berisi berbagai tipe kuis untuk menguji fitur Pilihan Ganda, Flashcard, dan sistem penguncian pembatalan. + +---QUIZ_FLASHCARD--- +### Bahasa C adalah bahasa pemrograman tingkat rendah. +- [] Benar +- [x] Salah +> Penjelasan: Bahasa C sebenarnya dikategorikan sebagai bahasa tingkat menengah (*middle-level language*) karena memiliki fitur bahasa tingkat rendah (seperti manipulasi memori) sekaligus fitur bahasa tingkat tinggi (seperti struktur kontrol yang manusiawi). + +### Apa output dari `printf("%d", 5 + 5);`? +- [] 55 +- [x] 10 +- [] 5 + 5 +- [] Error +> Penjelasan: Operasi `5 + 5` dihitung terlebih dahulu menjadi `10`, lalu dicetak sebagai integer menggunakan format specifier `%d`. + +### Bagaimana cara menulis komentar satu baris di bahasa C? +Cukup gunakan dua garis miring di awal baris, contoh: `// ini komentar`. +> Penjelasan: Komentar berguna untuk mendokumentasikan kode agar mudah dibaca oleh manusia, dan akan diabaikan oleh compiler. + +### Apa fungsi dari `return 0;` di dalam fungsi `main()`? +Menandakan bahwa program telah selesai berjalan dengan sukses tanpa ada error. +---END_QUIZ_FLASHCARD--- + +---EXERCISE--- +Cobalah untuk menyelesaikan kuis di tab sebelah kanan. Ingat, kamu tidak bisa melihat materi ini jika kuis sedang berjalan! +--- + +---INITIAL_CODE--- +#include + +int main() { + printf("Selesaikan kuisnya dulu ya!\n"); + return 0; +} +---END_INITIAL_CODE--- diff --git a/examples/tokens_siswa.csv b/examples/tokens_siswa.csv index 4421455..f19db46 100644 --- a/examples/tokens_siswa.csv +++ b/examples/tokens_siswa.csv @@ -1,3 +1,3 @@ -token;nama_siswa;button_input_arduino;flowchart_test;hello_serial_arduino;hello_world;latex_test;led_blink_arduino;rangkaian_dasar;traffic_light_arduino;variabel -121312;Anggoro Dwi;not_started;completed;not_started;completed;not_started;completed;completed;not_started;completed -dummy_token_12345;Example Student;not_started;not_started;not_started;completed;not_started;not_started;not_started;not_started;not_started +token;nama_siswa;button_input_arduino;flowchart_test;hello_serial_arduino;hello_world;latex_test;led_blink_arduino;quiz_test;rangkaian_dasar;traffic_light_arduino;variabel +121312;Anggoro Dwi;not_started;completed;not_started;completed;not_started;completed;not_started;completed;not_started;completed +dummy_token_12345;Example Student;not_started;not_started;not_started;completed;not_started;not_started;not_started;not_started;not_started;not_started