From 324b5ba4cc27b2691fab13cf35778d7cd03ca4e5 Mon Sep 17 00:00:00 2001
From: Hartmut Seichter <hartmut@gmail.com>
Date: Sun, 5 Nov 2023 21:44:45 +0100
Subject: [PATCH] update with proper formating

---
 coursebuilder/__main__.py | 75 +++++++++++++++++++++++++++++++++------
 test/simple/mod.cg.yaml   | 53 +++++++++++++--------------
 2 files changed, 92 insertions(+), 36 deletions(-)

diff --git a/coursebuilder/__main__.py b/coursebuilder/__main__.py
index 4b52800..0e1b1e1 100644
--- a/coursebuilder/__main__.py
+++ b/coursebuilder/__main__.py
@@ -16,7 +16,7 @@ import os
 import textwrap
 
 config_file = 'modulhandbuch.yaml'
-line_length = 80
+line_length = 128
 column_ratio= 0.28
 
 def build_curriculum(input_path,lang='de',pagebreak=False,title=False):
@@ -101,23 +101,75 @@ class CourseBuilder:
     
     def set_schema(self,schema = None):
         self.__schema = schema
-        # print(self.__schema)
 
-    def process(self,meta = None,lang='en'):
+
+    def generate_markdown(self,ti):
+
+        h_len = int(line_length * column_ratio)
+        d_len = line_length-h_len
+
+        # if title:
+        #     print('#',desc[lang]['name'],'\n')
+
+        print(''.join(['+',"".ljust(h_len,'-'),'+',"".ljust(d_len,'-'),'+']))
+
+        headline = False
+
+        for k,v in ti:
+
+            h =  textwrap.wrap(k, h_len, break_long_words=False)
+            wrapper = textwrap.TextWrapper(d_len)
+            t = [wrapper.wrap(i) for i in v.split('\n') if i != '']
+            t = list(itertools.chain.from_iterable(t))
+                  
+            # get rows
+            rows = list(itertools.zip_longest(h,t,fillvalue=""))
+
+            # expand rows
+            for r in rows:
+                print(''.join(['|',r[0].ljust(h_len,' '),'|',r[1].ljust(d_len,' '),'|']))
+
+            if headline:
+                print(''.join(['+',"".ljust(h_len,'-'),'+',"".ljust(d_len,'-'),'+']))
+            else:
+                print(''.join(['+',"".ljust(h_len,'='),'+',"".ljust(d_len,'='),'+']))
+                headline = True
+
+        # to control pagebreaks for pandoc
+        # if pagebreak:
+        #     print('\n\\newpage')
         
-        fields = ['name','goal']
+
+    def process(self,meta,fields,lang):
+        
+        # fields = ['name','goal','form-of-exam']
+        # fields = ['form-of-exam']
+
+        table_items = []
 
         for field in fields:
             match self.__schema[field]['type']: 
-                case 'str': 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))
+        
+        # print(table_items)
 
-    def process_str(self,meta,field,lang='de'):
-        print(self.__schema[field]['label'][lang],':',meta[field][lang])
+        self.generate_markdown(table_items)
 
-    def process_int(self,lang='de'):        
+
+    def process_label(self,field,lang='de'):
         pass
 
-    def process_enum(self):
+    def process_str(self,meta,field,lang='de'):
+        return [self.__schema[field]['label'][lang],meta[field][lang]]
+        # print(self.__schema[field]['label'][lang],':',meta[field][lang])
+
+    def process_enum(self,meta,field,lang='de'):
+        v = meta[field]['value']
+        return [self.__schema[field]['label'][lang],self.__schema[field]['values'][v][lang]]
+        # print(self.__schema[field]['label'][lang],':',self.__schema[field]['values'][v][lang])
+
+    def process_int(self,lang='de'):        
         pass
 
 
@@ -132,6 +184,8 @@ def main():
 
     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",action="extend", nargs="+", type=str)
+    
     # parser.add_argument('-c','--create',action='store_true',help="Create a meta file from description")
     # parser.add_argument('-n','--newpage',action='store_true',help="Create a pagebreak after each table")
     # parser.add_argument('-t','--title',action='store_true',help="Create a title ahead of each table")
