added multikey type
This commit is contained in:
parent
f35aa9e2ef
commit
35fbc4ff8c
5 changed files with 124 additions and 61 deletions
|
@ -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,'-'),'+']))
|
||||||
|
|
||||||
|
@ -78,14 +60,38 @@ class CourseBuilder:
|
||||||
# to control pagebreaks for pandoc
|
# to control pagebreaks for pandoc
|
||||||
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']
|
||||||
|
@ -95,8 +101,24 @@ class CourseBuilder:
|
||||||
v = meta[field]['value']
|
v = meta[field]['value']
|
||||||
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_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 = []
|
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
5
test/simple/.temp.md
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
+-----------------------------------+---------------------------------------------------------------------------------------------+
|
||||||
|
|Modulname |Computer Graphics |
|
||||||
|
+===================================+=============================================================================================+
|
||||||
|
|Kürzel |CG |
|
||||||
|
+-----------------------------------+---------------------------------------------------------------------------------------------+
|
8
test/simple/Makefile
Normal file
8
test/simple/Makefile
Normal 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
|
|
@ -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:
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue