diff --git a/assets/exam-simulator.js b/assets/exam-simulator.js index 2efb9aa..977c06a 100644 --- a/assets/exam-simulator.js +++ b/assets/exam-simulator.js @@ -38,7 +38,7 @@ if (!value) return []; var seen = new Set(); return value.toUpperCase().split(/[\s+,]+/).filter(function (questionId) { - if (!/^[A-Z]{2}\d{3}$/.test(questionId) || seen.has(questionId)) return false; + if (!/^[A-Z]{2,3}\d{3}$/.test(questionId) || seen.has(questionId)) return false; seen.add(questionId); return true; }); diff --git a/assets/homework.js b/assets/homework.js index b500b8b..c0279f2 100644 --- a/assets/homework.js +++ b/assets/homework.js @@ -2,6 +2,7 @@ "use strict"; var COURSE_CHOICES = [ + { edition: "SWL", label: "SWL-Kurs", detail: "Kurzwellenhören", color: "#FFFFFF" }, { edition: "N", label: "N-Kurs", detail: "N", color: "#47ABE8" }, { edition: "NE", label: "E-Kurs", detail: "N + E", color: "#FE756C" }, { edition: "NEA", label: "A-Kurs", detail: "N + E + A", color: "#3BB583" }, diff --git a/assets/question-catalog.js b/assets/question-catalog.js index 4b682f5..357803f 100644 --- a/assets/question-catalog.js +++ b/assets/question-catalog.js @@ -12,9 +12,9 @@ function walk(section, sectionIndex, category) { (section.questions || []).forEach(function (question) { - var part = sectionIndex === 0 - ? partForClass[String(question.class)] - : partForSection[sectionIndex]; + var part = String(question.class) === "SWL" + ? "SWL" + : (sectionIndex === 0 ? partForClass[String(question.class)] : partForSection[sectionIndex]); if (!part) return; var questionMetadata = metadata[question.number] || {}; diff --git a/build.py b/build.py index a8f4c68..d23027e 100644 --- a/build.py +++ b/build.py @@ -6,6 +6,7 @@ conf = config.Config() # Build Everything: bd = build.Build(conf) bd.build_website() +bd.build_edition("SWL") bd.build_edition("N") bd.build_edition("E") bd.build_edition("A") diff --git a/main.py b/main.py index 51bf833..78cd7c9 100644 --- a/main.py +++ b/main.py @@ -12,6 +12,7 @@ app = typer.Typer() @app.command() def main( edition: Annotated[list[Edition], typer.Option(help="Edition to build, can be specified multiple times.")] = [ # noqa: B006 -- default value is required for typer + Edition.swl, Edition.n, Edition.e, Edition.a, diff --git a/src/build.py b/src/build.py index 19b974b..c9d9521 100644 --- a/src/build.py +++ b/src/build.py @@ -215,8 +215,11 @@ class Build: def __build_homework_tool(self): toc_target = self.config.p_build_assets / "toc" toc_target.mkdir(parents=True, exist_ok=True) - for edition in ("N", "NE", "NEA", "E", "EA", "A"): - shutil.copyfile(self.config.p_data_toc / f"{edition}.json", toc_target / f"{edition}.json") + for edition in ("SWL", "N", "NE", "NEA", "E", "EA", "A"): + source = self.config.p_data_toc / f"{edition}.json" + if not source.exists(): + source = self.config.p_data_toc / f"{edition.lower()}.json" + shutil.copyfile(source, toc_target / f"{edition}.json") homework_template = self.env.get_template("html/homework.html") page = self.__build_page( @@ -439,9 +442,12 @@ class Build: self.config.p_build.mkdir(exist_ok=True) edition = edition.upper() + toc_file = self.config.p_data_toc / f"{edition}.json" + if not toc_file.exists(): + toc_file = self.config.p_data_toc / f"{edition.lower()}.json" with ( - (self.config.p_data_toc / f"{edition}.json").open(encoding="utf-8") as file, + toc_file.open(encoding="utf-8") as file, Progress( TaskProgressColumn(), BarColumn(), @@ -480,9 +486,11 @@ class Build: with (self.config.p_data_sections / f"{ident}.md").open(encoding="utf-8") as sfile: section_content = sfile.read() section["content"] = section_content - with (self.config.p_data_slides / f"{ident}.md").open(encoding="utf-8") as sfile: - section_content = sfile.read() - section["slide"] = section_content + slide_file = self.config.p_data_slides / f"{ident}.md" + if slide_file.exists(): + with slide_file.open(encoding="utf-8") as sfile: + section_content = sfile.read() + section["slide"] = section_content if section["content"] is not None: self.__collect_question_occurrences( diff --git a/src/edition.py b/src/edition.py index 2a250c5..fa079f2 100644 --- a/src/edition.py +++ b/src/edition.py @@ -2,6 +2,7 @@ from enum import StrEnum class Edition(StrEnum): + swl = "SWL" n = "N" e = "E" a = "A" diff --git a/test/test_swl_question_catalog.py b/test/test_swl_question_catalog.py index ef1cea6..828e0e7 100644 --- a/test/test_swl_question_catalog.py +++ b/test/test_swl_question_catalog.py @@ -71,3 +71,34 @@ def test_missing_optional_swl_catalog_is_allowed(tmp_path): assert set(build.questions) == {"NA101"} assert len(build.fragenkatalog["sections"]) == 1 + + +def test_lowercase_swl_toc_is_supported(tmp_path): + prepare_content(tmp_path, include_swl=True) + toc_path = tmp_path / "toc" + section_path = tmp_path / "contents" / "sections" + toc_path.mkdir() + section_path.mkdir() + (section_path / "swl_intro.md").write_text("Einführung", encoding="utf-8") + (toc_path / "swl.json").write_text( + json.dumps( + { + "title": "SWL-Kurs", + "edition": "SWL", + "chapters": [ + { + "title": "Einstieg", + "ident": "swl_einstieg", + "sections": [{"title": "Einführung", "ident": "swl_intro"}], + } + ], + } + ), + encoding="utf-8", + ) + + build = Build(Config(content_path=tmp_path, build_path=tmp_path / "build")) + + build.build_edition("SWL") + assert (tmp_path / "build" / "SWL_course_index.html").exists() + assert (tmp_path / "build" / "SWL_swl_intro.html").exists()