From d607f03fa0c86fb6abd6d7b1b75730fb128fd43f Mon Sep 17 00:00:00 2001
From: Christopher Willis-Ford <cwillisf@media.mit.edu>
Date: Thu, 31 Aug 2017 10:55:39 -0700
Subject: [PATCH] Simplify bulk toolbox XML construction

---
 src/lib/make-toolbox-xml.js | 1197 ++++++++++++++++++-----------------
 1 file changed, 599 insertions(+), 598 deletions(-)

diff --git a/src/lib/make-toolbox-xml.js b/src/lib/make-toolbox-xml.js
index 27a917ff0..cbdbf771e 100644
--- a/src/lib/make-toolbox-xml.js
+++ b/src/lib/make-toolbox-xml.js
@@ -1,609 +1,609 @@
 const separator = '<sep gap="45"/>';
 
-const motion = [
-    '<category name="Motion" colour="#4C97FF" secondaryColour="#3373CC">',
-    '    <block type="motion_movesteps">',
-    '        <value name="STEPS">',
-    '            <shadow type="math_number">',
-    '                <field name="NUM">10</field>',
-    '            </shadow>',
-    '        </value>',
-    '    </block>',
-    '    <block type="motion_turnright">',
-    '        <value name="DEGREES">',
-    '            <shadow type="math_number">',
-    '                <field name="NUM">15</field>',
-    '            </shadow>',
-    '        </value>',
-    '    </block>',
-    '    <block type="motion_turnleft">',
-    '        <value name="DEGREES">',
-    '            <shadow type="math_number">',
-    '                <field name="NUM">15</field>',
-    '            </shadow>',
-    '        </value>',
-    '    </block>',
-    '    <block type="motion_pointindirection">',
-    '        <value name="DIRECTION">',
-    '            <shadow type="math_angle">',
-    '                <field name="NUM">90</field>',
-    '            </shadow>',
-    '        </value>',
-    '    </block>',
-    '    <block type="motion_pointtowards">',
-    '        <value name="TOWARDS">',
-    '            <shadow type="motion_pointtowards_menu">',
-    '            </shadow>',
-    '        </value>',
-    '    </block>',
-    '    <block type="motion_gotoxy">',
-    '        <value name="X">',
-    '            <shadow type="math_number">',
-    '                <field name="NUM">0</field>',
-    '            </shadow>',
-    '        </value>',
-    '        <value name="Y">',
-    '            <shadow type="math_number">',
-    '                <field name="NUM">0</field>',
-    '            </shadow>',
-    '        </value>',
-    '    </block>',
-    '    <block type="motion_goto">',
-    '        <value name="TO">',
-    '            <shadow type="motion_goto_menu">',
-    '            </shadow>',
-    '        </value>',
-    '    </block>',
-    '    <block type="motion_glidesecstoxy">',
-    '        <value name="SECS">',
-    '            <shadow type="math_number">',
-    '                <field name="NUM">1</field>',
-    '            </shadow>',
-    '        </value>',
-    '        <value name="X">',
-    '            <shadow type="math_number">',
-    '                <field name="NUM">0</field>',
-    '            </shadow>',
-    '        </value>',
-    '        <value name="Y">',
-    '            <shadow type="math_number">',
-    '                <field name="NUM">0</field>',
-    '            </shadow>',
-    '        </value>',
-    '    </block>',
-    '    <block type="motion_changexby">',
-    '        <value name="DX">',
-    '            <shadow type="math_number">',
-    '                <field name="NUM">10</field>',
-    '            </shadow>',
-    '        </value>',
-    '    </block>',
-    '    <block type="motion_setx">',
-    '        <value name="X">',
-    '            <shadow type="math_number">',
-    '                <field name="NUM">0</field>',
-    '            </shadow>',
-    '        </value>',
-    '    </block>',
-    '    <block type="motion_changeyby">',
-    '        <value name="DY">',
-    '            <shadow type="math_number">',
-    '                <field name="NUM">10</field>',
-    '            </shadow>',
-    '        </value>',
-    '    </block>',
-    '    <block type="motion_sety">',
-    '        <value name="Y">',
-    '            <shadow type="math_number">',
-    '                <field name="NUM">0</field>',
-    '            </shadow>',
-    '        </value>',
-    '    </block>',
-    '    <block type="motion_ifonedgebounce"/>',
-    '    <block type="motion_setrotationstyle"/>',
-    '    <block type="motion_xposition"/>',
-    '    <block type="motion_yposition"/>',
-    '    <block type="motion_direction"/>',
-    '</category>'
-];
+const motion = `
+    <category name="Motion" colour="#4C97FF" secondaryColour="#3373CC">
+        <block type="motion_movesteps">
+            <value name="STEPS">
+                <shadow type="math_number">
+                    <field name="NUM">10</field>
+                </shadow>
+            </value>
+        </block>
+        <block type="motion_turnright">
+            <value name="DEGREES">
+                <shadow type="math_number">
+                    <field name="NUM">15</field>
+                </shadow>
+            </value>
+        </block>
+        <block type="motion_turnleft">
+            <value name="DEGREES">
+                <shadow type="math_number">
+                    <field name="NUM">15</field>
+                </shadow>
+            </value>
+        </block>
+        <block type="motion_pointindirection">
+            <value name="DIRECTION">
+                <shadow type="math_angle">
+                    <field name="NUM">90</field>
+                </shadow>
+            </value>
+        </block>
+        <block type="motion_pointtowards">
+            <value name="TOWARDS">
+                <shadow type="motion_pointtowards_menu">
+                </shadow>
+            </value>
+        </block>
+        <block type="motion_gotoxy">
+            <value name="X">
+                <shadow type="math_number">
+                    <field name="NUM">0</field>
+                </shadow>
+            </value>
+            <value name="Y">
+                <shadow type="math_number">
+                    <field name="NUM">0</field>
+                </shadow>
+            </value>
+        </block>
+        <block type="motion_goto">
+            <value name="TO">
+                <shadow type="motion_goto_menu">
+                </shadow>
+            </value>
+        </block>
+        <block type="motion_glidesecstoxy">
+            <value name="SECS">
+                <shadow type="math_number">
+                    <field name="NUM">1</field>
+                </shadow>
+            </value>
+            <value name="X">
+                <shadow type="math_number">
+                    <field name="NUM">0</field>
+                </shadow>
+            </value>
+            <value name="Y">
+                <shadow type="math_number">
+                    <field name="NUM">0</field>
+                </shadow>
+            </value>
+        </block>
+        <block type="motion_changexby">
+            <value name="DX">
+                <shadow type="math_number">
+                    <field name="NUM">10</field>
+                </shadow>
+            </value>
+        </block>
+        <block type="motion_setx">
+            <value name="X">
+                <shadow type="math_number">
+                    <field name="NUM">0</field>
+                </shadow>
+            </value>
+        </block>
+        <block type="motion_changeyby">
+            <value name="DY">
+                <shadow type="math_number">
+                    <field name="NUM">10</field>
+                </shadow>
+            </value>
+        </block>
+        <block type="motion_sety">
+            <value name="Y">
+                <shadow type="math_number">
+                    <field name="NUM">0</field>
+                </shadow>
+            </value>
+        </block>
+        <block type="motion_ifonedgebounce"/>
+        <block type="motion_setrotationstyle"/>
+        <block type="motion_xposition"/>
+        <block type="motion_yposition"/>
+        <block type="motion_direction"/>
+    </category>
+`;
 
