in core/block.js [1575:1666]
Blockly.Block.prototype.jsonInit = function(json) {
var warningPrefix = json['type'] ? 'Block "' + json['type'] + '": ' : '';
// Validate inputs.
if (json['output'] && json['previousStatement']) {
throw Error(warningPrefix +
'Must not have both an output and a previousStatement.');
}
// Set basic properties of block.
// Makes styles backward compatible with old way of defining hat style.
if (json['style'] && json['style'].hat) {
this.hat = json['style'].hat;
// Must set to null so it doesn't error when checking for style and colour.
json['style'] = null;
}
if (json['style'] && json['colour']) {
throw Error(warningPrefix + 'Must not have both a colour and a style.');
} else if (json['style']) {
this.jsonInitStyle_(json, warningPrefix);
} else {
this.jsonInitColour_(json, warningPrefix);
}
// Interpolate the message blocks.
var i = 0;
while (json['message' + i] !== undefined) {
this.interpolate_(json['message' + i], json['args' + i] || [],
json['lastDummyAlign' + i], warningPrefix);
i++;
}
if (json['inputsInline'] !== undefined) {
this.setInputsInline(json['inputsInline']);
}
if (json['startHat'] !== undefined) {
this.setStartHat(json['startHat']);
}
// Set output and previous/next connections.
if (json['output'] !== undefined) {
this.setOutput(true, json['output']);
}
if (json['outputShape'] !== undefined) {
this.setOutputShape(json['outputShape']);
}
if (json['previousStatement'] !== undefined) {
this.setPreviousStatement(true, json['previousStatement']);
}
if (json['nextStatement'] !== undefined) {
this.setNextStatement(true, json['nextStatement']);
}
if (json['tooltip'] !== undefined) {
var rawValue = json['tooltip'];
var localizedText = Blockly.utils.replaceMessageReferences(rawValue);
this.setTooltip(localizedText);
}
if (json['enableContextMenu'] !== undefined) {
var rawValue = json['enableContextMenu'];
this.contextMenu = !!rawValue;
}
if (json['helpUrl'] !== undefined) {
var rawValue = json['helpUrl'];
var localizedValue = Blockly.utils.replaceMessageReferences(rawValue);
this.setHelpUrl(localizedValue);
}
if (typeof json['extensions'] == 'string') {
console.warn(
warningPrefix + 'JSON attribute \'extensions\' should be an array of' +
' strings. Found raw string in JSON for \'' + json['type'] +
'\' block.');
json['extensions'] = [json['extensions']]; // Correct and continue.
}
// Add the mutator to the block.
if (json['mutator'] !== undefined) {
Blockly.Extensions.apply(json['mutator'], this, true);
}
var extensionNames = json['extensions'];
if (Array.isArray(extensionNames)) {
for (var j = 0; j < extensionNames.length; ++j) {
Blockly.Extensions.apply(extensionNames[j], this, false);
}
}
if (json['outputShape'] !== undefined) {
this.setOutputShape(json['outputShape']);
}
if (json['category'] !== undefined) {
this.setCategory(json['category']);
}
};