diff --git a/src/build.py b/src/build.py index e726b13..2db2fed 100644 --- a/src/build.py +++ b/src/build.py @@ -1,5 +1,6 @@ import json import os +import random import shutil from bs4 import BeautifulSoup @@ -9,19 +10,23 @@ from mistletoe import Document from tqdm import tqdm from renderer.fifty_ohm_html_renderer import FiftyOhmHtmlRenderer +from renderer.fifty_ohm_html_slide_renderer import FiftyOhmHtmlSlideRenderer class Build: def __init__(self): memory = Memory("./cache", verbose=0) - self.env = Environment(loader=FileSystemLoader("templates/html")) + self.env = Environment(loader=FileSystemLoader("templates/")) + self.env.filters["shuffle_answers"] = self.__filter_shuffle_answers self.questions = self.__parse_katalog() # Decorate the method with memory.cache - self.__build_question = memory.cache(self.__build_question) - self.__build_chapter = memory.cache(self.__build_chapter) - self.__build_section = memory.cache(self.__build_section) - self.__build_page = memory.cache(self.__build_page) + self.__build_question = memory.cache(self.__build_question) + self.__build_question_slide = memory.cache(self.__build_question_slide) + self.__build_chapter = memory.cache(self.__build_chapter) + self.__build_section = memory.cache(self.__build_section) + self.__build_page = memory.cache(self.__build_page) + self.__build_chapter_slidedeck = memory.cache(self.__build_chapter_slidedeck) def __parse_katalog(self): with open("data/fragenkatalog3b.json") as fragenkatalog_file: @@ -42,10 +47,10 @@ class Build: return questions # cached - def __build_question(self, input): + def __build_question(self, input, template_file="html/question.html"): """Combines the original question dataset from BNetzA with our internal metadata""" - question_template = self.env.get_template("question.html") + question_template = self.env.get_template(template_file) with open("data/metadata.json") as metadata_file: metadata = json.load(metadata_file) @@ -89,9 +94,12 @@ class Build: answer_pictures=answer_pictures, ) + def __build_question_slide(self, input): + return self.__build_question(input, template_file="slide/question.html") + # cached def __build_page(self, content) : - page_template = self.env.get_template("page.html") + page_template = self.env.get_template("html/page.html") return page_template.render(content=content) def __picture_handler(self, id): @@ -108,8 +116,8 @@ class Build: # cached def __build_chapter(self, edition, edition_name, number, chapter, next_chapter=None): - chapter_template = self.env.get_template("chapter.html") - next_chapter_template = self.env.get_template("next_chapter.html") + chapter_template = self.env.get_template("html/chapter.html") + next_chapter_template = self.env.get_template("html/next_chapter.html") with open(f'build/{edition}_chapter_{chapter["ident"]}.html', 'w') as file: result = chapter_template.render( edition=edition, @@ -129,10 +137,10 @@ class Build: file.write(result) # cached - def __build_section(self, edition, edition_name, section, chapter, next_section=None, next_chapter=None): - section_template = self.env.get_template("section.html") - next_section_template = self.env.get_template("next_section.html") - next_chapter_template = self.env.get_template("next_chapter.html") + def __build_section(self, edition, edition_name, section, section_id, chapter, next_section=None, next_chapter=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 open(f'build/{edition}_{section["ident"]}.html', 'w') as file: with FiftyOhmHtmlRenderer( @@ -146,6 +154,7 @@ class Build: edition=edition, name=edition_name, section=section, + section_id=section_id, chapter=chapter, ) @@ -164,8 +173,41 @@ class Build: result = BeautifulSoup(result, "html.parser").prettify() file.write(result) + def __build_chapter_slidedeck(self, edition, chapter, sections): + with open(f'build/{edition}_slide_{chapter["ident"]}.html', 'w') as file: + slide_template = self.env.get_template("slide/slide.html") + help_template = self.env.get_template("slide/help.html") + with FiftyOhmHtmlSlideRenderer( + question_renderer=self.__build_question_slide, + picture_handler=self.__picture_handler, + photo_handler=self.__photo_handler + ) as renderer: + result = "
\n" + result += f'
\n

{chapter["title"]}

\n
\n' + result += help_template.render() + result += "
\n" + for section in sections: + tmp = f'
\n

{section["title"]}

\n
\n' + tmp += renderer.render_wrapper(section["slide"]) + result += f"
{tmp}
\n" + + result = slide_template.render(content=result) + file.write(result) + + def __filter_shuffle_answers(self, seq): + answers = [] + firstrun = True + for answer in seq: + if firstrun: + answers.append({"content": answer, "correct": True}) + firstrun = False + else: + answers.append({"content": answer, "correct": False}) + random.shuffle(answers) + return answers + def __build_book_index(self, book): - template = self.env.get_template("course_index.html") + template = self.env.get_template("html/course_index.html") with open(f"build/{book['edition']}_course_index.html", "w") as file: result = template.render( book=book, @@ -185,10 +227,11 @@ class Build: for number, chapter in enumerate(tqdm(chapters, desc=f"Build Edition: {edition}"),1): 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"]) for i, section in enumerate(chapter["sections"],1) : next_section = chapter["sections"][i] if i < len(chapter["sections"]) else None - self.__build_section(edition, edition_name, section, chapter, next_section, next_chapter) + self.__build_section(edition, edition_name, section, i, chapter, next_section, next_chapter) def build_assets(self): shutil.copytree("assets", "build/assets", dirs_exist_ok=True) \ No newline at end of file diff --git a/templates/slide/help.html b/templates/slide/help.html new file mode 100644 index 0000000..036c33a --- /dev/null +++ b/templates/slide/help.html @@ -0,0 +1,112 @@ +
+