-const looks = [
-    '<category name="Looks" colour="#9966FF" secondaryColour="#774DCB">',
-    '    <block type="looks_show"/>',
-    '    <block type="looks_hide"/>',
-    '    <block type="looks_switchcostumeto">',
-    '        <value name="COSTUME">',
-    '            <shadow type="looks_costume"/>',
-    '        </value>',
-    '    </block>',
-    '    <block type="looks_nextcostume"/>',
-    '    <block type="looks_nextbackdrop"/>',
-    '    <block type="looks_switchbackdropto">',
-    '        <value name="BACKDROP">',
-    '            <shadow type="looks_backdrops"/>',
-    '        </value>',
-    '    </block>',
-    '    <block type="looks_switchbackdroptoandwait">',
-    '        <value name="BACKDROP">',
-    '            <shadow type="looks_backdrops"/>',
-    '        </value>',
-    '    </block>',
-    '    <block type="looks_changeeffectby">',
-    '        <value name="CHANGE">',
-    '            <shadow type="math_number">',
-    '                <field name="NUM">10</field>',
-    '            </shadow>',
-    '        </value>',
-    '    </block>',
-    '    <block type="looks_seteffectto">',
-    '        <value name="VALUE">',
-    '            <shadow type="math_number">',
-    '                <field name="NUM">10</field>',
-    '            </shadow>',
-    '        </value>',
-    '    </block>',
-    '    <block type="looks_cleargraphiceffects"/>',
-    '    <block type="looks_changesizeby">',
-    '        <value name="CHANGE">',
-    '            <shadow type="math_number">',
-    '                <field name="NUM">10</field>',
-    '            </shadow>',
-    '        </value>',
-    '    </block>',
-    '    <block type="looks_setsizeto">',
-    '        <value name="SIZE">',
-    '            <shadow type="math_number">',
-    '                <field name="NUM">100</field>',
-    '            </shadow>',
-    '        </value>',
-    '    </block>',
-    '    <block type="looks_gotofront"/>',
-    '    <block type="looks_gobacklayers">',
-    '        <value name="NUM">',
-    '            <shadow type="math_integer">',
-    '                <field name="NUM">1</field>',
-    '            </shadow>',
-    '        </value>',
-    '    </block>',
-    '    <block type="looks_costumeorder"/>',
-    '    <block type="looks_backdroporder"/>',
-    '    <block type="looks_backdropname"/>',
-    '    <block type="looks_size"/>',
-    '</category>'
-];
+const looks = `
+    <category name="Looks" colour="#9966FF" secondaryColour="#774DCB">
+        <block type="looks_show"/>
+        <block type="looks_hide"/>
+        <block type="looks_switchcostumeto">
+            <value name="COSTUME">
+                <shadow type="looks_costume"/>
+            </value>
+        </block>
+        <block type="looks_nextcostume"/>
+        <block type="looks_nextbackdrop"/>
+        <block type="looks_switchbackdropto">
+            <value name="BACKDROP">
+                <shadow type="looks_backdrops"/>
+            </value>
+        </block>
+        <block type="looks_switchbackdroptoandwait">
+            <value name="BACKDROP">
+                <shadow type="looks_backdrops"/>
+            </value>
+        </block>
+        <block type="looks_changeeffectby">
+            <value name="CHANGE">
+                <shadow type="math_number">
+                    <field name="NUM">10</field>
+                </shadow>
+            </value>
+        </block>
+        <block type="looks_seteffectto">
+            <value name="VALUE">
+                <shadow type="math_number">
+                    <field name="NUM">10</field>
+                </shadow>
+            </value>
+        </block>
+        <block type="looks_cleargraphiceffects"/>
+        <block type="looks_changesizeby">
+            <value name="CHANGE">
+                <shadow type="math_number">
+                    <field name="NUM">10</field>
+                </shadow>
+            </value>
+        </block>
+        <block type="looks_setsizeto">
+            <value name="SIZE">
+                <shadow type="math_number">
+                    <field name="NUM">100</field>
+                </shadow>
+            </value>
+        </block>
+        <block type="looks_gotofront"/>
+        <block type="looks_gobacklayers">
+            <value name="NUM">
+                <shadow type="math_integer">
+                    <field name="NUM">1</field>
+                </shadow>
+            </value>
+        </block>
+        <block type="looks_costumeorder"/>
+        <block type="looks_backdroporder"/>
+        <block type="looks_backdropname"/>
+        <block type="looks_size"/>
+    </category>
+`;
 
-const sound = [
-    '<category name="Sound" colour="#D65CD6" secondaryColour="#BD42BD">',
-    '    <block type="sound_play">',
-    '        <value name="SOUND_MENU">',
-    '            <shadow type="sound_sounds_menu"/>',
-    '        </value>',
-    '    </block>',
-    '    <block type="sound_playuntildone">',
-    '        <value name="SOUND_MENU">',
-    '            <shadow type="sound_sounds_menu"/>',
-    '        </value>',
-    '    </block>',
-    '    <block type="sound_stopallsounds"/>',
-    '    <block type="sound_playdrumforbeats">',
-    '        <value name="DRUM">',
-    '            <shadow type="sound_drums_menu"/>',
-    '        </value>',
-    '        <value name="BEATS">',
-    '            <shadow type="math_number">',
-    '                <field name="NUM">0.25</field>',
-    '            </shadow>',
-    '        </value>',
-    '    </block>',
-    '    <block type="sound_restforbeats">',
-    '        <value name="BEATS">',
-    '            <shadow type="math_number">',
-    '                <field name="NUM">0.25</field>',
-    '            </shadow>',
-    '        </value>',
-    '    </block>',
-    '    <block type="sound_playnoteforbeats">',
-    '        <value name="NOTE">',
-    '            <shadow type="math_number">',
-    '                <field name="NUM">60</field>',
-    '            </shadow>',
-    '        </value>',
-    '        <value name="BEATS">',
-    '            <shadow type="math_number">',
-    '                <field name="NUM">0.5</field>',
-    '            </shadow>',
-    '        </value>',
-    '    </block>',
-    '    <block type="sound_setinstrumentto">',
-    '        <value name="INSTRUMENT">',
-    '            <shadow type="sound_instruments_menu"/>',
-    '        </value>',
-    '    </block>',
-    '    <block type="sound_changeeffectby">',
-    '        <value name="VALUE">',
-    '            <shadow type="math_number">',
-    '                <field name="NUM">10</field>',
-    '            </shadow>',
-    '        </value>',
-    '    </block>',
-    '    <block type="sound_seteffectto">',
-    '        <value name="VALUE">',
-    '            <shadow type="math_number">',
-    '                <field name="NUM">100</field>',
-    '            </shadow>',
-    '        </value>',
-    '    </block>',
-    '    <block type="sound_cleareffects"/>',
-    '    <block type="sound_changevolumeby">',
-    '        <value name="VOLUME">',
-    '            <shadow type="math_number">',
-    '                <field name="NUM">-10</field>',
-    '            </shadow>',
-    '        </value>',
-    '    </block>',
-    '    <block type="sound_setvolumeto">',
-    '        <value name="VOLUME">',
-    '            <shadow type="math_number">',
-    '                <field name="NUM">100</field>',
-    '            </shadow>',
-    '        </value>',
-    '    </block>',
-    '    <block type="sound_volume"/>',
-    '    <block type="sound_changetempoby">',
-    '        <value name="TEMPO">',
-    '            <shadow type="math_number">',
-    '                <field name="NUM">20</field>',
-    '            </shadow>',
-    '        </value>',
-    '    </block>',
-    '    <block type="sound_settempotobpm">',
-    '        <value name="TEMPO">',
-    '            <shadow type="math_number">',
-    '                <field name="NUM">60</field>',
-    '            </shadow>',
-    '        </value>',
-    '    </block>',
-    '    <block type="sound_tempo"/>',
-    '</category>'
-];
+const sound = `
+    <category name="Sound" colour="#D65CD6" secondaryColour="#BD42BD">
+        <block type="sound_play">
+            <value name="SOUND_MENU">
+                <shadow type="sound_sounds_menu"/>
+            </value>
+        </block>
+        <block type="sound_playuntildone">
+            <value name="SOUND_MENU">
+                <shadow type="sound_sounds_menu"/>
+            </value>
+        </block>
+        <block type="sound_stopallsounds"/>
+        <block type="sound_playdrumforbeats">
+            <value name="DRUM">
+                <shadow type="sound_drums_menu"/>
+            </value>
+            <value name="BEATS">
+                <shadow type="math_number">
+                    <field name="NUM">0.25</field>
+                </shadow>
+            </value>
+        </block>
+        <block type="sound_restforbeats">
+            <value name="BEATS">
+                <shadow type="math_number">
+                    <field name="NUM">0.25</field>
+                </shadow>
+            </value>
+        </block>
+        <block type="sound_playnoteforbeats">
+            <value name="NOTE">
+                <shadow type="math_number">
+                    <field name="NUM">60</field>
+                </shadow>
+            </value>
+            <value name="BEATS">
+                <shadow type="math_number">
+                    <field name="NUM">0.5</field>
+                </shadow>
+            </value>
+        </block>
+        <block type="sound_setinstrumentto">
+            <value name="INSTRUMENT">
+                <shadow type="sound_instruments_menu"/>
+            </value>
+        </block>
+        <block type="sound_changeeffectby">
+            <value name="VALUE">
+                <shadow type="math_number">
+                    <field name="NUM">10</field>
+                </shadow>
+            </value>
+        </block>
+        <block type="sound_seteffectto">
+            <value name="VALUE">
+                <shadow type="math_number">
+                    <field name="NUM">100</field>
+                </shadow>
+            </value>
+        </block>
+        <block type="sound_cleareffects"/>
+        <block type="sound_changevolumeby">
+            <value name="VOLUME">
+                <shadow type="math_number">
+                    <field name="NUM">-10</field>
+                </shadow>
+            </value>
+        </block>
+        <block type="sound_setvolumeto">
+            <value name="VOLUME">
+                <shadow type="math_number">
+                    <field name="NUM">100</field>
+                </shadow>
+            </value>
+        </block>
+        <block type="sound_volume"/>
+        <block type="sound_changetempoby">
+            <value name="TEMPO">
+                <shadow type="math_number">
+                    <field name="NUM">20</field>
+                </shadow>
+            </value>
+        </block>
+        <block type="sound_settempotobpm">
+            <value name="TEMPO">
+                <shadow type="math_number">
+                    <field name="NUM">60</field>
+                </shadow>
+            </value>
+        </block>
+        <block type="sound_tempo"/>
+    </category>
+`;
 
-const pen = [
-    '<category name="Pen" colour="#00B295" secondaryColour="#0B8E69">',
-    '    <block type="pen_clear"/>',
-    '    <block type="pen_stamp"/>',
-    '    <block type="pen_pendown"/>',
-    '    <block type="pen_penup"/>',
-    '    <block type="pen_setpencolortocolor">',
-    '        <value name="COLOR">',
-    '            <shadow type="colour_picker">',
-    '            </shadow>',
-    '        </value>',
-    '    </block>',
-    '    <block type="pen_changepencolorby">',
-    '        <value name="COLOR">',
-    '            <shadow type="math_number">',
-    '                <field name="NUM">10</field>',
-    '            </shadow>',
-    '        </value>',
-    '    </block>',
-    '    <block type="pen_setpencolortonum">',
-    '        <value name="COLOR">',
-    '            <shadow type="math_number">',
-    '                <field name="NUM">0</field>',
-    '            </shadow>',
-    '        </value>',
-    '    </block>',
-    '    <block type="pen_changepenshadeby">',
-    '        <value name="SHADE">',
-    '            <shadow type="math_number">',
-    '                <field name="NUM">10</field>',
-    '            </shadow>',
-    '        </value>',
-    '    </block>',
-    '    <block type="pen_setpenshadeto">',
-    '        <value name="SHADE">',
-    '            <shadow type="math_number">',
-    '                <field name="NUM">50</field>',
-    '            </shadow>',
-    '        </value>',
-    '    </block>',
-    '    <block type="pen_changepensizeby">',
-    '        <value name="SIZE">',
-    '            <shadow type="math_number">',
-    '                <field name="NUM">1</field>',
-    '            </shadow>',
-    '        </value>',
-    '    </block>',
-    '    <block type="pen_setpensizeto">',
-    '        <value name="SIZE">',
-    '            <shadow type="math_number">',
-    '                <field name="NUM">1</field>',
-    '            </shadow>',
-    '        </value>',
-    '    </block>',
-    '</category>'
-];
+const pen = `
+    <category name="Pen" colour="#00B295" secondaryColour="#0B8E69">
+        <block type="pen_clear"/>
+        <block type="pen_stamp"/>
+        <block type="pen_pendown"/>
+        <block type="pen_penup"/>
+        <block type="pen_setpencolortocolor">
+            <value name="COLOR">
+                <shadow type="colour_picker">
+                </shadow>
+            </value>
+        </block>
+        <block type="pen_changepencolorby">
+            <value name="COLOR">
+                <shadow type="math_number">
+                    <field name="NUM">10</field>
+                </shadow>
+            </value>
+        </block>
+        <block type="pen_setpencolortonum">
+            <value name="COLOR">
+                <shadow type="math_number">
+                    <field name="NUM">0</field>
+                </shadow>
+            </value>
+        </block>
+        <block type="pen_changepenshadeby">
+            <value name="SHADE">
+                <shadow type="math_number">
+                    <field name="NUM">10</field>
+                </shadow>
+            </value>
+        </block>
+        <block type="pen_setpenshadeto">
+            <value name="SHADE">
+                <shadow type="math_number">
+                    <field name="NUM">50</field>
+                </shadow>
+            </value>
+        </block>
+        <block type="pen_changepensizeby">
+            <value name="SIZE">
+                <shadow type="math_number">
+                    <field name="NUM">1</field>
+                </shadow>
+            </value>
+        </block>
+        <block type="pen_setpensizeto">
+            <value name="SIZE">
+                <shadow type="math_number">
+                    <field name="NUM">1</field>
+                </shadow>
+            </value>
+        </block>
+    </category>
+`;
 
