diff --git a/coursebuilder/__main__.py b/coursebuilder/__main__.py index 3332950..5d14d3a 100644 --- a/coursebuilder/__main__.py +++ b/coursebuilder/__main__.py @@ -17,30 +17,12 @@ import textwrap import string - -class CourseBuilder: - +class MarkdownGenerator: def __init__(self) -> None: - self.__schema = None + pass - def set_schema(self,schema = None): - self.__schema = schema - - def get_template(self,field,lang='de'): - if hasattr(self.__schema[field],'template'): - return self.__schema[field]['template'][lang] - else: - return "$value" - - - def is_translatable(self,field): - if hasattr(self.__schema[field],'translatable'): - return self.__schema[field]['translatable'] - else: - return True - - def generate_markdown(self,ti,pagebreak = False) -> str: + def generate_markdown(self,ti,pagebreak = False,title = None) -> str: line_length = 128 column_ratio= 0.28 @@ -48,8 +30,8 @@ class CourseBuilder: h_len = int(line_length * column_ratio) d_len = line_length-h_len - # if title: - # print('#',desc[lang]['name'],'\n') + if title: + print('#',title,'\n') print(''.join(['+',"".ljust(h_len,'-'),'+',"".ljust(d_len,'-'),'+'])) @@ -78,14 +60,38 @@ class CourseBuilder: # to control pagebreaks for pandoc if pagebreak: print('\n\\newpage') + +class CourseBuilder: + + def __init__(self) -> None: + self.__schema = None + + + def set_schema(self,schema = None): + self.__schema = schema + + def get_template(self,field,lang='de'): + if 'template' in self.__schema[field]: + return self.__schema[field]['template'][lang] + else: + return "$value" + + def is_translatable(self,field): + if 'translatable' in self.__schema[field]: + return self.__schema[field]['translatable'] + else: + return True + def process_label(self,field,lang='de'): # processes the label of a field item return self.__schema[field]['label'][lang] def process_str(self,meta,field,lang='de'): - # - return [self.process_label(field,lang),meta[field][lang]] + if self.is_translatable(field): + return [self.process_label(field,lang),meta[field][lang]] + else: + return [self.process_label(field,lang),meta[field]['value']] def process_enum(self,meta,field,lang='de'): v = meta[field]['value'] @@ -95,8 +101,24 @@ class CourseBuilder: v = meta[field]['value'] t = string.Template(self.get_template(field,lang)) return [self.process_label(field,lang),t.substitute({'value' : v})] + + def process_multikey(self,meta,field,lang='de'): + vs = meta[field]['value'] + t = string.Template(self.get_template(field,lang)) - def process(self,meta,fields = [],lang = 'de'): + k = self.process_label(field,lang) + v = "" + + parts = [] + + for e in vs: + kk = self.__schema[field]['keys'][e][lang] + parts.append(t.substitute({'key': kk, 'value' : vs[e]})) + + return [k,', '.join(parts)] + + + def process(self,meta,fields = [],lang = 'de',pagebreak = False): table_items = [] @@ -105,31 +127,29 @@ class CourseBuilder: case 'str': table_items.append(self.process_str(meta,field,lang)) case 'enum': table_items.append(self.process_enum(meta,field,lang)) case 'int': table_items.append(self.process_int(meta,field,lang)) - - self.generate_markdown(table_items) + case 'multikey': table_items.append(self.process_multikey(meta,field,lang)) + + mdg = MarkdownGenerator() + mdg.generate_markdown(table_items,pagebreak) def main(): - # get command line parameters - parser = ArgumentParser() - # arguments parser = ArgumentParser(description='versatile curricula generator') parser.add_argument('-m','--meta',action="extend", nargs="+", type=str,help="course description(s) as YAML file(s)") parser.add_argument('-l','--lang',help="Language to parse from meta file (use de or en)",default='de') parser.add_argument('-f','--fields',help="Fields to be used, the table will be build accordingly",action="extend", nargs="+", type=str) - parser.add_argument('-s','--schema',help="using provided schema") - + parser.add_argument('-p','--pagebreak',action="store_true",help="add a pagebreak after each module") # get arguments args = parser.parse_args() # only run debug - if args.schema: + if args.schema and args.meta: cb = CourseBuilder() @@ -138,7 +158,7 @@ def main(): for m in args.meta: with open(m) as fm: - cb.process(yaml.load(fm,Loader=yaml.Loader),fields=args.fields,lang=args.lang) + cb.process(yaml.load(fm,Loader=yaml.Loader),fields=args.fields,lang=args.lang,pagebreak=args.pagebreak) else: parser.print_help() diff --git a/test/simple/.temp.md b/test/simple/.temp.md new file mode 100644 index 0000000..0c7e7f4 --- /dev/null +++ b/test/simple/.temp.md @@ -0,0 +1,5 @@ ++-----------------------------------+---------------------------------------------------------------------------------------------+ +|Modulname |Computer Graphics | ++===================================+=============================================================================================+ +|Kürzel |CG | ++-----------------------------------+---------------------------------------------------------------------------------------------+ diff --git a/test/simple/Makefile b/test/simple/Makefile new file mode 100644 index 0000000..465b9cd --- /dev/null +++ b/test/simple/Makefile @@ -0,0 +1,8 @@ +table.pdf: + @echo "creating english version ..." + python ../../coursebuilder -s schema.yaml -m mod.cg.yaml -l en -f name id | pandoc -o table.pdf + +all: table.pdf + +clean: + rm table.pdf \ No newline at end of file diff --git a/test/simple/mod.cg.yaml b/test/simple/mod.cg.yaml index 16fd81e..5a3e670 100644 --- a/test/simple/mod.cg.yaml +++ b/test/simple/mod.cg.yaml @@ -1,7 +1,5 @@ -name: { - de: "Computergrafik", - en: "Computer Graphics" -} +name: + value: Computer Graphics id: value: CG @@ -12,8 +10,14 @@ credits: form-of-exam: value: written -form: - value: lecture +form-of-instruction: + value: { 'lecture': 2, 'exersise': 1 } + +term: + value: 1 + +duration: + value: 1 kind: value: compulsory @@ -88,3 +92,33 @@ media-of-instruction: * Goldstein, E. Bruce. Sensation and Perception. 3rd ed. Belmont, Calif.: Wadsworth Pub. Co., 1989 * Hughes, John F. Computer Graphics: Principles and Practice. Third edition. Upper Saddle River, New Jersey: Addison-Wesley, 2014 * Shirley, Peter, and R. Keith Morley. Realistic Ray Tracing. 2. ed. Natick, Mass: A K Peters, 2003 + +prerequisites: + de: "" + en: "" + +author-of-indenture: + de: "" + en: "" + +used-in: + de: "Master Applied Computerscience" + en: "Master Applied Computerscience" + +workload: + de: "2SWS Vorlesung 1SWS Übung" + en: "2SWS lecture 1SWS exersise" + +form-of-exam: + value: written + +frequency: + value: once_per_year + + +kind: + value: compulsory + +remarks: + de: + en: diff --git a/test/simple/schema.yaml b/test/simple/schema.yaml index cc44d10..cfc5a6e 100644 --- a/test/simple/schema.yaml +++ b/test/simple/schema.yaml @@ -57,13 +57,13 @@ content: # # Lehrform # -form: +form-of-instruction: label: { - de: "Lehrform", + de: "Lehrform(en)", en: "form of instruction" } - type: enum - values: { + type: multikey + keys: { 'lecture' : { de: "Vorlesung", en: "lecture" @@ -89,6 +89,9 @@ form: en: "project" } } + template: + de: "${key} (${value}SWS)" + en: "${key} (${value}SWS)" # # Voraussetzungen für die Teilnahme @@ -185,21 +188,10 @@ term: de: "Semester", en: "Term" } - type: 'enum' - values: { - 'winter' : { - de: "Wintersemester", - en: "Winter Term" - }, - 'summer' : { - de: "Sommersemester", - en: "Summer Term" - }, - 'both' : { - de: "Winter- und Sommersemester", - en: "winter and summer term" - } - } + type: int + template: + de: "$value$. Semester" + en: "$value$ semester" # # Häufigkeit des Angebots @@ -221,7 +213,11 @@ frequency: } } -duration: enum +duration: + type: int + template: + de: "$value Semester" + en: "$value term(s)" kind: type: enum