Navigationshilfe

+

Diese Navigationshilfe zeigt die ersten Schritte zur Verwendung der Präsention. Sie kann mit ⟶ (Pfeiltaste + rechts) übersprungen werden.

+
+
+

Navigation

+
+

Zwischen den Folien und Abschnitten kann man mittels der Pfeiltasten hin- und herspringen, dazu kann man auch + die Pfeiltasten am Computer nutzen.

+ Navigationspfeile für die Präsentation +
+ +
+
+

Weitere Funktionen

+

Mit ein paar Tastenkürzeln können weitere Funktionen aufgerufen werden. Die wichtigsten sind:

+
+
F1
+
Help / Hilfe
+
o
+
Overview / Übersicht aller Folien
+
s
+
Speaker View / Referentenansicht
+
f
+
Full Screen / Vollbildmodus
+
b
+
Break, Black, Pause / Ausblenden der Präsentation
+
Alt-Click
+
In die Folie hin- oder herauszoomen
+
+
+
+

Übersicht

+
+

Die Präsentation ist zweidimensional aufgebaut. Dadurch sind in Spalten die einzelnen Abschnitte eines + Kapitels und in den Reihen die Folien zu den Abschnitten.

+

Tippt man ein „o“ ein, bekommt man eine Übersicht über alle Folien des jeweiligen Kapitels. Das hilft + sich zunächst einen Überblick zu verschaffen oder sich zu orientieren, wenn man das Gefühlt hat sich + „verlaufen“ zu haben. Die Navigation erfolgt über die Pfeiltasten.

+
+ +
+
+

Referentenansicht

+
+ Referentenansicht +

Tippt man ein „s“ ein, bekommt man ein neues Fenster, die Referentenansicht.

+

Indem man „Layout“ auswählt, kann man zwischen verschieden Anordnungen der Elemente auswählen.

+
+ +
+
+

Praxistipps zur Referentenansicht

+ +
+
+

Vollbild

+

Tippt man ein „f“ ein, wird die aktuelle Folie im Vollbild angezeigt. Mit „Esc“ kann man diesen wieder + verlassen.

+

Das ist insbesondere für den Bildschirm mit der Präsentation für das Publikum praktisch. +

+
+

Ausblenden

+

Tippt man ein „b“ ein, wird die Präsentation ausgeblendet.

+

Sie kann wie folgte wieder eingeblendet werden:

+ + Schaltfläche für Resume Presentation +
+
+

Zoom

+

Bei gedrückter Alt-Taste und einem Mausklick in der Präsentation wird in diesen Teil hineingezoomt. Das ist + praktisch, um Details von Schaltungen hervorzuheben. Durh einen nochmaligen Mausklick zusammen mit Alt wird + wieder herausgezoomt.

+

Das Zoomen funktioniert nur im ausgewählten Fenster. Die Referentenansicht ist hier nicht mit dem + Präsenationsansicht gesynct.

+
diff --git a/templates/slide/question.html b/templates/slide/question.html index 78e782b..ac15882 100644 --- a/templates/slide/question.html +++ b/templates/slide/question.html @@ -7,7 +7,7 @@ {% endif -%}
{{ number }}: {{ question }}
{% if picture_question -%} -
+
{% endif -%}
{% if answers[0] -%} @@ -17,7 +17,7 @@ {% endif -%} {% if answer_pictures[0] -%} {% for answer in answer_pictures|shuffle_answers -%} -
{{ answer_label[loop.index - 1] }}:
+
{{ answer_label[loop.index - 1] }}:
{% endfor -%} {% endif -%}
diff --git a/templates/slide/slide.html b/templates/slide/slide.html new file mode 100644 index 0000000..c102b17 --- /dev/null +++ b/templates/slide/slide.html @@ -0,0 +1,56 @@ + + + + + + DARC Ausbildungsplattform + + + + + + + + + + + + + + + + +
+ +
+ {{ content }} +
+ + + + + + + + + + + \ No newline at end of file diff --git a/test/test_html_slides.py b/test/test_html_slides.py index 06362b0..18c6f5f 100644 --- a/test/test_html_slides.py +++ b/test/test_html_slides.py @@ -39,13 +39,6 @@ def filter_shuffle_answers(seq): except Exception: return seq - -env = Environment(loader=FileSystemLoader("templates/")) -env.filters["shuffle_answers"] = filter_shuffle_answers -question_template = env.get_template("slide/question.html") -questions = parse_katalog() - - def question_stub(input): """Combines the original question dataset from BNetzA with our internal metadata""" with open("data/metadata.json") as metadata_file: @@ -84,77 +77,17 @@ def question_stub(input): answer_pictures=answer_pictures, ) -def print_head(): - return """ - - - - DARC Ausbildungsplattform - - - - - - - - - - - - - - - - - -
-
-""" - - # - # - # - -def print_tail(): - return """
-
- - - - - - - - - """ +env = Environment(loader=FileSystemLoader("templates/")) +env.filters["shuffle_answers"] = filter_shuffle_answers +question_template = env.get_template("slide/question.html") +slide_template = env.get_template("slide/slide.html") +questions = parse_katalog() def test_html_slides(capsys): with capsys.disabled(): with open("test/acceptanceTestSlides.md") as file: content = file.read() - with FiftyOhmHtmlSlideRenderer(question_stub) as renderer: - output = "" - output = print_head() - output += renderer.render_wrapper(content) - output += print_tail() + with FiftyOhmHtmlSlideRenderer(question_renderer=question_stub) as renderer: + output = renderer.render_wrapper(content) with open("test/acceptanceTestSlides.html", "w") as output_file: output_file.write(output)