Refactor filter methods into util

This commit is contained in:
Ray Schamp 2017-02-15 19:16:37 -05:00
parent a9b495fced
commit 390b2373e9
2 changed files with 61 additions and 17 deletions

View file

@ -0,0 +1,49 @@
/**
* Filter Blockly toolbox XML node containing blocks to only those with
* valid opcodes. Return a copy of the node with valid blocks.
* @param {HTMLElement} node Blockly toolbox XML node
* @param {Array.<string>} opcodes Valid opcodes. Blocks producing other opcodes
* will be filtered.
* @returns {HTMLElement} filtered toolbox XML node
*/
var filterToolboxNode = function (node, opcodes) {
var filteredCategory = node.cloneNode();
for (var block = node.firstElementChild; block; block = block.nextElementSibling) {
if (block.nodeName.toLowerCase() !== 'block') continue;
var opcode = block.getAttribute('type').toLowerCase();
if (opcodes.indexOf(opcode) !== -1) {
filteredCategory.appendChild(block.cloneNode(true));
}
}
return filteredCategory;
};
/**
* Filter Blockly toolbox XML and return a copy which only contains blocks with
* existent opcodes. Categories with no valid children will be removed.
* @param {HTMLElement} toolbox Blockly toolbox XML node
* @param {Array.<string>} opcodes Valid opcodes. Blocks producing other opcodes
* will be filtered.
* @returns {HTMLElement} filtered toolbox XML node
*/
var filterToolbox = function (toolbox, opcodes) {
if (!toolbox.hasChildNodes()) return toolbox;
var filteredToolbox;
if (toolbox.firstElementChild.nodeName.toLowerCase() === 'category') {
filteredToolbox = toolbox.cloneNode();
for (
var category = toolbox.firstElementChild;
category;
category = category.nextElementSibling
) {
if (category.nodeName.toLowerCase() !== 'category') continue;
var filteredCategory = filterToolboxNode(category, opcodes);
if (filteredCategory.hasChildNodes()) filteredToolbox.appendChild(filteredCategory);
}
} else {
filteredToolbox = filterToolboxNode(toolbox, opcodes);
}
return filteredToolbox;
};
module.exports = filterToolbox;

View file

@ -1,6 +1,7 @@
var EventEmitter = require('events'); var EventEmitter = require('events');
var util = require('util'); var util = require('util');
var filterToolbox = require('./util/filter-toolbox');
var Runtime = require('./engine/runtime'); var Runtime = require('./engine/runtime');
var sb2import = require('./import/sb2import'); var sb2import = require('./import/sb2import');
@ -336,23 +337,17 @@ VirtualMachine.prototype.postSpriteInfo = function (data) {
this.editingTarget.postSpriteInfo(data); this.editingTarget.postSpriteInfo(data);
}; };
VirtualMachine.prototype.filterToolbox = function (toolboxDOM) {
var filteredToolbox = toolboxDOM.cloneNode(); /**
var category = toolboxDOM.firstElementChild; * Filter Blockly toolbox XML and return a copy which only contains blocks with
while (category) { * existent opcodes. Categories with no valid children will be removed.
var filteredCategory = category.cloneNode(); * @param {HTMLElement} toolbox Blockly toolbox XML node
var block = category.firstElementChild; * @returns {HTMLElement} filtered toolbox XML node
while (block) { */
var opcode = block.getAttribute('type'); VirtualMachine.prototype.filterToolbox = function (toolbox) {
if (opcode in this.runtime._primitives || opcode in this.runtime._hats) { var opcodes = Object.keys(this.runtime._primitives)
filteredCategory.appendChild(block.cloneNode(true)); .concat(Object.keys(this.runtime._hats));
} return filterToolbox(toolbox, opcodes);
block = block.nextElementSibling;
}
if (filteredCategory.hasChildNodes()) filteredToolbox.appendChild(filteredCategory);
category = category.nextElementSibling;
}
return filteredToolbox;
}; };
module.exports = VirtualMachine; module.exports = VirtualMachine;