mm2nested_lists#
Dieses Notebook: Eine kleine Utility, die eine Freeplane-Mindmap in eine nested list überführt, und als JSON-Datei ‘rausschreibt.
Idee:
Kindknoten eines Knotens werden repräsentiert durch eine Liste von Knoten.
Beispiel#
Input: die Mindmap
test.mm
Output: die JSON-Datei
test.mm.json
Aufbau der Mindmap: Die Mindmap test.mm
hat die Root-Node mit dem Text test
und die Kindknoten (mit dem Text) a
, b
und c
. Knoten b
hat selbst wieder die Kindknoten ba
und bb
:
test
a
b
ba
bb
c
Die Ergebnis-Liste soll so aussehen:
['test', [ 'a', 'b', ['ba', 'bb'] ], 'c']
mm_path = "./test.mm"
# wir verwenden die xml und xslt-Engine
# https://lxml.de/
from lxml import etree
# https://pypi.org/project/markdownify/
# pip install markdownify
from markdownify import markdownify
mm_path = "./test.mm"
# https://lxml.de/
from lxml import etree
parser = etree.XMLParser(remove_blank_text=True)
etree_tree = etree.parse(mm_path, parser)
etree_startnode = etree_tree.getroot().find("node")
def representation(n):
"""returns a text represenatation of a .mm XML element"""
if n.tag == "node":
if n.find('richcontent[@TYPE="NODE"]') is not None:
# wir haben einen richconten Knoten:
# html Knoteninhalt als Markdown zurückliefern
return markdownify(
etree.tostring(n.find('richcontent[@TYPE="NODE"]'),
encoding="utf8"), heading_style="ATX")
else:
# wir haben einen einfachen Knoten:
# Knoteninhalt steht im Attribut "TEXT"
return n.get("TEXT")
else:
return n.tag
def walk(current, result):
"""Returns a nested dict representation of a freeplane mindmap."""
# current ist immer eine XML-Node mit dem Namen node
result.append( representation( current ) )
# Liste aller "node"-Kinder des aktuellen Knotens
# (andere XML-Elemente sind uninteressant)
children = current.findall("node")
if len(children) >= 1:
# der aktuelle Knoten *hat* Kinder:
# Wir geben eine Liste zurück, deren erstes Element der aktuelle Knoten selbst ist:
# print([ c.get("TEXT") for c in children ])
sub_list = []
for child in children:
walk(child, sub_list)
result.append( sub_list )
etree_startnode.tag
'node'
ergebnis = []
walk( etree_startnode, ergebnis )
ergebnis
['test',
['a',
'c',
['°i test2.mm'],
'b',
['ba',
'bb',
'\n# Hallo Welt!\n\n\n\n\n\n Das ist eine **richcontent**\xa0Node\n \n\n']]]
JSON#
Wir schreiben das Ergebnis als JSON-Datei ‘raus:
import json
mm_json_object = json.dumps(ergebnis, indent=2)
with open(mm_path+'.json', 'w') as outfile:
outfile.write(mm_json_object)
Ergebnis: Im gleichen Verzeichnis wie unsere Mindmap ./test.mm
liegt jetzt die JSON-Datei test.mm.json
.