playground.html 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>Blockly Playground</title>
  6. <script src="../blockly_uncompressed.js"></script>
  7. <script src="../generators/javascript.js"></script>
  8. <script src="../generators/javascript/logic.js"></script>
  9. <script src="../generators/javascript/loops.js"></script>
  10. <script src="../generators/javascript/math.js"></script>
  11. <script src="../generators/javascript/text.js"></script>
  12. <script src="../generators/javascript/lists.js"></script>
  13. <script src="../generators/javascript/colour.js"></script>
  14. <script src="../generators/javascript/variables.js"></script>
  15. <script src="../generators/javascript/procedures.js"></script>
  16. <script src="../generators/python.js"></script>
  17. <script src="../generators/python/logic.js"></script>
  18. <script src="../generators/python/loops.js"></script>
  19. <script src="../generators/python/math.js"></script>
  20. <script src="../generators/python/text.js"></script>
  21. <script src="../generators/python/lists.js"></script>
  22. <script src="../generators/python/colour.js"></script>
  23. <script src="../generators/python/variables.js"></script>
  24. <script src="../generators/python/procedures.js"></script>
  25. <script src="../generators/php.js"></script>
  26. <script src="../generators/php/logic.js"></script>
  27. <script src="../generators/php/loops.js"></script>
  28. <script src="../generators/php/math.js"></script>
  29. <script src="../generators/php/text.js"></script>
  30. <script src="../generators/php/lists.js"></script>
  31. <script src="../generators/php/colour.js"></script>
  32. <script src="../generators/php/variables.js"></script>
  33. <script src="../generators/php/procedures.js"></script>
  34. <script src="../generators/lua.js"></script>
  35. <script src="../generators/lua/logic.js"></script>
  36. <script src="../generators/lua/loops.js"></script>
  37. <script src="../generators/lua/math.js"></script>
  38. <script src="../generators/lua/text.js"></script>
  39. <script src="../generators/lua/lists.js"></script>
  40. <script src="../generators/lua/colour.js"></script>
  41. <script src="../generators/lua/variables.js"></script>
  42. <script src="../generators/lua/procedures.js"></script>
  43. <script src="../generators/dart.js"></script>
  44. <script src="../generators/dart/logic.js"></script>
  45. <script src="../generators/dart/loops.js"></script>
  46. <script src="../generators/dart/math.js"></script>
  47. <script src="../generators/dart/text.js"></script>
  48. <script src="../generators/dart/lists.js"></script>
  49. <script src="../generators/dart/colour.js"></script>
  50. <script src="../generators/dart/variables.js"></script>
  51. <script src="../generators/dart/procedures.js"></script>
  52. <script src="../msg/messages.js"></script>
  53. <script src="../blocks/logic.js"></script>
  54. <script src="../blocks/loops.js"></script>
  55. <script src="../blocks/math.js"></script>
  56. <script src="../blocks/text.js"></script>
  57. <script src="../blocks/lists.js"></script>
  58. <script src="../blocks/colour.js"></script>
  59. <script src="../blocks/variables.js"></script>
  60. <script src="../blocks/procedures.js"></script>
  61. <script>
  62. 'use strict';
  63. var workspace = null;
  64. var fakeDragStack = [];
  65. function start() {
  66. // Parse the URL arguments.
  67. var match = location.search.match(/dir=([^&]+)/);
  68. var rtl = match && match[1] == 'rtl';
  69. document.forms.options.elements.dir.selectedIndex = Number(rtl);
  70. var toolbox = getToolboxElement();
  71. document.forms.options.elements.toolbox.selectedIndex =
  72. Number(toolbox.getElementsByTagName('category').length == 0);
  73. match = location.search.match(/side=([^&]+)/);
  74. var side = match ? match[1] : 'start';
  75. document.forms.options.elements.side.value = side;
  76. // Create main workspace.
  77. workspace = Blockly.inject('blocklyDiv',
  78. {comments: true,
  79. disable: true,
  80. collapse: true,
  81. grid:
  82. {spacing: 25,
  83. length: 3,
  84. colour: '#ccc',
  85. snap: true},
  86. horizontalLayout: side == 'top' || side == 'bottom',
  87. maxBlocks: Infinity,
  88. media: '../media/',
  89. readOnly: false,
  90. rtl: rtl,
  91. scrollbars: true,
  92. toolbox: toolbox,
  93. toolboxPosition: side == 'top' || side == 'start' ? 'start' : 'end',
  94. zoom:
  95. {controls: true,
  96. wheel: true,
  97. startScale: 1.0,
  98. maxScale: 4,
  99. minScale: .25,
  100. scaleSpeed: 1.1}
  101. });
  102. // Restore previously displayed text.
  103. if (sessionStorage) {
  104. var text = sessionStorage.getItem('textarea');
  105. if (text) {
  106. document.getElementById('importExport').value = text;
  107. }
  108. // Restore event logging state.
  109. var state = sessionStorage.getItem('logEvents');
  110. logEvents(Boolean(Number(state)));
  111. } else {
  112. // MSIE 11 does not support sessionStorage on file:// URLs.
  113. logEvents(false);
  114. }
  115. taChange();
  116. }
  117. function getToolboxElement() {
  118. var match = location.search.match(/toolbox=([^&]+)/);
  119. return document.getElementById('toolbox-' + (match ? match[1] : 'categories'));
  120. }
  121. function toXml() {
  122. var output = document.getElementById('importExport');
  123. var xml = Blockly.Xml.workspaceToDom(workspace);
  124. output.value = Blockly.Xml.domToPrettyText(xml);
  125. output.focus();
  126. output.select();
  127. taChange();
  128. }
  129. function fromXml() {
  130. var input = document.getElementById('importExport');
  131. var xml = Blockly.Xml.textToDom(input.value);
  132. Blockly.Xml.domToWorkspace(xml, workspace);
  133. taChange();
  134. }
  135. function toCode(lang) {
  136. var output = document.getElementById('importExport');
  137. output.value = Blockly[lang].workspaceToCode(workspace);
  138. taChange();
  139. }
  140. // Disable the "Import from XML" button if the XML is invalid.
  141. // Preserve text between page reloads.
  142. function taChange() {
  143. var textarea = document.getElementById('importExport');
  144. if (sessionStorage) {
  145. sessionStorage.setItem('textarea', textarea.value);
  146. }
  147. var valid = true;
  148. try {
  149. Blockly.Xml.textToDom(textarea.value);
  150. } catch (e) {
  151. valid = false;
  152. }
  153. document.getElementById('import').disabled = !valid;
  154. }
  155. function logEvents(state) {
  156. var checkbox = document.getElementById('logCheck');
  157. checkbox.checked = state;
  158. if (sessionStorage) {
  159. sessionStorage.setItem('logEvents', Number(state));
  160. }
  161. if (state) {
  162. workspace.addChangeListener(logger);
  163. } else {
  164. workspace.removeChangeListener(logger);
  165. }
  166. }
  167. function logger(e) {
  168. console.log(e);
  169. }
  170. function airstrike(n) {
  171. var prototypes = [];
  172. var toolbox = getToolboxElement();
  173. var blocks = toolbox.getElementsByTagName('block');
  174. for (var i = 0, block; block = blocks[i]; i++) {
  175. prototypes.push(block.getAttribute('type'));
  176. }
  177. for (var i = 0; i < n; i++) {
  178. var prototype = prototypes[Math.floor(Math.random() * prototypes.length)];
  179. var block = workspace.newBlock(prototype);
  180. block.initSvg();
  181. block.getSvgRoot().setAttribute('transform', 'translate(' +
  182. Math.round(Math.random() * 450 + 40) + ', ' +
  183. Math.round(Math.random() * 600 + 40) + ')');
  184. block.render();
  185. }
  186. }
  187. function fakeDrag(id, dx, dy, opt_workspace) {
  188. var ws = opt_workspace || Blockly.getMainWorkspace();
  189. var blockToDrag = ws.getBlockById(id);
  190. if (!blockToDrag) {
  191. fakeDragWrapper();
  192. return;
  193. }
  194. var blockTop = blockToDrag.svgGroup_.getBoundingClientRect().top;
  195. var blockLeft = blockToDrag.svgGroup_.getBoundingClientRect().left;
  196. // Click somewhere on the block.
  197. var mouseDownEvent = new MouseEvent('mousedown',
  198. {clientX: blockLeft + 5, clientY: blockTop + 5});
  199. blockToDrag.onMouseDown_(mouseDownEvent);
  200. // Throw in a move for good measure.
  201. setTimeout(
  202. function() {
  203. var mouseMoveEvent = new MouseEvent('mousemove',
  204. {clientX: blockLeft + dx,
  205. clientY: blockTop + dy});
  206. blockToDrag.onMouseMove_(mouseMoveEvent);
  207. // Drop at dx, dy.
  208. setTimeout(
  209. function() {
  210. var mouseUpEvent = new MouseEvent('mouseup',
  211. {clientX: blockLeft + dx,
  212. clientY: blockTop + dy});
  213. blockToDrag.onMouseUp_(mouseUpEvent);
  214. setTimeout(fakeDragWrapper(), 100);
  215. }, 30);
  216. }, 30);
  217. };
  218. function fakeDragWrapper() {
  219. var dragInfo = fakeDragStack.pop();
  220. if (dragInfo) {
  221. fakeDrag(dragInfo.id, dragInfo.dx, dragInfo.dy, dragInfo.workspace);
  222. }
  223. }
  224. function fakeManyDrags() {
  225. var blockList = workspace.getAllBlocks();
  226. for (var i = 0; i < 2 * blockList.length; i++) {
  227. fakeDragStack.push(
  228. {
  229. id: blockList[Math.round(Math.random() * (blockList.length - 1))].id,
  230. // Move some blocks up and to the left, but mostly down and to the right.
  231. dx: Math.round((Math.random() - 0.25) * 200),
  232. dy: Math.round((Math.random() - 0.25) * 200),
  233. workspace: workspace
  234. });
  235. }
  236. fakeDragWrapper();
  237. }
  238. function spaghetti(n) {
  239. var xml = spaghettiXml;
  240. for(var i = 0; i < n; i++) {
  241. xml = xml.replace(/(<(statement|next)( name="DO0")?>)<\//g,
  242. '$1' + spaghettiXml + '</');
  243. }
  244. xml = '<xml xmlns="http://www.w3.org/1999/xhtml">' + xml + '</xml>';
  245. var dom = Blockly.Xml.textToDom(xml);
  246. console.time('Spaghetti domToWorkspace');
  247. Blockly.Xml.domToWorkspace(dom, workspace);
  248. console.timeEnd('Spaghetti domToWorkspace');
  249. }
  250. var spaghettiXml = [
  251. ' <block type="controls_if">',
  252. ' <value name="IF0">',
  253. ' <block type="logic_compare">',
  254. ' <field name="OP">EQ</field>',
  255. ' <value name="A">',
  256. ' <block type="math_arithmetic">',
  257. ' <field name="OP">MULTIPLY</field>',
  258. ' <value name="A">',
  259. ' <block type="math_number">',
  260. ' <field name="NUM">6</field>',
  261. ' </block>',
  262. ' </value>',
  263. ' <value name="B">',
  264. ' <block type="math_number">',
  265. ' <field name="NUM">7</field>',
  266. ' </block>',
  267. ' </value>',
  268. ' </block>',
  269. ' </value>',
  270. ' <value name="B">',
  271. ' <block type="math_number">',
  272. ' <field name="NUM">42</field>',
  273. ' </block>',
  274. ' </value>',
  275. ' </block>',
  276. ' </value>',
  277. ' <statement name="DO0"></statement>',
  278. ' <next></next>',
  279. ' </block>'].join('\n');
  280. </script>
  281. <style>
  282. html, body {
  283. height: 100%;
  284. }
  285. body {
  286. background-color: #fff;
  287. font-family: sans-serif;
  288. overflow: hidden;
  289. }
  290. h1 {
  291. font-weight: normal;
  292. font-size: 140%;
  293. }
  294. #blocklyDiv {
  295. float: right;
  296. height: 95%;
  297. width: 70%;
  298. }
  299. #importExport {
  300. font-family: monospace;
  301. }
  302. </style>
  303. </head>
  304. <body onload="start()">
  305. <div id="blocklyDiv"></div>
  306. <h1>Blockly Playground</h1>
  307. <p><a href="javascript:void(workspace.setVisible(true))">Show</a>
  308. - <a href="javascript:void(workspace.setVisible(false))">Hide</a></p>
  309. <form id="options">
  310. <select name="dir" onchange="document.forms.options.submit()">
  311. <option value="ltr">LTR</option>
  312. <option value="rtl">RTL</option>
  313. </select>
  314. <select name="toolbox" onchange="document.forms.options.submit()">
  315. <option value="categories">Categories</option>
  316. <option value="simple">Simple</option>
  317. </select>
  318. <select name="side" onchange="document.forms.options.submit()">
  319. <option value="start">Start</option>
  320. <option value="end">End</option>
  321. <option value="top">Top</option>
  322. <option value="bottom">Bottom</option>
  323. </select>
  324. </form>
  325. <p>
  326. <input type="button" value="Export to XML" onclick="toXml()">
  327. &nbsp;
  328. <input type="button" value="Import from XML" onclick="fromXml()" id="import">
  329. <br>
  330. <input type="button" value="To JavaScript" onclick="toCode('JavaScript')">
  331. &nbsp;
  332. <input type="button" value="To Python" onclick="toCode('Python')">
  333. &nbsp;
  334. <input type="button" value="To PHP" onclick="toCode('PHP')">
  335. &nbsp;
  336. <input type="button" value="To Lua" onclick="toCode('Lua')">
  337. &nbsp;
  338. <input type="button" value="To Dart" onclick="toCode('Dart')">
  339. <br>
  340. <textarea id="importExport" style="width: 26%; height: 12em"
  341. onchange="taChange();" onkeyup="taChange()"></textarea>
  342. </p>
  343. <p>
  344. Stress test: &nbsp;
  345. <input type="button" value="Airstrike!" onclick="airstrike(100)">
  346. <input type="button" value="Spaghetti!" onclick="spaghetti(8)">
  347. <input type="button" value="Fake some drags!" onclick="fakeManyDrags()">
  348. </p>
  349. <p>
  350. Log events: &nbsp;
  351. <input type="checkbox" onclick="logEvents(this.checked)" id="logCheck">
  352. </p>
  353. <xml id="toolbox-simple" style="display: none">
  354. <block type="controls_if"></block>
  355. <block type="logic_compare"></block>
  356. <!-- <block type="control_repeat"></block> -->
  357. <block type="logic_operation"></block>
  358. <block type="controls_repeat_ext">
  359. <value name="TIMES">
  360. <shadow type="math_number">
  361. <field name="NUM">10</field>
  362. </shadow>
  363. </value>
  364. </block>
  365. <block type="logic_operation"></block>
  366. <block type="logic_negate"></block>
  367. <block type="logic_boolean"></block>
  368. <block type="logic_null" disabled="true"></block>
  369. <block type="logic_ternary"></block>
  370. </xml>
  371. <xml id="toolbox-categories" style="display: none">
  372. <category name="Logic" colour="210">
  373. <block type="controls_if"></block>
  374. <block type="logic_compare"></block>
  375. <block type="logic_operation"></block>
  376. <block type="logic_negate"></block>
  377. <block type="logic_boolean"></block>
  378. <block type="logic_null" disabled="true"></block>
  379. <block type="logic_ternary"></block>
  380. </category>
  381. <category name="Loops" colour="120">
  382. <block type="controls_repeat_ext">
  383. <value name="TIMES">
  384. <shadow type="math_number">
  385. <field name="NUM">10</field>
  386. </shadow>
  387. </value>
  388. </block>
  389. <block type="controls_repeat" disabled="true"></block>
  390. <block type="controls_whileUntil"></block>
  391. <block type="controls_for">
  392. <value name="FROM">
  393. <shadow type="math_number">
  394. <field name="NUM">1</field>
  395. </shadow>
  396. </value>
  397. <value name="TO">
  398. <shadow type="math_number">
  399. <field name="NUM">10</field>
  400. </shadow>
  401. </value>
  402. <value name="BY">
  403. <shadow type="math_number">
  404. <field name="NUM">1</field>
  405. </shadow>
  406. </value>
  407. </block>
  408. <block type="controls_forEach"></block>
  409. <block type="controls_flow_statements"></block>
  410. </category>
  411. <category name="Math" colour="230">
  412. <block type="math_number" gap="32"></block>
  413. <block type="math_arithmetic">
  414. <value name="A">
  415. <shadow type="math_number">
  416. <field name="NUM">1</field>
  417. </shadow>
  418. </value>
  419. <value name="B">
  420. <shadow type="math_number">
  421. <field name="NUM">1</field>
  422. </shadow>
  423. </value>
  424. </block>
  425. <block type="math_single">
  426. <value name="NUM">
  427. <shadow type="math_number">
  428. <field name="NUM">9</field>
  429. </shadow>
  430. </value>
  431. </block>
  432. <block type="math_trig">
  433. <value name="NUM">
  434. <shadow type="math_number">
  435. <field name="NUM">45</field>
  436. </shadow>
  437. </value>
  438. </block>
  439. <block type="math_constant"></block>
  440. <block type="math_number_property">
  441. <value name="NUMBER_TO_CHECK">
  442. <shadow type="math_number">
  443. <field name="NUM">0</field>
  444. </shadow>
  445. </value>
  446. </block>
  447. <block type="math_change">
  448. <value name="DELTA">
  449. <shadow type="math_number">
  450. <field name="NUM">1</field>
  451. </shadow>
  452. </value>
  453. </block>
  454. <block type="math_round">
  455. <value name="NUM">
  456. <shadow type="math_number">
  457. <field name="NUM">3.1</field>
  458. </shadow>
  459. </value>
  460. </block>
  461. <block type="math_on_list"></block>
  462. <block type="math_modulo">
  463. <value name="DIVIDEND">
  464. <shadow type="math_number">
  465. <field name="NUM">64</field>
  466. </shadow>
  467. </value>
  468. <value name="DIVISOR">
  469. <shadow type="math_number">
  470. <field name="NUM">10</field>
  471. </shadow>
  472. </value>
  473. </block>
  474. <block type="math_constrain">
  475. <value name="VALUE">
  476. <shadow type="math_number">
  477. <field name="NUM">50</field>
  478. </shadow>
  479. </value>
  480. <value name="LOW">
  481. <shadow type="math_number">
  482. <field name="NUM">1</field>
  483. </shadow>
  484. </value>
  485. <value name="HIGH">
  486. <shadow type="math_number">
  487. <field name="NUM">100</field>
  488. </shadow>
  489. </value>
  490. </block>
  491. <block type="math_random_int">
  492. <value name="FROM">
  493. <shadow type="math_number">
  494. <field name="NUM">1</field>
  495. </shadow>
  496. </value>
  497. <value name="TO">
  498. <shadow type="math_number">
  499. <field name="NUM">100</field>
  500. </shadow>
  501. </value>
  502. </block>
  503. <block type="math_random_float"></block>
  504. </category>
  505. <category name="Text" colour="160">
  506. <block type="text"></block>
  507. <block type="text_join"></block>
  508. <block type="text_append">
  509. <value name="TEXT">
  510. <shadow type="text"></shadow>
  511. </value>
  512. </block>
  513. <block type="text_length">
  514. <value name="VALUE">
  515. <shadow type="text">
  516. <field name="TEXT">abc</field>
  517. </shadow>
  518. </value>
  519. </block>
  520. <block type="text_isEmpty">
  521. <value name="VALUE">
  522. <shadow type="text">
  523. <field name="TEXT"></field>
  524. </shadow>
  525. </value>
  526. </block>
  527. <block type="text_indexOf">
  528. <value name="VALUE">
  529. <block type="variables_get">
  530. <field name="VAR">text</field>
  531. </block>
  532. </value>
  533. <value name="FIND">
  534. <shadow type="text">
  535. <field name="TEXT">abc</field>
  536. </shadow>
  537. </value>
  538. </block>
  539. <block type="text_charAt">
  540. <value name="VALUE">
  541. <block type="variables_get">
  542. <field name="VAR">text</field>
  543. </block>
  544. </value>
  545. </block>
  546. <block type="text_getSubstring">
  547. <value name="STRING">
  548. <block type="variables_get">
  549. <field name="VAR">text</field>
  550. </block>
  551. </value>
  552. </block>
  553. <block type="text_changeCase">
  554. <value name="TEXT">
  555. <shadow type="text">
  556. <field name="TEXT">abc</field>
  557. </shadow>
  558. </value>
  559. </block>
  560. <block type="text_trim">
  561. <value name="TEXT">
  562. <shadow type="text">
  563. <field name="TEXT">abc</field>
  564. </shadow>
  565. </value>
  566. </block>
  567. <block type="text_print">
  568. <value name="TEXT">
  569. <shadow type="text">
  570. <field name="TEXT">abc</field>
  571. </shadow>
  572. </value>
  573. </block>
  574. <block type="text_prompt_ext">
  575. <value name="TEXT">
  576. <shadow type="text">
  577. <field name="TEXT">abc</field>
  578. </shadow>
  579. </value>
  580. </block>
  581. </category>
  582. <category name="Lists" colour="260">
  583. <block type="lists_create_with">
  584. <mutation items="0"></mutation>
  585. </block>
  586. <block type="lists_create_with"></block>
  587. <block type="lists_repeat">
  588. <value name="NUM">
  589. <shadow type="math_number">
  590. <field name="NUM">5</field>
  591. </shadow>
  592. </value>
  593. </block>
  594. <block type="lists_length"></block>
  595. <block type="lists_isEmpty"></block>
  596. <block type="lists_indexOf">
  597. <value name="VALUE">
  598. <block type="variables_get">
  599. <field name="VAR">list</field>
  600. </block>
  601. </value>
  602. </block>
  603. <block type="lists_getIndex">
  604. <value name="VALUE">
  605. <block type="variables_get">
  606. <field name="VAR">list</field>
  607. </block>
  608. </value>
  609. </block>
  610. <block type="lists_setIndex">
  611. <value name="LIST">
  612. <block type="variables_get">
  613. <field name="VAR">list</field>
  614. </block>
  615. </value>
  616. </block>
  617. <block type="lists_getSublist">
  618. <value name="LIST">
  619. <block type="variables_get">
  620. <field name="VAR">list</field>
  621. </block>
  622. </value>
  623. </block>
  624. <block type="lists_split">
  625. <value name="DELIM">
  626. <shadow type="text">
  627. <field name="TEXT">,</field>
  628. </shadow>
  629. </value>
  630. </block>
  631. <block type="lists_sort"></block>
  632. </category>
  633. <category name="Colour" colour="20">
  634. <block type="colour_picker"></block>
  635. <block type="colour_random"></block>
  636. <block type="colour_rgb">
  637. <value name="RED">
  638. <shadow type="math_number">
  639. <field name="NUM">100</field>
  640. </shadow>
  641. </value>
  642. <value name="GREEN">
  643. <shadow type="math_number">
  644. <field name="NUM">50</field>
  645. </shadow>
  646. </value>
  647. <value name="BLUE">
  648. <shadow type="math_number">
  649. <field name="NUM">0</field>
  650. </shadow>
  651. </value>
  652. </block>
  653. <block type="colour_blend">
  654. <value name="COLOUR1">
  655. <shadow type="colour_picker">
  656. <field name="COLOUR">#ff0000</field>
  657. </shadow>
  658. </value>
  659. <value name="COLOUR2">
  660. <shadow type="colour_picker">
  661. <field name="COLOUR">#3333ff</field>
  662. </shadow>
  663. </value>
  664. <value name="RATIO">
  665. <shadow type="math_number">
  666. <field name="NUM">0.5</field>
  667. </shadow>
  668. </value>
  669. </block>
  670. </category>
  671. <sep></sep>
  672. <category name="Variables" colour="330" custom="VARIABLE"></category>
  673. <category name="Functions" colour="290" custom="PROCEDURE"></category>
  674. </xml>
  675. </body>
  676. </html>