-const events = [
-    '<category name="Events" colour="#FFD500" secondaryColour="#CC9900">',
-    '    <block type="event_whenflagclicked"/>',
-    '    <block type="event_whenkeypressed">',
-    '    </block>',
-    '    <block type="event_whenthisspriteclicked"/>',
-    '    <block type="event_whenbackdropswitchesto">',
-    '    </block>',
-    '    <block type="event_whengreaterthan">',
-    '        <value name="VALUE">',
-    '            <shadow type="math_number">',
-    '                <field name="NUM">10</field>',
-    '            </shadow>',
-    '        </value>',
-    '    </block>',
-    '    <block type="event_whenbroadcastreceived">',
-    '    </block>',
-    '    <block type="event_broadcast">',
-    '        <value name="BROADCAST_OPTION">',
-    '            <shadow type="event_broadcast_menu"/>',
-    '        </value>',
-    '    </block>',
-    '    <block type="event_broadcastandwait">',
-    '        <value name="BROADCAST_OPTION">',
-    '            <shadow type="event_broadcast_menu"/>',
-    '        </value>',
-    '    </block>',
-    '</category>'
-];
+const events = `
+    <category name="Events" colour="#FFD500" secondaryColour="#CC9900">
+        <block type="event_whenflagclicked"/>
+        <block type="event_whenkeypressed">
+        </block>
+        <block type="event_whenthisspriteclicked"/>
+        <block type="event_whenbackdropswitchesto">
+        </block>
+        <block type="event_whengreaterthan">
+            <value name="VALUE">
+                <shadow type="math_number">
+                    <field name="NUM">10</field>
+                </shadow>
+            </value>
+        </block>
+        <block type="event_whenbroadcastreceived">
+        </block>
+        <block type="event_broadcast">
+            <value name="BROADCAST_OPTION">
+                <shadow type="event_broadcast_menu"/>
+            </value>
+        </block>
+        <block type="event_broadcastandwait">
+            <value name="BROADCAST_OPTION">
+                <shadow type="event_broadcast_menu"/>
+            </value>
+        </block>
+    </category>
+`;
 
-const control = [
-    '<category name="Control" colour="#FFAB19" secondaryColour="#CF8B17">',
-    '    <block type="control_wait">',
-    '        <value name="DURATION">',
-    '            <shadow type="math_positive_number">',
-    '                <field name="NUM">1</field>',
-    '            </shadow>',
-    '        </value>',
-    '    </block>',
-    '    <block type="control_repeat">',
-    '        <value name="TIMES">',
-    '            <shadow type="math_whole_number">',
-    '                <field name="NUM">10</field>',
-    '            </shadow>',
-    '        </value>',
-    '    </block>',
-    '    <block type="control_forever"/>',
-    '    <block type="control_if"/>',
-    '    <block type="control_if_else"/>',
-    '    <block type="control_wait_until"/>',
-    '    <block type="control_repeat_until"/>',
-    '    <block type="control_stop"/>',
-    '    <block type="control_start_as_clone"/>',
-    '    <block type="control_create_clone_of">',
-    '        <value name="CLONE_OPTION">',
-    '            <shadow type="control_create_clone_of_menu"/>',
-    '        </value>',
-    '    </block>',
-    '    <block type="control_delete_this_clone"/>',
-    '</category>'
-];
+const control = `
+    <category name="Control" colour="#FFAB19" secondaryColour="#CF8B17">
+        <block type="control_wait">
+            <value name="DURATION">
+                <shadow type="math_positive_number">
+                    <field name="NUM">1</field>
+                </shadow>
+            </value>
+        </block>
+        <block type="control_repeat">
+            <value name="TIMES">
+                <shadow type="math_whole_number">
+                    <field name="NUM">10</field>
+                </shadow>
+            </value>
+        </block>
+        <block type="control_forever"/>
+        <block type="control_if"/>
+        <block type="control_if_else"/>
+        <block type="control_wait_until"/>
+        <block type="control_repeat_until"/>
+        <block type="control_stop"/>
+        <block type="control_start_as_clone"/>
+        <block type="control_create_clone_of">
+            <value name="CLONE_OPTION">
+                <shadow type="control_create_clone_of_menu"/>
+            </value>
+        </block>
+        <block type="control_delete_this_clone"/>
+    </category>
+`;
 
