added multikey type

This commit is contained in:
Hartmut Seichter 2023-11-08 20:42:15 +01:00
parent f35aa9e2ef
commit 35fbc4ff8c
5 changed files with 124 additions and 61 deletions

View file

@ -17,30 +17,12 @@ import textwrap
import string import string
class MarkdownGenerator:
class CourseBuilder:
def __init__(self) -> None: def __init__(self) -> None:
self.__schema = None pass
def set_schema(self,schema = None): def generate_markdown(self,ti,pagebreak = False,title = None) -> str:
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:
line_length = 128 line_length = 128
column_ratio= 0.28 column_ratio= 0.28
@ -48,8 +30,8 @@ class CourseBuilder:
h_len = int(line_length * column_ratio) h_len = int(line_length * column_ratio)
d_len = line_length-h_len d_len = line_length-h_len
# if title: if title:
# print('#',desc[lang]['name'],'\n') print('#',title,'\n')
print(''.join(['+',"".ljust(h_len,'-'),'+',"".ljust(d_len,'-'),'+'])) print(''.join(['+',"".ljust(h_len,'-'),'+',"".ljust(d_len,'-'),'+']))
@ -79,13 +61,37 @@ class CourseBuilder:
if pagebreak: if pagebreak:
print('\n\\newpage') 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'): def process_label(self,field,lang='de'):
# processes the label of a field item # processes the label of a field item
return self.__schema[field]['label'][lang] return self.__schema[field]['label'][lang]
def process_str(self,meta,field,lang='de'): def process_str(self,meta,field,lang='de'):
# if self.is_translatable(field):
return [self.process_label(field,lang),meta[field][lang]] 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'): def process_enum(self,meta,field,lang='de'):
v = meta[field]['value'] v = meta[field]['value']
@ -96,7 +102,23 @@ class CourseBuilder:
t = string.Template(self.get_template(field,lang)) t = string.Template(self.get_template(field,lang))
return [self.process_label(field,lang),t.substitute({'value' : v})] return [self.process_label(field,lang),t.substitute({'value' : v})]
def process(self,meta,fields = [],lang = 'de'): def process_multikey(self,meta,field,lang='de'):
vs = meta[field]['value']
t = string.Template(self.get_template(field,lang))
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 = [] table_items = []
@ -105,31 +127,29 @@ class CourseBuilder:
case 'str': table_items.append(self.process_str(meta,field,lang)) case 'str': table_items.append(self.process_str(meta,field,lang))
case 'enum': table_items.append(self.process_enum(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)) case 'int': table_items.append(self.process_int(meta,field,lang))
case 'multikey': table_items.append(self.process_multikey(meta,field,lang))
self.generate_markdown(table_items) mdg = MarkdownGenerator()
mdg.generate_markdown(table_items,pagebreak)
def main(): def main():
# get command line parameters
parser = ArgumentParser()
# arguments # arguments
parser = ArgumentParser(description='versatile curricula generator') 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('-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('-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('-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('-s','--schema',help="using provided schema")
parser.add_argument('-p','--pagebreak',action="store_true",help="add a pagebreak after each module")
# get arguments # get arguments
args = parser.parse_args() args = parser.parse_args()
# only run debug # only run debug
if args.schema: if args.schema and args.meta:
cb = CourseBuilder() cb = CourseBuilder()
@ -138,7 +158,7 @@ def main():
for m in args.meta: for m in args.meta:
with open(m) as fm: 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: else:
parser.print_help() parser.print_help()

5
test/simple/.temp.md Normal file
View file

@ -0,0 +1,5 @@
+-----------------------------------+---------------------------------------------------------------------------------------------+
|Modulname |Computer Graphics |
+===================================+=============================================================================================+
|Kürzel |CG |
+-----------------------------------+---------------------------------------------------------------------------------------------+

8
test/simple/Makefile Normal file
View file

@ -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

View file

@ -1,7 +1,5 @@
name: { name:
de: "Computergrafik", value: Computer Graphics
en: "Computer Graphics"
}
id: id:
value: CG value: CG
@ -12,8 +10,14 @@ credits:
form-of-exam: form-of-exam:
value: written value: written
form: form-of-instruction:
value: lecture value: { 'lecture': 2, 'exersise': 1 }
term:
value: 1
duration:
value: 1
kind: kind:
value: compulsory value: compulsory
@ -88,3 +92,33 @@ media-of-instruction:
* Goldstein, E. Bruce. Sensation and Perception. 3rd ed. Belmont, Calif.: Wadsworth Pub. Co., 1989 * 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 * 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 * 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:

View file

@ -57,13 +57,13 @@ content:
# #
# Lehrform # Lehrform
# #
form: form-of-instruction:
label: { label: {
de: "Lehrform", de: "Lehrform(en)",
en: "form of instruction" en: "form of instruction"
} }
type: enum type: multikey
values: { keys: {
'lecture' : { 'lecture' : {
de: "Vorlesung", de: "Vorlesung",
en: "lecture" en: "lecture"
@ -89,6 +89,9 @@ form:
en: "project" en: "project"
} }
} }
template:
de: "${key} (${value}SWS)"
en: "${key} (${value}SWS)"
# #
# Voraussetzungen für die Teilnahme # Voraussetzungen für die Teilnahme
@ -185,21 +188,10 @@ term:
de: "Semester", de: "Semester",
en: "Term" en: "Term"
} }
type: 'enum' type: int
values: { template:
'winter' : { de: "$value$. Semester"
de: "Wintersemester", en: "$value$ semester"
en: "Winter Term"
},
'summer' : {
de: "Sommersemester",
en: "Summer Term"
},
'both' : {
de: "Winter- und Sommersemester",
en: "winter and summer term"
}
}
# #
# Häufigkeit des Angebots # Häufigkeit des Angebots
@ -221,7 +213,11 @@ frequency:
} }
} }
duration: enum duration:
type: int
template:
de: "$value Semester"
en: "$value term(s)"
kind: kind:
type: enum type: enum