mm include#
Dieses Notebook:
lese eine Freeplane-Mindmap ein
für Text-Knoten, die mit “°i “ beginnen: lies die danach angegebene Mindmap ein
Beispiel#
Input: die Mindmap
test.mm
Output: die JSON-Datei
test-included.mm
mm_path = "test.mm"
# wir verwenden die xml und xslt-Engine
# https://lxml.de/
from lxml import etree
def open_mm(mm_path):
parser = etree.XMLParser(remove_blank_text=True)
etree_tree = etree.parse(mm_path, parser)
etree_startnode = etree_tree.getroot().find("node")
return etree_tree, etree_startnode
def walk(current, included):
"""Returns a nested dict representation of a freeplane mindmap."""
[ current.attrib.pop(a, None) for a in ['HGAP_QUANTITY', 'VSHIFT_QUANTITY'] ]
# Liste aller "node"-Kinder des aktuellen Knotens
# (andere XML-Elemente sind uninteressant)
children = current.findall("node[@TEXT]")
if len(children) >= 1:
# der aktuelle Knoten *hat* Kinder:
for child in children:
text = child.get("TEXT")
if text.startswith("°i "):
to_include_file_path = text.split()[1]
if to_include_file_path not in included:
_, include_root = open_mm(to_include_file_path)
included.append(to_include_file_path)
print(f"included {to_include_file_path}: {include_root.get('TEXT')}")
child.append(include_root)
else:
print(f"WARNING: rejecting multiple inclusion of {to_include_file_path}")
walk(child, included)
import os
workdir = "."
os.chdir(workdir)
mm_path = "test.mm"
etree_tree, etree_startnode = open_mm(mm_path)
included = [ mm_path ]
walk( etree_startnode, included)
included
included test2.mm: Root von test2
WARNING: rejecting multiple inclusion of test2.mm
['test.mm', 'test2.mm']
Wir schreiben das Ergebnis wieder ‘raus:
etree_tree.write(f"{mm_path}_included.mm", pretty_print=True)