-const sensing = [
-    '<category name="Sensing" colour="#4CBFE6" secondaryColour="#2E8EB8">',
-    '    <block type="sensing_touchingobject">',
-    '        <value name="TOUCHINGOBJECTMENU">',
-    '            <shadow type="sensing_touchingobjectmenu"/>',
-    '        </value>',
-    '    </block>',
-    '    <block type="sensing_touchingcolor">',
-    '        <value name="COLOR">',
-    '            <shadow type="colour_picker"/>',
-    '        </value>',
-    '    </block>',
-    '    <block type="sensing_coloristouchingcolor">',
-    '        <value name="COLOR">',
-    '            <shadow type="colour_picker"/>',
-    '        </value>',
-    '        <value name="COLOR2">',
-    '            <shadow type="colour_picker"/>',
-    '        </value>',
-    '    </block>',
-    '    <block type="sensing_distanceto">',
-    '        <value name="DISTANCETOMENU">',
-    '            <shadow type="sensing_distancetomenu"/>',
-    '        </value>',
-    '    </block>',
-    '    <block type="sensing_keypressed">',
-    '        <value name="KEY_OPTION">',
-    '            <shadow type="sensing_keyoptions"/>',
-    '        </value>',
-    '    </block>',
-    '    <block type="sensing_mousedown"/>',
-    '    <block type="sensing_mousex"/>',
-    '    <block type="sensing_mousey"/>',
-    '    <block type="sensing_loudness"/>',
-    '    <block type="sensing_timer"/>',
-    '    <block type="sensing_resettimer"/>',
-    '    <block type="sensing_of">',
-    '        <value name="PROPERTY">',
-    '            <shadow type="sensing_of_property_menu"/>',
-    '        </value>',
-    '        <value name="OBJECT">',
-    '            <shadow type="sensing_of_object_menu"/>',
-    '        </value>',
-    '    </block>',
-    '    <block type="sensing_current">',
-    '        <value name="CURRENTMENU">',
-    '            <shadow type="sensing_currentmenu"/>',
-    '        </value>',
-    '    </block>',
-    '    <block type="sensing_dayssince2000"/>',
-    '</category>'
-];
+const sensing = `
+    <category name="Sensing" colour="#4CBFE6" secondaryColour="#2E8EB8">
+        <block type="sensing_touchingobject">
+            <value name="TOUCHINGOBJECTMENU">
+                <shadow type="sensing_touchingobjectmenu"/>
+            </value>
+        </block>
+        <block type="sensing_touchingcolor">
+            <value name="COLOR">
+                <shadow type="colour_picker"/>
+            </value>
+        </block>
+        <block type="sensing_coloristouchingcolor">
+            <value name="COLOR">
+                <shadow type="colour_picker"/>
+            </value>
+            <value name="COLOR2">
+                <shadow type="colour_picker"/>
+            </value>
+        </block>
+        <block type="sensing_distanceto">
+            <value name="DISTANCETOMENU">
+                <shadow type="sensing_distancetomenu"/>
+            </value>
+        </block>
+        <block type="sensing_keypressed">
+            <value name="KEY_OPTION">
+                <shadow type="sensing_keyoptions"/>
+            </value>
+        </block>
+        <block type="sensing_mousedown"/>
+        <block type="sensing_mousex"/>
+        <block type="sensing_mousey"/>
+        <block type="sensing_loudness"/>
+        <block type="sensing_timer"/>
+        <block type="sensing_resettimer"/>
+        <block type="sensing_of">
+            <value name="PROPERTY">
+                <shadow type="sensing_of_property_menu"/>
+            </value>
+            <value name="OBJECT">
+                <shadow type="sensing_of_object_menu"/>
+            </value>
+        </block>
+        <block type="sensing_current">
+            <value name="CURRENTMENU">
+                <shadow type="sensing_currentmenu"/>
+            </value>
+        </block>
+        <block type="sensing_dayssince2000"/>
+    </category>
+`;
 
