feature: extract question index
This commit is contained in:
@@ -14,3 +14,4 @@ bd.build_edition("EA")
|
|||||||
bd.build_edition("NEA")
|
bd.build_edition("NEA")
|
||||||
bd.build_assets()
|
bd.build_assets()
|
||||||
bd.build_solutions()
|
bd.build_solutions()
|
||||||
|
bd.build_question_index()
|
||||||
|
|||||||
@@ -41,6 +41,7 @@ def main(
|
|||||||
|
|
||||||
# Copy assets to build folder
|
# Copy assets to build folder
|
||||||
bd.build_assets()
|
bd.build_assets()
|
||||||
|
bd.build_question_index()
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import json
|
|||||||
import random
|
import random
|
||||||
import re
|
import re
|
||||||
import shutil
|
import shutil
|
||||||
|
from collections import defaultdict
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
from jinja2 import Environment, FileSystemLoader
|
from jinja2 import Environment, FileSystemLoader
|
||||||
@@ -23,6 +24,9 @@ class Build:
|
|||||||
self.env.filters["shuffle_answers"] = self.__filter_shuffle_answers
|
self.env.filters["shuffle_answers"] = self.__filter_shuffle_answers
|
||||||
self.questions = self.__parse_katalog()
|
self.questions = self.__parse_katalog()
|
||||||
|
|
||||||
|
self.question_index = defaultdict(set)
|
||||||
|
self.question_token_pattern = re.compile(r"^\s*\[question:([\w\d]+)\]", re.MULTILINE)
|
||||||
|
|
||||||
def __parse_katalog(self):
|
def __parse_katalog(self):
|
||||||
with self.config.p_data_fragenkatalog.open() as file:
|
with self.config.p_data_fragenkatalog.open() as file:
|
||||||
fragenkatalog = json.load(file)
|
fragenkatalog = json.load(file)
|
||||||
@@ -389,6 +393,9 @@ class Build:
|
|||||||
section_content = sfile.read()
|
section_content = sfile.read()
|
||||||
section["slide"] = section_content
|
section["slide"] = section_content
|
||||||
|
|
||||||
|
if section["content"] is not None:
|
||||||
|
self.__collect_question_links(edition, ident, section["content"])
|
||||||
|
|
||||||
next_section = (
|
next_section = (
|
||||||
chapter["sections"][section_number] if section_number < len(chapter["sections"]) else None
|
chapter["sections"][section_number] if section_number < len(chapter["sections"]) else None
|
||||||
)
|
)
|
||||||
@@ -515,3 +522,20 @@ class Build:
|
|||||||
page = solution_template.render(question=question, solution=solution, number=solution_file.stem)
|
page = solution_template.render(question=question, solution=solution, number=solution_file.stem)
|
||||||
page = self.__build_page(page, course_wrapper=False)
|
page = self.__build_page(page, course_wrapper=False)
|
||||||
file.write(page)
|
file.write(page)
|
||||||
|
|
||||||
|
def __collect_question_links(self, edition: str, section_ident: str, section_content: str):
|
||||||
|
section_filename = f"{edition}_{section_ident}.html"
|
||||||
|
|
||||||
|
for question_number in self.question_token_pattern.findall(section_content or ""):
|
||||||
|
self.question_index[question_number].add(f"{section_filename}#{question_number}")
|
||||||
|
|
||||||
|
def __serialize_question_index(self) -> dict[str, list[str]]:
|
||||||
|
serialized: dict[str, list[str]] = {}
|
||||||
|
for question, links in sorted(self.question_index.items()):
|
||||||
|
serialized[question] = sorted(links)
|
||||||
|
return serialized
|
||||||
|
|
||||||
|
def build_question_index(self):
|
||||||
|
with (self.config.p_build / "question_index.json").open("w", encoding="utf-8") as file:
|
||||||
|
json.dump(self.__serialize_question_index(), file, ensure_ascii=False, indent=2, sort_keys=True)
|
||||||
|
file.write("\n")
|
||||||
|
|||||||
Reference in New Issue
Block a user