rairo commited on
Commit
30b12e0
·
verified ·
1 Parent(s): 8ce36d4

Update content_pack.py

Browse files
Files changed (1) hide show
  1. content_pack.py +641 -14
content_pack.py CHANGED
@@ -362,6 +362,19 @@ def get_adjectives(pack: dict = None) -> list:
362
  # ---------------------------------------------------------------------------
363
 
364
  LESSON_CONTENT = {
 
 
 
 
 
 
 
 
 
 
 
 
 
365
  "topic_marker": {
366
  "explanation": {
367
  "title": "Topic Markers 은/는",
@@ -372,6 +385,105 @@ LESSON_CONTENT = {
372
  ),
373
  "pattern": "N (Consonant) + 은 / N (Vowel) + 는",
374
  "notes": "The topic marker tells the listener what the sentence is about.",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
375
  },
376
  "example_sentences": [
377
  {
@@ -411,6 +523,75 @@ LESSON_CONTENT = {
411
  ),
412
  "pattern": "N (Consonant) + 이에요 / N (Vowel) + 예요",
413
  "notes": "이에요/예요 is the polite present tense of the copula (to be).",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
414
  },
415
  "example_sentences": [
416
  {
@@ -450,13 +631,83 @@ LESSON_CONTENT = {
450
  ),
451
  "pattern": "N (Consonant) + 이 아니에요 / N (Vowel/ㄹ) + 가 아니에요",
452
  "notes": "이/가 is the subject marker. 아니에요 means 'is not'.",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
453
  },
454
  "example_sentences": [
455
  {
456
  "positive": {"korean": "이것은 물이에요.", "english": "This is water."},
457
  "negative": {"korean": "이것은 물이 아니에요.", "english": "This is not water."},
458
  "focus_word": "물이 아니에요",
459
- "rule_shown": "물 (consonant ending ㄹ) → 아니에요",
460
  },
461
  {
462
  "positive": {"korean": "저는 학생이에요.", "english": "I am a student."},
@@ -489,6 +740,82 @@ LESSON_CONTENT = {
489
  ),
490
  "pattern": "V-stem + 는다고/ㄴ다고 | Adj + 다고 | V(past) + 었/았다고",
491
  "notes": "했어요 (said) or 해요 (says) follows 다고 in most sentences.",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
492
  },
493
  "example_sentences": [
494
  {
@@ -516,11 +843,84 @@ LESSON_CONTENT = {
516
  "title": "Indirect Quotation — Commands",
517
  "body": (
518
  "(으)라고 is used to report commands or requests. "
519
- "지 말라고 is used to report negative commands (telling someone not to do something). "
520
- "달라고 reports requests (please give/do for me). 주라고 reports 'please do'."
521
  ),
522
  "pattern": "V-stem + (으)라고 | V + 지 말라고 | 달라고 / 주라고",
523
  "notes": "The subject marker after the speaker is 이/가.",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
524
  },
525
  "example_sentences": [
526
  {
@@ -549,11 +949,80 @@ LESSON_CONTENT = {
549
  "body": (
550
  "냐고 is used to report questions. "
551
  "Attach to verb/adjective stems. "
552
- "If the stem ends in ㄹ, drop ㄹ before adding 냐고. "
553
- "물었어요 (asked) or 물어봤어요 typically follows."
554
  ),
555
  "pattern": "V/Adj-stem + 냐고 (drop ㄹ from ㄹ-irregular stems)",
556
  "notes": "냐고 replaces the question ending 아요/어요/이에요.",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
557
  },
558
  "example_sentences": [
559
  {
@@ -586,6 +1055,71 @@ LESSON_CONTENT = {
586
  ),
587
  "pattern": "V-stem + 자고 했어요/해요",
588
  "notes": "자 is the plain form suggestion ending. 자고 = quoting that suggestion.",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
589
  },
590
  "example_sentences": [
591
  {
@@ -618,13 +1152,86 @@ LESSON_CONTENT = {
618
  ),
619
  "pattern": "V-stem + (으)ㄹ 걸 그랬다 | V + 지 말 걸 그랬다",
620
  "notes": "그랬다 can be softened to 그랬어 in casual speech.",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
621
  },
622
  "example_sentences": [
623
  {
624
  "positive": {"korean": "수업에 갔어요.", "english": "I went to class."},
625
  "negative": {"korean": "수업에 갈 걸 그랬어요.", "english": "I should have gone to class."},
626
  "focus_word": "갈 걸 그랬어요",
627
- "rule_shown": "가다 → 가 + ㄹ 걸 그어요",
628
  },
629
  {
630
  "positive": {"korean": "그 음식을 먹었어요.", "english": "I ate that food."},
@@ -642,24 +1249,44 @@ LESSON_CONTENT = {
642
  }
643
 
644
 
645
- def get_lesson_content(grammar_rule: str) -> dict:
646
- """Return full lesson content for a grammar rule (all 6 frames)."""
647
- return LESSON_CONTENT.get(grammar_rule, {})
648
 
649
 
650
  def get_explanation(grammar_rule: str) -> dict:
651
- """Return Frame 1+2 data: title, body, pattern, notes."""
652
- content = LESSON_CONTENT.get(grammar_rule, {})
653
- rule = GRAMMAR_RULES.get(grammar_rule, {})
654
- expl = content.get("explanation", {})
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
655
  return {
 
656
  "grammar_rule": grammar_rule,
657
  "title": expl.get("title", rule.get("name", grammar_rule)),
658
- "body": expl.get("body", rule.get("description", "")),
659
  "pattern": expl.get("pattern", ""),
660
  "notes": expl.get("notes", ""),
661
  "difficulty": rule.get("difficulty", 1),
662
  "lesson": rule.get("lesson", ""),
 
 
 
 
 
 
663
  }
664
 
665
 
 
362
  # ---------------------------------------------------------------------------
363
 
364
  LESSON_CONTENT = {
365
+
366
+ # -----------------------------------------------------------------------
367
+ # topic_marker + copula are taught together as Grammar 1.1
368
+ # The slides array drives the 6-slide breakdown per team lead's spec.
369
+ # Slide types:
370
+ # intro — formula display only (formula, sub_formula)
371
+ # body — explanation paragraph (text, highlight)
372
+ # diagram — labelled formula (formula_parts[])
373
+ # rules — conjugation rule box (sections[{label, rules[]}])
374
+ # examples — annotated examples (items[{korean, english, annotations[]}])
375
+ # practice — choose-correct MCQ (question, items[{korean, choices, answer}])
376
+ # -----------------------------------------------------------------------
377
+
378
  "topic_marker": {
379
  "explanation": {
380
  "title": "Topic Markers 은/는",
 
385
  ),
386
  "pattern": "N (Consonant) + 은 / N (Vowel) + 는",
387
  "notes": "The topic marker tells the listener what the sentence is about.",
388
+ "slides": [
389
+ {
390
+ "index": 0,
391
+ "type": "intro",
392
+ "title": "Grammar 1.1",
393
+ "formula": "N1 은/는 N2 이에요/예요.",
394
+ "formula_colors": {"N1": "#F5A623", "N2": "#E8824A"},
395
+ "sub_formula": "N1 = N2",
396
+ "sub_formula_colors": {"N1": "#F5A623", "N2": "#E8824A"},
397
+ },
398
+ {
399
+ "index": 1,
400
+ "type": "body",
401
+ "title": "N1 은/는 N2 이에요/예요. N1=N2",
402
+ "text": (
403
+ "The equational expression, where two nouns are involved, is the "
404
+ "most basic sentence structure in Korean. The first noun is followed "
405
+ "by a topic marker –은/는 and the second noun is followed by the "
406
+ "copular –이에요/예요. The topic marker –은/는 indicates that the "
407
+ "preceding noun is the topic of the sentence."
408
+ ),
409
+ "highlight": "most basic sentence structure",
410
+ "highlight_color": "#E8292A",
411
+ },
412
+ {
413
+ "index": 2,
414
+ "type": "diagram",
415
+ "title": "Noun 1 = Noun 2",
416
+ "formula": "N1 은/는 N2 이에요/예요.",
417
+ "formula_colors": {"N1": "#F5A623", "N2": "#E8824A"},
418
+ "formula_parts": [
419
+ {"label": "Topic", "color": "#F5A623", "points_to": "N1"},
420
+ {"label": "Topic marker", "color": "#333333", "points_to": "은/는"},
421
+ {"label": "Explanation", "color": "#E8824A", "points_to": "N2"},
422
+ {"label": "to be", "color": "#333333", "points_to": "이에요/예요"},
423
+ ],
424
+ },
425
+ {
426
+ "index": 3,
427
+ "type": "rules",
428
+ "title": "N1 은/는 N2 이에요/예요. N1=N2",
429
+ "sections": [
430
+ {
431
+ "label": "Topic Marker",
432
+ "rules": [
433
+ "Vowel-ending noun + 는",
434
+ "Consonant-ending noun + 은",
435
+ ],
436
+ },
437
+ {
438
+ "label": "Copular",
439
+ "rules": [
440
+ "Vowel-ending noun + 예요",
441
+ "Consonant-ending noun + 이에요",
442
+ ],
443
+ },
444
+ ],
445
+ },
446
+ {
447
+ "index": 4,
448
+ "type": "examples",
449
+ "title": "N1 은/는 N2 이에요/예요. N1=N2",
450
+ "items": [
451
+ {
452
+ "korean": "저는 캐나다 사람이에요.",
453
+ "english": "I am Canadian.",
454
+ "annotations": [
455
+ {"syllable": "저", "marker": "는", "ending_type": "V", "color": "#4CAF50"},
456
+ ],
457
+ },
458
+ {
459
+ "korean": "저스틴은 캐나다 사람이에요.",
460
+ "english": "Justin is Canadian.",
461
+ "annotations": [
462
+ {"syllable": "저스틴", "marker": "은", "ending_type": "C", "color": "#4CAF50"},
463
+ ],
464
+ },
465
+ ],
466
+ },
467
+ {
468
+ "index": 5,
469
+ "type": "practice",
470
+ "title": "Which one is the correct ending?",
471
+ "items": [
472
+ {
473
+ "korean": "저는 민호",
474
+ "choices": ["이에요", "예요"],
475
+ "answer": "예요",
476
+ "hint": "민호 ends with a vowel → 예요",
477
+ },
478
+ {
479
+ "korean": "선생님",
480
+ "choices": ["이에요", "예요"],
481
+ "answer": "이에요",
482
+ "hint": "선생님 ends with consonant ㅁ → 이에요",
483
+ },
484
+ ],
485
+ },
486
+ ],
487
  },
488
  "example_sentences": [
489
  {
 
523
  ),
524
  "pattern": "N (Consonant) + 이에요 / N (Vowel) + 예요",
525
  "notes": "이에요/예요 is the polite present tense of the copula (to be).",
526
+ "slides": [
527
+ {
528
+ "index": 0, "type": "intro",
529
+ "title": "Grammar 1.1 — Copula",
530
+ "formula": "N1 은/는 N2 이에요/예요.",
531
+ "formula_colors": {"N1": "#F5A623", "N2": "#E8824A"},
532
+ "sub_formula": "N1 = N2",
533
+ "sub_formula_colors": {"N1": "#F5A623", "N2": "#E8824A"},
534
+ },
535
+ {
536
+ "index": 1, "type": "body",
537
+ "title": "이에요/예요 — The Copula",
538
+ "text": (
539
+ "이에요/예요 is the polite present tense 'to be' verb (copula). "
540
+ "It follows the second noun to complete the equational sentence N1 is N2. "
541
+ "이에요 is used after nouns ending in a consonant. "
542
+ "예요 is used after nouns ending in a vowel."
543
+ ),
544
+ "highlight": "most polite and common form",
545
+ "highlight_color": "#E8292A",
546
+ },
547
+ {
548
+ "index": 2, "type": "diagram",
549
+ "title": "N2 이에요/예요",
550
+ "formula": "N1 은/는 N2 이에요/예요.",
551
+ "formula_colors": {"N1": "#F5A623", "N2": "#E8824A"},
552
+ "formula_parts": [
553
+ {"label": "Topic", "color": "#F5A623", "points_to": "N1"},
554
+ {"label": "Topic marker","color": "#333333", "points_to": "은/는"},
555
+ {"label": "Noun 2", "color": "#E8824A", "points_to": "N2"},
556
+ {"label": "to be", "color": "#333333", "points_to": "이에요/예요"},
557
+ ],
558
+ },
559
+ {
560
+ "index": 3, "type": "rules",
561
+ "title": "Copula Conjugation",
562
+ "sections": [
563
+ {
564
+ "label": "Copular",
565
+ "rules": [
566
+ "Vowel-ending noun + 예요",
567
+ "Consonant-ending noun + 이에요",
568
+ ],
569
+ },
570
+ ],
571
+ },
572
+ {
573
+ "index": 4, "type": "examples",
574
+ "title": "이에요/예요 Examples",
575
+ "items": [
576
+ {
577
+ "korean": "저는 학생이에요.", "english": "I am a student.",
578
+ "annotations": [{"syllable": "학생", "marker": "이에요", "ending_type": "C", "color": "#4CAF50"}],
579
+ },
580
+ {
581
+ "korean": "제 이름은 민수예요.", "english": "My name is Minsu.",
582
+ "annotations": [{"syllable": "민수", "marker": "예요", "ending_type": "V", "color": "#4CAF50"}],
583
+ },
584
+ ],
585
+ },
586
+ {
587
+ "index": 5, "type": "practice",
588
+ "title": "Which one is the correct ending?",
589
+ "items": [
590
+ {"korean": "저는 민호", "choices": ["이에요", "예요"], "answer": "예요", "hint": "민호 ends with a vowel → 예요"},
591
+ {"korean": "선생님", "choices": ["이에요", "예요"], "answer": "이에요", "hint": "선생님 ends with consonant ㅁ → 이에요"},
592
+ ],
593
+ },
594
+ ],
595
  },
596
  "example_sentences": [
597
  {
 
631
  ),
632
  "pattern": "N (Consonant) + 이 아니에요 / N (Vowel/ㄹ) + 가 아니에요",
633
  "notes": "이/가 is the subject marker. 아니에요 means 'is not'.",
634
+ "slides": [
635
+ {
636
+ "index": 0, "type": "intro",
637
+ "title": "Negative Copula",
638
+ "formula": "N1 은/는 N2 이/가 아니에요.",
639
+ "formula_colors": {"N1": "#F5A623", "N2": "#E8824A"},
640
+ "sub_formula": "N1 ≠ N2",
641
+ "sub_formula_colors": {"N1": "#F5A623", "N2": "#E8824A"},
642
+ },
643
+ {
644
+ "index": 1, "type": "body",
645
+ "title": "이/가 아니에요 — Negative",
646
+ "text": (
647
+ "To say 'N1 is NOT N2', replace 이에요/예요 with 이/가 아니에요. "
648
+ "이/가 is the subject marker attached to N2. "
649
+ "아니에요 means 'is not'. "
650
+ "Use 이 아니에요 after consonant-ending nouns, 가 아니에요 after vowels or ㄹ."
651
+ ),
652
+ "highlight": "NOT",
653
+ "highlight_color": "#E8292A",
654
+ },
655
+ {
656
+ "index": 2, "type": "diagram",
657
+ "title": "N2 이/가 아니에요",
658
+ "formula": "N1 은/는 N2 이/가 아니에요.",
659
+ "formula_colors": {"N1": "#F5A623", "N2": "#E8824A"},
660
+ "formula_parts": [
661
+ {"label": "Topic", "color": "#F5A623", "points_to": "N1"},
662
+ {"label": "Topic marker", "color": "#333333", "points_to": "은/는"},
663
+ {"label": "Noun 2", "color": "#E8824A", "points_to": "N2"},
664
+ {"label": "subject marker","color": "#333333", "points_to": "이/가"},
665
+ {"label": "is not", "color": "#E8292A", "points_to": "아니에요"},
666
+ ],
667
+ },
668
+ {
669
+ "index": 3, "type": "rules",
670
+ "title": "Negative Copula Conjugation",
671
+ "sections": [
672
+ {
673
+ "label": "Subject marker on N2",
674
+ "rules": [
675
+ "Vowel-ending or ㄹ-ending noun + 가 아니에요",
676
+ "Consonant-ending noun + 이 아니에요",
677
+ ],
678
+ },
679
+ ],
680
+ },
681
+ {
682
+ "index": 4, "type": "examples",
683
+ "title": "이/가 아니에요 Examples",
684
+ "items": [
685
+ {
686
+ "korean": "이것은 물이 아니에요.", "english": "This is not water.",
687
+ "annotations": [{"syllable": "물", "marker": "이 아니에요", "ending_type": "C(ㄹ→이)", "color": "#E8292A"}],
688
+ },
689
+ {
690
+ "korean": "이분은 의사가 아니에요.", "english": "This person is not a doctor.",
691
+ "annotations": [{"syllable": "의사", "marker": "가 아니에요", "ending_type": "V", "color": "#E8292A"}],
692
+ },
693
+ ],
694
+ },
695
+ {
696
+ "index": 5, "type": "practice",
697
+ "title": "Choose the correct negative ending.",
698
+ "items": [
699
+ {"korean": "물", "choices": ["이 아니에요", "가 아니에요"], "answer": "이 아니에요", "hint": "물 ends in ㄹ (consonant) → 이 아니에요"},
700
+ {"korean": "의사", "choices": ["이 아니에요", "가 아니에요"], "answer": "가 아니에요", "hint": "의사 ends in vowel → 가 아니에요"},
701
+ ],
702
+ },
703
+ ],
704
  },
705
  "example_sentences": [
706
  {
707
  "positive": {"korean": "이것은 물이에요.", "english": "This is water."},
708
  "negative": {"korean": "이것은 물이 아니에요.", "english": "This is not water."},
709
  "focus_word": "물이 아니에요",
710
+ "rule_shown": "물 (consonant ending ㄹ) → 아니에요",
711
  },
712
  {
713
  "positive": {"korean": "저는 학생이에요.", "english": "I am a student."},
 
740
  ),
741
  "pattern": "V-stem + 는다고/ㄴ다고 | Adj + 다고 | V(past) + 었/았다고",
742
  "notes": "했어요 (said) or 해요 (says) follows 다고 in most sentences.",
743
+ "slides": [
744
+ {
745
+ "index": 0, "type": "intro",
746
+ "title": "Indirect Quotation — Statements",
747
+ "formula": "[Speaker]이/가 [sentence]다고 했어요.",
748
+ "formula_colors": {},
749
+ "sub_formula": "'...' → ...다고 했어요",
750
+ "sub_formula_colors": {},
751
+ },
752
+ {
753
+ "index": 1, "type": "body",
754
+ "title": "Reporting What Someone Said",
755
+ "text": (
756
+ "Use 다고 했어요 to report statements someone made. "
757
+ "The direct speech quote is transformed: drop 요 from polite endings "
758
+ "and attach 다고. Action verbs use 는다고, adjectives use 다고 directly, "
759
+ "past tense uses 었/았다고."
760
+ ),
761
+ "highlight": "report statements",
762
+ "highlight_color": "#E8292A",
763
+ },
764
+ {
765
+ "index": 2, "type": "diagram",
766
+ "title": "Structure of 다고",
767
+ "formula": "[Speaker] [sentence-stem]다고 했어요.",
768
+ "formula_colors": {},
769
+ "formula_parts": [
770
+ {"label": "Speaker + 이/가", "color": "#F5A623", "points_to": "Speaker"},
771
+ {"label": "verb/adj stem", "color": "#E8824A", "points_to": "sentence-stem"},
772
+ {"label": "quotation marker","color": "#333333", "points_to": "다고"},
773
+ {"label": "said", "color": "#333333", "points_to": "했어요"},
774
+ ],
775
+ },
776
+ {
777
+ "index": 3, "type": "rules",
778
+ "title": "다고 Conjugation Rules",
779
+ "sections": [
780
+ {
781
+ "label": "Action verb (present)",
782
+ "rules": ["V-stem (consonant) + 는다고", "V-stem (vowel/ㄹ) + ㄴ다고"],
783
+ },
784
+ {
785
+ "label": "Adjective / 이다",
786
+ "rules": ["Adj-stem + 다고", "N + 이다 → 이라고"],
787
+ },
788
+ {
789
+ "label": "Past tense",
790
+ "rules": ["V/Adj past stem + 었/았다고"],
791
+ },
792
+ ],
793
+ },
794
+ {
795
+ "index": 4, "type": "examples",
796
+ "title": "다고 Examples",
797
+ "items": [
798
+ {
799
+ "korean": "민수는 등록금이 너무 비싸다고 했어요.",
800
+ "english": "Minsu said that the tuition is too expensive.",
801
+ "annotations": [{"syllable": "비싸다", "marker": "다고", "ending_type": "Adj", "color": "#4CAF50"}],
802
+ },
803
+ {
804
+ "korean": "친구가 공부한다고 했어요.",
805
+ "english": "My friend said that they study.",
806
+ "annotations": [{"syllable": "공부하", "marker": "ㄴ다고", "ending_type": "V(vowel)", "color": "#4CAF50"}],
807
+ },
808
+ ],
809
+ },
810
+ {
811
+ "index": 5, "type": "practice",
812
+ "title": "Choose the correct 다고 form.",
813
+ "items": [
814
+ {"korean": "비싸요 → 비싸___", "choices": ["다고", "는다고", "았다고"], "answer": "다고", "hint": "비싸다 is an adjective → 다고"},
815
+ {"korean": "먹어요 → 먹___", "choices": ["다고", "는다고", "ㄴ다고"], "answer": "는다고", "hint": "먹다 is an action verb (consonant stem) → 는다고"},
816
+ ],
817
+ },
818
+ ],
819
  },
820
  "example_sentences": [
821
  {
 
843
  "title": "Indirect Quotation — Commands",
844
  "body": (
845
  "(으)라고 is used to report commands or requests. "
846
+ "지 말라고 is used to report negative commands. "
847
+ "달라고 reports requests (please give/do for me)."
848
  ),
849
  "pattern": "V-stem + (으)라고 | V + 지 말라고 | 달라고 / 주라고",
850
  "notes": "The subject marker after the speaker is 이/가.",
851
+ "slides": [
852
+ {
853
+ "index": 0, "type": "intro",
854
+ "title": "Indirect Quotation — Commands",
855
+ "formula": "[Speaker]이/가 [V](으)라고 했어요.",
856
+ "formula_colors": {},
857
+ "sub_formula": "'Do X!' → X(으)라고 했어요",
858
+ "sub_formula_colors": {},
859
+ },
860
+ {
861
+ "index": 1, "type": "body",
862
+ "title": "Reporting Commands",
863
+ "text": (
864
+ "Use (으)라고 했어요 to report commands. "
865
+ "If the command was negative ('Don't do X'), use 지 말라고 했어요. "
866
+ "If reporting a request ('Please give me X'), use 달라고 했어요."
867
+ ),
868
+ "highlight": "commands and requests",
869
+ "highlight_color": "#E8292A",
870
+ },
871
+ {
872
+ "index": 2, "type": "diagram",
873
+ "title": "(으)라고 Structure",
874
+ "formula": "[Speaker]이/가 [V](으)라고 했어요.",
875
+ "formula_colors": {},
876
+ "formula_parts": [
877
+ {"label": "Speaker + 이/가", "color": "#F5A623", "points_to": "Speaker"},
878
+ {"label": "verb stem", "color": "#E8824A", "points_to": "V"},
879
+ {"label": "command marker", "color": "#333333", "points_to": "(으)라고"},
880
+ {"label": "said/told", "color": "#333333", "points_to": "했어요"},
881
+ ],
882
+ },
883
+ {
884
+ "index": 3, "type": "rules",
885
+ "title": "(으)라고 Conjugation Rules",
886
+ "sections": [
887
+ {
888
+ "label": "Positive command",
889
+ "rules": ["V-stem (vowel) + 라고", "V-stem (consonant) + 으라고"],
890
+ },
891
+ {
892
+ "label": "Negative command",
893
+ "rules": ["V + 지 말라고"],
894
+ },
895
+ {
896
+ "label": "Request",
897
+ "rules": ["달라고 (give me)", "주라고 (do for me)"],
898
+ },
899
+ ],
900
+ },
901
+ {
902
+ "index": 4, "type": "examples",
903
+ "title": "(으)라고 Examples",
904
+ "items": [
905
+ {
906
+ "korean": "선생님이 조용히 하라고 했어요.", "english": "The teacher told us to be quiet.",
907
+ "annotations": [{"syllable": "하", "marker": "라고", "ending_type": "V", "color": "#4CAF50"}],
908
+ },
909
+ {
910
+ "korean": "엄마가 뛰지 말라고 했어요.", "english": "Mom told us not to run.",
911
+ "annotations": [{"syllable": "뛰", "marker": "지 말라고", "ending_type": "Neg", "color": "#E8292A"}],
912
+ },
913
+ ],
914
+ },
915
+ {
916
+ "index": 5, "type": "practice",
917
+ "title": "Choose the correct command form.",
918
+ "items": [
919
+ {"korean": "가다 (go) → positive command", "choices": ["가라고", "가지 말라고", "달라고"], "answer": "가라고", "hint": "가다: vowel stem → 라고"},
920
+ {"korean": "먹다 (eat) → negative command", "choices": ["먹으라고", "먹지 말라고", "달라고"], "answer": "먹지 말라고", "hint": "Negative command → 지 말라고"},
921
+ ],
922
+ },
923
+ ],
924
  },
925
  "example_sentences": [
926
  {
 
949
  "body": (
950
  "냐고 is used to report questions. "
951
  "Attach to verb/adjective stems. "
952
+ "If the stem ends in ㄹ, drop ㄹ before adding 냐고."
 
953
  ),
954
  "pattern": "V/Adj-stem + 냐고 (drop ㄹ from ㄹ-irregular stems)",
955
  "notes": "냐고 replaces the question ending 아요/어요/이에요.",
956
+ "slides": [
957
+ {
958
+ "index": 0, "type": "intro",
959
+ "title": "Indirect Quotation — Questions",
960
+ "formula": "[Speaker]이/가 [V/Adj]냐고 물었어요.",
961
+ "formula_colors": {},
962
+ "sub_formula": "'Is X?' → X냐고 물었어요",
963
+ "sub_formula_colors": {},
964
+ },
965
+ {
966
+ "index": 1, "type": "body",
967
+ "title": "Reporting Questions",
968
+ "text": (
969
+ "Use 냐고 물었어요 to report yes/no or wh-questions. "
970
+ "Drop the polite ending (아요/어요) and attach 냐고. "
971
+ "For ㄹ-stem verbs, drop ㄹ before adding 냐고. "
972
+ "물었어요 means 'asked'."
973
+ ),
974
+ "highlight": "Drop ㄹ before 냐고",
975
+ "highlight_color": "#E8292A",
976
+ },
977
+ {
978
+ "index": 2, "type": "diagram",
979
+ "title": "냐고 Structure",
980
+ "formula": "[Speaker] [stem]냐고 물었어요.",
981
+ "formula_colors": {},
982
+ "formula_parts": [
983
+ {"label": "Speaker + 이/가", "color": "#F5A623", "points_to": "Speaker"},
984
+ {"label": "verb/adj stem", "color": "#E8824A", "points_to": "stem"},
985
+ {"label": "question marker", "color": "#333333", "points_to": "냐고"},
986
+ {"label": "asked", "color": "#333333", "points_to": "물었어요"},
987
+ ],
988
+ },
989
+ {
990
+ "index": 3, "type": "rules",
991
+ "title": "냐고 Rules",
992
+ "sections": [
993
+ {
994
+ "label": "Standard",
995
+ "rules": ["V/Adj stem + 냐고", "쉬다 → 쉬냐고", "가다 → 가냐고"],
996
+ },
997
+ {
998
+ "label": "ㄹ-stem (drop ㄹ)",
999
+ "rules": ["알다 → 아냐고", "살다 → 사냐고"],
1000
+ },
1001
+ ],
1002
+ },
1003
+ {
1004
+ "index": 4, "type": "examples",
1005
+ "title": "냐고 Examples",
1006
+ "items": [
1007
+ {
1008
+ "korean": "지혜는 지금 쉬냐고 물었어요.", "english": "Jihye asked if I am resting now.",
1009
+ "annotations": [{"syllable": "쉬", "marker": "냐고", "ending_type": "V", "color": "#4CAF50"}],
1010
+ },
1011
+ {
1012
+ "korean": "친구가 어디 가냐고 물었어요.", "english": "My friend asked where I was going.",
1013
+ "annotations": [{"syllable": "가", "marker": "냐고", "ending_type": "V", "color": "#4CAF50"}],
1014
+ },
1015
+ ],
1016
+ },
1017
+ {
1018
+ "index": 5, "type": "practice",
1019
+ "title": "Choose the correct 냐고 form.",
1020
+ "items": [
1021
+ {"korean": "쉬다 → 쉬___", "choices": ["냐고", "으냐고", "았냐고"], "answer": "냐고", "hint": "쉬다 vowel stem → 쉬냐고"},
1022
+ {"korean": "알다 (ㄹ-stem) → ___냐고", "choices": ["알", "아", "알으"], "answer": "아", "hint": "ㄹ-stem: drop ㄹ → 아냐고"},
1023
+ ],
1024
+ },
1025
+ ],
1026
  },
1027
  "example_sentences": [
1028
  {
 
1055
  ),
1056
  "pattern": "V-stem + 자고 했어요/해요",
1057
  "notes": "자 is the plain form suggestion ending. 자고 = quoting that suggestion.",
1058
+ "slides": [
1059
+ {
1060
+ "index": 0, "type": "intro",
1061
+ "title": "Indirect Quotation — Suggestions",
1062
+ "formula": "[Speaker]이/가 [V]자고 했어요.",
1063
+ "formula_colors": {},
1064
+ "sub_formula": "'Let's X!' → X자고 했어요",
1065
+ "sub_formula_colors": {},
1066
+ },
1067
+ {
1068
+ "index": 1, "type": "body",
1069
+ "title": "Reporting Suggestions",
1070
+ "text": (
1071
+ "자 is the plain-form suggestion ending meaning 'let's'. "
1072
+ "To report a suggestion in indirect speech, attach 자고 to the verb stem. "
1073
+ "자고 했어요 means 'suggested that we...'"
1074
+ ),
1075
+ "highlight": "let's",
1076
+ "highlight_color": "#E8292A",
1077
+ },
1078
+ {
1079
+ "index": 2, "type": "diagram",
1080
+ "title": "자고 Structure",
1081
+ "formula": "[Speaker] [V-stem]자고 했어요.",
1082
+ "formula_colors": {},
1083
+ "formula_parts": [
1084
+ {"label": "Speaker + 이/가", "color": "#F5A623", "points_to": "Speaker"},
1085
+ {"label": "verb stem", "color": "#E8824A", "points_to": "V-stem"},
1086
+ {"label": "suggestion marker","color": "#333333", "points_to": "자고"},
1087
+ {"label": "said/suggested", "color": "#333333", "points_to": "했어요"},
1088
+ ],
1089
+ },
1090
+ {
1091
+ "index": 3, "type": "rules",
1092
+ "title": "자고 Rule",
1093
+ "sections": [
1094
+ {
1095
+ "label": "Suggestion (all verbs)",
1096
+ "rules": ["V-stem + 자고 했어요", "가다 → 가자고 했어요", "먹다 → 먹자고 했어요"],
1097
+ },
1098
+ ],
1099
+ },
1100
+ {
1101
+ "index": 4, "type": "examples",
1102
+ "title": "자고 Examples",
1103
+ "items": [
1104
+ {
1105
+ "korean": "친구가 같이 밥 먹자고 했어요.", "english": "My friend suggested eating together.",
1106
+ "annotations": [{"syllable": "먹", "marker": "자고", "ending_type": "V", "color": "#4CAF50"}],
1107
+ },
1108
+ {
1109
+ "korean": "예나는 일찍 집에 가자고 했어요.", "english": "Yena suggested going home early.",
1110
+ "annotations": [{"syllable": "가", "marker": "자고", "ending_type": "V", "color": "#4CAF50"}],
1111
+ },
1112
+ ],
1113
+ },
1114
+ {
1115
+ "index": 5, "type": "practice",
1116
+ "title": "Choose the correct 자고 form.",
1117
+ "items": [
1118
+ {"korean": "가다 → 가___", "choices": ["자고", "라고", "냐고"], "answer": "자고", "hint": "Suggestion → V-stem + 자고"},
1119
+ {"korean": "공부하다 → 공부하___", "choices": ["자고", "라고", "다고"], "answer": "자고", "hint": "Suggestion → V-stem + 자고"},
1120
+ ],
1121
+ },
1122
+ ],
1123
  },
1124
  "example_sentences": [
1125
  {
 
1152
  ),
1153
  "pattern": "V-stem + (으)ㄹ 걸 그랬다 | V + 지 말 걸 그랬다",
1154
  "notes": "그랬다 can be softened to 그랬어 in casual speech.",
1155
+ "slides": [
1156
+ {
1157
+ "index": 0, "type": "intro",
1158
+ "title": "Expressing Regret",
1159
+ "formula": "V + (으)ㄹ 걸 그랬다",
1160
+ "formula_colors": {},
1161
+ "sub_formula": "I should have done X / I shouldn't have done X",
1162
+ "sub_formula_colors": {},
1163
+ },
1164
+ {
1165
+ "index": 1, "type": "body",
1166
+ "title": "(으)ㄹ 걸 그랬다 — Regret",
1167
+ "text": (
1168
+ "(으)ㄹ 걸 그랬다 expresses regret that you did NOT do something. "
1169
+ "It means 'I should have done X'. "
1170
+ "지 말 걸 그랬다 expresses regret that you DID something — 'I shouldn't have done X'. "
1171
+ "Both refer to completed past situations."
1172
+ ),
1173
+ "highlight": "completed past regret",
1174
+ "highlight_color": "#E8292A",
1175
+ },
1176
+ {
1177
+ "index": 2, "type": "diagram",
1178
+ "title": "(으)ㄹ 걸 그랬다 Structure",
1179
+ "formula": "V-stem + (으)ㄹ 걸 그랬다.",
1180
+ "formula_colors": {},
1181
+ "formula_parts": [
1182
+ {"label": "verb stem", "color": "#F5A623", "points_to": "V-stem"},
1183
+ {"label": "future modifier", "color": "#E8824A", "points_to": "(으)ㄹ"},
1184
+ {"label": "regret particle", "color": "#333333", "points_to": "걸"},
1185
+ {"label": "was so / did so","color": "#333333", "points_to": "그랬다"},
1186
+ ],
1187
+ },
1188
+ {
1189
+ "index": 3, "type": "rules",
1190
+ "title": "(으)ㄹ 걸 그랬다 Rules",
1191
+ "sections": [
1192
+ {
1193
+ "label": "Should have (positive regret)",
1194
+ "rules": [
1195
+ "V-stem (consonant) + 을 걸 그랬다",
1196
+ "V-stem (vowel/ㄹ) + ㄹ 걸 그랬다",
1197
+ ],
1198
+ },
1199
+ {
1200
+ "label": "Shouldn't have (negative regret)",
1201
+ "rules": ["V + 지 말 걸 그랬다"],
1202
+ },
1203
+ ],
1204
+ },
1205
+ {
1206
+ "index": 4, "type": "examples",
1207
+ "title": "(으)ㄹ 걸 그랬다 Examples",
1208
+ "items": [
1209
+ {
1210
+ "korean": "수업에 갈 걸 그랬어요.", "english": "I should have gone to class.",
1211
+ "annotations": [{"syllable": "가", "marker": "ㄹ 걸 그랬어요", "ending_type": "V(vowel)", "color": "#4CAF50"}],
1212
+ },
1213
+ {
1214
+ "korean": "그 음식을 먹지 말 걸 그랬어요.", "english": "I shouldn't have eaten that food.",
1215
+ "annotations": [{"syllable": "먹", "marker": "지 말 걸 그랬어요", "ending_type": "Neg", "color": "#E8292A"}],
1216
+ },
1217
+ ],
1218
+ },
1219
+ {
1220
+ "index": 5, "type": "practice",
1221
+ "title": "Choose the correct regret form.",
1222
+ "items": [
1223
+ {"korean": "자다 (sleep) → should have slept", "choices": ["잘 걸 그랬다", "자지 말 걸 그랬다", "잘 거예요"], "answer": "잘 걸 그랬다", "hint": "자다 vowel stem: ㄹ 걸 그랬다 → 잘 걸 그랬다"},
1224
+ {"korean": "먹다 (eat) → shouldn't have eaten", "choices": ["먹을 걸 그랬다", "먹지 말 걸 그랬다", "먹을 거예요"], "answer": "먹지 말 걸 그랬다", "hint": "Negative regret → 지 말 걸 그랬다"},
1225
+ ],
1226
+ },
1227
+ ],
1228
  },
1229
  "example_sentences": [
1230
  {
1231
  "positive": {"korean": "수업에 갔어요.", "english": "I went to class."},
1232
  "negative": {"korean": "수업에 갈 걸 그랬어요.", "english": "I should have gone to class."},
1233
  "focus_word": "갈 걸 그랬어요",
1234
+ "rule_shown": "가다 → 가 + ㄹ 걸 그어요",
1235
  },
1236
  {
1237
  "positive": {"korean": "그 음식을 먹었어요.", "english": "I ate that food."},
 
1249
  }
1250
 
1251
 
 
 
 
1252
 
1253
 
1254
  def get_explanation(grammar_rule: str) -> dict:
1255
+ """
1256
+ Return lesson explanation data for a grammar rule.
1257
+
1258
+ Backwards compatible: all original flat fields (title, body, pattern,
1259
+ notes, difficulty, lesson) are preserved.
1260
+
1261
+ New field: slides[] — array of 6 structured slide objects for the
1262
+ multi-slide lesson breakdown per team lead spec.
1263
+
1264
+ Slide types:
1265
+ intro — formula + sub_formula display
1266
+ body — explanation paragraph with optional highlight
1267
+ diagram — labelled formula parts with arrows
1268
+ rules — conjugation rule box (sections with label + rules[])
1269
+ examples — annotated example sentences
1270
+ practice — choose-the-correct-ending MCQ
1271
+ """
1272
+ lc = LESSON_CONTENT.get(grammar_rule, {})
1273
+ rule = GRAMMAR_RULES.get(grammar_rule, {})
1274
+ expl = lc.get("explanation", {})
1275
  return {
1276
+ # ── Original fields (unchanged) ──────────────────────────────────
1277
  "grammar_rule": grammar_rule,
1278
  "title": expl.get("title", rule.get("name", grammar_rule)),
1279
+ "body": expl.get("body", rule.get("description", "")),
1280
  "pattern": expl.get("pattern", ""),
1281
  "notes": expl.get("notes", ""),
1282
  "difficulty": rule.get("difficulty", 1),
1283
  "lesson": rule.get("lesson", ""),
1284
+ # ── New field ────────────────────────────────────────────────────
1285
+ # slides: list of 6 dicts, each with "index" (0-5) and "type".
1286
+ # Unity should step through slides[0] → slides[5] in sequence.
1287
+ # If slides is empty, fall back to displaying title + body + pattern.
1288
+ "slides": expl.get("slides", []),
1289
+ "slide_count": len(expl.get("slides", [])),
1290
  }
1291
 
1292