-const operators = [
-    '<category name="Operators" colour="#40BF4A" secondaryColour="#389438">',
-    '    <block type="operator_add">',
-    '        <value name="NUM1">',
-    '            <shadow type="math_number">',
-    '                <field name="NUM"/>',
-    '            </shadow>',
-    '        </value>',
-    '        <value name="NUM2">',
-    '            <shadow type="math_number">',
-    '                <field name="NUM"/>',
-    '            </shadow>',
-    '        </value>',
-    '    </block>',
-    '    <block type="operator_subtract">',
-    '        <value name="NUM1">',
-    '            <shadow type="math_number">',
-    '                <field name="NUM"/>',
-    '            </shadow>',
-    '        </value>',
-    '        <value name="NUM2">',
-    '            <shadow type="math_number">',
-    '                <field name="NUM"/>',
-    '            </shadow>',
-    '        </value>',
-    '    </block>',
-    '    <block type="operator_multiply">',
-    '        <value name="NUM1">',
-    '            <shadow type="math_number">',
-    '                <field name="NUM"/>',
-    '            </shadow>',
-    '        </value>',
-    '        <value name="NUM2">',
-    '            <shadow type="math_number">',
-    '                <field name="NUM"/>',
-    '            </shadow>',
-    '        </value>',
-    '    </block>',
-    '    <block type="operator_divide">',
-    '        <value name="NUM1">',
-    '            <shadow type="math_number">',
-    '                <field name="NUM"/>',
-    '            </shadow>',
-    '        </value>',
-    '        <value name="NUM2">',
-    '            <shadow type="math_number">',
-    '                <field name="NUM"/>',
-    '            </shadow>',
-    '        </value>',
-    '    </block>',
-    '    <block type="operator_random">',
-    '        <value name="FROM">',
-    '            <shadow type="math_number">',
-    '                <field name="NUM">1</field>',
-    '            </shadow>',
-    '        </value>',
-    '        <value name="TO">',
-    '            <shadow type="math_number">',
-    '                <field name="NUM">10</field>',
-    '            </shadow>',
-    '        </value>',
-    '    </block>',
-    '    <block type="operator_lt">',
-    '        <value name="OPERAND1">',
-    '            <shadow type="text">',
-    '                <field name="TEXT"/>',
-    '            </shadow>',
-    '        </value>',
-    '        <value name="OPERAND2">',
-    '            <shadow type="text">',
-    '                <field name="TEXT"/>',
-    '            </shadow>',
-    '        </value>',
-    '    </block>',
-    '    <block type="operator_equals">',
-    '        <value name="OPERAND1">',
-    '            <shadow type="text">',
-    '                <field name="TEXT"/>',
-    '            </shadow>',
-    '        </value>',
-    '        <value name="OPERAND2">',
-    '            <shadow type="text">',
-    '                <field name="TEXT"/>',
-    '            </shadow>',
-    '        </value>',
-    '    </block>',
-    '    <block type="operator_gt">',
-    '        <value name="OPERAND1">',
-    '            <shadow type="text">',
-    '                <field name="TEXT"/>',
-    '            </shadow>',
-    '        </value>',
-    '        <value name="OPERAND2">',
-    '            <shadow type="text">',
-    '                <field name="TEXT"/>',
-    '            </shadow>',
-    '        </value>',
-    '    </block>',
-    '    <block type="operator_and"/>',
-    '    <block type="operator_or"/>',
-    '    <block type="operator_not"/>',
-    '    <block type="operator_join">',
-    '        <value name="STRING1">',
-    '            <shadow type="text">',
-    '                <field name="TEXT">hello</field>',
-    '            </shadow>',
-    '        </value>',
-    '        <value name="STRING2">',
-    '            <shadow type="text">',
-    '                <field name="TEXT">world</field>',
-    '            </shadow>',
-    '        </value>',
-    '    </block>',
-    '    <block type="operator_letter_of">',
-    '        <value name="LETTER">',
-    '            <shadow type="math_whole_number">',
-    '                <field name="NUM">1</field>',
-    '            </shadow>',
-    '        </value>',
-    '        <value name="STRING">',
-    '            <shadow type="text">',
-    '                <field name="TEXT">world</field>',
-    '            </shadow>',
-    '        </value>',
-    '    </block>',
-    '    <block type="operator_length">',
-    '        <value name="STRING">',
-    '            <shadow type="text">',
-    '                <field name="TEXT">world</field>',
-    '            </shadow>',
-    '        </value>',
-    '    </block>',
-    '    <block type="operator_mod">',
-    '        <value name="NUM1">',
-    '            <shadow type="math_number">',
-    '                <field name="NUM"/>',
-    '            </shadow>',
-    '        </value>',
-    '        <value name="NUM2">',
-    '            <shadow type="math_number">',
-    '                <field name="NUM"/>',
-    '            </shadow>',
-    '        </value>',
-    '    </block>',
-    '    <block type="operator_round">',
-    '        <value name="NUM">',
-    '            <shadow type="math_number">',
-    '                <field name="NUM"/>',
-    '            </shadow>',
-    '        </value>',
-    '    </block>',
-    '    <block type="operator_mathop">',
-    '        <value name="NUM">',
-    '            <shadow type="math_number">',
-    '                <field name="NUM"/>',
-    '            </shadow>',
-    '        </value>',
-    '    </block>',
-    '</category>'
-];
+const operators = `
+    <category name="Operators" colour="#40BF4A" secondaryColour="#389438">
+        <block type="operator_add">
+            <value name="NUM1">
+                <shadow type="math_number">
+                    <field name="NUM"/>
+                </shadow>
+            </value>
+            <value name="NUM2">
+                <shadow type="math_number">
+                    <field name="NUM"/>
+                </shadow>
+            </value>
+        </block>
+        <block type="operator_subtract">
+            <value name="NUM1">
+                <shadow type="math_number">
+                    <field name="NUM"/>
+                </shadow>
+            </value>
+            <value name="NUM2">
+                <shadow type="math_number">
+                    <field name="NUM"/>
+                </shadow>
+            </value>
+        </block>
+        <block type="operator_multiply">
+            <value name="NUM1">
+                <shadow type="math_number">
+                    <field name="NUM"/>
+                </shadow>
+            </value>
+            <value name="NUM2">
+                <shadow type="math_number">
+                    <field name="NUM"/>
+                </shadow>
+            </value>
+        </block>
+        <block type="operator_divide">
+            <value name="NUM1">
+                <shadow type="math_number">
+                    <field name="NUM"/>
+                </shadow>
+            </value>
+            <value name="NUM2">
+                <shadow type="math_number">
+                    <field name="NUM"/>
+                </shadow>
+            </value>
+        </block>
+        <block type="operator_random">
+            <value name="FROM">
+                <shadow type="math_number">
+                    <field name="NUM">1</field>
+                </shadow>
+            </value>
+            <value name="TO">
+                <shadow type="math_number">
+                    <field name="NUM">10</field>
+                </shadow>
+            </value>
+        </block>
+        <block type="operator_lt">
+            <value name="OPERAND1">
+                <shadow type="text">
+                    <field name="TEXT"/>
+                </shadow>
+            </value>
+            <value name="OPERAND2">
+                <shadow type="text">
+                    <field name="TEXT"/>
+                </shadow>
+            </value>
+        </block>
+        <block type="operator_equals">
+            <value name="OPERAND1">
+                <shadow type="text">
+                    <field name="TEXT"/>
+                </shadow>
+            </value>
+            <value name="OPERAND2">
+                <shadow type="text">
+                    <field name="TEXT"/>
+                </shadow>
+            </value>
+        </block>
+        <block type="operator_gt">
+            <value name="OPERAND1">
+                <shadow type="text">
+                    <field name="TEXT"/>
+                </shadow>
+            </value>
+            <value name="OPERAND2">
+                <shadow type="text">
+                    <field name="TEXT"/>
+                </shadow>
+            </value>
+        </block>
+        <block type="operator_and"/>
+        <block type="operator_or"/>
+        <block type="operator_not"/>
+        <block type="operator_join">
+            <value name="STRING1">
+                <shadow type="text">
+                    <field name="TEXT">hello</field>
+                </shadow>
+            </value>
+            <value name="STRING2">
+                <shadow type="text">
+                    <field name="TEXT">world</field>
+                </shadow>
+            </value>
+        </block>
+        <block type="operator_letter_of">
+            <value name="LETTER">
+                <shadow type="math_whole_number">
+                    <field name="NUM">1</field>
+                </shadow>
+            </value>
+            <value name="STRING">
+                <shadow type="text">
+                    <field name="TEXT">world</field>
+                </shadow>
+            </value>
+        </block>
+        <block type="operator_length">
+            <value name="STRING">
+                <shadow type="text">
+                    <field name="TEXT">world</field>
+                </shadow>
+            </value>
+        </block>
+        <block type="operator_mod">
+            <value name="NUM1">
+                <shadow type="math_number">
+                    <field name="NUM"/>
+                </shadow>
+            </value>
+            <value name="NUM2">
+                <shadow type="math_number">
+                    <field name="NUM"/>
+                </shadow>
+            </value>
+        </block>
+        <block type="operator_round">
+            <value name="NUM">
+                <shadow type="math_number">
+                    <field name="NUM"/>
+                </shadow>
+            </value>
+        </block>
+        <block type="operator_mathop">
+            <value name="NUM">
+                <shadow type="math_number">
+                    <field name="NUM"/>
+                </shadow>
+            </value>
+        </block>
+    </category>
+`;
 
-const data = [
-    '<category name="Data" colour="#FF8C1A" secondaryColour="#DB6E00" custom="VARIABLE">',
-    '</category>'
-];
+const data = `
+    <category name="Data" colour="#FF8C1A" secondaryColour="#DB6E00" custom="VARIABLE">
+    </category>
+`;
 
 const xmlOpen = '<xml style="display: none">';
 const xmlClose = '</xml>';
@@ -615,7 +615,7 @@ const xmlClose = '</xml>';
 const makeToolboxXML = function (categoriesXML) {
     const gap = [separator];
 
-    const everything = [].concat(
+    const everything = [
         xmlOpen,
         motion, gap,
         looks, gap,
@@ -625,7 +625,8 @@ const makeToolboxXML = function (categoriesXML) {
         events, gap,
         control, gap,
         sensing, gap,
-        operators);
+        operators
+    ];
 
     if (categoriesXML) {
         everything.push(gap, categoriesXML);
-- 
GitLab