Lynn Rees avatar Lynn Rees committed 0c9ae15

- split

Comments (0)

Files changed (103)

 	<classpathentry combineaccessrules="false" kind="src" path="/freeplane_uitest"/>
 	<classpathentry combineaccessrules="false" kind="src" path="/Groovy"/>
 	<classpathentry combineaccessrules="false" kind="src" path="/JOrtho_0.4_freeplane"/>
-	<classpathentry kind="output" path="build"/>
+	<classpathentry kind="output" path="scripts"/>
 </classpath>

part/_AttrsToChildren.groovy

+c.selecteds.each {
+	it.attributes.names.eachWithIndex { an, idx ->
+		def child = it.createChild(idx)
+		if (an == 'note')
+			child.note = it[an]
+		else
+			child.object = an
+		child.details = it[an]
+	}
+	it.attributes.clear()
+}

part/_CapitalizeNode.groovy

+c.selecteds.every { it.text = it.plainText.capitalize() }

part/_ChildrenToAttrs.groovy

+c.selecteds.each {
+	it.children.eachWithIndex { nc, idx ->
+		if (nc.details)
+			it.attributes.add(nc.plainText, nc.details)
+		else if (nc.link)
+			it.attributes.add(nc.plainText, nc.link)
+		if (nc.note)
+			it['note'] = nc.note
+		nc.delete()
+	}
+}

part/_JoinAndReplaceFirst.groovy

+def mark = ui.showInputDialog(node.delegate, 'Enter characters to join nodes and replace first node on...', '')
+c.selecteds.first().text = c.selecteds.tail().collect {
+	it.plainText.trim()
+}.join(mark ? mark : '')
+c.selecteds.tail().each { it.delete() }

part/_JoinAndReplaceLast.groovy

+def mark = ui.showInputDialog(node.delegate, 'Enter characters to join nodes and replace first node on...', '')
+c.selecteds.last().text = c.selecteds.head().collect {
+	it.plainText.trim()
+}.join(mark ? mark : '')
+c.selecteds.head().each { it.delete() }

part/_JoinOnChars.groovy

+joinPrompt(c, ui, node, 'Enter characters to join nodes on...')

part/_JoinOnComma.groovy

+joinText(c, node, ', ')

part/_JoinOnPeriod.groovy

+joinText(c, node, '. ')

part/_JoinOnSpace.groovy

+joinText(c, node, ' ')

part/_LocalLinkBack.groovy

+c.find {
+	it.text == node.text && it.id != node.id
+}.each { it.link.setText('#' + node.id) }

part/_LowerCaseNode.groovy

+c.selecteds.every { it.text = it.plainText.toLowerCase() }

part/_SplitBeforeChars.groovy

+
+splitPrompt(ui, node, '(?=', 'Enter characters to split node text before...')

part/_SplitOnChars.groovy

+
+splitPrompt(ui, node, '', 'Enter characters to split node text on...')

part/_SplitOnComma.groovy

+
+splitText(c, ',')
+

part/_SplitOnPeriod.groovy

+
+splitText(c, '\\.')

part/_SplitOnSpace.groovy

+
+splitText(c, ' ')

part/_SyncStyleWithIcons.groovy

+def thisStyle = node?.style?.style
+def thisIcons = node?.icons?.icons
+def styleIcons = thisStyle ? node?.style?.styleNode?.icons?.icons : null
+c.selecteds.findAll { it?.id != node?.id }.each {
+   if (thisStyle)
+      it?.style?.style = thisStyle
+    // sync any local icons
+    if (thisIcons)
+      thisIcons?.every { icon -> it?.icons?.add(icon) }
+    // sync any style icons
+     if (styleIcons)
+       styleIcons?.every { icon -> it?.icons?.add(icon) }
+}

part/_TrimFirstChars.groovy

+
+trimPrompt(c, ui, node, '^{1}', true, 'Enter characters to trim from start of node text...')

part/_TrimLastChars.groovy

+
+trimPrompt(c, ui, node, '{1}$', false, 'Enter characters to trim from end of node text...')

part/_UpperCaseNode.groovy

+c.selecteds.every {	it.text = it.plainText.toUpperCase() }
+#! /bin/sh
+hg pull ssh://hg@bitbucket.org/lcrees/freeplane-scripts
+hg pull git+ssh://git@github.com/kwarterthieves/freeplane-scripts.git
+#! /bin/sh
+hg push ssh://hg@bitbucket.org/lcrees/freeplane-scripts
+hg push git+ssh://git@github.com/kwarterthieves/freeplane-scripts.git

scripts/AttrsToChildren.groovy

-// @CacheScriptContent(true)
-// @ExecutionModes({ON_SINGLE_NODE})
-
-def attrsToChildren(c) {
-	c.selecteds.each {
-		it.attributes.names.eachWithIndex { an, idx ->
-			def child = it.createChild(idx)
-			if (an == 'note')
-				child.note = it[an]
-			else
-				child.object = an
-			child.details = it[an]
-		}
-		it.attributes.clear()
-	}
-}
-
-attrsToChildren(c)

scripts/CapitalizeNode.groovy

-// @CacheScriptContent(true)
-// @ExecutionModes({ON_SINGLE_NODE})
-
-c.selecteds.every {
-	it.text = it.plainText.capitalize()
-}

scripts/ChildrenToAttrs.groovy

-package scripts
-// @CacheScriptContent(true)
-// @ExecutionModes({ON_SINGLE_NODE})
-
-def childrenToAttrs(c) {
-	c.selecteds.each {
-		it.children.eachWithIndex { nc, idx ->
-			if (nc.details)
-				it.attributes.add(nc.plainText, nc.details)
-			else if (nc.link)
-				it.attributes.add(nc.plainText, nc.link)
-			if (nc.note)
-				it['note'] = nc.note
-			nc.delete()
-		}
-	}
-}
-
-childrenToAttrs(c)

scripts/JoinAndReplaceFirst.groovy

-// @CacheScriptContent(true)
-// @ExecutionModes({ON_SINGLE_NODE})
-
-def joinAndReplaceFirst(mark) {
-    c.selecteds.first().text = c.selecteds.tail().collect {
-		it.plainText.trim()
-	}.join(mark)
-    c.selecteds.tail().each { it.delete() }
-}
-
-def joinPrompt(msg) {
-	def mark = ui.showInputDialog(node.delegate, msg, '')
-	joinAndReplaceFirst(mark ? mark : '')
-}
-
-joinPrompt('Enter characters to join nodes and replace first node on...')

scripts/JoinAndReplaceLast.groovy

-// @CacheScriptContent(true)
-// @ExecutionModes({ON_SINGLE_NODE})
-
-def joinAndReplaceLast(mark) {
-    c.selecteds.last().text = c.selecteds.head().collect {
-		it.plainText.trim()
-	}.join(mark)
-    c.selecteds.head().each { it.delete() }
-}
-
-def joinPrompt(msg) {
-	def mark = ui.showInputDialog(node.delegate, msg, '')
-	joinAndReplaceLast(mark ? mark : '')
-}
-
-joinPrompt('Enter characters to join nodes and replace first node on...')

scripts/JoinOnChars.groovy

-// @CacheScriptContent(true)
-// @ExecutionModes({ON_SINGLE_NODE})
-
-def joinText(c, node, mark) {
-    node.text = c.selecteds.collect { it.plainText.trim() }.join(mark)
-    c.selecteds.tail().each { it.delete() }
-}
-def joinPrompt(c, ui, node, msg) {
-    def mark = ui.showInputDialog(node.delegate, msg, '')
-    joinText(c, node, (mark ? mark : ''))
-}
-joinPrompt(c, ui, node, 'Enter characters to join nodes on...')

scripts/JoinOnComma.groovy

-// @CacheScriptContent(true)
-// @ExecutionModes({ON_SINGLE_NODE})
-
-def joinText(c, node, mark) {
-    node.text = c.selecteds.collect { it.plainText.trim() }.join(mark)
-    c.selecteds.tail().each { it.delete() }
-}
-joinText(c, node, ', ')
-

scripts/JoinOnPeriod.groovy

