mirror of
https://github.com/scratchfoundation/scratch-blocks.git
synced 2025-08-28 22:10:31 -04:00
424 lines
13 KiB
HTML
424 lines
13 KiB
HTML
<!DOCTYPE html>
|
|
<html>
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<title>Blockly Playground</title>
|
|
<script src="../blockly_uncompressed.js"></script>
|
|
<script src="../generators/javascript.js"></script>
|
|
<script src="../generators/javascript/logic.js"></script>
|
|
<script src="../generators/javascript/loops.js"></script>
|
|
<script src="../generators/javascript/math.js"></script>
|
|
<script src="../generators/javascript/text.js"></script>
|
|
<script src="../generators/javascript/lists.js"></script>
|
|
<script src="../generators/javascript/colour.js"></script>
|
|
<script src="../generators/javascript/variables.js"></script>
|
|
<script src="../generators/javascript/procedures.js"></script>
|
|
<script src="../generators/python.js"></script>
|
|
<script src="../generators/python/logic.js"></script>
|
|
<script src="../generators/python/loops.js"></script>
|
|
<script src="../generators/python/math.js"></script>
|
|
<script src="../generators/python/text.js"></script>
|
|
<script src="../generators/python/lists.js"></script>
|
|
<script src="../generators/python/colour.js"></script>
|
|
<script src="../generators/python/variables.js"></script>
|
|
<script src="../generators/python/procedures.js"></script>
|
|
<script src="../generators/dart.js"></script>
|
|
<script src="../generators/dart/logic.js"></script>
|
|
<script src="../generators/dart/loops.js"></script>
|
|
<script src="../generators/dart/math.js"></script>
|
|
<script src="../generators/dart/text.js"></script>
|
|
<script src="../generators/dart/lists.js"></script>
|
|
<script src="../generators/dart/colour.js"></script>
|
|
<script src="../generators/dart/variables.js"></script>
|
|
<script src="../generators/dart/procedures.js"></script>
|
|
<script src="../msg/messages.js"></script>
|
|
<script src="../blocks/logic.js"></script>
|
|
<script src="../blocks/loops.js"></script>
|
|
<script src="../blocks/math.js"></script>
|
|
<script src="../blocks/text.js"></script>
|
|
<script src="../blocks/lists.js"></script>
|
|
<script src="../blocks/colour.js"></script>
|
|
<script src="../blocks/variables.js"></script>
|
|
<script src="../blocks/procedures.js"></script>
|
|
<!-- Load the Google Drive SDK Realtime libraries. -->
|
|
<script src="https://apis.google.com/js/api.js"></script>
|
|
<script>
|
|
'use strict';
|
|
// Depending on the URL argument, render as LTR or RTL.
|
|
var rtl = (document.location.search == '?rtl');
|
|
var block = null;
|
|
|
|
function enableRealtimeSpecificUi() {
|
|
var realtimeDiv = document.getElementById('realtime');
|
|
realtimeDiv.display = 'block';
|
|
}
|
|
|
|
function start() {
|
|
var toolbox = document.getElementById('toolbox');
|
|
Blockly.inject(document.getElementById('blocklyDiv'),
|
|
{rtl: rtl,
|
|
media: '../media/',
|
|
toolbox: toolbox,
|
|
comments: true,
|
|
disable: true,
|
|
collapse: true,
|
|
realtime: false,
|
|
realtimeOptions:
|
|
{clientId: 'YOUR CLIENT ID GOES HERE',
|
|
chatbox: {elementId: 'chatbox'},
|
|
collabElementId: 'collaborators'}});
|
|
if (Blockly.Realtime.isEnabled()) {
|
|
enableRealtimeSpecificUi();
|
|
}
|
|
}
|
|
|
|
function toXml() {
|
|
var output = document.getElementById('importExport');
|
|
var xml = Blockly.Xml.workspaceToDom(Blockly.mainWorkspace);
|
|
output.value = Blockly.Xml.domToPrettyText(xml);
|
|
output.focus();
|
|
output.select();
|
|
}
|
|
|
|
function fromXml() {
|
|
var input = document.getElementById('importExport');
|
|
var xml = Blockly.Xml.textToDom(input.value);
|
|
Blockly.Xml.domToWorkspace(Blockly.mainWorkspace, xml);
|
|
}
|
|
|
|
function toCode(lang) {
|
|
var output = document.getElementById('importExport');
|
|
output.value = Blockly[lang].workspaceToCode();
|
|
}
|
|
|
|
function airstrike(n) {
|
|
var prototypes = [];
|
|
var toolbox = document.getElementById('toolbox');
|
|
var blocks = toolbox.getElementsByTagName('block');
|
|
for (var x = 0, block; block = blocks[x]; x++) {
|
|
prototypes.push(block.getAttribute('type'));
|
|
}
|
|
for (var x = 0; x < n; x++) {
|
|
var prototype = prototypes[Math.floor(Math.random() * prototypes.length)];
|
|
var block = Blockly.Block.obtain(Blockly.mainWorkspace, prototype);
|
|
block.initSvg();
|
|
block.getSvgRoot().setAttribute('transform', 'translate(' +
|
|
Math.round(Math.random() * 450 + 40) + ', ' +
|
|
Math.round(Math.random() * 600 + 40) + ')');
|
|
block.render();
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style>
|
|
html, body {
|
|
height: 100%;
|
|
}
|
|
body {
|
|
background-color: #fff;
|
|
font-family: sans-serif;
|
|
overflow: hidden;
|
|
}
|
|
h1 {
|
|
font-weight: normal;
|
|
font-size: 140%;
|
|
}
|
|
#blocklyDiv {
|
|
float: right;
|
|
height: 95%;
|
|
width: 70%;
|
|
}
|
|
#collaborators {
|
|
float: right;
|
|
width: 30px;
|
|
margin-left: 10px;
|
|
}
|
|
#collaborators > img {
|
|
margin-right: 5px;
|
|
height: 30px;
|
|
padding-bottom: 5px;
|
|
width: 30px;
|
|
border-radius: 3px;
|
|
}
|
|
#importExport {
|
|
font-family: monospace;
|
|
}
|
|
</style>
|
|
</head>
|
|
<body onload="start()">
|
|
|
|
<div id="collaborators"></div>
|
|
|
|
<div id="blocklyDiv"></div>
|
|
|
|
<xml id="toolbox" style="display: none">
|
|
<category name="Logic">
|
|
<block type="controls_if"></block>
|
|
<block type="logic_compare"></block>
|
|
<block type="logic_operation"></block>
|
|
<block type="logic_negate"></block>
|
|
<block type="logic_boolean"></block>
|
|
<block type="logic_null"></block>
|
|
<block type="logic_ternary"></block>
|
|
</category>
|
|
<category name="Loops">
|
|
<block type="controls_repeat_ext">
|
|
<value name="TIMES">
|
|
<block type="math_number">
|
|
<field name="NUM">10</field>
|
|
</block>
|
|
</value>
|
|
</block>
|
|
<block type="controls_whileUntil"></block>
|
|
<block type="controls_for">
|
|
<value name="FROM">
|
|
<block type="math_number">
|
|
<field name="NUM">1</field>
|
|
</block>
|
|
</value>
|
|
<value name="TO">
|
|
<block type="math_number">
|
|
<field name="NUM">10</field>
|
|
</block>
|
|
</value>
|
|
<value name="BY">
|
|
<block type="math_number">
|
|
<field name="NUM">1</field>
|
|
</block>
|
|
</value>
|
|
</block>
|
|
<block type="controls_forEach"></block>
|
|
<block type="controls_flow_statements"></block>
|
|
</category>
|
|
<category name="Math">
|
|
<block type="math_number"></block>
|
|
<block type="math_arithmetic"></block>
|
|
<block type="math_single"></block>
|
|
<block type="math_trig"></block>
|
|
<block type="math_constant"></block>
|
|
<block type="math_number_property"></block>
|
|
<block type="math_change">
|
|
<value name="DELTA">
|
|
<block type="math_number">
|
|
<field name="NUM">1</field>
|
|
</block>
|
|
</value>
|
|
</block>
|
|
<block type="math_round"></block>
|
|
<block type="math_on_list"></block>
|
|
<block type="math_modulo"></block>
|
|
<block type="math_constrain">
|
|
<value name="LOW">
|
|
<block type="math_number">
|
|
<field name="NUM">1</field>
|
|
</block>
|
|
</value>
|
|
<value name="HIGH">
|
|
<block type="math_number">
|
|
<field name="NUM">100</field>
|
|
</block>
|
|
</value>
|
|
</block>
|
|
<block type="math_random_int">
|
|
<value name="FROM">
|
|
<block type="math_number">
|
|
<field name="NUM">1</field>
|
|
</block>
|
|
</value>
|
|
<value name="TO">
|
|
<block type="math_number">
|
|
<field name="NUM">100</field>
|
|
</block>
|
|
</value>
|
|
</block>
|
|
<block type="math_random_float"></block>
|
|
</category>
|
|
<category name="Text">
|
|
<block type="text"></block>
|
|
<block type="text_join"></block>
|
|
<block type="text_append">
|
|
<value name="TEXT">
|
|
<block type="text"></block>
|
|
</value>
|
|
</block>
|
|
<block type="text_length"></block>
|
|
<block type="text_isEmpty"></block>
|
|
<block type="text_indexOf">
|
|
<value name="VALUE">
|
|
<block type="variables_get">
|
|
<field name="VAR">text</field>
|
|
</block>
|
|
</value>
|
|
</block>
|
|
<block type="text_charAt">
|
|
<value name="VALUE">
|
|
<block type="variables_get">
|
|
<field name="VAR">text</field>
|
|
</block>
|
|
</value>
|
|
</block>
|
|
<block type="text_getSubstring">
|
|
<value name="STRING">
|
|
<block type="variables_get">
|
|
<field name="VAR">text</field>
|
|
</block>
|
|
</value>
|
|
</block>
|
|
<block type="text_changeCase"></block>
|
|
<block type="text_trim"></block>
|
|
<block type="text_print"></block>
|
|
<block type="text_prompt_ext">
|
|
<value name="TEXT">
|
|
<block type="text"></block>
|
|
</value>
|
|
</block>
|
|
</category>
|
|
<category name="Lists">
|
|
<block type="lists_create_empty"></block>
|
|
<block type="lists_create_with"></block>
|
|
<block type="lists_repeat">
|
|
<value name="NUM">
|
|
<block type="math_number">
|
|
<field name="NUM">5</field>
|
|
</block>
|
|
</value>
|
|
</block>
|
|
<block type="lists_length"></block>
|
|
<block type="lists_isEmpty"></block>
|
|
<block type="lists_indexOf">
|
|
<value name="VALUE">
|
|
<block type="variables_get">
|
|
<field name="VAR">list</field>
|
|
</block>
|
|
</value>
|
|
</block>
|
|
<block type="lists_getIndex">
|
|
<value name="VALUE">
|
|
<block type="variables_get">
|
|
<field name="VAR">list</field>
|
|
</block>
|
|
</value>
|
|
</block>
|
|
<block type="lists_setIndex">
|
|
<value name="LIST">
|
|
<block type="variables_get">
|
|
<field name="VAR">list</field>
|
|
</block>
|
|
</value>
|
|
</block>
|
|
<block type="lists_getSublist">
|
|
<value name="LIST">
|
|
<block type="variables_get">
|
|
<field name="VAR">list</field>
|
|
</block>
|
|
</value>
|
|
</block>
|
|
<block type="lists_split">
|
|
<value name="DELIM">
|
|
<block type="text">
|
|
<field name="TEXT">,</field>
|
|
</block>
|
|
</value>
|
|
</block>
|
|
</category>
|
|
<category name="Colour">
|
|
<block type="colour_picker"></block>
|
|
<block type="colour_random"></block>
|
|
<block type="colour_rgb">
|
|
<value name="RED">
|
|
<block type="math_number">
|
|
<field name="NUM">100</field>
|
|
</block>
|
|
</value>
|
|
<value name="GREEN">
|
|
<block type="math_number">
|
|
<field name="NUM">50</field>
|
|
</block>
|
|
</value>
|
|
<value name="BLUE">
|
|
<block type="math_number">
|
|
<field name="NUM">0</field>
|
|
</block>
|
|
</value>
|
|
</block>
|
|
<block type="colour_blend">
|
|
<value name="COLOUR1">
|
|
<block type="colour_picker">
|
|
<field name="COLOUR">#ff0000</field>
|
|
</block>
|
|
</value>
|
|
<value name="COLOUR2">
|
|
<block type="colour_picker">
|
|
<field name="COLOUR">#3333ff</field>
|
|
</block>
|
|
</value>
|
|
<value name="RATIO">
|
|
<block type="math_number">
|
|
<field name="NUM">0.5</field>
|
|
</block>
|
|
</value>
|
|
</block>
|
|
</category>
|
|
<hr>
|
|
<category name="Variables" custom="VARIABLE"></category>
|
|
<category name="Functions" custom="PROCEDURE"></category>
|
|
</xml>
|
|
|
|
<h1>Blockly Playground</h1>
|
|
|
|
<p><a href="javascript:void([document.getElementById('blocklyDiv').style.display = 'block', Blockly.mainWorkspace.render()])">Show</a>
|
|
- <a href="javascript:void(document.getElementById('blocklyDiv').style.display = 'none')">Hide</a></p>
|
|
|
|
<script>
|
|
if (rtl) {
|
|
document.write('[ ← RTL. Switch to <A HREF="?ltr">LTR</A>. ]');
|
|
} else {
|
|
document.write('[ → LTR. Switch to <A HREF="?rtl">RTL</A>. ]');
|
|
}
|
|
</script>
|
|
|
|
<p>
|
|
<input type="button" value="Export to XML" onclick="toXml()">
|
|
|
|
<input type="button" value="Import from XML" onclick="fromXml()">
|
|
<br>
|
|
<input type="button" value="To JavaScript" onclick="toCode('JavaScript')">
|
|
|
|
<input type="button" value="To Python" onclick="toCode('Python')">
|
|
|
|
<input type="button" value="To Dart" onclick="toCode('Dart')">
|
|
<br>
|
|
<textarea id="importExport" style="width: 26%; height: 12em"></textarea>
|
|
</p>
|
|
<hr>
|
|
|
|
<p>
|
|
Stress test with an <input type="button" value="Airstrike!" onclick="airstrike(100)">
|
|
</p>
|
|
|
|
<!-- Realtime setup buttons. -->
|
|
|
|
<div id="realtime" style="display: none">
|
|
|
|
<p>Test realtime collaboration by opening
|
|
<a target="_blank" href="#" onmouseover="this.href = window.location.href">
|
|
this link</a> in a separate browser window or tab and they will be
|
|
synchronized. You can even share the link with a friend!.</p>
|
|
|
|
<br>
|
|
<br>
|
|
|
|
<!-- Undo and redo buttons. -->
|
|
<!-- TODO: Uncomment this when undo/redo are fixed. -->
|
|
<!--
|
|
<button id="undoButton" disabled>Undo</button>
|
|
<button id="redoButton" disabled>Redo</button>
|
|
<br />
|
|
-->
|
|
|
|
<!-- Text area that will be used for our collaborative chat box. -->
|
|
<textarea id="chatbox" style="width: 26%; height: 12em" disabled="true"></textarea>
|
|
|
|
</div>
|
|
</body>
|
|
</html>
|