From c289b629c557e8d2c7a00b5304f2fac1526665ca Mon Sep 17 00:00:00 2001 From: Rachel Fenichel Date: Thu, 7 Apr 2022 17:04:36 -0700 Subject: [PATCH] chore(demos): delete some duplicated demos (#6066) * chore(demos): delete codelab folder * chore(demos): delete custom dialog demo * chore(demos): delete custom fields demos * chore(demos): delete fixed injection demo * chore(demos): delete generator demo * chore(demos): delete interpreter demos * chore(demos): delete max blocks demo * chore(demos): delete graph demo * chore(demos): remove deleted demos from index.html --- demos/codelab/README.md | 16 - demos/codelab/app-complete/index.html | 73 -- demos/codelab/app-complete/scripts/main.js | 77 -- .../app-complete/scripts/music_maker.js | 22 - .../app-complete/scripts/sound_blocks.js | 39 - demos/codelab/app-complete/sounds/c4.m4a | Bin 8833 -> 0 bytes demos/codelab/app-complete/sounds/c5.m4a | Bin 8635 -> 0 bytes demos/codelab/app-complete/sounds/d4.m4a | Bin 8509 -> 0 bytes demos/codelab/app-complete/sounds/e4.m4a | Bin 8454 -> 0 bytes demos/codelab/app-complete/sounds/f4.m4a | Bin 8530 -> 0 bytes demos/codelab/app-complete/sounds/g4.m4a | Bin 8306 -> 0 bytes demos/codelab/app-complete/styles/index.css | 75 -- demos/codelab/app/index.html | 53 -- demos/codelab/app/scripts/main.js | 50 -- demos/codelab/app/scripts/music_maker.js | 22 - demos/codelab/app/sounds/c4.m4a | Bin 8833 -> 0 bytes demos/codelab/app/sounds/c5.m4a | Bin 8635 -> 0 bytes demos/codelab/app/sounds/d4.m4a | Bin 8509 -> 0 bytes demos/codelab/app/sounds/e4.m4a | Bin 8454 -> 0 bytes demos/codelab/app/sounds/f4.m4a | Bin 8530 -> 0 bytes demos/codelab/app/sounds/g4.m4a | Bin 8306 -> 0 bytes demos/codelab/app/styles/index.css | 75 -- demos/custom-dialogs/custom-dialog.js | 161 ---- demos/custom-dialogs/icon.png | Bin 1874 -> 0 bytes demos/custom-dialogs/index.html | 62 -- demos/custom-fields/icon.png | 0 demos/custom-fields/index.html | 54 -- demos/custom-fields/pitch/blocks.js | 18 - demos/custom-fields/pitch/field_pitch.js | 235 ------ demos/custom-fields/pitch/index.html | 118 --- demos/custom-fields/pitch/media/notes.png | Bin 894 -> 0 bytes demos/custom-fields/pitch/pitch.css | 13 - demos/custom-fields/turtle/blocks.js | 91 --- demos/custom-fields/turtle/field_turtle.js | 747 ------------------ demos/custom-fields/turtle/icon.png | Bin 8733 -> 0 bytes demos/custom-fields/turtle/index.html | 173 ---- demos/custom-fields/turtle/media/crown.svg | 1 - demos/custom-fields/turtle/media/fedora.svg | 1 - demos/custom-fields/turtle/media/mask.svg | 1 - .../custom-fields/turtle/media/propeller.svg | 1 - .../custom-fields/turtle/media/stovepipe.svg | 1 - demos/custom-fields/turtle/media/warning.svg | 5 - demos/custom-fields/turtle/turtle.css | 48 -- demos/fixed/icon.png | Bin 1605 -> 0 bytes demos/fixed/index.html | 49 -- demos/generator/icon.png | Bin 2677 -> 0 bytes demos/generator/index.html | 148 ---- demos/graph/icon.png | Bin 1057 -> 0 bytes demos/graph/index.html | 364 --------- demos/index.html | 85 -- demos/interpreter/acorn_interpreter.js | 143 ---- demos/interpreter/async-execution.html | 267 ------- demos/interpreter/icon.png | Bin 1756 -> 0 bytes demos/interpreter/index.html | 11 - demos/interpreter/step-execution.html | 254 ------ demos/interpreter/wait_block.js | 53 -- demos/maxBlocks/icon.png | Bin 1645 -> 0 bytes demos/maxBlocks/index.html | 100 --- 58 files changed, 3706 deletions(-) delete mode 100644 demos/codelab/README.md delete mode 100644 demos/codelab/app-complete/index.html delete mode 100644 demos/codelab/app-complete/scripts/main.js delete mode 100644 demos/codelab/app-complete/scripts/music_maker.js delete mode 100644 demos/codelab/app-complete/scripts/sound_blocks.js delete mode 100644 demos/codelab/app-complete/sounds/c4.m4a delete mode 100644 demos/codelab/app-complete/sounds/c5.m4a delete mode 100644 demos/codelab/app-complete/sounds/d4.m4a delete mode 100644 demos/codelab/app-complete/sounds/e4.m4a delete mode 100644 demos/codelab/app-complete/sounds/f4.m4a delete mode 100644 demos/codelab/app-complete/sounds/g4.m4a delete mode 100644 demos/codelab/app-complete/styles/index.css delete mode 100644 demos/codelab/app/index.html delete mode 100644 demos/codelab/app/scripts/main.js delete mode 100644 demos/codelab/app/scripts/music_maker.js delete mode 100644 demos/codelab/app/sounds/c4.m4a delete mode 100644 demos/codelab/app/sounds/c5.m4a delete mode 100644 demos/codelab/app/sounds/d4.m4a delete mode 100644 demos/codelab/app/sounds/e4.m4a delete mode 100644 demos/codelab/app/sounds/f4.m4a delete mode 100644 demos/codelab/app/sounds/g4.m4a delete mode 100644 demos/codelab/app/styles/index.css delete mode 100644 demos/custom-dialogs/custom-dialog.js delete mode 100644 demos/custom-dialogs/icon.png delete mode 100644 demos/custom-dialogs/index.html delete mode 100644 demos/custom-fields/icon.png delete mode 100644 demos/custom-fields/index.html delete mode 100644 demos/custom-fields/pitch/blocks.js delete mode 100644 demos/custom-fields/pitch/field_pitch.js delete mode 100644 demos/custom-fields/pitch/index.html delete mode 100644 demos/custom-fields/pitch/media/notes.png delete mode 100644 demos/custom-fields/pitch/pitch.css delete mode 100644 demos/custom-fields/turtle/blocks.js delete mode 100644 demos/custom-fields/turtle/field_turtle.js delete mode 100644 demos/custom-fields/turtle/icon.png delete mode 100644 demos/custom-fields/turtle/index.html delete mode 100644 demos/custom-fields/turtle/media/crown.svg delete mode 100644 demos/custom-fields/turtle/media/fedora.svg delete mode 100644 demos/custom-fields/turtle/media/mask.svg delete mode 100644 demos/custom-fields/turtle/media/propeller.svg delete mode 100644 demos/custom-fields/turtle/media/stovepipe.svg delete mode 100644 demos/custom-fields/turtle/media/warning.svg delete mode 100644 demos/custom-fields/turtle/turtle.css delete mode 100644 demos/fixed/icon.png delete mode 100644 demos/fixed/index.html delete mode 100644 demos/generator/icon.png delete mode 100644 demos/generator/index.html delete mode 100644 demos/graph/icon.png delete mode 100644 demos/graph/index.html delete mode 100644 demos/interpreter/acorn_interpreter.js delete mode 100644 demos/interpreter/async-execution.html delete mode 100644 demos/interpreter/icon.png delete mode 100644 demos/interpreter/index.html delete mode 100644 demos/interpreter/step-execution.html delete mode 100644 demos/interpreter/wait_block.js delete mode 100644 demos/maxBlocks/icon.png delete mode 100644 demos/maxBlocks/index.html diff --git a/demos/codelab/README.md b/demos/codelab/README.md deleted file mode 100644 index 2a5e91315..000000000 --- a/demos/codelab/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# Blockly for the Web codelab - -Code for the [Blockly for the Web codelab](https://developers.google.com/TODO). - -In this codelab, you'll learn how to use Blockly JavaScript library -to add a block code editor to a web application. - -## What you'll learn - -* How to add Blockly to a sample web app. -* How to set up a Blockly workspace. -* How to create a new block in Blockly. -* How to generate and run JavaScript code from blocks. - -Example code for each step of the codelab is available from -the [completed](completed/) directory. diff --git a/demos/codelab/app-complete/index.html b/demos/codelab/app-complete/index.html deleted file mode 100644 index d5780e19d..000000000 --- a/demos/codelab/app-complete/index.html +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - - - Blockly for the Web Codelab - - - - - - -
-

Music Maker

-

Music Maker Configuration

-
- -
- - - -

Tap any button to edit its code.
When complete, press Done.

- -
-
-
1
-
2
-
3
-
-
-
4
-
5
-
6
-
-
-
7
-
8
-
9
-
-
- -
-
- -
-
- - - - - - - - - - - - diff --git a/demos/codelab/app-complete/scripts/main.js b/demos/codelab/app-complete/scripts/main.js deleted file mode 100644 index d5ebe0b3c..000000000 --- a/demos/codelab/app-complete/scripts/main.js +++ /dev/null @@ -1,77 +0,0 @@ -/** - * @license - * Copyright 2017 Google LLC - * SPDX-License-Identifier: Apache-2.0 - */ - (function() { - - let currentButton; - - function handlePlay(event) { - loadWorkspace(event.target); - Blockly.JavaScript.addReservedWords('code'); - var code = Blockly.JavaScript.workspaceToCode(Blockly.getMainWorkspace()); - code += 'MusicMaker.play();'; - // Eval can be dangerous. For more controlled execution, check - // https://github.com/NeilFraser/JS-Interpreter. - try { - eval(code); - } catch (error) { - console.log(error); - } - } - - function loadWorkspace(button) { - let workspace = Blockly.getMainWorkspace(); - workspace.clear(); - if (button.blocklyXml) { - Blockly.Xml.domToWorkspace(button.blocklyXml, workspace); - } - } - - function save(button) { - let xml = Blockly.Xml.workspaceToDom(Blockly.getMainWorkspace()); - button.blocklyXml = xml; - } - - function handleSave() { - document.body.setAttribute('mode', 'edit'); - save(currentButton); - } - - function enableEditMode() { - document.body.setAttribute('mode', 'edit'); - document.querySelectorAll('.button').forEach(btn => { - btn.removeEventListener('click', handlePlay); - btn.addEventListener('click', enableBlocklyMode); - }); - } - - function enableMakerMode() { - document.body.setAttribute('mode', 'maker'); - document.querySelectorAll('.button').forEach(btn => { - btn.addEventListener('click', handlePlay); - btn.removeEventListener('click', enableBlocklyMode); - }); - } - - function enableBlocklyMode(e) { - document.body.setAttribute('mode', 'blockly'); - currentButton = e.target; - loadWorkspace(currentButton); - } - - document.querySelector('#edit').addEventListener('click', enableEditMode); - document.querySelector('#done').addEventListener('click', enableMakerMode); - document.querySelector('#save').addEventListener('click', handleSave); - - enableMakerMode(); - - Blockly.inject('blockly-div', { - media: '../../../media/', - toolbox: document.getElementById('toolbox'), - toolboxPosition: 'end', - horizontalLayout: true, - scrollbars: false - }); -})(); diff --git a/demos/codelab/app-complete/scripts/music_maker.js b/demos/codelab/app-complete/scripts/music_maker.js deleted file mode 100644 index adfefeddc..000000000 --- a/demos/codelab/app-complete/scripts/music_maker.js +++ /dev/null @@ -1,22 +0,0 @@ -/** - * @license - * Copyright 2017 Google LLC - * SPDX-License-Identifier: Apache-2.0 - */ - const MusicMaker = { - queue_: [], - player_: new Audio(), - queueSound: function(soundUrl) { - this.queue_.push(soundUrl); - }, - play: function() { - let next = this.queue_.shift(); - if (next) { - this.player_.src = next; - this.player_.play(); - } - }, -}; - -MusicMaker.player_.addEventListener( - 'ended', MusicMaker.play.bind(MusicMaker)); diff --git a/demos/codelab/app-complete/scripts/sound_blocks.js b/demos/codelab/app-complete/scripts/sound_blocks.js deleted file mode 100644 index b8b851819..000000000 --- a/demos/codelab/app-complete/scripts/sound_blocks.js +++ /dev/null @@ -1,39 +0,0 @@ -/** - * @license - * Copyright 2017 Google LLC - * SPDX-License-Identifier: Apache-2.0 - */ - -Blockly.defineBlocksWithJsonArray([ - // Block for colour picker. - { - "type": "play_sound", - "message0": "Play %1", - "args0": [ - { - "type": "field_dropdown", - "name": "VALUE", - "options": [ - ["C4", "sounds/c4.m4a"], - ["D4", "sounds/d4.m4a"], - ["E4", "sounds/e4.m4a"], - ["F4", "sounds/f4.m4a"], - ["G4", "sounds/g4.m4a"], - ["A5", "sounds/a5.m4a"], - ["B5", "sounds/b5.m4a"], - ["C5", "sounds/c5.m4a"] - ] - } - ], - "previousStatement": null, - "nextStatement": null, - "colour": 355, - "tooltip": "", - "helpUrl": "" - } -]); - -Blockly.JavaScript['play_sound'] = function(block) { - var value = '\'' + block.getFieldValue('VALUE') + '\''; - return 'MusicMaker.queueSound(' + value + ');\n'; -}; diff --git a/demos/codelab/app-complete/sounds/c4.m4a b/demos/codelab/app-complete/sounds/c4.m4a deleted file mode 100644 index 33941cfae1550c1971a1713664e5f41cbd74531c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8833 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 C(LC1x diff --git a/demos/codelab/app-complete/sounds/c5.m4a b/demos/codelab/app-complete/sounds/c5.m4a deleted file mode 100644 index 49721cd31dfcb6154563e05a4ddfb4c3c7c03fa3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8635 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

xg=QnTcLx$HKyyHsf>6T3T9C?@=D(8NpNtf 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 J68=Ax{|DjmhLr#S diff --git a/demos/codelab/app-complete/sounds/e4.m4a b/demos/codelab/app-complete/sounds/e4.m4a deleted file mode 100644 index d910052ef9fe9dbededf8bb949e813d2491c608e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8454 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⪚9^ zJv{zq0qon$G6R_a1)>6qx4bm~x%K}O_g6OpalU_J?tXwgAWQ%y0Ga^Q0_Xrx3?Lss z6@XjcZMYRc+dt?A^sT=gz}tWD4$!ypJpe`lbOGoEFb-fEzyN?T0CNB){;?MTy$awq z{S<&%080RF(@z5M0RVCLu)H0cTe)ouJAf-B!owWUXO32XHDH2Z|8uMXe*E{i-$wqG zeme(u55Vf+00hufj#lP>8DZ({$Z784;$X#T_XO!=b=#{DCv!*O9|a)Ltw&o`Lkcj% ofIk=9mU>$Y5H0sVa%TwhbN}Pv=l}1h+Y}-~Lel^3`2RHi3zKjz?*IS* diff --git a/demos/codelab/app-complete/sounds/f4.m4a b/demos/codelab/app-complete/sounds/f4.m4a deleted file mode 100644 index c80a0bfd3b28a1cfe18f5eaab27a7829b78b48c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8530 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 BFa`hs diff --git a/demos/codelab/app-complete/sounds/g4.m4a b/demos/codelab/app-complete/sounds/g4.m4a deleted file mode 100644 index 45ea4483021bdee6827f4f2cdaea22e5983979d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8306 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 BLdyUE diff --git a/demos/codelab/app-complete/styles/index.css b/demos/codelab/app-complete/styles/index.css deleted file mode 100644 index 0ef8f3bfc..000000000 --- a/demos/codelab/app-complete/styles/index.css +++ /dev/null @@ -1,75 +0,0 @@ -main { - width: 400px; - position: relative; - margin: 0 auto; - overflow:hidden; - height: 600px; -} - -header { - background-color: green; - width: 100%; -} - -h1 { - width: 400px; - position: relative; - margin: 0 auto; - color: #fff; - font-size: 1.8em; - line-height: 2.4em; -} - -.mode-edit, -.mode-maker, -.mode-blockly { - display: none; -} - -[mode="maker"] .mode-maker, -[mode="edit"] .mode-edit, -[mode="blockly"] .mode-blockly { - display: block; -} - -.blockly-editor { - position: absolute; - top: 64px; - left: -400px; - transition: left .4s; - height: 460px; - width: 400px; - background-color: #eee; -} - -[mode="blockly"] .blockly-editor { - left: 0; -} - -.maker { - display: flex; - flex-flow: column; - justify-content: space-between; - height: 460px; - width: 400px; -} - -.maker > div { - display: flex; - justify-content: space-between; -} - -.button { - width: 120px; - height: 140px; - color: #fff; - font-size: 3em; - text-align: center; - vertical-align: middle; - line-height: 140px; -} - -.mdl-button { - margin: 1em 0; - float: right; -} diff --git a/demos/codelab/app/index.html b/demos/codelab/app/index.html deleted file mode 100644 index 31eeff776..000000000 --- a/demos/codelab/app/index.html +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - - Blockly for the Web Codelab - - - - - - -

-

Music Maker

-

Music Maker Configuration

-
- -
- - - -

Tap any button to edit its code.
When complete, press Done.

- -
-
-
1
-
2
-
3
-
-
-
4
-
5
-
6
-
-
-
7
-
8
-
9
-
-
- -
-
-
-
- - - - - - diff --git a/demos/codelab/app/scripts/main.js b/demos/codelab/app/scripts/main.js deleted file mode 100644 index 9eef2f96a..000000000 --- a/demos/codelab/app/scripts/main.js +++ /dev/null @@ -1,50 +0,0 @@ -/** - * @license - * Copyright 2017 Google LLC - * SPDX-License-Identifier: Apache-2.0 - */ - (function() { - - let currentButton; - - function handlePlay(event) { - // Add code for playing sound. - } - - function save(button) { - // Add code for saving the behavior of a button. - } - - function handleSave() { - document.body.setAttribute('mode', 'edit'); - save(currentButton); - } - - function enableEditMode() { - document.body.setAttribute('mode', 'edit'); - document.querySelectorAll('.button').forEach(btn => { - btn.removeEventListener('click', handlePlay); - btn.addEventListener('click', enableBlocklyMode); - }); - } - - function enableMakerMode() { - document.body.setAttribute('mode', 'maker'); - document.querySelectorAll('.button').forEach(btn => { - btn.addEventListener('click', handlePlay); - btn.removeEventListener('click', enableBlocklyMode); - }); - } - - function enableBlocklyMode(e) { - document.body.setAttribute('mode', 'blockly'); - currentButton = e.target; - } - - document.querySelector('#edit').addEventListener('click', enableEditMode); - document.querySelector('#done').addEventListener('click', enableMakerMode); - document.querySelector('#save').addEventListener('click', handleSave); - - enableMakerMode(); - -})(); diff --git a/demos/codelab/app/scripts/music_maker.js b/demos/codelab/app/scripts/music_maker.js deleted file mode 100644 index adfefeddc..000000000 --- a/demos/codelab/app/scripts/music_maker.js +++ /dev/null @@ -1,22 +0,0 @@ -/** - * @license - * Copyright 2017 Google LLC - * SPDX-License-Identifier: Apache-2.0 - */ - const MusicMaker = { - queue_: [], - player_: new Audio(), - queueSound: function(soundUrl) { - this.queue_.push(soundUrl); - }, - play: function() { - let next = this.queue_.shift(); - if (next) { - this.player_.src = next; - this.player_.play(); - } - }, -}; - -MusicMaker.player_.addEventListener( - 'ended', MusicMaker.play.bind(MusicMaker)); diff --git a/demos/codelab/app/sounds/c4.m4a b/demos/codelab/app/sounds/c4.m4a deleted file mode 100644 index 33941cfae1550c1971a1713664e5f41cbd74531c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8833 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 C(LC1x diff --git a/demos/codelab/app/sounds/c5.m4a b/demos/codelab/app/sounds/c5.m4a deleted file mode 100644 index 49721cd31dfcb6154563e05a4ddfb4c3c7c03fa3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8635 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

xg=QnTcLx$HKyyHsf>6T3T9C?@=D(8NpNtf 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 J68=Ax{|DjmhLr#S diff --git a/demos/codelab/app/sounds/e4.m4a b/demos/codelab/app/sounds/e4.m4a deleted file mode 100644 index d910052ef9fe9dbededf8bb949e813d2491c608e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8454 zcmbt)bzD@>yZ_Ry3oNjtu+rTn;L_ca(kvw%OM`TGi=cE!cL+##N~5$$NC*fjDBgp7 zKKFZn_jUjKJ-hFHo_S{GOuc8$oH+{ufvBuKd|XudC22u`+-gS`eqK9wXGb82?PZ6s z0)eQ(jtFxPI$AWiEft;Gt`yeRFDcwvsbK20tE+f1-#^KfRA7hOgD$CbQ+l!lDR-L4Sz`u0cKS4#!b^%4YPJeXS7igs zRiM&yj8f!9*!vPwIv>=dCX_rInCWdaN+rlCP2&~RZAkP-`&QvFg~I;m zedFhPdh8V;Bv+8%>%wL_#bMpDdqYV3TiN$WLQ40g zMuTjj3Af;2%;lWx8crn#XW9;e_lr0zVY&b|Gh8uB1^2x<=)F9?*QBm=?=ws;V=aog8G-80A` zgBm>CyJs%v)7Xm*GGQLTqT^;O3*j@dbL#%2bZ*BoI3Y6|Ef){!1RH zci)Wy@zI7LAPBq^GR%bodT%F0A-Q2b0a7puX zBj^h#uJq>CK@L%8%4|{o{5vuNDWw7m@5gDS=rV<;{uz#rMh_ib{Gd2nIRZ}~M9Xl^{CvpVF2#tPT7G&9QeNo^xImCpk zWC;f;9XiM62dvTBdd@ULeG_P>PTt?ExZ=e!#IM*oMYqiO!nm0e8NjPoMfIw>fkYGW z{hMn_41-t^P=Z9%;_}xjg=qcR9bsU zFym>lO=Abq(t^;toA39#0KJ);Cu{DyWECQdgFTJO=DjN}w%Dr^bD2=`%0%M>(rCls zTjONpdr8P|WV1^hmc}9?j|`5MkO;?j|C87ds~P2}g$=!+p$T7n`{PSK&C3fr%rETg zQ`bl(zJ*SgffSYR&L1L`%B7xhFe0~^8saKsHA}5vkGqnmN-+vio?BgcUVnyv<>=%K z_o0eKcqT-HpL%!h6xxZecB$*E!j-f!@qpO~e0u)Uz$Cu&521{Ytj%=nmflPCEpzSL{Je<$@!CO>gHIXhcK!CT=BHUoszO4Fu*@N-3WS)#45evI zgy*3d!A~8ja$Hs;Ny*pJSD2umktgktEZpxw5PiJ&aF4)11B;oh?JQhslGj|E(i#P% zFDV<(37;i3WN$GQyL~YI5PKn0xL`~dQT>i49aitCK5HySjDHSaYeagculTN$A9-?w zu|OR0%ZC)Oqe6xs6Lte+2nU#(qHp9t56h831qUyDo#-;6mU(MKwy0J)2RT8LIeus8 zG6J@G%kS6ra8z>jbtXf!TWb(T*nvrKR?3Y(v6;~%UGIhXXAb)-vYiVLt^|e@D)zdH zJfiJCD=LB|*s8Xa!kmhNAB@V~3O@5a4RIpoBr&B_7;oarn_T&UQ~YN1s^kkp*}y?} z2T@#?fC5`mI<(SB!)QRGtpb;ot}UThg=LcfJ1dr1K7c8S5G0AXV?}s!Bmy+8AxJKQ z6B4GGG)*fBCYN{4ovkV4@+vRs%*wrt7##}~Mwr;$qFSj|VF zsfS#Rq<&m^^&l869{BHKmJZN4tyX~@0t*`jm=a@+_>R=8a$4{>?<;QN;W=6Ia%V4F zWR>R?s~*DHdNnPwE0;{-ff+=Rm{32D-=Dqyf&UGW_fbOro_fP~0;1BVEjK$QIR}q* ze?Oo#kKx>w=sW%~;;V1X?=e{ypn)KePvEqeF3};=P6@5PbFA+={>)BDYm4I~LAD{J+{mH1PpnsVT)IUWZ z5l12tFM|dSUWQzBZ3W=)+O(*(3m9|TScyV}|i5DoUtL$KzHew7l&2w@c zDBvr3h9usHcsmm77Nq>n0 zF2@F;cE>c{F}%1^+MIR?;mJZwpk;}Q4WAMb<9nyhSw-LBgX~KX>Y;p0`@Hf=t=%x6 z_a=k70~h~UoYia*W9}0WE>Rm-5`r{w)S$HwZ19N-K{oo!(Na94oQxDBsQz){0}vVO zNV?l|nG)3U4b^Uw;Lbdk9)8oFFH&6YX764#BBpH45 zZ8qAfT}{BNqFq04r!4QvuYhyYec{MXu1pN=+(wQN$sZ8}HFi^X?W2%={`0WF*6zAC z?wnEdb)kOjkNdASG?i2(==E`pQuwx?vn2^WHCt0GnB-a-l^C^DjoR5tR+P+J_O>%Qr|QiWG{O^uzbrma^P;M@&#-U8cMiVbDu}a+6E`7672NR9 zt?=5~E$ay^UL_#A)- zN%!;+g_?F>XGZs~S@Ca;SluKS{vIYB!{SMKeSf*{;GfdiWh%u=*-_g!0uR~69uHP& z2(kM_M+CcKqz?anA@n-l6%(w>vx+KqOt6XCn^Cwl+UAwChjSsYhicrtQ98RY*@t2sFg*N7AkZu+qi}Zobi-6Wj?@J*l!toiA6selw zWkZ?f^^F9qz)-Q7_T6AQ_FSMwHTp!slGKV(RMA1JeZv4*b<9Y zh`v2BEF(A@wU33v`rbc;>eAn8t7fBfT1q;@6Z$)x#8zdWP00<^q4QCLi%QZAJcA(uMgt zU6-lPb^e{x7v?YcQ~O#wpyFo?%V;Y{yc=|w%kK(`%4t9Lv|VIM?tg!Brkspd9WB-i ziLGm@*s4dDghjxU|JiYcH-=inhYc{zEOxG^)YT*J;f0@anP@7}dU_p>Jkol*?YJQG z^ND4NL~wN;3dNB=2t=c4iv0u@XRtqBLYh7uqC65U<8K~GK5=Z7#uNHd-r^zZsd}0~ z}~-=%UEy?)EiP>~s!#QXD=qDHQoxQ!0vsW14$J`1I#* z4d=rBlLie>D6!E(V_`xb!*ZFy6i+E3jtXO;^9*qICkBd9xn-v#?~~)r?$#b;H5M>| zZ^t2rl&QVTvG*$4k>P6>=MI9KqsAlC&J#ZzI?+#J@M|J@-sVs#)P8T@OjJZ>j@eW+ z&fMKY9o@`Wq-8q6wJc$11}8hA@Z$23-L6v zFMKJVQgwe~OoP%#B2du7S=_9Gq|mISdv`Om>5VqF7DN^fXukH!k=DoRtICx7dH!;H zb1lD7PDr3QRcjtshOEYy*WZ1pB4sX%U<*B^0;U48OWp!Lou$A?92R0h2MxA#IoL z_^6p-2EK-8H$(w4o|6rYGAp&X=6I#Xn)s-!H3U1il!M}w$3!_ceaRjlMl&z$ea_sD zBg+{iGs)hpf&)3AWg0bsxh6BqGZ?SO zI&yACH_C@_(lsX65c|(H3RQy+7D$T2ts1;tjG9b;y*5M6W0u@!S0_G*@5goI7AN@3 z=g+Po-n#vtYgYVyGqa5e;C2=U-SF4&tK5EIz5IrcGJ&a#*jT`Zle0l1SWNOI8ro9j zEJq|d#fb$`$q|8=R==k#YR?#PU~lhWwx8&qdw5R5w6PYCsN1yBg?!7t>I-nMkSY2} zee~>ab~+Znc~nrrEr-gW5YlnCoj`Uenup|NDe=&95AYr4in0x7FJumMi(sy(WNw|c z+fHtbrkJYZs<7$aGaNd0h3MaNLvp-Cr;3)m5j|s-pevGWU^@#S5A9kxZM+XVt%Gw8os~5z%jdiX)p474_wY zi$yyX441npl0Fb>VYZ}iOG+DuE`?FaRCORNFJ019!;*!<_NFv`M4?c~3G-E)(r-zZ zGy0o)rMz8u36CO!pke7#d!u1O|4;rJd{iE(`;*va+n~1EeEy!IKWG)pg@jmT%H>8P zh?sX_Cd{Z6v1Kb_)`^MlxTfp0$EWFKQQq0f+{jC zA2~p^krF3j9@2rGvoN($qrII#Hzd$ON30nzRAVsc{+zE+gIXb6hyB;&rm!KW&RS`H za=y{?r(}|c^9`d=tkm6-mQZ!it_Qi7LbbNaZ_>A#VFCsOFdiA%iR&Jg{a9B1GNu&e z5ZUJ92oL(`^gZ>V@a0(8@u{C25k}9#Ovq^vzHY$`r@*UstX1+JKg%h=$AkA?CCI?5 z?%ISL#IQtwRq}?gma5kl*;DrWB8`;_$%5&x?@h*4$bG)yeO-Te-!7?2$Yv+CjipS3 zUlQ?ycQlJa7hK0ZvahLB(2r!h$rmjf8$-ux(>H_J(*1ax1(nQ5Lu{$+iiJt53hXz- zHYaI?*LSqf$TyqB!YL+Q(EOsP=}>I-j%cyl||UIy59AQ z(&5WMez)A$Hl1fv`hJK4dXM4#^>&IY!@({k9r`0kpW0mSPQ|R)@eAu~MuJ$ZunJxV zY56dUI`XW1>>Mr;jf>K)9f5gm3%xL1b)$XnMMO-0noYq*o!Q@K&ijA<`~iW`!&ehz zctXa!)I87jJe)2LJ*FW9qDX2&tU?h^@99q_#*K)|FjoaW1_8}c_JU%P1Hy4(w5BIg z9^&<01x62g2yr6tkK;M28ysb+gakS zGdgrEG%S_S@}-Oin{Kg$+N7rz%8wa1gA|wxIFFW_t@-VZmH6}{Zt{S0Z#w+jR&|5W zbKm0*XcD5+w)Cv2ZfhwL2hSQSpifG_*sAMwwZ1G83Wja1Vy&r_l-leNC-UJ^)h)9r z)^S05d20*)V%SHcj!KwTViSx&BI<+$BMe5!SsU zy!X48ok{EM%ST;w_>JoxxRRGDfmX@My_=-!LVlLak}vo_jg=VkreUF#QlAiwt3fA2 zH1V78d%8Elq3yw8R-`;{m6G}R^VAh9j|?)7oQQJ+q=K547FQiLzfzi)&wJ%(9pk zW~5-84|pjFFE(Q(N?X=dti>js3soCRH^jsX;0)G~B_x8wcZr{(#S2*aYY565e(npv zi%wIkA^T*KN%5O@iLqzPZJuST}3Crr@?arJNy*G&3p5OctZ&vCC4Ivgy%ah4UsUI_rqJbd%4oCVq>X zQCBZ*3(Lx7Gi)Hzn4?zdI5zFofa0ArA)jb>3P@{VdqRouYt=(vd2AOQd%uUomJo0o zD)P50mwr0llGN{(7<_fZ!d9|vRN+vcRdmu|olOGUPaw&)sd*v1PD7&P9FF$5SQA;U7@<_?7BFfxq4-ARB=I!^d*iY+WL#0^C@H6- z?jGl^QDs#;;TPGZp%26m|NYW-ao_FXIHMMO!Ug7XBehq;PYLW$Wb;`VLkuc{d13Vj zWQRXrX!_^6Ukp!je=|wF7!lPfhmSqh^?G7%5PAPeo}XckP`u-4d`F=EjQ^toV>8u| zt@MUgHoh)wotKnZ6x()`R*bsMOxW)|o)YeE*qs+}*?X5Pql`;tdQeo1r@m^H;PM8c z+@28z0Jqru?kILCXcFn?Z&T9y%yJb=`$v-@bs;FokVT!7mrrV7_(E(pXr_GE@0Y(Rgnj#xH3Y0j@&1U?HngfTMF4wPvaYA>;;jB9&3!>SkqHWTc*qob* z9`FH$(+3esX2c9hto0i6q-f!NU?$>6J#%vW%yKCTl9KJep;o$-eja4J=|oo-QMK`0 z&<_wZ+b8V}vEyzd_ehQCu@ChQc8Jmrm>4ZfO=iSD5FV<`WbVDWjIpwDt8l=+d%|aj z6nEj6hty76@Pc{XygdIhYq+&fZ;Y%i9)l#oZuFK{Ru}1)5m72I?q88}Oz}SL;tQM$ z3(X5dkK$YRqexR+YQ9NV^Y~`3tQ#}amf`TN9rPLwJ~urE7e)_ZW<+h9h|C%#;dBSv z3N?484AO{bz&C~+zOsTO2vm8`Thcy5IY^J7Rhyu1@jKkbbo9*zkBQU89+8&YaNkq@ zlyOce>Tfp-YA5o` zB@^JJ;2$mM=NT+}8TP^MEW<{%N1zd?%5{a;L23#nmj&@Gg zfB|-Qyu0viLO|#dcYZ2_o7HXnt=v`_AL-^mduOBAyL(tT0Je?0hx^~ozVn0hfEU%b zmA#e!G!qpBzIEIV10Z}>?g;l=11%^h2nJ|$KttdpASjUM+h1S+9#kSQCZJG⪚9^ zJv{zq0qon$G6R_a1)>6qx4bm~x%K}O_g6OpalU_J?tXwgAWQ%y0Ga^Q0_Xrx3?Lss z6@XjcZMYRc+dt?A^sT=gz}tWD4$!ypJpe`lbOGoEFb-fEzyN?T0CNB){;?MTy$awq z{S<&%080RF(@z5M0RVCLu)H0cTe)ouJAf-B!owWUXO32XHDH2Z|8uMXe*E{i-$wqG zeme(u55Vf+00hufj#lP>8DZ({$Z784;$X#T_XO!=b=#{DCv!*O9|a)Ltw&o`Lkcj% ofIk=9mU>$Y5H0sVa%TwhbN}Pv=l}1h+Y}-~Lel^3`2RHi3zKjz?*IS* diff --git a/demos/codelab/app/sounds/f4.m4a b/demos/codelab/app/sounds/f4.m4a deleted file mode 100644 index c80a0bfd3b28a1cfe18f5eaab27a7829b78b48c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8530 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 BFa`hs diff --git a/demos/codelab/app/sounds/g4.m4a b/demos/codelab/app/sounds/g4.m4a deleted file mode 100644 index 45ea4483021bdee6827f4f2cdaea22e5983979d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8306 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 BLdyUE diff --git a/demos/codelab/app/styles/index.css b/demos/codelab/app/styles/index.css deleted file mode 100644 index 0ef8f3bfc..000000000 --- a/demos/codelab/app/styles/index.css +++ /dev/null @@ -1,75 +0,0 @@ -main { - width: 400px; - position: relative; - margin: 0 auto; - overflow:hidden; - height: 600px; -} - -header { - background-color: green; - width: 100%; -} - -h1 { - width: 400px; - position: relative; - margin: 0 auto; - color: #fff; - font-size: 1.8em; - line-height: 2.4em; -} - -.mode-edit, -.mode-maker, -.mode-blockly { - display: none; -} - -[mode="maker"] .mode-maker, -[mode="edit"] .mode-edit, -[mode="blockly"] .mode-blockly { - display: block; -} - -.blockly-editor { - position: absolute; - top: 64px; - left: -400px; - transition: left .4s; - height: 460px; - width: 400px; - background-color: #eee; -} - -[mode="blockly"] .blockly-editor { - left: 0; -} - -.maker { - display: flex; - flex-flow: column; - justify-content: space-between; - height: 460px; - width: 400px; -} - -.maker > div { - display: flex; - justify-content: space-between; -} - -.button { - width: 120px; - height: 140px; - color: #fff; - font-size: 3em; - text-align: center; - vertical-align: middle; - line-height: 140px; -} - -.mdl-button { - margin: 1em 0; - float: right; -} diff --git a/demos/custom-dialogs/custom-dialog.js b/demos/custom-dialogs/custom-dialog.js deleted file mode 100644 index 04793e3da..000000000 --- a/demos/custom-dialogs/custom-dialog.js +++ /dev/null @@ -1,161 +0,0 @@ -/** - * @license - * Copyright 2016 Google LLC - * SPDX-License-Identifier: Apache-2.0 - */ - -/** - * An example implementation of how one might replace Blockly's browser - * dialogs. This is just an example, and applications are not encouraged to use - * it verbatim. - * - * @namespace - */ -CustomDialog = {}; - -/** Override Blockly.dialog.alert() with custom implementation. */ -Blockly.dialog.setAlert(function(message, callback) { - console.log('Alert: ' + message); - CustomDialog.show('Alert', message, { - onCancel: callback - }); -}); - -/** Override Blockly.dialog.confirm() with custom implementation. */ -Blockly.dialog.setConfirm(function(message, callback) { - console.log('Confirm: ' + message); - CustomDialog.show('Confirm', message, { - showOkay: true, - onOkay: function() { - callback(true); - }, - showCancel: true, - onCancel: function() { - callback(false); - } - }); -}); - -/** Override Blockly.dialog.prompt() with custom implementation. */ -Blockly.dialog.setPrompt(function(message, defaultValue, callback) { - console.log('Prompt: ' + message); - CustomDialog.show('Prompt', message, { - showInput: true, - showOkay: true, - onOkay: function() { - callback(CustomDialog.inputField.value); - }, - showCancel: true, - onCancel: function() { - callback(null); - } - }); - CustomDialog.inputField.value = defaultValue; -}); - -/** Hides any currently visible dialog. */ -CustomDialog.hide = function() { - if (CustomDialog.backdropDiv_) { - CustomDialog.backdropDiv_.style.display = 'none'; - CustomDialog.dialogDiv_.style.display = 'none'; - } -}; - -/** - * Shows the dialog. - * Allowed options: - * - showOkay: Whether to show the OK button. - * - showCancel: Whether to show the Cancel button. - * - showInput: Whether to show the text input field. - * - onOkay: Callback to handle the okay button. - * - onCancel: Callback to handle the cancel button and backdrop clicks. - */ -CustomDialog.show = function(title, message, options) { - var backdropDiv = CustomDialog.backdropDiv_; - var dialogDiv = CustomDialog.dialogDiv_; - if (!dialogDiv) { - // Generate HTML - backdropDiv = document.createElement('div'); - backdropDiv.id = 'customDialogBackdrop'; - backdropDiv.style.cssText = - 'position: absolute;' + - 'top: 0; left: 0; right: 0; bottom: 0;' + - 'background-color: rgba(0, 0, 0, .7);' + - 'z-index: 100;'; - document.body.appendChild(backdropDiv); - - dialogDiv = document.createElement('div'); - dialogDiv.id = 'customDialog'; - dialogDiv.style.cssText = - 'background-color: #fff;' + - 'width: 400px;' + - 'margin: 20px auto 0;' + - 'padding: 10px;'; - backdropDiv.appendChild(dialogDiv); - - dialogDiv.onclick = function(event) { - event.stopPropagation(); - }; - - CustomDialog.backdropDiv_ = backdropDiv; - CustomDialog.dialogDiv_ = dialogDiv; - } - backdropDiv.style.display = 'block'; - dialogDiv.style.display = 'block'; - - dialogDiv.innerHTML = - '

' + - '

' + - (options.showInput ? '
' : '') + - '
' + - (options.showCancel ? '': '') + - (options.showOkay ? '': '') + - '
'; - dialogDiv.getElementsByClassName('customDialogTitle')[0] - .appendChild(document.createTextNode(title)); - dialogDiv.getElementsByClassName('customDialogMessage')[0] - .appendChild(document.createTextNode(message)); - - var onOkay = function(event) { - CustomDialog.hide(); - options.onOkay && options.onOkay(); - event && event.stopPropagation(); - }; - var onCancel = function(event) { - CustomDialog.hide(); - options.onCancel && options.onCancel(); - event && event.stopPropagation(); - }; - - var dialogInput = document.getElementById('customDialogInput'); - CustomDialog.inputField = dialogInput; - if (dialogInput) { - dialogInput.focus(); - - dialogInput.onkeyup = function(event) { - if (event.keyCode === 13) { - // Process as OK when user hits enter. - onOkay(); - return false; - } else if (event.keyCode === 27) { - // Process as cancel when user hits esc. - onCancel(); - return false; - } - }; - } else { - var okay = document.getElementById('customDialogOkay'); - okay && okay.focus(); - } - - if (options.showOkay) { - document.getElementById('customDialogOkay') - .addEventListener('click', onOkay); - } - if (options.showCancel) { - document.getElementById('customDialogCancel') - .addEventListener('click', onCancel); - } - - backdropDiv.onclick = onCancel; -}; diff --git a/demos/custom-dialogs/icon.png b/demos/custom-dialogs/icon.png deleted file mode 100644 index ba49746e43f8f8e77adb0dd4526b4898bc6ae861..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1874 zcmV-Y2d(&tP) zYiL|W6o5}&ZJMS@Z&LE8P~=9$B3N)seb5w?R7LPX=$3*%)kF{kQCRJd{!q}ZL@g8_ zi3%0`VN)!EAleNUwLjXL{n6M`Eo{^x8cW#K)}(2YW@WZ#;>l#@?!9yG-P~m7gNx)o z=FUB5&Y5#&PFFA(3fst?f;N9o; z7W-6Zg`7Q64U?C@hiwnvUG6dsgwtQ1gt~@K*!Re+s<}$X_go%7Wt0&hOqNWh4yYA! z>`))v`}m#9?VBSHlj$>W_o=#BB|lwJ4?E(Y!X$Ut5u;a11ElJ0xnI? z!GoJt!J8cmBhC-Dt%bEU70`eFDtwx~zEEcCTdJUW;~O$T$`#UXKWe02oD0)=c;(EE zXtsCrnu1j@zKYd>-B<-*Uz~;)GK-Ah1_~Lg6w+3rZ(8=eGd2q!ou4XL1G5TdDa>L< z#%JN7v_tCAZnw%#%fsHoV|l1qUGB2>1e;Ip*ic<~gt@WK<5vn6q-1s)V0Y^x`O7WD zD8ntx5MTDOMfEc-Ep@k&LxnaCFCbSd7^TU#N*hIkm$YQ%T zxi4O1VDLi>d1UPmO8S@}N=}e(=I`d-LDwS$qL2(;>v!3XSA|#-H%Jfq@j42Ld1#+1 zf!>o4+DL&Oz7@i)BjceRuL_|;5J$FXAr!YRYnZgp+p>w!>9-|_(32AHzz0v(y*L)& zJM85`9n$Q87i5{$O8_wHqs=b-2G+(-(iZ#gZUD%ka(aa4()jK){+%QD`{|DqFACv8 zl9a{=#sGdKcP*&^Cu*kwl_TdxD?B3nJrt%4yeNcs!qvKfChQ$s0boBq-i7WW$OuX$ z%)m#x4qg<(O|~oKKIPCwRG@1Z!1H1Rr;BPpsphAW;zc1tIErkITtgIs=%-aMchQTA z0iT1xX+T-z{E}LV*G!$ek~l^zq8sTE&gIDcfFGW6P)G``K+JFW^D1{kg{>OtLwKJp ziLwUqJ)^`TBZZ$#orbar#XU(y*gIULZIy*|IXpvi3!OZK4={@)k+i>ohP}Esds)j$ zlIz2GU6qIMb~8e|vP@c}N21WI#A0+Zb%?q`4F2(*7#d1|QAorv3W*p-ArZqUBw`qa zL=2;lh+z~GF-obBxMGRI52|I5rKo%f1Y;q~1X)_IDk{j}`cs%2S8f?zMivs<(us`= za2Xd1fQBOIC?t)$dHmo70G4FqO6B97tf@z`8k-7m)Vp2nrO<7JEdHG=r8PRaELm}z zMV8Fz=95>2IMrHZUAV++_J48`|3Gi zn^l*7Y=`Y0c3}G*q~b)}vrphVbEHpAl1h}&@oFJ%u3IiFL`BNwXmqj=r$RqkF-a|) zzgJfA;|mRSBnmuF}`q9W)##8%v& zDRq=}1ppdcHavvc`qls@^qqo*rLmNh<_dmXSsME(&PhiU=SL-d8p3mazLm*V@#~m! zeg=TeK3-T3aI4jET}-yW$}XrZWCQ>@%U$A#tQvC=6_M7o*c|}ygO>-M@bPcwRuXoR zwKd&HD}^$44f`3iivX~_%oSphC{kP<){U~Zqij9@&sTQgT+*odV#8t@QKq|eWpfY! zzGJ^uZiMTb^(f1Oei~wv{sHzgf*9%<^yoqv9tdi6 - - - - Blockly Demo: Custom Dialog - - - - - - -

Blockly > - Demos > Custom Dialog

- -

This is a simple demo of replacing modal browser dialogs with HTML. - To see how it works, see the source code in - custom-dialog.js -

- -

Try creating new variables, creating variables with names already in - use, or deleting multiple blocks on the workspace. -

- -
- - - - - - - - diff --git a/demos/custom-fields/icon.png b/demos/custom-fields/icon.png deleted file mode 100644 index e69de29bb..000000000 diff --git a/demos/custom-fields/index.html b/demos/custom-fields/index.html deleted file mode 100644 index 9e681a8b6..000000000 --- a/demos/custom-fields/index.html +++ /dev/null @@ -1,54 +0,0 @@ - - - - - Blockly Demo: Custom Fields - - - -

Blockly > - Demos > Custom Fields

- -

These demos are intended for developers who want creating custom block fields.

- - - - - - - - - - - -
- - - - - -
- - - - - -
- - diff --git a/demos/custom-fields/pitch/blocks.js b/demos/custom-fields/pitch/blocks.js deleted file mode 100644 index 75fbae2a7..000000000 --- a/demos/custom-fields/pitch/blocks.js +++ /dev/null @@ -1,18 +0,0 @@ -/** - * @license - * Copyright 2019 Google LLC - * SPDX-License-Identifier: Apache-2.0 - */ - -/** - * @fileoverview Pitch field demo blocks. - */ - -Blockly.Blocks['test_pitch_field'] = { - init: function() { - this.appendDummyInput() - .appendField('pitch') - .appendField(new CustomFields.FieldPitch('7'), 'PITCH'); - this.setStyle('loop_blocks'); - } -}; diff --git a/demos/custom-fields/pitch/field_pitch.js b/demos/custom-fields/pitch/field_pitch.js deleted file mode 100644 index d049be2de..000000000 --- a/demos/custom-fields/pitch/field_pitch.js +++ /dev/null @@ -1,235 +0,0 @@ -/** - * @license - * Copyright 2016 Google LLC - * https://github.com/google/blockly-games - * SPDX-License-Identifier: Apache-2.0 - */ - -/** - * @fileoverview Music pitch input field. Borrowed from Blockly Games. - */ -'use strict'; - -goog.provide('CustomFields.FieldPitch'); - -goog.require('Blockly.FieldTextInput'); -goog.require('Blockly.utils.math'); -goog.require('Blockly.utils.object'); - -var CustomFields = CustomFields || {}; - -/** - * Class for an editable pitch field. - * @param {string} text The initial content of the field. - * @extends {Blockly.FieldTextInput} - * @constructor - */ -CustomFields.FieldPitch = function(text) { - CustomFields.FieldPitch.superClass_.constructor.call(this, text); - - /** - * Click event data. - * @type {?Blockly.browserEvents.Data} - * @private - */ - this.clickWrapper_ = null; - - /** - * Move event data. - * @type {?Blockly.browserEvents.Data} - * @private - */ - this.moveWrapper_ = null; -}; -Blockly.utils.object.inherits(CustomFields.FieldPitch, Blockly.FieldTextInput); - -/** - * Construct a FieldPitch from a JSON arg object. - * @param {!Object} options A JSON object with options (pitch). - * @return {!CustomFields.FieldPitch} The new field instance. - * @package - * @nocollapse - */ -CustomFields.FieldPitch.fromJson = function(options) { - return new CustomFields.FieldPitch(options['pitch']); -}; - -/** - * All notes available for the picker. - */ -CustomFields.FieldPitch.NOTES = 'C3 D3 E3 F3 G3 A3 B3 C4 D4 E4 F4 G4 A4'.split(/ /); - -/** - * Show the inline free-text editor on top of the text and the note picker. - * @protected - */ -CustomFields.FieldPitch.prototype.showEditor_ = function() { - CustomFields.FieldPitch.superClass_.showEditor_.call(this); - - var div = Blockly.WidgetDiv.getDiv(); - if (!div.firstChild) { - // Mobile interface uses Blockly.dialog.prompt. - return; - } - // Build the DOM. - var editor = this.dropdownCreate_(); - Blockly.DropDownDiv.getContentDiv().appendChild(editor); - - Blockly.DropDownDiv.setColour(this.sourceBlock_.style.colourPrimary, - this.sourceBlock_.style.colourTertiary); - - Blockly.DropDownDiv.showPositionedByField( - this, this.dropdownDispose_.bind(this)); - - // The note picker is different from other fields in that it updates on - // mousemove even if it's not in the middle of a drag. In future we may - // change this behaviour. For now, using bindEvent_ instead of - // bindEventWithChecks_ allows it to work without a mousedown/touchstart. - this.clickWrapper_ = - Blockly.browserEvents.bind(this.imageElement_, 'click', this, this.hide_); - this.moveWrapper_ = Blockly.browserEvents.bind( - this.imageElement_, 'mousemove', this, this.onMouseMove); - - this.updateGraph_(); -}; - -/** - * Create the pitch editor. - * @return {!Element} The newly created pitch picker. - * @private - */ -CustomFields.FieldPitch.prototype.dropdownCreate_ = function() { - this.imageElement_ = document.createElement('div'); - this.imageElement_.id = 'notePicker'; - - return this.imageElement_; -}; - -/** - * Dispose of events belonging to the pitch editor. - * @private - */ -CustomFields.FieldPitch.prototype.dropdownDispose_ = function() { - if (this.clickWrapper_) { - Blockly.browserEvents.unbind(this.clickWrapper_); - this.clickWrapper_ = null; - } - if (this.moveWrapper_) { - Blockly.browserEvents.unbind(this.moveWrapper_); - this.moveWrapper_ = null; - } - this.imageElement_ = null; -}; - -/** - * Hide the editor. - * @private - */ -CustomFields.FieldPitch.prototype.hide_ = function() { - Blockly.WidgetDiv.hide(); - Blockly.DropDownDiv.hideWithoutAnimation(); -}; - -/** - * Set the note to match the mouse's position. - * @param {!Event} e Mouse move event. - */ -CustomFields.FieldPitch.prototype.onMouseMove = function(e) { - var bBox = this.imageElement_.getBoundingClientRect(); - var dy = e.clientY - bBox.top; - var note = Blockly.utils.math.clamp(Math.round(13.5 - dy / 7.5), 0, 12); - this.imageElement_.style.backgroundPosition = (-note * 37) + 'px 0'; - this.setEditorValue_(note); -}; - -/** - * Convert the machine-readable value (0-12) to human-readable text (C3-A4). - * @param {number|string} value The provided value. - * @return {string|undefined} The respective note, or undefined if invalid. - */ -CustomFields.FieldPitch.prototype.valueToNote = function(value) { - return CustomFields.FieldPitch.NOTES[Number(value)]; -}; - -/** - * Convert the human-readable text (C3-A4) to machine-readable value (0-12). - * @param {string} text The provided note. - * @return {number|undefined} The respective value, or undefined if invalid. - */ -CustomFields.FieldPitch.prototype.noteToValue = function(text) { - var normalizedText = text.trim().toUpperCase(); - var i = CustomFields.FieldPitch.NOTES.indexOf(normalizedText); - return i > -1 ? i : undefined; -}; - -/** - * Get the text to be displayed on the field node. - * @return {?string} The HTML value if we're editing, otherwise null. Null means - * the super class will handle it, likely a string cast of value. - * @protected - */ -CustomFields.FieldPitch.prototype.getText_ = function() { - if (this.isBeingEdited_) { - return CustomFields.FieldPitch.superClass_.getText_.call(this); - } - return this.valueToNote(this.getValue()) || null; -}; - -/** - * Transform the provided value into a text to show in the HTML input. - * @param {*} value The value stored in this field. - * @return {string} The text to show on the HTML input. - */ -CustomFields.FieldPitch.prototype.getEditorText_ = function(value) { - return this.valueToNote(value); -}; - -/** - * Transform the text received from the HTML input (note) into a value - * to store in this field. - * @param {string} text Text received from the HTML input. - * @return {*} The value to store. - */ -CustomFields.FieldPitch.prototype.getValueFromEditorText_ = function(text) { - return this.noteToValue(text); -}; - -/** - * Updates the graph when the field rerenders. - * @private - * @override - */ -CustomFields.FieldPitch.prototype.render_ = function() { - CustomFields.FieldPitch.superClass_.render_.call(this); - this.updateGraph_(); -}; - -/** - * Redraw the note picker with the current note. - * @private - */ -CustomFields.FieldPitch.prototype.updateGraph_ = function() { - if (!this.imageElement_) { - return; - } - var i = this.getValue(); - this.imageElement_.style.backgroundPosition = (-i * 37) + 'px 0'; -}; - -/** - * Ensure that only a valid value may be entered. - * @param {*} opt_newValue The input value. - * @return {*} A valid value, or null if invalid. - */ -CustomFields.FieldPitch.prototype.doClassValidation_ = function(opt_newValue) { - if (opt_newValue === null || opt_newValue === undefined) { - return null; - } - var note = this.valueToNote(opt_newValue); - if (note) { - return opt_newValue; - } - return null; -}; - -Blockly.fieldRegistry.register('field_pitch', CustomFields.FieldPitch); diff --git a/demos/custom-fields/pitch/index.html b/demos/custom-fields/pitch/index.html deleted file mode 100644 index 2d614f6b0..000000000 --- a/demos/custom-fields/pitch/index.html +++ /dev/null @@ -1,118 +0,0 @@ - - - - - Blockly Demo: Custom Pitch Field - - - - - - - - -

- Blockly > - Demos > - Custom Fields > Pitch Field

- - -

This is a demo of creating custom block fields. In this case the field - is used to select a note pitch. -

- -

All of the custom field implementation is in - demos/custom-fields/pitch/field_pitch.js, including comments on each required - function. -

- -

- - -

- - - - - - -
- - -
-
- - - - - - diff --git a/demos/custom-fields/pitch/media/notes.png b/demos/custom-fields/pitch/media/notes.png deleted file mode 100644 index b9a57b59eca4c7dc8cd55c242dcd7fc60004b370..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 894 zcmeAS@N?(olHy`uVBq!ia0y~yV0;B+=W+lE2Ja)aMnH-w$=lt9;eUJonf*W>XMsm# zF#`j)FbFd;%$g$s6l5>)^mS!_z%9Wg$>uIuwu6CzncvgJF{I+w+nE;)nG;3a@_Wjy z99SMx^z=^D+vXY}CGV^Q)x=jf?xUmYk92{+07BD=kg^@yAvE3C!gW0?Q}AnmhODEBoLZ|Ngz0 zex6|~bN{N)XKu`|cx+bvxp1%l|C%$sZClSYx?j~YUa`0$WUW!NRTr2e>!S=*n%0)c zeBOPgboG^}RJN_msd>j2TdXz?cvipMJ-|KiS(y#j6}~AuW&4?ca_=rK?wIla_AV>` z{u9%f`?J(-n{G9_Z=EdXIJeRL>twme(=rty{ik?dovlKq&b56x@x&(Qf##_@$yF?0 z)23RQ_dies%|F)m+WZ-u;t$X3V>!EM1WYXd$r=F z;1$hNI`0Del$NDciQG95dU>%-*4-~F+M+CMyVjB~S?1itw6kB}iyO4{OOAPZDDRae<|)dDp*_F9wLZ2Dg7eV+G}oBx5%nBv&$u6a^S zZfT=b|0E#$= array.length) { - currentIndex = 0; - } - var value = {}; - value[variable] = array[currentIndex]; - this.setValue(value); - }; - }; - - var widget = document.createElement('div'); - widget.className = 'customFieldsTurtleWidget blocklyNonSelectable'; - - var table = document.createElement('div'); - table.className = 'table'; - widget.appendChild(table); - - var row = createRow(table); - var leftArrow = createLeftArrow(row); - widget.patternText = createTextNode(row, this.displayValue_.pattern); - var rightArrow = createRightArrow(row); - this.editorListeners_.push(Blockly.browserEvents.bind( - leftArrow, 'mouseup', this, - createArrowListener('pattern', CustomFields.FieldTurtle.PATTERNS, -1))); - this.editorListeners_.push(Blockly.browserEvents.bind( - rightArrow, 'mouseup', this, - createArrowListener('pattern', CustomFields.FieldTurtle.PATTERNS, 1))); - - row = createRow(table); - leftArrow = createLeftArrow(row); - widget.hatText = createTextNode(row, this.displayValue_.hat); - rightArrow = createRightArrow(row); - this.editorListeners_.push(Blockly.browserEvents.bind( - leftArrow, 'mouseup', this, - createArrowListener('hat', CustomFields.FieldTurtle.HATS, -1))); - this.editorListeners_.push(Blockly.browserEvents.bind( - rightArrow, 'mouseup', this, - createArrowListener('hat', CustomFields.FieldTurtle.HATS, 1))); - - row = createRow(table); - leftArrow = createLeftArrow(row); - widget.turtleNameText = createTextNode(row, this.displayValue_.turtleName); - rightArrow = createRightArrow(row); - this.editorListeners_.push(Blockly.browserEvents.bind( - leftArrow, 'mouseup', this, - createArrowListener('turtleName', CustomFields.FieldTurtle.NAMES, -1))); - this.editorListeners_.push(Blockly.browserEvents.bind( - rightArrow, 'mouseup', this, - createArrowListener('turtleName', CustomFields.FieldTurtle.NAMES, 1))); - - var randomizeButton = document.createElement('button'); - randomizeButton.className = 'randomize'; - randomizeButton.setAttribute('type', 'button'); - randomizeButton.textContent = 'randomize turtle'; - this.editorListeners_.push( - Blockly.browserEvents.bind(randomizeButton, 'mouseup', this, function() { - var value = {}; - value.pattern = CustomFields.FieldTurtle.PATTERNS[Math.floor( - Math.random() * CustomFields.FieldTurtle.PATTERNS.length)]; - - value.hat = CustomFields.FieldTurtle.HATS[Math.floor( - Math.random() * CustomFields.FieldTurtle.HATS.length)]; - - value.turtleName = CustomFields.FieldTurtle.NAMES[Math.floor( - Math.random() * CustomFields.FieldTurtle.NAMES.length)]; - - this.setValue(value); - })); - widget.appendChild(randomizeButton); - - return widget; -}; - -// Cleans up any event listeners that were attached to the now hidden editor. -CustomFields.FieldTurtle.prototype.dropdownDispose_ = function() { - for (var i = this.editorListeners_.length, listener; - listener = this.editorListeners_[i]; i--) { - Blockly.browserEvents.unbind(listener); - this.editorListeners_.pop(); - } -}; - -// Updates the field's colour based on the colour of the block. Called by -// block.applyColour. -CustomFields.FieldTurtle.prototype.applyColour = function() { - if (!this.sourceBlock_) { - return; - } - // The getColourX functions are the best way to access the colours of a block. - var isShadow = this.sourceBlock_.isShadow(); - var fillColour = isShadow ? - this.sourceBlock_.getColourShadow() : this.sourceBlock_.getColour(); - // This is technically a package function, meaning it could change. - var borderColour = isShadow ? fillColour : - this.sourceBlock_.style.colourTertiary; - - if (this.turtleGroup_) { - var child = this.turtleGroup_.firstChild; - while(child) { - // If it is a text node, continue. - if (child.nodeType === 3) { - child = child.nextSibling; - continue; - } - // Or if it is a non-turtle node, continue. - var className = child.getAttribute('class'); - if (!className || className.indexOf('turtleBody') === -1) { - child = child.nextSibling; - continue; - } - - child.style.fill = fillColour; - child.style.stroke = borderColour; - child = child.nextSibling; - } - } -}; - -// Saves the field's value to an XML node. Allows for custom serialization. -CustomFields.FieldTurtle.prototype.toXml = function(fieldElement) { - // The default implementation of this function creates a node that looks - // like this: (where value is returned by getValue()) - // value - // But this doesn't work for our field because it stores an /object/. - - fieldElement.setAttribute('pattern', this.value_.pattern); - fieldElement.setAttribute('hat', this.value_.hat); - // The textContent usually contains whatever is closest to the field's - // 'value'. The textContent doesn't need to contain anything, but saving - // something to it does aid in readability. - fieldElement.textContent = this.value_.turtleName; - - // Always return the element! - return fieldElement; -}; - -// Sets the field's value based on an XML node. Allows for custom -// de-serialization. -CustomFields.FieldTurtle.prototype.fromXml = function(fieldElement) { - // Because we had to do custom serialization for this field, we also need - // to do custom de-serialization. - - var value = {}; - value.pattern = fieldElement.getAttribute('pattern'); - value.hat = fieldElement.getAttribute('hat'); - value.turtleName = fieldElement.textContent; - // The end goal is to call this.setValue() - this.setValue(value); -}; - -// Blockly needs to know the JSON name of this field. Usually this is -// registered at the bottom of the field class. -Blockly.fieldRegistry.register('field_turtle', CustomFields.FieldTurtle); - -// Called by initView to create all of the SVGs. This is just used to keep -// the code more organized. -CustomFields.FieldTurtle.prototype.createView_ = function() { - this.movableGroup_ = Blockly.utils.dom.createSvgElement('g', - { - 'transform': 'translate(0,5)' - }, this.fieldGroup_); - var scaleGroup = Blockly.utils.dom.createSvgElement('g', - { - 'transform': 'scale(1.5)' - }, this.movableGroup_); - this.turtleGroup_ = Blockly.utils.dom.createSvgElement('g', - { - // Makes the smaller turtle graphic align with the hats. - 'class': 'turtleBody' - }, scaleGroup); - var tail = Blockly.utils.dom.createSvgElement('path', - { - 'class': 'turtleBody', - 'd': 'M7,27.5H0.188c3.959-2,6.547-2.708,8.776-5.237', - 'transform': 'translate(0.312 -12.994)' - }, this.turtleGroup_); - var legLeft = Blockly.utils.dom.createSvgElement('rect', - { - 'class': 'turtleBody', - 'x': 8.812, - 'y': 12.506, - 'width': 4, - 'height': 10 - }, this.turtleGroup_); - var legRight = Blockly.utils.dom.createSvgElement('rect', - { - 'class': 'turtleBody', - 'x': 28.812, - 'y': 12.506, - 'width': 4, - 'height': 10 - }, this.turtleGroup_); - var head = Blockly.utils.dom.createSvgElement('path', - { - 'class': 'turtleBody', - 'd': 'M47.991,17.884c0,1.92-2.144,3.477-4.788,3.477a6.262,6.262,0,0,1-2.212-.392c-0.2-.077-1.995,2.343-4.866,3.112a17.019,17.019,0,0,1-6.01.588c-4.413-.053-2.5-3.412-2.745-3.819-0.147-.242,2.232.144,6.126-0.376a7.392,7.392,0,0,0,4.919-2.588c0-1.92,2.144-3.477,4.788-3.477S47.991,15.964,47.991,17.884Z', - 'transform': 'translate(0.312 -12.994)' - }, this.turtleGroup_); - var smile = Blockly.utils.dom.createSvgElement('path', - { - 'class': 'turtleBody', - 'd': 'M42.223,18.668a3.614,3.614,0,0,0,2.728,2.38', - 'transform': 'translate(0.312 -12.994)' - }, this.turtleGroup_); - var sclera = Blockly.utils.dom.createSvgElement('ellipse', - { - 'cx': 43.435, - 'cy': 2.61, - 'rx': 2.247, - 'ry': 2.61, - 'fill': '#fff' - }, this.turtleGroup_); - var pupil = Blockly.utils.dom.createSvgElement('ellipse', - { - 'cx': 44.166, - 'cy': 3.403, - 'rx': 1.318, - 'ry': 1.62 - }, this.turtleGroup_); - var shell = Blockly.utils.dom.createSvgElement('path', - { - 'class': 'turtleBody', - 'd': 'M33.4,27.5H7.193c0-6,5.866-13.021,13.1-13.021S33.4,21.5,33.4,27.5Z', - 'transform': 'translate(0.312 -12.994)' - }, this.turtleGroup_); - this.shellPattern_ = Blockly.utils.dom.createSvgElement('path', - { - 'd': 'M33.4,27.5H7.193c0-6,5.866-13.021,13.1-13.021S33.4,21.5,33.4,27.5Z', - 'transform': 'translate(0.312 -12.994)' - }, this.turtleGroup_); - - this.stovepipe_ = Blockly.utils.dom.createSvgElement('image', - { - 'width': '50', - 'height': '18' - }, scaleGroup); - this.stovepipe_.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', - 'media/stovepipe.svg'); - this.crown_ = Blockly.utils.dom.createSvgElement('image', - { - 'width': '50', - 'height': '15' - }, scaleGroup); - this.crown_.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', - 'media/crown.svg'); - this.mask_ = Blockly.utils.dom.createSvgElement('image', - { - 'width': '50', - 'height': '24' - }, scaleGroup); - this.mask_.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', - 'media/mask.svg'); - this.propeller_ = Blockly.utils.dom.createSvgElement('image', - { - 'width': '50', - 'height': '11' - }, scaleGroup); - this.propeller_.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', - 'media/propeller.svg'); - this.fedora_ = Blockly.utils.dom.createSvgElement('image', - { - 'width': '50', - 'height': '12' - }, scaleGroup); - this.fedora_.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', - 'media/fedora.svg'); - - // Even if we're not going to display it right away, we want to create all - // of our DOM elements inside this function. - this.crown_.style.display = 'none'; - this.mask_.style.display = 'none'; - this.propeller_.style.display = 'none'; - this.fedora_.style.display = 'none'; - - this.movableGroup_.appendChild(this.textElement_); - this.textElement_.setAttribute( - 'transform', 'translate(' + this.TEXT_OFFSET_X + ',20)'); - - this.defs_ = Blockly.utils.dom.createSvgElement('defs', {}, this.fieldGroup_); - this.polkadotPattern_ = Blockly.utils.dom.createSvgElement('pattern', - { - 'id': 'polkadots', - 'patternUnits': 'userSpaceOnUse', - 'width': 10, - 'height': 10 - }, this.defs_); - this.polkadotGroup_ = Blockly.utils.dom.createSvgElement( - 'g', {}, this.polkadotPattern_); - Blockly.utils.dom.createSvgElement('circle', - { - 'cx': 2.5, - 'cy': 2.5, - 'r': 2.5, - 'fill': '#000', - 'fill-opacity': .3 - }, this.polkadotGroup_); - Blockly.utils.dom.createSvgElement('circle', - { - 'cx': 7.5, - 'cy': 7.5, - 'r': 2.5, - 'fill': '#000', - 'fill-opacity': .3 - }, this.polkadotGroup_); - - this.hexagonPattern_ = Blockly.utils.dom.createSvgElement('pattern', - { - 'id': 'hexagons', - 'patternUnits': 'userSpaceOnUse', - 'width': 10, - 'height': 8.68, - 'patternTransform': 'translate(2) rotate(45)' - }, this.defs_); - Blockly.utils.dom.createSvgElement('polygon', - { - 'id': 'hex', - 'points': '4.96,4.4 7.46,5.84 7.46,8.74 4.96,10.18 2.46,8.74 2.46,5.84', - 'stroke': '#000', - 'stroke-opacity': .3, - 'fill-opacity': 0 - }, this.hexagonPattern_); - var use = Blockly.utils.dom.createSvgElement('use', - { - 'x': 5, - }, this.hexagonPattern_); - use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', '#hex'); - use = Blockly.utils.dom.createSvgElement('use', - { - 'x': -5, - }, this.hexagonPattern_); - use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', '#hex'); - use = Blockly.utils.dom.createSvgElement('use', - { - 'x': 2.5, - 'y': -4.34 - }, this.hexagonPattern_); - use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', '#hex'); - use = Blockly.utils.dom.createSvgElement('use', - { - 'x': -2.5, - 'y': -4.34 - }, this.hexagonPattern_); - use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', '#hex'); - - this.stripesPattern_ = Blockly.utils.dom.createSvgElement('pattern', - { - 'id': 'stripes', - 'patternUnits': 'userSpaceOnUse', - 'width': 5, - 'height': 10, - 'patternTransform': 'rotate(45)' - }, this.defs_); - Blockly.utils.dom.createSvgElement('line', - { - 'x1': 0, - 'y1': 0, - 'x2': 0, - 'y2': 10, - 'stroke-width': 4, - 'stroke': '#000', - 'stroke-opacity': .3 - }, this.stripesPattern_); -}; diff --git a/demos/custom-fields/turtle/icon.png b/demos/custom-fields/turtle/icon.png deleted file mode 100644 index 3a7314ac970453def5ae544be3c41722a44e2303..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8733 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 - - - - Blockly Demo: Custom Turtle Field - - - - - - - - -

- Blockly > - Demos > - Custom Fields > Turtle Field

- - -

This is a demo of creating custom block fields. In this case the field - is used to define a turtle. -

- -

All of the custom field implementation is in - demos/custom-fields/turtle/field_turtle.js, including comments on each required - function. -

- -

Click on the blocks' comment icons to learn what they are demonstrating. - Use the buttons below to see how the fields react to changes. -

- -

- - - - - -

- -

- - -

- - - - - - -
- - -
-
- - - - - - diff --git a/demos/custom-fields/turtle/media/crown.svg b/demos/custom-fields/turtle/media/crown.svg deleted file mode 100644 index 3eebccb92..000000000 --- a/demos/custom-fields/turtle/media/crown.svg +++ /dev/null @@ -1 +0,0 @@ -crown \ No newline at end of file diff --git a/demos/custom-fields/turtle/media/fedora.svg b/demos/custom-fields/turtle/media/fedora.svg deleted file mode 100644 index 4a354491b..000000000 --- a/demos/custom-fields/turtle/media/fedora.svg +++ /dev/null @@ -1 +0,0 @@ -fedora \ No newline at end of file diff --git a/demos/custom-fields/turtle/media/mask.svg b/demos/custom-fields/turtle/media/mask.svg deleted file mode 100644 index eb4fded1c..000000000 --- a/demos/custom-fields/turtle/media/mask.svg +++ /dev/null @@ -1 +0,0 @@ -mask \ No newline at end of file diff --git a/demos/custom-fields/turtle/media/propeller.svg b/demos/custom-fields/turtle/media/propeller.svg deleted file mode 100644 index bf0a433fd..000000000 --- a/demos/custom-fields/turtle/media/propeller.svg +++ /dev/null @@ -1 +0,0 @@ -propeller \ No newline at end of file diff --git a/demos/custom-fields/turtle/media/stovepipe.svg b/demos/custom-fields/turtle/media/stovepipe.svg deleted file mode 100644 index 6971ff7fd..000000000 --- a/demos/custom-fields/turtle/media/stovepipe.svg +++ /dev/null @@ -1 +0,0 @@ -stovepipe \ No newline at end of file diff --git a/demos/custom-fields/turtle/media/warning.svg b/demos/custom-fields/turtle/media/warning.svg deleted file mode 100644 index 11136c1ef..000000000 --- a/demos/custom-fields/turtle/media/warning.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/demos/custom-fields/turtle/turtle.css b/demos/custom-fields/turtle/turtle.css deleted file mode 100644 index ed5e9b307..000000000 --- a/demos/custom-fields/turtle/turtle.css +++ /dev/null @@ -1,48 +0,0 @@ -/** - * @license - * Copyright 2019 Google LLC - * SPDX-License-Identifier: Apache-2.0 - */ - -.customFieldsTurtleWidget { - width: 150px; -} - -.customFieldsTurtleWidget button { - border-radius: 4px; - border: none; - background-color: #fff; - opacity: .6; - color: #000; -} - -.customFieldsTurtleWidget .table { - width: 100%; -} - -.customFieldsTurtleWidget .row { - width: 100%; - display: flex; -} - -.customFieldsTurtleWidget .arrow { - text-align: center; - padding: 0; - flex-grow: 0; -} - -.customFieldsTurtleWidget .text { - height: 20px; - color: #fff; - flex-grow: 1; - text-align: center; -} - -.customFieldsTurtleWidget .randomize { - width: 100%; -} - -.blocklySvg .blocklyNonEditableText text, -.blocklySvg .blocklyEditableText text { - fill: #000; -} diff --git a/demos/fixed/icon.png b/demos/fixed/icon.png deleted file mode 100644 index 0a80ef9a3b8bca5d1765fb924f1c076598623bd8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1605 zcmZ`&dpO%^7XE0vYK(1%?oj*ev&_=2F*I~~k?B-jI%Hk8($wlC4C*pQji{isO;Fk} zilQV#cbmACDRo;~8I(+<6@oBfgd}R>lEnU$5NWdg_UF&}WB)kc`@HXS&U4Ol&imzG z2=X<5&*nV^qItgJt%?IO{d{9^7h zYulDoZ}Qm#sbyX4E}>>y_eIq0QvtD`U%G}*W}XX8f7B^Vx!)b0)%Zdvc_EaNSc@76 zk!4vvt*KbJ0ij{2p^il5Nwg5^)kUzvfvcdyqusWYC)8u75|oHHSc0BYLBh{gTYaq!3AGzy*{XOE(deOaS{T-)92bn$3@*wAFNjpJLNbf!q2MVu zpURVKp=Mb&xCG^bUKXtpkxh#^HDN8QP$ex8ZfF+8H--?!*c7sxHW${jrdghW$U+8< zQ!}(A=63QC$f;}~J&-a*TZ*xMIlqrc9UWA?8}F{wsbs~XE#)L{ViP`=>Wa~J6+A?x zsi!q|NDX5CtO7#uCd?dE>z3yVgjYL1|?rk5OqO%8* z?zQ=UUFaT^&_5(>=g)TYrx}%x**y~t9AV9@PCnKj5J#VyUk;;`z1h^L@JT5r^-Je-dwA(Xquh`V^v(>iZ~^!Xtk{gFj> z-d+O1cKFUgvo0T_D^>)bU^UyPEuEn5wNm#csKeB6I}BvLspBK=UjF@C8>_MD+at%3 zK2G|#p$sq9&fWdK{{OYfeN?w!>l*J^p6?cXWY~wwdtt4yL#66NUt2WrI#R4CTX*cOjljGGv-}f-7>7H-#QpBD-Q@eL zE7HF>H^+UEg*(=K>ebni5yJ_0CyA&#$;0-p#XJAYDTx{Ow+l(gVe6WVPd0TweDP-brS%S{(3evpQG5&|$kcUD#Rk)5 zq=_84J>t$#VMeQp_mv+sYoq_cg%~ql;(?hs>LRZE(ko=3_mJS_H=m@3hD10x+Jy{^ ze)A+YB~bh%6+8XBHQeiJ>s9+xhv%z;y-Pz(vYcykXTB$ro}2&sYRjv%(z)!17E%95 zHf5HqN$=UTM~sD=Y_qO=IP5(jm)qU)hT__``AcMLqWw=Nr%HXv8tbC6qhwK})0w=r z@`F!|$HOl6D&(#Mj@4YMohWK!)z)iS%DjNO#Wk^FAxC&ybp=ol&lBAJ`f_o##Py zQ~Cz%Ih*j$ons#yW^w)=1Ud{*Zv!1VwYY(9qnr0DqAjQ?NY&W=RC3;?+EK|U>B5jp<@c~Djx diff --git a/demos/fixed/index.html b/demos/fixed/index.html deleted file mode 100644 index 85d634608..000000000 --- a/demos/fixed/index.html +++ /dev/null @@ -1,49 +0,0 @@ - - - - - Blockly Demo: Fixed Blockly - - - - - - -

Blockly > - Demos > Fixed Blockly

- -

This is a simple demo of injecting Blockly into a fixed-sized 'div' element.

- -

→ More info on injecting fixed-sized Blockly

- -
- - - - - - - diff --git a/demos/generator/icon.png b/demos/generator/icon.png deleted file mode 100644 index c1a84f03427fe3ba4964f317187637caca66407a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2677 zcmZ`)c{r3^8-HXQ#xlZKk`Ph`6B^BA$&9h@q(Ne2i|mZO>_WY=*Vv*M(nO3kl0C0i z^S+j(5k*s$#zZNj?(KK7?QPA31!V;R01&n?H*o~f z2NZkA0dV&UGV26^$KTk-7yusUL4Oi?!L!08b4MEhh*t%GrPG<@MnxUBcH~XU6wo_GzpxIg{MJ@TX{@wy<|16=C z#5mFBY%gu?cZvu3xQux+Opuy6TlE4KJZXG**pL8$TUt!bviaeT(g9<6KO@@3WgDz! zfZX99&etp!BY%|tdSghji{b5j{5L#V%!?om&&(haK`>1Q;fTh=rJPE;N5w84qLa;< zvs-Lom;U^5W7%)M5M>qseb{ zy4F$0FJHzNT!yoy9?v~;00@i#sVukWletBiC|4&F5-eY2!@GFTgZ(N*5(%47Rq zT^2y~|?Visl7Wc9!a$(ApjB!$mIsoafiNk!cccQWPz zj}8YbwJ&5bFb^27<@mq~HcNsVjwlqcA^fmrt8rM;ApE$-`Y4s|dnJ%PrRTOifm(z< z;nrY#l3%!$39%)5CTS=;e`$SY^-&j0NQcbmg6xC6c^BYmau)e-3X=;sOZ*}+Tz>lT zoF0NK^G|}<;hcSFtcK?^-0mL&R^OkeX!Tb~dcfDy8>+z$+Ltt4Q!WwdX)?cG^}Ke>?Kt}h;>}V1rw2Uao*nRdvh_+O zDL5Dc0OnsqMI&q(=P11qIg_@enVChwgNR@e?qs##(f5s&wmL!M>RD+5>rwK6muLQP z`cuL=mfbdPp;_YCMr^z*ES!vy|hsQ!+ z9_pySSTIMcEB0P_zUrAKmDwkTSWmA_xZnMWK>oBC;LhRh>o>`0Gf+SXYE|7&6=*!g z1Mnpg@V+z>uF3lN!k-Uxd+SPYz~|Y5iGHOx&QYdtZoiYfCTk&`QP+J000t(5R{Y)L zP5@_(Km15;?pa4DwO{=F=FT=1ReTK!ylU%vJmxi}SN-}`!u zQuGdPJ1xJ$pslLJ+YKKI7mFl1+}v%RW3ZZHq{)wTRW6xZESeVF~>2VcHFSx&nZ@)PC
7_7}ZmGIsKhPWIMnaeN zHVT%8{HAK39Mbi_D*D}ZX$T6Aq2cmL>4~Vzz3Q^Nzf~WWySWxOcS_K*=XH0sL>G&^ zL8d^wx#L;XWfaO#{6TX&7wn0g7XhHqUrmD)fuN`;32bLeOX|OwH+s_DZBPHerxMfc6^kewJ18!$w_7sd=hWalH#b*V(c0Q-Sz9o=9Nu-I z>w+N~ZDIK5ix(~p&Zx2pErfjD$FS4ow#TaI6f~o!M?Y1;P#KYJqEtAxvflLQQAtse z!nMiC$>&!oQx>pve=%_xnbok<&zEGPOG-)}QK_6{UPb4|89W~U)qmYiBeofJg2`mU zuqkKHHY7N3l=98}{QTrZ%p4sLrZ=~=6gW%E$cRCBU;{Zhf+r9nS*<~{n!01RZ%d=f zY+kh2)v2OT;L{_!=HI`6pPelr=xw)|I6XTH1}cv#t0*tmH!wIH<}H$S@9td%42C@B zV~WSuQYd8;epT&ip7;i55{Z;!q6FF&6h!R*O8Pn-(t(2v4h|mCk3IXiEp*WkLJSRU zVz5YE7hGLkVc5rnPYpUcI^u9RpCXOH3hfsZ7G|;8Sukzs8}Hr`RSPY4i|*W6T@Aou z57-bY3-a^DU@nP?`b=u!F}ul>;df#BRbYrU6xo}6*!ro}p5V<`eaO2hiro=|c;&*e zfx$rsrJDNHC=8_9^j>vlHG`$8uHHzcZcCX>O-;eD@Lar(P-A1G6deBd$y?)0zVwWe z)|o&L50Ba-JN1<6YGQc!=1xY-BnKHn1R8Y)hNTbEgq~i9B%61e&K>LMNS&7!l#&iCT2r<#-4_$c(F|} zFoWfymPFjX_{Y+pKg|xRD4IzR#!VCXHfvW53N?>D` zM{d^E)|Tmo)@YPCaHY@bGZh!0v85`;yFS>&yL0M%r<9ZyRoGRmJRzLaa^{$Cp|;HWX>Q z1qQBR$^>L154&?X92mAJQ6tRuAYHaJaJe=UVrEFyTO`a$AYU#$4%03?@D-EDWb5 zA|hgHW`=`6p-`jJw6D2RTGN52+(N#J77GXntQ61BU)YjgjqHkEVX@AsNq{Y?yWQH- zA|c58fW0Xx{FFY>j6?`Q2M7L(eF)|pqfJ3AZ-1$V5%BL;iNX`2e27uLm`f49AOPCP zlczP1Xbo*0=aXoRHVUJQQb!^&NTm7x-2VSK1c&-u_KW-f4(J*p4s-x4@U|w8uwJSE E0+-y-J^%m! diff --git a/demos/generator/index.html b/demos/generator/index.html deleted file mode 100644 index 127a128d8..000000000 --- a/demos/generator/index.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - Blockly Demo: Generating JavaScript - - - - - - - -

Blockly > - Demos > Generating JavaScript

- -

This is a simple demo of generating code from blocks and running - the code in a sandboxed JavaScript interpreter.

- -

→ More info on Code Generators and Running JavaScript.

- -

- - -

- -
- - - - - - - - - diff --git a/demos/graph/icon.png b/demos/graph/icon.png deleted file mode 100644 index 7828463dee6708147350f6920901c5e4534dc16c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1057 zcmeAS@N?(olHy`uVBq!ia0vp^DL@>+!3-pCTvxaYq*&4&eH|GXHuiJ>Nn{1`6_P!I zd>I(3)EF2VS{N990fib~Fff!FFfhDIU|_JC!N4G1FlSew4N&4(fKQ0)|NsBbojYf0 zYU-GG-7NLm`km(woc|Qnc&Bmx)8%{Ke*E(1>FZx5Qy)h+-r0Qg!;ObOdRM$i@4D|- zam%;-Rz~-OGdI4>+Vtwtqet%U?uv?vKvQEHt~AcPC@LyiI_>fD&F5!tetqlKEmv1p zZ*OmBXXhI?ZmeIwe#w$0Zf({S4IXU_G__(;Z6c-n>u&_keUyeB))D5(o zG0EHAg`tC0)&t1lEbxddW?56;A!c7^4h^{!heaobG7F^ zPWd}Y%(GD5!}7P1*`&Km#f)3ezS6Tcpa7D`wrz zA}dnFI8TOF@lJaIXWg{Vm+}17;Nwd#dW{*q^=54io_~p&h z)t`?moD^x;zSiGj*M#f&e6G*BS28WQ+qZW|jrRL{@0)l0tPynLc&ODPaH#!c3Jb#v z$=$_=^`~$8qjC3I;oq0fjAtF2K70N3xB0P(>D!BbuYFs5!l{oe24_p0Cf z2JYA!{QP(S{QZ9NagR(Grp|gaq3=kYW)5?MiRG5J8^w*J*BZ5VvMiWxzpQby^u}L} ztCf_Jj91Jo5S;D!R90`(uc^w)Qm42iKL+faFp)*0rDw<2|B-4&j#@cKa;~qtC>S2* zW%HzNbB9OJwc{Tr^xo@|4b@uOG4aYQRyo^5<**|%3eF-bs8?tE0238r_kJ6^{%qy3RaTMN zgo9z{n;JBplq`wg`#930%TBhiVX1Q3@9h5moVnjTPS}?wNPpjMWU&I6!cWoBvTX - - - - Blockly Demo: Graph - - - - - - - - -

Blockly > - Demos > Graph

- -

This is a demo of giving instant feedback as blocks are changed.

- -

→ More info on Realtime generation

- - - - - - -
-
-
-
-
- -
- - ... -
- - - - - - - - - diff --git a/demos/index.html b/demos/index.html index 28d6e2f1d..578874151 100644 --- a/demos/index.html +++ b/demos/index.html @@ -28,18 +28,6 @@ their own applications.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - -
Inject Blockly into a page as a fixed element.
-
@@ -64,30 +52,6 @@
- - - - - -
Limit the total number of blocks allowed (for academic exercises).
-
- - - - - -
Turn blocks into code and execute it.
-
@@ -100,31 +64,6 @@
- - - - -
JS Interpreter
- - -
- - - - - -
Instant updates when blocks are changed.
-
@@ -137,30 +76,6 @@
- - - - - -
Override Blockly browser dialogs with custom implementations.
-
- - - - - -
Implement a custom field.
-
diff --git a/demos/interpreter/acorn_interpreter.js b/demos/interpreter/acorn_interpreter.js deleted file mode 100644 index 19db1c3ef..000000000 --- a/demos/interpreter/acorn_interpreter.js +++ /dev/null @@ -1,143 +0,0 @@ -// Acorn: Copyright 2012 Marijn Haverbeke, MIT License -var mod$$inline_58=function(a){function b(a){n=a||{};for(var b in Ua)Object.prototype.hasOwnProperty.call(n,b)||(n[b]=Ua[b]);wa=n.sourceFile||null}function c(a,b){var c=Ab(k,a);b+=" ("+c.line+":"+c.column+")";var d=new SyntaxError(b);d.pos=a;d.loc=c;d.raisedAt=f;throw d;}function d(a){function b(a){if(1==a.length)return c+="return str === "+JSON.stringify(a[0])+";";c+="switch(str){";for(var va=0;vaa)++f;else if(47===a)if(a=k.charCodeAt(f+1),42===a){var a=n.onComment&&n.locations&&new e,b=f,d=k.indexOf("*/",f+=2);-1===d&&c(f-2,"Unterminated comment"); -f=d+2;if(n.locations){Y.lastIndex=b;for(var g=void 0;(g=Y.exec(k))&&g.index=a?a=P(!0):(++f,a=g(xa)),a;case 40:return++f,g(I);case 41:return++f,g(E);case 59:return++f,g(J);case 44:return++f,g(L);case 91:return++f,g(ja); -case 93:return++f,g(ka);case 123:return++f,g(Z);case 125:return++f,g(T);case 58:return++f,g(aa);case 63:return++f,g(ya);case 48:if(a=k.charCodeAt(f+1),120===a||88===a)return f+=2,a=B(16),null==a&&c(x+2,"Expected hexadecimal number"),la(k.charCodeAt(f))&&c(f,"Identifier directly after number"),a=g(ba,a);case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:return P(!1);case 34:case 39:a:{f++;for(var b="";;){f>=S&&c(x,"Unterminated string constant");var d=k.charCodeAt(f);if(d===a){++f; -a=g(da,b);break a}if(92===d){var d=k.charCodeAt(++f),e=/^[0-7]+/.exec(k.slice(f,f+3));for(e&&(e=e[0]);e&&255=S)return g(pa);var b=k.charCodeAt(f);if(la(b)||92===b)return Ya();a=m(b);if(!1===a){b=String.fromCharCode(b);if("\\"===b||Za.test(b))return Ya();c(f,"Unexpected character '"+b+"'")}return a}function t(a,b){var c=k.slice(f,f+b);f+=b;g(a,c)}function K(){for(var a,b,d=f;;){f>=S&&c(d, -"Unterminated regular expression");var e=k.charAt(f);na.test(e)&&c(d,"Unterminated regular expression");if(a)a=!1;else{if("["===e)b=!0;else if("]"===e&&b)b=!1;else if("/"===e&&!b)break;a="\\"===e}++f}a=k.slice(d,f);++f;(b=$a())&&!/^[gmsiy]*$/.test(b)&&c(d,"Invalid regexp flag");return g(Ba,new RegExp(a,b))}function B(a,b){for(var c=f,d=0,e=0,g=null==b?Infinity:b;e=h?h-48:Infinity;if(h>=a)break;++f;d=d*a+h}return f===c||null!=b&& -f-c!==b?null:d}function P(a){var b=f,d=!1,e=48===k.charCodeAt(f);a||null!==B(10)||c(b,"Invalid number");46===k.charCodeAt(f)&&(++f,B(10),d=!0);a=k.charCodeAt(f);if(69===a||101===a)a=k.charCodeAt(++f),43!==a&&45!==a||++f,null===B(10)&&c(b,"Invalid number"),d=!0;la(k.charCodeAt(f))&&c(f,"Identifier directly after number");a=k.slice(b,f);var h;d?h=parseFloat(a):e&&1!==a.length?/[89]/.test(a)||C?c(b,"Invalid number"):h=parseInt(a,8):h=parseInt(a,10);return g(ba,h)}function ma(a){a=B(16,a);null===a&&c(x, -"Bad character escape sequence");return a}function $a(){ca=!1;for(var a,b=!0,d=f;;){var e=k.charCodeAt(f);if(ab(e))ca&&(a+=k.charAt(f)),++f;else if(92===e){ca||(a=k.slice(d,f));ca=!0;117!=k.charCodeAt(++f)&&c(f,"Expecting Unicode escape sequence \\uXXXX");++f;var e=ma(4),g=String.fromCharCode(e);g||c(f-1,"Invalid Unicode escape");(b?la(e):ab(e))||c(f-4,"Invalid Unicode escape");a+=g}else break;b=!1}return ca?a:k.slice(d,f)}function Ya(){var a=$a(),b=V;ca||(Lb(a)?b=Ca[a]:(n.forbidReserved&&(3===n.ecmaVersion? -Mb:Nb)(a)||C&&bb(a))&&c(x,"The keyword '"+a+"' is reserved"));return g(b,a)}function r(){Da=x;M=X;Ea=ia;z()}function Fa(a){C=a;f=M;if(n.locations)for(;fb){var e=Q(a);e.left=a;e.operator=H;a=p;r();e.right=Ra(Sa(),d,c);d=q(e,a===Va||a===Wa?"LogicalExpression":"BinaryExpression");return Ra(d,b,c)}return a}function Sa(){if(p.prefix){var a=y(),b=p.isUpdate;a.operator=H;R=a.prefix=!0;r();a.argument= -Sa();b?ra(a.argument):C&&"delete"===a.operator&&"Identifier"===a.argument.type&&c(a.start,"Deleting local variable in strict mode");return q(a,b?"UpdateExpression":"UnaryExpression")}for(b=ha(ua());p.postfix&&!qa();)a=Q(b),a.operator=H,a.prefix=!1,a.argument=b,ra(b),r(),b=q(a,"UpdateExpression");return b}function ha(a,b){if(u(xa)){var c=Q(a);c.object=a;c.property=O(!0);c.computed=!1;return ha(q(c,"MemberExpression"),b)}return u(ja)?(c=Q(a),c.object=a,c.property=A(),c.computed=!0,v(ka),ha(q(c,"MemberExpression"), -b)):!b&&u(I)?(c=Q(a),c.callee=a,c.arguments=Ta(E,!1),ha(q(c,"CallExpression"),b)):a}function ua(){switch(p){case ub:var a=y();r();return q(a,"ThisExpression");case V:return O();case ba:case da:case Ba:return a=y(),a.value=H,a.raw=k.slice(x,X),r(),q(a,"Literal");case vb:case wb:case xb:return a=y(),a.value=p.atomValue,a.raw=p.keyword,r(),q(a,"Literal");case I:var a=oa,b=x;r();var d=A();d.start=b;d.end=X;n.locations&&(d.loc.start=a,d.loc.end=ia);n.ranges&&(d.range=[b,X]);v(E);return d;case ja:return a= -y(),r(),a.elements=Ta(ka,!0,!0),q(a,"ArrayExpression");case Z:a=y();b=!0;d=!1;a.properties=[];for(r();!u(T);){if(b)b=!1;else if(v(L),n.allowTrailingCommas&&u(T))break;var e={key:p===ba||p===da?ua():O(!0)},g=!1,h;u(aa)?(e.value=A(!0),h=e.kind="init"):5<=n.ecmaVersion&&"Identifier"===e.key.type&&("get"===e.key.name||"set"===e.key.name)?(g=d=!0,h=e.kind=e.key.name,e.key=p===ba||p===da?ua():O(!0),p!==I&&N(),e.value=Na(y(),!1)):N();if("Identifier"===e.key.type&&(C||d))for(var f=0;fd?a.id:a.params[d],(bb(e.name)||sa(e.name))&&c(e.start,"Defining '"+e.name+"' in strict mode"),0<=d)for(var g=0;ga?36===a:91>a?!0:97>a?95===a:123>a?!0:170<=a&&Za.test(String.fromCharCode(a))},ab=a.isIdentifierChar=function(a){return 48>a?36===a:58>a?!0:65>a?!1:91>a?!0:97>a?95===a:123>a?!0:170<=a&&Pb.test(String.fromCharCode(a))},ca,Ia={kind:"loop"},Ob={kind:"switch"}}; -"object"==typeof exports&&"object"==typeof module?mod$$inline_58(exports):"function"==typeof define&&define.amd?define(["exports"],mod$$inline_58):mod$$inline_58(this.acorn||(this.acorn={})); -// JS-Interpreter: Copyright 2013 Google LLC, Apache 2.0 -function u(a,b){"string"===typeof a&&(a=acorn.parse(a,ha));this.Ha=a.constructor;var c=new this.Ha({options:{}});for(d in a)c[d]="body"===d?a[d].slice():a[d];this.fa=c;this.kb=b;this.wa=!1;this.U=[];this.Sa=0;this.pb=Object.create(null);var d=/^step([A-Z]\w*)$/;var e,g;for(g in this)"function"===typeof this[g]&&(e=g.match(d))&&(this.pb[e[1]]=this[g].bind(this));this.M=ia(this,this.fa,null);this.Da=this.M.object;this.fa=acorn.parse(this.U.join("\n"),ha);this.U=void 0;ra(this.fa,void 0,void 0);e=new v(this.fa, -this.M);e.done=!1;this.j=[e];this.nb();this.value=void 0;this.fa=c;e=new v(this.fa,this.M);e.done=!1;this.j.length=0;this.j[0]=e;this.stateStack=this.j} -var ha={Ca:5},ya={configurable:!0,enumerable:!0,writable:!1},B={configurable:!0,enumerable:!1,writable:!0},E={configurable:!0,enumerable:!1,writable:!1},za={configurable:!1,enumerable:!0,writable:!0},Aa={STEP_ERROR:!0},Ba={SCOPE_REFERENCE:!0},Ia={VALUE_IN_DESCRIPTOR:!0},Ja={REGEXP_TIMEOUT:!0},Ka=[],La=null,Ma=["onmessage = function(e) {","var result;","var data = e.data;","switch (data[0]) {","case 'split':","result = data[1].split(data[2], data[3]);","break;","case 'match':","result = data[1].match(data[2]);", -"break;","case 'search':","result = data[1].search(data[2]);","break;","case 'replace':","result = data[1].replace(data[2], data[3]);","break;","case 'exec':","var regexp = data[1];","regexp.lastIndex = data[2];","result = [regexp.exec(data[3]), data[1].lastIndex];","break;","default:","throw 'Unknown RegExp operation: ' + data[0];","}","postMessage(result);","};"];function Na(a){var b=a>>>0;return b===Number(a)?b:NaN}function Oa(a){var b=a>>>0;return String(b)===String(a)&&4294967295!==b?b:NaN} -function ra(a,b,c){b?a.start=b:delete a.start;c?a.end=c:delete a.end;for(var d in a)if(a.hasOwnProperty(d)){var e=a[d];e&&"object"===typeof e&&ra(e,b,c)}}u.prototype.REGEXP_MODE=2;u.prototype.REGEXP_THREAD_TIMEOUT=1E3;q=u.prototype;q.I=!1;q.ya=!1; -q.ub=function(a){var b=this.j[0];if(!b||"Program"!==b.node.type)throw Error("Expecting original AST to start with a Program node.");"string"===typeof a&&(a=acorn.parse(a,ha));if(!a||"Program"!==a.type)throw Error("Expecting new AST to start with a Program node.");Pa(this,a,b.scope);Array.prototype.push.apply(b.node.body,a.body);b.done=!1}; -q.step=function(){var a=this.j;do{var b=a[a.length-1];if(!b)return!1;var c=b.node,d=c.type;if("Program"===d&&b.done)return!1;if(this.wa)break;try{var e=this.pb[d](a,b,c)}catch(g){if(g!==Aa)throw g;}e&&a.push(e);if(this.I)throw Error("Getter not supported in this context");if(this.ya)throw Error("Setter not supported in this context");}while(!c.end);return!0};q.nb=function(){for(;!this.wa&&this.step(););return this.wa}; -function Qa(a,b){a.setProperty(b,"NaN",NaN,ya);a.setProperty(b,"Infinity",Infinity,ya);a.setProperty(b,"undefined",void 0,ya);a.setProperty(b,"window",b,ya);a.setProperty(b,"this",b,ya);a.setProperty(b,"self",b);a.B=new F(null);a.W=new F(a.B);db(a,b);eb(a,b);b.la=a.B;a.setProperty(b,"constructor",a.m,B);Fb(a,b);Gb(a,b);Hb(a,b);Ib(a,b);Jb(a,b);Kb(a,b);Lb(a,b);Mb(a,b);Nb(a,b);var c=a.b(function(){throw EvalError("Can't happen");},!1);c.eval=!0;a.setProperty(b,"eval",c);a.setProperty(b,"parseInt",a.b(parseInt, -!1));a.setProperty(b,"parseFloat",a.b(parseFloat,!1));a.setProperty(b,"isNaN",a.b(isNaN,!1));a.setProperty(b,"isFinite",a.b(isFinite,!1));c=[[escape,"escape"],[unescape,"unescape"],[decodeURI,"decodeURI"],[decodeURIComponent,"decodeURIComponent"],[encodeURI,"encodeURI"],[encodeURIComponent,"encodeURIComponent"]];for(var d=0;d>> 0;","if (arguments.length > 1) T = thisArg;","k = 0;", -"while (k < len) {","if (k in O && !callbackfn.call(T, O[k], k, O)) return false;","k++;","}","return true;","}","});","Object.defineProperty(Array.prototype, 'filter',","{configurable: true, writable: true, value:","function(fun/*, thisArg*/) {","if (this === void 0 || this === null || typeof fun !== 'function') throw TypeError();","var t = Object(this);","var len = t.length >>> 0;","var res = [];","var thisArg = arguments.length >= 2 ? arguments[1] : void 0;","for (var i = 0; i < len; i++) {","if (i in t) {", -"var val = t[i];","if (fun.call(thisArg, val, i, t)) res.push(val);","}","}","return res;","}","});","Object.defineProperty(Array.prototype, 'forEach',","{configurable: true, writable: true, value:","function(callback, thisArg) {","if (!this || typeof callback !== 'function') throw TypeError();","var T, k;","var O = Object(this);","var len = O.length >>> 0;","if (arguments.length > 1) T = thisArg;","k = 0;","while (k < len) {","if (k in O) callback.call(T, O[k], k, O);","k++;","}","}","});","Object.defineProperty(Array.prototype, 'map',", -"{configurable: true, writable: true, value:","function(callback, thisArg) {","if (!this || typeof callback !== 'function') new TypeError;","var T, A, k;","var O = Object(this);","var len = O.length >>> 0;","if (arguments.length > 1) T = thisArg;","A = new Array(len);","k = 0;","while (k < len) {","if (k in O) A[k] = callback.call(T, O[k], k, O);","k++;","}","return A;","}","});","Object.defineProperty(Array.prototype, 'reduce',","{configurable: true, writable: true, value:","function(callback /*, initialValue*/) {", -"if (!this || typeof callback !== 'function') throw TypeError();","var t = Object(this), len = t.length >>> 0, k = 0, value;","if (arguments.length === 2) {","value = arguments[1];","} else {","while (k < len && !(k in t)) k++;","if (k >= len) {","throw TypeError('Reduce of empty array with no initial value');","}","value = t[k++];","}","for (; k < len; k++) {","if (k in t) value = callback(value, t[k], k, t);","}","return value;","}","});","Object.defineProperty(Array.prototype, 'reduceRight',", -"{configurable: true, writable: true, value:","function(callback /*, initialValue*/) {","if (null === this || 'undefined' === typeof this || 'function' !== typeof callback) throw TypeError();","var t = Object(this), len = t.length >>> 0, k = len - 1, value;","if (arguments.length >= 2) {","value = arguments[1];","} else {","while (k >= 0 && !(k in t)) k--;","if (k < 0) {","throw TypeError('Reduce of empty array with no initial value');","}","value = t[k--];","}","for (; k >= 0; k--) {","if (k in t) value = callback(value, t[k], k, t);", -"}","return value;","}","});","Object.defineProperty(Array.prototype, 'some',","{configurable: true, writable: true, value:","function(fun/*, thisArg*/) {","if (!this || typeof fun !== 'function') throw TypeError();","var t = Object(this);","var len = t.length >>> 0;","var thisArg = arguments.length >= 2 ? arguments[1] : void 0;","for (var i = 0; i < len; i++) {","if (i in t && fun.call(thisArg, t[i], i, t)) {","return true;","}","}","return false;","}","});","(function() {","var sort_ = Array.prototype.sort;", -"Array.prototype.sort = function(opt_comp) {","if (typeof opt_comp !== 'function') {","return sort_.call(this);","}","for (var i = 0; i < this.length; i++) {","var changes = 0;","for (var j = 0; j < this.length - i - 1; j++) {","if (opt_comp(this[j], this[j + 1]) > 0) {","var swap = this[j];","this[j] = this[j + 1];","this[j + 1] = swap;","changes++;","}","}","if (!changes) break;","}","return this;","};","})();","Object.defineProperty(Array.prototype, 'toLocaleString',","{configurable: true, writable: true, value:", -"function() {","var out = [];","for (var i = 0; i < this.length; i++) {","out[i] = (this[i] === null || this[i] === undefined) ? '' : this[i].toLocaleString();","}","return out.join(',');","}","});","")} -function Gb(a,b){var c=function(e){e=arguments.length?String(e):"";return zc(a)?(this.data=e,this):e};a.w=a.b(c,!0);a.setProperty(b,"String",a.w);a.setProperty(a.w,"fromCharCode",a.b(String.fromCharCode,!1),B);c="charAt charCodeAt concat indexOf lastIndexOf slice substr substring toLocaleLowerCase toLocaleUpperCase toLowerCase toUpperCase trim".split(" ");for(var d=0;d= 0; i--) {","str = str.substring(0, subs[i][0]) + subs[i][2] + str.substring(subs[i][0] + subs[i][1]);", -"}","} else {","var i = str.indexOf(substr);","if (i !== -1) {","var inject = newSubstr(str.substr(i, substr.length), i, str);","str = str.substring(0, i) + inject + str.substring(i + substr.length);","}","}","return str;","};","})();","")}function Hb(a,b){a.Ya=a.b(function(c){c=!!c;return zc(a)?(this.data=c,this):c},!0);a.setProperty(b,"Boolean",a.Ya)} -function Ib(a,b){var c=function(e){e=arguments.length?Number(e):0;return zc(a)?(this.data=e,this):e};a.S=a.b(c,!0);a.setProperty(b,"Number",a.S);c=["MAX_VALUE","MIN_VALUE","NaN","NEGATIVE_INFINITY","POSITIVE_INFINITY"];for(var d=0;db.charCodeAt(0)&&U(this,a,this.w)){var c=Oa(b);if(!isNaN(c)&&c>=":d>>=e;break;case ">>>=":d>>>=e;break;case "&=":d&=e;break;case "^=":d^=e;break;case "|=":d|=e;break;default:throw SyntaxError("Unknown assignment expression: "+c.operator);}if(c=cd(this,b.ra,d))return b.ia=!0,b.Wa=d,fd(this,c,b.ra,d);a.pop();a[a.length-1].value=d}}; -u.prototype.stepBinaryExpression=function(a,b,c){if(!b.Y)return b.Y=!0,new v(c.left,b.scope);if(!b.pa)return b.pa=!0,b.$=b.value,new v(c.right,b.scope);a.pop();var d=b.$;b=b.value;switch(c.operator){case "==":c=d==b;break;case "!=":c=d!=b;break;case "===":c=d===b;break;case "!==":c=d!==b;break;case ">":c=d>b;break;case ">=":c=d>=b;break;case "<":c=d>":c=d>>b;break;case ">>>":c=d>>>b;break;case "in":b instanceof F||I(this,this.g,"'in' expects an object, not '"+b+"'");c=Bc(this,b,d);break;case "instanceof":U(this,b,this.H)||I(this,this.g,"Right-hand side of instanceof is not an object");c=d instanceof F?U(this,d,b):!1;break;default:throw SyntaxError("Unknown binary operator: "+c.operator);}a[a.length-1].value=c}; -u.prototype.stepBlockStatement=function(a,b,c){var d=b.o||0;if(c=c.body[d])return b.o=d+1,new v(c,b.scope);a.pop()};u.prototype.stepBreakStatement=function(a,b,c){dd(this,1,void 0,c.label&&c.label.name)}; -u.prototype.stepCallExpression=function(a,b,c){if(!b.ha){b.ha=1;var d=new v(c.callee,b.scope);d.ga=!0;return d}if(1===b.ha){b.ha=2;d=b.value;if(Array.isArray(d)){if(b.Z=bd(this,d),d[0]===Ba?b.yb="eval"===d[1]:b.G=d[0],d=b.Z,this.I)return b.ha=1,ed(this,d,b.value)}else b.Z=d;b.A=[];b.o=0}d=b.Z;if(!b.Qa){0!==b.o&&b.A.push(b.value);if(c.arguments[b.o])return new v(c.arguments[b.o++],b.scope);if("NewExpression"===c.type){d.Hb&&I(this,this.g,d+" is not a constructor");if(d===this.l)b.G=Ac(this);else{var e= -d.a.prototype;if("object"!==typeof e||null===e)e=this.B;b.G=this.h(e)}b.isConstructor=!0}else void 0===b.G&&(b.G=b.scope.P?void 0:this.Da);b.Qa=!0}if(b.Ra)a.pop(),a[a.length-1].value=b.isConstructor&&"object"!==typeof b.value?b.G:b.value;else{b.Ra=!0;d instanceof F||I(this,this.g,d+" is not a function");if(a=d.node){c=ia(this,a.body,d.va);for(var g=0;gg?b.A[g]:void 0);e=Ac(this);for(g=0;g - - - - Blockly Demo: Asynchronous Execution with JS Interpreter - - - - - - - - - -

Blockly > - Demos > Asynchronous Execution with JS Interpreter

- -

This is a demo of executing code asynchronously (e.g., waiting for delays or user input) using the JavaScript interpreter.

- -

More info on running code with JS Interpreter

- -

- -

- -
-
- -
- - - - - - - - diff --git a/demos/interpreter/icon.png b/demos/interpreter/icon.png deleted file mode 100644 index b70d1b03595c140780326fed3509a5bfffdadeb8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1756 zcmZ`(c~sJg8vT_rsifkX`-n1(=7!=1xPu8unz&(_C5lV#EEZ*^hMLDEaT`oaA)Ur0 z4JsYAMrX#gn9S#MZ5j7xi#^kfNX=pXeCNG)&$-_{_kQPoe}080{Ct#^^ppSqP$uAU zWSPductSy5HoXCzzm0sH=W$N}5MBfCMuBABI2unr4geS60FccAfG@Hrdkp|s2mp9< z1_01J063CX*Aw6(TO6eN`rv^5f@|VFnNv)|hcN)a+VpQ8IN#)+Aqx*N3CFz;y;6c4 z0XYV*lVq1bV+5RMQ2eWPUP4k(u;%b-a6A>{DHy{25^qvOtsEG@aq-Hw)+F$$_$HId zgL$G#BDulp{ve1C26=tB0)cvh)RL3qXE|P2el?jBVt#_yB)UIA`*AB4jdXWsUQAtm zRO4j)=llK43*GMUkI)o%9;j<0myXVs@KZ)uwUlc<($}D>UhkE?R9QuQ%8_l|Cgz6O6{St>>Qhu!C^JRVLXhy{# zb&)WS+%)6gyh%1;|FerB|DdT+y=3%v>S%+3A2O_5VRO_rM?^daPmeTMu%xM$ext2l z#$As8e6vZsK`k_`xR;`0=l3TnytC;7>S(enh44|gKT+k0qX|p*w;F%B<=)IB+falw zl;ZKTwJ$8s8O;v1$TlX|I>e4osM|g-oUZ!tW1h_(eSj<{4Y|QeRu#;<2(!YbqI0Gn zVHHxD@XsvAD5`GP92*-r1nWgTf%p{ns@SpMrmdwqU24^1={&agy2~8(DMB+>QG?Aq z9s5%#aLeooQfynGqCepfLvlKIIfh5msI()#{yO0~xN%Tv4-)h%x&uNzs_AXQb)nBR zP=+Juqam==Zww@DxyAD{^PHgyFHwFIWJ=;=uLVJ_xlOgV1cGyFV?N_&VRhClhwmGA z8tLJeur^=%RDrZ2GwyrapuKJN*(j;JTI{k+PuHL>ea0ar; zEja)#Trw#RP++gB-;>iW$DT{**ufl`Be`(^d*RUA`>DwR)ozKt^nNc=kic@8gu12Y z0EdB|ltfBKHmxsv0WAbT8;--i5Ns z+;;_x_wKX9FHVb8mjsd0bw2OA>nl$Be$6Rut-c4f%SpaBT6Rm%N--Oo;l&mY>d)*P zI1UZAoT3y(w&n*-<~VmovZ5W%8>cKlw{s|vhBDRWE5bc_8%%_nk(XF6%r<_je?^b~ zi-6+a7Pu=^P8)aKc+}NVtg2MFS|{Ey3aym17+#@exj(xVMTE{W_uJRBrA>IPRinv8 zb~q?=g_Tej+^m2sOiqGcp1+8yHJ=9$j`ygPok3jYecbCk%S-k+c5TA21$o4(lT>fDf2?PY(xUHC22(qm`hwr{?Bd*6Yt+crRz5jR z7+2L1Qe!wWtvGpUeBqQd0@aNE-bd?c^y3PO#P!WETFE{|3@1Aica&pCv6&3#d`M!7 z8&R~1Ast}dogQYC!3gT6FAM1xHG1){F<1eCX0uQ2BNW%i3A0N1qzC)sLr{@aM*}Xv zFJScUhJ~$g>(Fb5sm=+G&uJNDFQ(O=LW{^Jg`vpFoj*JLx39Oz zzWsMhZwfOeib+F9(`hmR>=3rjRtS`p9Wuxkg|>4<+dEny5NHGfzdyVGABE)9n1opN V|1Y2fQCL|4Ab9)X+P%)?{snDx>&E~9 diff --git a/demos/interpreter/index.html b/demos/interpreter/index.html deleted file mode 100644 index 52e49eee4..000000000 --- a/demos/interpreter/index.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - - Redirecting... - - - -Redirecting to step execution JS-Interpreter demo. - - diff --git a/demos/interpreter/step-execution.html b/demos/interpreter/step-execution.html deleted file mode 100644 index 03e62aed6..000000000 --- a/demos/interpreter/step-execution.html +++ /dev/null @@ -1,254 +0,0 @@ - - - - - Blockly Demo: Step Execution with JS Interpreter - - - - - - - - -

Blockly > - Demos > Step Execution with JS Interpreter

- -

This is a demo of executing code step-by-step with a sandboxed JavaScript interpreter.

- -

The generator's Blockly.JavaScript.STATEMENT_PREFIX is assigned 'highlightBlock(%1);\n', - where %1 is the block id. The call to highlightBlock() will highlight the identified block - and set the variable highlightPause to true.

- -

"Parse JavaScript" will generate the code and load it into the interpreter. Then, each press of the - "Step JavaScript" button will run the interpreter one step until the highlightPause is true. - That is, until highlightBlock() has highlighted the block that will be executed on the next step.

- -

More info on running code with JS Interpreter

- -

- -

- -
-
- -
- - - - - - - - diff --git a/demos/interpreter/wait_block.js b/demos/interpreter/wait_block.js deleted file mode 100644 index 10a57b482..000000000 --- a/demos/interpreter/wait_block.js +++ /dev/null @@ -1,53 +0,0 @@ -/** - * @license - * Copyright 2017 Google LLC - * SPDX-License-Identifier: Apache-2.0 - */ - -/** - * @fileoverview Example "wait" block that will pause the interpreter for a - * number of seconds. Because wait is a blocking behavior, such blocks will - * only work in interpreted environments. - * - * See https://neil.fraser.name/software/JS-Interpreter/docs.html - */ -Blockly.defineBlocksWithJsonArray([{ - "type": "wait_seconds", - "message0": " wait %1 seconds", - "args0": [{ - "type": "field_number", - "name": "SECONDS", - "min": 0, - "max": 600, - "value": 1 - }], - "previousStatement": null, - "nextStatement": null, - "colour": "%{BKY_LOOPS_HUE}" -}]); - -/** - * Generator for wait block creates call to new method - * waitForSeconds(). - */ -Blockly.JavaScript['wait_seconds'] = function(block) { - var seconds = Number(block.getFieldValue('SECONDS')); - var code = 'waitForSeconds(' + seconds + ');\n'; - return code; -}; - -/** - * Register the interpreter asynchronous function - * waitForSeconds(). - */ -function initInterpreterWaitForSeconds(interpreter, globalObject) { - // Ensure function name does not conflict with variable names. - Blockly.JavaScript.addReservedWords('waitForSeconds'); - - var wrapper = interpreter.createAsyncFunction( - function(timeInSeconds, callback) { - // Delay the call to the callback. - setTimeout(callback, timeInSeconds * 1000); - }); - interpreter.setProperty(globalObject, 'waitForSeconds', wrapper); -} diff --git a/demos/maxBlocks/icon.png b/demos/maxBlocks/icon.png deleted file mode 100644 index b90c79615013a248f06deff22ceb89516657ab6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1645 zcmZ`&dsGu=79T5!_}Ihq(6z2!bpxl!!|N+%H)1;)R08v4lwhLh5pN7MeBhOA1bL#dczbESP=Mik003I8 zmLTp2$CcT6aW?B@VT#8(IJ!|Y1&K?4*{yD&BCEAR2e`mTmT0Am_bu% z^CnpBNr;jG7HVFFQ+7W_}*}U6hpzLg;rg zG~@EYpw8}ve$GMDvoP>Thw7bfgP(QSXJoA1LNmf#k7$(w5Kg;!%3>S!LdZKlz{nXp zWA(T`R?%#LGXupm4 z=gc|)AT(k4ISjS=odyOSvXd3yfyED@(*xl=&9bb^#j?&B05lkWX3kXR7Ve;f0syr> zn)m$6kPMR+?#K@_gvUj%Sf3Qn=Lzb?3&pvm<%715 z%w^HJF^VIH-wln7L6bYmR3SA5F;A8E+^o(kZI5MAfc;cwZ0u|gp2fZT9Z&f0P;ckl zJxgY+OdM{KPrd!Z4;$-<$)iVz?0lJIbySCVl}r+>4@rrbZr->nE?4nmj)ypvf6QHd zye%S}S%c)XMTLJAkDSQtPucfv<&Bnw`Dw8J;HnjWTm-gn?M==Rmvuh3sQ5-lRP=Yx z?mqOV-tMm2`;m41p)cPm){Mj7-$?E}o6s{~e=rnzy~<>sm8w019d9JcZ-qYi{=g4h z@Mg$sXOt~6&&6|V#ur@78!me3VpCM6wD2Dh7Hw*1&Jpg!gto8Dp&pH`KknnAb1JW< zMkK8{H~q`1K-KE7Wo@6FmN0wM_9xfJcWseVi`Rz9p0-w|b*?T*JWV~>8ng5D$m;Fg zNgvh>zgO2aa=GrVxM=GI<+`0!$_tx5-B_D>ucB|)q2Gmwxsdw{E-L=Cff2LMV7KO?6OJp{8!eHNW{HNZCtmj{dND@cx-jJ9T zUt~{Nw@!0=t>SuYd&%dExq(|tWXGS_5;^-~V?_I|rPJ$E7K_8Rg~yU*dD+X#&pdrS zCgbwTup+rynpO6c*j2trZm92-sH_K*kdw(Z17mX2zuj@?LyySL?CXAWF6yg2oU5~C z*X=ha3qN_W>YZ;)1pZ5U&A?&b%%zhh{f1wc$2OG3O?P!uwyco}={eeL+2%OQe?8es zng%ytz2A_%QbyIZzper&_~4Xyij$22|9Cw{i2dFAHFuDA`d(zm!+u~_+M;}?2d-S&(GJ2|oUxXlq`9zx1-mzyJUM diff --git a/demos/maxBlocks/index.html b/demos/maxBlocks/index.html deleted file mode 100644 index dc94f2f45..000000000 --- a/demos/maxBlocks/index.html +++ /dev/null @@ -1,100 +0,0 @@ - - - - - Blockly Demo: Maximum Block Limit - - - - - - -

Blockly > - Demos > Maximum Block Limit

- -

This is a demo of Blockly which has been restricted to a maximum of - five blocks.

- -

You have block(s) left.

- -
- - - - - - -