-// @CacheScriptContent(true)
-// @ExecutionModes({ON_SINGLE_NODE})
-
-def joinText(c, node, mark) {
-    node.text = c.selecteds.collect { it.plainText.trim() }.join(mark)
-    c.selecteds.tail().each { it.delete() }
-}
-joinText(c, node, ' ')
-

scripts/JoinOnSpace.groovy

-// @CacheScriptContent(true)
-// @ExecutionModes({ON_SINGLE_NODE})
-
-def joinText(c, node, mark) {
-    node.text = c.selecteds.collect { it.plainText.trim() }.join(mark)
-    c.selecteds.tail().each { it.delete() }
-}
-joinText(c, node, ' ')
-

scripts/LocalLinkBack.groovy

-// @CacheScriptContent(true)
-// @ExecutionModes({ON_SINGLE_NODE})
-
-c.find {
-	it.text == node.text && it.id != node.id
-}.each { it.link.setText('#' + node.id) }

scripts/LowerCaseNode.groovy

-// @CacheScriptContent(true)
-// @ExecutionModes({ON_SINGLE_NODE})
-
-c.selecteds.every {
-	it.text = it.plainText.toLowerCase()
-}
-

scripts/SplitBeforeChars.groovy

-// @CacheScriptContent(true)
-// @ExecutionModes({ON_SINGLE_NODE})
-
-def splitText(c, mark) {
-	c.selecteds.every { ts ->
-		ts.plainText.split(mark).collect { it.trim() }.eachWithIndex {
-			txt, idx ->
-			if (idx == 0)
-    			ts.text = txt
-			ts.createChild(txt)
-		}
-	}
-}
-
-def splitPrompt(ui, node, pattern, msg) {
-	def mark = ui.showInputDialog(node.delegate, msg, '')
-	splitText(c, pattern ? (pattern + mark + ')') : (mark ? mark : ''))
-}
-
-splitPrompt(ui, node, '(?=', 'Enter characters to split node text before...')
-

scripts/SplitOnChars.groovy

-// @CacheScriptContent(true)
-// @ExecutionModes({ON_SINGLE_NODE})
-
-def splitText(c, mark) {
-	c.selecteds.every { ts ->
-		ts.plainText.split(mark).collect { it.trim() }.eachWithIndex {
-			txt, idx ->
-			if (idx == 0)
-    			ts.text = txt
-			ts.createChild(txt)
-		}
-	}
-}
-
-def splitPrompt(ui, node, pattern, msg) {
-	def mark = ui.showInputDialog(node.delegate, msg, '')
-	splitText(c, pattern ? (pattern + mark + ')') : (mark ? mark : ''))
-}
-
-splitPrompt(ui, node, '', 'Enter characters to split node text on...')
-

scripts/SplitOnComma.groovy

-// @CacheScriptContent(true)
-// @ExecutionModes({ON_SINGLE_NODE})
-
-def splitText(c, mark) {
-	c.selecteds.every { ts ->
-		ts.plainText.split(mark).collect { it.trim() }.eachWithIndex {
-			txt, idx ->
-			if (idx == 0)
-    			ts.text = txt
-			ts.createChild(txt)
-		}
-	}
-}
-
-
-splitText(c, ',')
-
-

scripts/SplitOnPeriod.groovy

-// @CacheScriptContent(true)
-// @ExecutionModes({ON_SINGLE_NODE})
-
-def splitText(c, mark) {
-	c.selecteds.every { ts ->
-		ts.plainText.split(mark).collect { it.trim() }.eachWithIndex {
-			txt, idx ->
-			if (idx == 0)
-    			ts.text = txt
-			ts.createChild(txt)
-		}
-	}
-}
-
-
-splitText(c, '\\.')
-

scripts/SplitOnSpace.groovy

-// @CacheScriptContent(true)
-// @ExecutionModes({ON_SINGLE_NODE})
-
-def splitText(c, mark) {
-	c.selecteds.every { ts ->
-		ts.plainText.split(mark).collect { it.trim() }.eachWithIndex {
-			txt, idx ->
-			if (idx == 0)
-    			ts.text = txt
-			ts.createChild(txt)
-		}
-	}
-}
-
-
-splitText(c, ' ')
-

scripts/SyncStyleWithIcons.groovy

-package scripts
-// @CacheScriptContent(true)
-// @ExecutionModes({ON_SINGLE_NODE})
-
-def thisStyle = node?.style?.style
-def thisIcons = node?.icons?.icons
-def styleIcons = thisStyle ? node?.style?.styleNode?.icons?.icons : null
-c.selecteds.findAll { it?.id != node?.id }.each {
-   if (thisStyle)
-      it?.style?.style = thisStyle
-    // sync any local icons
-    if (thisIcons)
-      thisIcons?.every { icon -> it?.icons?.add(icon) }
-    // sync any style icons
-     if (styleIcons)
-       styleIcons?.every { icon -> it?.icons?.add(icon) }
-}

scripts/TrimFirstChars.groovy

-// @CacheScriptContent(true)
-// @ExecutionModes({ON_SINGLE_NODE})
-
-
-def trimPrompt(c, ui, node, pattern, start, msg) {
-	def mark = ui.showInputDialog(node.delegate, msg, '')
-	mark = start ? pattern + (mark ? mark : '') : (mark ? mark : '') + pattern
-	c.selecteds.every { it.text = it.plainText.replaceFirst(mark, '') }
-}
-
-
-trimPrompt(c, ui, node, '^{1}', true, 'Enter characters to trim from start of node text...')
-

scripts/TrimLastChars.groovy

-// @CacheScriptContent(true)
-// @ExecutionModes({ON_SINGLE_NODE})
-
-
-def trimPrompt(c, ui, node, pattern, start, msg) {
-	def mark = ui.showInputDialog(node.delegate, msg, '')
-	mark = start ? pattern + (mark ? mark : '') : (mark ? mark : '') + pattern
-	c.selecteds.every { it.text = it.plainText.replaceFirst(mark, '') }
-}
-
-
-trimPrompt(c, ui, node, '{1}$', false, 'Enter characters to trim from end of node text...')
-

scripts/UpperCaseNode.groovy

-// @CacheScriptContent(true)
-// @ExecutionModes({ON_SINGLE_NODE})
-
-c.selecteds.every {
-	it.text = it.plainText.toUpperCase()
-}
-

shared/header.groovy

+// @CacheScriptContent(true)
+// @ExecutionModes({ON_SINGLE_NODE})

shared/join.groovy

+def joinText(c, node, mark) {
+    node.text = c.selecteds.collect { it.plainText.trim() }.join(mark)
+    c.selecteds.tail().each { it.delete() }
+}

shared/joinPrompt.groovy

+def joinPrompt(c, ui, node, msg) {
+    def mark = ui.showInputDialog(node.delegate, msg, '')
+    joinText(c, node, (mark ? mark : ''))
+}

shared/split.groovy

+def splitText(c, mark) {
+	c.selecteds.every { ts ->
+		ts.plainText.split(mark).collect { it.trim() }.eachWithIndex {
+			txt, idx ->
+			if (idx == 0)
+    			ts.text = txt
+			ts.createChild(txt)
+		}
+	}
+}

shared/splitPrompt.groovy

+def splitPrompt(ui, node, pattern, msg) {
+	def mark = ui.showInputDialog(node.delegate, msg, '')
+	splitText(c, pattern ? (pattern + mark + ')') : (mark ? mark : ''))
+}

shared/trim.groovy

+
+def trimPrompt(c, ui, node, pattern, start, msg) {
+	def mark = ui.showInputDialog(node.delegate, msg, '')
+	mark = start ? pattern + (mark ? mark : '') : (mark ? mark : '') + pattern
+	c.selecteds.every { it.text = it.plainText.replaceFirst(mark, '') }
+}
+#! /bin/env python
+
+import os
+
+if __name__ == '__main__':
+    for fn in os.listdir('spine'):
+        if fn.endswith('spine'):
+            with open(fn, 'r') as f:
+                with open(
+                    os.path.join('scripts', fn.rstrip('.spine').lstrip('_')
+                ), 'w') as nf:
+                    for lf in f:
+                        with open(lf.strip(), 'r') as cf:
+                            for ln in cf:
+                                nf.write(ln)
+                        nf.write('\n')