@@ -142,6 +196,7 @@ def main():
     # get arguments
     args = parser.parse_args()
 
+
     # only run debug
     if args.schema:
         
@@ -152,7 +207,7 @@ def main():
 
         for m in args.meta:
             with open(m) as fm:
-                cb.process(yaml.load(fm,Loader=yaml.Loader),lang=args.lang)
+                cb.process(yaml.load(fm,Loader=yaml.Loader),fields=args.fields,lang=args.lang)
     else:
         parser.print_help()
 
diff --git a/test/simple/mod.cg.yaml b/test/simple/mod.cg.yaml
index 48c5783..5566fcc 100644
--- a/test/simple/mod.cg.yaml
+++ b/test/simple/mod.cg.yaml
@@ -19,39 +19,41 @@ common:
   author-of-indenture:
   form: lecture # lecture, seminar, lecture_seminar, lecture_exersice, project
 
+form-of-exam: 
+  value: written
 
-goal: {
-  de: "Computergrafik ist ein Schmelztiegel von Technologien in der Informatik mit dem Ziel visuelle 
+goal: 
+  de: |
+      Computergrafik ist ein Schmelztiegel von Technologien in der Informatik mit dem Ziel visuelle 
       Inhalte effizient zu generieren und dem Nutzer zu präsentieren. Studierende können den 
       Zusammenhang von visuellen Technologien in der Informatik, den zugrunde liegenden mathematischen
       Konzepte und der Physiognomie des Menschen, insbesondere des Sehapparates herstellen. 
       Sie können die Eigenschaften verschiedener Darstellungsformen und -techniken analysieren und 
       bewerten. Sie lernen grundsätzliche Technologien der 3D Echtzeitdarstellung
-      kennen und wenden diese an.",
-  en: "Computer graphics is describing all techniques in computer science
+      kennen und wenden diese an.
+  en: | 
+      Computer graphics is describing all techniques in computer science
       generating images perceivable by humans. Participants will have a broad
       overview of techniques and concepts of computer graphics. They will be 
-      able to apply theoretical concepts in practice. "
-}
+      able to apply theoretical concepts in practice.
 
-content: {
-  de: "
-    * Grundkenntnisse der menschlichen Wahrnehmung 
-    * Grundkonzepte der Bilderzeugung, Speicherung und Transformation
-    * Anwendungen von Computergrafik
-    * Technologien zur Bilddarstellung 
-    * 3D Modelle, insbesondere Surface- und Volumemodelle 
-    * Transformationspipeline 
-    * Homogene Vektorräume und Transformationen 
-    * Szenengraphen und Echtzeit Rendering APIs 
-    * Bildsyntheseverfahren
-    * Geometrie und Bild Samplingverfahren und Anti-Aliasing Strategien 
-    * Lichttransport, Physikalische Beleuchtungsmodelle 
-    * Texturierungsverfahren 
-    * Überblick Visualisierung 
-    * Graphische Nutzeroberflächen und Systeme
-  ",
-  en: "
+content: 
+  de: | 
+      * Grundkenntnisse der menschlichen Wahrnehmung 
+      * Grundkonzepte der Bilderzeugung, Speicherung und Transformation
+      * Anwendungen von Computergrafik
+      * Technologien zur Bilddarstellung 
+      * 3D Modelle, insbesondere Surface- und Volumemodelle 
+      * Transformationspipeline 
+      * Homogene Vektorräume und Transformationen 
+      * Szenengraphen und Echtzeit Rendering APIs 
+      * Bildsyntheseverfahren
+      * Geometrie und Bild Samplingverfahren und Anti-Aliasing Strategien 
+      * Lichttransport, Physikalische Beleuchtungsmodelle 
+      * Texturierungsverfahren 
+      * Überblick Visualisierung 
+      * Graphische Nutzeroberflächen und Systeme    
+  en: |
      * Basics of human perception 
      * Concepts of image storage and manipulation 
      * Applications of computer graphics
@@ -66,8 +68,7 @@ content: {
      * Texturing
      * Overview visualizations 
      * Graphical User Interfaces
-  "
-}
+
 
 # German Variant
 de: