mirror of
https://github.com/scratchfoundation/scratch-blocks.git
synced 2025-08-28 22:10:31 -04:00
Compatibility for Closure Compiler. (#1240)
This commit is contained in:
parent
5b4537a1e6
commit
a119cca83b
8 changed files with 21 additions and 47 deletions
25
build.py
25
build.py
|
@ -337,31 +337,6 @@ class Gen_compressed(threading.Thread):
|
||||||
|
|
||||||
code = HEADER + "\n" + json_data["compiledCode"]
|
code = HEADER + "\n" + json_data["compiledCode"]
|
||||||
code = code.replace(remove, "")
|
code = code.replace(remove, "")
|
||||||
|
|
||||||
# Trim down Google's Apache licences.
|
|
||||||
# The Closure Compiler used to preserve these until August 2015.
|
|
||||||
# Delete this in a few months if the licences don't return.
|
|
||||||
LICENSE = re.compile("""/\\*
|
|
||||||
|
|
||||||
[\w ]+
|
|
||||||
|
|
||||||
(Copyright \\d+ Google Inc.)
|
|
||||||
https://developers.google.com/blockly/
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 \(the "License"\);
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
\\*/""")
|
|
||||||
code = re.sub(LICENSE, r"\n// \1 Apache License 2.0", code)
|
|
||||||
|
|
||||||
stats = json_data["statistics"]
|
stats = json_data["statistics"]
|
||||||
original_b = stats["originalSize"]
|
original_b = stats["originalSize"]
|
||||||
compressed_b = stats["compressedSize"]
|
compressed_b = stats["compressedSize"]
|
||||||
|
|
|
@ -997,10 +997,8 @@ Blockly.BlockSvg.disposeUiStep_ = function(clone, rtl, start, workspaceScale) {
|
||||||
var scale = (1 - percent) * workspaceScale;
|
var scale = (1 - percent) * workspaceScale;
|
||||||
clone.setAttribute('transform', 'translate(' + x + ',' + y + ')' +
|
clone.setAttribute('transform', 'translate(' + x + ',' + y + ')' +
|
||||||
' scale(' + scale + ')');
|
' scale(' + scale + ')');
|
||||||
var closure = function() {
|
setTimeout(Blockly.BlockSvg.disposeUiStep_, 10, clone, rtl, start,
|
||||||
Blockly.BlockSvg.disposeUiStep_(clone, rtl, start, workspaceScale);
|
workspaceScale);
|
||||||
};
|
|
||||||
setTimeout(closure, 10);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -60,7 +60,7 @@ Blockly.Extensions.MUTATOR_PROPERTIES_ =
|
||||||
* handlers and mutators. These are applied using Block.applyExtension(), or
|
* handlers and mutators. These are applied using Block.applyExtension(), or
|
||||||
* the JSON "extensions" array attribute.
|
* the JSON "extensions" array attribute.
|
||||||
* @param {string} name The name of this extension.
|
* @param {string} name The name of this extension.
|
||||||
* @param {function} initFn The function to initialize an extended block.
|
* @param {Function} initFn The function to initialize an extended block.
|
||||||
* @throws {Error} if the extension name is empty, the extension is already
|
* @throws {Error} if the extension name is empty, the extension is already
|
||||||
* registered, or extensionFn is not a function.
|
* registered, or extensionFn is not a function.
|
||||||
*/
|
*/
|
||||||
|
@ -97,7 +97,7 @@ Blockly.Extensions.registerMixin = function(name, mixinObj) {
|
||||||
* decompose are defined on the mixin.
|
* decompose are defined on the mixin.
|
||||||
* @param {string} name The name of this mutator extension.
|
* @param {string} name The name of this mutator extension.
|
||||||
* @param {!Object} mixinObj The values to mix in.
|
* @param {!Object} mixinObj The values to mix in.
|
||||||
* @param {function()=} opt_helperFn An optional function to apply after mixing
|
* @param {(function())=} opt_helperFn An optional function to apply after mixing
|
||||||
* in the object.
|
* in the object.
|
||||||
* @param {Array.<string>=} opt_blockList A list of blocks to appear in the
|
* @param {Array.<string>=} opt_blockList A list of blocks to appear in the
|
||||||
* flyout of the mutator dialog.
|
* flyout of the mutator dialog.
|
||||||
|
@ -108,8 +108,10 @@ Blockly.Extensions.registerMutator = function(name, mixinObj, opt_helperFn,
|
||||||
var errorPrefix = 'Error when registering mutator "' + name + '": ';
|
var errorPrefix = 'Error when registering mutator "' + name + '": ';
|
||||||
|
|
||||||
// Sanity check the mixin object before registering it.
|
// Sanity check the mixin object before registering it.
|
||||||
Blockly.Extensions.checkHasFunction_(errorPrefix, mixinObj, 'domToMutation');
|
Blockly.Extensions.checkHasFunction_(errorPrefix, mixinObj.domToMutation,
|
||||||
Blockly.Extensions.checkHasFunction_(errorPrefix, mixinObj, 'mutationToDom');
|
'domToMutation');
|
||||||
|
Blockly.Extensions.checkHasFunction_(errorPrefix, mixinObj.mutationToDom,
|
||||||
|
'mutationToDom');
|
||||||
|
|
||||||
var hasMutatorDialog = Blockly.Extensions.checkMutatorDialog_(mixinObj,
|
var hasMutatorDialog = Blockly.Extensions.checkMutatorDialog_(mixinObj,
|
||||||
errorPrefix);
|
errorPrefix);
|
||||||
|
@ -167,20 +169,19 @@ Blockly.Extensions.apply = function(name, block, isMutator) {
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check that the given object has a property with the given name, and that the
|
* Check that the given value is a function.
|
||||||
* property is a function.
|
|
||||||
* @param {string} errorPrefix The string to prepend to any error message.
|
* @param {string} errorPrefix The string to prepend to any error message.
|
||||||
* @param {!Object} object The object to check.
|
* @param {*} func Function to check.
|
||||||
* @param {string} propertyName Which property to check.
|
* @param {string} propertyName Which property to check.
|
||||||
* @throws {Error} if the property does not exist or is not a function.
|
* @throws {Error} if the property does not exist or is not a function.
|
||||||
* @private
|
* @private
|
||||||
*/
|
*/
|
||||||
Blockly.Extensions.checkHasFunction_ = function(errorPrefix, object,
|
Blockly.Extensions.checkHasFunction_ = function(errorPrefix, func,
|
||||||
propertyName) {
|
propertyName) {
|
||||||
if (!object.hasOwnProperty(propertyName)) {
|
if (!func) {
|
||||||
throw new Error(errorPrefix +
|
throw new Error(errorPrefix +
|
||||||
'missing required property "' + propertyName + '"');
|
'missing required property "' + propertyName + '"');
|
||||||
} else if (typeof object[propertyName] !== "function") {
|
} else if (typeof func != 'function') {
|
||||||
throw new Error(errorPrefix +
|
throw new Error(errorPrefix +
|
||||||
'" required property "' + propertyName + '" must be a function');
|
'" required property "' + propertyName + '" must be a function');
|
||||||
}
|
}
|
||||||
|
|
|
@ -165,8 +165,9 @@ Blockly.Trashcan.prototype.createDom = function() {
|
||||||
*/
|
*/
|
||||||
this.svgGroup_ = Blockly.utils.createSvgElement('g',
|
this.svgGroup_ = Blockly.utils.createSvgElement('g',
|
||||||
{'class': 'blocklyTrash'}, null);
|
{'class': 'blocklyTrash'}, null);
|
||||||
|
var clip;
|
||||||
var rnd = String(Math.random()).substring(2);
|
var rnd = String(Math.random()).substring(2);
|
||||||
var clip = Blockly.utils.createSvgElement('clipPath',
|
clip = Blockly.utils.createSvgElement('clipPath',
|
||||||
{'id': 'blocklyTrashBodyClipPath' + rnd},
|
{'id': 'blocklyTrashBodyClipPath' + rnd},
|
||||||
this.svgGroup_);
|
this.svgGroup_);
|
||||||
Blockly.utils.createSvgElement('rect',
|
Blockly.utils.createSvgElement('rect',
|
||||||
|
@ -181,7 +182,7 @@ Blockly.Trashcan.prototype.createDom = function() {
|
||||||
body.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href',
|
body.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href',
|
||||||
this.workspace_.options.pathToMedia + Blockly.SPRITE.url);
|
this.workspace_.options.pathToMedia + Blockly.SPRITE.url);
|
||||||
|
|
||||||
var clip = Blockly.utils.createSvgElement('clipPath',
|
clip = Blockly.utils.createSvgElement('clipPath',
|
||||||
{'id': 'blocklyTrashLidClipPath' + rnd},
|
{'id': 'blocklyTrashLidClipPath' + rnd},
|
||||||
this.svgGroup_);
|
this.svgGroup_);
|
||||||
Blockly.utils.createSvgElement('rect',
|
Blockly.utils.createSvgElement('rect',
|
||||||
|
|
|
@ -197,7 +197,7 @@ Blockly.utils.getInjectionDivXY_ = function(element) {
|
||||||
var scale = 1;
|
var scale = 1;
|
||||||
while (element) {
|
while (element) {
|
||||||
var xy = Blockly.utils.getRelativeXY(element);
|
var xy = Blockly.utils.getRelativeXY(element);
|
||||||
var scale = Blockly.utils.getScale_(element);
|
scale = Blockly.utils.getScale_(element);
|
||||||
x = (x * scale) + xy.x;
|
x = (x * scale) + xy.x;
|
||||||
y = (y * scale) + xy.y;
|
y = (y * scale) + xy.y;
|
||||||
var classes = element.getAttribute('class') || '';
|
var classes = element.getAttribute('class') || '';
|
||||||
|
|
|
@ -1957,7 +1957,6 @@ Blockly.WorkspaceSvg.prototype.startDragWithFakeEvent = function(fakeEvent,
|
||||||
/**
|
/**
|
||||||
* Get the audio manager for this workspace.
|
* Get the audio manager for this workspace.
|
||||||
* @return {Blockly.WorkspaceAudio} The audio manager for this workspace.
|
* @return {Blockly.WorkspaceAudio} The audio manager for this workspace.
|
||||||
* @package
|
|
||||||
*/
|
*/
|
||||||
Blockly.WorkspaceSvg.prototype.getAudioManager = function() {
|
Blockly.WorkspaceSvg.prototype.getAudioManager = function() {
|
||||||
return this.audioManager_;
|
return this.audioManager_;
|
||||||
|
|
|
@ -397,7 +397,7 @@ Blockly.Xml.appendDomToWorkspace = function(xml, workspace) {
|
||||||
var savetab = Blockly.BlockSvg.TAB_WIDTH;
|
var savetab = Blockly.BlockSvg.TAB_WIDTH;
|
||||||
try {
|
try {
|
||||||
Blockly.BlockSvg.TAB_WIDTH = 0;
|
Blockly.BlockSvg.TAB_WIDTH = 0;
|
||||||
var bbox = workspace.getBlocksBoundingBox();
|
bbox = workspace.getBlocksBoundingBox();
|
||||||
} finally {
|
} finally {
|
||||||
Blockly.BlockSvg.TAB_WIDTH = savetab;
|
Blockly.BlockSvg.TAB_WIDTH = savetab;
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,7 +34,7 @@ def string_is_ascii(s):
|
||||||
return True
|
return True
|
||||||
except UnicodeEncodeError:
|
except UnicodeEncodeError:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def load_constants(filename):
|
def load_constants(filename):
|
||||||
"""Read in constants file, which must be output in every language."""
|
"""Read in constants file, which must be output in every language."""
|
||||||
constant_defs = read_json_file(filename);
|
constant_defs = read_json_file(filename);
|
||||||
|
@ -42,7 +42,7 @@ def load_constants(filename):
|
||||||
for key in constant_defs:
|
for key in constant_defs:
|
||||||
value = constant_defs[key]
|
value = constant_defs[key]
|
||||||
value = value.replace('"', '\\"')
|
value = value.replace('"', '\\"')
|
||||||
constants_text += '\nBlockly.Msg.{0} = \"{1}\";'.format(key, value)
|
constants_text += '\nBlockly.Msg["{0}"] = "{1}";'.format(key, value)
|
||||||
return constants_text
|
return constants_text
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
|
@ -139,7 +139,7 @@ goog.require('Blockly.Msg');
|
||||||
value = source_defs[key]
|
value = source_defs[key]
|
||||||
comment = ' // untranslated'
|
comment = ' // untranslated'
|
||||||
value = value.replace('"', '\\"')
|
value = value.replace('"', '\\"')
|
||||||
outfile.write(u'Blockly.Msg.{0} = "{1}";{2}\n'.format(
|
outfile.write(u'Blockly.Msg["{0}"] = "{1}";{2}\n'.format(
|
||||||
key, value, comment))
|
key, value, comment))
|
||||||
|
|
||||||
# Announce any keys defined only for target language.
|
# Announce any keys defined only for target language.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue