Merge branch 'main' into feat/cli
This commit is contained in:
+105
-18
@@ -54,7 +54,7 @@ class Build:
|
||||
|
||||
question_template = self.env.get_template(template_file)
|
||||
|
||||
with (self.config.p_data / "metadata.json").open() as file:
|
||||
with (self.config.p_data / "metadata3b.json").open() as file:
|
||||
metadata = json.load(file)
|
||||
|
||||
question = None
|
||||
@@ -81,10 +81,10 @@ class Build:
|
||||
answers = []
|
||||
|
||||
if metadata["picture_a"] != "":
|
||||
self.__picture_handler(metadata["picture_a"])
|
||||
self.__picture_handler(metadata["picture_b"])
|
||||
self.__picture_handler(metadata["picture_c"])
|
||||
self.__picture_handler(metadata["picture_d"])
|
||||
alt_text_a = self.__picture_handler(metadata["picture_a"])
|
||||
alt_text_b = self.__picture_handler(metadata["picture_b"])
|
||||
alt_text_c = self.__picture_handler(metadata["picture_c"])
|
||||
alt_text_d = self.__picture_handler(metadata["picture_d"])
|
||||
|
||||
answer_pictures = [
|
||||
metadata["picture_a"],
|
||||
@@ -92,14 +92,24 @@ class Build:
|
||||
metadata["picture_c"],
|
||||
metadata["picture_d"],
|
||||
]
|
||||
|
||||
alt_text_answers = [
|
||||
alt_text_a,
|
||||
alt_text_b,
|
||||
alt_text_c,
|
||||
alt_text_d,
|
||||
]
|
||||
|
||||
else:
|
||||
answer_pictures = []
|
||||
alt_text_answers = []
|
||||
|
||||
if "picture_question" in question and metadata["picture_question"] != "":
|
||||
picture_question = metadata["picture_question"]
|
||||
self.__picture_handler(picture_question)
|
||||
alt_text_question = self.__picture_handler(picture_question)
|
||||
else:
|
||||
picture_question = ""
|
||||
alt_text_question = ""
|
||||
|
||||
return question_template.render(
|
||||
question=question["question"],
|
||||
@@ -108,6 +118,8 @@ class Build:
|
||||
picture_question=picture_question,
|
||||
answers=answers,
|
||||
answer_pictures=answer_pictures,
|
||||
alt_text_answers=alt_text_answers,
|
||||
alt_text_question=alt_text_question,
|
||||
)
|
||||
|
||||
def __build_question_slide(self, input):
|
||||
@@ -123,6 +135,10 @@ class Build:
|
||||
file = f"{id}.svg"
|
||||
try:
|
||||
shutil.copyfile(self.config.p_data_pictures / file, self.config.p_build_pictures / file)
|
||||
if (self.config.p_data_pictures / f"{id}.txt").exists():
|
||||
return (self.config.p_data_pictures / f"{id}.txt").read_text()
|
||||
else:
|
||||
return "Bildbeschreibung noch nicht verfügbar"
|
||||
except FileNotFoundError:
|
||||
tqdm.write(f"\033[31mPicture #{id} not found\033[0m")
|
||||
|
||||
@@ -131,6 +147,10 @@ class Build:
|
||||
file = f"{id}.jpg"
|
||||
try:
|
||||
shutil.copyfile(self.config.p_data_photos / file, self.config.p_build_photos / file)
|
||||
if (self.config.p_data_photos / f"{id}.txt").exists():
|
||||
return (self.config.p_data_photos / f"{id}.txt").read_text()
|
||||
else:
|
||||
return "Bildbeschreibung noch nicht verfügbar"
|
||||
except FileNotFoundError:
|
||||
tqdm.write(f"\033[31mPhoto #{id} not found\033[0m")
|
||||
|
||||
@@ -162,19 +182,43 @@ class Build:
|
||||
|
||||
# cached
|
||||
def __build_section(
|
||||
self, edition, edition_name, section, section_id, chapter, next_section=None, next_chapter=None
|
||||
self,
|
||||
edition,
|
||||
edition_name,
|
||||
section,
|
||||
section_id,
|
||||
chapter,
|
||||
next_section=None,
|
||||
next_chapter=None,
|
||||
chapter_number=None,
|
||||
):
|
||||
section_template = self.env.get_template("html/section.html")
|
||||
next_section_template = self.env.get_template("html/next_section.html")
|
||||
next_chapter_template = self.env.get_template("html/next_chapter.html")
|
||||
with (self.config.p_build / f"{edition}_{section['ident']}.html").open("w") as file:
|
||||
# Use provided chapter_number or fall back to chapter dict
|
||||
chapter_num = str(chapter_number) if chapter_number is not None else chapter.get("number", "0")
|
||||
section_num = str(section_id)
|
||||
|
||||
# Set the section URL for references
|
||||
section_filename = f"{edition}_{section['ident']}.html"
|
||||
|
||||
with FiftyOhmHtmlRenderer(
|
||||
question_renderer=self.__build_question,
|
||||
picture_handler=self.__picture_handler,
|
||||
photo_handler=self.__photo_handler,
|
||||
include_handler=self.__include_handler,
|
||||
edition=edition,
|
||||
chapter=chapter_num,
|
||||
section=section_num,
|
||||
section_url=section_filename,
|
||||
) as renderer:
|
||||
section["content"] = renderer.render(Document(section["content"]))
|
||||
# First pass: collect all figures and assign hierarchical numbers
|
||||
doc = Document(section["content"])
|
||||
renderer.collect_figures(doc)
|
||||
|
||||
# Second pass: render with hierarchical numbers
|
||||
section["content"] = renderer.render(doc)
|
||||
|
||||
result = section_template.render(
|
||||
edition=edition,
|
||||
@@ -198,30 +242,58 @@ class Build:
|
||||
result = self.__build_page(result, course_wrapper=True)
|
||||
file.write(result)
|
||||
|
||||
def __build_chapter_slidedeck(self, edition, chapter, sections, next_chapter):
|
||||
def __build_chapter_slidedeck(self, edition, chapter, sections, next_chapter, chapter_number=None):
|
||||
with (self.config.p_build / f"{edition}_slide_{chapter['ident']}.html").open("w") as file:
|
||||
slide_template = self.env.get_template("slide/slide.html")
|
||||
help_template = self.env.get_template("slide/help.html")
|
||||
next_template = self.env.get_template("slide/next.html")
|
||||
|
||||
# Use provided chapter_number or fall back to chapter dict
|
||||
chapter_num = str(chapter_number) if chapter_number is not None else chapter.get("number", "0")
|
||||
|
||||
# Set the slide URL for references (all sections in one file)
|
||||
# Note: filename uses original edition (e.g., "N"), not modified edition with "S" (e.g., "NS")
|
||||
slide_filename = f"{edition}_slide_{chapter['ident']}.html"
|
||||
|
||||
with FiftyOhmHtmlSlideRenderer(
|
||||
question_renderer=self.__build_question_slide,
|
||||
picture_handler=self.__picture_handler,
|
||||
photo_handler=self.__photo_handler,
|
||||
include_handler=self.__include_handler,
|
||||
edition=edition,
|
||||
chapter=chapter_num,
|
||||
section="0", # Will be updated per section
|
||||
section_url=slide_filename,
|
||||
) as renderer:
|
||||
result = "<section>\n"
|
||||
result += f'<section data-background="#DAEEFA">\n<h1>{chapter["title"]}</h1>\n</section>\n'
|
||||
result += help_template.render()
|
||||
result += "</section>\n"
|
||||
|
||||
section_counter = 0
|
||||
for section in sections:
|
||||
if section["slide"] is None:
|
||||
continue
|
||||
|
||||
section_counter += 1
|
||||
# Update section number for this section
|
||||
renderer.section = str(section_counter)
|
||||
# Reset figure counter for each section
|
||||
renderer.figure_counter = 0
|
||||
renderer.figure_map = {}
|
||||
|
||||
if not section["slide"].startswith("---"):
|
||||
section["slide"] = "---\n" + section["slide"]
|
||||
|
||||
# First pass: collect figures
|
||||
doc = Document(section["slide"])
|
||||
renderer.collect_figures(doc)
|
||||
|
||||
# Second pass: render with hierarchical numbers
|
||||
tmp = f'<section data-background="#DAEEFA">\n<h1>{section["title"]}</h1>\n</section>\n'
|
||||
tmp += renderer.render(Document(section["slide"]))
|
||||
tmp += renderer.render(doc)
|
||||
result += f"<section>{tmp}</section>\n"
|
||||
|
||||
result += next_template.render(
|
||||
edition=edition,
|
||||
next_chapter=next_chapter,
|
||||
@@ -281,23 +353,38 @@ class Build:
|
||||
transient=True,
|
||||
) as progress:
|
||||
chapter_task = progress.add_task(f"Building edition {edition} ...")
|
||||
for number, chapter in enumerate(progress.track(chapters, task_id=chapter_task), 1):
|
||||
for chapter_number, chapter in enumerate(progress.track(chapters, task_id=chapter_task), 1):
|
||||
progress.update(chapter_task, description=f"Buildign edition {edition}: Chapter {chapter['title']}")
|
||||
next_chapter = chapters[number] if number < len(chapters) else None
|
||||
self.__build_chapter(edition, edition_name, number, chapter, next_chapter)
|
||||
self.__build_chapter_slidedeck(edition, chapter, chapter["sections"], next_chapter)
|
||||
next_chapter = chapters[chapter_number] if chapter_number < len(chapters) else None
|
||||
self.__build_chapter(edition, edition_name, chapter_number, chapter, next_chapter)
|
||||
self.__build_chapter_slidedeck(edition, chapter, chapter["sections"], next_chapter, chapter_number)
|
||||
|
||||
section_task = progress.add_task(description="Rendering sections ...")
|
||||
for i, section in enumerate(progress.track(chapter["sections"], task_id=section_task), 1):
|
||||
for section_number, section in enumerate(
|
||||
progress.track(chapter["sections"], task_id=section_task), 1
|
||||
):
|
||||
progress.update(section_task, description=f"Rendering section {section['title']}")
|
||||
next_section = chapter["sections"][i] if i < len(chapter["sections"]) else None
|
||||
self.__build_section(edition, edition_name, section, i, chapter, next_section, next_chapter)
|
||||
next_section = (
|
||||
chapter["sections"][section_number] if section_number < len(chapter["sections"]) else None
|
||||
)
|
||||
self.__build_section(
|
||||
edition,
|
||||
edition_name,
|
||||
section,
|
||||
section_number,
|
||||
chapter,
|
||||
next_section,
|
||||
next_chapter,
|
||||
chapter_number,
|
||||
)
|
||||
progress.remove_task(section_task)
|
||||
progress.remove_task(chapter_task)
|
||||
|
||||
def build_assets(self):
|
||||
self.config.p_build.mkdir(exist_ok=True)
|
||||
shutil.copytree(self.config.p_assets, self.config.p_build_assets, dirs_exist_ok=True)
|
||||
shutil.copytree(
|
||||
self.config.p_assets, self.config.p_build_assets, dirs_exist_ok=True, ignore=shutil.ignore_patterns(".git")
|
||||
)
|
||||
|
||||
def __parse_snippets(self):
|
||||
with (self.config.p_data / "snippets.json").open() as file:
|
||||
|
||||
Reference in New Issue
Block a user