mirror of
https://github.com/google/blockly.git
synced 2026-01-09 01:50:11 +01:00
Merge remote-tracking branch 'google/master' into feature/blockly-update
This commit is contained in:
37
core/xml.js
37
core/xml.js
@@ -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();
|
||||
@@ -291,6 +296,11 @@ Blockly.Xml.domToWorkspace = function(xml, workspace) {
|
||||
if (!existingGroup) {
|
||||
Blockly.Events.setGroup(true);
|
||||
}
|
||||
|
||||
// Disable workspace resizes as an optimization.
|
||||
if (workspace.setResizesEnabled) {
|
||||
workspace.setResizesEnabled(false);
|
||||
}
|
||||
for (var i = 0; i < childCount; i++) {
|
||||
var xmlChild = xml.childNodes[i];
|
||||
var name = xmlChild.nodeName.toLowerCase();
|
||||
@@ -315,6 +325,10 @@ Blockly.Xml.domToWorkspace = function(xml, workspace) {
|
||||
Blockly.Field.stopCache();
|
||||
|
||||
workspace.updateVariableList(false);
|
||||
// Re-enable workspace resizing.
|
||||
if (workspace.setResizesEnabled) {
|
||||
workspace.setResizesEnabled(true);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -348,7 +362,7 @@ Blockly.Xml.domToBlock = function(xmlBlock, workspace) {
|
||||
for (var i = blocks.length - 1; i >= 0; i--) {
|
||||
blocks[i].render(false);
|
||||
}
|
||||
// Populating the connection database may be defered until after the
|
||||
// Populating the connection database may be deferred until after the
|
||||
// blocks have rendered.
|
||||
setTimeout(function() {
|
||||
if (topBlock.workspace) { // Check that the block hasn't been deleted.
|
||||
@@ -419,7 +433,7 @@ Blockly.Xml.domToBlockHeadless_ = function(xmlBlock, workspace) {
|
||||
block.domToMutation(xmlChild);
|
||||
/* disabling due to this being _headless_
|
||||
if (block.initSvg) {
|
||||
// Mutation may have added some elements that need initalizing.
|
||||
// Mutation may have added some elements that need initializing.
|
||||
block.initSvg();
|
||||
}
|
||||
*/
|
||||
@@ -537,6 +551,9 @@ Blockly.Xml.domToBlockHeadless_ = function(xmlBlock, workspace) {
|
||||
goog.asserts.assert(child.isShadow(),
|
||||
'Shadow block not allowed non-shadow child.');
|
||||
}
|
||||
// Ensure this block doesn't have any variable inputs.
|
||||
goog.asserts.assert(block.getVars().length == 0,
|
||||
'Shadow blocks cannot have variable fields.');
|
||||
block.setShadow(true);
|
||||
}
|
||||
return block;
|
||||
|
||||
Reference in New Issue
Block a user