import ScratchBlocks from 'scratch-blocks'; const categorySeparator = ''; const blockSeparator = ''; // At default scale, about 28px const motion = function (isStage, targetId) { const stageSelected = ScratchBlocks.ScratchMsgs.translate( 'MOTION_STAGE_SELECTED', 'Stage selected: no motion blocks' ); return ` ${isStage ? ` ` : ` 10 15 15 ${blockSeparator} 0 0 1 1 0 0 ${blockSeparator} 90 ${blockSeparator} 10 0 10 0 ${blockSeparator} ${blockSeparator} ${blockSeparator} `} ${categorySeparator} `; }; const xmlEscape = function (unsafe) { return unsafe.replace(/[<>&'"]/g, c => { switch (c) { case '<': return '<'; case '>': return '>'; case '&': return '&'; case '\'': return '''; case '"': return '"'; } }); }; const looks = function (isStage, targetId, costumeName, backdropName) { const hello = ScratchBlocks.ScratchMsgs.translate('LOOKS_HELLO', 'Hello!'); const hmm = ScratchBlocks.ScratchMsgs.translate('LOOKS_HMM', 'Hmm...'); return ` ${isStage ? '' : ` ${hello} 2 ${hello} ${hmm} 2 ${hmm} ${blockSeparator} `} ${isStage ? ` ${backdropName} ${backdropName} ` : ` ${costumeName} ${backdropName} ${blockSeparator} 10 100 `} ${blockSeparator} 25 0 ${blockSeparator} ${isStage ? '' : ` ${blockSeparator} 1 `} ${isStage ? ` ` : ` `} ${categorySeparator} `; }; const sound = function (isStage, targetId, soundName) { return ` ${soundName} ${soundName} ${blockSeparator} 10 100 ${blockSeparator} -10 100 ${categorySeparator} `; }; const events = function (isStage) { return ` ${isStage ? ` ` : ` `} ${blockSeparator} 10 ${blockSeparator} ${categorySeparator} `; }; const control = function (isStage) { return ` 1 ${blockSeparator} 10 ${blockSeparator} ${blockSeparator} ${blockSeparator} ${isStage ? ` ` : ` `} ${categorySeparator} `; }; const sensing = function (isStage) { const name = ScratchBlocks.ScratchMsgs.translate('SENSING_ASK_TEXT', 'What\'s your name?'); return ` ${isStage ? '' : ` ${blockSeparator} `} ${name} ${blockSeparator} ${isStage ? '' : ` ${blockSeparator} ''+ ${blockSeparator} `} ${blockSeparator} ${blockSeparator} ${blockSeparator} ${blockSeparator} ${blockSeparator} ${categorySeparator} `; }; const operators = function () { const apple = ScratchBlocks.ScratchMsgs.translate('OPERATORS_JOIN_APPLE', 'apple'); const banana = ScratchBlocks.ScratchMsgs.translate('OPERATORS_JOIN_BANANA', 'banana'); const letter = ScratchBlocks.ScratchMsgs.translate('OPERATORS_LETTEROF_APPLE', 'a'); return ` ${blockSeparator} 1 10 ${blockSeparator} 50 50 50 ${blockSeparator} ${blockSeparator} ${apple} ${banana} 1 ${apple} ${apple} ${apple} ${letter} ${blockSeparator} ${blockSeparator} ${categorySeparator} `; }; const variables = function () { return ` `; }; const myBlocks = function () { return ` `; }; const xmlOpen = ''; const xmlClose = ''; /** * @param {!boolean} isStage - Whether the toolbox is for a stage-type target. * @param {?string} targetId - The current editing target * @param {?string} categoriesXML - null for default toolbox, or an XML string with elements. * @param {?string} costumeName - The name of the default selected costume dropdown. * @param {?string} backdropName - The name of the default selected backdrop dropdown. * @param {?string} soundName - The name of the default selected sound dropdown. * @returns {string} - a ScratchBlocks-style XML document for the contents of the toolbox. */ const makeToolboxXML = function (isStage, targetId, categoriesXML, costumeName = '', backdropName = '', soundName = '') { const gap = [categorySeparator]; costumeName = xmlEscape(costumeName); backdropName = xmlEscape(backdropName); soundName = xmlEscape(soundName); const everything = [ xmlOpen, motion(isStage, targetId), gap, looks(isStage, targetId, costumeName, backdropName), gap, sound(isStage, targetId, soundName), gap, events(isStage, targetId), gap, control(isStage, targetId), gap, sensing(isStage, targetId), gap, operators(isStage, targetId), gap, variables(isStage, targetId), gap, myBlocks(isStage, targetId) ]; if (categoriesXML) { everything.push(gap, categoriesXML); } everything.push(xmlClose); return everything.join('\n'); }; export default makeToolboxXML;