diff --git a/.gitignore b/.gitignore
index c2527a5b..98059a56 100644
--- a/.gitignore
+++ b/.gitignore
@@ -12,4 +12,6 @@ content/editor.js
content/turtlebits.js
content/welcome.css
content/worker.js
+content/.well-known
.DS_Store
+/content/editor.js
diff --git a/Documentation/Flowcharts/Open XML files with this link to edit.url b/Documentation/Flowcharts/Open XML files with this link to edit.url
new file mode 100644
index 00000000..7284392f
--- /dev/null
+++ b/Documentation/Flowcharts/Open XML files with this link to edit.url
@@ -0,0 +1,5 @@
+[{000214A0-0000-0000-C000-000000000046}]
+Prop3=19,11
+[InternetShortcut]
+IDList=
+URL=https://www.draw.io/
diff --git a/Documentation/Flowcharts/Save Function/Pencilcode_Save.png b/Documentation/Flowcharts/Save Function/Pencilcode_Save.png
new file mode 100644
index 00000000..4af90ea3
Binary files /dev/null and b/Documentation/Flowcharts/Save Function/Pencilcode_Save.png differ
diff --git a/Documentation/Flowcharts/Save Function/Pencilcode_Save.xml b/Documentation/Flowcharts/Save Function/Pencilcode_Save.xml
new file mode 100644
index 00000000..75e774f9
--- /dev/null
+++ b/Documentation/Flowcharts/Save Function/Pencilcode_Save.xml
@@ -0,0 +1 @@
+
-git clone https://github.com/PencilCode/pencilcode.git -cd pencilcode -npm install -grunt -grunt devserver --On Windows Subsystem for Linux (WSL) *only*: - -
-git clone https://github.com/cacticouncil/pencilcode.git -cd pencilcode -npm install --no-shrinkwrap -grunt -grunt devserver -- -Development can be done on Linux, Mac, or Windows. -The prerequisites are a standard node.js development environment -which is very widely used, plus grunt (you'll need to -`npm install -g grunt-cli`). Prerequisites ------------- +There are three prerequisites: git, node.js, and grunt. Instructions are noted by operating system. -First, you need git, which is easy. On Linux, -just `sudo apt-get install git` or `sudo yum install git-core` -if you don't have it. - -Second, you need node.js (which is the `node` and `npm` binaries) -and `grunt` (which is the build tool popular in the node.js community). -The Ubuntu and Debian packages for node.js are pretty old, so don't -just apt-get install the packages. Get and build the latest `node` and -`npm` and `grunt` binaries as follows: +__Linux:__ -(For Linux:) +1. Git - +`sudo apt-get install git` on Debian/Ubuntu +`sudo yum install git-core` on CentOS / Redhat / Fedora +2. Node.js - +Some modern systems have recent enough tools to install node.js via the package manager. Here is how you'd do so on Ubuntu (native or under WSL): +
+sudo apt-get install npm git +sudo update-alternatives --install /usr/bin/node node /usr/bin/nodejs 10 +sudo npm install -g grunt-cli ++If you are not sure, it is recommended you get and build the latest `node`, `npm`, and `grunt` binaries as follows:
mkdir -p /tmp/nodejs && cd /tmp/nodejs -wget -N http://nodejs.org/dist/v0.12.7/node-v0.12.7.tar.gz # http://nodejs.org/dist/node-latest.tar.gz +wget -N http://nodejs.org/dist/v7.4.0/node-v7.4.0.tar.gz # http://nodejs.org/dist/node-latest.tar.gz tar xzvf node-*.tar.gz && cd `ls -d node-v*` ./configure --prefix=$HOME/local make install @@ -53,19 +34,18 @@ npm install -g grunt-cliZsh users should change `bashrc` to `zshrc` in the above code. -(For Windows Subsystem for Linux:) +__Mac:__ -
-sudo apt-get install npm git -sudo update-alternatives --install /usr/bin/node node /usr/bin/nodejs 10 -sudo npm install -g grunt-cli -- -(For Mac:) +1. On the Mac, git comes from Apple (you can get it as part of the +[Command line tools for XCode](https://developer.apple.com/downloads/index.action?q=xcode#)), +and if you'd rather not build it, node.js can be installed from +http://nodejs.org/download/. +You will still need to `sudo npm install -g grunt-cli`. +2. You'll need to install node.js as well:
mkdir -p /tmp/nodejs && cd /tmp/nodejs -curl http://nodejs.org/dist/v0.12.7/node-v0.12.7.tar.gz > node-latest.tar.gz +curl http://nodejs.org/dist/v7.4.0/node-v7.4.0.tar.gz > node-latest.tar.gz tar xzvf node-*.tar.gz && cd `ls -d node-v*` ./configure --prefix=$HOME/local make install @@ -74,23 +54,25 @@ source ~/.profile npm install -g grunt-cli-The above drops all the built binaries into `~/local/bin` so you -don't need root. +The above drops all the built binaries into `~/local/bin` so you don't need root. -On the Mac, git comes from Apple (you can get it as part of the -[Command line tools for XCode](https://developer.apple.com/downloads/index.action?q=xcode#)), -and if you'd rather not build it, node.js can be installed from -http://nodejs.org/download/. -You will still need to `sudo npm install -g grunt-cli`. +__Windows:__ + +1. Git can be installed from here: http://git-scm.com/download/win -On Windows, git can be installed from here: -http://git-scm.com/download/win and node.js can be installed -from here: http://nodejs.org/download/. Windows development -is untested, but if you try it, let me know. +2. Node.js v7.x can be installed from here: http://nodejs.org/download/ -Because node.js does not work on cygwin, when I work with node.js -on a Windows box, I just run it with debian under a vbox instance -https://www.virtualbox.org/. + +Building and Running +--------------------- +To clone the repository, build, and run, execute these commands: +
+git clone https://github.com/PencilCode/pencilcode.git +cd pencilcode +npm install +grunt +grunt devserver +How To Experiment with PencilCode diff --git a/Step1_Download Node.js.URL b/Step1_Download Node.js.URL new file mode 100644 index 00000000..5086a018 --- /dev/null +++ b/Step1_Download Node.js.URL @@ -0,0 +1,6 @@ +[InternetShortcut] +URL=https://nodejs.org/en/download/current/ +IDList= +HotKey=0 +IconFile=C:\Users\exlted\AppData\Local\Mozilla\Firefox\Profiles\s32xppaq.default\shortcutCache\+I5_7JpOJ20L+FgHHv8EMg==.ico +IconIndex=0 diff --git a/Step2.txt b/Step2.txt new file mode 100644 index 00000000..459d064a --- /dev/null +++ b/Step2.txt @@ -0,0 +1,2 @@ +Install the Node file you just downloaded then run Step 3 + diff --git a/Step3_Initial_Install.bat b/Step3_Initial_Install.bat new file mode 100644 index 00000000..41f4ccd9 --- /dev/null +++ b/Step3_Initial_Install.bat @@ -0,0 +1 @@ +npm install -g grunt -cli diff --git a/Step4_Setup.bat b/Step4_Setup.bat new file mode 100644 index 00000000..b66c116a --- /dev/null +++ b/Step4_Setup.bat @@ -0,0 +1 @@ +npm install \ No newline at end of file diff --git a/StepFinal_Run_Server.bat b/StepFinal_Run_Server.bat new file mode 100644 index 00000000..70aa704d --- /dev/null +++ b/StepFinal_Run_Server.bat @@ -0,0 +1 @@ +grunt devserver \ No newline at end of file diff --git a/StepTest_Test.bat b/StepTest_Test.bat new file mode 100644 index 00000000..cd325a3a --- /dev/null +++ b/StepTest_Test.bat @@ -0,0 +1 @@ +grunt \ No newline at end of file diff --git a/content/builddate.txt b/content/builddate.txt new file mode 100644 index 00000000..bb505474 --- /dev/null +++ b/content/builddate.txt @@ -0,0 +1 @@ +Thursday, March 16th, 2017, 12:53:09 EDT \ No newline at end of file diff --git a/content/editor.css b/content/editor.css new file mode 100644 index 00000000..0e6e7b83 --- /dev/null +++ b/content/editor.css @@ -0,0 +1 @@ +*{box-sizing:border-box}.tooltipster-default{box-sizing:content-box}.tooltipster-shadow{border-radius:5px;background-color:#eeeeee;box-shadow:0 0 14px rgba(0,0,0,0.3);color:#2c2c2c}.tooltipster-shadow .tooltipster-content{font-family:'Arial',sans-serif;font-size:14px;line-height:16px}body{margin:0;padding:0;font-size:24px;font-family:Lato,Verdana,Helvetica,sans-serif;line-height:28px;font-weight:400;overflow:hidden;position:fixed;height:100%;width:100%}#overlay{position:absolute;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.1);display:none;z-index:4}body.modal #overlay{display:block}#overlay .dialog{position:absolute;right:12px;top:68px;min-width:320px;display:table;margin:auto;border:none;background-color:#fff;box-shadow:0 0 7px #000;color:#000;border-radius:8px;font-family:inherit;font-size:18px;line-height:21px;padding:12px;text-align:center;overflow:hidden}#overlay .dialog.center{left:0;right:0;bottom:25vh;top:0;width:320px}#overlay .dialog.leftopts{right:50%;top:90px;min-width:215px}#overlay .dialog label.tooltipstered:hover{border:1px dotted #696969}#overlay .dialog label.tooltipstered{border:1px solid transparent;padding-right:5px}#guidepane{position:absolute;background:#1e90ff;width:50%;right:-50%;bottom:0;top:56px;z-index:2}#guidepane .guidetitle{padding:0 20px;color:#87ceeb;letter-spacing:2px}#guidepane .guidepreview{position:absolute;left:16px;right:0;bottom:0;top:28px;height:auto;width:auto;background:whitesmoke}#guidepane .guidepreview iframe{height:100%;width:100%;border:0}.framed #overlay .dialog{top:12px}#overlay .prompt{padding:8px}#overlay .info{padding:3px;color:red}#overlay .content{display:inline-block;padding:3px}#overlay .field{text-align:right;padding:3px;white-space:nowrap}.username{text-transform:lowercase}#overlay .fieldlink{display:block;text-align:left;font-size:70%;line-height:100%}#overlay .switchuser{text-decoration:none;font-size:90%}#overlay .switchuser:hover{text-decoration:underline}#overflow{position:absolute;top:0;left:0;width:100%;height:100%;overflow:hidden}#notification{position:absolute;top:12px;left:0;display:none;z-index:2;background-color:#ffd700;box-shadow:0 0 7px gray;color:#000;border-radius:8px;font-family:inherit;padding:3px 32px}#notification a:active{outline:2px dotted red}#top{position:absolute;top:0;left:0;right:0;width:100%;height:56px;table-layout:auto;overflow:visible;max-height:56px;border-spacing:0}#topleft,#topright{padding:0 12px;height:56px;vertical-align:middle}#topleft{overflow:hidden}#topright{text-align:right;overflow:visible;width:1%}#topright button,#overlay button{border:none;background-color:#fff;-moz-appearance:none !important;box-shadow:0 0 7px gray;font-size:16px;margin:5px;display:inline-block;line-height:24px;vertical-align:middle;height:28px;padding:2px 8px;color:#222;border-radius:8px;font-family:inherit}#topright button#save,#topright li#save2{padding-left:28px;background-image:url("/image/dpencil-16.png");background-repeat:no-repeat;background-position:8px center}#topright li#save2:hover{background-image:url("/image/dgpencil-16.png")}#topright button#save[disabled],#topright li#save2[disabled]{background-image:url("/image/dgpencil-16.png")}#topright button[disabled],#overlay button[disabled]{box-shadow:0 0 7px #a9a9a9;color:gray}#topright button:not([disabled]):hover,#overlay button:not([disabled]):hover,#overlay .zeroclipboard-is-hover{box-shadow:0 0 7px #000;color:black}#topright button.splitmenu{padding-right:28px;position:relative}#splitscreen>.splitscreenicon{display:block;height:16px;width:19px;background-image:url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTkiIGhlaWdodD0iMTYiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3QgeD0iMTAiIHk9IjEiIHdpZHRoPSI4IiBoZWlnaHQ9IjE0IiBzdHJva2U9IiMzMzMiIGZpbGw9Im5vbmUiIHN0cm9rZS13aWR0aD0iMiIvPjxwYXRoIGQ9Ik0wLDIgTDYsMiBNMCw2IEw4LDYgTTAsMTAgTDYsMTAgTTAsMTQgTDcsMTQiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzMzMyIgc3Ryb2tlLXdpZHRoPSIyIi8+PC9zdmc+")}#topright button .droparrow{position:absolute;right:0;top:0;height:28px;width:20px;padding:2px;line-height:24px;vertical-align:middle;border-left:1px solid darkgray;display:inline-block;color:#222;margin:0}#topright button .droparrow ul{list-style-type:none;display:none;position:absolute;left:-70px;border:0;white-space:nowrap;z-index:200;background:white;text-align:left;top:0;padding:0;margin:0;box-shadow:0 0 7px gray}#topright button .droparrow:active ul,#topright button .droparrow ul:hover{display:block}#topright button .droparrow ul li{padding:2px 8px}#topright button .droparrow ul li[disabled]{color:silver}#topright button .droparrow ul li:hover:not([disabled]){color:#eee;background:dodgerblue}#topright button .droparrow ul li:active:not([disabled]){color:white}#overlay a.quiet{color:blue;text-decoration:none}#overlay a.quiet:hover{text-decoration:underline}#filename[contentEditable]:hover{box-shadow:0 0 3px #a0522d}#owner,#filename,#folder{display:inline-block;vertical-align:middle;color:#8b4513;max-width:90%;max-height:56px;overflow:hidden;word-break:break-all;white-space:normal;border:0}#filename{padding:3px 2px 2px 2px}#owner{color:#000}#folder{margin:0 12px}.helplink{cursor:help}.helplink:hover{text-decoration:underline;color:blue}.panebox{overflow:hidden;position:absolute;top:56px;bottom:0}.framed .panebox{top:0}.panetitle{position:absolute;top:0;height:28px;width:100%;background:#1e90ff;padding:0;color:#87ceeb;letter-spacing:2px;border-left:1px solid #fff;border-right:1px solid #fff}.panetitle a{color:inherit;text-decoration:none;display:block}.panetitle a b{font-family:Courier New,monospace;font-size:34px;line-height:30px;font-weight:700;vertical-align:top}.panetitle a span{text-decoration:none}.panetitle a:hover{color:#fff}.panetitle a:active{color:red}.panetitle a:hover span{text-decoration:underline;color:#fff}.panetitle a:hover span[alt]:before{content:attr(alt)}.panetitle a:hover span[alt] span{display:none}.panetitle .blockicon,.panetitle .codeicon{display:inline-block;background-repeat:no-repeat;background-position:center;width:32px;height:28px;vertical-align:bottom;opacity:.6}.panetitle a:hover .blockicon,.panetitle a:hover .codeicon{vertical-align:bottom;opacity:1}.panetitle .blockicon{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAcCAYAAAAAwr0iAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAYdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuM4zml1AAAADBSURBVEjH7ZdbDoUwCETZl4tjaV0a96dGJQO0FVsT7yT8GMucvimJCK0M+iYAbT7ArukAjxtbAGcNz6Uj2MkKsQxg/66HnsWWNh0VQ4DAXEPcFV8AVFIGUUCSYvwbRe3KBgG8pCXB/MgzAJAVLwSoC2IqwHUvrgb4r4E3AcgEALF2QXQU40QZR3HjZSSZ5hAAXaEOGFOHmq5jr4GC6DIPARCE1SAqPh4bgVaD1mrJLMmyATzz1CnwALrfBXcK0V6AH0gNYFHIcN57AAAAAElFTkSuQmCC")}.panetitle .codeicon{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAcCAYAAAAAwr0iAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAYdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuM4zml1AAAACOSURBVEjH7ZY9DsAgCIU9V7eejKO/bh3AUhEiDLzExQT8+FEZAEbmkhsLUh0a7d+N614zjpA4rzQAAAKT4piLXACzw40AUwgLgBrJT5rpC9gM4Kh1A+wDaDW0AvAesgKQA4C2ACKi17KgArC7TwEAwl/tDJTogRK3oB+iBqjyHecOJOkj2dGh9KTSAUrpAUQvT3cWdmdvAAAAAElFTkSuQmCC")}.pane{position:absolute;top:28px;bottom:0;width:100%;background:#f5f5f5;border-left:1px solid #fff;border-right:1px solid #fff}.back{left:-50%;width:50%}.left{left:0;width:50%;z-index:1}.right{left:50%;width:50%;z-index:0}.rightpal{left:50vw;box-sizing:content-box;border-left:35px solid #dcdcdc}.ace_search.right{left:auto;width:60%;max-width:400px}#middle{z-index:3;display:none}body.modal #middle{visibility:hidden}#middle,.vcenter{position:absolute;top:50%;right:50%;margin-right:-28px}#middle.rightedge{right:38px}.framed #middle,.framed .vcenter{margin-top:-28px}.hcenter{margin:-50%}#run,#stop{border:0;background-color:rgba(255,255,255,0.7);opacity:.7;box-shadow:0 0 7px gray;color:#1e90ff;border-radius:20px;padding:10px;margin:0;display:inline-block}#run.quiet{box-shadow:none;opacity:.6;padding:0;margin:10px;border-radius:8px;background-color:transparent}#run:hover,#stop:hover,#run.quiet:hover{box-shadow:0 0 7px #000;opacity:.9;padding:10px;margin:0;border-radius:20px;background-color:rgba(255,255,255,0.8)}#run.pressed:hover,#stop.pressed:hover{box-shadow:0 0 14px #000;opacity:1}#run .triangle{width:0;height:0;font-size:0;line-height:0;border-bottom:19px solid transparent;border-top:19px solid transparent;border-left:36px solid #1e90ff;margin:-1px -4px -1px 4px}#run .reload{width:36px;height:36px;background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZlcnNpb249JzEuMScgd2lkdGg9JzM2JyBoZWlnaHQ9JzM2Jz48cGF0aCBkPSdNMjksMTEuNSBhMTMsMTMgMCAxLDAgMCwxMycgZmlsbD0nbm9uZScgc3Ryb2tlPSdkb2RnZXJibHVlJyBzdHJva2Utd2lkdGg9JzknLz48cGF0aCBkPSdNMTgsMTggbDE3LDAgbDAsLTE3IHonIGZpbGw9J2RvZGdlcmJsdWUnLz48L3N2Zz4=");background-position:center;opacity:.6}#run:hover .reload{opacity:1}#stop .square{width:0;height:0;font-size:0;line-height:0;border:14px solid #1e90ff;margin:4px 4px}body,.panetitle,#owner{user-select:none;-webkit-user-select:none;-moz-user-select:none;cursor:default}#owner:hover{text-decoration:underline}#folder:hover{border-radius:3px;box-shadow:0 0 6px #000}.editor{position:absolute;top:0;height:100%;left:0;width:100%;background-color:#fff;overflow:visible}.htmlmark:before,.cssmark:before,.jsmark:before{color:#8bf;font-size:60px;font-family:Arial,sans-serif;font-weight:700;pointer-events:none;opacity:.5;transition:opacity .3s;z-index:3;position:absolute;display:table;margin:auto;top:7px;bottom:0;text-align:center;right:6%}.htmlmark:hover:before,.cssmark:hover:before,.jsmark:hover:before{opacity:.15}.jsmark:before{content:'JS'}.htmlmark:before{content:'HTML'}.cssmark:before{content:'CSS'}#pencildoc .ace_editor{font-family:"Source Code Pro",Monaco,"Bitstream Vera Sans Mono","Lucida Console",Terminal,monospace;font-weight:500;line-height:121%}.debugerror{position:absolute;background:rgba(255,0,0,0.7);z-index:1}.debugtrace{position:absolute;background:#afeeee}.debugfocus{position:absolute;background:#ff0;z-index:2}div.guttermouseable{background-position:right;background-repeat:repeat-y;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAABCAYAAAAW/mTzAAAAEElEQVQIW2P8/5/hPwMaAAA38gL/hSCOCgAAAABJRU5ErkJggg==")}body#pencildoc #diigolet-csm{display:none !important}.fullscreen img{vertical-align:top;margin:2px 2px 3px 5px;opacity:.6}.fullscreen:hover img{opacity:1}.closeblocks{font-size:26px;font-weight:700;font-family:sans-serif;position:absolute;right:0;top:0;line-height:15px;padding:0 1px 2px;color:#87ceeb;z-index:2000;cursor:pointer}.blockmenu{position:absolute;top:-28px;height:28px;right:0;width:100%;padding:0 17px;color:#eee;background:#0D47A1;z-index:300}.blockmenuarrow{float:right;font-size:67%}.blockmenupopup{width:100%;position:absolute;left:0;top:28px;background:#fff;color:#0d47a1;border:1px solid #0d47a1;border-top:none;font-size:20px}.blockmenuitem[checked]:before{position:absolute;left:2px;font-size:75%;content:"\2713"}.blockmenuitem{padding:1px 17px;white-space:nowrap;overflow:hidden}.blockmenuitem:hover{color:white;background:#0D47A1}.droplet-dropdown-item{font-size:15px;line-height:1.3}.droplet-palette-wrapper{cursor:default;box-shadow:0 0 6px gray}.droplet-palette-wrapper:hover .closeblocks{color:#1e90ff}.droplet-palette-wrapper .closeblocks:hover{background:#1e90ff;color:#fff}.droplet-palette-wrapper .closeblocks:active{color:red;background:#1e90ff}.gear{display:none}.panebox.left .gear{display:inline-block;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAARBAMAAADJQ1rJAAAAFVBMVEUAAAD///////////////////////9Iz20EAAAABnRSTlMAr++f37+5/Na4AAAATElEQVQI12MAArM0AQYICEsLgLLU0hRAFHOSW1pamlMyAwNbGgQwMIilpQlACKa0RAYGxrQkoMK0BNwEQh1CL9w8hB0wezHcIgZ2HwD3DBrdizr+iAAAAABJRU5ErkJggg==");background-repeat:no-repeat;background-position:center;width:21px;opacity:.6}.langmenu:hover,.langmenu:hover .gear{color:#fff;opacity:1}.thumb-toggle:hover,.thumb-toggle:hover .fa{color:#fff;opacity:1}.preview{height:100%;overflow:hidden;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAZCAMAAADzN3VRAAAABlBMVEXS8OD///9kZDOcAAAAI0lEQVR42u3OIQ4AAAzCQPj/p7EYksmRUHeuoDXcEXvwVgkB3egCQVh7Ml4AAAAASUVORK5CYII=");background-position:center;border-left:1px dashed gainsboro}.preview iframe{height:100%;width:100%;border:none;margin:0;padding:0}.directory{height:100%;padding:10px;overflow:auto}.directory-searchable{padding-top:20px}.directory .column{display:inline-block;float:left;margin-top:12px}.directory .item{display:inline-block;float:left;clear:left;text-decoration:none;color:#222;cursor:pointer;width:154px}.directory .item div{margin:0;max-height:154px;padding:2px 0}.directory .item div span{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.directory .item div .caption{text-align:center}.directory .item div .thumbnail{background-color:#eeeeee;width:100px;height:100px;margin-top:16px;margin-left:27px;border:1px #ccc solid;border-radius:4px;padding:2px}.directory .item:hover{text-decoration:underline;color:blue}.directory .item:hover div .thumbnail{padding:0;border-width:2px;border-color:#1679FF}.directory .item:hover span:not(.caption){display:table;text-decoration:underline;position:relative;background-color:#f5f5f5;padding-right:6px}.directory .create{color:#1e90ff}.directory .create div .thumbnail{border-style:dashed}.loading,#notification.loading{padding:0;box-shadow:0 0 7px gray;width:32px;height:32px;border-radius:16px;background-position:center;background-repeat:no-repeat;opacity:.7;background-color:#fff;background-image:url("data:image/gif;base64,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")}.protractor-label{padding:15px}.panetitle-extra{float:right}.droplet-toggle-button{text-decoration:none;color:inherit;cursor:pointer}.droplet-toggle-button:hover{text-decoration:underline;color:#fff}.gadget{position:fixed;z-index:3;border-radius:8px;border-bottom-right-radius:0;overflow:hidden;box-shadow:0 0 7px #000}.gadget .topbar{width:100%;height:36px;margin:0;padding-top:8px;padding-left:10px;background:#f5f5f5;overflow:hidden;cursor:move;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.gadget .topbar button{position:relative;z-index:1;margin:0;padding:2px 8px;height:28px;background:#fff;border:0;border-top-right-radius:8px;border-top-left-radius:8px;box-shadow:0 0 7px gray;font-size:18px;text-decoration:none}.gadget .closer{position:absolute;top:0;right:0;color:#1e90ff;padding:3px 15px;float:right;cursor:pointer;height:36px}.gadget .closer:after{content:'\2715'}.gadget .closer:hover{background:#1e90ff;color:#fff;box-shadow:0 0 7px #000}.gadget .sizer{position:absolute;z-index:1000;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 20px 20px;border-color:transparent transparent #1e90ff;cursor:nwse-resize}.gadget .body{box-shadow:0 0 7px gray;position:absolute;top:36px;bottom:0;width:100%}.gadget.minimized{height:auto;width:auto;box-shadow:0 0 7px gray}.gadget.minimized .topbar{padding:0;height:auto}.gadget.minimized .closer{display:none}.gadget.minimized .sizer{border-width:0 0 10px 10px;cursor:default}.hpanelbox{position:absolute;top:0;left:0;right:0;bottom:0}.hpanel{position:relative;top:0;left:0;height:100%;width:100%;border-top:7px solid #cdf;cursor:row-resize}.hpanel:nth-of-type(1){border-top:none}.hoverlay{cursor:row-resize;position:fixed;top:0;left:0;right:0;bottom:0;z-index:999999}#pencildoc .droplet-palette-element{background-color:#fffde7}#pencildoc .droplet-palette-header{border:0;background-color:#fffde7}#pencildoc .droplet-palette-group-header{font-family:Lato,Verdana,Helvetica,sans-serif;font-size:16px;line-height:22px;padding-left:3px;color:#696969}#pencildoc .droplet-palette-group-header:not(.droplet-palette-group-header-selected):hover{background-color:#fff}#pencildoc .droplet-palette-group-header:active{color:#000}#pencildoc .droplet-palette-header-row{height:22px}#pencildoc .droplet-palette-group-header-selected:hover{font-weight:400}#pencildoc .droplet-palette-group-header-selected{font-weight:400;color:#000}#pencildoc .ace_gutter,#pencildoc .droplet-gutter{background-color:#f5f5f5}.droplet-palette-scroller::-webkit-scrollbar{width:13px;height:13px}.droplet-palette-scroller::-webkit-scrollbar-thumb{background-color:#fff59d;border:2px solid #fffde7}.droplet-palette-scroller:hover::-webkit-scrollbar-thumb{background-color:#fdd835;border:2px solid #fffde7}.texttoggle,.blocktoggle{position:absolute;width:32px;height:42px;background-color:#fffde7;bottom:25%;border-bottom-right-radius:5px;border-top-right-radius:5px;overflow:hidden;white-space:nowrap;transition:right .3s,width .3s;font-size:12px;font-family:Lato,Verdana,Helvetica,sans-serif;font-weight:400;line-height:100%;box-shadow:0 0 6px gray;cursor:default}.texttoggle .slide,.blocktoggle .slide{display:inline-block;position:absolute;top:6px;right:6px;bottom:6px;width:75px;text-align:right}.texttoggle .info,.blocktoggle .info{display:inline-block;white-space:normal;width:50px;text-align:center;vertical-align:top;padding:3px}.texttoggle{right:-32px}.texttoggle .slide:after{content:url(/image/textmode.png)}.texttoggle .info:before{content:'click for text'}.texttoggle:hover{width:80px;right:-80px}.textonly .blocktoggle,.notoggletab .texttoggle,.notoggletab .blocktoggle{display:none}.blocktoggle{left:0;z-index:257}.blocktoggle .slide:after{content:url(/image/blockmode.png)}.blocktoggle:hover{width:80px}.blocktoggle .info:before{content:'click for blocks'}#pencildoc .droplet-palette-canvas{background-color:#fffde7}.droplet-palette-group-header.blue{border-left:10px solid #8fbfef}.droplet-palette-group-header-selected.blue{background-color:#8fbfef}.droplet-palette-group-header.green{border-left:10px solid #8cec79}.droplet-palette-group-header-selected.green{background-color:#8cec79}.droplet-palette-group-header.orange{border-left:10px solid #efcf8f}.droplet-palette-group-header-selected.orange{background-color:#efcf8f}.droplet-palette-group-header.violet{border-left:10px solid #bfa6f2}.droplet-palette-group-header-selected.violet{background-color:#bfa6f2}.droplet-palette-group-header.red{border-left:10px solid #f2a6a6}.droplet-palette-group-header-selected.red{background-color:#f2a6a6}.droplet-palette-group-header.yellow{border-left:10px solid #ecec79}.droplet-palette-group-header-selected.yellow{background-color:#ecec79}.droplet-palette-group-header.quantumlightblue{border-left:10px solid #81d4fa}.droplet-palette-group-header-selected.quantumlightblue{background-color:#81d4fa}.droplet-palette-group-header.quantumpink{border-left:10px solid #F8BBD0}.droplet-palette-group-header-selected.quantumpink{background-color:#F8BBD0}.droplet-palette-group-header.quantumpurple{border-left:10px solid #CE93D8}.droplet-palette-group-header-selected.quantumpurple{background-color:#CE93D8}.droplet-palette-group-header.quantumdeeppurple{border-left:10px solid #B39DDB}.droplet-palette-group-header-selected.quantumdeeppurple{background-color:#B39DDB}.droplet-palette-group-header.quantumindigo{border-left:10px solid #9FA8DA}.droplet-palette-group-header-selected.quantumindigo{background-color:#9FA8DA}.droplet-palette-group-header.quantumcyan{border-left:10px solid #80DEEA}.droplet-palette-group-header-selected.quantumcyan{background-color:#80DEEA}.droplet-palette-group-header.quantumteal{border-left:10px solid #80CBC4}.droplet-palette-group-header-selected.quantumteal{background-color:#80CBC4}.droplet-palette-group-header.quantumlightgreen{border-left:10px solid #C5E1A5}.droplet-palette-group-header-selected.quantumlightgreen{background-color:#C5E1A5}.droplet-palette-group-header.quantumlime{border-left:10px solid #E6EE9C}.droplet-palette-group-header-selected.quantumlime{background-color:#E6EE9C}.droplet-palette-group-header.quantumyellow{border-left:10px solid #FFF59D}.droplet-palette-group-header-selected.quantumyellow{background-color:#FFF59D}.droplet-palette-group-header.quantumorange{border-left:10px solid #FFCC80}.droplet-palette-group-header-selected.quantumorange{background-color:#FFCC80}.droplet-palette-group-header.quantumdeeporange{border-left:10px solid #FFAB91}.droplet-palette-group-header-selected.quantumdeeporange{background-color:#FFAB91}.search-file{position:relative;color:#aaa;font-size:16px;z-index:3}.search-results{padding-top:30px}.search-file input[type="text"]{display:block;margin:0;width:100%;font-family:sans-serif;font-size:10px;box-shadow:none;border-radius:none;padding:10px;border:none;border-bottom:solid 2px #c9c9c9;transition:border .3s;color:#a9a9a9;text-indent:32px}.search-file input[type="text"]:focus{border-bottom:solid 2px dodgerblue;font-size:15px;outline:none;color:dodgerblue;padding:7px}.search-file .fa-search{position:absolute;top:7px;left:10px}.search-file input[type="text"]:focus+.fa-search{color:dodgerblue}.thick-bar{padding-left:12px;padding-right:12px}.blue-bar-icons-list{margin:0;list-style:none;display:inline-flex} \ No newline at end of file diff --git a/content/lib/droplet.js b/content/lib/droplet.js index 3263c200..633c5b0c 100644 --- a/content/lib/droplet.js +++ b/content/lib/droplet.js @@ -63400,6 +63400,7 @@ hook('mousedown', 1, function(point, event, state) { this.dumpNodeForDebug(hitTestResult, line); } if (hitTestResult != null) { + this.blockFrom = "editor"; this.clickedBlock = hitTestResult; this.clickedBlockPaletteEntry = null; this.setCursor(this.clickedBlock.start.next); @@ -63973,6 +63974,7 @@ hook('mousedown', 6, function(point, event, state) { entry = ref3[j]; hitTestResult = this.hitTest(palettePoint, entry.block, this.paletteView); if (hitTestResult != null) { + this.blockFrom = "palette"; this.clickedBlock = entry.block; this.clickedPoint = point; this.clickedBlockPaletteEntry = entry; @@ -65880,11 +65882,39 @@ hook('mousedown', 10, function() { }); Editor.prototype.endDrag = function() { + this.draggingBlock.start.next._value; + var WhereDropped = "Dropped into Palette, "; + if (this.lastHighlight == null) { + WhereDropped = "Dropped into Palette, "; + } + else if (this.lastHighlight.type == "document") { + WhereDropped = "Dropped into top of Editor, "; + } + else if (this.lastHighlight.type == "socket") { + WhereDropped = "Dropped into Socket, " + } + else { + WhereDropped = "Dropped into Editor, "; + } + var node = this.draggingBlock.start; + var blockString = "[' " + while(node.next != null){ + if(node.type === "text"){ + blockString += node._value + " "; + } + node = node.next; + } + blockString += "'], " + WhereDropped; + //this.blockFrom = "palette"; + blockString += "Taken from " + this.blockFrom; + console.log(blockString); + $.get('/log/' + "BlockDropped", blockString); if (this.cursorAtSocket()) { this.setCursor(this.cursor, function(x) { return x.type !== 'socketStart'; }); } + var val = this.draggingBlock.start.next._value; this.draggingBlock = null; this.draggingOffset = null; this.lastHighlight = null; diff --git a/content/lib/font-awesome.css b/content/lib/font-awesome.css new file mode 100644 index 00000000..2af3612b --- /dev/null +++ b/content/lib/font-awesome.css @@ -0,0 +1,4 @@ +/*! + * Font Awesome 4.3.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:'FontAwesome';src:url('https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.3.0/fonts/fontawesome-webfont.eot?v=4.3.0');src:url('https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.3.0/fonts/fontawesome-webfont.eot?#iefix&v=4.3.0') format('embedded-opentype'),url('https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.3.0/fonts/fontawesome-webfont.woff2?v=4.3.0') format('woff2'),url('https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.3.0/fonts/fontawesome-webfont.woff?v=4.3.0') format('woff'),url('https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.3.0/fonts/fontawesome-webfont.ttf?v=4.3.0') format('truetype'),url('https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.3.0/fonts/fontawesome-webfont.svg?v=4.3.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0, 0)}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-genderless:before,.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"} \ No newline at end of file diff --git a/content/lib/pc_py_wrapper.js b/content/lib/pc_py_wrapper.js index e7fea0cf..6389f2b9 100644 --- a/content/lib/pc_py_wrapper.js +++ b/content/lib/pc_py_wrapper.js @@ -17,11 +17,13 @@ var $builtinmodule = function (name) { // The doc string cannot be added in code as is usually done in Python, so we set it manually here. mod.__doc__ = "This module provides implemention of the Pencil Code internal functions in Python."; + mod.Window = window + // Sk.builtin.func creates a Python function out of a JS function mod.addalemon = new Sk.builtin.func(function (data) { // Check arguments: func name, arguments passed, min number, max number Sk.builtin.pyCheckArgs("dumps", arguments, 1, 1); - return data.v + " with a lemon"; // Data comes in as a Python string; we have to use the value (v) in JS + return Sk.ffi.remapToJs(data) + " with a lemon"; }); //MOVE @@ -29,57 +31,41 @@ var $builtinmodule = function (name) { mod.fd = new Sk.builtin.func(function (sprite, distance) { Sk.builtin.pyCheckArgs("fd", arguments, 2, 2); if (sprite/* turtle */ === Sk.builtin.none.none$) { - return fd(distance.v); + return fd(Sk.ffi.remapToJs(distance)); } - return sprite.fd(distance.v); + return sprite.fd(Sk.ffi.remapToJs(distance)); }); mod.bk = new Sk.builtin.func(function (sprite, distance) { Sk.builtin.pyCheckArgs("bk", arguments, 2, 2); if (sprite === Sk.builtin.none.none$) { - return bk(distance.v); - } - return sprite.bk(distance.v); - }); - - mod.rt = new Sk.builtin.func(function (sprite, angle) { - Sk.builtin.pyCheckArgs("rt", arguments, 2, 2); - if (sprite === Sk.builtin.none.none$) { - return rt(angle.v); + return bk(Sk.ffi.remapToJs(distance)); } - return sprite.rt(angle.v); - }); - - mod.lt = new Sk.builtin.func(function (sprite, angle) { - Sk.builtin.pyCheckArgs("lt", arguments, 2, 2); - if (sprite === Sk.builtin.none.none$) { - return lt(angle.v); - } - return sprite.lt(angle.v); + return sprite.bk(Sk.ffi.remapToJs(distance)); }); mod.ra = new Sk.builtin.func(function (sprite, radius, angle) { Sk.builtin.pyCheckArgs("rt", arguments, 2, 3); if (sprite === Sk.builtin.none.none$) { - return rt((radius).v, angle.v); + return rt(Sk.ffi.remapToJs(radius), Sk.ffi.remapToJs(angle)); } - return sprite.rt((radius).v, angle.v); + return sprite.rt(Sk.ffi.remapToJs(radius), Sk.ffi.remapToJs(angle)); }); mod.la = new Sk.builtin.func(function (sprite, radius, angle) { Sk.builtin.pyCheckArgs("lt", arguments, 2, 3); if (sprite === Sk.builtin.none.none$) { - return lt((radius).v, angle.v); + return lt(Sk.ffi.remapToJs(radius), Sk.ffi.remapToJs(angle)); } - return sprite.lt((radius).v, angle.v); + return sprite.lt(Sk.ffi.remapToJs(radius), Sk.ffi.remapToJs(angle)); }); mod.speed = new Sk.builtin.func(function (sprite, value) { Sk.builtin.pyCheckArgs("speed", arguments, 2, 2); if (sprite === Sk.builtin.none.none$) { - return speed(value.v); + return speed(Sk.ffi.remapToJs(value)); } - return sprite.speed(value.v); + return sprite.speed(Sk.ffi.remapToJs(value)); }); mod.home = new Sk.builtin.func(function (sprite) { @@ -93,49 +79,57 @@ var $builtinmodule = function (name) { mod.turnto = new Sk.builtin.func(function (sprite, value) { Sk.builtin.pyCheckArgs("turnto", arguments, 2, 3); if (sprite === Sk.builtin.none.none$) { - return turnto(value.v); + return turnto(Sk.ffi.remapToJs(value)); } - return sprite.turnto(value.v); + return sprite.turnto(Sk.ffi.remapToJs(value)); }); mod.moveto = new Sk.builtin.func(function (sprite, value1, value2) { Sk.builtin.pyCheckArgs("moveto", arguments, 3, 3); if (sprite === Sk.builtin.none.none$) { - return moveto(value1.v, value2.v); + return moveto(Sk.ffi.remapToJs(value1), Sk.ffi.remapToJs(value2)); } - return sprite.moveto(value1.v, value2.v); + return sprite.moveto(Sk.ffi.remapToJs(value1), Sk.ffi.remapToJs(value2)); }); mod.movexy = new Sk.builtin.func(function (sprite, value1, value2) { Sk.builtin.pyCheckArgs("movexy", arguments, 3, 3); if (sprite === Sk.builtin.none.none$) { - return movexy(value1.v, value2.v); + return movexy(Sk.ffi.remapToJs(value1), Sk.ffi.remapToJs(value2)); } - return sprite.movexy(value1.v, value2.v); + return sprite.movexy(Sk.ffi.remapToJs(value1), Sk.ffi.remapToJs(value2)); }); mod.jumpto = new Sk.builtin.func(function (sprite, value1, value2) { Sk.builtin.pyCheckArgs("jumpto", arguments, 3, 3); if (sprite === Sk.builtin.none.none$) { - return jumpto(value1.v, value2.v); + return jumpto(Sk.ffi.remapToJs(value1), Sk.ffi.remapToJs(value2)); } - return sprite.jumpto(value1.v, value2.v); + return sprite.jumpto(Sk.ffi.remapToJs(value1), Sk.ffi.remapToJs(value2)); }); mod.jumpxy = new Sk.builtin.func(function (sprite, value1, value2) { Sk.builtin.pyCheckArgs("jumpxy", arguments, 3, 3); if (sprite === Sk.builtin.none.none$) { - return jumpxy(value1.v, value2.v); + return jumpxy(Sk.ffi.remapToJs(value1), Sk.ffi.remapToJs(value2)); } - return sprite.jumpxy(value1.v, value2.v); + return sprite.jumpxy(Sk.ffi.remapToJs(value1), Sk.ffi.remapToJs(value2)); }); mod.pause = new Sk.builtin.func(function (sprite, value) { Sk.builtin.pyCheckArgs("pause", arguments, 2, 2); if (sprite === Sk.builtin.none.none$) { - return pause(value); + return pause(Sk.ffi.remapToJs(value)); } - return sprite.pause(value); + return sprite.pause(Sk.ffi.remapToJs(value)); + }); + + mod.getxy = new Sk.builtin.func(function (sprite) { + Sk.builtin.pyCheckArgs("getxy", arguments, 1, 1); + if (sprite === Sk.builtin.none.none$) { + return new Sk.ffi.remapToPy(getxy()); + } + return new Sk.ffi.remapToPy(sprite.getxy()); }); //Control @@ -144,56 +138,73 @@ var $builtinmodule = function (name) { mod.button = new Sk.builtin.func(function (sprite, buttonclick, callee) { Sk.builtin.pyCheckArgs("button", arguments, 3, 3); if (sprite === Sk.builtin.none.none$) { - return button(buttonclick.v, function () { Sk.misceval.callsim(callee); } ); + return button(Sk.ffi.remapToJs(buttonclick), function () { Sk.misceval.callsim(callee); } ); } - //return sprite.button(buttonclick.v, function () { Sk.misceval.callsim(callee); } ); + //return sprite.button(Sk.ffi.remapToJs(buttonclick), function () { Sk.misceval.callsim(callee); } ); }); - mod.click = new Sk.builtin.func(function (sprite, fn) { + mod.click = new Sk.builtin.func(function (sprite, func) { Sk.builtin.pyCheckArgs("click", arguments, 2, 2); if (sprite === Sk.builtin.none.none$) { - return click( function () { Sk.misceval.callsim(fn); } ); + return click(function(eventData){ + var data = [eventData.x, eventData.y]; + Sk.misceval.callsim(func, Sk.ffi.remapToPy(data)); } ); } //return sprite.click( function () { Sk.misceval.callsim(fn); } ); }); - mod.keydown = new Sk.builtin.func(function (sprite, key) { - Sk.builtin.pyCheckArgs("keydown", arguments, 2, 2); + mod.forever = new Sk.builtin.func(function (func) { + Sk.builtin.pyCheckArgs("forever", arguments, 1, 1); + return forever(function(){ Sk.misceval.callsim(func); } ); + }); + + mod.tick = new Sk.builtin.func(function (tps, func) { + Sk.builtin.pyCheckArgs("tick", arguments, 2, 2); + return tick(Sk.ffi.remapToJs(tps), function(){Sk.misceval.callsim(func)}); + }); + + mod.keydown = new Sk.builtin.func(function (sprite, key, func) { + Sk.builtin.pyCheckArgs("keydown", arguments, 3, 3); if (sprite === Sk.builtin.none.none$) { - return keydown(function () { Sk.misceval.callsim(key); }); + return keydown(Sk.ffi.remapToJs(key), function(){Sk.misceval.callsim(func)}); } //return sprite.keydown(function () { Sk.misceval.callsim(key); }); }); - mod.keyup = new Sk.builtin.func(function (sprite, key) { + mod.keyup = new Sk.builtin.func(function (sprite, key, func) { Sk.builtin.pyCheckArgs("keyup", arguments, 2, 2); if (sprite === Sk.builtin.none.none$) { - return keyup(function () { Sk.misceval.callsim(key); }); + return keyup(Sk.ffi.remapToJs(key), function () { Sk.misceval.callsim(func); }); } //return sprite.keyup(function () { Sk.misceval.callsim(key); }); }); + mod.pressed = new Sk.builtin.func(function (key) { + Sk.builtin.pyCheckArgs("pressed", arguments, 1, 1); + return Sk.ffi.remapToPy(pressed(Sk.ffi.remapToJs(key))); + }); + //Sound///////////// mod.play = new Sk.builtin.func(function (sprite, note) { Sk.builtin.pyCheckArgs("play", arguments, 2, 2); if (sprite === Sk.builtin.none.none$) { - return play(note.v); + return play(Sk.ffi.remapToJs(note)); } - return sprite.play(note.v); + return sprite.play(Sk.ffi.remapToJs(note)); }); //mod.tone3 = new Sk.builtin.func(function (a, b, c) { // Sk.builtin.pyCheckArgs("tone", arguments, 3, 3); - // return tone(a.v, b.v, c.v); + // return tone(Sk.ffi.remapToJs(a), Sk.ffi.remapToJs(b), Sk.ffi.remapToJs(c)); //}); mod.tone = new Sk.builtin.func(function (sprite, a, b, c) { Sk.builtin.pyCheckArgs("tone", arguments, 3, 4); if (sprite === Sk.builtin.none.none$) { - return tone(a.v, b.v, c.v); + return tone(Sk.ffi.remapToJs(a), Sk.ffi.remapToJs(b), Sk.ffi.remapToJs(c)); } - return sprite.tone(a.v, b.v, c.v); + return sprite.tone(Sk.ffi.remapToJs(a), Sk.ffi.remapToJs(b), Sk.ffi.remapToJs(c)); }); mod.silence = new Sk.builtin.func(function (sprite) { @@ -207,30 +218,30 @@ var $builtinmodule = function (name) { mod.say = new Sk.builtin.func(function (sprite, a) { Sk.builtin.pyCheckArgs("say", arguments, 2, 2); if (sprite === Sk.builtin.none.none$) { - return say(a.v); + return say(Sk.ffi.remapToJs(a)); } - return sprite.say(a.v); + return sprite.say(Sk.ffi.remapToJs(a)); }); // TEXT METHODS ///////////////////////////////////////////////////////// mod.write = new Sk.builtin.func(function (message) { Sk.builtin.pyCheckArgs("write", arguments, 1, 1); - return write(message.v); + return write(Sk.ffi.remapToJs(message)); }); mod.debug = new Sk.builtin.func(function (object) { Sk.builtin.pyCheckArgs("debug", arguments, 1, 1); - return debug(object.v); + return debug(Sk.ffi.remapToJs(object)); }); mod.type = new Sk.builtin.func(function (message) { Sk.builtin.pyCheckArgs("type", arguments, 1, 1); - return type(message.v); + return type(Sk.ffi.remapToJs(message)); }); mod.typebox = new Sk.builtin.func(function (color) { Sk.builtin.pyCheckArgs("typebox", arguments, 1, 1); - return typebox(color.v); + return typebox(Sk.ffi.remapToJs(color)); }); mod.typeline = new Sk.builtin.func(function () { @@ -240,7 +251,7 @@ var $builtinmodule = function (name) { mod.label = new Sk.builtin.func(function (name) { Sk.builtin.pyCheckArgs("label", arguments, 1, 1); - return label(name.v); + return label(Sk.ffi.remapToJs(name)); }); /*mod.await = new Sk.builtin.func(function (lambda_expression) { @@ -248,21 +259,38 @@ var $builtinmodule = function (name) { return await(lambda_expression.v); });*/ - mod.read = new Sk.builtin.func(function (prompt) { - Sk.builtin.pyCheckArgs("read", arguments, 1, 1); - return read(prompt.v); + mod.read = new Sk.builtin.func(function (prompt, func) { + Sk.builtin.pyCheckArgs("read", arguments, 2, 2); + if(func == Sk.builtin.none.none$) + { + return Sk.ffi.remapToPy(read(Sk.ffi.remapToJs(prompt))); + } + return Sk.ffi.remapToPy(read(Sk.ffi.remapToJs(prompt), function (w) { Sk.misceval.callsim(func, Sk.ffi.remapToPy(w)); })); }); - mod.readnum = new Sk.builtin.func(function (prompt) { - Sk.builtin.pyCheckArgs("readnum", arguments, 1, 1); - return readnum(prompt.v); + mod.readnum = new Sk.builtin.func(function (prompt, func) { + Sk.builtin.pyCheckArgs("readnum", arguments, 2, 2); + if(func == Sk.builtin.none.none$) + { + return Sk.ffi.remapToPy(readnum(Sk.ffi.remapToJs(prompt))); + } + return Sk.ffi.remapToPy(readnum(Sk.ffi.remapToJs(prompt), function (w) { Sk.misceval.callsim(func, Sk.ffi.remapToPy(w)); })); + }); + + mod.readstr = new Sk.builtin.func(function (prompt, func) { + Sk.builtin.pyCheckArgs("readstr", arguments, 2, 2); + if(func == Sk.builtin.none.none$) + { + return Sk.ffi.remapToPy(readstr(Sk.ffi.remapToJs(prompt))); + } + return Sk.ffi.remapToPy(readstr(Sk.ffi.remapToJs(prompt), function (w) { Sk.misceval.callsim(func, Sk.ffi.remapToPy(w)); })); }); //SPRITES///////////////// mod.Turtle = new Sk.builtin.func(function (value) { Sk.builtin.pyCheckArgs("Turtle", arguments, 1, 1); - return new Turtle(value.v); + return new Turtle(Sk.ffi.remapToJs(value)); }); mod.Sprite = new Sk.builtin.func(function () { @@ -272,7 +300,7 @@ var $builtinmodule = function (name) { // mod.Piano = new Sk.builtin.func(function (keys) { // Sk.builtin.pyCheckArgs("Piano", arguments, 1, 1); -// return new Piano(keys.v); +// return new Piano(Sk.ffi.remapToJs(keys)); // }); mod.Piano = new Sk.builtin.func(function () { Sk.builtin.pyCheckArgs("Piano", arguments, 0, 0); @@ -283,7 +311,25 @@ var $builtinmodule = function (name) { Sk.builtin.pyCheckArgs("Pencil", arguments, 0, 0); return new Pencil(); }); + + mod.copy = new Sk.builtin.func(function () { + Sk.builtin.pyCheckArgs("copy", arguments, 0, 0); + return new copy(); + }); + + mod.table = new Sk.builtin.func(function (rows, columns) { + Sk.builtin.pyCheckArgs("table", arguments, 2, 2); + return new table(Sk.ffi.remapToJs(rows), Sk.ffi.remapToJs(columns)); + }); + mod.cell = new Sk.builtin.func(function (sprite, rows, columns) { + Sk.builtin.pyCheckArgs("cell", arguments, 3, 3); + if(sprite === Sk.builtin.none.none$){ + return cell(Sk.ffi.remapToJs(rows), Sk.ffi.remapToJs(columns)); + } + return new sprite.cell(Sk.ffi.remapToJs(rows), Sk.ffi.remapToJs(columns)); + }); + //ART////// mod.hide = new Sk.builtin.func(function (sprite) { @@ -345,68 +391,121 @@ var $builtinmodule = function (name) { mod.pen = new Sk.builtin.func(function (sprite, color, size) { Sk.builtin.pyCheckArgs("pen", arguments, 3, 3); if (sprite === Sk.builtin.none.none$) { - return pen(color.v, size.v); + return pen(Sk.ffi.remapToJs(color), Sk.ffi.remapToJs(size)); } - return sprite.pen(color.v, size.v); + return sprite.pen(Sk.ffi.remapToJs(color), Sk.ffi.remapToJs(size)); }); mod.dot = new Sk.builtin.func(function (sprite, color, dia) { Sk.builtin.pyCheckArgs("dot", arguments, 3, 3); if (sprite === Sk.builtin.none.none$) { - return dot(color.v, dia.v); + return dot(Sk.ffi.remapToJs(color), Sk.ffi.remapToJs(dia)); } - return sprite.dot(color.v, dia.v); + return sprite.dot(Sk.ffi.remapToJs(color), Sk.ffi.remapToJs(dia)); }); mod.box = new Sk.builtin.func(function (sprite, color, size) { Sk.builtin.pyCheckArgs("box", arguments, 3, 3); if (sprite === Sk.builtin.none.none$) { - return box(color.v, size.v); + return box(Sk.ffi.remapToJs(color), Sk.ffi.remapToJs(size)); } - return sprite.box(color.v, size.v); + return sprite.box(Sk.ffi.remapToJs(color), Sk.ffi.remapToJs(size)); }); mod.fill = new Sk.builtin.func(function (sprite, color) { Sk.builtin.pyCheckArgs("dot", arguments, 2, 2); if (sprite === Sk.builtin.none.none$) { - return fill(color.v); + return fill(Sk.ffi.remapToJs(color)); } - return sprite.fill(color.v); + return sprite.fill(Sk.ffi.remapToJs(color)); + }); + + mod.img = new Sk.builtin.func(function (sprite, pic) { + Sk.builtin.pyCheckArgs("img", arguments, 2, 2); + if (sprite === Sk.builtin.none.none$) { + return img(Sk.ffi.remapToJs(pic)); + } + return new sprite.img(Sk.ffi.remapToJs(pic)); }); mod.wear = new Sk.builtin.func(function (sprite, color) { Sk.builtin.pyCheckArgs("wear", arguments, 2, 2); if (sprite === Sk.builtin.none.none$) { - return wear(color.v); + return wear(Sk.ffi.remapToJs(color)); } - return sprite.wear(color.v); + return sprite.wear(Sk.ffi.remapToJs(color)); }); mod.grow = new Sk.builtin.func(function (sprite, size) { Sk.builtin.pyCheckArgs("grow", arguments, 2, 2); if (sprite === Sk.builtin.none.none$) { - return grow(size.v); + return grow(Sk.ffi.remapToJs(size)); } - return sprite.grow(size.v); + return sprite.grow(Sk.ffi.remapToJs(size)); }); mod.drawon = new Sk.builtin.func(function (sprite, canvas) { Sk.builtin.pyCheckArgs("drawon", arguments, 2, 2); if (sprite === Sk.builtin.none.none$) { - return drawon(canvas.v); + return drawon(Sk.ffi.remapToJs(canvas)); } - return sprite.drawon(canvas.v); + return sprite.drawon(Sk.ffi.remapToJs(canvas)); }); - + + mod.arrow = new Sk.builtin.func(function (sprite, color, size) { + Sk.builtin.pyCheckArgs("arrow", arguments, 3, 3); + if (sprite === Sk.builtin.none.none$) { + return arrow(Sk.ffi.remapToJs(color), Sk.ffi.remapToJs(size)); + } + return sprite.arrow(Sk.ffi.remapToJs(color), Sk.ffi.remapToJs(size)); + }); + + mod.shown = new Sk.builtin.func(function (sprite) { + Sk.builtin.pyCheckArgs("shown", arguments, 1, 1); + if (sprite === Sk.builtin.none.none$) { + return Sk.ffi.remapToPy(shown()); + } + return Sk.ffi.remapToPy(shown()); + }); + + mod.hidden = new Sk.builtin.func(function (sprite) { + Sk.builtin.pyCheckArgs("hidden", arguments, 1, 1); + if (sprite === Sk.builtin.none.none$) { + return Sk.ffi.remapToPy(hidden()); + } + return Sk.ffi.remapToPy(hidden()); + }); + + mod.touches = new Sk.builtin.func(function (sprite, obj) { + Sk.builtin.pyCheckArgs("touches", arguments, 2, 2); + if (sprite === Sk.builtin.none.none$) { + return Sk.ffi.remapToPy(touches(Sk.ffi.remapToJs(obj))); + } + return Sk.ffi.remapTOPy(sprite.touches(Sk.ffi.remapToJs(obj))); + }); + + mod.inside = new Sk.builtin.func(function (sprite, obj) { + Sk.builtin.pyCheckArgs("inside", arguments, 2, 2); + if(Sk.ffi.remapToJs(obj) == "window") + if (sprite === Sk.builtin.none.none$) { + return Sk.ffi.remapToPy(inside(window)); + } + return Sk.ffi.remapToPy(sprite.inside(window)); + if (sprite === Sk.builtin.none.none$) { + return Sk.ffi.remap.Py(inside(Sk.ffi.remapToJs(obj))); + } + return Sk.ffi.remap.Py(sprite.inside(Sk.ffi.remapToJs(obj))); + }); + //Operators mod.min = new Sk.builtin.func(function (value1, value2) { Sk.builtin.pyCheckArgs("min", arguments, 1, 2); - return min(value1.v, value2.v); + return min(Sk.ffi.remapToJs(value1), Sk.ffi.remapToJs(value2)); }); mod.random = new Sk.builtin.func(function (value) { Sk.builtin.pyCheckArgs("random", arguments, 1, 1); - return random(value.v); + return Sk.ffi.remapToPy(random(Sk.ffi.remapToJs(value))); }); return mod; diff --git a/content/lib/pencilcode.py b/content/lib/pencilcode.py index dc1dfbfc..b3500b3f 100644 --- a/content/lib/pencilcode.py +++ b/content/lib/pencilcode.py @@ -1,7 +1,18 @@ import pencilcode_internal +normal = 'normal' +uniform = 'uniform' +position = 'position' +color = 'color' +colour = 'color' +gray = 'gray' +grey = 'gray' +window = "window" + # The SpriteObject class wraps a jQuery-turtle object so it can be used in Python. # This includes Turtle, Sprite, Piano, and Pencil objects. + + class SpriteObject(): def __init__(self, jsSpriteObject): self.jsSpriteObject = jsSpriteObject @@ -16,17 +27,17 @@ def fd(self, distance): def bk(self, distance): pencilcode_internal.bk(self.jsSpriteObject, distance) - def rt(self, angle): - pencilcode_internal.rt(self.jsSpriteObject, angle) + def rt(self, angle, radius=0): + pencilcode_internal.ra(self.jsSpriteObject, angle, radius) - def lt(self, angle): - pencilcode_internal.lt(self.jsSpriteObject, angle) - - def ra(self, radius, angle): - pencilcode_internal.ra(self.jsSpriteObject, radius, angle) - - def la(self, radius, angle): - pencilcode_internal.la(self.jsSpriteObject, radius, angle) + def lt(self, angle, radius=0): + pencilcode_internal.la(self.jsSpriteObject, angle, radius) + + def ra(self, angle, radius=0): + pencilcode_internal.ra(self.jsSpriteObject, angle, radius) + + def la(self, angle, radius=0): + pencilcode_internal.la(self.jsSpriteObject, angle, radius) def speed(self, value): pencilcode_internal.speed(self.jsSpriteObject, value) @@ -37,7 +48,7 @@ def home(self): def turnto(self, value): pencilcode_internal.turnto(self.jsSpriteObject, value) - def moveto(self, x, y): + def moveto(self, x, y = None): pencilcode_internal.moveto(self.jsSpriteObject, x, y) def movexy(self, x, y): @@ -51,6 +62,9 @@ def jumpxy(self, x, y): def pause(self, value): pencilcode_internal.sleep(self.jsSpriteObject, value) + + def getxy(self): + return pencilcode_internal.getxy(self.jsSpriteObject) ###################### ## Control Commands ## @@ -58,7 +72,7 @@ def pause(self, value): def button(self, buttonClick, callee): pass#pencilcode_internal.button(self.jsSpriteObject, buttonClick, callee) - def keydown(self, key): + def keydown(self, func, key = None): pass#pencilcode_internal.keydown(self.jsSpriteObject, key) def click(self, t): @@ -95,11 +109,14 @@ def box(self, a, b): def grow(self, a): pencilcode_internal.grow(self.jsSpriteObject,a) - def pen(self, color, size): - pencilcode_internal.pen(self.jsSpriteObject,color, size) - - def dot(self, color, size): - pencilcode_internal.dot(self.jsSpriteObject,color, size) + def pen(self, color=None, size=None): + pencilcode_internal.pen(self.jsSpriteObject,color, size) + + def dot(self, color=None, size=None): + pencilcode_internal.dot(self.jsSpriteObject,color,size) + + def arrow(self, color, size): + pencilcode_internal.arrow(self.jsSpriteObject, color, size) def fill(self, color): pencilcode_internal.fill(self.jsSpriteObject,color) @@ -109,7 +126,23 @@ def wear(self, name): def drawon(self, path): pencilcode_internal.drawon(self.jsSpriteObject,path) - + + #def cell(self, rows, columns): + # pencilcode_internal.cell(self.jsSpriteObject, rows, columns) + + def shown(self): + return pencilcode_internal.shown(self.jsSpriteObject) + + def hidden(self): + return pencilcode_internal.hidden(self.jsSpriteObject) + + def touches(self): + return pencilcode_internal.touches(self.jsSpriteObject, obj) + + def inside(self): + return pencilcode_internal.inside(self.jsSpriteObject, obj) + + #################### ## Sound Commands ## #################### @@ -139,18 +172,19 @@ def fd(value): def bk(value): pencilcode_internal.bk(None, value) -def rt(value): - pencilcode_internal.rt(None, value) +def rt(angle, radius = 0): + pencilcode_internal.ra(None, angle, radius) -def lt(value): - pencilcode_internal.lt(None, value) +def lt(angle, radius = 0): + pencilcode_internal.la(None, angle, radius) -# Fix the rest, Stevie! ;)# All Done Jem! :) -def ra(radius, angle): - pencilcode_internal.ra(None, radius, angle) +def ra(angle, radius=0): + pencilcode_internal.ra(None, angle, radius) -def la(radius, angle): - pencilcode_internal.la(None, radius, angle) +def la(angle, radius=0): + pencilcode_internal.la(None, angle, radius) + +# Fix the rest, Stevie! ;)# All Done Jem! :) def speed(value): pencilcode_internal.speed(None, value) @@ -161,7 +195,7 @@ def home(): def turnto(value): pencilcode_internal.turnto(None, value) -def moveto(x, y): +def moveto(x, y = None): pencilcode_internal.moveto(None, x, y) def movexy(x, y): @@ -173,6 +207,9 @@ def jumpto(x, y): def jumpxy(x, y): pencilcode_internal.jumpxy(None, x, y) +def getxy(): + return pencilcode_internal.getxy(None) + def pause(value): pencilcode_internal.sleep(None, value) @@ -206,12 +243,18 @@ def box(a, b): def grow(a): pencilcode_internal.grow(None,a) + +def img(pic): + return SpriteObject(pencilcode_internal.img(None, pic)) -def pen(color, size): +def pen(color=None, size=None): pencilcode_internal.pen(None,color, size) -def dot(color, size): - pencilcode_internal.dot(None,color, size) +def dot(color=None, size=None): + pencilcode_internal.dot(None,color,size) + +def arrow(color, size): + pencilcode_internal.arrow(None, color, size) def fill(color): pencilcode_internal.fill(None,color) @@ -221,18 +264,44 @@ def wear(name): def drawon(path): pencilcode_internal.drawon(None,path) - + +def shown(): + return pencilcode_internal.shown(None) + +def hidden(): + return pencilcode_internal.hidden(None) + +def touches(obj): + return pencilcode_internal.touches(None, obj) + +def inside(obj): + return pencilcode_internal.touches(None, obj) + ################### ## Text Commands ## ################### -def write(message): +def write(*args): + x = 0 + message = '' + for arg in args: + message = message + arg + ' ' + x += 1 + if x == 0: + raise AssertionError('Too few arguments passed in to write()') pencilcode_internal.write(message) def debug(object): pencilcode_internal.debug(object) -def type(message): +def type(*args): + x = 0 + message = '' + for arg in args: + message = message + arg + x += 1 + if x == 0: + raise AssertionError('Too few arguments passed in to type()') pencilcode_internal.type(message) def typebox(color): @@ -248,11 +317,14 @@ def await(lamda_exp): # TODO - this might be tricky pass -def read(prompt): - pencilcode_internal.read(prompt) +def read(prompt, func = None): + return pencilcode_internal.read(prompt, func) -def readnum(prompt): - pencilcode_internal.readnum(prompt) +def readnum(prompt, func = None): + return pencilcode_internal.readnum(prompt, func) + +def readstr(prompt, func = None): + return pencilcode_internal.readstr(prompt, func) #################### ## Sound Commands ## @@ -278,12 +350,21 @@ def say(a): def button(buttonClick, callee): pencilcode_internal.button(None, buttonClick, callee) -def keydown(key): - pencilcode_internal.keydown(None, key) +def keydown(func, key = None): + pencilcode_internal.keydown(None, key, func) + +def pressed(key): + return pencilcode_internal.pressed(key) def click(t): pencilcode_internal.click(None, t) +def forever(func): + pencilcode_internal.forever(func) + +def tick(tps, func): + pencilcode_internal.tick(tps, func) + ###################### ## Sprites ## ###################### @@ -298,7 +379,16 @@ def Piano(): def Pencil(): return SpriteObject(pencilcode_internal.Pencil()) - + +def copy(): + return SpriteObject(pencilcode_internal.copy()) + +def table(rows, columns): + return SpriteObject(pencilcode_internal.table(rows, columns)) + +def cell(rows, columns): + return SpriteObject(pencilcode_internal.cell(None, rows, columns)) + ###################### ## Operators ## ###################### @@ -309,3 +399,5 @@ def random(a): def min(a, b = None): return pencilcode_internal.min(a,b) + + diff --git a/content/lib/pencilcodeembed.js b/content/lib/pencilcodeembed.js index 36c28d83..b8def0be 100644 --- a/content/lib/pencilcodeembed.js +++ b/content/lib/pencilcodeembed.js @@ -164,6 +164,7 @@ this.iframe = document.createElement('iframe'); this.iframe.style.width = '100%'; this.iframe.style.height = '100%'; + this.iframe.setAttribute('allow', 'autoplay'); this.div.appendChild(this.iframe); this.updatedCode = code; diff --git a/content/src/FontLoader.js b/content/src/FontLoader.js index f370611b..b2ff0f29 100644 --- a/content/src/FontLoader.js +++ b/content/src/FontLoader.js @@ -13,8 +13,8 @@ if (isIE) { } } -/** - * FontLoader detects when web fonts specified in the "fontFamiliesArray" array were loaded and rendered. Then it +/**FontLoader detects when web fonts specified in the "fontFamiliesArray" array were loaded and rendered. + *Then it * notifies the specified delegate object via "fontLoaded" and "fontsLoaded" methods when specific or all fonts were * loaded respectively. The use of this functions implies that the insertion of specified web fonts into the * document is done elsewhere. @@ -275,9 +275,7 @@ FontLoader.prototype = { } }; -/** - * Size object - * +/** Instantiates a Size object * @param width * @param height * @constructor @@ -287,8 +285,7 @@ function Size(width, height) { this.height = height; } -/** - * Compares receiver object to passed in size object. +/** Compares receiver object to passed in size object. * * @param otherSize * @returns {boolean} @@ -297,8 +294,8 @@ Size.prototype.isEqual = function(otherSize) { return (this.width === otherSize.width && this.height === otherSize.height); }; -/** - * SizeWatcher observes size of an element and notifies when its size is changed. It doesn't use any timeouts +/** SizeWatcher observes size of an element and notifies when its size is changed. + *It doesn't use any timeouts * to check the element size, when change in size occurs a callback method immediately invoked. * * To watch for element's size changes the element, and other required elements are appended to a container element diff --git a/content/src/advisor.js b/content/src/advisor.js index b5dbb3d5..0790efef 100644 --- a/content/src/advisor.js +++ b/content/src/advisor.js @@ -1,14 +1,24 @@ //////////////////////////////////////////////////////////////////////////r // ERROR MESSAGE ADVISOR SUPPORT /////////////////////////////////////////////////////////////////////////// - +/** Counts how many backslashes are in a line and returns the number found +* @param {string} line +* @param {int} offset +* @return {int} returns the number of backslashes in the line starting offset from the begining of it +*/ function backslashCount(line, offset) { for (var j = offset - 1; j > 0; --j) { if (line.charAt(j) != '//') break; } return offset - j - 1; } - +/** Finds the matching quote for the quote that's passed in, starting at offset +* @param {string} line +* @param {char} quoteChar +* @param {int} offset +* @param {bool} backslashable +* @return {int} returns the last position in line that is the first matching quote. +*/ function findMatchingQuote(line, quoteChar, offset, backslashable) { while (true) { var location = line.indexOf(quoteChar, offset); @@ -21,7 +31,10 @@ function findMatchingQuote(line, quoteChar, offset, backslashable) { } } -// Scan a program, locating +/** Scan a program, locating the first mismatched quote within the lines passed in +* @param {string[]} lines +* @return {int} first line in lines that has a mismached quote +**/ function firstLineWithMismatchedQuote(lines) { var quoteChar = null; var quoteLine = -1; @@ -63,6 +76,12 @@ function firstLineWithMismatchedQuote(lines) { return null; } +/** Takes in an error message and provdes advice on how to fix the error +* @param {string} msg +* @param {int} line +* @param {string} program +* @return {undefined} +**/ function errorAdvice(msg, line, program) { var advice, m, msg, r; var lines = program.split('\n'), index = line - 1, text = ''; diff --git a/content/src/cache.js b/content/src/cache.js index e692a0e1..99769754 100644 --- a/content/src/cache.js +++ b/content/src/cache.js @@ -15,9 +15,7 @@ var model = window.pencilcode.cache = { clear: clearCache }; -/** - * Initialize the cache object to the given - * name only if it's not available already. +/** Initialize the cache object to the given name only if it's not available already. * * @param {string} name * @returns {undefined} @@ -28,8 +26,7 @@ function initializeCache(name) { } } -/** - * Delete the cache object mapped with the given name +/** Delete the cache object mapped with the given name * * @param {string} name * @returns {undefined} @@ -38,16 +35,14 @@ function deleteCache(name) { delete cache[name]; } -/** - * Ceear the complete cache +/** Ceear the complete cache * @returns {undefined} */ function clearCache(){ cache = window.pencilcode.cacheObj = {}; } -/** - * Return the cached value mapped with the given name and key +/** Return the cached value mapped with the given name and key * * @param {string} cacheName * @param {string} key @@ -60,8 +55,7 @@ function get(cacheName, key) { return null; } -/** - * Save the given value mapped with the given name and key +/** Save the given value mapped with the given name and key * * @param {type} cacheName * @param {type} key diff --git a/content/src/codescan.js b/content/src/codescan.js index 1c474962..649ab55b 100644 --- a/content/src/codescan.js +++ b/content/src/codescan.js @@ -4,6 +4,10 @@ // looking for object names and /////////////////////////////////////////////////////////////////////////// +/** Scans multiline quotes and comments and omits those parts of the code in coffeescript code +* @param {string} code +* @returns {string} filtered code +*/ function stripCSMultiline(code) { // Really simple heuristic for coffeescript: // Just scan the multiline quote and comment delimeters, and @@ -46,6 +50,10 @@ function stripCSMultiline(code) { return keep.join(''); } +/** Builds a list of objects in coffeescript code +* @param {string} code +* @returns {string[]} +*/ function coffeeObjects(code) { code = stripCSMultiline(code); var lines = code.split('\n'); @@ -64,6 +72,10 @@ function coffeeObjects(code) { return result; } +/** Builds a list of objects in JavaScript code +* @param {string} code +* @returns {string[]} +*/ function jsObjects(code) { var lines = code.split('\n'); var result = []; @@ -81,6 +93,11 @@ function jsObjects(code) { return result; } +/** Runs coffeeObjects/jsObjects on the passed in code based on the passed in language +* @param {string} language +* @param {string} code +* @returns {undefined} +*/ function scanObjects(language, code) { var objects; if (/coffee/.test(language)) { diff --git a/content/src/controller.js b/content/src/controller.js index 73f5d5dc..7c72675e 100644 --- a/content/src/controller.js +++ b/content/src/controller.js @@ -64,6 +64,7 @@ var model = window.pencilcode.model = { crossFrameContext: getCrossFrameContext() }; +//logs events to the internal event log function logEvent(name, data) { $.get('/log/' + name, data); } @@ -133,11 +134,13 @@ function nosaveowner() { return model.ownername === 'frame'; } +//Determines if the current model can be saved function cansave() { return specialowner() || !model.username || model.tempThumbnail || view.isPaneEditorDirty(paneatpos('left')); } +//Updates the controls at the top of the screen based on what's currently going on function updateTopControls(addHistory) { var m = modelatpos('left'); // Update visible URL and main title name. @@ -280,11 +283,13 @@ function updateTopControls(addHistory) { // Set up some logging event handlers. // +//logs an event when palettes get selected view.on('selectpalette', function(pane, palname) { if (!palname) { palname = 'default'; } logEvent('~selectpalette', {name: palname.replace(/\s/g, '').toLowerCase()}); }); +//logs an event when blocks get picked up view.on('pickblock', function(pane, blockid) { logEvent('~pickblock', { id: blockid }); }); @@ -295,6 +300,8 @@ view.on('pickblock', function(pane, blockid) { // an event handler function // +//view.on is from the view.js file, it sets up event listeners generally as on click functionality + view.on('help', function() { view.flashNotification('Ask a question.' + @@ -325,6 +332,7 @@ view.on('new', function() { directoryname = ''; } window.location.href = '/edit/' + directoryname + untitled; + overwriteProtected = true; }); }); @@ -472,6 +480,7 @@ view.on('changehtmlcss', function(pane) { view.on('run', runAction); +//Runs the code in the editor pane function runAction() { var doc = view.getPaneEditorData(paneatpos('left')); if (!doc) { @@ -646,11 +655,13 @@ guide.on('guideurl', function(guideurl) { readNewUrl.suppress = false; }); +//Creates a hash based on the guideurl passed in function guideHash(guideurl) { return guideurl ? '#guide=' + (/[%]/.test(guideurl) ? encodeURIComponent(guideurl) : encodeURI(guideurl)) : ''; } +//Updates the URL that's shown to the user function updateVisibleUrl(baseurl, guideurl, addHistory) { model.guideUrl = guideurl; view.setVisibleUrl(baseurl + guideHash(guideurl), addHistory); @@ -778,6 +789,34 @@ view.on('splitscreen', function() { view.setPreviewMode(!view.getPreviewMode()); }); +var overwriteProtected = true; + +//A function that shows an overwrite dialog. takes in two callback functions on whether "yes" or "no" is selected on the dialog +function showOverwriteDialog(opts, yes, no){ + if(opts === { }){ + var opts = { + close: { }, + validate: function(state) { return this.close; } + }; + } + + opts.content = + '
D Feher, +a Google special projects PM, devised the Pencil Code Gym with +music and creative writing modules tor reaching more types of students, +and coordinated its implementation and showcasing at Google I/O events. +
Bob Cassels, a Google engineer, is contributing a Scheme-inspired arbitrary-precision arithmetic @@ -225,10 +230,9 @@
Googlers D Feher, David Saff, and -Alison Cichowlas, -contributed the Pencil Code Gym tutorial website, and -organized youth events using the tool. +
Googlers David Saff, and Alison Cichowlas, +contributed the Pencil Code Gym implementation, and +helped organized youth events using the tool.
Rachel Nicoll, a project manager at the MassTLC diff --git a/content/terms.html b/content/terms.html index 1361ef8a..4276d979 100644 --- a/content/terms.html +++ b/content/terms.html @@ -20,7 +20,7 @@ title="pencilcode.net">
Pencil Code is an educational service provided by the +
Pencil Code is an educational service provided by David Bau and the Pencil Code Team, at 88 Lincoln Road, Lincoln MA.
By using the Pencil Code service, you are agreeing to these terms.
diff --git a/content/turtlebits.js b/content/turtlebits.js
new file mode 100644
index 00000000..c62ad084
--- /dev/null
+++ b/content/turtlebits.js
@@ -0,0 +1,19 @@
+this.CoffeeScript||function(root){!function(a){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=a();else if("function"==typeof define&&define.amd)define([],a);else{var b;"undefined"!=typeof window?b=window:"undefined"!=typeof global?b=global:"undefined"!=typeof self&&(b=self),b.CoffeeScript=a()}}(function(){var define,module,exports;return function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i="function"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);throw new Error("Cannot find module '"+g+"'")}var j=c[g]={exports:{}};b[g][0].call(j.exports,function(a){var c=b[g][1][a];return e(c?c:a)},j,j.exports,a,b,c,d)}return c[g].exports}for(var f="function"==typeof require&&require,g=0;g","=>","[","(","{","--","++"],j=["+","-"],h=["POST_IF","FOR","WHILE","UNTIL","WHEN","BY","LOOP","TERMINATOR"],n=["ELSE","->","=>","TRY","FINALLY","THEN"],m=["TERMINATOR","CATCH","FINALLY","ELSE","OUTDENT","LEADING_WHEN"],l=["TERMINATOR","INDENT","OUTDENT"],b=[".","?.","::","?::"],i.push("DEFER"),g.push("DEFER"),h.push("AWAIT")}).call(this)},{}],10:[function(a,b,c){(function(){var b,d;d=a("./helpers"),d.extend,d.last,b=a("iced-runtime"),c.Scope=function(){function a(b,c,d){this.parent=b,this.expressions=c,this.method=d,this.variables=[{name:"arguments",type:"arguments"}],this.positions={},this.parent||(a.root=this)}return a.root=null,a.prototype.add=function(a,b,c){return this.shared&&!c?this.parent.add(a,b,c):Object.prototype.hasOwnProperty.call(this.positions,a)?this.variables[this.positions[a]].type=b:this.positions[a]=this.variables.push({name:a,type:b})-1},a.prototype.namedMethod=function(){var a;return(null!=(a=this.method)?a.name:void 0)||!this.parent?this.method:this.parent.namedMethod()},a.prototype.find=function(a){return!!this.check(a)||(this.add(a,"var"),!1)},a.prototype.parameter=function(a){if(!this.shared||!this.parent.check(a,!0))return this.add(a,"param")},a.prototype.check=function(a){var b;return!!(this.type(a)||(null!=(b=this.parent)?b.check(a):void 0))},a.prototype.temporary=function(a,b){return a.length>1?"_"+a+(b>1?b-1:""):"_"+(b+parseInt(a,36)).toString(36).replace(/\d/g,"a")},a.prototype.type=function(a){var b,c,d,e;for(e=this.variables,c=0,d=e.length;c","
"],col:[2,"
"],tr:[2,"","
"],td:[3,"
"],_default:[0,"",""]};Fa.optgroup=Fa.option,Fa.tbody=Fa.tfoot=Fa.colgroup=Fa.caption=Fa.thead,Fa.th=Fa.td,$.extend({clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=$.contains(a.ownerDocument,a);if(!(Y.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||$.isXMLDoc(a)))for(g=r(h),f=r(a),d=0,e=f.length;d","