Merge pull request #675 from rachel-fenichel/bugfix/xml_id

add option to skip exporting block ids in XML, and use it in the workspace factory
This commit is contained in:
Rachel Fenichel
2016-10-05 17:15:05 -07:00
committed by GitHub
2 changed files with 14 additions and 10 deletions

View File

@@ -33,13 +33,14 @@ goog.require('goog.dom');
/**
* Encode a block tree as XML.
* @param {!Blockly.Workspace} workspace The workspace containing blocks.
* @param {boolean} opt_noId True if the encoder should skip the block ids.
* @return {!Element} XML document.
*/
Blockly.Xml.workspaceToDom = function(workspace) {
Blockly.Xml.workspaceToDom = function(workspace, opt_noId) {
var xml = goog.dom.createDom('xml');
var blocks = workspace.getTopBlocks(true);
for (var i = 0, block; block = blocks[i]; i++) {
xml.appendChild(Blockly.Xml.blockToDomWithXY(block));
xml.appendChild(Blockly.Xml.blockToDomWithXY(block, opt_noId));
}
return xml;
};
@@ -47,14 +48,15 @@ Blockly.Xml.workspaceToDom = function(workspace) {
/**
* Encode a block subtree as XML with XY coordinates.
* @param {!Blockly.Block} block The root block to encode.
* @param {boolean} opt_noId True if the encoder should skip the block id.
* @return {!Element} Tree of XML elements.
*/
Blockly.Xml.blockToDomWithXY = function(block) {
Blockly.Xml.blockToDomWithXY = function(block, opt_noId) {
var width; // Not used in LTR.
if (block.workspace.RTL) {
width = block.workspace.getWidth();
}
var element = Blockly.Xml.blockToDom(block);
var element = Blockly.Xml.blockToDom(block, opt_noId);
var xy = block.getRelativeToSurfaceXY();
element.setAttribute('x',
Math.round(block.workspace.RTL ? width - xy.x : xy.x));
@@ -65,12 +67,15 @@ Blockly.Xml.blockToDomWithXY = function(block) {
/**
* Encode a block subtree as XML.
* @param {!Blockly.Block} block The root block to encode.
* @param {boolean} opt_noId True if the encoder should skip the block id.
* @return {!Element} Tree of XML elements.
*/
Blockly.Xml.blockToDom = function(block) {
Blockly.Xml.blockToDom = function(block, opt_noId) {
var element = goog.dom.createDom(block.isShadow() ? 'shadow' : 'block');
element.setAttribute('type', block.type);
element.setAttribute('id', block.id);
if (!opt_noId) {
element.setAttribute('id', block.id);
}
if (block.mutationToDom) {
// Custom data for an advanced block.
var mutation = block.mutationToDom();
@@ -125,7 +130,7 @@ Blockly.Xml.blockToDom = function(block) {
container.appendChild(Blockly.Xml.cloneShadow_(shadow));
}
if (childBlock) {
container.appendChild(Blockly.Xml.blockToDom(childBlock));
container.appendChild(Blockly.Xml.blockToDom(childBlock, opt_noId));
empty = false;
}
}
@@ -156,7 +161,7 @@ Blockly.Xml.blockToDom = function(block) {
var nextBlock = block.getNextBlock();
if (nextBlock) {
var container = goog.dom.createDom('next', null,
Blockly.Xml.blockToDom(nextBlock));
Blockly.Xml.blockToDom(nextBlock, opt_noId));
element.appendChild(container);
}
var shadow = block.nextConnection && block.nextConnection.getShadowDom();

View File

@@ -210,8 +210,7 @@ WorkspaceFactoryGenerator.prototype.appendHiddenWorkspaceToDom_ =
function(xmlDom) {
var blocks = this.hiddenWorkspace.getTopBlocks();
for (var i = 0, block; block = blocks[i]; i++) {
var blockChild = Blockly.Xml.blockToDom(block);
blockChild.removeAttribute('id');
var blockChild = Blockly.Xml.blockToDom(block, /* opt_noId */ true);
xmlDom.appendChild(blockChild);
}
};