initial stab in restructuring and generating curricula

This commit is contained in:
Hartmut Seichter 2024-05-09 22:57:10 +02:00
parent 010aa5e72f
commit 4fca7c7bae
14 changed files with 172 additions and 137 deletions

View file

@ -11,16 +11,17 @@ actual values are kept in YAML files in order to version them with git.
"""
from argparse import ArgumentParser
import yaml
import string
import os,sys
import yaml
import pandas as pd
from tablegenerator import TableGenerator
from markdowngenerator import MarkdownGenerator
from templategenerator import TemplateGenerator
from metagenerator import MetaGenerator
class CourseBuilder:
@staticmethod
@ -39,6 +40,9 @@ class CourseBuilder:
parser.add_argument('--level',type=int,default=1,help="level of header tags")
parser.add_argument('--table-gen',type=str,default=None,help='runs table generator')
parser.add_argument('--template',type=str,default=None,help='defines a template to be used with fields')
parser.add_argument('-o','--out',type=str,default=None,help='set the output type')
parser.add_argument('--maxcol',type=int,default=28,help='maximum size of left column')
# get arguments
args = parser.parse_args()
@ -114,14 +118,21 @@ class CourseBuilder:
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)
meta = yaml.load(fm,Loader=yaml.Loader)
if args.template:
TemplateGenerator.generate(table_items)
else:
MarkdownGenerator.generate(table_items,pagebreak=args.pagebreak,title=args.title,header_level=args.level)
table_items = generator.process(meta=meta,fields=actual_fields,lang=args.lang)
# print(table_items)
df = pd.DataFrame(table_items)
df.columns = df.iloc[0]
df = df[1:]
print(df.to_markdown(tablefmt='grid', index=False, maxcolwidths=[args.maxcol,None]))
print('\n')
if args.pagebreak:
print('\\pagebreak')
# MarkdownGenerator.generate(table_items,pagebreak=args.pagebreak,title=args.title,header_level=args.level)
else:
parser.print_help()

View file

@ -1,5 +1,4 @@
import os,string,sys
import yaml
class MetaGenerator:
@ -92,7 +91,7 @@ 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'):
table_items = []

View file

@ -4,6 +4,8 @@ import string
import tempfile
import subprocess
import os
import pandas as pd
import tabulate
class TableGenerator:
"""

7
requirements.txt Normal file
View file

@ -0,0 +1,7 @@
numpy==1.26.4
pandas==2.2.2
python-dateutil==2.9.0.post0
pytz==2024.1
six==1.16.0
tabulate==0.9.0
tzdata==2024.1

38
test/Makefile Normal file
View file

@ -0,0 +1,38 @@
build_dir := build
target_en := ${build_dir}/table.en.pdf
target_de := ${build_dir}/table.de.pdf
target_flags := --template pandoc-template/eisvogel.latex
coursebuilder := ../coursebuilder
${target_en}:
@echo "creating English version ..."
mkdir -p ${build_dir}
python ${coursebuilder} -s schema.yaml -m mod.cg.yaml -l en -f fields.yaml | pandoc ${target_flags} -o ${target_en}
${target_de}:
@echo "creating German version ..."
mkdir -p ${build_dir}
python ${coursebuilder} -s schema.yaml -m mod.cg.yaml -l de -f fields.yaml | pandoc ${target_flags} -o ${target_de}
all: ${target_de} ${target_en}
clean:
rm ${target_de} ${target_en}
# debug-template:
# python ${coursebuilder} -s schema.yaml -m mod.cg.yaml mod.interactsys.yaml -l de -f name credits goal content --template "$$name | $$credits"
# 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 mod.interactsys.yaml mod.test.yaml -l de -f name credits goal content | pandoc ${target_flags} -V lang:de -o ${target_de}
.PHONY: clean

View file

@ -33,5 +33,6 @@ book:
en: "## elective courses {.unnumbered}"
- modules:
- mod.interactsys.yaml
- mod.test.yaml

