Import and export: Difference between revisions

From FreeMind
Jump to navigationJump to search
No edit summary
(OpenOffice Writer headings to FreeMind macro)
Line 1,112: Line 1,112:
Thanks
Thanks
S.Gobinath
S.Gobinath
== OpenOffice Writer to FreeMind ==
Sometimes it's useful to be able to create a FreeMind mind map from an OpenOffice writer document. The OpenOffice macro below does precisely this. It will extract all paragraphs of format "Heading 1" to "Heading 5" and create a .mm document that can be opened by FreeMind. The only constraint is that the Writer document must be correctly structured, with all heading levels correctly nested i.e. you can't go from "Heading 1" directly to "Heading 3". I hope you find this macro useful!
Sub headingsToMindMap
newline = CHR$( 10 )
headings = ""
Dim levels(10)
levels(0) = "</node>" & newline
levels(1) = "</node></node>" & newline
levels(2) = "</node></node></node>" & newline
levels(3) = "</node></node></node></node>" & newline
levels(4) = "</node></node></node></node></node>" & newline
levels(5) = "</node></node></node></node></node></node>" & newline
oldLevel = 1
level = 1
outURL = ThisComponent.getURL() & ".mm"
n = FreeFile()
open outURL for output access write as #n
enum = ThisComponent.Text.CreateEnumeration()
headings = "<map version=""0.8.0"">" & newline
Do While enum.hasMoreElements()
par = enum.nextElement()
if par.supportsService("com.sun.star.text.Paragraph") Then
style = par.ParaStyleName
if StrComp("Heading 1", style) = 0 Then
headings = headings & "  <node TEXT=""" &  par.getString() & """>" & newline
level = 1
End If
if StrComp("Heading 2", style) = 0 Then
level = 2
if (level <= oldLevel) Then
headings = headings & levels( oldLevel - level)
End If
headings = headings & "      <node POSITION=""right"" TEXT=""" & par.getString() & """>"
End If
if StrComp("Heading 3", style) = 0 Then
level = 3
if (level <= oldLevel) Then
headings = headings & levels( oldLevel - level)
End If
headings = headings & "        <node POSITION=""right"" TEXT=""" & par.getString() & """>" & newline
End If
if StrComp("Heading 4", style) = 0 Then
level = 4
if (level <= oldLevel) Then
headings = headings & levels( oldLevel - level)
End If
headings = headings & "            <node POSITION=""right"" TEXT=""" & par.getString() & """>" & newline
End If
if StrComp("Heading 5", style) = 0 Then
level = 5
if (level <= oldLevel) Then
headings = headings & levels( oldLevel - level)
End If
headings = headings & "              <node POSITION=""right"" TEXT=""" & par.getString() & """>" & newline5
End If
oldLevel = level
End If
Loop
headings = headings & levels( level - 1)
headings = headings & " " & newline & "</map>"
MsgBox CStr( headings )
print #n headings
close #n
End Sub

Revision as of 14:11, 19 May 2009

For conversion scripts and XSLT, see also Accessories.

Import and export to other applications:

Export and import in general

  • To and from Microsoft Excel Import and export with Microsoft Excel works by drag & drop or copy & paste of complete nodes. You can copy a selection of cells in Excel and drop it in FreeMind. Doing this with several columns, creates corresponding child nodes. This also works with the OpenOffice.org Calc spreadsheet application.
  • To and from OpenOffice Writer To export to OpenOffice Writer you first need to have all of the nodes on the right-hand side of the main/parent node in the mindmap (please make a correction if this is wrong). Then choose 'Select all' in the FreeMind mind map, go to OpenOffice Writer and select 'File > Paste'. OpenOffice Writer layouts using tab indentation can also be pasted into FreeMind which will recreate their tree structure.
    NB: Upcoming Freemind 0.9 supports direct export to OpenOffice Writer File (odt).
  • To Microsoft Word 2003 To export to Microsoft Word, you need to select only the top-most node, which you want to export. Next, copy the node in Freemind and paste it into Word. this will copy the entire hierarchy starting with the selected node. This works even, when not all sub-notes were to the right of the one selected. If you would select and copy all nodes, export would end up with duplicate nodes and sub-nodes.
  • From Microsoft Word 2003 Importing from Microsoft Word ended up with a confused hierarchy. (Please, can someone try how to do this best).
  • From KeyNote To prepare a file from Keynote, save your tree structure by selecting 'Tree > Save Tree to File'. Open the created file as a text file and use select all to copy all content. In FreeMind, select a node and paste the content. FreeMind analyzes the tree structure in the file and builds a mind map.
  • From the Internet You can copy part of a web page in your browser and paste it to FreeMind. FreeMind analyzes the tree structure in the HTML and builds a mind map. The other formatting (bold, font sizes, etc.) is not taken into FreeMind.
  • To MindManager For this you will need the XSLT transformation sheets written by Christoph Rissner. This allows you to convert mind maps from FreeMind's XML format to a different XML format, which can then be directly imported to MindManager. For more detail you can read the text of the presentation Seminarwork Mind Maps (PDF) or only the abstract.
  • 'To MindManager A perhaps easier, though slightly messy, approach is to export the FreeMind map with no folded nodes to HTML. Open the HTML file in Microsoft Word and save the map as a Word file. Then open the Word file in MindManager which supports the direct import of Word files as well as other Microsoft Office documents.
  • Import and export to Emacs and Wikipedia-outlines
  • To and from Ganttproject To do this you will need the XSL conversion script. If you don't want to download the xalan package, you can use the xsl template in the zip archive on this page from within the freemind File->Export using XSLT.
  • Almost every outliner should be capable of exporting to a tab-indented outline. This can be pasted to FreeMind.
  • To and from GoalEnforcer Click the ""Software Integration"" button on GoalEnforcer Hyperfocus main window. Select ""Import from FreeMind"" or ""Export to FreeMind.""

FreeMind to FreeMind (Hoist)

Changing the root node of a map could make it much easier to print. This hoist.xsl script needs a graphical link from the actual root node to the desired root node after the hoist operation. The former parent node become a child node of the new root and the ancestor tree turns like an umbrella in the storm. Try it:

  1. select the root node and the desired new root and place a graphical link.
  2. export using hoist.xsl
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
 <xsl:template match="*|@*">
   <xsl:copy>
     <xsl:copy-of select="@*"/>
     <xsl:apply-templates/>
   </xsl:copy>
 </xsl:template>
 <xsl:template match="/map">
   <xsl:copy>
     <xsl:copy-of select="attribute_registry"/>
     <xsl:apply-templates select="//node[@ID=/map/node/arrowlink/@DESTINATION]"/>
   </xsl:copy>
 </xsl:template>
 <xsl:template match="//node[@ID=/map/node/arrowlink/@DESTINATION]">
   <xsl:copy>
     <xsl:copy-of select="*|@*"/>
     <xsl:apply-templates select="." mode="aws"/>
   </xsl:copy>
 </xsl:template>
 <xsl:template match="node" mode="aws">
   <xsl:if test="parent::node">
     <xsl:element name="node">
       <xsl:attribute name="TEXT">
         <xsl:value-of select="../@TEXT"/>
       </xsl:attribute>
       <xsl:attribute name="ID">
         <xsl:value-of select="../@ID"/>
       </xsl:attribute>
       <xsl:if test="../@BACKGROUND_COLOR">
         <xsl:attribute name="BACKGROUND_COLOR">
           <xsl:value-of select="../@BACKGROUND_COLOR"/>
         </xsl:attribute>
       </xsl:if>
       <xsl:if test="../@COLOR">
         <xsl:attribute name="COLOR">
           <xsl:value-of select="../@COLOR"/>
         </xsl:attribute>
       </xsl:if>
       <xsl:if test="../@STYLE">
         <xsl:attribute name="STYLE">
           <xsl:value-of select="../@STYLE"/>
         </xsl:attribute>
       </xsl:if>
       <xsl:if test="../@POSITION">
         <xsl:attribute name="POSITION">
           <xsl:value-of select="../@POSITION"/>
         </xsl:attribute>
       </xsl:if>
       <xsl:apply-templates select="../edge|../arrowlink|../font|../icon"/>
       <xsl:apply-templates select="preceding-sibling::node"/>
       <xsl:apply-templates select="following-sibling::node"/>
       <xsl:apply-templates select="parent::node" mode="aws"/>
       <xsl:apply-templates select="../attribute"/>
     </xsl:element>
   </xsl:if>
 </xsl:template>
</xsl:stylesheet>

  1. if you are missing something, you have to add it to the template match="node" mode="aws" (I only need edge, font, icon and attribute and don't know what else is possible.)
  2. load your new map

JR 03:32, 17 Apr 2008 (PDT)

Emacs and Wikipedia outlines ← FreeMind

There are two ways how to export FreeMind's mind map to the outline format understood by Emacs outlining mode and Wikipedia. Their descriptions follow.

Use conversion scripts

Our user has created two perl scripts for conversion between FreeMind and Emacs's outline.

  • mm2outline for Emacs outline (Perl) (This version does not work for wikipedia!)
#!/usr/bin/perl -w
use strict;

use Getopt::Std;
use XML::Simple;
use Data::Dumper qw(Dumper);

# Copyright (c) 2004 Christian Lemburg.
#
# All rights reserved. This program is free software;
# you can redistribute it and/or modify it under the
# same terms as Perl itself.

# usage

my $usage = <<'EOU';

Usage: $0 < freemind.mm > emacs-outline.txt

Options:

    h: print help
    p: outline mode heading indicator pattern atom (default "*")
    s: suppress topic of mind map as title in outline output (default off)

EOU


# setup

my %opts;
getopts('hsp:', \%opts);

die $usage if $opts{h};

my $heading_pattern_atom = $opts{p} || "*";
my $suppress_title = $opts{'s'};

my $QUOTE = "&quot;";
my $LESS_THAN = "&lt;";
my $GREATER_THAN = "&gt;";
my $NEWLINE = "&#xa;";

# action

my $xs = new XML::Simple();
my $ref = $xs->XMLin(\*STDIN);

die "Could not find mind map in input" unless exists $ref->{node};

my $start = $ref->{node};
print unquote($start->{TEXT}), "\n\n" unless $suppress_title;

my $level = 0;
process_children($start);


# subs

sub process_node {
    my ($node) = @_;
    process_node_text($node, $level);
    if (not is_leaf($node)) {
        process_children($node);
    }
}

sub process_children {
    my ($node) = @_;
    $level++;
    if (ref($node->{node}) eq "ARRAY") {
        for my $child (@{$node->{node}}) {
            process_node($child);
        }
    } else {
        my $child = $node->{node};
        process_node($child);
    }
    $level--;
}

sub process_node_text {
    my ($node, $level) = @_;
    if (is_paragraph_leaf($node)) {
        print unquote($node->{TEXT}), "\n\n";
    } else {
        print make_heading($level), " ", unquote($node->{TEXT}), "\n\n";
    }
}

sub is_leaf {
    my ($node) = @_;
    return not exists $node->{node};
}

sub is_paragraph_leaf {
    my ($node) = @_;
    # define: paragraph leaf = leaf with text that contains newlines
    return is_leaf($node) && $node->{TEXT} =~ /$NEWLINE/;
}

sub make_heading {
    my ($level) = @_;
    return $heading_pattern_atom x $level;
}

sub unquote {
    my ($s) = @_;
    $s =~ s/$QUOTE/"/g;
    $s =~ s/$LESS_THAN/</g;
    $s =~ s/$GREATER_THAN/>/g;
    $s =~ s/$NEWLINE/\n/g;
    return $s;
}
#!/usr/bin/perl
use strict;

use Getopt::Std;
use POSIX;

# Copyright (c) 2004 Christian Lemburg.
#
# All rights reserved. This program is free software;
# you can redistribute it and/or modify it under the
# same terms as Perl itself.

# usage

my $usage = <<'EOU';

Usage: $0 < emacs-outline.txt > freemind.mm

Options:

    h: print help
    l: pattern atom length (default 1)
    p: outline mode regex to recognize headings (default "^(\\*+)")
    s: show suppressed text paragraphs (default off)
    t: topic (top level node text) for mind map output (default "Start")

EOU


# setup

my %opts;
getopts('hsl:p:t:', \%opts);

die $usage if $opts{h};

my $QUOTE = "&quot;";
my $LESS_THAN = "&lt;";
my $GREATER_THAN = "&gt;";
my $NEWLINE = "&#xa;";

my $atom_length = $opts{l} || 1;
my $pattern = $opts{p} || "^(\\*+)";
my $topic = $opts{t} || "Start";
my $show_suppressed_text_paragraphs = $opts{'s'};


# action

open_map();
open_node(0, 1, $topic);

my $n;
my @l;
my $found_heading = 0;
my $text = "";

while (<>) {
    if (s/$pattern//) {

        # header number calculation
        # use only one global by using empty first place in @l
        $n = POSIX::floor(length($1) / $atom_length);
        $n < $l[0] ? @l[$n+1..$#l] = (0)x($#l-$n) : 0;

        maybe_discharge_text($n);
        maybe_close_node($n, $l[0]);
        open_node($n, $l[0], $_);

        $l[$n]++;
        $l[0] = $n;
    } else {
        accumulate_text($_);
    }
}

maybe_close_node(0, $l[0]);
close_map();


# subs

sub open_node {
    my ($n, $o, $s) = @_;
    # push, maybe multiple with empty parents
    for (my $i = 0; $i < $n - $o - 1; $i++) {
        print indent($o + $i + 1), "<node TEXT=\"\">\n";
    }
    $s =~ s/^\s+//;
    $s =~ s/\s+$//;
    print indent($n), "<node TEXT=\"", quote($s), "\">\n";
}

sub maybe_close_node {
    my ($n, $o) = @_;
    return unless $found_heading++;
    # pop, maybe multiple
    for (my $i = 0; $i < $o + 1 - $n; $i++) {
        print indent($o - $i), "</node>\n";
    }
}

sub open_map {
    print "<map>\n";
}

sub close_map {
    print "</map>\n";
}

sub indent {
    my ($l) = @_;
    # the map element is one above us
    $l++;
    return "    " x $l;
}

sub accumulate_text {
    my ($s) = @_;
    $s =~ s/\s+$//;
    $s .= $NEWLINE;
    $text .= $s;
}

sub maybe_discharge_text {
    my ($n) = @_;
    return unless $show_suppressed_text_paragraphs;
    print indent($n + 1), "<node TEXT=\"" . quote($text) . "\"/>\n"
        unless is_only_whitespace($text);
    $text = "";
}

sub quote {
    my ($s) = @_;
    $s =~ s/"/$QUOTE/g;
    $s =~ s/</$LESS_THAN/g;
    $s =~ s/>/$GREATER_THAN/g;
    return $s;
}

sub is_only_whitespace {
    my ($s) = @_;
    $s =~ s/$NEWLINE/\n/g;
    return $s =~ /\A\s*\Z/;
}


Export from Emacs with freemind.el

There is an Emacs library on EmacsWiki that exports to FreeMind:

[freemind.el]

Patch FreeMind to paste outline to clipboard

Patching the source code is sensible, only if you are a software developer. In FreeMind's source in modes/mindmapmode/!MindMapNodeModel.java replace the lines

 for (int i=0; i < depth; ++i) {
    fileout.write("    "); }
         
 if (this.toString().matches(" *")) {

with

 for (int i=0; i < depth; ++i) {
    fileout.write("*"); }  //changed
         
 fileout.write(" ");   // new
          
 if (this.toString().matches(" *")) {

and if you copy a node in FreeMind you will find an Emacs/Wiki outline in the clipboard!

See also: How to compile FreeMind

Does anybody know how to patch FreeMind that it will also import these outline? (I made an feature request out of this.)

MindManager ↔ FreeMind

Indirect MindManager 4.0 to FreeMind conversion

How I converted all my mindmanager-mindmaps to freemind in one go. This works for me. Perhaps not for you. Mindmanager 4.0: MMScript?-Editor has a problem with: Dim mm As MmImageType?

  1. Download Download XSLT transformations sheets from Christoph Rissner from http://hkrott.iicm.edu/docs/seminar/sem2002_mindmaps.tar.gz and extract. You need some of those files in step 4 an step 8.
  2. Open Mindmap in Mindmanager 2002 (With Mindmanager 4.0 I had a problem with "Dim mm As MmImageType?". You CAN use further the MMScript?-Editor after the 21-days-trial-tim)
  3. Menu->Tools->MMScript?-Editor
  4. MMScript?-Editor: Menu->Open File->exportXML.MMScript? (see step 1)
  5. Menu->Makro->Ausführen (or key "F5")
  6. (x) Export whole map, Choose destination file, (OK)
  7. Copy all xml-Files in a new directory or make of cource a backup of all your mindmaps! Sorry windows, with linux the following conversion is very easy. Perhaps do it with windows with a batch-file or something else.
  8. Save the following bash-script to "mmtofmconvert" and make it executable with "chmod a+x mmtofmconvert":
  #! /bin/sh
  # mmtofm-convert
  # Leerzeichen in Dateinamen in _ umwandeln
  for f in *\ *; do mv "$f" "`echo $f | tr \  _`"; done
  # xml-Dateien in mm umwandeln
  # Pfad zur Datei mm2fm.xslt muss angepasst werden! See step 1
  # xsltproc:  http://xmlsoft.org/XSLT/
  for f in *.xml; do xsltproc -o `basename $f .xml`.mm /home/pete/mm2fm.xslt $f; done 
  # ACHTUNG! Entferne alle xml und mmp-Dateien. 
  # Attention! Delete all xml- and mmp-files!
  #rm *.xml *.mmp  
  # Codierung von utf-8 in lokal erwünschte umwandeln. With work for me.
  recode utf-8 *.mm
  1. execute script from step 8 in every directory with the xml-files you want to transform.
  2. the exported mindmaps have exactly the same structure like the original! I am lucky.

Regards, Peter

NOTE: The above version of the XSLT script does not process the MindManager "notes" if they exist for each node. This is my first time working with XSLT, but the following ammendment to "mm2fm.xslt" worked for me (sections below added after line 55 in the template '<xsl:template match="data">'):

   <xsl:if test="boolean(note)">
       <xsl:element name="node">
               <xsl:apply-templates select="note"/>
       </xsl:element>
   </xsl:if>
 </xsl:template>
 <xsl:template match="note">
       <xsl:apply-templates select="color"/>
       <xsl:apply-templates select="text"/>
       <xsl:element name="font">
               <xsl:apply-templates select="font"/>
       </xsl:element>
 </xsl:template>

--Apalmer00 10:27, 26 Jan 2005 (PST)

Direct MindManager X5 to FreeMind conversion

I received a couple of MindManager mindmaps that I had to convert to FreeMind. These mmap files turned out to be zip-files containing an XML file with the mindmap data. So I've written a basic XSLT which directly transforms this XML to the FreeMind format without the need to install MindManager. I suppose a convenient Import from MindManager could thus be provided in FreeMind using this info/xslt. I also suppose that this XSLT could be extended to transform additional specifics like edge-color, edge-width, etc, but I could not immediately figure out where such data is stored in MindManager's XML, as I do not have MindManager.

Q: How does one actually use the XSLT? E.g. I have an mmap, how do I open it in FreeMind?

NB: I changed "concat(#, below to "concat('#', below to make it work. I also used jar xf file.mmap to extract the files.

 <?xml version="1.0" encoding="iso-8859-1"?>
 <xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     xmlns:ap="http://schemas.mindjet.com/MindManager/Application/2003"
 >
       <xsl:output
         method="xml"
       version="1.0"
       encoding="iso-8859-1"
       omit-xml-declaration="yes"
       indent="yes"
       />     
   <xsl:template match="/">
     <xsl:element name="map">
       <xsl:attribute name="version">0.7.1</xsl:attribute>
       <xsl:apply-templates select="ap:Map/ap:OneTopic/ap:Topic" />
     </xsl:element>
   </xsl:template>
   <xsl:template match="ap:Topic">
     <xsl:element name="node">
       <xsl:attribute name="TEXT">
         <xsl:value-of select="ap:Text/@PlainText" />
       </xsl:attribute>        <xsl:if test="ap:Text/ap:Font/@Color">
         <xsl:attribute name="COLOR">
           <xsl:value-of select="concat('#', substring(ap:Text/ap:Font/@Color, 3, 6))" />
         </xsl:attribute>
       </xsl:if>
       <xsl:variable name="OId" select="@OId" />
       <xsl:variable name="relation" select="/ap:Map/ap:Relationships/ap:Relationship[ap:ConnectionGroup[@Index=0]/ap:Connection/ap:ObjectReference/@OIdRef=$OId]" />
       <xsl:if test="$relation">
         <xsl:variable name="toId" select="$relation/ap:ConnectionGroup[@Index=1]/ap:Connection/ap:ObjectReference/@OIdRef" />
         <xsl:element name="arrowlink">
           <xsl:attribute name="ENDARROW">Default</xsl:attribute>
           <xsl:attribute name="DESTINATION">
             <xsl:value-of select="$relation/ap:ConnectionGroup[@Index=1]/ap:Connection/ap:ObjectReference/@OIdRef" />
           </xsl:attribute>
           <xsl:attribute name="STARTARROW">None</xsl:attribute>
         </xsl:element>
       </xsl:if>
       <xsl:variable name="toId" select="/ap:Map/ap:Relationships/ap:Relationship/ap:ConnectionGroup[@Index=1]/ap:Connection/ap:ObjectReference[@OIdRef=$OId]/@OIdRef" />
       <xsl:if test="$toId">
         <xsl:attribute name="ID">
           <xsl:value-of select="$toId" />
         </xsl:attribute>
       </xsl:if>
       <xsl:apply-templates select="ap:SubTopics"/>
     </xsl:element>
   </xsl:template>
 </xsl:stylesheet>

Here is an online conversion utility (using the above XSLT) that will convert a .mmap file to Freemind format:

   http://www.liberatedcomputing.org/mm2fm

Q: How can I convert a mmap file with non-latin characters, such as Chinese and Japanese characters? Those words and sentenses will became several Question Marks!

NB: Please check your JVM default property "file.encoding".

   String defaultEncodingName = System.getProperty( "file.encoding" );
   System.out.println(defaultEncodingName);

Since "mmap" file's encoding is "UTF8", so that we have to use "UTF8" with "file.encoding" property. I straightly change the startup script to support it.

E.g: In Windows Version, it has a "freemind.bat".

java -Dfile.encoding=UTF8 -cp lib\freemind.jar;...

Mmap format is a jar file

MindManager's file format of .mmap files is a zipped file:

/home/dgriff> jar tvf Requirements.mmap
  1782 Mon Jun 14 15:00:38 BST 2004 bin/C96CF30F-3F6E-460B-8D5A-ED5F65E852D4.bin
102572 Mon Jun 14 15:00:38 BST 2004 Document.xml
  2265 Mon Jun 14 15:00:38 BST 2004 xsd/MindManagerDelta.xsd
 48314 Mon Jun 14 15:00:38 BST 2004 xsd/MindManagerApplication.xsd
     0 Mon Jun 14 15:00:38 BST 2004 xsd/
  5037 Mon Jun 14 15:00:38 BST 2004 xsd/MindManagerCore.xsd
     0 Mon Jun 14 15:00:38 BST 2004 bin/
 13615 Mon Jun 14 15:00:38 BST 2004 xsd/MindManagerPrimitive.xsd
 13518 Mon Jun 14 15:00:38 BST 2004 Preview.png

Dave Griffiths

---

If that is the case, it should be possible to create XSLT that converts directly between FreeMind's and MindManager's XML. Additionally, one should be also able to get the contents of .mmap by renaming a copy of it to .zip and opening in favorite zip application.

An advantage of this approach should be obvious; you don't need MindManager to covent a MindManager's map to FreeMind's map. Therefore, you do it on any operating system you like.

This all surely does apply only from certain version of MindManager above. That should be clarified.

It is not true for files saved using MindManager 4.0 Standard Edition.

Importing Mindmap from Mindmanager directly into Freemind 0.9b9

Starting with freemind 0.9 b9 (?) it became possible to import a Mmap-File directly

To convert notes from Mindmanager to Freemind notes you have to replace the following lines in mindmanager2mm.xsl

 <xsl:template match="ap:NotesGroup">		
 	<xsl:element name="hook">
 		<xsl:attribute name="NAME">
 			<xsl:text>accessories/plugins/NodeNote.properties</xsl:text>
 		</xsl:attribute>
 		<xsl:element name="text">
 			<xsl:value-of select="ap:NotesXhtmlData/@PreviewPlainText"/>
 		</xsl:element>
 	</xsl:element>
 </xsl:template>

with

 <xsl:template match="ap:NotesGroup">		
 	<richcontent TYPE="NOTE"><html>
 	  <head>		    
 	  </head>
 	  <body>
 	    <p>
 		<xsl:value-of select="ap:NotesXhtmlData/@PreviewPlainText" disable-output-escaping="yes" />
 	    </p>
 	  </body>
 	</html>
 	</richcontent>
 </xsl:template>

To fix problems with character encoding

Try to change the encoding="UTF-8" to encoding="iso-8859-1" in the xslt sheet posted above.

Text → FreeMind

Wouter Bolsterlee wrote a small tool named Text-to-Freemind. This program converts tab-indented text files into an XML format suitable for display by FreeMind. It was written out of annoyance with the FreeMind user interface, and the lack of ‘merging’ capabilities when collaborating with other people. More information, including an example and download links, is available from Wouter Bolsterlee's blog entry on Text-to-Freemind.

CSV text ← FreeMind

This is an XSLT to output a Freemind mind map as a CSV text file with extra commas to represent the hierarchy. This is useful for importing into Excel to represent the nesting of nodes as a colum view.

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>
 <xsl:template match="/">
 <xsl:apply-templates/>
 </xsl:template>
  <xsl:template name="linebreak">
   <xsl:text> 
</xsl:text>
  </xsl:template>
  <xsl:template match="map">
   <xsl:apply-templates select="child::node"/>
  </xsl:template>
  <xsl:template match="node">
   <xsl:param name="commaCount">0</xsl:param>
    <xsl:if test="$commaCount > 0">
      <xsl:call-template name="writeCommas">
       <xsl:with-param name="commaCount" select="$commaCount"/>
      </xsl:call-template>
    </xsl:if>
    <xsl:value-of select="@TEXT"/>
     <xsl:call-template name="linebreak"/>
      <xsl:apply-templates select="child::node">
        <xsl:with-param name="commaCount" select="$commaCount + 1"/>
      </xsl:apply-templates>
     </xsl:template>
     <xsl:template name="writeCommas">
      <xsl:param name="commaCount">0</xsl:param>
       <xsl:if test="$commaCount > 0">,<xsl:call-template name="writeCommas">
         <xsl:with-param name="commaCount" select="$commaCount - 1"/>
     </xsl:call-template>
    </xsl:if>
 </xsl:template>
</xsl:stylesheet>

Developed by Mike Bell at Simulacra.

If you have issues with accuented characters not being transferred correctly in Excel, you can do the following:

  1. save the exported file as somename.txt (instead of somename.csv)
  2. start Excel
  3. menu point File -> Open...
  4. choose "Files of Type" = Text Files (...*.txt...)
  5. then you get a dialogue where you can choose the "File Origin", which in Western Europe and USA is most probably one of Unicode (UTF-8) or Western European (ISO or Windows, I'd guess). Anyway, change the "origin" (correctly it's called charset) until the accents in the preview window are correctly shown.

Something similar should work under oocalc from OpenOffice.

Alternatively, one could also try to add an "encoding" parameter to the "output" element of the XSLT sheet, like in Zvon's XSLT Reference.

Tabulator separated text ← FreeMind

This is a modification of the above XSLT script to output a FreeMind map as a tabulator separated text file with the first column represent the hierarchy, the 2nd the path as 1.1.1 number, followed by the node title and the attribute value pairs (FreeMind 0.9.0 beta16) which are present in the attribute_registry. This is extremely useful if you keep the position of your attributes constant over the whole tree! Importing into Calc or Excel is straight forward.

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>
 <xsl:template name="linebreak">
  <xsl:text> 
</xsl:text>
 </xsl:template>
   <xsl:template name="tabulator">
  <xsl:text>	</xsl:text>
 </xsl:template>
 <xsl:template match="map">
  <xsl:apply-templates select="child::node"/>
 </xsl:template>
 <xsl:template match="attribute">
    <xsl:value-of select="@NAME"/>
    <xsl:text> =</xsl:text>
    <xsl:call-template name="tabulator"/>
     <xsl:value-of select="@VALUE"/>
    <xsl:call-template name="tabulator"/>
</xsl:template>  
 <xsl:template match="node">
   <xsl:value-of select="count(../ancestor-or-self::node)" />
   <xsl:call-template name="tabulator"/>
   <xsl:number count="node" level="multiple" format="1.1"/>
   <xsl:call-template name="tabulator"/>
   <xsl:value-of select="@TEXT"/>
   <xsl:call-template name="tabulator"/>
   <xsl:apply-templates select="child::attribute[@NAME=//attribute_registry/attribute_name/@NAME]"/>
   <xsl:call-template name="linebreak"/>
   <xsl:apply-templates select="child::node">
   </xsl:apply-templates>
 </xsl:template>
</xsl:stylesheet>

JR 07:38, 20 Mar 2008 (PDT)

VYM → FreeMind

The following XSLT converts an XML export file from VYM to freemind format (only links, Icons and colors are preserved):

 <xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 
 <xsl:template match="/">
 	<xsl:apply-templates select="/vymmap/mapcenter" />
 </xsl:template>
 
 <xsl:template match="/vymmap/mapcenter">
 	<map version="0.8.0">
 		<node ID="_" TEXT="map imported from VYM">
 		<xsl:apply-templates select="branch" />
 		</node>
 	</map>
 </xsl:template>
 
 <xsl:template match="branch">
 	<node CREATED="0" MODIFIED="0">
 		<xsl:attribute name="TEXT">
 			<xsl:value-of select="heading" />
 		</xsl:attribute>
 		<xsl:attribute name="COLOR">
 			<xsl:value-of select="heading/@textColor" />
 		</xsl:attribute>
 		<xsl:if test="@url != ''">
 			<xsl:attribute name="LINK">
 				<xsl:value-of select="@url" />			
 			</xsl:attribute>
 		</xsl:if>
 		<xsl:attribute name="ID">VYM_<xsl:value-of select="@x1" />_<xsl:value-of select="@y1" /></xsl:attribute>
 		<xsl:apply-templates select="standardflag" />		
 		<xsl:apply-templates select="branch" />
 	</node>
 </xsl:template>
 
 <xsl:template match="standardflag">
 	<xsl:choose>
 		<xsl:when test=". = 'lifebelt'"><icon BUILTIN="flag"/></xsl:when>
 		<xsl:when test=". = 'flash'"><icon BUILTIN="clanbomber"/></xsl:when>
 		<xsl:when test=". = 'heart'"><icon BUILTIN="bookmark"/></xsl:when>
 		<xsl:when test=". = 'thumb-down'"><icon BUILTIN="button_cancel"/></xsl:when>
 		<xsl:when test=". = 'thumb-up'"><icon BUILTIN="button_ok"/></xsl:when>
 		<xsl:when test=". = 'arrow-down'"><icon BUILTIN="full-7"/></xsl:when>
 		<xsl:when test=". = 'arrow-up'"><icon BUILTIN="full-1"/></xsl:when>
 		<xsl:when test=". = 'lamp'"><icon BUILTIN="idea"/></xsl:when>
 		<xsl:when test=". = 'clock'"><icon BUILTIN="bell"/></xsl:when>
 		<xsl:when test=". = 'smiley-sad'"><icon BUILTIN="button_cancel"/></xsl:when>
 		<xsl:when test=". = 'smiley-good'"><icon BUILTIN="ksmiletris"/></xsl:when>
 		<xsl:when test=". = 'stopsign'"><icon BUILTIN="stop"/></xsl:when>
 		<xsl:when test=". = 'cross-red'"><icon BUILTIN="button_cancel"/></xsl:when>
 		<xsl:when test=". = 'hook-green'"><icon BUILTIN="button_ok"/></xsl:when>
 		<xsl:when test=". = 'questionmark'"><icon BUILTIN="help"/></xsl:when>
 		<xsl:when test=". = 'exclamationmark'"><icon BUILTIN="messagebox_warning"/></xsl:when>
 	</xsl:choose>
 </xsl:template>
 
 </xsl:transform>

McRee 03:12, 14 Nov 2006 (PST)

Mantis bug tracker → FreeMind

Importing issues from the Mantis bug tracker to FreeMind:

There is a script to export issues from mantis to FreeMind. See http://bugs.mantisbt.org/view.php?id=7214

Mantis 1.12 ships with integrated freemind support: "This is similar to the relationship diagrams are already available in Mantis. However, the Freemind features comes with a built in Flash viewer (hence, easier to get up and running), includes details about the issues, relationships, attachments, statuses, links, etc. It is also possible to export a Freemind file." [1]

FreeMind export to Microsoft Office 2003 and newer

Export works only with Microsoft office versions able to read XML formats, i.e. 2003 and newer (one reason why PowerPoint isn't supported is because it doesn't know any XML format).

Export to Excel

Use the menu File -> Export -> using XSLT... Browse to find the XSL file under the sub-directory accessories of FreeMind's base directory called "mm2xls_utf8.xsl", call your ExportFile "something.xls" and Excel will open it by a simple double click on the resulting file.

Export to Word

A very similar procedure can be used for word documents with the XSLT sheet called mm2wordml_utf8.xsl (call the export file something.doc).

    • This seems to generate empty documents with Freemind 0.9.0 beta 12 on Windows XP. [Mike B 26 Feb 2009]

Export to MS Project

See also the following chapter for much more detailed treatment.

For MSProject files using mm2msp_utf8.xsl, it's a bit more tricky as you need to name the export file something.xml and open it from MS Project using "XML file, *.xml" as file type.

Microsoft Project ↔ FreeMind

From MS Project

I've been using a perl module Media:MindMap.pm to import from Microsoft Project into Freemind. Microsoft Project is useful, but cluttered. Large projects are, in my experience, difficult to examine. On the other hand, Microsoft Project supports reading via OLE, and thus can be rendered into Freemind which can be more useful because it is less cluttered, and more flexible. (Downside: this requires an executable copy of Microsoft Project on the host on which it is executed.)

Sample script Media:mpp2mm.pl -- this converts a project plan into Freemind map using the work breakdown structure field. Completed tasks get the check icon, and the notes field is a note on the task.

Alternate approach Media:generateOrgChart.pl -- this was designed for a plan in which field Text7 contained organizational information. The project plan was converted into a Freemind map where the top branching encoded task status (one of: "expired but not complete", "at risk", "due in 30 days", "due in 60 days", "due in 90 days", "weird" [things like start date in the future but some work accomplished], "normal"), then branch by Text7, possibly delimited, then branch by resource, then display the task.

Another approach I've implemented was to index via a concordance -- top layer tier an alphabet, then below that key words, then the tasks that contain those key words. Because the perl module makes it easy to create a new map, put nodes below other nodes, etc, other possibilities will probably suggest themselves.

To MS Project

An XSLT stylesheet to transform a FreeMind mindmap into a XML file that can be opened within MS Project as a project.

>>> TESTED ONLY WITH "MS PROJECT 2003 e 2007"! <<<

  1. Copy and paste this code using an editor such as notepad
  2. Save the file with the XSLT extension
  3. In pull-down menu use "File->Export->Using XSLT..." (Do not forget that you must export using the XML extension)
  <?xml version="1.0" encoding="iso-8859-1"?>
  
  
  <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="xml" version="1.0" indent="yes" />
  
  <xsl:template match="/">
    <Project xmlns="http://schemas.microsoft.com/project">
      <Name>Project1</Name>
      <Author>Freemind2MSProject Conversor</Author>
      <Tasks>
        <Task>
          <UID>0</UID>
          <ID>0</ID>
          <Type>1</Type>
          <IsNull>0</IsNull>
          <WBS>0</WBS>
          <OutlineNumber>0</OutlineNumber>
          <OutlineLevel>0</OutlineLevel>
          <FixedCostAccrual>3</FixedCostAccrual>
          <RemainingDuration>PT8H0M0S</RemainingDuration>
        </Task>
  
        <xsl:apply-templates select="map/node" />
      </Tasks>
    </Project>   
  </xsl:template>
  
  <xsl:template match="node">
    <xsl:variable name="outlineLevel" select="(count(ancestor::node())-1)"/>
  
    <Task>
      <UID>1</UID>
      <ID>1</ID>
      <Name><xsl:value-of select="@TEXT"/></Name>
      <Type>1</Type>
      <IsNull>0</IsNull>
      <OutlineNumber>1</OutlineNumber>
      <OutlineLevel><xsl:value-of select="$outlineLevel"/></OutlineLevel>
      <FixedCostAccrual>3</FixedCostAccrual>
      <RemainingDuration>PT8H0M0S</RemainingDuration>
    </Task>
  
    <xsl:apply-templates select="node"/>
  </xsl:template>
    
  </xsl:stylesheet>

Regards,

Mauro Alexandre

PS (by lafs.info): I used the same code Mauro posted to covert .mm file into a MS Project file. I´m using MS Project 2007 in brazilian portuguese. I removed two spaces in all lines, before it the .xsl file didn´t work!


PREVIOUS SOLUTION: Posted from help forum

PPS (by mlflanagan): Great contribution from Mauro, thanks. I modified the xsl file to also export notes from the .mm file. Changes are in bold:

     ...
     <RemainingDuration>PT8H0M0S</RemainingDuration>
     <xsl:apply-templates select="hook"/>
   </Task>
   <xsl:apply-templates select="node"/>
 </xsl:template>
 <xsl:template match="hook">
   <Notes><xsl:value-of select="text"/></Notes>
 </xsl:template>

ALSO: to be clear about how to export:

  1. Copy this code and save it to a file such as mm2project.xsl.
  2. In Freemind, select File --> Export --> Using XSLT ...
  3. Browse for the xsl file (mm2project.xsl) in the "choose XSL file" field.
  4. Browse to your target folder and name the exported file, such as project.xml. Note: The filename MUST have a .xml extension!
  5. Press the Export button to create the export file.
  6. Open the file with MS Project (using File --> Open ...).
  7. Follow the MS Project dialog to open the file.
  8. "Save as" to the standard .mpp format.

3D Topicscape ↔ FreeMind

3D Topicscape Pro and the Student Edition (SE is free as in beer) have built-in conversion to and from FreeMind (0.9.0).

If you make extensive use of FreeMind attributes for your own purposes, Topicscape won't know about them, and they will not be carried back again, but for a straightforward mindmap it seems to maintain integrity both ways. Topicscape can express structures that FreeMind can't (like multiple parents for one child and loose associations). The conversion translates these into color-coded curved lines with a single arrowhead and re-interprets this back to the multi-parent type of relationship on re-import.

FreeMind to 3D Topicscape conversion

This allows a 3D mindmap to be built from a 2D FreeMind mindmap.

  1. File menu->Import
  2. Radio button: Other products and select FreeMind (.mm) from the drop down
  3. Radio button: Choose whether you want a new Topicscape to be built, or a floating topic in the currently-open Topicscape
  4. Give the full file path to the FreeMind file, including the file's name - explicitly or by browsing to it.
  5. Press OK
  6. If you selected the new Topicscape radio button, you will then see the dialog that lets you choose the new Topicscape's name and where it is to be placed. Make the selections you want and press OK. After a pause, you will either see the new Topicscape as a 3D landscape, or perhaps a report about files in the FreeMind map that cannot be found at their expected locations. The report panel provides options for dealing with this and once handled, you're done. The hierarchy defined in the FreeMind mindmap will now be represented in 3D.
  7. If you selected the floating topic radio button, you will next see the "Create New Topic" panel. Please name the topic. Use Hint if you wish to see if there is a similarly-named topic present in the Topicscape. Press Add. Drag the small red cone to its new parent, and drop it there. You're done. The 3D structure defined in the FreeMind mindmap will now be represented in 3D.

NOTE: The above process will not be able to handle any user-defined attributes on the nodes.

3D Topicscape to FreeMind conversion

This allows a FreeMind (0.9.0) mindmap to be built from a 3D Topicscape.

  1. File menu->Export
  2. Radio button: XML and select FreeMind (.mm) from the drop down (currently it's the only one).
  3. Check boxes: Select which components to export. Topics at least must be exported (a topic will become a node). Occurrences will become attachments. Descriptions and Association details will become added attributes.
  4. Give the full file path to where the FreeMind file is to be placed, including the file's name - explicitly or by browsing to it. The Topicscape's name is used as a default.
  5. Press OK. A panel shows progress and completion will be announced.
  6. If you used the color scheme in Topicscape that allows each topic to be assigned a color automatically, the colors will be transferred (approximately) to the FreeMind map.

NOTE: The above process makes specific Topicscape attributes on the FreeMind nodes. To preserve the original Topicscape's integrity if you contemplate re-importing the mindmap to Topicscape, you need to avoid changing these atributes. The export may make double-headed gray lines and single-headed red lines. These are used to record multi-parent topics and loose associations. If you change them, then on any re-import to Topicscape, the structure will reflect those changes.

3D Topicscape ↔ FreeMind round-trip

You can import to Topicscape and re-export to FreeMind - back and forth round trips are supported, provided you take into account the information in the NOTE paragraphs above. The Topicscape on-line manual has an entry about these conversions here: - http://www.topicscape.com/Topicscape-Pro/usersguide/help.php?page=132


Freemind to physically rearrange Folder and Files structure

This presents a method to copy directory/files structure under windows with a structure defined as a Freemind map. It uses copy/paste from freemind to MSword then a Visual basic script.


1- Import the existing directory/directories structure with freemind (File-> Import-> Folder Structure). Each final node has a link (ctrl+k) to the real file. It is preferable to set the preferences links path to absolute (Preferences -> Appearence -> Links = absolute)

2- Rearrange the file structure. The node description represents the name of the file and can be modified in order to rename the file or directory. The file then will be copied under the new name. It is important NOT to update the link of nodes as the are the only information in freemind about the real file location. To delete a file or directory, just delete it from the map and it will not be copied to the new file system.

3- copy the branch/map to MSWord. I obtain a outlined and tabulated text like :

       My Music <file:/C:/Documents and Settings/xxx/My Documents/My Temp/Music/>
           give it to me
               give it to me.mp3 <file:/C:/Documents and Settings/xxx/My Documents/My Temp/Music/give it to me.mp3>

4- add the following macro to the word document


Sub freemind_exportFolder()
'
' exportFolder Macro
' Macro recorded 11/24/2004 by fbanag
'
Dim current_depth As Long
Dim previous_depth As Long
Dim diff_depth As Long
' Define the Root directory
ChDir ActiveDocument.Path
Selection.GoTo what:=wdGoToLine, which:=wdGoToFirst ' start from beginning
  
unit_indent = 17.5 'to be updated for the .dot used
previous_depth = -100

Do
   Selection.EndOf unit:=wdParagraph, Extend:=wdExtend
   
   ' Depth extraction, use the outline level
   current_indent = Selection.Paragraphs(1).LeftIndent
   current_depth = current_indent / unit_indent
   current_outline = Selection.Paragraphs(1).OutlineLevel
   
   ' Update the unit_indent when outline is < 8
   If current_outline < 8 And current_outline > 1 Then
       unit_indent = current_indent / (current_outline - 1)
   End If
   
   
   ' Calculate the change in depth
   diff_depth = current_depth - previous_depth
   
   ' Update the directory level
   If diff_depth = 1 Then
       ChDir node_name
   Else
       Do While diff_depth < 0
           ChDir "./.."
           diff_depth = diff_depth + 1
       Loop
   End If
   previous_depth = current_depth
   
   'remove the last character of the selection
   Selection.MoveRight unit:=wdCharacter, Count:=-1, Extend:=wdExtend
   ' define if is directory or file
   directory_node = 0
   If Selection.Text Like "*<file:*" Then 'include the path
       'check if directory
       If Selection.Text Like "*/>" Then
           directory_node = 1
       End If
       ' extract the node name
       Selection.MoveEndUntil Cset:="<", Count:=wdBackward
       Selection.MoveRight unit:=wdCharacter, Count:=-2, Extend:=wdExtend
       
   Else
       directory_node = 1
   End If
   node_name = Selection.Text    
   ' check now if the selection is a file
   If directory_node = 0 Then
       ' selectionne the path
       Selection.EndOf unit:=wdParagraph, Extend:=wdExtend
       With Selection.Find
           .Text = "<file:/"
           .Replacement.Text = ""
           .Forward = True
           .Wrap = wdFindAsk
           .Format = False
           .MatchCase = False
           .MatchWholeWord = False
           .MatchWildcards = False
           .MatchSoundsLike = False
           .MatchAllWordForms = False
       End With
       Selection.Find.Execute
       Selection.Collapse Direction:=wdCollapseEnd
       Selection.MoveEndUntil Cset:=">", Count:=wdForward
       filepath = Selection.Text
       
       ' using the name written in the freeemind
       
       'FileCopy
       FileCopy filepath, node_name
       
   Else ' if not, then it is a directory
       asc_code = Asc(node_name)
       
       ' Check no empty name
       If node_name Like "o" Or node_name Like "" Then
           node_name = "NewFolder"
       End If
       
   
       ' create a directory
       ' doesn't handle the duplicate folder names at the same level and the end of file
       ' I will have to add that (a day)
       If Asc(node_name) <> 13 Then
           MkDir node_name
       End If
   End If
       
Loop While Selection.MoveDown(unit:=wdParagraph, Count:=1)
End Sub

5 - place the word file in the new root directory where You want files to be copied (don't forget to save the word document)

6 - run the macro

Known issues : - the script stops with an error message if there is special characters in the file name or path - the script stops if exists two files with the same name under the same directory

This method and script has plenty of room for improvement, but it has been good enough for my task of reorganizing hundred of files (result of years of filling up several hard drives). It is a task I would not even have started without the existence of freemind. Thank You to the Freemind team.


FreeMind to ECCO

If a branch is copied and pasted directly in ECCO PRO, a well appreciated and freely available PIM (http://en.wikipedia.org/wiki/Ecco_Pro).

The mindmap structure is gracefully transformed in an outline and can be printed in a professional way

FreeMind to IIS

By: gobinathoss

Hi,

i need help to view the freemind file through IIS website

i am getting the following error: This URL is malformed! no protocol: myfreemind.mm

myfreemind.mm is my file name located in the IIS server

...

I got the solution


1 ) copy freemindbrowser.html, freemindbrowser.jar and <yourmap>.mm to some folder

2 ) go to IIS, right-click on your web site and choose properties. Go to HTTP Headers tab and click on MIME Types. Add the following MIME type :

extension : mm MIME type : application/freemind

Thanks S.Gobinath

OpenOffice Writer to FreeMind

Sometimes it's useful to be able to create a FreeMind mind map from an OpenOffice writer document. The OpenOffice macro below does precisely this. It will extract all paragraphs of format "Heading 1" to "Heading 5" and create a .mm document that can be opened by FreeMind. The only constraint is that the Writer document must be correctly structured, with all heading levels correctly nested i.e. you can't go from "Heading 1" directly to "Heading 3". I hope you find this macro useful!


Sub headingsToMindMap
	newline = CHR$( 10 )
	headings = ""
	Dim levels(10)
	levels(0) = "</node>" & newline
	levels(1) = "</node></node>" & newline
	levels(2) = "</node></node></node>" & newline
	levels(3) = "</node></node></node></node>" & newline
	levels(4) = "</node></node></node></node></node>" & newline
	levels(5) = "</node></node></node></node></node></node>" & newline
	oldLevel = 1
	level = 1

	outURL = ThisComponent.getURL() & ".mm"
	n = FreeFile()
	open outURL for output access write as #n
	enum = ThisComponent.Text.CreateEnumeration()
	headings = "<map version=""0.8.0"">" & newline
	Do While enum.hasMoreElements()
		par = enum.nextElement()
		if par.supportsService("com.sun.star.text.Paragraph") Then

			style = par.ParaStyleName
			if StrComp("Heading 1", style) = 0 Then
				headings = headings & "   <node TEXT=""" &  par.getString() & """>" & newline
				level = 1
			End If
			if StrComp("Heading 2", style) = 0 Then
				level = 2
				if (level <= oldLevel) Then
					headings = headings & levels( oldLevel - level)
				End If
				headings = headings & "      <node POSITION=""right"" TEXT=""" & par.getString() & """>"
			End If
			if StrComp("Heading 3", style) = 0 Then
				level = 3
				if (level <= oldLevel) Then
					headings = headings & levels( oldLevel - level)
				End If
				headings = headings & "         <node POSITION=""right"" TEXT=""" & par.getString() & """>" & newline
			End If
			if StrComp("Heading 4", style) = 0 Then
				level = 4
				if (level <= oldLevel) Then
					headings = headings & levels( oldLevel - level)
				End If
				headings = headings & "            <node POSITION=""right"" TEXT=""" & par.getString() & """>" & newline
			End If
			if StrComp("Heading 5", style) = 0 Then
				level = 5
				if (level <= oldLevel) Then
					headings = headings & levels( oldLevel - level)
				End If
				headings = headings & "               <node POSITION=""right"" TEXT=""" & par.getString() & """>" & newline5
			End If
					
			oldLevel = level			
		End If
	Loop

	headings = headings & levels( level - 1)


	headings = headings & " " & newline & "</map>"
	MsgBox CStr( headings )
	print #n headings
	close #n
End Sub