Back in May (2020) I published filterCSV, An Open Source Preprocessor For Mind Mapping Software.
To recap a little, the premise was very simple: I wanted to create a tool that could automate colouring nodes in a mind map, based on simple filtering rules. The format I chose was iThoughts’ CSV file format. (It could both import and export in this format.) Hence the name “filterCSV”.
I chose that format for three reasons:
- I use iThoughts a lot – and colouring nodes that match patterns is a common thing for me to do.
- The format is a rather nice text format, with lots of semantics available.
- Python has good tools for ingesting and emitting CSV files. Likewise for processing arrays – which is, obviously, what CSV can be converted to.
So I built filterCSV and last time I wrote about it I had extended the CSV -> filterCSV -> CSV cycle to
- Ingest flat text, Markdown and XML
- Emit HTML, OPML, XML, Freemind
So, it had become a slightly more general tree manipulator and converter.
What Happened Next?
I’ve done a lot of work on filterCSV. I’ll attempt to break it down into categories.
You can now import OPML.
You can now export as tab- or space-indented text.
You can now export in GraphViz Directed Graph format, which means you can get a tree as a picture, outside of a mind-mapping application.
Tree Manipulation Functions
You can sort a node’s children ascending, and you can reverse their order. The latter means you can sort them descending. Imagine a tree with a Db2 subsystem and the CICS regions that attach to it as its children. You’d want the CICS regions sorted, I think. (Possibly by name, possibly by Service Class or Report Class.
Sometimes it makes sense for the children of a node to be merged into the node. Now they can be and they are each preceded by an asterisk – to form a Markdown bulleted list item. (iThoughts can handle some Markdown in its nodes.) I think we might use this in our podcast show notes.
You can now select nodes by their level in the tree. You can also use
none as a selector – to deselect all nodes in the tree. (Before you had
all as a selector – to allow you to set attributes of all nodes.) You might use
next colour) to skip a colour in the iThoughts palette.
Here’s an example:
'^A1$' nc none nc 'A1A' nc
Where the first command says ‘for nodes whose text is “A1” colour with the first colour in the standard iThoughts colour palette’. The second says ‘do not use the second colour in the palette’. The third command says ‘for nodes with “A1A” in their text use the third colour in the palette’.
New Node Attributes
iThoughts, as well as colour and shape, has three attributes of a node that filterCSV now supports:
- Icon – where you can prefix a node with one of about 100 icons. For example, ticks and single-digit number icons.
- Progress – which is the percent complete that a task is. Some people use iThoughts for task management.
- Priority – which can range from 1 to 5.
As with colour and shape, you can set these attributes for selected nodes, with the selection following a rule. And, again, you can combine them. For example a tick node and 100% completion. You can also reset them, for example with
Invoking filterCSV with no commands produces some help. This help points to the Github repository and the readme.
You can now (through Stream 3) read commands from a file. If you do you can introduce comments with
// . Those continue until the end of the line. You can also use blank lines.
I learnt to use Stream 3 for input you might invoke filterCSV with something like
filterCSV < input.csv > output.opml 3< command-file
So, you can see filterCSV (now at 1.10) has come on in leaps and bounds over the past few months. Most of the improvements were because I personally needed them, but one of them – indented output – was in response to a question from someone in a newsgroup.
And I’ve plenty more ideas of things I want to do with filterCSV. To reiterate, it’s an open source project so you could contribute. filterCSV is available from here.
And it’s interesting to me how the original concrete idea – colouring iThoughts nodes – has turned into the rather more abstract – ingesting trees and emitting them in various formats with lots of manipulations. I like this and probably should deploy the maxim “abstraction takes time and experience”.