--- title: Mind map generation with Python description: Step 1 date: 2019-07-15 aliases: - /blog/2019/07/15/mindmap - /blog/mindmap --- While working on an assignment with [Coggle](https://coggle.it) today, I noticed an interesting option in the save menu. *Download as .mm file*. Having rarely worked with mind maps before, and only doing it online, it never occured to me that someone would have a file format for it. So I took a look. ## What is a .mm file? It turns out, a `.mm` file is just some XML describing the mind map. Here is a simple mind map:  And again as a `.mm` file: ```xml <map version="0.9.0"> <node TEXT="Master Node" FOLDED="false" POSITION="right" ID="5d2d02b1a315dd0879f48c1c" X_COGGLE_POSX="0" X_COGGLE_POSY="0"> <edge COLOR="#b4b4b4"/> <font NAME="Helvetica" SIZE="17"/> <node TEXT="Child branch" FOLDED="false" POSITION="right" ID="f72704969525d2a0333dd635"> <edge COLOR="#7aa3e5"/> <font NAME="Helvetica" SIZE="15"/> <node TEXT="Children 1" FOLDED="false" POSITION="right" ID="c83826af506cae6e55761d5c"> <edge COLOR="#7ea7e5"/> <font NAME="Helvetica" SIZE="13"/> </node> <node TEXT="Children 2" FOLDED="false" POSITION="right" ID="47723a4d0fb766863f70d204"> <edge COLOR="#82aae7"/> <font NAME="Helvetica" SIZE="13"/> </node> </node> </node> </map> ``` Neat, right? ## What can we do with it? I have not done much research about this because I wanted to work all of this out on my own. But I know one thing as a fact: working with XML sucks (especially in Python). I decided that this would be much better if I could load `.mm` files as JSON. This would allow easy manipulation and some cool projects. ## My script Like everything I do, I made a script to play with these files. It's pretty simple. First, It loads a `.mm` file, then parses it into a `list` of `xml.etree.ElementTree.Element`. ```python raw_mm = "" with open(args.file, "r") as fp: raw_mm = fp.read() fp.close() xml = ET.fromstring(raw_mm) ``` The parsed `list` is then passed into a recursive function that constructs a `dict` ```python def xmlToDict(xml): output = [] for elem in list(xml): if "TEXT" not in elem.attrib: continue name = elem.attrib['TEXT'] json_element = {"name": name} try: json_element["children"] = xmlToDict(elem) except: continue # Detect node type if json_element["children"]: json_element["type"] = "branch" else: json_element["type"] = "leaf" del json_element["children"] output.append(json_element) return output ``` Finally, the `dict` is written to a file with `json.dump` ```python json.dump(mind_map, open(args.file + ".json", "w")) ``` The whole script (with comments) can be found on my [GitHub account](https://gist.github.com/Ewpratten/0d8f7c7371380c9ca8adcfc6502ccf84#file-parser-py). ## The output Running the `.mm` file from above through the script gives: ```json [ { "name":"Master Node", "children":[ { "name":"Child branch", "children":[ { "name":"Children 1", "type":"leaf" }, { "name":"Children 2", "type":"leaf" } ], "type":"branch" } ], "type":"branch" } ] ``` ## The next step This script just translates a `.mm` file to JSON. Nothing else. Next, I want to convert this to a library, and add a JSON to `.mm` function as well. This leads into my ultimate goal for this project. I want a script that I can drop in the root of any project to build a [Gource](https://gource.io/)-style visualization of the folder structure. This will give me a way to make cool visualizations for lessons on the robotics team. On top of the folder visualization, Coggle's new flowchart feature can be used to generate graphical representations of @frc5024's codebases. This could give me an interactive overview of the work being done by our team. ### Further learning crm.org has done a great writeup of [Coggle, and some of it's features](https://crm.org/news/free-flowin-mind-maps-with-coggle). If you are looking to learn more about the tool, I recommend taking a few minute to read their post.