1
ewpratten.com/content/blog/2019-07-15-MindMap.md
Evan Pratten 66528d6284 Revert "The great migration"
This reverts commit f184e610368cedc50f9dd557953c83f70b55f329.
2024-11-14 12:45:30 -05:00

133 lines
4.6 KiB
Markdown

---
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:
![Simple Mind Map](/images/posts/mindmap/mindmap-simple.png)
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.