660 lines
21 KiB
JavaScript
660 lines
21 KiB
JavaScript
const separator = '<sep gap="45"/>';
|
|
|
|
const top = `
|
|
<category name="Top" colour="#FFFFFF" secondaryColour="#CCCCCC">
|
|
<block type="event_whenflagclicked"/>
|
|
<block type="event_whenkeypressed">
|
|
</block>
|
|
<block type="event_whenthisspriteclicked"/>
|
|
<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_ifonedgebounce"/>
|
|
<block type="sound_playuntildone">
|
|
<value name="SOUND_MENU">
|
|
<shadow type="sound_sounds_menu"/>
|
|
</value>
|
|
</block>
|
|
<block type="looks_changeeffectby">
|
|
<value name="CHANGE">
|
|
<shadow type="math_number">
|
|
<field name="NUM">10</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_wait">
|
|
<value name="DURATION">
|
|
<shadow type="math_positive_number">
|
|
<field name="NUM">1</field>
|
|
</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>
|
|
</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_glideto" id="motion_glideto">
|
|
<value name="SECS">
|
|
<shadow type="math_number">
|
|
<field name="NUM">1</field>
|
|
</shadow>
|
|
</value>
|
|
<value name="TO">
|
|
<shadow type="motion_glideto_menu">
|
|
</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 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 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 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 data = `
|
|
<category name="Data" colour="#FF8C1A" secondaryColour="#DB6E00" custom="VARIABLE">
|
|
</category>
|
|
`;
|
|
|
|
const xmlOpen = '<xml style="display: none">';
|
|
const xmlClose = '</xml>';
|
|
|
|
/**
|
|
* @param {string?} categoriesXML - null for default toolbox, or an XML string with <category> elements.
|
|
* @returns {string} - a ScratchBlocks-style XML document for the contents of the toolbox.
|
|
*/
|
|
const makeToolboxXML = function (categoriesXML) {
|
|
const gap = [separator];
|
|
|
|
const everything = [
|
|
xmlOpen,
|
|
top, gap,
|
|
motion, gap,
|
|
looks, gap,
|
|
sound, gap,
|
|
pen, gap,
|
|
data, gap,
|
|
events, gap,
|
|
control, gap,
|
|
sensing, gap,
|
|
pen, gap,
|
|
operators, gap,
|
|
data
|
|
];
|
|
|
|
if (categoriesXML) {
|
|
everything.push(gap, categoriesXML);
|
|
}
|
|
|
|
everything.push(xmlClose);
|
|
|
|
return everything.join('\n');
|
|
};
|
|
|
|
export default makeToolboxXML;
|