I use the open source mindmapping software freeplane on a day to day basis. Because of its java nature the gui tends to cause a little bit of eye strain for the spoiled average mac / apple user, but the rich feature set makes up for that! Freeplane has an integrated scripting api which can be used to freely manipulate the nodes, attributes and connections of a mindmap with javascript or groovy.

I recently had the need to paste mindmap structures into a redmine wiki (which uses the textile markup) and groovy was still on my “look into it soon”-list. So i took the chance.

Here’s the gist:
-> Most recent version on github

import javax.swing.*;

/*
*	Export Freeplane mindmap branch to nested list in textile format e.g. for use in Redmine wiki
*	- Save as <filename>.groovy in <freeplane directory>/scripts/
	- Select node and start script from menu: Tools -> Scripts -> <filename>
*
*/

def process(thisNode, childPosition) {
		def result =""
		result = prefix(childPosition)+thisNode.text+suffix(childPosition)
    	thisNode.children.each {
        result += process(it, childPosition + 1)
		
    
    }
    return result
}
 
def showDialog(String text) {
    def dialog = new JDialog(ui.frame)
    dialog.setSize(500, 700)
    dialog.setLocationRelativeTo(ui.frame)
    dialog.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE)
    dialog.add(new JScrollPane(new JTextArea(text)))
    ui.addEscapeActionToDialog(dialog)
    dialog.visible = true
}

def prefix(position){
	if(position == 0){
		return "h1. "
	} else if (position == 1){
		return "\nh2. "
	} else {
		return "*".multiply(position-1)+" "
	}
}

def suffix(position){
	if(position == 0){
		return "\n"
	} else if (position == 1){
		return "\n\n"
	} else {
		return "\n"
	}
}
def output = process(node, 0);

showDialog(output)