diff --git a/ics2mm.py b/ics2mm.py index 3232611d17aee27be0a4ca2b83d8fa92fc844531..7013d388d58e87306d26398ad64e91b9592a2a2a 100644 --- a/ics2mm.py +++ b/ics2mm.py @@ -44,12 +44,29 @@ parser.add_argument( type=str, ) +parser.add_argument( + '-o', '--orientation', + choices=['l', 'r'], + default = None, + help = + """l - all mindmap nodes on left side, + r - all mindmap nodes on left side + empty = no parameter: first half nodes left, second half right side""", + type=str, +) + +parser.add_argument( + '-v', '--verbose', + action='store_true' +) + # todo: Ort, Icons, Texte aus MM in ical übersetzen # todo: prüfen, ob Icons in Text umgewandelt werden können cal = icalendar.Calendar() # todo: prüfen ob 'global cal' anders gelöst werden kann +verbose = False def get_text(node): return node.get("TEXT") @@ -146,14 +163,19 @@ def gehe_durch_ics_tree(tree, parent=None): gehe_durch_mindmap_tree(node, parent=node) - +def verbose_debug_print(string): + global verbose + if verbose: + print(string) def main(args): - global cal + global cal, verbose """Run main function.""" ics_filename = args.ics_file # input mm_filename = args.mindmap_file # output + left_right_flag= args.orientation + verbose = args.verbose mm_content = freeplane_tools.data.get_template() # Vorlage öffnen und verwenden @@ -192,6 +214,9 @@ def main(args): # aus ics lesen cal = icalendar.cal.Component.from_ical(ics_string) + # Zähle die Anzahl von parent-nodes (ohne parent_uid) + count_parent_nodes = 0 + ## ics in list umwandeln list_todos = list() for ics_todo in cal.walk("VTODO"): @@ -200,6 +225,7 @@ def main(args): except: parent_uid = None + try: SUMMARY = str(ics_todo["SUMMARY"]) except: @@ -212,29 +238,53 @@ def main(args): try: status = str(ics_todo["STATUS"]) - print(f"Status gefunden! ********* {status}") + verbose_debug_print(f"Status gefunden! ********* {status}") except: status = None if status != "COMPLETED": # or status != None or status is not None: - print([UID, SUMMARY, parent_uid]) + verbose_debug_print([UID, SUMMARY, parent_uid]) list_todos.append([UID, SUMMARY, parent_uid]) + if parent_uid == None: + count_parent_nodes += 1 # root nodes zählen # print(ics_todo) # break # print(list_todos) - # todo: Liste sortieren, zuerst Aufgaben ohne parent + # Liste sortieren, zuerst Aufgaben ohne parent list_todos = sort_tree(list_todos) + count_converted_parent_nodes = 0 + # Liste sortieren oder Stück für Stück durchgehen for single_todo in list_todos: UID = single_todo[0] SUMMARY = single_todo[1] parent_uid = single_todo[2] - print(f"UID: {UID} | Parent_ID: {parent_uid}") + verbose_debug_print(f"UID: {UID} | Parent_ID: {parent_uid}") if parent_uid == None: - ET.SubElement(tree.findall("node")[0], "node", {"TEXT": SUMMARY, "ID": UID}) + count_converted_parent_nodes += 1 + if left_right_flag == None: + verbose_debug_print(f"Zweiseitig, konvertiert: {count_converted_parent_nodes}, gesamt: {count_parent_nodes}") + if count_converted_parent_nodes < count_parent_nodes / 2: + # erste Hälft links + mydict = {"TEXT": SUMMARY, "ID": UID, "POSITION": "left"} + else: + # zweite Hälfte rechts + mydict = {"TEXT": SUMMARY, "ID": UID} + if 'l' == left_right_flag: + mydict = {"TEXT": SUMMARY, "ID": UID, "POSITION":"left"} + elif 'r' == left_right_flag: + mydict = {"TEXT": SUMMARY, "ID": UID} + else: + pass + + + + + # todo je nach switch parent-nodes links, rechts oder verteilt (halbe-halbe) erzeugen, gesamtzahl ist in count_parent_nodes + ET.SubElement(tree.findall("node")[0], "node", mydict) else: # node finden mit attribut ID == parent_uid # find_text = f".//*[@ID={parent_uid}]" @@ -244,7 +294,7 @@ def main(args): for tag in tree.findall(".//*[@ID]") if parent_uid in tag.attrib["ID"] ] - print(f" parent_node: {parent_node}, len={len(parent_node)}") + verbose_debug_print(f" parent_node: {parent_node}, len={len(parent_node)}") if ( len(parent_node) < 1 ): # keinen passenden Knoten gefunden @@ -256,7 +306,7 @@ def main(args): ET.SubElement(parent_node[0], "node", {"TEXT": SUMMARY, "ID": UID}) ## MM Zentralknoten anlegen mit Dateinamen - print(ics_filename.split(".")[0]) + verbose_debug_print(ics_filename.split(".")[0]) # ET.SubElement(tree, 'node', {'TEXT': ics_filename, 'STYLE': 'oval'}) funktioniert nicht, legt einen zweiten untersten 'node' an tree.findall("node")[0].set( "TEXT", ics_filename.split(".")[0] @@ -288,17 +338,17 @@ def main(args): # Eintrag in MM erzeugen # mm_root = tree.getroot() - print(tree.tag) + verbose_debug_print(tree.tag) # ET.SubElement(tree,'node', {'TEXT':'Beispiel 1', 'STYLE':'oval'}) # show text of all entries in mm for node in tree.findall("node"): text = node.get("TEXT") - print(f"{text}") + verbose_debug_print(f"{text}") # ET.SubElement(node,"node", {'TEXT':'Beispiel 2'}) for innernode in node.findall("node"): text = innernode.get("TEXT") - print(f" {text}") + verbose_debug_print(f" {text}") # gehe_durch_mindmap_tree(tree, None)