Virtual Machine used to represent, run, and maintain the state of programs for Scratch 3.0
Find a file
Andrew Sliwinski d76e7a440a Update build
2016-05-10 12:12:37 -04:00
src Resolve existing motor timeout (instead of reject) 2016-05-09 14:18:33 -04:00
test Updating timer test for timeElapsed 2016-04-26 17:03:22 -04:00
.eslintrc Fix eslint errors 2016-05-02 11:56:52 -07:00
.gitignore Initial commit 2016-04-08 13:10:37 -04:00
.travis.yml Add travis config 2016-04-18 17:22:23 -04:00
LICENSE Initial commit 2016-03-28 12:53:44 -04:00
Makefile All tests passing 2016-04-26 09:54:14 -04:00
package.json All tests passing 2016-04-26 09:54:14 -04:00
README.md Update documentation 2016-05-10 12:12:31 -04:00
TRADEMARK Initial commit 2016-03-28 12:53:44 -04:00
vm.js Update build 2016-05-10 12:12:37 -04:00
vm.min.js Update build 2016-05-10 12:12:37 -04:00
webpack.config.js AST create / change / move / delete from blockly 2016-04-26 09:49:52 -04:00

scratch-vm

Build Status

Installation

npm install scratch-vm

Setup

var VirtualMachine = require('scratch-vm');
var vm = new VirtualMachine();

// Block events
workspace.addChangeListener(function(e) {
    // Handle "tapping" a block
    if (e instanceof Blockly.Events.Ui && e.element === 'click') {
        var stackBlock = workspace.getBlockById(e.blockId).getRootBlock().id;
        vm.runtime.toggleStack(stackBlock);
    // Otherwise, pass along to the block listener
    } else {
        vm.blockListener(e);
    }
});

// Run threads
vm.runtime.start();

Standalone Build

make build
<script src="/path/to/vm.js"></script>
<script>
    var vm = new window.VirtualMachine();
    // do things
</script>

Abstract Syntax Tree

Overview

The Virtual Machine constructs and maintains the state of an Abstract Syntax Tree (AST) by listening to events emitted by the scratch-blocks workspace via the blockListener. At any time, the current state of the AST can be viewed by inspecting the vm.runtime.blocks object.

Anatomy of a Block

{
    "id": "^1r~63Gdl7;Dh?I*OP3_",
    "opcode": "wedo_motorclockwise",
    "next": null,
    "fields": {
        "DURATION": {
            "name": "DURATION",
            "value": null,
            "blocks": {
                "1?P=eV(OiDY3vMk!24Ip": {
                    "id": "1?P=eV(OiDY3vMk!24Ip",
                    "opcode": "math_number",
                    "next": null,
                    "fields": {
                        "NUM": {
                            "name": "NUM",
                            "value": "10",
                            "blocks": null
                        }
                    }
                }
            }
        },
        "SUBSTACK": {
            "name": "SUBSTACK",
            "value": "@1ln(HsUO4!]*2*%BrE|",
            "blocks": null
        }
    }
}

Testing

make test
make coverage