spine/JoinAndReplaceFirst.groovy.spine

-_header.groovy
-_JoinAndReplaceFirst.groovy

spine/JoinOnChars.groovy.spine

-_header.groovy
-_join.groovy
-_joinPrompt.groovy
-_JoinOnChars.groovy

spine/JoinOnComma.groovy.spine

-_header.groovy
-_join.groovy
-_JoinOnComma.groovy

spine/JoinOnPeriod.groovy.spine

-_header.groovy
-_join.groovy
-_JoinOnSpace.groovy

spine/JoinOnSpace.groovy.spine

-_header.groovy
-_join.groovy
-_JoinOnSpace.groovy

spine/SplitBeforeChars.groovy.spine

-_header.groovy
-_split.groovy
-_splitPrompt.groovy
-_SplitBeforeChars.groovy

spine/SplitOnChars.groovy.spine

-_header.groovy
-_split.groovy
-_splitPrompt.groovy
-_SplitOnChars.groovy

spine/SplitOnComma.groovy.spine

-_header.groovy
-_split.groovy
-_SplitOnComma.groovy

spine/SplitOnPeriod.groovy.spine

-_header.groovy
-_split.groovy
-_SplitOnPeriod.groovy

spine/SplitOnSpace.groovy.spine

-_header.groovy
-_split.groovy
-_SplitOnSpace.groovy

spine/TrimFirstChars.groovy.spine

-_header.groovy
-_trim.groovy
-_TrimFirstChars.groovy

spine/TrimLastChars.groovy.spine

-_header.groovy
-_trim.groovy
-_TrimLastChars.groovy

spine/_AttrsToChildren.groovy.spine

+shared/header.groovy
+part/_AttrsToChildren.groovy

spine/_CapitalizeNode.groovy.spine

+shared/header.groovy
+part/_CapitalizeNode.groovy

spine/_ChildrenToAttrs.groovy.spine

+shared/header.groovy
+part/_ChildrenToAttrs.groovy

spine/_JoinAndReplaceFirst.groovy.spine

+shared/header.groovy
+part/_JoinAndReplaceFirst.groovy

spine/_JoinAndReplaceLast.groovy.spine

+shared/header.groovy
+part/_JoinAndReplaceLast.groovy

spine/_JoinOnChars.groovy

-joinPrompt(c, ui, node, 'Enter characters to join nodes on...')

spine/_JoinOnChars.groovy.spine

+shared/header.groovy
+shared/join.groovy
+shared/joinPrompt.groovy
+part/_JoinOnChars.groovy

spine/_JoinOnComma.groovy

-joinText(c, node, ', ')

spine/_JoinOnComma.groovy.spine

+shared/header.groovy
+shared/join.groovy
+part/_JoinOnComma.groovy

spine/_JoinOnPeriod.groovy

-joinText(c, node, '. ')

spine/_JoinOnPeriod.groovy.spine

+shared/header.groovy
+shared/join.groovy
+part/_JoinOnPeriod.groovy

spine/_JoinOnSpace.groovy

-joinText(c, node, ' ')

spine/_JoinOnSpace.groovy.spine

+shared/header.groovy
+shared/join.groovy
+part/_JoinOnSpace.groovy

spine/_LocalLinkBack.groovy.spine

+shared/header.groovy
+part/_LowerCaseNode.groovy

spine/_LowerCaseNode.groovy.spine

+shared/header.groovy
+part/_UpperCaseNode.groovy

spine/_SplitBeforeChars.groovy

-
-splitPrompt(ui, node, '(?=', 'Enter characters to split node text before...')

spine/_SplitBeforeChars.groovy.spine

+shared/header.groovy
+shared/split.groovy
+shared/splitPrompt.groovy
+part/_SplitBeforeChars.groovy

spine/_SplitOnChars.groovy

-
-splitPrompt(ui, node, '', 'Enter characters to split node text on...')

spine/_SplitOnChars.groovy.spine

+shared/header.groovy
+shared/split.groovy
+shared/splitPrompt.groovy
+part/_SplitOnChars.groovy

spine/_SplitOnComma.groovy

-
-splitText(c, ',')
-

spine/_SplitOnComma.groovy.spine

+shared/header.groovy
+shared/split.groovy
+part/_SplitOnComma.groovy

spine/_SplitOnPeriod.groovy

-
-splitText(c, '\\.')

spine/_SplitOnPeriod.groovy.spine

+shared/header.groovy
+shared/split.groovy
+part/_SplitOnPeriod.groovy

spine/_SplitOnSpace.groovy

-
-splitText(c, ' ')

spine/_SplitOnSpace.groovy.spine

+shared/header.groovy
+shared/split.groovy
+part/_SplitOnSpace.groovy

spine/_SyncStyleWithIcons.groovy.spine

+shared/header.groovy
+part/_SyncStyleWithIcons.groovy

spine/_TrimFirstChars.groovy

-
-trimPrompt(c, ui, node, '^{1}', true, 'Enter characters to trim from start of node text...')

spine/_TrimFirstChars.groovy.spine

+shared/header.groovy
+shared/trim.groovy
+part/_TrimFirstChars.groovy

spine/_TrimLastChars.groovy

-
-trimPrompt(c, ui, node, '{1}$', false, 'Enter characters to trim from end of node text...')

spine/_TrimLastChars.groovy.spine

+shared/header.groovy
+shared/trim.groovy
+part/_TrimLastChars.groovy

spine/_UpperCaseNode.groovy.spine

+shared/header.groovy
+part/_UpperCaseNode.groovy

spine/_header.groovy

-// @CacheScriptContent(true)
-// @ExecutionModes({ON_SINGLE_NODE})

spine/_join.groovy

-def joinText(c, node, mark) {
-    node.text = c.selecteds.collect { it.plainText.trim() }.join(mark)
-    c.selecteds.tail().each { it.delete() }
-}

spine/_joinPrompt.groovy

-def joinPrompt(c, ui, node, msg) {
-    def mark = ui.showInputDialog(node.delegate, msg, '')
-    joinText(c, node, (mark ? mark : ''))
-}

spine/_split.groovy

-def splitText(c, mark) {
-	c.selecteds.every { ts ->
-		ts.plainText.split(mark).collect { it.trim() }.eachWithIndex {
-			txt, idx ->
-			if (idx == 0)
-    			ts.text = txt
-			ts.createChild(txt)
-		}
-	}
-}

spine/_splitPrompt.groovy

-def splitPrompt(ui, node, pattern, msg) {
-	def mark = ui.showInputDialog(node.delegate, msg, '')
-	splitText(c, pattern ? (pattern + mark + ')') : (mark ? mark : ''))
-}

spine/_trim.groovy

-
-def trimPrompt(c, ui, node, pattern, start, msg) {
-	def mark = ui.showInputDialog(node.delegate, msg, '')
-	mark = start ? pattern + (mark ? mark : '') : (mark ? mark : '') + pattern
-	c.selecteds.every { it.text = it.plainText.replaceFirst(mark, '') }
-}

spine/pull

-#! /bin/sh
-hg pull ssh://hg@bitbucket.org/lcrees/freeplane-scripts
-hg pull git+ssh://git@github.com/kwarterthieves/freeplane-scripts.git

spine/push

-#! /bin/sh
-hg push ssh://hg@bitbucket.org/lcrees/freeplane-scripts
-hg push git+ssh://git@github.com/kwarterthieves/freeplane-scripts.git

spine/spine.py

-#! /bin/env python
-
-import os
-
-if __name__ == '__main__':
-    for fn in os.listdir(os.getcwd()):
-        if fn.endswith('spine'):
-            with open(fn, 'r') as f:
-                with open(os.path.abspath(os.path.join('..', 'scripts', fn.replace('.spine', ''))), 'w') as nf:
-                    for lf in f:
-                        with open(lf.strip(), 'r') as cf:
-                            for ln in cf:
-                                nf.write(ln)
-                        nf.write('\n')

wikdNode-0.1.addon.mm