103
test/mod.test.yaml Normal file
View file

@ -0,0 +1,103 @@
name:
de: Test Vorlesung
en: Lecture of Test
id:
value: Test
credits:
value: 5
form-of-exam:
value: written
form-of-instruction:
value: { 'lecture': 2, 'exersise': 1 }
term:
value: [1, 3]
duration:
value: 1
kind:
value: compulsory
goal:
de: |
**What is it**
Lorem Ipsum is simply dummy text of the printing and typesetting
industry. Lorem Ipsum has been the industry's standard dummy text
ever since the 1500s, when an unknown printer took a galley of type
and scrambled it to make a type specimen book. It has survived not only
five centuries, but also the leap into electronic typesetting, remaining
essentially unchanged. It was popularised in the 1960s with the release
of Letraset sheets containing Lorem Ipsum passages, and more recently with
desktop publishing software like Aldus PageMaker including versions of
Lorem Ipsum.
en: |
content:
de: |
**Where did it come from**
Contrary to popular belief, Lorem Ipsum is not simply random text.
It has roots in a piece of classical Latin literature from 45 BC,
making it over 2000 years old. Richard McClintock, a Latin professor
at Hampden-Sydney College in Virginia, looked up one of the more
obscure Latin words, consectetur, from a Lorem Ipsum passage, and
going through the cites of the word in classical literature,
discovered the undoubtable source. Lorem Ipsum comes from sections
1.10.32 and 1.10.33 of "de Finibus Bonorum et Malorum" (The
Extremes of Good and Evil) by Cicero, written in 45 BC. This book
is a treatise on the theory of ethics, very popular during the
Renaissance. The first line of Lorem Ipsum, "Lorem ipsum dolor
sit amet..", comes from a line in section 1.10.32.
en: |
teaching-material:
de: |
en: |
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
spec:
de: "120min Klausur"
en: "120min exam"
frequency:
value: once_per_year
kind:
value: compulsory
remarks:
de:
en:

View file

@ -1,28 +0,0 @@
coursebuilder := ../../coursebuilder
table.en.pdf:
@echo "creating English version ..."
python ${coursebuilder} -s schema.yaml -m mod.cg.yaml -l en -f fields.yaml | pandoc --template pandoc-template/eisvogel.latex -o table.en.pdf
table.de.pdf:
@echo "creating German version ..."
python ${coursebuilder} -s schema.yaml -m mod.cg.yaml -l de -f fields.yaml | pandoc --template pandoc-template/eisvogel.latex -o table.de.pdf
all: table.en.pdf table.de.pdf
clean:
rm -f table.en.pdf table.de.pdf
debug-template:
python ${coursebuilder} -s schema.yaml -m mod.cg.yaml mod.interactsys.yaml -l de -f name credits --template "$$name | $$credits"
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

View file

@ -1,98 +0,0 @@
name:
en: Test Course
test:
competency-table:
de:
- "Lineare Algebra": 'ABC'
- "Vector Spaces": 'A'
#
# nested lists seem to work in Markdown only in the US style way
#
# reference here: https://meta.stackexchange.com/questions/85474/how-to-write-nested-numbered-lists
#
# note the parser actually corrects 'Tervuren' to 3 in resulting data
#
content:
en: |
1. Blah
2. Blub
1. Blah
1. Blub
1. Blah
1. Blub
1. Blah
1. Blub
1. Blah
1. Blub
3. Blah
4. Blub
<!-- break -->
5. Blah
6. Blah and Blub
1. Blah
1. Blub
7. Blah and Blub
- Blah
- Blub
- Blah
- Blub
8. Blub and Blah
- Blah
- Blub
- Blah
- Blub
- Blah
- Blub
- Blah
- Blub
9. Blah, Blub and Blub
- Blah
- Blub
- Blah
- Blub