summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--blocks.js48
-rw-r--r--gui.js87
-rw-r--r--help/list$arrowRightsentence.pngbin0 -> 157221 bytes
-rw-r--r--help/sentence$arrowRightlist.pngbin0 -> 176476 bytes
-rwxr-xr-xhistory.txt36
-rw-r--r--lang-bn.js1192
-rw-r--r--libraries/word-sentence.xml2
-rw-r--r--lists.js124
-rw-r--r--locale.js29
-rw-r--r--morphic.js115
-rw-r--r--objects.js14
-rw-r--r--threads.js17
-rw-r--r--tools.xml2
13 files changed, 1535 insertions, 131 deletions
diff --git a/blocks.js b/blocks.js
index 3402e22..e936c2c 100644
--- a/blocks.js
+++ b/blocks.js
@@ -155,7 +155,7 @@ DialogBoxMorph, BlockInputFragmentMorph, PrototypeHatBlockMorph, Costume*/
// Global stuff ////////////////////////////////////////////////////////
-modules.blocks = '2014-June-06';
+modules.blocks = '2014-July-11';
var SyntaxElementMorph;
@@ -1283,7 +1283,7 @@ SyntaxElementMorph.prototype.labelPart = function (spec) {
case '%pause':
part = new SymbolMorph('pause');
part.size = this.fontSize;
- part.color = new Color(160, 80, 0);
+ part.color = new Color(255, 220, 0);
part.isProtectedLabel = true; // doesn't participate in zebraing
part.shadowColor = this.color.darker(this.labelContrast);
part.shadowOffset = MorphicPreferences.isFlat ?
@@ -2122,6 +2122,7 @@ BlockMorph.prototype.userMenu = function () {
if (this.parentThatIsA(RingMorph)) {
menu.addLine();
menu.addItem("unringify", 'unringify');
+ menu.addItem("ringify", 'ringify');
return menu;
}
if (this.parent instanceof ReporterSlotMorph
@@ -2168,16 +2169,18 @@ BlockMorph.prototype.developersMenu = function () {
BlockMorph.prototype.hidePrimitive = function () {
var ide = this.parentThatIsA(IDE_Morph),
+ dict,
cat;
if (!ide) {return; }
StageMorph.prototype.hiddenPrimitives[this.selector] = true;
- cat = {
+ dict = {
doWarp: 'control',
reifyScript: 'operators',
reifyReporter: 'operators',
reifyPredicate: 'operators',
doDeclareVariables: 'variables'
- }[this.selector] || this.category;
+ };
+ cat = dict[this.selector] || this.category;
if (cat === 'lists') {cat = 'variables'; }
ide.flushBlocksCache(cat);
ide.refreshPalette();
@@ -3356,6 +3359,10 @@ CommandBlockMorph.prototype.isStop = function () {
// CommandBlockMorph deleting
CommandBlockMorph.prototype.userDestroy = function () {
+ if (this.nextBlock()) {
+ this.userDestroyJustThis();
+ return;
+ }
var cslot = this.parentThatIsA(CSlotMorph);
this.destroy();
if (cslot) {
@@ -3363,6 +3370,37 @@ CommandBlockMorph.prototype.userDestroy = function () {
}
};
+CommandBlockMorph.prototype.userDestroyJustThis = function () {
+ // delete just this one block, reattach next block to the previous one,
+ var scripts = this.parentThatIsA(ScriptsMorph),
+ cs = this.parentThatIsA(CommandSlotMorph),
+ pb,
+ nb = this.nextBlock(),
+ above,
+ cslot = this.parentThatIsA(CSlotMorph);
+
+ if (this.parent) {
+ pb = this.parent.parentThatIsA(CommandBlockMorph);
+ }
+ if (pb && (pb.nextBlock() === this)) {
+ above = pb;
+ } else if (cs && (cs.nestedBlock() === this)) {
+ above = cs;
+ }
+ this.destroy();
+ if (nb) {
+ if (above instanceof CommandSlotMorph) {
+ above.nestedBlock(nb);
+ } else if (above instanceof CommandBlockMorph) {
+ above.nextBlock(nb);
+ } else {
+ scripts.add(nb);
+ }
+ } else if (cslot) {
+ cslot.fixLayout();
+ }
+};
+
// CommandBlockMorph drawing:
CommandBlockMorph.prototype.drawNew = function () {
@@ -6478,7 +6516,7 @@ InputSlotMorph.prototype.collidablesMenu = function () {
allNames = [];
stage.children.forEach(function (morph) {
- if (morph instanceof SpriteMorph) {
+ if (morph instanceof SpriteMorph && !morph.isClone) {
if (morph.name !== rcvr.name) {
allNames = allNames.concat(morph.name);
}
diff --git a/gui.js b/gui.js
index d12453b..ffb414d 100644
--- a/gui.js
+++ b/gui.js
@@ -69,7 +69,7 @@ SpeechBubbleMorph*/
// Global stuff ////////////////////////////////////////////////////////
-modules.gui = '2014-Jun-04';
+modules.gui = '2014-July-11';
// Declarations
@@ -889,8 +889,6 @@ IDE_Morph.prototype.createPalette = function (forSearching) {
this.palette.setWidth(this.logo.width());
this.add(this.palette);
- this.palette.scrollX(this.palette.padding);
- this.palette.scrollY(this.palette.padding);
return this.palette;
};
@@ -924,6 +922,8 @@ IDE_Morph.prototype.createSpriteBar = function () {
tabColors = this.tabColors,
tabBar = new AlignmentMorph('row', -tabCorner * 2),
tab,
+ symbols = ['\u2192', '\u21BB', '\u2194'],
+ labels = ['don\'t rotate', 'can rotate', 'only face left/right'],
myself = this;
if (this.spriteBar) {
@@ -952,17 +952,13 @@ IDE_Morph.prototype.createSpriteBar = function () {
each.refresh();
});
},
- ['\u2192', '\u21BB', '\u2194'][rotationStyle], // label
+ symbols[rotationStyle], // label
function () { // query
return myself.currentSprite instanceof SpriteMorph
&& myself.currentSprite.rotationStyle === rotationStyle;
},
null, // environment
- localize(
- [
- 'don\'t rotate', 'can rotate', 'only face left/right'
- ][rotationStyle]
- )
+ localize(labels[rotationStyle])
);
button.corner = 8;
@@ -1729,7 +1725,7 @@ IDE_Morph.prototype.applySavedSettings = function () {
// blocks zoom
if (zoom) {
- SyntaxElementMorph.prototype.setScale(zoom);
+ SyntaxElementMorph.prototype.setScale(Math.min(zoom, 12));
CommentMorph.prototype.refreshScale();
SpriteMorph.prototype.initBlocks();
}
@@ -1837,23 +1833,23 @@ IDE_Morph.prototype.duplicateSprite = function (sprite) {
IDE_Morph.prototype.removeSprite = function (sprite) {
var idx = this.sprites.asArray().indexOf(sprite) + 1;
-
+ this.stage.threads.stopAllForReceiver(sprite);
sprite.destroy();
this.stage.watchers().forEach(function (watcher) {
if (watcher.object() === sprite) {
watcher.destroy();
}
});
-
- if (idx < 1) {return; }
-
+ if (idx > 0) {
+ this.sprites.remove(idx);
+ }
+ this.createCorral();
+ this.fixLayout();
this.currentSprite = detect(
this.stage.children,
function (morph) {return morph instanceof SpriteMorph; }
) || this.stage;
- this.sprites.remove(this.sprites.asArray().indexOf(sprite) + 1);
- this.createCorral();
- this.fixLayout();
+
this.selectSprite(this.currentSprite);
};
@@ -1861,7 +1857,7 @@ IDE_Morph.prototype.removeSprite = function (sprite) {
IDE_Morph.prototype.userMenu = function () {
var menu = new MenuMorph(this);
- menu.addItem('help', 'nop');
+ // menu.addItem('help', 'nop');
return menu;
};
@@ -1947,7 +1943,7 @@ IDE_Morph.prototype.cloudMenu = function () {
);
} else {
menu.addItem(
- 'Logout',
+ localize('Logout') + ' ' + SnapCloud.username,
'logout'
);
menu.addItem(
@@ -2270,18 +2266,7 @@ IDE_Morph.prototype.projectMenu = function () {
menu = new MenuMorph(this);
menu.addItem('Project notes...', 'editProjectNotes');
menu.addLine();
- menu.addItem(
- 'New',
- function () {
- myself.confirm(
- 'Replace the current project with a new one?',
- 'New Project',
- function () {
- myself.newProject();
- }
- );
- }
- );
+ menu.addItem('New', 'createNewProject');
menu.addItem('Open...', 'openProjectsBrowser');
menu.addItem('Save', "save");
if (shiftClicked) {
@@ -2364,8 +2349,8 @@ IDE_Morph.prototype.projectMenu = function () {
'Import tools',
function () {
myself.droppedText(
- myself.getURL(
- 'http://snap.berkeley.edu/snapsource/tools.xml'
+ myself.getURLsbeOrRelative(
+ 'tools.xml'
),
'tools'
);
@@ -3364,6 +3349,15 @@ IDE_Morph.prototype.toggleStageSize = function (isSmall) {
}
};
+IDE_Morph.prototype.createNewProject = function () {
+ var myself = this;
+ this.confirm(
+ 'Replace the current project with a new one?',
+ 'New Project',
+ function () {myself.newProject(); }
+ );
+};
+
IDE_Morph.prototype.openProjectsBrowser = function () {
new ProjectDialogMorph(this, 'open').popUp();
};
@@ -3499,7 +3493,7 @@ IDE_Morph.prototype.userSetBlocksScale = function () {
new DialogBoxMorph(
null,
function (num) {
- myself.setBlocksScale(num);
+ myself.setBlocksScale(Math.min(num, 12));
}
).withKey('zoomBlocks').prompt(
'Zoom blocks',
@@ -4041,6 +4035,23 @@ IDE_Morph.prototype.getURL = function (url) {
}
};
+IDE_Morph.prototype.getURLsbeOrRelative = function (url) {
+ var request = new XMLHttpRequest(),
+ myself = this;
+ try {
+ request.open('GET', 'http://snap.berkeley.edu/snapsource/' +
+ url, false);
+ request.send();
+ if (request.status === 200) {
+ return request.responseText;
+ }
+ return myself.getURL(url);
+ } catch (err) {
+ myself.showMessage(err);
+ return;
+ }
+};
+
// IDE_Morph user dialog shortcuts
IDE_Morph.prototype.showMessage = function (message, secs) {
@@ -4836,9 +4847,13 @@ ProjectDialogMorph.prototype.shareProject = function () {
function () {
SnapCloud.disconnect();
proj.Public = 'true';
+ myself.unshareButton.show();
+ myself.shareButton.hide();
entry.label.isBold = true;
entry.label.drawNew();
entry.label.changed();
+ myself.buttons.fixLayout();
+ myself.drawNew();
myself.ide.showMessage('shared.', 2);
},
myself.ide.cloudError(),
@@ -4873,9 +4888,13 @@ ProjectDialogMorph.prototype.unshareProject = function () {
function () {
SnapCloud.disconnect();
proj.Public = 'false';
+ myself.shareButton.show();
+ myself.unshareButton.hide();
entry.label.isBold = false;
entry.label.drawNew();
entry.label.changed();
+ myself.buttons.fixLayout();
+ myself.drawNew();
myself.ide.showMessage('unshared.', 2);
},
myself.ide.cloudError(),
diff --git a/help/list$arrowRightsentence.png b/help/list$arrowRightsentence.png
new file mode 100644
index 0000000..1383af6
--- /dev/null
+++ b/help/list$arrowRightsentence.png
Binary files differ
diff --git a/help/sentence$arrowRightlist.png b/help/sentence$arrowRightlist.png
new file mode 100644
index 0000000..731aab9
--- /dev/null
+++ b/help/sentence$arrowRightlist.png
Binary files differ
diff --git a/history.txt b/history.txt
index 02fc2a0..8cc4e23 100755
--- a/history.txt
+++ b/history.txt
@@ -2166,3 +2166,39 @@ ______
* Blocks: enable relabelling blocks across categories
* Objects: more relabelling options for SAY, THINK, ASK
* BYOB, Blocks: relabelling custom blocks (experimental)
+
+140623
+------
+* Morphic: Inspector enhancements (dynamic property update, keyboard shortcuts)
+* GUI: update visibility of share/unshare buttons, Thanks, Kunal!
+
+140706
+------
+* Blocks: add “ringify” to every context menu that already has “unringify”
+
+
+140708
+------
+* Threads: show error messages for custom blocks (propagating to the script’s top block)
+* Threads: adjust to Doug Crockford’s latest infuriating nitpickings in JSLint
+* GUI: show username in ‘logout’ entry of cloud menu
+* GUI, Objects: fixed scrolling glitch in the palette, thanks, Kunal!
+* GUI, Objects: add keyboard shortcut for “new project”: ctr-n
+* revert changes made for JSLint’s sake after the issue was fixed in JSLint
+* Blocks: change “delete” behavior in context menus to only delete this particular blocks (and reconnect the next block to the previous one)
+* fixed #490
+
+140711
+------
+* Morphic: keyboard shortcut ctrl/cmd-shift-a for ‘@‘
+* Morphic: allow directly editing properties in inspector widgets
+* Blocks: change the color of the %pause symbol to be more yellowish
+* Threads: fixed #506, thanks @haritop, for both the report and for providing the fix!!
+* GUI: fixed #412 (incomplete sprite-removal)
+* GUI: fixed #507 (limit persistent block zoom to 12x), thanks Michael!
+* Morphic, GUI, Objects: fixed #508 (don’t popup empty menus), thanks Michael!
+
+140714
+------
+* new translation into Bangla (Bengali)!!! Yay, thanks, Mokter!!
+* Lists: make internal list ops iterative (instead of recursive), thanks, Brian!
diff --git a/lang-bn.js b/lang-bn.js
new file mode 100644
index 0000000..2d734d2
--- /dev/null
+++ b/lang-bn.js
@@ -0,0 +1,1192 @@
+/*
+
+ lang-bn.js
+
+ বাংলা (Bangla) translation for SNAP!
+
+ written by Dr. Mokter Hossain
+
+ Copyright (C) 2014 by Dr. Mokter Hossain
+
+ This file is part of Snap!.
+
+ Snap! is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as
+ published by the Free Software Foundation, either version 3 of
+ the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+
+ Note to Translators:
+ --------------------
+ At this stage of development, Snap! can be translated to any LTR language
+ maintaining the current order of inputs (formal parameters in blocks).
+
+ Translating Snap! is easy:
+
+
+ 1. Download
+
+ Download the sources and extract them into a local folder on your
+ computer:
+
+ <http://snap.berkeley.edu/snapsource/snap.zip>
+
+ Use the German translation file (named 'lang-de.js') as template for your
+ own translations. Start with editing the original file, because that way
+ you will be able to immediately check the results in your browsers while
+ you're working on your translation (keep the local copy of snap.html open
+ in your web browser, and refresh it as you progress with your
+ translation).
+
+
+ 2. Edit
+
+ Edit the translation file with a regular text editor, or with your
+ favorite JavaScript editor.
+
+ In the first non-commented line (the one right below this
+ note) replace "de" with the two-letter ISO 639-1 code for your language,
+ e.g.
+
+ fr - French => SnapTranslator.dict.fr = {
+ it - Italian => SnapTranslator.dict.it = {
+ pl - Polish => SnapTranslator.dict.pl = {
+ pt - Portuguese => SnapTranslator.dict.pt = {
+ es - Spanish => SnapTranslator.dict.es = {
+ el - Greek => => SnapTranslator.dict.el = {
+
+ etc. (see <http://en.wikipedia.org/wiki/ISO_639-1>)
+
+
+ 3. Translate
+
+ Then work through the dictionary, replacing the German strings against
+ your translations. The dictionary is a straight-forward JavaScript ad-hoc
+ object, for review purposes it should be formatted as follows:
+
+ {
+ 'English string':
+ 'Translation string',
+ 'last key':
+ } 'last value'
+
+ and you only edit the indented value strings. Note that each key-value
+ pair needs to be delimited by a comma, but that there shouldn't be a comma
+ after the last pair (again, just overwrite the template file and you'll be
+ fine).
+
+ If something doesn't work, or if you're unsure about the formalities you
+ should check your file with
+
+ <http://JSLint.com>
+
+ This will inform you about any missed commas etc.
+
+
+ 4. Accented characters
+
+ Depending on which text editor and which file encoding you use you can
+ directly enter special characters (e.g. Umlaut, accented characters) on
+ your keyboard. However, I've noticed that some browsers may not display
+ special characters correctly, even if other browsers do. So it's best to
+ check your results in several browsers. If you want to be on the safe
+ side, it's even better to escape these characters using Unicode.
+
+ see: <http://0xcc.net/jsescape/>
+
+
+ 5. Block specs:
+
+ At this time your translation of block specs will only work
+ correctly, if the order of formal parameters and their types
+ are unchanged. Placeholders for inputs (formal parameters) are
+ indicated by a preceding % prefix and followed by a type
+ abbreviation.
+
+ For example:
+
+ 'say %s for %n secs'
+
+ can currently not be changed into
+
+ 'say %n secs long %s'
+
+ and still work as intended.
+
+ Similarly
+
+ 'point towards %dst'
+
+ cannot be changed into
+
+ 'point towards %cst'
+
+ without breaking its functionality.
+
+
+ 6. Submit
+
+ When you're done, rename the edited file by replacing the "de" part of the
+ filename with the two-letter ISO 639-1 code for your language, e.g.
+ bn - Bengali(Bangla) => lang-bn.js
+ fr - French => lang-fr.js
+ it - Italian => lang-it.js
+ pl - Polish => lang-pl.js
+ pt - Portuguese => lang-pt.js
+ es - Spanish => lang-es.js
+ el - Greek => => lang-el.js
+
+ and send it to me for inclusion in the official Snap! distribution.
+ Once your translation has been included, Your name will the shown in the
+ "Translators" tab in the "About Snap!" dialog box, and you will be able to
+ directly launch a translated version of Snap! in your browser by appending
+
+ lang:xx
+
+ to the URL, xx representing your translations two-letter code.
+
+
+ 7. Known issues
+
+ In some browsers accents or ornaments located in typographic ascenders
+ above the cap height are currently (partially) cut-off.
+
+ Enjoy!
+ -Jens
+*/
+
+/*global SnapTranslator*/
+
+SnapTranslator.dict.bn = {
+
+/*
+ Special characters: (see <http://0xcc.net/jsescape/>)
+
+ Ä, ä \u00c4, \u00e4
+ Ö, ö \u00d6, \u00f6
+ Ü, ü \u00dc, \u00fc
+ ß \u00df
+*/
+ // translations meta information
+ 'language_name':
+ 'বাংলা', // the name as it should appear in the language menu
+ 'language_translator':
+ 'Dr. Mokter Hossain', // your name for the Translators tab
+ 'translator_e-mail':
+ 'mokter@gmail.com', // optional
+ 'last_changed':
+ '2014-07-02', // this, too, will appear in the Translators tab
+
+
+ // GUI
+ // control bar:
+ 'untitled':
+ 'শিরোনামহীন',
+ 'development mode':
+ 'উন্নয়ন মোড',
+
+ // categories:
+ 'Motion':
+ 'গতি (Motion)',
+ 'Looks':
+ 'সৌন্দর্য (Looks)',
+ 'Sound':
+ 'শব্দ (Sound)',
+ 'Pen':
+ 'লেখনী (Pen)',
+ 'Control':
+ 'নিয়ন্ত্রণ (Control)',
+ 'Sensing':
+ 'অনুভূতি (Sensing)',
+ 'Operators':
+ 'চালক (Operators)',
+ 'Variables':
+ 'চলক (Variables)',
+ 'Lists':
+ 'তালিকা (Lists)',
+ 'Other':
+ 'অন্যান্য',
+
+ // editor:
+ 'draggable':
+ 'টেনে আনার যোগ্য',
+
+ // tabs:
+ 'Scripts':
+ 'প্রোগ্রাম স্ক্রিপ্ট (Scripts)',
+ 'Costumes':
+ 'পরিচ্ছদ (Costumes)',
+ 'Sounds':
+ 'শব্দমালা (Sounds)',
+
+ // names:
+ 'Sprite':
+ 'স্পাইট',
+ 'Stage':
+ 'দৃশ্যস্থল',
+
+ // rotation styles:
+ 'don\'t rotate':
+ 'ঘোরতে পারে না',
+ 'can rotate':
+ 'ঘোরতে পারে',
+ 'only face left/right':
+ 'একমাত্র ডানে/বামে মুখ',
+
+ // new sprite button:
+ 'add a new sprite':
+ 'একটি নতুন স্পাইট যোগ কর',
+
+ // tab help
+ 'costumes tab help':
+ '\nনতুন/অতিরিক্ত পরিচ্ছদ ব্যবহারের জন্য প্রথমে ডান দিকের নিচের পরিচ্ছদ আইটেমে একটি ক্লিক কর, তারপর কম্পিউটার থেকে প্রত্যাশিত ছবির ফাইল নির্বাচন করে\nএখানে আনয়ন কর \n'
+ +'\n\n'+
+ 'নতুন/অতিরিক্ত স্পাইট ব্যবহারের জন্য প্রথমে ডান দিকের নিচের স্পাইট আইটেমে একটি ক্লিক কর, তারপর কম্পিউটার থেকে প্রত্যাশিত ছবির ফাইল নির্বাচন করে\nএখানে আনয়ন কর \n',
+ 'import a sound from your computer\nby dragging it into here':
+ '\nশব্দ ব্যবহারের জন্য কম্পিউটার থেকে প্রত্যাশিত শব্দের ফাইল নির্বাচন করে এখানে আনয়ন করতে পার',
+
+ // primitive blocks:
+
+ /*
+ Attention Translators:
+ ----------------------
+ At this time your translation of block specs will only work
+ correctly, if the order of formal parameters and their types
+ are unchanged. Placeholders for inputs (formal parameters) are
+ indicated by a preceding % prefix and followed by a type
+ abbreviation.
+
+ For example:
+
+ 'say %s for %n secs'
+
+ can currently not be changed into
+
+ 'say %n secs long %s'
+
+ and still work as intended.
+
+ Similarly
+
+ 'point towards %dst'
+
+ cannot be changed into
+
+ 'point towards %cst'
+
+ without breaking its functionality.
+ */
+
+ // motion:
+ 'Stage selected:\nno motion primitives':
+ 'স্টেজ নির্বাচিত হয়েছে:\n কোন গতিশীল প্রিমিটিভ নেই\n'
+ + 'disponibles',
+
+ 'move %n steps':
+ 'অগ্রসর হও %n ধাপ',
+ 'turn %clockwise %n degrees':
+ 'ডানদিকে %clockwise %n ডিগ্রীকোণে ঘোর',
+ 'turn %counterclockwise %n degrees':
+ 'বামদিকে %counterclockwise %n ডিগ্রীকোণে ঘোর',
+ 'point in direction %dir':
+ 'দিক নির্ধারণ কর %dir',
+ 'point towards %dst':
+ 'প্রতি নির্দেশ কর %dst',
+ 'go to x: %n y: %n':
+ 'x: %n y: %n অবস্থানে যাও',
+ 'go to %dst':
+ '%dst দুরত্বে যাও',
+ 'glide %n secs to x: %n y: %n':
+ 'গড়িয়ে চল x: %n y: %n অবস্থানে %n সেকেন্ড ',
+ 'change x by %n':
+ 'x পরিবর্তন কর %n দ্বারা',
+ 'set x to %n':
+ 'x নির্ধারণ কর %n',
+ 'change y by %n':
+ 'y পরিবর্তন কর %n দ্বারা',
+ 'set y to %n':
+ 'y নির্ধারণ কর %n',
+ 'if on edge, bounce':
+ 'প্রান্ত স্পর্শ করলে উল্টো ফিরে আস',
+ 'x position':
+ 'এর x অবস্থান',
+ 'y position':
+ 'এর y অবস্থান',
+ 'direction':
+ 'এর গতিপথ',
+
+ // looks:
+ 'switch to costume %cst':
+ 'পরিচ্ছদ বদল কর %cst',
+ 'next costume':
+ 'পরবর্তী পরিচ্ছদ',
+ 'costume #':
+ 'এর পরিচ্ছদ #',
+ 'say %s for %n secs':
+ 'বল %s %n সেকেন্ড পর্যন্ত',
+ 'say %s':
+ 'বল %s',
+ 'think %s for %n secs':
+ 'ভাব %s %n সেকেন্ড পর্যন্ত',
+ 'think %s':
+ 'ভাব %s',
+ 'Hello!':
+ 'হ্যালো!',
+ 'Hmm...':
+ 'হুম ...',
+ 'change %eff effect by %n':
+ 'প্রভাব %eff পরিবর্তন করো %n দ্বারা ',
+ 'set %eff effect to %n':
+ 'প্রভাব %eff %n গুণ নির্ধারণ কর',
+ 'clear graphic effects':
+ 'চিত্রলেখ প্রভাব পরিষ্কার কর',
+ 'change size by %n':
+ 'আকার %n গুণ পরিবর্তন কর',
+ 'set size to %n %':
+ 'আকার %n % নির্ধারণ কর',
+ 'size':
+ 'এর আকার',
+ 'show':
+ 'প্রদর্শন কর',
+ 'hide':
+ 'গোপন কর',
+ 'go to front':
+ 'সামনে যাও',
+ 'go back %n layers':
+ 'পশ্চাতে যাও %n স্তর',
+
+ 'development mode \ndebugging primitives:':
+ 'উন্নয়ন মোড \n ডিবাগিং প্রিমিটিভ',
+ 'console log %mult%s':
+ 'কনসোল লগ: %mult%s',
+ 'alert %mult%s':
+ 'সতর্ক: %mult%s',
+
+ // sound:
+ 'play sound %snd':
+ 'শব্দ বাজাও %snd',
+ 'play sound %snd until done':
+ '%snd শব্দ বাজাও যতক্ষণ না',
+ 'stop all sounds':
+ 'সকল শব্দ বন্ধ কর',
+ 'rest for %n beats':
+ 'নীরব থাক %n স্বরকম্প পর্যন্ত',
+ 'play note %n for %n beats':
+ 'মন্তব্য %n বাজাও %n স্বরকম্প',
+ 'change tempo by %n':
+ 'শব্দের কম্পনমাত্রা %n পরিবর্তন কর',
+ 'set tempo to %n bpm':
+ 'শব্দের কম্পনমাত্রা %n নির্ধারণ কর',
+ 'tempo':
+ 'শব্দের কম্পনমাত্রা',
+
+ // pen:
+ 'clear':
+ 'পরিচ্ছদ পরিষ্কার কর',
+ 'pen down':
+ 'লেখনী নিম্নগামী কর',
+ 'pen up':
+ 'লেখনী ঊর্ধ্বগামী কর',
+ 'set pen color to %clr':
+ 'লেখনীর রঙ %clr নির্ধারণ কর',
+ 'change pen color by %n':
+ 'লেখনীর রঙ %n পরিবর্তন কর',
+ 'set pen color to %n':
+ 'লেখনীর রঙ %n নির্ধারণ কর',
+ 'change pen shade by %n':
+ 'লেখনীর ছায়া %n পরিবর্তন কর',
+ 'set pen shade to %n':
+ 'লেখনীর ছায়া %n নির্ধারণ কর',
+ 'change pen size by %n':
+ 'লেখনীর আকার পরিবর্তন কর %n',
+ 'set pen size to %n':
+ 'লেখনীর আকার নির্ধারণ কর %n',
+ 'stamp':
+ 'সীলমোহর',
+
+ // control:
+ 'when %greenflag clicked':
+ 'যখন %greenflag ক্লিক কর',
+ 'when %keyHat key pressed':
+ 'যখন %keyHat ক্লিক কর',
+ 'when I am clicked':
+ 'যখন আমাকে ক্লিক কর',
+ 'when I receive %msgHat':
+ 'যখন আমি গ্রহণ করি %msgHat',
+ 'broadcast %msg':
+ 'বার্তা সম্প্রচার কর %msg',
+ 'broadcast %msg and wait':
+ 'বার্তা সম্প্রচার করে %msg অপেক্ষা কর',
+ 'Message name':
+ 'বার্তা লিখ',
+ 'message':
+ 'বার্তা',
+ 'any message':
+ 'যে কোন বার্তা',
+ 'initialize':
+ 'আরম্ভ কর',
+ 'push':
+ 'পুশ',
+ 'pull':
+ 'পুল',
+
+ 'wait %n secs':
+ 'অপেক্ষা কর %n সেকেণড',
+ 'wait until %b':
+ 'অপেক্ষা কর %b যতক্ষণ না',
+ 'forever %c':
+ 'অনন্তকাল কর %c',
+ 'repeat %n %c':
+ 'পুনরাবৃত্তি কর %n বার %c ',
+ 'repeat until %b %c':
+ 'পুনরায় কর যতক্ষণ না %b %c',
+ 'if %b %c':
+ 'যদি হয় %b %c',
+ 'if %b %c else %c':
+ 'যদি হয় %b %c অন্যথায় %c',
+ 'report %s':
+ 'প্রতিবেদন %s',
+ 'stop block':
+ 'ব্লক বন্ধ কর',
+ 'stop script':
+ 'বর্ণনা বন্ধ কর',
+ 'stop all %stop':
+ 'সব বন্ধ কর %stop',
+ 'pause all %pause':
+ 'সব স্থগিত কর %pause',
+ 'run %cmdRing %inputs':
+ 'চালনা কর %cmdRing %inputs',
+ 'launch %cmdRing %inputs':
+ 'শুরু কর %cmdRing %inputs',
+ 'call %repRing %inputs':
+ 'আহ্বান কর %repRing %inputs',
+ 'run %cmdRing w/continuation':
+ 'চালনা কর %cmdRing ধারাবাহিকতার সঙ্গে',
+ 'call %cmdRing w/continuation':
+ 'আহ্বান কর %cmdRing ধারাবাহিকতার সঙ্গে',
+ 'warp %c':
+ 'একত্রিত কর %c',
+ 'when I start as a clone':
+ 'যখন আমি একটি ক্লোন হিসেবে শুরু করি',
+ 'create a clone of %cln':
+ '%cln একটি ক্লোন এর সৃষ্টি কর',
+ 'myself':
+ 'স্বীয়',
+ 'delete this clone':
+ 'এই ক্লোনটি মুছে ফেল',
+
+ // sensing:
+ 'touching %col ?':
+ 'স্পর্শ করেছে কিনা %col ?',
+ 'touching %clr ?':
+ 'স্পর্শ রঙ %clr কিনা?',
+ 'color %clr is touching %clr ?':
+ '%clr রঙ %clr রঙ গামী কিনা?',
+ 'ask %s and wait':
+ '%s জিজ্ঞাসা করে অপেক্ষা কর',
+ 'what\'s your name?':
+ 'তোমার নাম কি?',
+ 'answer':
+ 'জবাব',
+ 'mouse x':
+ 'মাউস x',
+ 'mouse y':
+ 'মাউস y',
+ 'mouse down?':
+ 'মাউস বোতাম চাপা কিনা?',
+ 'key %key pressed?':
+ 'কোন কী %key চাপা কিনা?',
+ 'distance to %dst':
+ 'পর্যন্ত দূরত্ব %dst',
+ 'reset timer':
+ 'সময় নির্ণায়ক পুন:স্থাপন কর',
+ 'timer':
+ 'সময় নির্ণায়ক',
+ '%att of %spr':
+ '%att লক্ষণ %spr এর',
+ 'http:// %s':
+ 'http:// %s',
+ 'turbo mode?':
+ 'টার্বো মোড কিনা?',
+ 'set turbo mode to %b':
+ 'টার্বো মোডকে %b নির্ধারণ কর',
+
+ 'filtered for %clr':
+ 'ফিল্টার করা হয়েছে %clr এর জন্য',
+ 'stack size':
+ 'স্ট্যাকের আকার',
+ 'frames':
+ 'ফ্রেমসমূহ',
+
+ // operators:
+ '%n mod %n':
+ '%n ভাগ %n এর অবশিষ্ট',
+ 'round %n':
+ '%n এর নিকটতম পূর্ণসংখ্যা',
+ '%fun of %n':
+ '%fun নির্ণয় কর %n',
+ 'pick random %n to %n':
+ 'যে কোনো একটি সংখ্যা %n থেকে %n পর্যন্ত',
+ '%b and %b':
+ '%b এবং %b',
+ '%b or %b':
+ '%b অথবা %b',
+ 'not %b':
+ 'না %b',
+ 'true':
+ 'সত্য',
+ 'false':
+ 'মিথ্যা',
+ 'join %words':
+ 'সংযুক্ত কর %words',
+ 'hello':
+ 'হ্যালো',
+ 'world':
+ 'পৃথিবী',
+ 'letter %n of %s':
+ '%n -তম বর্ণ %s এর',
+ 'length of %s':
+ '%s এর বর্ণদৈর্ঘ্য ',
+ 'unicode of %s':
+ '%s বর্ণের ইউনিকোড',
+ 'unicode %n as letter':
+ 'ইউনিকোড %n বর্ণ হিসেবে',
+ 'is %s a %typ ?':
+ '%s এই প্রকারের কিনা %typ ?',
+ 'is %s identical to %s ?':
+ '%s এর সমতুল্য %s কিনা?',
+
+ 'type of %s':
+ '%s এর প্রকারে',
+
+ // variables:
+ 'Make a variable':
+ 'একটি চলক তৈরী কর',
+ 'Variable name':
+ 'চলকের নাম',
+ 'Delete a variable':
+ 'চলকটি মুছে ফেল',
+ 'set %var to %s':
+ '%var চলকটি মান %s নির্ধারণ কর',
+ 'change %var by %n':
+ '%var চলকটি মান %n দ্বারা পরিবর্তন কর',
+ 'show variable %var':
+ '%var চলকটি প্রদর্শন কর',
+ 'hide variable %var':
+ '%var চলকটি গোপন কর',
+ 'script variables %scriptVars':
+ 'স্ক্রিপ্ট চলকসমূহ %scriptVars',
+
+ 'list %exp':
+ 'তালিকা %exp',
+ '%s in front of %l':
+ '%s %l তালিকার সামনে',
+ 'item %idx of %l':
+ '%idx উপাদানটি %l তালিকার',
+ 'all but first of %l':
+ '%l তালিকার সব কিন্তু প্রথমটি বাদে',
+ 'length of %l':
+ '%l তালিকার দৈর্ঘ্য',
+ '%l contains %s':
+ '%l তালিকা %s উপাদানটি ধারণ করে',
+ 'thing':
+ 'বিষয়',
+ 'add %s to %l':
+ '%s কে %l তে সংযুক্ত কর',
+ 'delete %ida of %l':
+ '%ida কে %l থেকে মুছে ফেল',
+ 'insert %s at %idx of %l':
+ '%s কে %idx স্থানে %l তালিকায় সন্নিবেশিত কর',
+ 'replace item %idx of %l with %s':
+ '%idx স্থানের %l তালিকার উপাদানটি %s দ্বারা প্রতিস্থাপন কর',
+
+ // other
+ 'Make a block':
+ 'একটি ব্লক তৈরী কর',
+
+ // menus
+ // snap menu
+ 'About...':
+ 'Snap! সম্পর্কিত তথ্য...',
+ 'Reference manual':
+ 'Snap! রেফারেন্স ম্যানুয়াল',
+ 'Snap! website':
+ 'Snap! ওয়েবসাইট',
+ 'Download source':
+ 'Snap! সোর্সকোড',
+ 'Switch back to user mode':
+ 'ইউজার মোডে ফিরে যাও',
+ 'disable deep-Morphic\ncontext menus\nand show user-friendly ones':
+ 'দীর্ঘ-মরফিক প্রসঙ্গ তালিকা এবংপরিদর্শক নিস্ক্রিয় করে একটি ব্যবহারকারী বান্ধব তালিকা দেখাও',
+ 'Switch to dev mode':
+ 'ডেভেলপার মোডে ফিরে যাও',
+ 'enable Morphic\ncontext menus\nand inspectors,\nnot user-friendly!':
+ 'মরফিক প্রসঙ্গ তালিকা এবংপরিদর্শক সক্রিয় কর,তবে এটি ব্যবহারকারী বান্ধব নহে!',
+
+ // project menu
+ 'Project notes...':
+ 'প্রকল্প সম্পর্কিত মন্তব্য...',
+ 'New':
+ 'নতুন প্রকল্প তৈরী কর',
+ 'Open...':
+ 'সংরক্ষিত প্রকল্প খোল...',
+ 'Save':
+ 'প্রকল্পটি সংরক্ষণ কর',
+ 'Save As...':
+ 'প্রকল্পটির নামান্তর কর...',
+ 'Import...':
+ 'প্রকল্প ইম্পোর্ট কর...',
+ 'file menu import hint':
+ 'XMLফাইল হিসেবে সংরক্ষিত কোন প্রকল্প ইম্পোর্ট কর',
+ 'Export project as plain text...':
+ 'প্রকল্পটি প্লেইন টেক্সট হিসাবে এক্সপোর্ট কর ...',
+ 'Export project...':
+ 'প্রকল্পটি এক্সপোর্ট কর...',
+ 'show project data as XML\nin a new browser window':
+ 'প্রকল্প উপাত্ত একটি নতুন ব্রাউজার উইন্ডোতে XMLফাইল হিসেবে প্রদর্শন কর',
+ 'Export blocks...':
+ 'ব্লকসমূহ এক্সপোর্ট কর...',
+ 'show global custom block definitions as XML\nin a new browser window':
+ 'সার্বজনীন কাস্টম ব্লক সংজ্ঞার্থ একটি নতুন ব্রাউজার উইন্ডোতে XMLফাইল হিসেবে প্রদর্শন কর',
+ 'Import tools':
+ 'যন্ত্রপাতি ইম্পোর্ট কর',
+ 'Libraries...':
+ 'লাইব্রেরি লোড কর',
+ 'Costumes...':
+ 'পরিচ্ছদ লোড কর',
+ 'Sounds...':
+ 'শব্দের ফাইল লোড কর',
+ 'load the official library of\npowerful blocks':
+ 'শক্তিশালী ব্লকের অফিসিয়াল লাইব্রেরি লোড কর',
+
+ // cloud menu
+ 'Login...':
+ 'ক্লাউড লগ ইন...',
+ 'Signup...':
+ 'ক্লাউড সাইন আপ...',
+ 'Reset Password...':
+ 'পাসওয়ার্ড পরিবর্তন কর...',
+
+
+ // settings menu
+ 'Language...':
+ 'ভাষা পরিবর্তন কর...',
+ 'Zoom blocks...':
+ 'ব্লকসমূহ জুম্ কর...',
+ 'Stage size...':
+ 'দৃশ্যস্থলের আকার পরিবর্তন কর...',
+ 'Blurred shadows':
+ 'ঝাপসা ছায়া',
+ 'uncheck to use solid drop\nshadows and highlights':
+ 'নিরেট ড্রপ ছায়া এবং হাইলাইট ব্যবহার আনচেক কর',
+ 'check to use blurred drop\nshadows and highlights':
+ 'ঝাপসা ছায়া এবং হাইলাইট ব্যবহার চেক কর',
+ 'Zebra coloring':
+ 'জেব্রা চেহারা',
+ 'check to enable alternating\ncolors for nested blocks':
+ 'নেস্টেড ব্লকের পরিবর্তিত রঙ সক্রিয় করার জন্য চেক কর',
+ 'uncheck to disable alternating\ncolors for nested block':
+ 'নেস্টেড ব্লকের পরিবর্তিত রঙ নিস্ক্রিয় করার জন্য আনচেক কর',
+ 'Dynamic input labels':
+ 'গতিশীল ইনপুট লেবেল',
+ 'uncheck to disable dynamic\nlabels for variadic inputs':
+ 'ভারিয়াদিক ইনপুট এর গতিশীল লেবেল নিস্ক্রিয় করার জন্য আনচেক কর',
+ 'check to enable dynamic\nlabels for variadic inputs':
+ 'ভারিয়াদিক ইনপুট এর গতিশীল লেবেল সক্রিয় করার জন্য চেক কর',
+ 'Prefer empty slot drops':
+ 'খালি স্লট ড্রপ পছন্দ কর',
+ 'settings menu prefer empty slots hint':
+ 'খালি স্লট মেনু স্থাপন করার সাহায্যপূর্ণ ইঙ্গিত',
+ 'uncheck to allow dropped\nreporters to kick out others':
+ 'ঝরে পরা রিপোর্টারসমূহ অন্যদের বের করে দেওয়ার জন্য আনচেক কর',
+ 'Long form input dialog':
+ 'দীর্ঘ আকারের ডায়লগ ইনপুট',
+ 'Plain prototype labels':
+ 'সাধারণ প্রোটোটাইপ লেবেল',
+
+ 'check to always show slot\ntypes in the input dialog':
+ 'সর্বদা ইনপুট ডায়লগে স্লট এর ধরন দেখানোর জন্য চেক কর',
+ 'uncheck to use the input\ndialog in short form':
+ 'সংক্ষিপ্ত আকারের ইনপুট ডায়লগ ব্যবহারের জন্য আনচেক কর',
+ 'Virtual keyboard':
+ 'ভার্চুয়াল কিবোর্ড',
+ 'uncheck to disable\nvirtual keyboard support\nfor mobile devices':
+ 'মোবাইল ডিভাইসে ভার্চুয়াল কিবোর্ড সহায়তা নিস্ক্রিয় করার জন্য চেক কর',
+ 'check to enable\nvirtual keyboard support\nfor mobile devices':
+ 'মোবাইল ডিভাইসে ভার্চুয়াল কিবোর্ড সহায়তা সক্রিয় করার জন্য চেক কর',
+ 'Input sliders':
+ 'ইনপুট স্লাইডার',
+ 'uncheck to disable\ninput sliders for\nentry fields':
+ 'এন্ট্রি ফিল্ডে ইনপুট স্লাইডার নিস্ক্রিয় করার জন্য আনচেক কর',
+ 'check to enable\ninput sliders for\nentry fields':
+ 'এন্ট্রি ফিল্ডে ইনপুট স্লাইডার সক্রিয় করার জন্য চেক কর',
+ 'Clicking sound':
+ 'ক্লিক শব্দ',
+ 'Turbo mode':
+ 'টার্বো মোড',
+ 'Flat design':
+ 'ফ্লাট ডিজাইন',
+ 'uncheck to turn\nblock clicking\nsound off':
+ 'ক্লিক শব্দ বন্ধ করার জন্য আনচেক কর',
+ 'check to turn\nblock clicking\nsound on':
+ 'ক্লিক শব্দ চালু করার জন্য চেক কর',
+ 'Animations':
+ 'প্রাণবন্ততা',
+ 'uncheck to disable\nIDE animations':
+ 'IDE প্রাণবন্ততা বন্ধ করার জন্য আনচেক কর',
+ 'check to enable\nIDE animations':
+ 'IDE প্রাণবন্ততা চালু করার জন্য চেক কর',
+ 'Thread safe scripts':
+ 'নির্বিঘ্ন বর্ণনা যোগসূত্র',
+ 'uncheck to allow\nscript reentrancy':
+ 'বর্ণনা পুনপ্রবেশ অনুমোদন করার জন্য আনচেক কর',
+ 'check to disallow\nscript reentrancy':
+ 'বর্ণনা পুনপ্রবেশ অনুমোদন না করার জন্য চেক কর',
+ 'Prefer smooth animations':
+ 'মসৃণ অ্যানিমেশন পছন্দ কর',
+ 'Flat line ends':
+ 'ফ্লাট লাইনের সমাপ্তি',
+ 'Codification support':
+ 'সারসংগ্রহ সমর্থন',
+
+ // inputs
+ 'with inputs':
+ 'ইনপুট দ্বারা',
+ 'input names:':
+ 'ইনপুট নাম:',
+ 'Input Names:':
+ 'ইনপুট নাম:',
+ 'input list:':
+ 'ইনপুট তালিকা:',
+
+ // context menus:
+ 'help':
+ 'সাহায্য কর',
+
+ // blocks:
+ 'help...':
+ 'সাহায্য কর...',
+ 'relabel...':
+ 'নামান্তর কর...',
+ 'duplicate':
+ 'এটির প্রতিলিপি তৈরী কর',
+ 'make a copy\nand pick it up':
+ 'এটি কপি কর এবং নির্বাচন কর',
+ 'only duplicate this block':
+ 'শুধুমাত্র এই ব্লকের প্রতিলিপি তৈরী কর',
+ 'delete':
+ 'এটি মুছে ফেল',
+ 'script pic...':
+ 'স্ক্রিপ্ট ছবি...',
+ 'open a new window\nwith a picture of this script':
+ 'এই স্ক্রিপ্টর ছবি দিয়ে একটা নতুন উইন্ডো খোল',
+ 'ringify':
+ 'পরিবেষ্টন কর',
+ 'unringify':
+ 'পরিবেষ্টনমুক্ত করা',
+
+ // custom blocks:
+ 'delete block definition...':
+ 'ব্লক সংজ্ঞা মুছে ফেল',
+ 'edit...':
+ 'সম্পাদন কর...',
+
+ // sprites:
+ 'edit':
+ 'সম্পাদন কর',
+ 'export...':
+ 'প্রেরণ কর...',
+
+ // stage:
+ 'show all':
+ 'সব প্রদর্শন কর',
+
+ // scripting area
+ 'clean up':
+ 'পরিষ্কার-পরিচ্ছন্ন কর',
+ 'arrange scripts\nvertically':
+ 'উল্লম্বভাবে \nস্ক্রিপ্টস সুবিন্যস্ত কর',
+ 'add comment':
+ 'মন্তব্য যোগ কর',
+ 'make a block...':
+ 'একটি ব্লক তৈরী কর...',
+
+ // costumes
+ 'rename':
+ 'নতুন নামকরণ কর',
+ 'export':
+ 'প্রেরণ কর',
+ 'rename costume':
+ 'পরিচ্ছদ নতুন নামকরণ কর',
+
+ // sounds
+ 'Play sound':
+ 'শব্দ বাজাও',
+ 'Stop sound':
+ 'শব্দ বন্ধ কর',
+ 'Stop':
+ 'বন্ধ কর',
+ 'Play':
+ 'বাজাও',
+ 'rename sound':
+ 'শব্দ নতুন নামকরণ কর',
+
+ // dialogs
+ // buttons
+ 'OK':
+ 'ঠিক আছে',
+ 'Ok':
+ 'ঠিক আছে',
+ 'Cancel':
+ 'বাতিল কর',
+ 'Yes':
+ 'হ্যাঁ',
+ 'No':
+ 'না',
+ 'Open':
+ 'খোল',
+ 'Cloud':
+ 'ক্লাউড',
+ 'Browser':
+ 'ব্রাউজার',
+ 'Examples':
+ 'নমুনা প্রকল্প',
+
+ // help
+ 'Help':
+ 'সাহায্য কর',
+
+ // Project Manager
+ 'Untitled':
+ 'শিরোনামহীন',
+ 'Open Project':
+ 'সংরক্ষিত কোন প্রকল্প নির্বাচন করে খোল',
+ '(empty)':
+ '(খালি)',
+ 'Saved!':
+ 'সংরক্ষিত হয়েছে!',
+ 'Delete Project':
+ 'প্রকল্প মুছে ফেল',
+ 'Are you sure you want to delete':
+ 'তুমি কি মুছে দেওয়ার বিষয়ে নিশ্চিত?',
+ 'rename...':
+ 'নতুন নামকরণ কর...',
+
+ // costume editor
+ 'Costume Editor':
+ 'পরিচ্ছদ সম্পাদনকারী',
+ 'click or drag crosshairs to move the rotation center':
+ 'ঘূর্ণন কেন্দ্র সরাতে crosshairs ক্লিক কর অথবা টেনে আন',
+
+ // project notes
+ 'Project Notes':
+ 'প্রকল্প সম্পর্কিযে কোনত মন্তব্য',
+
+ // new project
+ 'New Project':
+ 'নতুন প্রকল্প',
+ 'Replace the current project with a new one?':
+ 'বর্তমান প্রকল্পটি নতুন প্রকল্প দ্বারা প্রতিস্থাপন করতে চাও?',
+
+ // save project
+ 'Save Project As...':
+ 'প্রকল্পটি নামান্তর কর...',
+
+ // export blocks
+ 'Export blocks':
+ 'ব্লক এক্সপোর্ট কর',
+ 'Import blocks':
+ 'ব্লক ইম্পোর্ট কর',
+ 'this project doesn\'t have any\ncustom global blocks yet':
+ 'এই প্রকল্পের জন্য এখনো কোনো কাস্টম গ্লোবাল ব্লক নেই',
+ 'select':
+ 'নির্বাচন কর',
+ 'all':
+ 'সকল',
+ 'none':
+ 'কোনোটাই না',
+
+ // variable dialog
+ 'for all sprites':
+ 'সব স্পাইটের জন্য',
+ 'for this sprite only':
+ 'শুধুমাত্র এই স্পাইটের জন্য',
+
+ // block dialog
+ 'Change block':
+ 'ব্লক পরিবর্তন ব্লক',
+ 'Command':
+ 'আদেশ',
+ 'Reporter':
+ 'প্রতিবেদক',
+ 'Predicate':
+ 'সূত্রের বিধেয়',
+
+ // block editor
+ 'Block Editor':
+ 'ব্লক সম্পাদনকারী',
+ 'Apply':
+ 'প্রয়োগ কর',
+
+ // block deletion dialog
+ 'Delete Custom Block':
+ 'কাস্টম ব্লক মুছে দাও',
+ 'block deletion dialog text':
+ 'তুমি কি এই কাস্টম ব্লক এবং সংশ্লিষ্ট সকল উপাদান মুছে দেওয়ার জন্য নিশ্চিত?',
+
+ // input dialog
+ 'Create input name':
+ 'ইনপুট নাম তৈরি কর',
+ 'Edit input name':
+ 'ইনপুট নাম সম্পাদনা কর',
+ 'Edit label fragment':
+ 'লেবেল টুকরা সম্পাদনা কর',
+ 'Title text':
+ 'শিরোনাম পাঠ্য',
+ 'Input name':
+ 'ইনপুট নাম',
+ 'Delete':
+ 'মুছে ফেল',
+ 'Object':
+ 'লক্ষ্যবস্তু',
+ 'Number':
+ 'সংখ্যা',
+ 'Text':
+ 'বর্ণ',
+ 'List':
+ 'তালিকা',
+ 'Any type':
+ 'যেকোন প্রকার',
+ 'Boolean (T/F)':
+ 'বুলিয়ান (সত্য/মিথ্যা)',
+ 'Command\n(inline)':
+ 'আদেশ \n(ইনলাইন)',
+ 'Command\n(C-shape)':
+ 'আদেশ \n(C-আকৃতি)',
+ 'Any\n(unevaluated)':
+ 'যেকোন \n(সংখ্যা অনির্ণয় করা)',
+ 'Boolean\n(unevaluated)':
+ 'বুলিয়ান \n(সংখ্যা অনির্ণয় করা)',
+ 'Single input.':
+ 'একক ইনপুট',
+ 'Default Value:':
+ 'ডিফল্ট (অনুপস্থিত)মান:',
+ 'Multiple inputs (value is list of inputs)':
+ 'একাধিক ইনপুট (মান ইনপুট তালিকা)',
+ 'Upvar - make internal variable visible to caller':
+ 'অভ্যন্তরীণ চলক আহ্বানকারীকে দৃশ্যমান কর',
+
+ // About Snap
+ 'About Snap':
+ 'Snap! সম্পর্কিত তথ্য',
+ 'Back...':
+ 'প্রত্যাবর্তন কর...',
+ 'License...':
+ 'লাইসেন্স...',
+ 'Modules...':
+ 'মডিউল...',
+ 'Credits...':
+ 'স্বীকৃতি...',
+ 'Translators...':
+ 'ভাষান্তরিকবৃন্দ',
+ 'License':
+ 'লাইসেন্স',
+ 'current module versions:':
+ 'বর্তমান মডিউল সংস্করণ',
+ 'Contributors':
+ 'সাহায্যকারীবৃন্দ',
+ 'Translations':
+ 'ভাষান্তরসমূহ',
+
+ // variable watchers
+ 'normal':
+ 'স্বাভাবিক',
+ 'large':
+ 'বৃহৎ',
+ 'slider':
+ 'স্লাইডার',
+ 'slider min...':
+ 'স্লাইডার সর্বনিম্ন...',
+ 'slider max...':
+ 'স্লাইডার সর্বোচ্চ...',
+ 'Slider minimum value':
+ 'স্লাইডারের সর্বনিম্ন মান',
+ 'Slider maximum value':
+ 'স্লাইডারের সর্বোচ্চ মান',
+
+ // list watchers
+ 'length: ':
+ 'দৈর্ঘ্য: ',
+
+ // coments
+ 'add comment here...':
+ 'এখানে মন্তব্য যোগ কর',
+
+ // drow downs
+ // directions
+ '(90) right':
+ '(90) ডিগ্রী ডান',
+ '(-90) left':
+ '(-90) ডিগ্রী বামে',
+ '(0) up':
+ '(0) উপরে',
+ '(180) down':
+ '(180) নিচে',
+
+ // collision detection
+ 'mouse-pointer':
+ 'মাউস-পয়েন্টার',
+ 'edge':
+ 'প্রান্ত',
+ 'pen trails':
+ 'কলম ভ্রমণ',
+
+ // costumes
+ 'Turtle':
+ 'কচ্ছপ',
+
+ // graphical effects
+ 'ghost':
+ 'উপচ্ছায়া',
+
+ // keys
+ 'space':
+ 'স্পেসবার',
+ 'up arrow':
+ 'আপ অ্যারো',
+ 'down arrow':
+ 'ডাউন অ্যারো',
+ 'right arrow':
+ 'রাইট অ্যারো',
+ 'left arrow':
+ 'লেফট অ্যারো',
+ 'a':
+ 'a',
+ 'b':
+ 'b',
+ 'c':
+ 'c',
+ 'd':
+ 'd',
+ 'e':
+ 'e',
+ 'f':
+ 'f',
+ 'g':
+ 'g',
+ 'h':
+ 'h',
+ 'i':
+ 'i',
+ 'j':
+ 'j',
+ 'k':
+ 'k',
+ 'l':
+ 'l',
+ 'm':
+ 'm',
+ 'n':
+ 'n',
+ 'o':
+ 'o',
+ 'p':
+ 'p',
+ 'q':
+ 'q',
+ 'r':
+ 'r',
+ 's':
+ 's',
+ 't':
+ 't',
+ 'u':
+ 'u',
+ 'v':
+ 'v',
+ 'w':
+ 'w',
+ 'x':
+ 'x',
+ 'y':
+ 'y',
+ 'z':
+ 'z',
+ '0':
+ '0',
+ '1':
+ '1',
+ '2':
+ '2',
+ '3':
+ '3',
+ '4':
+ '4',
+ '5':
+ '5',
+ '6':
+ '6',
+ '7':
+ '7',
+ '8':
+ '8',
+ '9':
+ '9',
+
+ // messages
+ 'new...':
+ 'নতুন বার্তা লিখ...',
+
+ // math functions
+ 'পরমমান':
+ 'abs',
+ 'sqrt':
+ 'বর্গমূল',
+ 'sin':
+ 'sin',
+ 'cos':
+ 'cos',
+ 'tan':
+ 'tan',
+ 'asin':
+ 'asin',
+ 'acos':
+ 'acos',
+ 'atan':
+ 'atan',
+ 'ln':
+ 'ln',
+ 'e^':
+ 'e^',
+
+ // data types
+ 'number':
+ 'সংখ্যা',
+ 'text':
+ 'বর্ণ',
+ 'Boolean':
+ 'বুলিয়ান',
+ 'list':
+ 'তালিকা',
+ 'command':
+ 'নির্দেশ',
+ 'reporter':
+ 'রিপোর্টার',
+ 'predicate':
+ 'সূত্রের বিধেয়',
+
+ // list indices
+ 'last':
+ 'সর্বশেষ',
+ 'any':
+ 'যেকোনো'
+};
diff --git a/libraries/word-sentence.xml b/libraries/word-sentence.xml
index ff2a1a7..050b417 100644
--- a/libraries/word-sentence.xml
+++ b/libraries/word-sentence.xml
@@ -1 +1 @@
-<blocks app="Snap! 4.0, http://snap.berkeley.edu" version="1"><block-definition s="all but first letter of %&apos;string&apos;" type="reporter" category="operators"><comment x="0" y="0" w="199" collapsed="false">Takes a text string as input, and reports a new text string containing all but the first character of the input.</comment><header></header><code></code><inputs><input type="%txt"></input></inputs><script><block s="doDeclareVariables"><list><l>result</l><l>i</l></list></block><block s="doWarp"><script><block s="doIf"><block s="reportEquals"><block s="reportStringSize"><block var="string"/></block><l>0</l></block><script><block s="doReport"><block s="reportListItem"><l>1</l><block s="reportSum"><l>0</l><l>0</l></block></block></block></script></block><block s="doSetVar"><l>result</l><l></l></block><block s="doSetVar"><l>i</l><l>2</l></block><block s="doUntil"><block s="reportGreaterThan"><block var="i"/><block s="reportStringSize"><block var="string"/></block></block><script><block s="doSetVar"><l>result</l><block s="reportJoinWords"><list><block var="result"/><block s="reportLetter"><block var="i"/><block var="string"/></block></list></block></block><block s="doChangeVar"><l>i</l><l>1</l></block></script></block><block s="doReport"><block var="result"/></block></script></block></script></block-definition><block-definition s="all but first word of %&apos;sentence&apos;" type="reporter" category="operators"><comment x="0" y="0" w="223.000001" collapsed="false">Takes a text string as input, divides it into words treating one or more spaces as a word separator (only spaces count; punctuation is part of the word) and reports a text string containing all but the first word, with one space between words and no spaces at the beginning or end. (Note: consider using SENTENCE-&gt;LIST and processing the resulting list instead of doing recursion on sentences in text string form. List operations are faster.)</comment><header></header><code></code><inputs><input type="%txt"></input></inputs><script><block s="doDeclareVariables"><list><l>index</l><l>bf</l></list></block><block s="doWarp"><script><block s="doSetVar"><l>bf</l><l></l></block><block s="doSetVar"><l>index</l><l>1</l></block><block s="doIf"><block s="reportEquals"><block s="reportStringSize"><block var="sentence"/></block><l>0</l></block><script><block s="doReport"><block s="reportListItem"><l>1</l><block s="reportJoinWords"><list><l>empty </l><l>sentence</l></list></block></block></block></script></block><block s="doUntil"><block s="reportOr"><block s="reportEquals"><block var="index"/><block s="reportStringSize"><block var="sentence"/></block></block><block s="reportNot"><block s="reportEquals"><block s="reportLetter"><block var="index"/><block var="sentence"/></block><l> </l></block></block></block><script><block s="doChangeVar"><l>index</l><l>1</l></block></script></block><block s="doIf"><block s="reportEquals"><block s="reportLetter"><block var="index"/><block var="sentence"/></block><l> </l></block><script><block s="doReport"><block s="reportListItem"><l>1</l><block s="reportJoinWords"><list><l>empty </l><l>sentence</l></list></block></block></block></script></block><block s="doUntil"><block s="reportOr"><block s="reportEquals"><block var="index"/><block s="reportStringSize"><block var="sentence"/></block></block><block s="reportEquals"><block s="reportLetter"><block var="index"/><block var="sentence"/></block><l> </l></block></block><script><block s="doChangeVar"><l>index</l><l>1</l></block></script></block><block s="doIf"><block s="reportEquals"><block var="index"/><block s="reportStringSize"><block var="sentence"/></block></block><script><block s="doReport"><l></l></block></script></block><block s="doUntil"><block s="reportOr"><block s="reportEquals"><block var="index"/><block s="reportStringSize"><block var="sentence"/></block></block><block s="reportNot"><block s="reportEquals"><block s="reportLetter"><block var="index"/><block var="sentence"/></block><l> </l></block></block></block><script><block s="doChangeVar"><l>index</l><l>1</l></block></script></block><block s="doIf"><block s="reportEquals"><block s="reportLetter"><block var="index"/><block var="sentence"/></block><l> </l></block><script><block s="doReport"><l></l></block></script></block><block s="doUntil"><block s="reportGreaterThan"><block var="index"/><block s="reportStringSize"><block var="sentence"/></block></block><script><block s="doSetVar"><l>bf</l><block s="reportJoinWords"><list><block var="bf"/><block s="reportLetter"><block var="index"/><block var="sentence"/></block></list></block></block><block s="doChangeVar"><l>index</l><l>1</l></block></script></block><block s="doReport"><block var="bf"/></block></script></block></script></block-definition><block-definition s="all but last letter of %&apos;string&apos;" type="reporter" category="operators"><comment x="0" y="0" w="218" collapsed="false">Takes a text string as input, and reports a new text string containing all but the last letter of the input.</comment><header></header><code></code><inputs><input type="%txt"></input></inputs><script><block s="doDeclareVariables"><list><l>result</l><l>i</l></list></block><block s="doWarp"><script><block s="doIf"><block s="reportEquals"><block s="reportStringSize"><block var="string"/></block><l>0</l></block><script><block s="doReport"><block s="reportListItem"><l>1</l><block s="reportSum"><l>0</l><l>0</l></block></block></block></script></block><block s="doSetVar"><l>result</l><l></l></block><block s="doSetVar"><l>i</l><l>1</l></block><block s="doUntil"><block s="reportEquals"><block var="i"/><block s="reportStringSize"><block var="string"/></block></block><script><block s="doSetVar"><l>result</l><block s="reportJoinWords"><list><block var="result"/><block s="reportLetter"><block var="i"/><block var="string"/></block></list></block></block><block s="doChangeVar"><l>i</l><l>1</l></block></script></block><block s="doReport"><block var="result"/></block></script></block></script></block-definition><block-definition s="all but last word of %&apos;sentence&apos;" type="reporter" category="operators"><comment x="0" y="0" w="212" collapsed="false">Takes a text string as input, divides it into words treating one or more spaces as a word separator (only spaces count; punctuation is part of the word) and reports a text string containing all but the last word, with one space between words and no spaces at the beginning or end. (Note: consider using SENTENCE-&gt;LIST and processing the resulting list instead of doing recursion on sentences in text string form. List operations are faster.)</comment><header></header><code></code><inputs><input type="%txt"></input></inputs><script><block s="doDeclareVariables"><list><l>index</l><l>bl</l></list></block><block s="doWarp"><script><block s="doSetVar"><l>bl</l><l></l></block><block s="doSetVar"><l>index</l><block s="reportStringSize"><block var="sentence"/></block></block><block s="doIf"><block s="reportEquals"><block s="reportStringSize"><block var="sentence"/></block><l>0</l></block><script><block s="doReport"><block s="reportListItem"><l>1</l><block s="reportJoinWords"><list><l>empty </l><l>sentence</l></list></block></block></block></script></block><block s="doUntil"><block s="reportOr"><block s="reportEquals"><block var="index"/><l>1</l></block><block s="reportNot"><block s="reportEquals"><block s="reportLetter"><block var="index"/><block var="sentence"/></block><l> </l></block></block></block><script><block s="doChangeVar"><l>index</l><l>-1</l></block></script></block><block s="doIf"><block s="reportEquals"><block s="reportLetter"><block var="index"/><block var="sentence"/></block><l> </l></block><script><block s="doReport"><block s="reportListItem"><l>1</l><block s="reportJoinWords"><list><l>empty </l><l>sentence</l></list></block></block></block></script></block><block s="doUntil"><block s="reportOr"><block s="reportEquals"><block var="index"/><l>1</l></block><block s="reportEquals"><block s="reportLetter"><block var="index"/><block var="sentence"/></block><l> </l></block></block><script><block s="doChangeVar"><l>index</l><l>-1</l></block></script></block><block s="doIf"><block s="reportEquals"><block var="index"/><l>1</l></block><script><block s="doReport"><l></l></block></script></block><block s="doUntil"><block s="reportOr"><block s="reportEquals"><block var="index"/><l>1</l></block><block s="reportNot"><block s="reportEquals"><block s="reportLetter"><block var="index"/><block var="sentence"/></block><l> </l></block></block></block><script><block s="doChangeVar"><l>index</l><l>-1</l></block></script></block><block s="doIf"><block s="reportEquals"><block s="reportLetter"><block var="index"/><block var="sentence"/></block><l> </l></block><script><block s="doReport"><l></l></block></script></block><block s="doUntil"><block s="reportLessThan"><block var="index"/><l>1</l></block><script><block s="doSetVar"><l>bl</l><block s="reportJoinWords"><list><block s="reportLetter"><block var="index"/><block var="sentence"/></block><block var="bl"/></list></block></block><block s="doChangeVar"><l>index</l><l>-1</l></block></script></block><block s="doReport"><block var="bl"/></block></script></block></script></block-definition><block-definition s="first word of %&apos;sentence&apos;" type="reporter" category="operators"><comment x="0" y="0" w="236" collapsed="false">Takes a text string as input, divides it into words treating one or more spaces as a word separator (only spaces count; punctuation is part of the word) and reports a text string containing only the first word, with no spaces before or after it.</comment><header></header><code></code><inputs><input type="%txt"></input></inputs><script><block s="doDeclareVariables"><list><l>index</l><l>first</l></list></block><block s="doWarp"><script><block s="doSetVar"><l>first</l><l></l></block><block s="doSetVar"><l>index</l><l>1</l></block><block s="doIf"><block s="reportEquals"><block s="reportStringSize"><block var="sentence"/></block><l>0</l></block><script><block s="doReport"><block s="reportListItem"><l>1</l><block s="reportJoinWords"><list><l>empty </l><l>sentence</l></list></block></block></block></script></block><block s="doUntil"><block s="reportOr"><block s="reportEquals"><block var="index"/><block s="reportStringSize"><block var="sentence"/></block></block><block s="reportNot"><block s="reportEquals"><block s="reportLetter"><block var="index"/><block var="sentence"/></block><l> </l></block></block></block><script><block s="doChangeVar"><l>index</l><l>1</l></block></script></block><block s="doIf"><block s="reportEquals"><block s="reportLetter"><block var="index"/><block var="sentence"/></block><l> </l></block><script><block s="doReport"><block s="reportListItem"><l>1</l><block s="reportJoinWords"><list><l>empty </l><l>sentence</l></list></block></block></block></script></block><block s="doUntil"><block s="reportOr"><block s="reportEquals"><block var="index"/><block s="reportStringSize"><block var="sentence"/></block></block><block s="reportEquals"><block s="reportLetter"><block var="index"/><block var="sentence"/></block><l> </l></block></block><script><block s="doSetVar"><l>first</l><block s="reportJoinWords"><list><block var="first"/><block s="reportLetter"><block var="index"/><block var="sentence"/></block></list></block></block><block s="doChangeVar"><l>index</l><l>1</l></block></script></block><block s="doIf"><block s="reportNot"><block s="reportEquals"><block s="reportLetter"><block var="index"/><block var="sentence"/></block><l> </l></block></block><script><block s="doSetVar"><l>first</l><block s="reportJoinWords"><list><block var="first"/><block s="reportLetter"><block var="index"/><block var="sentence"/></block></list></block></block></script></block><block s="doReport"><block var="first"/></block></script></block></script></block-definition><block-definition s="last letter of %&apos;word&apos;" type="reporter" category="operators"><comment x="0" y="0" w="260" collapsed="false">Takes a text string as input, and reports the last character in the string.</comment><header></header><code></code><inputs><input type="%txt"></input></inputs><script><block s="doReport"><block s="reportLetter"><block s="reportStringSize"><block var="word"/></block><block var="word"/></block></block></script></block-definition><block-definition s="last word of %&apos;sentence&apos;" type="reporter" category="operators"><comment x="0" y="0" w="262" collapsed="false">Takes a text string as input, divides it into words treating one or more spaces as a word separator (only spaces count; punctuation is part of the word) and reports a text string containing only the last word of the input, with no spaces before or after it.</comment><header></header><code></code><inputs><input type="%txt"></input></inputs><script><block s="doDeclareVariables"><list><l>index</l><l>last</l></list></block><block s="doWarp"><script><block s="doSetVar"><l>last</l><l></l></block><block s="doSetVar"><l>index</l><block s="reportStringSize"><block var="sentence"/></block></block><block s="doIf"><block s="reportEquals"><block s="reportStringSize"><block var="sentence"/></block><l>0</l></block><script><block s="doReport"><block s="reportListItem"><l>1</l><block s="reportJoinWords"><list><l>empty </l><l>sentence</l></list></block></block></block></script></block><block s="doUntil"><block s="reportOr"><block s="reportEquals"><block var="index"/><l>1</l></block><block s="reportNot"><block s="reportEquals"><block s="reportLetter"><block var="index"/><block var="sentence"/></block><l> </l></block></block></block><script><block s="doChangeVar"><l>index</l><l>-1</l></block></script></block><block s="doIf"><block s="reportEquals"><block s="reportLetter"><block var="index"/><block var="sentence"/></block><l> </l></block><script><block s="doReport"><block s="reportListItem"><l>1</l><block s="reportJoinWords"><list><l>empty </l><l>sentence</l></list></block></block></block></script></block><block s="doUntil"><block s="reportOr"><block s="reportEquals"><block var="index"/><l>1</l></block><block s="reportEquals"><block s="reportLetter"><block var="index"/><block var="sentence"/></block><l> </l></block></block><script><block s="doSetVar"><l>last</l><block s="reportJoinWords"><list><block s="reportLetter"><block var="index"/><block var="sentence"/></block><block var="last"/></list></block></block><block s="doChangeVar"><l>index</l><l>-1</l></block></script></block><block s="doIf"><block s="reportNot"><block s="reportEquals"><block s="reportLetter"><block var="index"/><block var="sentence"/></block><l> </l></block></block><script><block s="doSetVar"><l>last</l><block s="reportJoinWords"><list><block s="reportLetter"><block var="index"/><block var="sentence"/></block><block var="last"/></list></block></block></script></block><block s="doReport"><block var="last"/></block></script></block></script></block-definition><block-definition s="empty word? %&apos;word&apos;" type="predicate" category="operators"><comment x="0" y="0" w="208" collapsed="false">Takes a text string as input, and reports TRUE if the string has no characters in it of any kind, otherwise false.</comment><header></header><code></code><inputs><input type="%txt"></input></inputs><script><block s="doReport"><block s="reportEquals"><block s="reportStringSize"><block var="word"/></block><l>0</l></block></block></script></block-definition><block-definition s="empty sentence? %&apos;sentence&apos;" type="predicate" category="operators"><comment x="0" y="0" w="221" collapsed="false">Takes a text string as input, and reports TRUE if the input contains no characters other than spaces (therefore, no words when the string is considered as a sentence), otherwise FALSE.</comment><header></header><code></code><inputs><input type="%txt"></input></inputs><script><block s="doDeclareVariables"><list><l>index</l></list></block><block s="doSetVar"><l>index</l><l>1</l></block><block s="doIf"><block s="reportEquals"><block s="reportStringSize"><block var="sentence"/></block><l>0</l></block><script><block s="doReport"><block s="reportTrue"></block></block></script></block><block s="doUntil"><block s="reportOr"><block s="reportEquals"><block var="index"/><block s="reportStringSize"><block var="sentence"/></block></block><block s="reportNot"><block s="reportEquals"><block s="reportLetter"><block var="index"/><block var="sentence"/></block><l> </l></block></block></block><script><block s="doChangeVar"><l>index</l><l>1</l></block></script></block><block s="doReport"><block s="reportEquals"><block s="reportLetter"><block var="index"/><block var="sentence"/></block><l> </l></block></block></script></block-definition><block-definition s="word-&gt;list %&apos;text&apos;" type="reporter" category="operators"><comment w="160" collapsed="false">Takes a text string as input, and reports a list in which each item is a single character from the string.</comment><header></header><code></code><inputs><input type="%s"></input></inputs><script><block s="doDeclareVariables"><list><l>result</l><l>index</l></list></block><block s="doSetVar"><l>result</l><block s="reportNewList"><list></list></block></block><block s="doSetVar"><l>index</l><l>1</l></block><block s="doUntil"><block s="reportGreaterThan"><block var="index"/><block s="reportStringSize"><block var="text"/></block></block><script><block s="doAddToList"><block s="reportLetter"><block var="index"/><block var="text"/></block><block var="result"/></block><block s="doChangeVar"><l>index</l><l>1</l></block></script></block><block s="doReport"><block var="result"/></block></script></block-definition></blocks> \ No newline at end of file
+<blocks app="Snap! 4.0, http://snap.berkeley.edu" version="1"><block-definition s="all but first letter of %&apos;string&apos;" type="reporter" category="operators"><comment x="0" y="0" w="199" collapsed="false">Takes a text string as input, and reports a new text string containing all but the first character of the input.</comment><header></header><code></code><inputs><input type="%txt"></input></inputs><script><block s="doDeclareVariables"><list><l>result</l><l>i</l></list></block><block s="doWarp"><script><block s="doIf"><block s="reportEquals"><block s="reportStringSize"><block var="string"/></block><l>0</l></block><script><block s="doReport"><block s="reportListItem"><l>1</l><block s="reportSum"><l>0</l><l>0</l></block></block></block></script></block><block s="doSetVar"><l>result</l><l></l></block><block s="doSetVar"><l>i</l><l>2</l></block><block s="doUntil"><block s="reportGreaterThan"><block var="i"/><block s="reportStringSize"><block var="string"/></block></block><script><block s="doSetVar"><l>result</l><block s="reportJoinWords"><list><block var="result"/><block s="reportLetter"><block var="i"/><block var="string"/></block></list></block></block><block s="doChangeVar"><l>i</l><l>1</l></block></script></block><block s="doReport"><block var="result"/></block></script></block></script></block-definition><block-definition s="all but first word of %&apos;sentence&apos;" type="reporter" category="operators"><comment x="0" y="0" w="223.000001" collapsed="false">Takes a text string as input, divides it into words treating one or more spaces as a word separator (only spaces count; punctuation is part of the word) and reports a text string containing all but the first word, with one space between words and no spaces at the beginning or end. (Note: consider using SENTENCE-&gt;LIST and processing the resulting list instead of doing recursion on sentences in text string form. List operations are faster.)</comment><header></header><code></code><inputs><input type="%txt"></input></inputs><script><block s="doDeclareVariables"><list><l>index</l><l>bf</l></list></block><block s="doWarp"><script><block s="doSetVar"><l>bf</l><l></l></block><block s="doSetVar"><l>index</l><l>1</l></block><block s="doIf"><block s="reportEquals"><block s="reportStringSize"><block var="sentence"/></block><l>0</l></block><script><block s="doReport"><block s="reportListItem"><l>1</l><block s="reportJoinWords"><list><l>empty </l><l>sentence</l></list></block></block></block></script></block><block s="doUntil"><block s="reportOr"><block s="reportEquals"><block var="index"/><block s="reportStringSize"><block var="sentence"/></block></block><block s="reportNot"><block s="reportEquals"><block s="reportLetter"><block var="index"/><block var="sentence"/></block><l> </l></block></block></block><script><block s="doChangeVar"><l>index</l><l>1</l></block></script></block><block s="doIf"><block s="reportEquals"><block s="reportLetter"><block var="index"/><block var="sentence"/></block><l> </l></block><script><block s="doReport"><block s="reportListItem"><l>1</l><block s="reportJoinWords"><list><l>empty </l><l>sentence</l></list></block></block></block></script></block><block s="doUntil"><block s="reportOr"><block s="reportEquals"><block var="index"/><block s="reportStringSize"><block var="sentence"/></block></block><block s="reportEquals"><block s="reportLetter"><block var="index"/><block var="sentence"/></block><l> </l></block></block><script><block s="doChangeVar"><l>index</l><l>1</l></block></script></block><block s="doIf"><block s="reportEquals"><block var="index"/><block s="reportStringSize"><block var="sentence"/></block></block><script><block s="doReport"><l></l></block></script></block><block s="doUntil"><block s="reportOr"><block s="reportEquals"><block var="index"/><block s="reportStringSize"><block var="sentence"/></block></block><block s="reportNot"><block s="reportEquals"><block s="reportLetter"><block var="index"/><block var="sentence"/></block><l> </l></block></block></block><script><block s="doChangeVar"><l>index</l><l>1</l></block></script></block><block s="doIf"><block s="reportEquals"><block s="reportLetter"><block var="index"/><block var="sentence"/></block><l> </l></block><script><block s="doReport"><l></l></block></script></block><block s="doUntil"><block s="reportGreaterThan"><block var="index"/><block s="reportStringSize"><block var="sentence"/></block></block><script><block s="doSetVar"><l>bf</l><block s="reportJoinWords"><list><block var="bf"/><block s="reportLetter"><block var="index"/><block var="sentence"/></block></list></block></block><block s="doChangeVar"><l>index</l><l>1</l></block></script></block><block s="doReport"><block var="bf"/></block></script></block></script></block-definition><block-definition s="all but last letter of %&apos;string&apos;" type="reporter" category="operators"><comment x="0" y="0" w="218" collapsed="false">Takes a text string as input, and reports a new text string containing all but the last letter of the input.</comment><header></header><code></code><inputs><input type="%txt"></input></inputs><script><block s="doDeclareVariables"><list><l>result</l><l>i</l></list></block><block s="doWarp"><script><block s="doIf"><block s="reportEquals"><block s="reportStringSize"><block var="string"/></block><l>0</l></block><script><block s="doReport"><block s="reportListItem"><l>1</l><block s="reportSum"><l>0</l><l>0</l></block></block></block></script></block><block s="doSetVar"><l>result</l><l></l></block><block s="doSetVar"><l>i</l><l>1</l></block><block s="doUntil"><block s="reportEquals"><block var="i"/><block s="reportStringSize"><block var="string"/></block></block><script><block s="doSetVar"><l>result</l><block s="reportJoinWords"><list><block var="result"/><block s="reportLetter"><block var="i"/><block var="string"/></block></list></block></block><block s="doChangeVar"><l>i</l><l>1</l></block></script></block><block s="doReport"><block var="result"/></block></script></block></script></block-definition><block-definition s="all but last word of %&apos;sentence&apos;" type="reporter" category="operators"><comment x="0" y="0" w="212" collapsed="false">Takes a text string as input, divides it into words treating one or more spaces as a word separator (only spaces count; punctuation is part of the word) and reports a text string containing all but the last word, with one space between words and no spaces at the beginning or end. (Note: consider using SENTENCE-&gt;LIST and processing the resulting list instead of doing recursion on sentences in text string form. List operations are faster.)</comment><header></header><code></code><inputs><input type="%txt"></input></inputs><script><block s="doDeclareVariables"><list><l>index</l><l>bl</l></list></block><block s="doWarp"><script><block s="doSetVar"><l>bl</l><l></l></block><block s="doSetVar"><l>index</l><block s="reportStringSize"><block var="sentence"/></block></block><block s="doIf"><block s="reportEquals"><block s="reportStringSize"><block var="sentence"/></block><l>0</l></block><script><block s="doReport"><block s="reportListItem"><l>1</l><block s="reportJoinWords"><list><l>empty </l><l>sentence</l></list></block></block></block></script></block><block s="doUntil"><block s="reportOr"><block s="reportEquals"><block var="index"/><l>1</l></block><block s="reportNot"><block s="reportEquals"><block s="reportLetter"><block var="index"/><block var="sentence"/></block><l> </l></block></block></block><script><block s="doChangeVar"><l>index</l><l>-1</l></block></script></block><block s="doIf"><block s="reportEquals"><block s="reportLetter"><block var="index"/><block var="sentence"/></block><l> </l></block><script><block s="doReport"><block s="reportListItem"><l>1</l><block s="reportJoinWords"><list><l>empty </l><l>sentence</l></list></block></block></block></script></block><block s="doUntil"><block s="reportOr"><block s="reportEquals"><block var="index"/><l>1</l></block><block s="reportEquals"><block s="reportLetter"><block var="index"/><block var="sentence"/></block><l> </l></block></block><script><block s="doChangeVar"><l>index</l><l>-1</l></block></script></block><block s="doIf"><block s="reportEquals"><block var="index"/><l>1</l></block><script><block s="doReport"><l></l></block></script></block><block s="doUntil"><block s="reportOr"><block s="reportEquals"><block var="index"/><l>1</l></block><block s="reportNot"><block s="reportEquals"><block s="reportLetter"><block var="index"/><block var="sentence"/></block><l> </l></block></block></block><script><block s="doChangeVar"><l>index</l><l>-1</l></block></script></block><block s="doIf"><block s="reportEquals"><block s="reportLetter"><block var="index"/><block var="sentence"/></block><l> </l></block><script><block s="doReport"><l></l></block></script></block><block s="doUntil"><block s="reportLessThan"><block var="index"/><l>1</l></block><script><block s="doSetVar"><l>bl</l><block s="reportJoinWords"><list><block s="reportLetter"><block var="index"/><block var="sentence"/></block><block var="bl"/></list></block></block><block s="doChangeVar"><l>index</l><l>-1</l></block></script></block><block s="doReport"><block var="bl"/></block></script></block></script></block-definition><block-definition s="first word of %&apos;sentence&apos;" type="reporter" category="operators"><comment x="0" y="0" w="236" collapsed="false">Takes a text string as input, divides it into words treating one or more spaces as a word separator (only spaces count; punctuation is part of the word) and reports a text string containing only the first word, with no spaces before or after it.</comment><header></header><code></code><inputs><input type="%txt"></input></inputs><script><block s="doDeclareVariables"><list><l>index</l><l>first</l></list></block><block s="doWarp"><script><block s="doSetVar"><l>first</l><l></l></block><block s="doSetVar"><l>index</l><l>1</l></block><block s="doIf"><block s="reportEquals"><block s="reportStringSize"><block var="sentence"/></block><l>0</l></block><script><block s="doReport"><block s="reportListItem"><l>1</l><block s="reportJoinWords"><list><l>empty </l><l>sentence</l></list></block></block></block></script></block><block s="doUntil"><block s="reportOr"><block s="reportEquals"><block var="index"/><block s="reportStringSize"><block var="sentence"/></block></block><block s="reportNot"><block s="reportEquals"><block s="reportLetter"><block var="index"/><block var="sentence"/></block><l> </l></block></block></block><script><block s="doChangeVar"><l>index</l><l>1</l></block></script></block><block s="doIf"><block s="reportEquals"><block s="reportLetter"><block var="index"/><block var="sentence"/></block><l> </l></block><script><block s="doReport"><block s="reportListItem"><l>1</l><block s="reportJoinWords"><list><l>empty </l><l>sentence</l></list></block></block></block></script></block><block s="doUntil"><block s="reportOr"><block s="reportEquals"><block var="index"/><block s="reportStringSize"><block var="sentence"/></block></block><block s="reportEquals"><block s="reportLetter"><block var="index"/><block var="sentence"/></block><l> </l></block></block><script><block s="doSetVar"><l>first</l><block s="reportJoinWords"><list><block var="first"/><block s="reportLetter"><block var="index"/><block var="sentence"/></block></list></block></block><block s="doChangeVar"><l>index</l><l>1</l></block></script></block><block s="doIf"><block s="reportNot"><block s="reportEquals"><block s="reportLetter"><block var="index"/><block var="sentence"/></block><l> </l></block></block><script><block s="doSetVar"><l>first</l><block s="reportJoinWords"><list><block var="first"/><block s="reportLetter"><block var="index"/><block var="sentence"/></block></list></block></block></script></block><block s="doReport"><block var="first"/></block></script></block></script></block-definition><block-definition s="last letter of %&apos;word&apos;" type="reporter" category="operators"><comment x="0" y="0" w="260" collapsed="false">Takes a text string as input, and reports the last character in the string.</comment><header></header><code></code><inputs><input type="%txt"></input></inputs><script><block s="doReport"><block s="reportLetter"><block s="reportStringSize"><block var="word"/></block><block var="word"/></block></block></script></block-definition><block-definition s="last word of %&apos;sentence&apos;" type="reporter" category="operators"><comment x="0" y="0" w="262" collapsed="false">Takes a text string as input, divides it into words treating one or more spaces as a word separator (only spaces count; punctuation is part of the word) and reports a text string containing only the last word of the input, with no spaces before or after it.</comment><header></header><code></code><inputs><input type="%txt"></input></inputs><script><block s="doDeclareVariables"><list><l>index</l><l>last</l></list></block><block s="doWarp"><script><block s="doSetVar"><l>last</l><l></l></block><block s="doSetVar"><l>index</l><block s="reportStringSize"><block var="sentence"/></block></block><block s="doIf"><block s="reportEquals"><block s="reportStringSize"><block var="sentence"/></block><l>0</l></block><script><block s="doReport"><block s="reportListItem"><l>1</l><block s="reportJoinWords"><list><l>empty </l><l>sentence</l></list></block></block></block></script></block><block s="doUntil"><block s="reportOr"><block s="reportEquals"><block var="index"/><l>1</l></block><block s="reportNot"><block s="reportEquals"><block s="reportLetter"><block var="index"/><block var="sentence"/></block><l> </l></block></block></block><script><block s="doChangeVar"><l>index</l><l>-1</l></block></script></block><block s="doIf"><block s="reportEquals"><block s="reportLetter"><block var="index"/><block var="sentence"/></block><l> </l></block><script><block s="doReport"><block s="reportListItem"><l>1</l><block s="reportJoinWords"><list><l>empty </l><l>sentence</l></list></block></block></block></script></block><block s="doUntil"><block s="reportOr"><block s="reportEquals"><block var="index"/><l>1</l></block><block s="reportEquals"><block s="reportLetter"><block var="index"/><block var="sentence"/></block><l> </l></block></block><script><block s="doSetVar"><l>last</l><block s="reportJoinWords"><list><block s="reportLetter"><block var="index"/><block var="sentence"/></block><block var="last"/></list></block></block><block s="doChangeVar"><l>index</l><l>-1</l></block></script></block><block s="doIf"><block s="reportNot"><block s="reportEquals"><block s="reportLetter"><block var="index"/><block var="sentence"/></block><l> </l></block></block><script><block s="doSetVar"><l>last</l><block s="reportJoinWords"><list><block s="reportLetter"><block var="index"/><block var="sentence"/></block><block var="last"/></list></block></block></script></block><block s="doReport"><block var="last"/></block></script></block></script></block-definition><block-definition s="empty word? %&apos;word&apos;" type="predicate" category="operators"><comment x="0" y="0" w="208" collapsed="false">Takes a text string as input, and reports TRUE if the string has no characters in it of any kind, otherwise false.</comment><header></header><code></code><inputs><input type="%txt"></input></inputs><script><block s="doReport"><block s="reportEquals"><block s="reportStringSize"><block var="word"/></block><l>0</l></block></block></script></block-definition><block-definition s="empty sentence? %&apos;sentence&apos;" type="predicate" category="operators"><comment x="0" y="0" w="221" collapsed="false">Takes a text string as input, and reports TRUE if the input contains no characters other than spaces (therefore, no words when the string is considered as a sentence), otherwise FALSE.</comment><header></header><code></code><inputs><input type="%txt"></input></inputs><script><block s="doDeclareVariables"><list><l>index</l></list></block><block s="doSetVar"><l>index</l><l>1</l></block><block s="doIf"><block s="reportEquals"><block s="reportStringSize"><block var="sentence"/></block><l>0</l></block><script><block s="doReport"><block s="reportTrue"></block></block></script></block><block s="doUntil"><block s="reportOr"><block s="reportEquals"><block var="index"/><block s="reportStringSize"><block var="sentence"/></block></block><block s="reportNot"><block s="reportEquals"><block s="reportLetter"><block var="index"/><block var="sentence"/></block><l> </l></block></block></block><script><block s="doChangeVar"><l>index</l><l>1</l></block></script></block><block s="doReport"><block s="reportEquals"><block s="reportLetter"><block var="index"/><block var="sentence"/></block><l> </l></block></block></script></block-definition><block-definition s="word $arrowRight list %&apos;text&apos;" type="reporter" category="operators"><comment w="160" collapsed="false">Takes a text string as input, and reports a list in which each item is a single character from the string.</comment><header></header><code></code><inputs><input type="%s"></input></inputs><script><block s="doDeclareVariables"><list><l>result</l><l>index</l></list></block><block s="doSetVar"><l>result</l><block s="reportNewList"><list></list></block></block><block s="doSetVar"><l>index</l><l>1</l></block><block s="doUntil"><block s="reportGreaterThan"><block var="index"/><block s="reportStringSize"><block var="text"/></block></block><script><block s="doAddToList"><block s="reportLetter"><block var="index"/><block var="text"/></block><block var="result"/></block><block s="doChangeVar"><l>index</l><l>1</l></block></script></block><block s="doReport"><block var="result"/></block></script></block-definition></blocks> \ No newline at end of file
diff --git a/lists.js b/lists.js
index ea553b0..c5a7cc6 100644
--- a/lists.js
+++ b/lists.js
@@ -61,7 +61,7 @@ PushButtonMorph, SyntaxElementMorph, Color, Point, WatcherMorph,
StringMorph, SpriteMorph, ScrollFrameMorph, CellMorph, ArrowMorph,
MenuMorph, snapEquals, Morph, isNil, localize, MorphicPreferences*/
-modules.lists = '2014-Jun-04';
+modules.lists = '2014-July-14';
var List;
var ListWatcherMorph;
@@ -132,19 +132,19 @@ List.prototype.cons = function (car, cdr) {
};
List.prototype.cdr = function () {
- function helper(i) {
- if (i > this.contents.length) {
- return new List();
- }
- return this.cons(this.at(i), helper.call(this, i + 1));
- }
+ var result, i;
if (this.isLinked) {
return this.rest || new List();
}
if (this.contents.length < 2) {
return new List();
}
- return helper.call(this, 2);
+
+ result = new List();
+ for (i = this.contents.length; i > 1; i -= 1) {
+ result = this.cons(this.at(i), result);
+ }
+ return result;
};
// List array setters:
@@ -193,32 +193,41 @@ List.prototype.clear = function () {
List.prototype.length = function () {
if (this.isLinked) {
- return (this.first === undefined ? 0 : 1)
- + (this.rest ? this.rest.length() : 0);
+ var pair = this,
+ result = 0;
+ while (pair && pair.isLinked) {
+ result += 1;
+ pair = pair.rest;
+ }
+ return result + (pair ? pair.contents.length : 0);
}
return this.contents.length;
};
List.prototype.at = function (index) {
- var value, idx = +index;
- if (this.isLinked) {
- return idx === 1 ? this.first : this.rest.at(idx - 1);
+ var value, idx = +index, pair = this;
+ while (pair.isLinked) {
+ if (idx > 1) {
+ pair = pair.rest;
+ idx -= 1;
+ } else {
+ return pair.first;
+ }
}
- value = this.contents[idx - 1];
+ value = pair.contents[idx - 1];
return isNil(value) ? '' : value;
};
List.prototype.contains = function (element) {
- if (this.isLinked) {
+ var pair = this;
+ while (pair.isLinked) {
if (snapEquals(this.first, element)) {
return true;
}
- if (this.rest instanceof List) {
- return this.rest.contains(element);
- }
+ pair = pair.rest;
}
// in case I'm arrayed
- return this.contents.some(function (any) {
+ return pair.contents.some(function (any) {
return snapEquals(any, element);
});
};
@@ -233,11 +242,23 @@ List.prototype.asArray = function () {
List.prototype.asText = function () {
var result = '',
- length = this.length(),
+ length,
element,
+ pair = this,
i;
+ while (pair.isLinked) {
+ element = this.first;
+ if (element instanceof List) {
+ result = result.concat(element.asText());
+ } else {
+ element = isNil(element) ? '' : element.toString();
+ result = result.concat(element);
+ }
+ pair = pair.rest;
+ }
+ length = pair.length();
for (i = 1; i <= length; i += 1) {
- element = this.at(i);
+ element = pair.at(i);
if (element instanceof List) {
result = result.concat(element.asText());
} else {
@@ -250,13 +271,18 @@ List.prototype.asText = function () {
List.prototype.becomeArray = function () {
if (this.isLinked) {
- var next = this;
+ var next = this, i;
this.contents = [];
- while (next instanceof List && (next.length() > 0)) {
- this.contents.push(next.at(1));
- next = next.cdr();
+ while (next.isLinked) {
+ this.contents.push(next.first);
+ next = next.rest;
+ }
+ for (i = 1; i <= next.contents.length; i += 1) {
+ this.contents.push(next.at(i));
}
this.isLinked = false;
+ this.first = null;
+ this.rest = null;
}
};
@@ -278,37 +304,47 @@ List.prototype.becomeLinked = function () {
// List testing
List.prototype.equalTo = function (other) {
- var i;
+ var myself = this, it = other, i, j, loopcount;
if (!(other instanceof List)) {
return false;
}
- if ((!this.isLinked) && (!other.isLinked)) {
- if (this.length() === 0 && (other.length() === 0)) {
- return true;
- }
- if (this.length() !== other.length()) {
+
+ while (myself.isLinked && it.isLinked) {
+ if (!snapEquals(myself.first, it.first)) {
return false;
}
- for (i = 0; i < this.length(); i += 1) {
- if (!snapEquals(this.contents[i], other.contents[i])) {
- return false;
- }
- }
- return true;
+ myself = myself.rest;
+ it = it.rest;
}
- if ((this.isLinked) && (other.isLinked)) {
- if (snapEquals(this.at(1), other.at(1))) {
- return this.cdr().equalTo(other.cdr());
+
+ if (it.isLinked) {
+ i = it;
+ it = myself;
+ myself = i;
+ }
+
+ j = 0;
+ while (myself.isLinked) {
+ if (!snapEquals(myself.first, it.contents[j])) {
+ return false;
}
- return false;
+ myself = myself.rest;
+ j += 1;
}
- if (this.length() !== other.length()) {
+
+ i = 0;
+ if (myself.contents.length !== (it.contents.length - j)) {
return false;
}
- for (i = 1; i <= this.length(); i += 1) {
- if (!snapEquals(this.at(i), other.at(i))) {
+
+ loopcount = myself.contents.length;
+ while (loopcount > 0) {
+ loopcount -= 1;
+ if (!snapEquals(myself.contents[i], it.contents[j])) {
return false;
}
+ i += 1;
+ j += 1;
}
return true;
};
diff --git a/locale.js b/locale.js
index 614b38c..eac17c0 100644
--- a/locale.js
+++ b/locale.js
@@ -42,7 +42,7 @@
/*global modules, contains*/
-modules.locale = '2014-Jun-04';
+modules.locale = '2014-July-14';
// Global stuff
@@ -225,7 +225,7 @@ SnapTranslator.dict.cs = {
};
SnapTranslator.dict.zh = {
- // translations meta information
+ // meta information
'language_name':
'简体中文',
'language_translator':
@@ -237,7 +237,7 @@ SnapTranslator.dict.zh = {
};
SnapTranslator.dict.eo = {
- // translations meta information
+ // meta information
'language_name':
'Esperanto',
'language_translator':
@@ -249,7 +249,7 @@ SnapTranslator.dict.eo = {
};
SnapTranslator.dict.fr = {
- // translations meta information
+ // meta information
'language_name':
'Fran\u00E7ais',
'language_translator':
@@ -261,6 +261,7 @@ SnapTranslator.dict.fr = {
};
SnapTranslator.dict.si = {
+ // meta information
'language_name':
'Sloven\u0161\u010Dina',
'language_translator':
@@ -272,6 +273,7 @@ SnapTranslator.dict.si = {
};
SnapTranslator.dict.ru = {
+ // meta information
'language_name':
'Русский',
'language_translator':
@@ -283,6 +285,7 @@ SnapTranslator.dict.ru = {
};
SnapTranslator.dict.es = {
+ // meta information
'language_name':
'Espa\u00F1ol',
'language_translator':
@@ -294,6 +297,7 @@ SnapTranslator.dict.es = {
};
SnapTranslator.dict.nl = {
+ // meta information
'language_name':
'Nederlands',
'language_translator':
@@ -305,6 +309,7 @@ SnapTranslator.dict.nl = {
};
SnapTranslator.dict.pl = {
+ // meta information
'language_name':
'Polski',
'language_translator':
@@ -316,6 +321,7 @@ SnapTranslator.dict.pl = {
};
SnapTranslator.dict.tw = {
+ // meta information
'language_name':
'繁體中文',
'language_translator':
@@ -327,6 +333,7 @@ SnapTranslator.dict.tw = {
};
SnapTranslator.dict.no = {
+ // meta information
'language_name':
'Norsk',
'language_translator':
@@ -338,6 +345,7 @@ SnapTranslator.dict.no = {
};
SnapTranslator.dict.dk = {
+ // meta information
'language_name':
'Dansk',
'language_translator':
@@ -349,6 +357,7 @@ SnapTranslator.dict.dk = {
};
SnapTranslator.dict.el = {
+ // meta information
'language_name':
'Ελληνικά',
'language_translator':
@@ -360,6 +369,7 @@ SnapTranslator.dict.el = {
};
SnapTranslator.dict.ca = {
+ // meta information
'language_name':
'Català',
'language_translator':
@@ -394,3 +404,14 @@ SnapTranslator.dict.pt_BR = {
'2014-04-20'
};
+SnapTranslator.dict.bn = {
+ // meta information
+ 'language_name':
+ 'বাংলা',
+ 'language_translator':
+ 'Dr. Mokter Hossain',
+ 'translator_e-mail':
+ 'mokter@gmail.com',
+ 'last_changed':
+ '2014-07-02'
+};
diff --git a/morphic.js b/morphic.js
index 7d1f53d..39b8741 100644
--- a/morphic.js
+++ b/morphic.js
@@ -1035,7 +1035,7 @@
/*global window, HTMLCanvasElement, getMinimumFontHeight, FileReader, Audio,
FileList, getBlurredShadowSupport*/
-var morphicVersion = '2014-May-20';
+var morphicVersion = '2014-July-11';
var modules = {}; // keep track of additional loaded modules
var useBlurredShadows = getBlurredShadowSupport(); // check for Chrome-bug
@@ -4495,9 +4495,9 @@ CursorMorph.prototype.processKeyPress = function (event) {
}
if (event.keyCode) { // Opera doesn't support charCode
if (event.ctrlKey) {
- this.ctrl(event.keyCode);
+ this.ctrl(event.keyCode, event.shiftKey);
} else if (event.metaKey) {
- this.cmd(event.keyCode);
+ this.cmd(event.keyCode, event.shiftKey);
} else {
this.insert(
String.fromCharCode(event.keyCode),
@@ -4506,9 +4506,9 @@ CursorMorph.prototype.processKeyPress = function (event) {
}
} else if (event.charCode) { // all other browsers
if (event.ctrlKey) {
- this.ctrl(event.charCode);
+ this.ctrl(event.charCode, event.shiftKey);
} else if (event.metaKey) {
- this.cmd(event.keyCode);
+ this.cmd(event.charCode, event.shiftKey);
} else {
this.insert(
String.fromCharCode(event.charCode),
@@ -4525,13 +4525,13 @@ CursorMorph.prototype.processKeyDown = function (event) {
var shift = event.shiftKey;
this.keyDownEventUsed = false;
if (event.ctrlKey) {
- this.ctrl(event.keyCode);
+ this.ctrl(event.keyCode, event.shiftKey);
// notify target's parent of key event
this.target.escalateEvent('reactToKeystroke', event);
return;
}
if (event.metaKey) {
- this.cmd(event.keyCode);
+ this.cmd(event.keyCode, event.shiftKey);
// notify target's parent of key event
this.target.escalateEvent('reactToKeystroke', event);
return;
@@ -4746,8 +4746,10 @@ CursorMorph.prototype.insert = function (aChar, shiftKey) {
}
};
-CursorMorph.prototype.ctrl = function (aChar) {
- if ((aChar === 97) || (aChar === 65)) {
+CursorMorph.prototype.ctrl = function (aChar, shiftKey) {
+ if (aChar === 64 || (aChar === 65 && shiftKey)) {
+ this.insert('@');
+ } else if (aChar === 65) {
this.target.selectAll();
} else if (aChar === 90) {
this.undo();
@@ -4759,17 +4761,34 @@ CursorMorph.prototype.ctrl = function (aChar) {
this.insert('[');
} else if (aChar === 93) {
this.insert(']');
- } else if (aChar === 64) {
- this.insert('@');
+ } else if (!isNil(this.target.receiver)) {
+ if (aChar === 68) {
+ this.target.doIt();
+ } else if (aChar === 73) {
+ this.target.inspectIt();
+ } else if (aChar === 80) {
+ this.target.showIt();
+ }
}
+
};
-CursorMorph.prototype.cmd = function (aChar) {
- if (aChar === 65) {
+CursorMorph.prototype.cmd = function (aChar, shiftKey) {
+ if (aChar === 64 || (aChar === 65 && shiftKey)) {
+ this.insert('@');
+ } else if (aChar === 65) {
this.target.selectAll();
} else if (aChar === 90) {
this.undo();
+ } else if (!isNil(this.target.receiver)) {
+ if (aChar === 68) {
+ this.target.doIt();
+ } else if (aChar === 73) {
+ this.target.inspectIt();
+ } else if (aChar === 80) {
+ this.target.showIt();
+ }
}
};
@@ -6141,6 +6160,7 @@ InspectorMorph.prototype.init = function (target) {
this.currentProperty = null;
this.showing = 'attributes';
this.markOwnProperties = false;
+ this.hasUserEditedDetails = false;
// initialize inherited properties:
InspectorMorph.uber.init.call(this);
@@ -6157,6 +6177,7 @@ InspectorMorph.prototype.init = function (target) {
this.edge = MorphicPreferences.isFlat ? 1 : 5;
this.color = new Color(60, 60, 60);
this.borderColor = new Color(95, 95, 95);
+ this.fps = 25;
this.drawNew();
// panes:
@@ -6181,6 +6202,36 @@ InspectorMorph.prototype.setTarget = function (target) {
this.buildPanes();
};
+InspectorMorph.prototype.updateCurrentSelection = function () {
+ var val, txt, cnts,
+ sel = this.list.selected,
+ currentTxt = this.detail.contents.children[0],
+ root = this.root();
+
+ if (root &&
+ (root.keyboardReceiver instanceof CursorMorph) &&
+ (root.keyboardReceiver.target === currentTxt)) {
+ this.hasUserEditedDetails = true;
+ return;
+ }
+ if (isNil(sel) || this.hasUserEditedDetails) {return; }
+ val = this.target[sel];
+ this.currentProperty = val;
+ if (isNil(val)) {
+ txt = 'NULL';
+ } else if (isString(val)) {
+ txt = val;
+ } else {
+ txt = val.toString();
+ }
+ if (currentTxt.text === txt) {return; }
+ cnts = new TextMorph(txt);
+ cnts.isEditable = true;
+ cnts.enableSelecting();
+ cnts.setReceiver(this.target);
+ this.detail.setContents(cnts);
+};
+
InspectorMorph.prototype.buildPanes = function () {
var attribs = [], property, myself = this, ctrl, ev, doubleClickAction;
@@ -6248,23 +6299,9 @@ InspectorMorph.prototype.buildPanes = function () {
doubleClickAction
);
- this.list.action = function (selected) {
- var val, txt, cnts;
- if (selected === undefined) {return; }
- val = myself.target[selected];
- myself.currentProperty = val;
- if (val === null) {
- txt = 'NULL';
- } else if (isString(val)) {
- txt = val;
- } else {
- txt = val.toString();
- }
- cnts = new TextMorph(txt);
- cnts.isEditable = true;
- cnts.enableSelecting();
- cnts.setReceiver(myself.target);
- myself.detail.setContents(cnts);
+ this.list.action = function () {
+ myself.hasUserEditedDetails = false;
+ myself.updateCurrentSelection();
};
this.list.hBar.alpha = 0.6;
@@ -6512,6 +6549,7 @@ InspectorMorph.prototype.save = function () {
try {
// this.target[prop] = evaluate(txt);
this.target.evaluateString('this.' + prop + ' = ' + txt);
+ this.hasUserEditedDetails = false;
if (this.target.drawNew) {
this.target.changed();
this.target.drawNew();
@@ -6582,6 +6620,17 @@ InspectorMorph.prototype.removeProperty = function () {
}
};
+// InspectorMorph stepping
+
+InspectorMorph.prototype.step = function () {
+ this.updateCurrentSelection();
+ var lbl = this.target.toString();
+ if (this.label.text === lbl) {return; }
+ this.label.text = lbl;
+ this.label.drawNew();
+ this.fixLayout();
+};
+
// MenuMorph ///////////////////////////////////////////////////////////
// MenuMorph: referenced constructors
@@ -6844,6 +6893,9 @@ MenuMorph.prototype.popup = function (world, pos) {
if (world.activeMenu) {
world.activeMenu.destroy();
}
+ if (this.items.length < 1 && !this.title) { // don't show empty menus
+ return;
+ }
world.add(this);
world.activeMenu = this;
this.fullChanged();
@@ -7924,7 +7976,7 @@ TextMorph.prototype.inspectIt = function () {
var result = this.receiver.evaluateString(this.selection()),
world = this.world(),
inspector;
- if (result !== null) {
+ if (isObject(result)) {
inspector = new InspectorMorph(result);
inspector.setPosition(world.hand.position());
inspector.keepWithin(world);
@@ -9046,6 +9098,7 @@ ListMorph.prototype.buildListContents = function () {
};
ListMorph.prototype.select = function (item, trigger) {
+ if (isNil(item)) {return; }
this.selected = item;
this.active = trigger;
if (this.action) {
diff --git a/objects.js b/objects.js
index 55d30b1..20f1434 100644
--- a/objects.js
+++ b/objects.js
@@ -125,7 +125,7 @@ PrototypeHatBlockMorph*/
// Global stuff ////////////////////////////////////////////////////////
-modules.objects = '2014-Jun-06';
+modules.objects = '2014-July-11';
var SpriteMorph;
var StageMorph;
@@ -2280,6 +2280,11 @@ SpriteMorph.prototype.freshPalette = function (category) {
}
});
+ //layout
+
+ palette.scrollX(palette.padding);
+ palette.scrollY(palette.padding);
+
Morph.prototype.trackChanges = oldFlag;
return palette;
};
@@ -2582,7 +2587,7 @@ SpriteMorph.prototype.userMenu = function () {
menu = new MenuMorph(this);
if (ide && ide.isAppMode) {
- menu.addItem('help', 'nop');
+ // menu.addItem('help', 'nop');
return menu;
}
menu.addItem("duplicate", 'duplicate');
@@ -4638,6 +4643,9 @@ StageMorph.prototype.fireKeyEvent = function (key) {
if (evt === 'ctrl f') {
return this.parentThatIsA(IDE_Morph).currentSprite.searchBlocks();
}
+ if (evt === 'ctrl n') {
+ return this.parentThatIsA(IDE_Morph).createNewProject();
+ }
if (evt === 'ctrl o') {
return this.parentThatIsA(IDE_Morph).openProjectsBrowser();
}
@@ -5172,7 +5180,7 @@ StageMorph.prototype.userMenu = function () {
myself = this;
if (ide && ide.isAppMode) {
- menu.addItem('help', 'nop');
+ // menu.addItem('help', 'nop');
return menu;
}
menu.addItem("edit", 'edit');
diff --git a/threads.js b/threads.js
index d489441..50abf78 100644
--- a/threads.js
+++ b/threads.js
@@ -83,7 +83,7 @@ ArgLabelMorph, localize, XML_Element, hex_sha512*/
// Global stuff ////////////////////////////////////////////////////////
-modules.threads = '2014-Jun-05';
+modules.threads = '2014-July-11';
var ThreadManager;
var Process;
@@ -673,11 +673,13 @@ Process.prototype.doYield = function () {
// Process Exception Handling
Process.prototype.handleError = function (error, element) {
+ var m = element;
this.stop();
this.errorFlag = true;
this.topBlock.addErrorHighlight();
- (element || this.topBlock).showBubble(
- (element ? '' : 'Inside: ')
+ if (isNil(m) || isNil(m.world())) {m = this.topBlock; }
+ m.showBubble(
+ (m === element ? '' : 'Inside: ')
+ error.name
+ '\n'
+ error.message
@@ -1057,7 +1059,6 @@ Process.prototype.evaluateCustomBlock = function () {
}
};
-
// Process variables primitives
Process.prototype.doDeclareVariables = function (varNames) {
@@ -2234,14 +2235,14 @@ Process.prototype.getObjectsNamed = function (name, thisObj, stageObj) {
};
Process.prototype.doFaceTowards = function (name) {
- var thisObj = this.homeContext.receiver,
+ var thisObj = this.blockReceiver(),
thatObj;
if (thisObj) {
if (this.inputOption(name) === 'mouse-pointer') {
thisObj.faceToXY(this.reportMouseX(), this.reportMouseY());
} else {
- thatObj = this.getOtherObject(name, thisObj);
+ thatObj = this.getOtherObject(name, this.homeContext.receiver);
if (thatObj) {
thisObj.faceToXY(
thatObj.xPosition(),
@@ -2253,14 +2254,14 @@ Process.prototype.doFaceTowards = function (name) {
};
Process.prototype.doGotoObject = function (name) {
- var thisObj = this.homeContext.receiver,
+ var thisObj = this.blockReceiver(),
thatObj;
if (thisObj) {
if (this.inputOption(name) === 'mouse-pointer') {
thisObj.gotoXY(this.reportMouseX(), this.reportMouseY());
} else {
- thatObj = this.getOtherObject(name, thisObj);
+ thatObj = this.getOtherObject(name, this.homeContext.receiver);
if (thatObj) {
thisObj.gotoXY(
thatObj.xPosition(),
diff --git a/tools.xml b/tools.xml
index 6942dea..0a77082 100644
--- a/tools.xml
+++ b/tools.xml
@@ -1 +1 @@
-<blocks app="Snap! 4.0, http://snap.berkeley.edu" version="1"><block-definition s="map %&apos;function&apos; over %&apos;lists&apos;" type="reporter" category="lists"><inputs><input type="%repRing"></input><input type="%mult%l"></input></inputs><script><block s="doWarp"><script><block s="doDeclareVariables"><list><l>mapone</l><l>mapmany</l></list></block><block s="doSetVar"><l>mapone</l><block s="reifyScript"><script><block s="doIf"><custom-block s="empty? %l"><block var="data"/></custom-block><script><block s="doReport"><block s="reportNewList"><list></list></block></block></script></block><block s="doReport"><block s="reportCONS"><block s="evaluate"><block var="function"/><list><block s="reportListItem"><l>1</l><block var="data"/></block></list></block><block s="evaluate"><block var="mapone"/><list><block s="reportCDR"><block var="data"/></block></list></block></block></block></script><list><l>data</l></list></block></block><block s="doSetVar"><l>mapmany</l><block s="reifyScript"><script><block s="doIf"><custom-block s="empty? %l"><block s="reportListItem"><l>1</l><block var="data lists"/></block></custom-block><script><block s="doReport"><block s="reportNewList"><list></list></block></block></script></block><block s="doReport"><block s="reportCONS"><block s="evaluate"><block var="function"/><custom-block s="map %repRing over %mult%l"><block s="reifyReporter"><autolambda><block s="reportListItem"><l>1</l><l/></block></autolambda><list></list></block><list><block var="data lists"/></list></custom-block></block><block s="evaluate"><block var="mapmany"/><list><custom-block s="map %repRing over %mult%l"><block s="reifyReporter"><autolambda><block s="reportCDR"><l/></block></autolambda><list></list></block><list><block var="data lists"/></list></custom-block></list></block></block></block></script><list><l>data lists</l></list></block></block><block s="doIfElse"><custom-block s="empty? %l"><block s="reportCDR"><block var="lists"/></block></custom-block><script><block s="doReport"><block s="evaluate"><block var="mapone"/><list><block s="reportListItem"><l>1</l><block var="lists"/></block></list></block></block></script><script><block s="doReport"><block s="evaluate"><block var="mapmany"/><list><block var="lists"/></list></block></block></script></block></script></block></script></block-definition><block-definition s="empty? %&apos;data&apos;" type="predicate" category="lists"><inputs><input type="%l"></input></inputs><script><block s="doReport"><block s="reportEquals"><block var="data"/><block s="reportNewList"><list></list></block></block></block></script></block-definition><block-definition s="keep items such that %&apos;pred&apos; from %&apos;data&apos;" type="reporter" category="lists"><inputs><input type="%predRing"></input><input type="%l"></input></inputs><script><block s="doWarp"><script><block s="doIf"><custom-block s="empty? %l"><block var="data"/></custom-block><script><block s="doReport"><block s="reportNewList"><list></list></block></block></script></block><block s="doIfElse"><block s="evaluate"><block var="pred"/><list><block s="reportListItem"><l>1</l><block var="data"/></block></list></block><script><block s="doReport"><block s="reportCONS"><block s="reportListItem"><l>1</l><block var="data"/></block><custom-block s="keep items such that %predRing from %l"><block var="pred"/><block s="reportCDR"><block var="data"/></block></custom-block></block></block></script><script><block s="doReport"><custom-block s="keep items such that %predRing from %l"><block var="pred"/><block s="reportCDR"><block var="data"/></block></custom-block></block></script></block></script></block></script></block-definition><block-definition s="combine with %&apos;function&apos; items of %&apos;data&apos;" type="reporter" category="lists"><inputs><input type="%repRing"></input><input type="%l"></input></inputs><script><block s="doWarp"><script><block s="doIf"><custom-block s="empty? %l"><block s="reportCDR"><block var="data"/></block></custom-block><script><block s="doReport"><block s="reportListItem"><l>1</l><block var="data"/></block></block></script></block><block s="doReport"><block s="evaluate"><block var="function"/><list><block s="reportListItem"><l>1</l><block var="data"/></block><custom-block s="combine with %repRing items of %l"><block var="function"/><block s="reportCDR"><block var="data"/></block></custom-block></list></block></block></script></block></script></block-definition><block-definition s="if %&apos;test&apos; then %&apos;true&apos; else %&apos;false&apos;" type="reporter" category="control"><inputs><input type="%b"></input><input type="%anyUE"></input><input type="%anyUE"></input></inputs><script><block s="doIfElse"><block var="test"/><script><block s="doReport"><block s="evaluate"><block var="true"/><list></list></block></block></script><script><block s="doReport"><block s="evaluate"><block var="false"/><list></list></block></block></script></block></script></block-definition><block-definition s="for %&apos;i&apos; = %&apos;start&apos; to %&apos;end&apos; %&apos;action&apos;" type="command" category="control"><inputs><input type="%upvar"></input><input type="%n">1</input><input type="%n">10</input><input type="%cs"></input></inputs><script><block s="doDeclareVariables"><list><l>step</l><l>tester</l></list></block><block s="doIfElse"><block s="reportGreaterThan"><block var="start"/><block var="end"/></block><script><block s="doSetVar"><l>step</l><l>-1</l></block><block s="doSetVar"><l>tester</l><block s="reifyReporter"><autolambda><block s="reportLessThan"><block var="i"/><block var="end"/></block></autolambda><list></list></block></block></script><script><block s="doSetVar"><l>step</l><l>1</l></block><block s="doSetVar"><l>tester</l><block s="reifyReporter"><autolambda><block s="reportGreaterThan"><block var="i"/><block var="end"/></block></autolambda><list></list></block></block></script></block><block s="doSetVar"><l>i</l><block var="start"/></block><block s="doUntil"><block s="evaluate"><block var="tester"/><list></list></block><script><block s="doRun"><block var="action"/><list></list></block><block s="doChangeVar"><l>i</l><block var="step"/></block></script></block></script></block-definition><block-definition s="join words %&apos;words&apos;" type="reporter" category="operators"><inputs><input type="%mult%txt"></input></inputs><script><block s="doWarp"><script><block s="doIf"><custom-block s="empty? %l"><block s="reportCDR"><block var="words"/></block></custom-block><script><block s="doReport"><block s="reportListItem"><l>1</l><block var="words"/></block></block></script></block><block s="doReport"><block s="reportJoinWords"><list><block s="reportListItem"><l>1</l><block var="words"/></block><block s="reportJoinWords"><list><l> </l><block s="evaluate"><block s="reifyReporter"><autolambda><custom-block s="join words %mult%txt"><block s="reportCDR"><block var="words"/></block></custom-block></autolambda><list></list></block><list></list></block></list></block></list></block></block></script></block></script></block-definition><block-definition s="list-&gt;sentence %&apos;data&apos;" type="reporter" category="operators"><inputs><input type="%l"></input></inputs><script><block s="doWarp"><script><block s="doReport"><custom-block s="combine with %repRing items of %l"><block s="reifyReporter"><autolambda><custom-block s="join words %mult%txt"><list><l></l><l></l></list></custom-block></autolambda><list></list></block><block var="data"/></custom-block></block></script></block></script></block-definition><block-definition s="sentence-&gt;list %&apos;text&apos;" type="reporter" category="operators"><inputs><input type="%txt"></input></inputs><script><block s="doWarp"><script><block s="doDeclareVariables"><list><l>result</l><l>thisword</l><l>emptyword</l></list></block><block s="doSetVar"><l>result</l><block s="reportNewList"><list></list></block></block><block s="doSetVar"><l>thisword</l><l></l></block><block s="doSetVar"><l>emptyword</l><l></l></block><custom-block s="for %upvar = %n to %n %cs"><l>i</l><l>1</l><block s="reportStringSize"><block var="text"/></block><script><block s="doIfElse"><block s="reportEquals"><block s="reportLetter"><block var="i"/><block var="text"/></block><l> </l></block><script><block s="doIf"><block s="reportNot"><block s="reportEquals"><block var="thisword"/><block var="emptyword"/></block></block><script><block s="doAddToList"><block var="thisword"/><block var="result"/></block><block s="doSetVar"><l>thisword</l><block var="emptyword"/></block></script></block></script><script><block s="doSetVar"><l>thisword</l><block s="reportJoinWords"><list><block var="thisword"/><block s="reportLetter"><block var="i"/><block var="text"/></block></list></block></block></script></block></script></custom-block><block s="doIf"><block s="reportNot"><block s="reportEquals"><block var="thisword"/><block var="emptyword"/></block></block><script><block s="doAddToList"><block var="thisword"/><block var="result"/></block></script></block><block s="doReport"><block var="result"/></block></script></block></script></block-definition><block-definition s="catch %&apos;tag&apos; %&apos;action&apos;" type="command" category="control"><inputs><input type="%upvar"></input><input type="%cs"></input></inputs><script><block s="doCallCC"><block s="reifyScript"><script><block s="doSetVar"><l>tag</l><block var="cont"/></block><block s="doRun"><block var="action"/><list></list></block></script><list><l>cont</l></list></block></block></script></block-definition><block-definition s="throw %&apos;cont&apos;" type="command" category="control"><inputs><input type="%s">catchtag</input></inputs><script><block s="doRun"><block var="cont"/><list></list></block></script></block-definition><block-definition s="catch %&apos;tag&apos; %&apos;value&apos;" type="reporter" category="control"><inputs><input type="%upvar"></input><input type="%anyUE"></input></inputs><script><block s="doCallCC"><block s="reifyScript"><script><block s="doSetVar"><l>tag</l><block var="cont"/></block><block s="doReport"><block s="evaluate"><block var="value"/><list></list></block></block></script><list><l>cont</l></list></block></block></script></block-definition><block-definition s="throw %&apos;tag&apos; %&apos;value&apos;" type="command" category="control"><inputs><input type="%s">catchtag</input><input type="%s"></input></inputs><script><block s="doRun"><block var="tag"/><list><block var="value"/></list></block></script></block-definition><block-definition s="for each %&apos;item&apos; of %&apos;data&apos; %&apos;action&apos;" type="command" category="lists"><inputs><input type="%upvar"></input><input type="%l"></input><input type="%cs"></input></inputs><script><block s="doUntil"><custom-block s="empty? %l"><block var="data"/></custom-block><script><block s="doSetVar"><l>item</l><block s="reportListItem"><l>1</l><block var="data"/></block></block><block s="doRun"><block var="action"/><list><block s="reportListItem"><l>1</l><block var="data"/></block></list></block><block s="doSetVar"><l>data</l><block s="reportCDR"><block var="data"/></block></block></script></block></script></block-definition></blocks>
+<blocks app="Snap! 4.0, http://snap.berkeley.edu" version="1"><block-definition s="map %&apos;function&apos; over %&apos;lists&apos;" type="reporter" category="lists"><header></header><code></code><inputs><input type="%repRing"></input><input type="%mult%l"></input></inputs><script><block s="doWarp"><script><block s="doDeclareVariables"><list><l>mapone</l><l>mapmany</l></list></block><block s="doSetVar"><l>mapone</l><block s="reifyScript"><script><block s="doIf"><custom-block s="empty? %l"><block var="data"/></custom-block><script><block s="doReport"><block s="reportNewList"><list></list></block></block></script></block><block s="doReport"><block s="reportCONS"><block s="evaluate"><block var="function"/><list><block s="reportListItem"><l>1</l><block var="data"/></block></list></block><block s="evaluate"><block var="mapone"/><list><block s="reportCDR"><block var="data"/></block></list></block></block></block></script><list><l>data</l></list></block></block><block s="doSetVar"><l>mapmany</l><block s="reifyScript"><script><block s="doIf"><custom-block s="empty? %l"><block s="reportListItem"><l>1</l><block var="data lists"/></block></custom-block><script><block s="doReport"><block s="reportNewList"><list></list></block></block></script></block><block s="doReport"><block s="reportCONS"><block s="evaluate"><block var="function"/><custom-block s="map %repRing over %mult%l"><block s="reifyReporter"><autolambda><block s="reportListItem"><l>1</l><l/></block></autolambda><list></list></block><list><block var="data lists"/></list></custom-block></block><block s="evaluate"><block var="mapmany"/><list><custom-block s="map %repRing over %mult%l"><block s="reifyReporter"><autolambda><block s="reportCDR"><l/></block></autolambda><list></list></block><list><block var="data lists"/></list></custom-block></list></block></block></block></script><list><l>data lists</l></list></block></block><block s="doIfElse"><custom-block s="empty? %l"><block s="reportCDR"><block var="lists"/></block></custom-block><script><block s="doReport"><block s="evaluate"><block var="mapone"/><list><block s="reportListItem"><l>1</l><block var="lists"/></block></list></block></block></script><script><block s="doReport"><block s="evaluate"><block var="mapmany"/><list><block var="lists"/></list></block></block></script></block></script></block></script></block-definition><block-definition s="empty? %&apos;data&apos;" type="predicate" category="lists"><header></header><code></code><inputs><input type="%l"></input></inputs><script><block s="doReport"><block s="reportEquals"><block var="data"/><block s="reportNewList"><list></list></block></block></block></script></block-definition><block-definition s="keep items such that %&apos;pred&apos; from %&apos;data&apos;" type="reporter" category="lists"><header></header><code></code><inputs><input type="%predRing"></input><input type="%l"></input></inputs><script><block s="doWarp"><script><block s="doIf"><custom-block s="empty? %l"><block var="data"/></custom-block><script><block s="doReport"><block s="reportNewList"><list></list></block></block></script></block><block s="doIfElse"><block s="evaluate"><block var="pred"/><list><block s="reportListItem"><l>1</l><block var="data"/></block></list></block><script><block s="doReport"><block s="reportCONS"><block s="reportListItem"><l>1</l><block var="data"/></block><custom-block s="keep items such that %predRing from %l"><block var="pred"/><block s="reportCDR"><block var="data"/></block></custom-block></block></block></script><script><block s="doReport"><custom-block s="keep items such that %predRing from %l"><block var="pred"/><block s="reportCDR"><block var="data"/></block></custom-block></block></script></block></script></block></script></block-definition><block-definition s="combine with %&apos;function&apos; items of %&apos;data&apos;" type="reporter" category="lists"><header></header><code></code><inputs><input type="%repRing"></input><input type="%l"></input></inputs><script><block s="doWarp"><script><block s="doIf"><custom-block s="empty? %l"><block s="reportCDR"><block var="data"/></block></custom-block><script><block s="doReport"><block s="reportListItem"><l>1</l><block var="data"/></block></block></script></block><block s="doReport"><block s="evaluate"><block var="function"/><list><block s="reportListItem"><l>1</l><block var="data"/></block><custom-block s="combine with %repRing items of %l"><block var="function"/><block s="reportCDR"><block var="data"/></block></custom-block></list></block></block></script></block></script></block-definition><block-definition s="if %&apos;test&apos; then %&apos;true&apos; else %&apos;false&apos;" type="reporter" category="control"><header></header><code></code><inputs><input type="%b"></input><input type="%anyUE"></input><input type="%anyUE"></input></inputs><script><block s="doIfElse"><block var="test"/><script><block s="doReport"><block s="evaluate"><block var="true"/><list></list></block></block></script><script><block s="doReport"><block s="evaluate"><block var="false"/><list></list></block></block></script></block></script></block-definition><block-definition s="for %&apos;i&apos; = %&apos;start&apos; to %&apos;end&apos; %&apos;action&apos;" type="command" category="control"><header></header><code></code><inputs><input type="%upvar"></input><input type="%n">1</input><input type="%n">10</input><input type="%cs"></input></inputs><script><block s="doDeclareVariables"><list><l>step</l><l>tester</l></list></block><block s="doIfElse"><block s="reportGreaterThan"><block var="start"/><block var="end"/></block><script><block s="doSetVar"><l>step</l><l>-1</l></block><block s="doSetVar"><l>tester</l><block s="reifyReporter"><autolambda><block s="reportLessThan"><block var="i"/><block var="end"/></block></autolambda><list></list></block></block></script><script><block s="doSetVar"><l>step</l><l>1</l></block><block s="doSetVar"><l>tester</l><block s="reifyReporter"><autolambda><block s="reportGreaterThan"><block var="i"/><block var="end"/></block></autolambda><list></list></block></block></script></block><block s="doSetVar"><l>i</l><block var="start"/></block><block s="doUntil"><block s="evaluate"><block var="tester"/><list></list></block><script><block s="doRun"><block var="action"/><list></list></block><block s="doChangeVar"><l>i</l><block var="step"/></block></script></block></script></block-definition><block-definition s="join words %&apos;words&apos;" type="reporter" category="operators"><header></header><code></code><inputs><input type="%mult%txt"></input></inputs><script><block s="doWarp"><script><block s="doIf"><custom-block s="empty? %l"><block s="reportCDR"><block var="words"/></block></custom-block><script><block s="doReport"><block s="reportListItem"><l>1</l><block var="words"/></block></block></script></block><block s="doReport"><block s="reportJoinWords"><list><block s="reportListItem"><l>1</l><block var="words"/></block><block s="reportJoinWords"><list><l> </l><block s="evaluate"><block s="reifyReporter"><autolambda><custom-block s="join words %mult%txt"><block s="reportCDR"><block var="words"/></block></custom-block></autolambda><list></list></block><list></list></block></list></block></list></block></block></script></block></script></block-definition><block-definition s="list $arrowRight sentence %&apos;data&apos;" type="reporter" category="operators"><header></header><code></code><inputs><input type="%l"></input></inputs><script><block s="doWarp"><script><block s="doReport"><custom-block s="combine with %repRing items of %l"><block s="reifyReporter"><autolambda><custom-block s="join words %mult%txt"><list><l></l><l></l></list></custom-block></autolambda><list></list></block><block var="data"/></custom-block></block></script></block></script></block-definition><block-definition s="sentence $arrowRight list %&apos;text&apos;" type="reporter" category="operators"><header></header><code></code><inputs><input type="%txt"></input></inputs><script><block s="doWarp"><script><block s="doDeclareVariables"><list><l>result</l><l>thisword</l><l>emptyword</l></list></block><block s="doSetVar"><l>result</l><block s="reportNewList"><list></list></block></block><block s="doSetVar"><l>thisword</l><l></l></block><block s="doSetVar"><l>emptyword</l><l></l></block><custom-block s="for %upvar = %n to %n %cs"><l>i</l><l>1</l><block s="reportStringSize"><block var="text"/></block><script><block s="doIfElse"><block s="reportEquals"><block s="reportLetter"><block var="i"/><block var="text"/></block><l> </l></block><script><block s="doIf"><block s="reportNot"><block s="reportEquals"><block var="thisword"/><block var="emptyword"/></block></block><script><block s="doAddToList"><block var="thisword"/><block var="result"/></block><block s="doSetVar"><l>thisword</l><block var="emptyword"/></block></script></block></script><script><block s="doSetVar"><l>thisword</l><block s="reportJoinWords"><list><block var="thisword"/><block s="reportLetter"><block var="i"/><block var="text"/></block></list></block></block></script></block></script></custom-block><block s="doIf"><block s="reportNot"><block s="reportEquals"><block var="thisword"/><block var="emptyword"/></block></block><script><block s="doAddToList"><block var="thisword"/><block var="result"/></block></script></block><block s="doReport"><block var="result"/></block></script></block></script></block-definition><block-definition s="catch %&apos;tag&apos; %&apos;action&apos;" type="command" category="control"><header></header><code></code><inputs><input type="%upvar"></input><input type="%cs"></input></inputs><script><block s="doCallCC"><block s="reifyScript"><script><block s="doSetVar"><l>tag</l><block var="cont"/></block><block s="doRun"><block var="action"/><list></list></block></script><list><l>cont</l></list></block></block></script></block-definition><block-definition s="throw %&apos;cont&apos;" type="command" category="control"><header></header><code></code><inputs><input type="%s">catchtag</input></inputs><script><block s="doRun"><block var="cont"/><list></list></block></script></block-definition><block-definition s="catch %&apos;tag&apos; %&apos;value&apos;" type="reporter" category="control"><header></header><code></code><inputs><input type="%upvar"></input><input type="%anyUE"></input></inputs><script><block s="doCallCC"><block s="reifyScript"><script><block s="doSetVar"><l>tag</l><block var="cont"/></block><block s="doReport"><block s="evaluate"><block var="value"/><list></list></block></block></script><list><l>cont</l></list></block></block></script></block-definition><block-definition s="throw %&apos;tag&apos; %&apos;value&apos;" type="command" category="control"><header></header><code></code><inputs><input type="%s">catchtag</input><input type="%s"></input></inputs><script><block s="doRun"><block var="tag"/><list><block var="value"/></list></block></script></block-definition><block-definition s="for each %&apos;item&apos; of %&apos;data&apos; %&apos;action&apos;" type="command" category="lists"><header></header><code></code><inputs><input type="%upvar"></input><input type="%l"></input><input type="%cs"></input></inputs><script><block s="doUntil"><custom-block s="empty? %l"><block var="data"/></custom-block><script><block s="doSetVar"><l>item</l><block s="reportListItem"><l>1</l><block var="data"/></block></block><block s="doRun"><block var="action"/><list><block s="reportListItem"><l>1</l><block var="data"/></block></list></block><block s="doSetVar"><l>data</l><block s="reportCDR"><block var="data"/></block></block></script></block></script></block-definition><block-definition s="if %&apos;test&apos; do %&apos;action&apos; and pause all $pause-1-255-220-0" type="command" category="control"><header></header><code></code><inputs><input type="%boolUE"></input><input type="%cs"></input></inputs><script><block s="doDeclareVariables"><list><l>breakpoint</l></list></block><block s="doIf"><block s="evaluate"><block var="test"/><list></list></block><script><block s="doSetVar"><l>breakpoint</l><block var="test"/></block><block s="doShowVar"><l>breakpoint</l></block><block s="doRun"><block var="action"/><list></list></block><block s="doPauseAll"></block><block s="doHideVar"><l></l></block></script></block></script></block-definition><block-definition s="word $arrowRight list %&apos;word&apos;" type="reporter" category="operators"><header></header><code></code><inputs><input type="%s"></input></inputs><script><block s="doDeclareVariables"><list><l>result</l><l>index</l></list></block><block s="doWarp"><script><block s="doSetVar"><l>index</l><l>1</l></block><block s="doSetVar"><l>result</l><block s="reportNewList"><list></list></block></block><block s="doRepeat"><block s="reportStringSize"><block var="word"/></block><script><block s="doAddToList"><block s="reportLetter"><block var="index"/><block var="word"/></block><block var="result"/></block><block s="doChangeVar"><l>index</l><l>1</l></block></script></block></script></block><block s="doReport"><block var="result"/></block></script></block-definition></blocks> \ No newline at end of file