-<map version="freeplane 1.2.0">
-<!--To view this file, download free mind mapping software Freeplane from http://freeplane.sourceforge.net -->
-<node TEXT="Wicked Node" FOLDED="false" ID="ID_1723255651" CREATED="1283093380553" MODIFIED="1357777773015" BACKGROUND_COLOR="#97c7dc">
-<font SIZE="16" BOLD="true" ITALIC="true"/>
-<hook NAME="MapStyle">
-    <properties show_icon_for_attributes="true" show_note_icons="true"/>
-
-<map_styles>
-<stylenode LOCALIZED_TEXT="styles.root_node">
-<stylenode LOCALIZED_TEXT="styles.predefined" POSITION="right">
-<stylenode LOCALIZED_TEXT="default" COLOR="#000000" STYLE="fork" MAX_WIDTH="600">
-<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="defaultstyle.details"/>
-<stylenode LOCALIZED_TEXT="defaultstyle.note"/>
-<stylenode LOCALIZED_TEXT="defaultstyle.floating">
-<edge STYLE="hide_edge"/>
-<cloud COLOR="#f0f0f0" SHAPE="ROUND_RECT"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.ok">
-<icon BUILTIN="button_ok"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.needs_action">
-<icon BUILTIN="messagebox_warning"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.floating_node">
-<cloud COLOR="#ffffff" SHAPE="ARC"/>
-<edge STYLE="hide_edge"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.topic" COLOR="#18898b" STYLE="fork">
-<font NAME="Liberation Sans" SIZE="12" BOLD="true"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.subtopic" COLOR="#cc3300" STYLE="fork">
-<font NAME="Liberation Sans" SIZE="12" BOLD="true"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.subsubtopic" COLOR="#669900">
-<font NAME="Liberation Sans" SIZE="12" BOLD="true"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.connection" COLOR="#606060" STYLE="fork">
-<font NAME="Arial" SIZE="10" BOLD="false"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.important" COLOR="#ff0000">
-<icon BUILTIN="yes"/>
-<font NAME="Liberation Sans" SIZE="12"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.question">
-<icon BUILTIN="help"/>
-<font NAME="Aharoni" SIZE="12"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.key" COLOR="#996600">
-<icon BUILTIN="password"/>
-<font NAME="Liberation Sans" SIZE="12" BOLD="false"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.idea">
-<icon BUILTIN="idea"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.note" COLOR="#990000">
-<font NAME="Liberation Sans" SIZE="12"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.date" COLOR="#0033ff">
-<icon BUILTIN="calendar"/>
-<font NAME="Liberation Sans" SIZE="12"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.website" COLOR="#006633">
-<font NAME="Liberation Sans" SIZE="12"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.list" COLOR="#cc6600">
-<icon BUILTIN="list"/>
-<font NAME="Liberation Sans" SIZE="12" BOLD="true"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.quotation" COLOR="#338800" STYLE="fork">
-<font NAME="Liberation Sans" SIZE="12" BOLD="false" ITALIC="false"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.definition" COLOR="#666600">
-<font NAME="Liberation Sans" SIZE="12" BOLD="false"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.description" COLOR="#996600">
-<font NAME="Liberation Sans" SIZE="12" BOLD="false"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.pending" COLOR="#b3b95c">
-<font NAME="Liberation Sans" SIZE="12"/>
-</stylenode>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.AutomaticLayout" POSITION="right">
-<stylenode LOCALIZED_TEXT="AutomaticLayout.level.root" COLOR="#000000">
-<font SIZE="20"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="AutomaticLayout.level,1" COLOR="#0033ff">
-<font SIZE="18"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="AutomaticLayout.level,2" COLOR="#00b439">
-<font SIZE="16"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="AutomaticLayout.level,3" COLOR="#990000">
-<font SIZE="14"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="AutomaticLayout.level,4" COLOR="#111111">
-<font SIZE="12"/>
-</stylenode>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.user-defined" POSITION="right"/>
-</stylenode>
-</map_styles>
-</hook>
-<hook NAME="AutomaticEdgeColor" COUNTER="10"/>
-<attribute_layout NAME_WIDTH="103" VALUE_WIDTH="103"/>
-<attribute NAME="name" VALUE="wikdNode"/>
-<attribute NAME="version" VALUE="0.1" OBJECT="org.freeplane.features.format.FormattedNumber|0.1|#0.####"/>
-<attribute NAME="author" VALUE="L. C. Rees"/>
-<attribute NAME="freeplaneVersionFrom" VALUE="1.2.15"/>
-<attribute NAME="freeplaneVersionTo" VALUE="1.2.20"/>
-<richcontent TYPE="NOTE">
-
-<html>
-  <head>
-    
-  </head>
-  <body>
-    <p>
-      The homepage of this add-on should be set as the link of the root node.
-    </p>
-    <p>
-      The basic properties of this add-on. They can be used in script names and other attributes, e.g. &quot;${name}.groovy&quot;.
-    </p>
-    <ul>
-      <li>
-        name: The name of the add-on, normally a technically one (no spaces, no special characters except _.-).
-      </li>
-      <li>
-        author: Author's name(s) and (optionally) email adresses.
-      </li>
-      <li>
-        version: Since it's difficult to protect numbers like 1.0 from Freeplane's number parser it's advised to prepend a 'v' to the number, e.g. 'v1.0'.
-      </li>
-      <li>
-        freeplane-version-from: The oldest compatible Freeplane version. The add-on will not be installed if the Freeplane version is too old.
-      </li>
-      <li>
-        freeplane-version-to: Normally empty: The newest compatible Freeplane version. The add-on will not be installed if the Freeplane version is too new.
-      </li>
-    </ul>
-  </body>
-</html>
-</richcontent>
-<hook NAME="FlexibleLayout" VALUE="CHILDREN"/>
-<node TEXT="description" POSITION="left" ID="ID_143630176" CREATED="1357715826843" MODIFIED="1357777773024">
-<edge COLOR="#ff0000"/>
-<richcontent TYPE="NOTE">
-
-<html>
-  <head>
-    
-  </head>
-  <body>
-    <p>
-      Description would be awkward to edit as an attribute.
-    </p>
-    <p>
-      So you have to put the add-on description as a child of the <i>'description'</i>&#160;node.
-    </p>
-  </body>
-</html>
-</richcontent>
-<attribute_layout NAME_WIDTH="100" VALUE_WIDTH="100"/>
-<node TEXT="Miscellaneous text tools for Freeplane" ID="ID_419235551" CREATED="1357715987721" MODIFIED="1357716010850">
-<attribute_layout NAME_WIDTH="100" VALUE_WIDTH="100"/>
-</node>
-</node>
-<node TEXT="changes" POSITION="left" ID="ID_1790870178" CREATED="1357715826877" MODIFIED="1357777773026">
-<edge COLOR="#0000ff"/>
-<richcontent TYPE="NOTE">
-
-<html>
-  <head>
-    
-  </head>
-  <body>
-    <p>
-      Change log of this add-on: append one node for each noteworthy version and put the details for each version into a child node.
-    </p>
-  </body>
-</html>
-</richcontent>
-</node>
-<node TEXT="license" POSITION="left" ID="ID_1348143779" CREATED="1357715826886" MODIFIED="1357777773027">
-<edge COLOR="#00ff00"/>
-<richcontent TYPE="NOTE">
-
-<html>
-  <head>
-    
-  </head>
-  <body>
-    <p>
-      The add-ons's license that the user has to accept before she can install it.
-    </p>
-    <p>
-      
-    </p>
-    <p>
-      The License text has to be entered as a child of the <i>'license'</i>&#160;node, either as plain text or as HTML.
-    </p>
-  </body>
-</html>
-</richcontent>
-<attribute_layout NAME_WIDTH="100" VALUE_WIDTH="100"/>
-<node TEXT="This add-on is free software: you can redistribute it and/or modify&#xa;it under the terms of the GNU General Public License as published by&#xa;the Free Software Foundation, either version 2 of the License, or&#xa;(at your option) any later version.&#xa;&#xa;This program is distributed in the hope that it will be useful,&#xa;but WITHOUT ANY WARRANTY; without even the implied warranty of&#xa;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the&#xa;GNU General Public License for more details." ID="ID_241792435" CREATED="1357715826895" MODIFIED="1357719017976">
-<attribute_layout NAME_WIDTH="100" VALUE_WIDTH="100"/>
-</node>
-</node>
-<node TEXT="preferences.xml" POSITION="left" ID="ID_1772733941" CREATED="1357715826946" MODIFIED="1357777773029">
-<edge COLOR="#ff00ff"/>
-<richcontent TYPE="NOTE">
-
-<html>
-  <head>
-    
-  </head>
-  <body>
-    <p>
-      <font color="#000000" face="SansSerif, sans-serif">The child node contains the add-on configuration as an extension to mindmapmodemenu.xml (in Tools-&gt;Preferences-&gt;Add-ons). </font>
-    </p>
-    <p>
-      <font color="#000000" face="SansSerif, sans-serif">Every property in the configuration should receive a default value in <i>default.properties</i>&#160;node.</font>
-    </p>
-  </body>
-</html>
-</richcontent>
-<attribute_layout NAME_WIDTH="100" VALUE_WIDTH="100"/>
-</node>
-<node TEXT="default.properties" POSITION="left" ID="ID_1954124232" CREATED="1357715826968" MODIFIED="1357777773031">
-<edge COLOR="#00ffff"/>
-<richcontent TYPE="NOTE">
-
-<html>
-  <head>
-    
-  </head>
-  <body>
-    <p>
-      These properties play together with the preferences: Each property defined in the preferences should have a default value in the attributes of this node.
-    </p>
-  </body>
-</html>
-</richcontent>
-<attribute_layout NAME_WIDTH="100" VALUE_WIDTH="100"/>
-</node>
-<node TEXT="translations" POSITION="left" ID="ID_1430168348" CREATED="1357715826977" MODIFIED="1357777773032">
-<edge COLOR="#ffff00"/>
-<richcontent TYPE="NOTE">
-
-<html>
-  <head>
-    
-  </head>
-  <body>
-    <p>
-      The translation keys that this script uses. Define one child node per supported locale. The attributes contain the translations. Define at least 'addons.${name}' for the add-on's name.
-    </p>
-  </body>
-</html>
-</richcontent>
-<attribute_layout NAME_WIDTH="100" VALUE_WIDTH="100"/>
-<node TEXT="en" ID="ID_1245393964" CREATED="1357715826986" MODIFIED="1357770977979">
-<attribute_layout NAME_WIDTH="76" VALUE_WIDTH="76"/>
-<attribute NAME="addons.${name}" VALUE="Wicked Node"/>
-</node>
-</node>
-<node TEXT="deinstall" POSITION="left" ID="ID_1844997656" CREATED="1357715826998" MODIFIED="1357777773033">
-<edge COLOR="#7c0000"/>
-<richcontent TYPE="NOTE">
-
-<html>
-  <head>
-    
-  </head>
-  <body>
-    <p>
-      List of files and/or directories to remove on deinstall
-    </p>
-  </body>
-</html>
-</richcontent>
-<attribute_layout NAME_WIDTH="30" VALUE_WIDTH="269"/>
-<attribute NAME="delete" VALUE="${installationbase}/addons/${name}.script.xml"/>
-<attribute NAME="delete" VALUE="${installationbase}/scripts/JoinOnChars.groovy"/>
-<attribute NAME="delete" VALUE="${installationbase}/scripts/JoinOnComma.groovy"/>
-<attribute NAME="delete" VALUE="${installationbase}/scripts/JoinOnPeriod.groovy"/>
-<attribute NAME="delete" VALUE="${installationbase}/scripts/JoinOnSpace.groovy"/>
-<attribute NAME="delete" VALUE="${installationbase}/scripts/SplitBeforeChars.groovy"/>
-<attribute NAME="delete" VALUE="${installationbase}/scripts/SplitOnChars.groovy"/>
-<attribute NAME="delete" VALUE="${installationbase}/scripts/SplitOnComma.groovy"/>
-<attribute NAME="delete" VALUE="${installationbase}/scripts/SplitOnPeriod.groovy"/>
-<attribute NAME="delete" VALUE="${installationbase}/scripts/SplitOnSpace.groovy"/>
-<attribute NAME="delete" VALUE="${installationbase}/scripts/TrimFirstChars.groovy"/>
-<attribute NAME="delete" VALUE="${installationbase}/scripts/TrimLastChars.groovy"/>
-</node>
-<node TEXT="scripts" POSITION="right" ID="ID_1324856264" CREATED="1357715827025" MODIFIED="1357777773040">
-<edge COLOR="#00007c"/>
-<richcontent TYPE="NOTE">
-
-<html>
-  <head>
-    
-  </head>
-  <body>
-    <p>
-      An add-on may contain multiple scripts. The node text defines the script name (e.g. inserInlineImage.groovy). Its properties have to be configured via attributes:
-    </p>
-    <p>
-      
-    </p>
-    <p>
-      * menuLocation: &lt;locationkey&gt;
-    </p>
-    <p>
-      &#160;&#160;&#160;- Defines where the menu location.
-    </p>
-    <p>
-      &#160;&#160;&#160;-&#160;See mindmapmodemenu.xml for how the menu locations look like.
-    </p>
-    <p>
-      &#160;&#160;&#160;- http://freeplane.bzr.sf.net/bzr/freeplane/freeplane_program/trunk/annotate/head%3A/freeplane/resources/xml/mindmapmodemenu.xml
-    </p>
-    <p>
-      &#160;&#160;&#160;- This attribute is mandatory
-    </p>
-    <p>
-      
-    </p>
-    <p>
-      * menuTitleKey: &lt;key&gt;
-    </p>
-    <p>
-      &#160;&#160;&#160;- The menu item title will be looked up under the translation key &lt;key&gt; - don't forget to define its translation.
-    </p>
-    <p>
-      &#160;&#160;&#160;- This attribute is mandatory
-    </p>
-    <p>
-      
-    </p>
-    <p>
-      * executionMode: &lt;mode&gt;
-    </p>
-    <p>
-      &#160;&#160;&#160;- The execution mode as described in the Freeplane wiki (http://freeplane.sourceforge.net/wiki/index.php/Scripting)
-    </p>
-    <p>
-      &#160;&#160;&#160;- ON_SINGLE_NODE: Execute the script once. The <i>node</i>&#160;variable is set to the selected node.
-    </p>
-    <p>
-      &#160;&#160;&#160;- ON_SELECTED_NODE: Execute the script n times for n selected nodes, once for each node.
-    </p>
-    <p>
-      &#160;&#160;&#160;- ON_SELECTED_NODE_RECURSIVELY: Execute the script on every selected node and recursively on all of its children.
-    </p>
-    <p>
-      &#160;&#160;&#160;- In doubt use ON_SINGLE_NODE.
-    </p>
-    <p>
-      &#160;&#160;&#160;- This attribute is mandatory
-    </p>
-    <p>
-      
-    </p>
-    <p>
-      * keyboardShortcut: &lt;shortcut&gt;
-    </p>
-    <p>
-      &#160;&#160;&#160;- Optional: keyboard combination / accelerator for this script, e.g. control alt I
-    </p>
-    <p>
-      &#160;&#160;&#160;- Use lowercase letters for modifiers and uppercase for letters. Use no + signs.
-    </p>
-    <p>
-      &#160;&#160;&#160;- The available key names are listed at http://download.oracle.com/javase/1.4.2/docs/api/java/awt/event/KeyEvent.html#VK_0
-    </p>
-    <p>
-      &#160;&#160;&#160;&#160;&#160;In the list only entries with a 'VK_' prefix count. Omit the prefix in the shortcut definition.
-    </p>
-    <p>
-      
-    </p>
-    <p>
-      * Permissions&#160;that the script(s) require, each either false or true:
-    </p>
-    <p>
-      &#160;&#160;&#160;- execute_scripts_without_asking
-    </p>
-    <p>
-      &#160;&#160;&#160;- execute_scripts_without_file_restriction: permission to read files
-    </p>
-    <p>
-      &#160;&#160;&#160;- execute_scripts_without_write_restriction: permission to create/change/delete files
-    </p>
-    <p>
-      &#160;&#160;&#160;- execute_scripts_without_exec_restriction: permission to execute other programs
-    </p>
-    <p>
-      &#160;&#160;&#160;- execute_scripts_without_network_restriction: permission to access the network
-    </p>
-    <p>
-      &#160;&#160;Notes:
-    </p>
-    <p>
-      &#160;&#160;- The set of permissions is fixed.
-    </p>
-    <p>
-      &#160;&#160;- Don't change the attribute names, don't omit one.
-    </p>
-    <p>
-      &#160;&#160;- Set the values either to true or to false
-    </p>
-    <p>
-      &#160;&#160;- In any case set execute_scripts_without_asking to true unless you want to annoy users.
-    </p>
-  </body>
-</html>
-</richcontent>
-<attribute_layout NAME_WIDTH="100" VALUE_WIDTH="100"/>
-<node TEXT="JoinOnPeriod.groovy" FOLDED="true" ID="ID_1416066303" CREATED="1357718506311" MODIFIED="1357774685083">
-<attribute_layout NAME_WIDTH="206" VALUE_WIDTH="206"/>
-<attribute NAME="menuTitleKey" VALUE="Join on period"/>
-<attribute NAME="menuLocation" VALUE="/menu_bar/edit/wikdJoin"/>
-<attribute NAME="executionMode" VALUE="on_single_node"/>
-<attribute NAME="keyboardShortcut" VALUE="control meta PERIOD"/>
-<attribute NAME="execute_scripts_without_asking" VALUE="true"/>
-<attribute NAME="execute_scripts_without_file_restriction" VALUE="true"/>
-<attribute NAME="execute_scripts_without_write_restriction" VALUE="false"/>
-<attribute NAME="execute_scripts_without_exec_restriction" VALUE="false"/>
-<attribute NAME="execute_scripts_without_network_restriction" VALUE="false"/>
-<node TEXT="// @CacheScriptContent(true)&#xa;// @ExecutionModes({ON_SINGLE_NODE})&#xa;&#xa;def joinText(c, node, mark) {&#xa;    node.text = c.selecteds.collect { it.plainText.trim() }.join(mark)&#xa;    c.selecteds.tail().each { it.delete() }&#xa;}&#xa;joinText(c, node, &apos; &apos;)&#xa;&#xa;" ID="ID_1331221127" CREATED="1357777843332" MODIFIED="1357777843335"/>
-</node>
-<node TEXT="JoinOnComma.groovy" FOLDED="true" ID="ID_426652560" CREATED="1357718540951" MODIFIED="1357774689341">
-<attribute_layout NAME_WIDTH="206" VALUE_WIDTH="206"/>
-<attribute NAME="menuTitleKey" VALUE="Join on comma"/>
-<attribute NAME="menuLocation" VALUE="/menu_bar/edit/wikdJoin"/>
-<attribute NAME="executionMode" VALUE="on_single_node"/>
-<attribute NAME="keyboardShortcut" VALUE="control meta COMMA"/>
-<attribute NAME="execute_scripts_without_asking" VALUE="true"/>
-<attribute NAME="execute_scripts_without_file_restriction" VALUE="true"/>
-<attribute NAME="execute_scripts_without_write_restriction" VALUE="false"/>
-<attribute NAME="execute_scripts_without_exec_restriction" VALUE="false"/>
-<attribute NAME="execute_scripts_without_network_restriction" VALUE="false"/>
-<node TEXT="// @CacheScriptContent(true)&#xa;// @ExecutionModes({ON_SINGLE_NODE})&#xa;&#xa;def joinText(c, node, mark) {&#xa;    node.text = c.selecteds.collect { it.plainText.trim() }.join(mark)&#xa;    c.selecteds.tail().each { it.delete() }&#xa;}&#xa;joinText(c, node, &apos;, &apos;)&#xa;&#xa;" ID="ID_1873900801" CREATED="1357777843337" MODIFIED="1357777843338"/>
-</node>
-<node TEXT="JoinOnSpace.groovy" FOLDED="true" ID="ID_737637147" CREATED="1357718569572" MODIFIED="1357774703510">
-<attribute_layout NAME_WIDTH="206" VALUE_WIDTH="206"/>
-<attribute NAME="menuTitleKey" VALUE="Join with space"/>
-<attribute NAME="menuLocation" VALUE="/menu_bar/edit/wikdJoin"/>
-<attribute NAME="executionMode" VALUE="on_single_node"/>
-<attribute NAME="keyboardShortcut" VALUE="control meta SPACE"/>
-<attribute NAME="execute_scripts_without_asking" VALUE="true"/>
-<attribute NAME="execute_scripts_without_file_restriction" VALUE="true"/>
-<attribute NAME="execute_scripts_without_write_restriction" VALUE="false"/>
-<attribute NAME="execute_scripts_without_exec_restriction" VALUE="false"/>
-<attribute NAME="execute_scripts_without_network_restriction" VALUE="false"/>
-<node TEXT="// @CacheScriptContent(true)&#xa;// @ExecutionModes({ON_SINGLE_NODE})&#xa;&#xa;def joinText(c, node, mark) {&#xa;    node.text = c.selecteds.collect { it.plainText.trim() }.join(mark)&#xa;    c.selecteds.tail().each { it.delete() }&#xa;}&#xa;joinText(c, node, &apos; &apos;)&#xa;&#xa;" ID="ID_1338948623" CREATED="1357777843338" MODIFIED="1357777843338"/>
-</node>
-<node TEXT="JoinOnChars.groovy" FOLDED="true" ID="ID_326406537" CREATED="1357718596648" MODIFIED="1357774713282">
-<attribute_layout NAME_WIDTH="206" VALUE_WIDTH="206"/>
-<attribute NAME="menuTitleKey" VALUE="Join on characters..."/>
-<attribute NAME="menuLocation" VALUE="/menu_bar/edit/wikdJoin"/>
-<attribute NAME="executionMode" VALUE="on_single_node"/>
-<attribute NAME="keyboardShortcut" VALUE="control meta J"/>
-<attribute NAME="execute_scripts_without_asking" VALUE="true"/>
-<attribute NAME="execute_scripts_without_file_restriction" VALUE="true"/>
-<attribute NAME="execute_scripts_without_write_restriction" VALUE="false"/>
-<attribute NAME="execute_scripts_without_exec_restriction" VALUE="false"/>
-<attribute NAME="execute_scripts_without_network_restriction" VALUE="false"/>
-<node TEXT="// @CacheScriptContent(true)&#xa;// @ExecutionModes({ON_SINGLE_NODE})&#xa;&#xa;def joinText(c, node, mark) {&#xa;    node.text = c.selecteds.collect { it.plainText.trim() }.join(mark)&#xa;    c.selecteds.tail().each { it.delete() }&#xa;}&#xa;def joinPrompt(c, ui, node, msg) {&#xa;    def mark = ui.showInputDialog(node.delegate, msg, &apos;&apos;)&#xa;    joinText(c, node, (mark ? mark : &apos;&apos;))&#xa;}&#xa;joinPrompt(c, ui, node, &apos;Enter characters to join nodes on...&apos;)&#xa;" ID="ID_1530770703" CREATED="1357777843338" MODIFIED="1357777843339"/>
-</node>
-<node TEXT="SplitBeforeChars.groovy" FOLDED="true" ID="ID_1144065633" CREATED="1357718569574" MODIFIED="1357774722073">
-<attribute_layout NAME_WIDTH="206" VALUE_WIDTH="206"/>
-<attribute NAME="menuTitleKey" VALUE="Split before characters..."/>
-<attribute NAME="menuLocation" VALUE="/menu_bar/edit/wikdSplit"/>
-<attribute NAME="executionMode" VALUE="on_single_node"/>
-<attribute NAME="keyboardShortcut" VALUE="control meta S"/>
-<attribute NAME="execute_scripts_without_asking" VALUE="true"/>
-<attribute NAME="execute_scripts_without_file_restriction" VALUE="true"/>
-<attribute NAME="execute_scripts_without_write_restriction" VALUE="false"/>
-<attribute NAME="execute_scripts_without_exec_restriction" VALUE="false"/>
-<attribute NAME="execute_scripts_without_network_restriction" VALUE="false"/>
-<node TEXT="// @CacheScriptContent(true)&#xa;// @ExecutionModes({ON_SINGLE_NODE})&#xa;&#xa;def splitText(c, mark) {&#xa;&#x9;c.selecteds.every { ts -&gt;&#xa;&#x9;&#x9;ts.plainText.split(mark).collect { it.trim() }.eachWithIndex {&#xa;&#x9;&#x9;&#x9;txt, idx -&gt;&#xa;&#x9;&#x9;&#x9;if (idx == 0)&#xa;    &#x9;&#x9;&#x9;ts.text = txt&#xa;&#x9;&#x9;&#x9;ts.createChild(txt)&#xa;&#x9;&#x9;}&#xa;&#x9;}&#xa;}&#xa;&#xa;def splitPrompt(ui, node, pattern, msg) {&#xa;&#x9;def mark = ui.showInputDialog(node.delegate, msg, &apos;&apos;)&#xa;&#x9;splitText(c, pattern ? (pattern + mark + &apos;)&apos;) : (mark ? mark : &apos;&apos;))&#xa;}&#xa;&#xa;splitPrompt(ui, node, &apos;(?=&apos;, &apos;Enter characters to split node text before...&apos;)&#xa;&#xa;" ID="ID_1987132157" CREATED="1357777843339" MODIFIED="1357777843339"/>
-</node>
-<node TEXT="SplitOnPeriod.groovy" FOLDED="true" ID="ID_262871351" CREATED="1357718506317" MODIFIED="1357774734023">
-<attribute_layout NAME_WIDTH="206" VALUE_WIDTH="206"/>
-<attribute NAME="menuTitleKey" VALUE="Split on period"/>
-<attribute NAME="menuLocation" VALUE="/menu_bar/edit/wikdSplit"/>
-<attribute NAME="executionMode" VALUE="on_single_node"/>
-<attribute NAME="keyboardShortcut" VALUE="control alt PERIOD"/>
-<attribute NAME="execute_scripts_without_asking" VALUE="true"/>
-<attribute NAME="execute_scripts_without_file_restriction" VALUE="true"/>
-<attribute NAME="execute_scripts_without_write_restriction" VALUE="false"/>
-<attribute NAME="execute_scripts_without_exec_restriction" VALUE="false"/>
-<attribute NAME="execute_scripts_without_network_restriction" VALUE="false"/>
-<node TEXT="// @CacheScriptContent(true)&#xa;// @ExecutionModes({ON_SINGLE_NODE})&#xa;&#xa;def splitText(c, mark) {&#xa;&#x9;c.selecteds.every { ts -&gt;&#xa;&#x9;&#x9;ts.plainText.split(mark).collect { it.trim() }.eachWithIndex {&#xa;&#x9;&#x9;&#x9;txt, idx -&gt;&#xa;&#x9;&#x9;&#x9;if (idx == 0)&#xa;    &#x9;&#x9;&#x9;ts.text = txt&#xa;&#x9;&#x9;&#x9;ts.createChild(txt)&#xa;&#x9;&#x9;}&#xa;&#x9;}&#xa;}&#xa;&#xa;&#xa;splitText(c, &apos;\\.&apos;)&#xa;&#xa;" ID="ID_459609392" CREATED="1357777843340" MODIFIED="1357777843340"/>
-</node>
-<node TEXT="SplitOnComma.groovy" FOLDED="true" ID="ID_502099692" CREATED="1357718540955" MODIFIED="1357774743499">
-<attribute_layout NAME_WIDTH="206" VALUE_WIDTH="206"/>
-<attribute NAME="menuTitleKey" VALUE="Split on comma"/>
-<attribute NAME="menuLocation" VALUE="/menu_bar/edit/wikdSplit"/>
-<attribute NAME="executionMode" VALUE="on_single_node"/>
-<attribute NAME="keyboardShortcut" VALUE="control alt COMMA"/>
-<attribute NAME="execute_scripts_without_asking" VALUE="true"/>
-<attribute NAME="execute_scripts_without_file_restriction" VALUE="true"/>
-<attribute NAME="execute_scripts_without_write_restriction" VALUE="false"/>
-<attribute NAME="execute_scripts_without_exec_restriction" VALUE="false"/>
-<attribute NAME="execute_scripts_without_network_restriction" VALUE="false"/>
-<node TEXT="// @CacheScriptContent(true)&#xa;// @ExecutionModes({ON_SINGLE_NODE})&#xa;&#xa;def splitText(c, mark) {&#xa;&#x9;c.selecteds.every { ts -&gt;&#xa;&#x9;&#x9;ts.plainText.split(mark).collect { it.trim() }.eachWithIndex {&#xa;&#x9;&#x9;&#x9;txt, idx -&gt;&#xa;&#x9;&#x9;&#x9;if (idx == 0)&#xa;    &#x9;&#x9;&#x9;ts.text = txt&#xa;&#x9;&#x9;&#x9;ts.createChild(txt)&#xa;&#x9;&#x9;}&#xa;&#x9;}&#xa;}&#xa;&#xa;&#xa;splitText(c, &apos;,&apos;)&#xa;&#xa;&#xa;" ID="ID_1319965793" CREATED="1357777843340" MODIFIED="1357777843341"/>
-</node>
-<node TEXT="SplitOnSpace.groovy" FOLDED="true" ID="ID_1089160930" CREATED="1357718569576" MODIFIED="1357774750504">
-<attribute_layout NAME_WIDTH="206" VALUE_WIDTH="206"/>
-<attribute NAME="menuTitleKey" VALUE="Split on space"/>
-<attribute NAME="menuLocation" VALUE="/menu_bar/edit/wikdSplit"/>
-<attribute NAME="executionMode" VALUE="on_single_node"/>
-<attribute NAME="keyboardShortcut" VALUE="control alt SPACE"/>
-<attribute NAME="execute_scripts_without_asking" VALUE="true"/>
-<attribute NAME="execute_scripts_without_file_restriction" VALUE="true"/>
-<attribute NAME="execute_scripts_without_write_restriction" VALUE="false"/>
-<attribute NAME="execute_scripts_without_exec_restriction" VALUE="false"/>
-<attribute NAME="execute_scripts_without_network_restriction" VALUE="false"/>
-<node TEXT="// @CacheScriptContent(true)&#xa;// @ExecutionModes({ON_SINGLE_NODE})&#xa;&#xa;def splitText(c, mark) {&#xa;&#x9;c.selecteds.every { ts -&gt;&#xa;&#x9;&#x9;ts.plainText.split(mark).collect { it.trim() }.eachWithIndex {&#xa;&#x9;&#x9;&#x9;txt, idx -&gt;&#xa;&#x9;&#x9;&#x9;if (idx == 0)&#xa;    &#x9;&#x9;&#x9;ts.text = txt&#xa;&#x9;&#x9;&#x9;ts.createChild(txt)&#xa;&#x9;&#x9;}&#xa;&#x9;}&#xa;}&#xa;&#xa;&#xa;splitText(c, &apos; &apos;)&#xa;&#xa;" ID="ID_222729640" CREATED="1357777843341" MODIFIED="1357777843341"/>
-</node>
-<node TEXT="SplitOnChars.groovy" FOLDED="true" ID="ID_409172412" CREATED="1357718596650" MODIFIED="1357774764832">
-<attribute_layout NAME_WIDTH="206" VALUE_WIDTH="206"/>
-<attribute NAME="menuTitleKey" VALUE="Split on characters..."/>
-<attribute NAME="menuLocation" VALUE="/menu_bar/edit/wikdSplit"/>
-<attribute NAME="executionMode" VALUE="on_single_node"/>
-<attribute NAME="keyboardShortcut" VALUE="control alt S"/>
-<attribute NAME="execute_scripts_without_asking" VALUE="true"/>
-<attribute NAME="execute_scripts_without_file_restriction" VALUE="true"/>
-<attribute NAME="execute_scripts_without_write_restriction" VALUE="false"/>
-<attribute NAME="execute_scripts_without_exec_restriction" VALUE="false"/>
-<attribute NAME="execute_scripts_without_network_restriction" VALUE="false"/>
-<node TEXT="// @CacheScriptContent(true)&#xa;// @ExecutionModes({ON_SINGLE_NODE})&#xa;&#xa;def splitText(c, mark) {&#xa;&#x9;c.selecteds.every { ts -&gt;&#xa;&#x9;&#x9;ts.plainText.split(mark).collect { it.trim() }.eachWithIndex {&#xa;&#x9;&#x9;&#x9;txt, idx -&gt;&#xa;&#x9;&#x9;&#x9;if (idx == 0)&#xa;    &#x9;&#x9;&#x9;ts.text = txt&#xa;&#x9;&#x9;&#x9;ts.createChild(txt)&#xa;&#x9;&#x9;}&#xa;&#x9;}&#xa;}&#xa;&#xa;def splitPrompt(ui, node, pattern, msg) {&#xa;&#x9;def mark = ui.showInputDialog(node.delegate, msg, &apos;&apos;)&#xa;&#x9;splitText(c, pattern ? (pattern + mark + &apos;)&apos;) : (mark ? mark : &apos;&apos;))&#xa;}&#xa;&#xa;splitPrompt(ui, node, &apos;&apos;, &apos;Enter characters to split node text on...&apos;)&#xa;&#xa;" ID="ID_1453612307" CREATED="1357777843341" MODIFIED="1357777843342"/>
-</node>
-<node TEXT="TrimLastChars.groovy" FOLDED="true" ID="ID_153687606" CREATED="1357718506319" MODIFIED="1357774780274">
-<attribute_layout NAME_WIDTH="206" VALUE_WIDTH="206"/>
-<attribute NAME="menuTitleKey" VALUE="Trim end characters..."/>
-<attribute NAME="menuLocation" VALUE="/menu_bar/edit/wikdTrim"/>
-<attribute NAME="executionMode" VALUE="on_single_node"/>
-<attribute NAME="keyboardShortcut" VALUE="control meta T"/>
-<attribute NAME="execute_scripts_without_asking" VALUE="true"/>
-<attribute NAME="execute_scripts_without_file_restriction" VALUE="true"/>
-<attribute NAME="execute_scripts_without_write_restriction" VALUE="false"/>
-<attribute NAME="execute_scripts_without_exec_restriction" VALUE="false"/>
-<attribute NAME="execute_scripts_without_network_restriction" VALUE="false"/>
-<node TEXT="// @CacheScriptContent(true)&#xa;// @ExecutionModes({ON_SINGLE_NODE})&#xa;&#xa;&#xa;def trimPrompt(c, ui, node, pattern, start, msg) {&#xa;&#x9;def mark = ui.showInputDialog(node.delegate, msg, &apos;&apos;)&#xa;&#x9;mark = start ? pattern + (mark ? mark : &apos;&apos;) : (mark ? mark : &apos;&apos;) + pattern&#xa;&#x9;c.selecteds.every { it.text = it.plainText.replaceFirst(mark, &apos;&apos;) }&#xa;}&#xa;&#xa;&#xa;trimPrompt(c, ui, node, &apos;{1}$&apos;, false, &apos;Enter characters to trim from end of node text...&apos;)&#xa;&#xa;" ID="ID_1020699817" CREATED="1357777843342" MODIFIED="1357777843342"/>
-</node>
-<node TEXT="TrimFirstChars.groovy" FOLDED="true" ID="ID_906915767" CREATED="1357718540957" MODIFIED="1357774788129">
-<attribute_layout NAME_WIDTH="206" VALUE_WIDTH="206"/>
-<attribute NAME="menuTitleKey" VALUE="Trim start characters..."/>
-<attribute NAME="menuLocation" VALUE="/menu_bar/edit/wikdTrim"/>
-<attribute NAME="executionMode" VALUE="on_single_node"/>
-<attribute NAME="keyboardShortcut" VALUE="control alt T"/>
-<attribute NAME="execute_scripts_without_asking" VALUE="true"/>
-<attribute NAME="execute_scripts_without_file_restriction" VALUE="true"/>
-<attribute NAME="execute_scripts_without_write_restriction" VALUE="false"/>
-<attribute NAME="execute_scripts_without_exec_restriction" VALUE="false"/>
-<attribute NAME="execute_scripts_without_network_restriction" VALUE="false"/>
-<node TEXT="// @CacheScriptContent(true)&#xa;// @ExecutionModes({ON_SINGLE_NODE})&#xa;&#xa;&#xa;def trimPrompt(c, ui, node, pattern, start, msg) {&#xa;&#x9;def mark = ui.showInputDialog(node.delegate, msg, &apos;&apos;)&#xa;&#x9;mark = start ? pattern + (mark ? mark : &apos;&apos;) : (mark ? mark : &apos;&apos;) + pattern&#xa;&#x9;c.selecteds.every { it.text = it.plainText.replaceFirst(mark, &apos;&apos;) }&#xa;}&#xa;&#xa;&#xa;trimPrompt(c, ui, node, &apos;^{1}&apos;, true, &apos;Enter characters to trim from start of node text...&apos;)&#xa;&#xa;" ID="ID_1836215014" CREATED="1357777843343" MODIFIED="1357777843343"/>
-</node>
-</node>
-<node TEXT="zips" POSITION="right" ID="ID_269135974" CREATED="1357715827053" MODIFIED="1357777773050">
-<edge COLOR="#007c00"/>
-<richcontent TYPE="NOTE">
-
-<html>
-  <head>
-    
-  </head>
-  <body>
-    <p>
-      An add-on may contain any number of nodes containing zip files.
-    </p>
-    <p>
-      
-    </p>
-    <p>
-      &#160;- The immediate child nodes contain a description of the zip. The devtools script releaseAddOn.groovy allows automatic zip creation if the name of this node matches a directory in the current directory.
-    </p>
-    <p>
-      
-    </p>
-    <p>
-      &#160;- The child nodes of these nodes contain the actual zip files.
-    </p>
-    <p>
-      
-    </p>
-    <p>
-      &#160;- Any zip file will be extracted in the &lt;installationbase&gt;. Currently, &lt;installationbase&gt; is always Freeplane's &lt;userhome&gt;, e.g. ~/.freeplane/1.2.
-    </p>
-    <p>
-      
-    </p>
-    <p>
-      &#160;- The files will be processed in the sequence as seen in the map.
-    </p>
-    <p>
-      
-    </p>
-    <p>
-      &#160;- Zip files must be uploaded into the map via the script <i>Tools-&gt;Scripts-&gt;Insert Binary</i>&#160;since they have to be (base64) encoded as simple strings.
-    </p>
-  </body>
-</html>
-</richcontent>
-<attribute_layout NAME_WIDTH="100" VALUE_WIDTH="100"/>
-</node>
-<node TEXT="images" POSITION="right" ID="ID_112966804" CREATED="1357715827065" MODIFIED="1357777773053">
-<edge COLOR="#7c007c"/>
-<richcontent TYPE="NOTE">
-
-<html>
-  <head>
-    
-  </head>
-  <body>
-    <p>
-      An add-on may define any number of images as child nodes of the images node. The actual image data has to be placed as base64 encoded binary data into the text of a subnode.
-    </p>
-    <p>
-      The images are saved to the <i>${installationbase}/resources/images</i>&#160;directory.
-    </p>
-    <p>
-      
-    </p>
-    <p>
-      The following images should be present:
-    </p>
-    <ul>
-      <li>
-        <i>${name}.png</i>, like <i>oldicons-theme.png</i>. This will be used in the app-on details dialog.
-      </li>
-      <li>
-        <i>${name}-icon.png</i>, like <i>oldicons-theme-icon.png</i>. This will be used in the app-on overview.
-      </li>
-    </ul>
-    <p>
-      Images can be added automatically by releaseAddOn.groovy or must be uploaded into the map via the script <i>Tools-&gt;Scripts-&gt;Insert Binary</i>&#160;since they have to be (base64) encoded as simple strings.
-    </p>
-  </body>
-</html>
-</richcontent>
-<attribute_layout NAME_WIDTH="100" VALUE_WIDTH="100"/>
-</node>
-</node>
-</map>
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.