| 189 | |
| 190 | |
| 191 | def write_lessons(course_slug: str, title: str, lessons: List[Lesson]): |
| 192 | course_dir = OUT_BASE / course_slug |
| 193 | course_dir.mkdir(parents=True, exist_ok=True) |
| 194 | |
| 195 | # clear existing generated lessons |
| 196 | for old in course_dir.glob("*.md"): |
| 197 | old.unlink() |
| 198 | |
| 199 | for lesson in lessons: |
| 200 | fname = f"{lesson.global_order:03d}-{slugify(lesson.title)}.md" |
| 201 | path = course_dir / fname |
| 202 | module_key = f"{lesson.module_order:02d}-{slugify(lesson.module_title)}" |
| 203 | |
| 204 | body = [ |
| 205 | "---", |
| 206 | f'title: "{lesson.title}"', |
| 207 | 'layout: "course-lesson"', |
| 208 | f'course_id: "{course_slug}"', |
| 209 | f'course_title: "{title}"', |
| 210 | f'module_title: "{lesson.module_title}"', |
| 211 | f'module_key: "{module_key}"', |
| 212 | f"module_order: {lesson.module_order}", |
| 213 | f"lesson_order: {lesson.lesson_order_in_module}", |
| 214 | f"weight: {lesson.global_order}", |
| 215 | "is_course_lesson: true", |
| 216 | f'description: "{lesson.summary().replace("\"", "\\\"")}"', |
| 217 | "---", |
| 218 | "", |
| 219 | f"> Module {lesson.module_order}: {lesson.module_title}", |
| 220 | "", |
| 221 | ] |
| 222 | body.extend(lesson.body_lines) |
| 223 | path.write_text("\n".join(body).rstrip() + "\n", encoding="utf-8") |
| 224 | |
| 225 | |
| 226 | def process(source: Path): |