From 5a4b2c8f3af34edb22b6a7e64df029b70598971f Mon Sep 17 00:00:00 2001 From: Hartmut Seichter Date: Fri, 3 May 2024 07:42:51 +0200 Subject: [PATCH] repair book mode with refactored rendering --- coursebuilder/__main__.py | 47 ++++++++++++++++++++--- coursebuilder/metagenerator.py | 64 ++++++++++++++++++-------------- test/simple/Makefile | 4 ++ test/simple/book.yaml | 8 +++- test/simple/fields.yaml | 2 +- test/simple/mod.cg.yaml | 2 +- test/simple/mod.interactsys.yaml | 5 ++- test/simple/schema.yaml | 2 +- 8 files changed, 94 insertions(+), 40 deletions(-) diff --git a/coursebuilder/__main__.py b/coursebuilder/__main__.py index caa551c..e8c44da 100644 --- a/coursebuilder/__main__.py +++ b/coursebuilder/__main__.py @@ -61,14 +61,38 @@ class CourseBuilder: generator.set_schema(yaml.load(sf,Loader=yaml.Loader)) with open(args.book) as bf: - generator.process_book(yaml.load(bf,Loader=yaml.Loader),os.path.abspath(args.book),lang=args.lang,pagebreak=args.pagebreak,create_title=args.title,header_level=args.level) + + actual_fields = [] + + book = yaml.load(bf,Loader=yaml.Loader) + book_path = os.path.abspath(args.book) + + for bi in book['book']: + if 'fields' in bi: + actual_fields = bi['fields'] + if 'sections' in bi: + for section in bi['sections']: + if 'text' in section: + print(section['text'][args.lang]) + if 'modules' in section: + for m in section['modules']: + mod_path = os.path.join(os.path.dirname(book_path),m) + + with open(mod_path) as fm: + try: + generator = MetaGenerator() + table_items = generator.process(yaml.load(fm,Loader=yaml.Loader),fields=actual_fields,lang=args.lang,pagebreak=args.pagebreak,createTitle=args.title,header_level=args.level) + + MarkdownGenerator.generate(table_items,pagebreak=args.pagebreak,title=args.title,header_level=args.level) + + except Exception as exc: + print(f'{type(exc).__name__} in {mod_path}: {exc}',file=sys.stderr) # verbose command line mode elif args.schema and args.meta and len(args.fields) > 0: - generator = MetaGenerator() - + # get actual fields actual_fields = [] if os.path.isfile(args.fields[0]): @@ -77,16 +101,27 @@ class CourseBuilder: else: actual_fields = args.fields - + + # get schema + actual_schema = None with open(args.schema) as f: - generator.set_schema(yaml.load(f,Loader=yaml.Loader)) + actual_schema = yaml.load(f,Loader=yaml.Loader) + # iterate through meta files for m in args.meta: with open(m) as fm: + + generator = MetaGenerator() + generator.set_schema(actual_schema) table_items = generator.process(yaml.load(fm,Loader=yaml.Loader),fields=actual_fields,lang=args.lang,pagebreak=args.pagebreak,createTitle=args.title,header_level=args.level,template=args.template) - print(table_items) + if args.template: + TemplateGenerator.generate(table_items) + else: + MarkdownGenerator.generate(table_items,pagebreak=args.pagebreak,title=args.title,header_level=args.level) + + # print(table_items) else: parser.print_help() diff --git a/coursebuilder/metagenerator.py b/coursebuilder/metagenerator.py index b0d73fb..d16c25c 100644 --- a/coursebuilder/metagenerator.py +++ b/coursebuilder/metagenerator.py @@ -1,4 +1,5 @@ -import string +import os,string,sys +import yaml class MetaGenerator: @@ -91,19 +92,22 @@ class MetaGenerator: return [k,', '.join(parts)] - def process(self,meta,fields = [],lang = 'de',pagebreak = False,createTitle=False,header_level=1,template=None) -> []: + def process(self,meta,fields = [],lang = 'de',pagebreak = False,createTitle=False,header_level=1,template=None): table_items = [] # iterate over requested fields for field in fields: - # correlate with schema and append - match self.__schema[field]['type']: - case 'str': table_items.append(self.process_str(meta,field,lang)) - case 'enum': table_items.append(self.process_enum(meta,field,lang)) - case 'int' | 'num' : table_items.append(self.process_num(meta,field,lang)) - case 'multinum' : table_items.append(self.process_multinum(meta,field,lang)) - case 'multikey': table_items.append(self.process_multikey(meta,field,lang)) + try: + # correlate with schema and append + match self.__schema[field]['type']: + case 'str': table_items.append(self.process_str(meta,field,lang)) + case 'enum': table_items.append(self.process_enum(meta,field,lang)) + case 'int' | 'num' : table_items.append(self.process_num(meta,field,lang)) + case 'multinum' : table_items.append(self.process_multinum(meta,field,lang)) + case 'multikey': table_items.append(self.process_multikey(meta,field,lang)) + except Exception as exp: + print(field,exp,exp.args) # maybe return tableitems as np.Dataframe? return table_items @@ -118,29 +122,33 @@ class MetaGenerator: # # conventional MD mode # MarkdownGenerator.generate(table_items,pagebreak,createTitle,header_level=header_level) - def process_book_section(self,section,lang='de'): - pass + # def process_book_section(self,section,lang='de'): + # pass - def process_book(self,book,bookpath,create_title,pagebreak,lang='de',header_level=2): + # book mode + # def process_book(self,book,bookpath,create_title,pagebreak,lang='de',header_level=2): - actual_fields = [] + # actual_fields = [] - for bi in book['book']: - if 'fields' in bi: - actual_fields = bi['fields'] - if 'sections' in bi: - for section in bi['sections']: - if 'text' in section: - print(section['text'][lang]) - if 'modules' in section: - for m in section['modules']: - mod_path = os.path.join(os.path.dirname(bookpath),m) + # for bi in book['book']: + # if 'fields' in bi: + # actual_fields = bi['fields'] + # if 'sections' in bi: + # for section in bi['sections']: + # if 'text' in section: + # print(section['text'][lang]) + # if 'modules' in section: + # for m in section['modules']: + # mod_path = os.path.join(os.path.dirname(bookpath),m) - with open(mod_path) as fm: - try: - self.process(yaml.load(fm,Loader=yaml.Loader),fields=actual_fields,lang=lang,pagebreak=pagebreak,createTitle=create_title,header_level=header_level) - except: - print(f'Error in {mod_path}',file=sys.stderr) + # with open(mod_path) as fm: + # try: + # table_items = self.process(yaml.load(fm,Loader=yaml.Loader),fields=actual_fields,lang=lang,pagebreak=pagebreak,createTitle=create_title,header_level=header_level) + + # print(table_items) + + # except Exception as exc: + # print(f'{type(exc).__name__} in {mod_path}: {exc}',file=sys.stderr) diff --git a/test/simple/Makefile b/test/simple/Makefile index c282752..3047ab0 100644 --- a/test/simple/Makefile +++ b/test/simple/Makefile @@ -19,6 +19,10 @@ debug-template: debug-markdown: python ${coursebuilder} -s schema.yaml -m mod.cg.yaml mod.interactsys.yaml -l de -f name credits + +debug-book: + python ${coursebuilder} -s schema.yaml -b book.yaml -l de + debug: python ${coursebuilder} -s schema.yaml -m mod.cg.yaml -l de -f fields.yaml diff --git a/test/simple/book.yaml b/test/simple/book.yaml index f8544df..5ec66d5 100644 --- a/test/simple/book.yaml +++ b/test/simple/book.yaml @@ -11,7 +11,7 @@ book: - content - form-of-instruction - prerequisites - - media-of-instruction + - teaching-material - author-of-indenture - used-in - workload @@ -28,6 +28,10 @@ book: en: "## compulsory courses {.unnumbered}" - modules: - mod.cg.yaml - + - text: + de: "## Wahlbereich {.unnumbered}" + en: "## elective courses {.unnumbered}" + - modules: + - mod.interactsys.yaml diff --git a/test/simple/fields.yaml b/test/simple/fields.yaml index 92a0a08..bede013 100644 --- a/test/simple/fields.yaml +++ b/test/simple/fields.yaml @@ -5,7 +5,7 @@ fields: - content - form-of-instruction - prerequisites - - media-of-instruction + - teaching-material - author-of-indenture - used-in - workload diff --git a/test/simple/mod.cg.yaml b/test/simple/mod.cg.yaml index 55d76c4..e5b4201 100644 --- a/test/simple/mod.cg.yaml +++ b/test/simple/mod.cg.yaml @@ -74,7 +74,7 @@ content: * Overview visualizations * Graphical User Interfaces -media-of-instruction: +teaching-material: de: | * H5P Lernmodule * Lernforum diff --git a/test/simple/mod.interactsys.yaml b/test/simple/mod.interactsys.yaml index d8efd55..c20086e 100644 --- a/test/simple/mod.interactsys.yaml +++ b/test/simple/mod.interactsys.yaml @@ -61,7 +61,7 @@ content: * evaluation methods of interactive systems * statistical methods for UX design -media-of-instruction: +teaching-material: de: | H5P Lernmodule, Lernforum und Übungen am PC @@ -101,6 +101,9 @@ workload: form-of-exam: value: alternative + spec: + de: + en: frequency: value: once_per_year diff --git a/test/simple/schema.yaml b/test/simple/schema.yaml index 9a46893..8d54fab 100644 --- a/test/simple/schema.yaml +++ b/test/simple/schema.yaml @@ -142,7 +142,7 @@ prerequisites: # # Wie können die Studierenden sich auf die Teilnahme an diesem Modul vorbereiten? # -media-of-instruction: +teaching-material: type: str label: { de: "Literatur und multimediale Lehr- und Lernprogramme",