mirror of
https://github.com/scratchfoundation/scratch-blocks.git
synced 2025-08-28 22:10:31 -04:00
Inject can now take an ID. Also, fix unit tests.
This commit is contained in:
parent
9924498485
commit
3ff69d47fe
17 changed files with 57 additions and 58 deletions
|
@ -1320,8 +1320,8 @@ Blockly.WidgetDiv={};Blockly.WidgetDiv.DIV=null;Blockly.WidgetDiv.owner_=null;Bl
|
|||
Blockly.WidgetDiv.hide=function(){Blockly.WidgetDiv.owner_&&(Blockly.WidgetDiv.DIV.style.display="none",Blockly.WidgetDiv.dispose_&&Blockly.WidgetDiv.dispose_(),Blockly.WidgetDiv.owner_=null,Blockly.WidgetDiv.dispose_=null,goog.dom.removeChildren(Blockly.WidgetDiv.DIV))};Blockly.WidgetDiv.isVisible=function(){return!!Blockly.WidgetDiv.owner_};Blockly.WidgetDiv.hideIfOwner=function(a){Blockly.WidgetDiv.owner_==a&&Blockly.WidgetDiv.hide()};
|
||||
Blockly.WidgetDiv.position=function(a,b,c,d,e){b<d.y&&(b=d.y);e?a>c.width+d.x&&(a=c.width+d.x):a<d.x&&(a=d.x);Blockly.WidgetDiv.DIV.style.left=a+"px";Blockly.WidgetDiv.DIV.style.top=b+"px"};
|
||||
// Copyright 2011 Google Inc. Apache License 2.0
|
||||
Blockly.inject=function(a,b){if(!goog.dom.contains(document,a))throw"Error: container is not in current document.";var c=Blockly.parseOptions_(b||{}),d,e=function(){var b=Blockly.createDom_(a,c);d=Blockly.createMainWorkspace_(b,c);Blockly.init_(d);d.markFocused();Blockly.bindEvent_(b,"focus",d,d.markFocused)};if(c.enableRealtime){var f=document.getElementById("realtime");f&&(f.style.display="block");Blockly.Realtime.startRealtime(e,a,c.realtimeOptions)}else e();return d};
|
||||
Blockly.parseToolboxTree_=function(a){a?("string"!=typeof a&&"undefined"==typeof XSLTProcessor&&(a=a.outerHTML),"string"==typeof a&&(a=Blockly.Xml.textToDom(a))):a=null;return a};
|
||||
Blockly.inject=function(a,b){goog.isString(a)&&(a=document.getElementById(a));if(!goog.dom.contains(document,a))throw"Error: container is not in current document.";var c=Blockly.parseOptions_(b||{}),d,e=function(){goog.dom.removeChildren(a);var b=Blockly.createDom_(a,c);d=Blockly.createMainWorkspace_(b,c);Blockly.init_(d);d.markFocused();Blockly.bindEvent_(b,"focus",d,d.markFocused)};if(c.enableRealtime){var f=document.getElementById("realtime");f&&(f.style.display="block");Blockly.Realtime.startRealtime(e,
|
||||
a,c.realtimeOptions)}else e();return d};Blockly.parseToolboxTree_=function(a){a?("string"!=typeof a&&"undefined"==typeof XSLTProcessor&&(a=a.outerHTML),"string"==typeof a&&(a=Blockly.Xml.textToDom(a))):a=null;return a};
|
||||
Blockly.parseOptions_=function(a){var b=!!a.readOnly;if(b)var c=null,d=!1,e=!1,f=!1,g=!1,h=!1,k=!1;else c=Blockly.parseToolboxTree_(a.toolbox),d=Boolean(c&&c.getElementsByTagName("category").length),e=a.trashcan,void 0===e&&(e=d),f=a.collapse,void 0===f&&(f=d),g=a.comments,void 0===g&&(g=d),h=a.disable,void 0===h&&(h=d),k=a.sounds,void 0===k&&(k=!0);var l=a.scrollbars;void 0===l&&(l=d);var p=a.css;void 0===p&&(p=!0);var m=a.grid||{};m.spacing=m.spacing?parseFloat(m.spacing):0;m.colour||(m.colour=
|
||||
"#888");m.length=m.length?parseFloat(m.length):1;m.snap=!!m.snap;var q="https://blockly-demo.appspot.com/static/media/";a.media?q=a.media:a.path&&(q=a.path+"media/");var n=!!a.realtime;return{RTL:!!a.rtl,collapse:f,comments:g,disable:h,readOnly:b,maxBlocks:a.maxBlocks||Infinity,pathToMedia:q,hasCategories:d,hasScrollbars:l,hasTrashcan:e,hasSounds:k,hasCss:p,languageTree:c,gridOptions:m,enableRealtime:n,realtimeOptions:n?a.realtimeOptions:void 0}};
|
||||
Blockly.createDom_=function(a,b){a.setAttribute("dir","LTR");goog.ui.Component.setDefaultRightToLeft(b.RTL);Blockly.Css.inject(b.hasCss,b.pathToMedia);var c=Blockly.createSvgElement("svg",{xmlns:"http://www.w3.org/2000/svg","xmlns:html":"http://www.w3.org/1999/xhtml","xmlns:xlink":"http://www.w3.org/1999/xlink",version:"1.1","class":"blocklySvg"},a),d=Blockly.createSvgElement("defs",{},c),e,f;e=Blockly.createSvgElement("filter",{id:"blocklyEmboss"},d);Blockly.createSvgElement("feGaussianBlur",{"in":"SourceAlpha",
|
||||
|
|
|
@ -34,12 +34,15 @@ goog.require('goog.userAgent');
|
|||
|
||||
|
||||
/**
|
||||
* Inject a Blockly editor into the specified container DIV.
|
||||
* @param {!Element} container Containing element.
|
||||
* Inject a Blockly editor into the specified container element (usually a div).
|
||||
* @param {!Element|string} container Containing element or its ID.
|
||||
* @param {Object} opt_options Optional dictionary of options.
|
||||
* @return {!Blockly.Workspace} Newly created main workspace.
|
||||
*/
|
||||
Blockly.inject = function(container, opt_options) {
|
||||
if (goog.isString(container)) {
|
||||
container = document.getElementById(container);
|
||||
}
|
||||
// Verify that the container is in document.
|
||||
if (!goog.dom.contains(document, container)) {
|
||||
throw 'Error: container is not in current document.';
|
||||
|
@ -47,6 +50,7 @@ Blockly.inject = function(container, opt_options) {
|
|||
var options = Blockly.parseOptions_(opt_options || {});
|
||||
var workspace;
|
||||
var startUi = function() {
|
||||
goog.dom.removeChildren(container);
|
||||
var svg = Blockly.createDom_(container, options);
|
||||
workspace = Blockly.createMainWorkspace_(svg, options);
|
||||
Blockly.init_(workspace);
|
||||
|
|
|
@ -396,10 +396,8 @@ var oldDir = null;
|
|||
function updatePreview() {
|
||||
var newDir = document.getElementById('direction').value;
|
||||
if (oldDir != newDir) {
|
||||
var previewDiv = document.getElementById('preview');
|
||||
previewDiv.innerHTML = '';
|
||||
var rtl = newDir == 'rtl';
|
||||
previewWorkspace = Blockly.inject(previewDiv, {rtl: rtl});
|
||||
previewWorkspace = Blockly.inject('preview', {rtl: rtl});
|
||||
oldDir = newDir;
|
||||
}
|
||||
var code = document.getElementById('languagePre').textContent;
|
||||
|
@ -481,8 +479,7 @@ function init() {
|
|||
window.addEventListener('resize', onresize);
|
||||
|
||||
var toolbox = document.getElementById('toolbox');
|
||||
mainWorkspace =
|
||||
Blockly.inject(document.getElementById('blockly'), {toolbox: toolbox});
|
||||
mainWorkspace = Blockly.inject('blockly', {toolbox: toolbox});
|
||||
|
||||
// Create the root block.
|
||||
if ('BlocklyStorage' in window && window.location.hash.length > 1) {
|
||||
|
|
|
@ -372,7 +372,7 @@ Code.init = function() {
|
|||
window.addEventListener('resize', onresize, false);
|
||||
|
||||
var toolbox = document.getElementById('toolbox');
|
||||
Code.workspace = Blockly.inject(document.getElementById('content_blocks'),
|
||||
Code.workspace = Blockly.inject('content_blocks',
|
||||
{grid:
|
||||
{spacing: 25,
|
||||
length: 3,
|
||||
|
|
|
@ -38,7 +38,7 @@
|
|||
</xml>
|
||||
|
||||
<script>
|
||||
Blockly.inject(document.getElementById('blocklyDiv'),
|
||||
var workspace = Blockly.inject('blocklyDiv',
|
||||
{toolbox: document.getElementById('toolbox')});
|
||||
</script>
|
||||
|
||||
|
|
|
@ -113,7 +113,7 @@
|
|||
</xml>
|
||||
|
||||
<script>
|
||||
var workspace = Blockly.inject(document.getElementById('blocklyDiv'),
|
||||
var workspace = Blockly.inject('blocklyDiv',
|
||||
{toolbox: document.getElementById('toolbox')});
|
||||
Blockly.Xml.domToWorkspace(workspace,
|
||||
document.getElementById('startBlocks'));
|
||||
|
|
|
@ -269,7 +269,7 @@ Graph.resize = function() {
|
|||
* Initialize Blockly and the graph. Called on page load.
|
||||
*/
|
||||
Graph.init = function() {
|
||||
Graph.workspace = Blockly.inject(document.getElementById('blocklyDiv'),
|
||||
Graph.workspace = Blockly.inject('blocklyDiv',
|
||||
{toolbox: document.getElementById('toolbox')});
|
||||
Blockly.Xml.domToWorkspace(Graph.workspace,
|
||||
document.getElementById('startBlocks'));
|
||||
|
|
|
@ -121,7 +121,7 @@
|
|||
</xml>
|
||||
|
||||
<script>
|
||||
var workspace = Blockly.inject(document.getElementById('blocklyDiv'),
|
||||
var workspace = Blockly.inject('blocklyDiv',
|
||||
{toolbox: document.getElementById('toolbox')});
|
||||
Blockly.Xml.domToWorkspace(workspace,
|
||||
document.getElementById('startBlocks'));
|
||||
|
|
|
@ -79,7 +79,7 @@
|
|||
</xml>
|
||||
|
||||
<script>
|
||||
var workspace = Blockly.inject(document.getElementById('blocklyDiv'),
|
||||
var workspace = Blockly.inject('blocklyDiv',
|
||||
{maxBlocks: 5, toolbox: document.getElementById('toolbox')});
|
||||
|
||||
function onchange() {
|
||||
|
|
|
@ -262,7 +262,7 @@ Plane.init = function() {
|
|||
'width=725, initial-scale=.35, user-scalable=no');
|
||||
}
|
||||
|
||||
Plane.workspace = Blockly.inject(document.getElementById('blockly'),
|
||||
Plane.workspace = Blockly.inject('blockly',
|
||||
{media: '../../media/',
|
||||
rtl: Plane.isRtl(),
|
||||
toolbox: document.getElementById('toolbox')});
|
||||
|
|
|
@ -16,14 +16,14 @@
|
|||
font-weight: normal;
|
||||
font-size: 140%;
|
||||
}
|
||||
#svgDiv {
|
||||
#blocklyDiv {
|
||||
height: 600px;
|
||||
width: 800px;
|
||||
}
|
||||
</style>
|
||||
<script>
|
||||
function init() {
|
||||
var workspace = Blockly.inject(document.getElementById('svgDiv'),
|
||||
var workspace = Blockly.inject('blocklyDiv',
|
||||
{rtl: true, toolbox: document.getElementById('toolbox')});
|
||||
Blockly.Xml.domToWorkspace(workspace,
|
||||
document.getElementById('startBlocks'));
|
||||
|
@ -37,7 +37,7 @@
|
|||
<h1><a href="https://developers.google.com/blockly/">Blockly</a> >
|
||||
<a href="../index.html">Demos</a> > Right-to-Left</h1>
|
||||
|
||||
<div id="svgDiv"></div>
|
||||
<div id="blocklyDiv"></div>
|
||||
|
||||
<xml id="toolbox" style="display: none">
|
||||
<category name="منطق">
|
||||
|
|
|
@ -80,7 +80,7 @@
|
|||
</xml>
|
||||
|
||||
<script>
|
||||
Blockly.inject(document.getElementById('blocklyDiv'),
|
||||
var workspace = Blockly.inject('blocklyDiv',
|
||||
{toolbox: document.getElementById('toolbox')});
|
||||
|
||||
// An href with #key trigers an AJAX call to retrieve saved blocks.
|
||||
|
|
|
@ -341,7 +341,7 @@
|
|||
</xml>
|
||||
|
||||
<script>
|
||||
Blockly.inject(document.getElementById('blocklyDiv'),
|
||||
var workspace = Blockly.inject('blocklyDiv',
|
||||
{toolbox: document.getElementById('toolbox')});
|
||||
</script>
|
||||
|
||||
|
|
|
@ -47,10 +47,11 @@
|
|||
<script>
|
||||
'use strict';
|
||||
|
||||
var workspace = null;
|
||||
|
||||
function start() {
|
||||
var toolbox = document.getElementById('toolbox');
|
||||
Blockly.inject(document.getElementById('svg'),
|
||||
{media: '../../media/', toolbox: toolbox});
|
||||
workspace = Blockly.inject('blocklyDiv',
|
||||
{media: '../../media/', toolbox: document.getElementById('toolbox')});
|
||||
}
|
||||
|
||||
function loadXml() {
|
||||
|
@ -91,14 +92,14 @@ function fetchFile(xmlUrl) {
|
|||
function fromXml(xmlText) {
|
||||
var output = document.getElementById('importExport');
|
||||
output.value = xmlText;
|
||||
Blockly.mainWorkspace.clear();
|
||||
workspace.clear();
|
||||
try {
|
||||
var xmlDoc = Blockly.Xml.textToDom(xmlText);
|
||||
} catch (e) {
|
||||
alert('Error parsing XML:\n' + e);
|
||||
return;
|
||||
}
|
||||
Blockly.Xml.domToWorkspace(Blockly.mainWorkspace, xmlDoc);
|
||||
Blockly.Xml.domToWorkspace(workspace, xmlDoc);
|
||||
}
|
||||
|
||||
function setOutput(text) {
|
||||
|
@ -109,24 +110,24 @@ function setOutput(text) {
|
|||
}
|
||||
|
||||
function toXml() {
|
||||
var xmlDom = Blockly.Xml.workspaceToDom(Blockly.mainWorkspace);
|
||||
var xmlDom = Blockly.Xml.workspaceToDom(workspace);
|
||||
var xmlText = Blockly.Xml.domToPrettyText(xmlDom);
|
||||
setOutput(xmlText);
|
||||
}
|
||||
|
||||
function toJavaScript() {
|
||||
var code = '\'use strict\';\n\n'
|
||||
code += Blockly.JavaScript.workspaceToCode();
|
||||
code += Blockly.JavaScript.workspaceToCode(workspace);
|
||||
setOutput(code);
|
||||
}
|
||||
|
||||
function toPython() {
|
||||
var code = Blockly.Python.workspaceToCode();
|
||||
var code = Blockly.Python.workspaceToCode(workspace);
|
||||
setOutput(code);
|
||||
}
|
||||
|
||||
function toDart() {
|
||||
var code = Blockly.Dart.workspaceToCode();
|
||||
var code = Blockly.Dart.workspaceToCode(workspace);
|
||||
setOutput(code);
|
||||
}
|
||||
</script>
|
||||
|
@ -145,15 +146,12 @@ h1 {
|
|||
font-weight: normal;
|
||||
font-size: 140%;
|
||||
}
|
||||
#svg {
|
||||
#blocklyDiv {
|
||||
float: right;
|
||||
height: 95%;
|
||||
width: 69%;
|
||||
margin-top: 5px;
|
||||
}
|
||||
.blocklySvg {
|
||||
border: 1px solid #000;
|
||||
}
|
||||
#importExport {
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
|
@ -162,7 +160,7 @@ h1 {
|
|||
</head>
|
||||
<body onload="start()">
|
||||
|
||||
<div id="svg"></div>
|
||||
<div id="blocklyDiv"></div>
|
||||
|
||||
<xml id="toolbox" style="display: none">
|
||||
<category name="Unit test">
|
||||
|
|
|
@ -38,35 +38,35 @@ function verify_DB_(msg, expected, db) {
|
|||
|
||||
function test_DB_addConnection() {
|
||||
var db = new Blockly.ConnectionDB();
|
||||
var o2 = {y_: 2};
|
||||
var o2 = {y_: 2, sourceBlock_: {}};
|
||||
db.addConnection_(o2);
|
||||
verify_DB_('Adding connection #2', [o2], db);
|
||||
|
||||
var o4 = {y_: 4};
|
||||
var o4 = {y_: 4, sourceBlock_: {}};
|
||||
db.addConnection_(o4);
|
||||
verify_DB_('Adding connection #4', [o2, o4], db);
|
||||
|
||||
var o1 = {y_: 1};
|
||||
var o1 = {y_: 1, sourceBlock_: {}};
|
||||
db.addConnection_(o1);
|
||||
verify_DB_('Adding connection #1', [o1, o2, o4], db);
|
||||
|
||||
var o3a = {y_: 3};
|
||||
var o3a = {y_: 3, sourceBlock_: {}};
|
||||
db.addConnection_(o3a);
|
||||
verify_DB_('Adding connection #3a', [o1, o2, o3a, o4], db);
|
||||
|
||||
var o3b = {y_: 3};
|
||||
var o3b = {y_: 3, sourceBlock_: {}};
|
||||
db.addConnection_(o3b);
|
||||
verify_DB_('Adding connection #3b', [o1, o2, o3b, o3a, o4], db);
|
||||
}
|
||||
|
||||
function test_DB_removeConnection() {
|
||||
var db = new Blockly.ConnectionDB();
|
||||
var o1 = {y_: 1};
|
||||
var o2 = {y_: 2};
|
||||
var o3a = {y_: 3};
|
||||
var o3b = {y_: 3};
|
||||
var o3c = {y_: 3};
|
||||
var o4 = {y_: 4};
|
||||
var o1 = {y_: 1, sourceBlock_: {}};
|
||||
var o2 = {y_: 2, sourceBlock_: {}};
|
||||
var o3a = {y_: 3, sourceBlock_: {}};
|
||||
var o3b = {y_: 3, sourceBlock_: {}};
|
||||
var o3c = {y_: 3, sourceBlock_: {}};
|
||||
var o4 = {y_: 4, sourceBlock_: {}};
|
||||
db.addConnection_(o1);
|
||||
db.addConnection_(o2);
|
||||
db.addConnection_(o3c);
|
||||
|
|
|
@ -55,13 +55,13 @@ function test_maxBlocksWorkspace() {
|
|||
var blockA = Blockly.Block.obtain(workspace, '');
|
||||
var blockB = Blockly.Block.obtain(workspace, '');
|
||||
assertEquals('Infinite capacity.', Infinity, workspace.remainingCapacity());
|
||||
workspace.maxBlocks = 3;
|
||||
workspace.options.maxBlocks = 3;
|
||||
assertEquals('Three capacity.', 1, workspace.remainingCapacity());
|
||||
workspace.maxBlocks = 2;
|
||||
workspace.options.maxBlocks = 2;
|
||||
assertEquals('Two capacity.', 0, workspace.remainingCapacity());
|
||||
workspace.maxBlocks = 1;
|
||||
workspace.options.maxBlocks = 1;
|
||||
assertEquals('One capacity.', -1, workspace.remainingCapacity());
|
||||
workspace.maxBlocks = 0;
|
||||
workspace.options.maxBlocks = 0;
|
||||
assertEquals('Zero capacity.', -2, workspace.remainingCapacity());
|
||||
workspace.clear();
|
||||
assertEquals('Cleared capacity.', 0, workspace.remainingCapacity());
|
||||
|
|
|
@ -46,7 +46,7 @@
|
|||
'use strict';
|
||||
// Depending on the URL argument, render as LTR or RTL.
|
||||
var rtl = (document.location.search == '?rtl');
|
||||
var block = null;
|
||||
var workspace = null;
|
||||
|
||||
function enableRealtimeSpecificUi() {
|
||||
var realtimeDiv = document.getElementById('realtime');
|
||||
|
@ -55,7 +55,7 @@ function enableRealtimeSpecificUi() {
|
|||
|
||||
function start() {
|
||||
var toolbox = document.getElementById('toolbox');
|
||||
Blockly.inject(document.getElementById('blocklyDiv'),
|
||||
workspace = Blockly.inject('blocklyDiv',
|
||||
{rtl: rtl,
|
||||
media: '../media/',
|
||||
toolbox: toolbox,
|
||||
|
@ -82,7 +82,7 @@ function start() {
|
|||
|
||||
function toXml() {
|
||||
var output = document.getElementById('importExport');
|
||||
var xml = Blockly.Xml.workspaceToDom(Blockly.mainWorkspace);
|
||||
var xml = Blockly.Xml.workspaceToDom(workspace);
|
||||
output.value = Blockly.Xml.domToPrettyText(xml);
|
||||
output.focus();
|
||||
output.select();
|
||||
|
@ -91,12 +91,12 @@ function toXml() {
|
|||
function fromXml() {
|
||||
var input = document.getElementById('importExport');
|
||||
var xml = Blockly.Xml.textToDom(input.value);
|
||||
Blockly.Xml.domToWorkspace(Blockly.mainWorkspace, xml);
|
||||
Blockly.Xml.domToWorkspace(workspace, xml);
|
||||
}
|
||||
|
||||
function toCode(lang) {
|
||||
var output = document.getElementById('importExport');
|
||||
output.value = Blockly[lang].workspaceToCode();
|
||||
output.value = Blockly[lang].workspaceToCode(workspace);
|
||||
}
|
||||
|
||||
function airstrike(n) {
|
||||
|
@ -108,7 +108,7 @@ function airstrike(n) {
|
|||
}
|
||||
for (var i = 0; i < n; i++) {
|
||||
var prototype = prototypes[Math.floor(Math.random() * prototypes.length)];
|
||||
var block = Blockly.Block.obtain(Blockly.mainWorkspace, prototype);
|
||||
var block = Blockly.Block.obtain(workspace, prototype);
|
||||
block.initSvg();
|
||||
block.getSvgRoot().setAttribute('transform', 'translate(' +
|
||||
Math.round(Math.random() * 450 + 40) + ', ' +
|
||||
|
@ -126,7 +126,7 @@ function spaghetti(n) {
|
|||
xml = '<xml xmlns="http://www.w3.org/1999/xhtml">' + xml + '</xml>';
|
||||
var dom = Blockly.Xml.textToDom(xml);
|
||||
console.time('Spaghetti domToWorkspace');
|
||||
Blockly.Xml.domToWorkspace(Blockly.mainWorkspace, dom);
|
||||
Blockly.Xml.domToWorkspace(workspace, dom);
|
||||
console.timeEnd('Spaghetti domToWorkspace');
|
||||
}
|
||||
var spaghettiXml = [
|
||||
|
@ -418,7 +418,7 @@ h1 {
|
|||
|
||||
<h1>Blockly Playground</h1>
|
||||
|
||||
<p><a href="javascript:void([document.getElementById('blocklyDiv').style.display = 'block', Blockly.mainWorkspace.render()])">Show</a>
|
||||
<p><a href="javascript:void([document.getElementById('blocklyDiv').style.display = 'block', workspace.render()])">Show</a>
|
||||
- <a href="javascript:void(document.getElementById('blocklyDiv').style.display = 'none')">Hide</a></p>
|
||||
|
||||
<script>
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue