Hardmath123 wrote:
Obsolete blocks?
![]()
In which format? The Flash editor can already convert 1.4 to 2.0, so I'll imitate that for that conversion.
Also, what about vector graphics?
Eh, there's no neat trick. I already do lazy loading/conversion of images to some extent. If the target format supports SVGs, I'll copy them across. I don't know about rasterising; I guess I could use Cairo or similar, but I'd rather avoid adding a dependency, so I might just throw an error or convert it with a blank image (and a warning). (Although I could have optional dependencies?)
How about (take a deep breath) writing Kurt 2.0 in JavaScript?
I've thought about it; but all the existing code uses Kurt from Python. And I can't find a good Construct-like library, so defining the binary format is a pain.
Offline
blob8108 wrote:
I've thought about it; but all the existing code uses Kurt from Python.
And I can't find a good Construct-like library, so defining the binary format is a pain.
Aww… why not rip MathWizz' lib?
Offline
Hardmath123 wrote:
blob8108 wrote:
I've thought about it; but all the existing code uses Kurt from Python.
And I can't find a good Construct-like library, so defining the binary format is a pain.
Aww… why not rip MathWizz' lib?
I dunno; the only uses I can think of for kurt.js would be
a) a little browser-based scratchblocks generator for Scratch 2.0 projects
b) for integrating with Snap!
But the scratchblocks generator is pretty trivial based off the raw project.json, and Snap! only really needs [everything else] -> Snap!, not universal two-way conversion.
And I'd end up maintaining two codebases, which is never fun.
So, yeah, it solves the vector images problem without requiring another Python library (although I would need another JS library; where's the logic? ); but I think it creates too many other problems.
Kurt's mainly used for analysing Scratch projects from Python code, so I guess that's my main use case.
Last edited by blob8108 (2013-03-20 09:48:01)
Offline
Oh, well. It was worth a try.
Offline
Neat! Can you put up the code somewhere?
Offline
I've had the sb.js code on github for a while. https://github.com/MathWizz/sb.js
Offline
Hardmath123 wrote:
Also, I can use the dot syntax for list querying too, right? Why is mylist.5 a bad idea? Which looks nicer:
Code:
print colors.(indices.5) print colors[indices[5]]
The reason most languages don't is because it's harder to parse—the tokenizer isn't sure if you mean <indices> <.> <5> or <indices> <.5>, and the picks the latter because it's greedy.
Offline
That's it? I was expecting something more reasonable.
I'm not planning on allowing .5, anyway, you have to use 0.5.
Offline
MathWizz wrote:
I've had the sb.js code on github for a while. https://github.com/MathWizz/sb.js
That's awesome! blob, you convinced yet?
Offline
nXIII wrote:
Hardmath123 wrote:
Also, I can use the dot syntax for list querying too, right? Why is mylist.5 a bad idea? Which looks nicer:
Code:
print colors.(indices.5) print colors[indices[5]]The reason most languages don't is because it's harder to parse—the tokenizer isn't sure if you mean <indices> <.> <5> or <indices> <.5>, and the picks the latter because it's greedy.
Oops, that was just about the inside one ("indices.5"). The outside one ("colors.(indices.5)") is a contradiction—the value after the dot is not evaluated in "colors.indices", but it is in "colors.(indices.5)"—unless you meant that ".(…)" is the equivalent of the "[…]" operator and ".<identifier|number>" is the equivalent of the "." operator….
Offline
bharvey wrote:
Hardmath123 wrote:
I'm not planning on allowing .5, anyway, you have to use 0.5.
Nope, you definitely can't call it Pravic!
![]()
My language, my rules.
It's really annoying to see people write CSS like
-webkit-animation-duation:.5s;
@nXIII: I see what you mean. There seem to be two cases:
object.expression_to_get_a_key_or_index
object.name_of_property_without_quotes_for_convenience
Maybe I should use the underscore operator for evaluated subscripting:
object.property
object_"property"
Offline
Hardmath123 wrote:
MathWizz wrote:
I've had the sb.js code on github for a while. https://github.com/MathWizz/sb.js
That's awesome! blob, you convinced yet?
![]()
"Kurt is written in Python ".replace(" ", ". ").upper() #
However, if you (and Math?) want to go rewrite it in JS — go ahead!
Offline
blob8108 wrote:
Hardmath123 wrote:
MathWizz wrote:
I've had the sb.js code on github for a while. https://github.com/MathWizz/sb.js
That's awesome! blob, you convinced yet?
![]()
"Kurt is written in Python ".replace(" ", ". ").upper() #
![]()
OK. OK. I. GET. IT.
However, if you (and Math?) want to go rewrite it in JS — go ahead!
![]()
Erm… I have no clue how to deal with a binary format.
Offline
Hardmath123 wrote:
blob8108 wrote:
Hardmath123 wrote:
That's awesome! blob, you convinced yet?![]()
"Kurt is written in Python ".replace(" ", ". ").upper() #
![]()
OK. OK. I. GET. IT.
![]()
"".join(map(dict(enumerate(map(chr, range(97, 123)), 1)).get, [23, 5, 1, 18, 5, 20, 15, 15, 3, 15, 15, 12]))
However, if you (and Math?) want to go rewrite it in JS — go ahead!
![]()
Erm… I have no clue how to deal with a binary format.
![]()
MathWizz wrote:
I've had the sb.js code on github for a while. https://github.com/MathWizz/sb.js
(Math and math. Eh heh heh. )
Offline
blob8108 wrote:
Hardmath123 wrote:
blob8108 wrote:
"Kurt is written in Python ".replace(" ", ". ").upper() #![]()
OK. OK. I. GET. IT.
![]()
"".join(map(dict(enumerate(map(chr, range(97, 123)), 1)).get, [23, 5, 1, 18, 5, 20, 15, 15, 3, 15, 15, 12]))
(lambda x:x[10]+x[9]+x[7])("just for kicks")
(Math and math. Eh heh heh.
)
You can eh-heh-heh when we're on Wheel of Fortune's Before and After.
Offline
Hardmath123 wrote:
Erm… I have no clue how to deal with a binary format.
![]()
Are you talking about Typed Arrays? I think all modern web browsers support it, save IE.
EDIT: Works in IE 10
Last edited by shadow_7283 (2013-03-21 08:38:28)
Offline
Hardmath123 wrote:
bharvey wrote:
Hardmath123 wrote:
I'm not planning on allowing .5, anyway, you have to use 0.5.
Nope, you definitely can't call it Pravic!
![]()
My language, my rules.
It's really annoying to see people write CSS likeCode:
-webkit-animation-duation:.5s;
![]()
Stuff like rgba(0,0,0,.3) does look better without the leading zero, though.
shadow_7283 wrote:
Hardmath123 wrote:
Erm… I have no clue how to deal with a binary format.
![]()
Are you talking about Typed Arrays? I think all modern web browsers support it, save IE.
EDIT: Works in IE 10
Well, Opera mini doesn't.
IE8 and IE9 don't either, but nobody cares about them (or Opera mini).
Offline
Snapduino pre-pre-alpha is out now (you can turn on and off a digital pin )! http://www.github.com/technoboy10/snapduino
Offline
technoboy10 wrote:
Snapduino pre-pre-alpha is out now (you can turn on and off a digital pin
)! http://www.github.com/technoboy10/snapduino
You're awesome. Let us know when it's ready to put on the Snap! page.
@Hm: Is there a single link for Snapin8r we should put there?
@blob: I'm not asking about Kurt b/c it sounds like we should wait for version 2, right?
Last edited by bharvey (2013-03-21 23:34:08)
Offline
I'll give you the gdocs zip link…
EDIT: Here's the closed-source mac-only version: https://docs.google.com/file/d/0B1UC0dD … sp=sharing. I'll make a new ZIP with annotated source and instructions later today, but for now this should suffice.
Last edited by Hardmath123 (2013-03-21 23:48:13)
Offline
Here's a patch to add support for device orientation/rotation natively. It does not check whether the features exist yet.
// changes.js // Hardware stuff, and declaring blocks DeviceSensor = { "acceleration": { "x": 0, "y": 0, "z": 0 }, "acceleration (with gravity)": { "x": 0, "y": 0, "z": 0 }, "rotation": { "x": 0, "y": 0, "z": 0 }, "rotation rate": { "x": 0, "y": 0, "z": 0 }, "compass": 0 } SpriteMorph.prototype.blocks.device = { "spec": "Device %mtype %mdir", "category": "sensing", "type": "reporter" } SpriteMorph.prototype.device = function (mtype, mdir) { return DeviceSensor[mtype][mdir]; } SpriteMorph.prototype.blocks.compass = { "spec": "Compass heading", "category": "sensing", "type": "reporter" } SpriteMorph.prototype.compass = function () { return DeviceSensor["compass"]; } window.addEventListener("devicemotion", function (event) { var a = event.acceleration; var ag = event.accelerationIncludingGravity; var rr = event.rotationRate; DeviceSensor.acceleration = { x: a.x, y: a.y, z: a.z }; DeviceSensor["acceleration (with gravity)"] = { x: ag.x, y: ag.y, z: ag.z }; DeviceSensor["rotation rate"] = { x: rr.alpha, y: rr.beta, z: rr.gamma }; }); window.addEventListener("deviceorientation", function (event) { DeviceSensor.rotation = { x: event.alpha, y: event.beta, z: event.gamma }; DeviceSensor.compass = event.webkitCompassHeading; }); // Declarations done // Adding blocks, declaring special input slots SpriteMorph.prototype.blockTemplates = function (category) { var blocks = [], myself = this, varNames, button, cat = category || 'motion', txt; function block(selector) { var newBlock = SpriteMorph.prototype.blockForSelector(selector, true); newBlock.isTemplate = true; return newBlock; } function variableBlock(varName) { var newBlock = SpriteMorph.prototype.variableBlock(varName); newBlock.isDraggable = false; newBlock.isTemplate = true; return newBlock; } function watcherToggle(selector) { var info = SpriteMorph.prototype.blocks[selector]; return new ToggleMorph('checkbox', this, function () { myself.toggleWatcher( selector, localize(info.spec), myself.blockColor[info.category]); }, null, function () { return myself.showingWatcher(selector); }, null); } function variableWatcherToggle(varName) { return new ToggleMorph('checkbox', this, function () { myself.toggleVariableWatcher(varName); }, null, function () { return myself.showingVariableWatcher(varName); }, null); } if (cat === 'motion') { blocks.push(block('forward')); blocks.push(block('turn')); blocks.push(block('turnLeft')); blocks.push('-'); blocks.push(block('setHeading')); blocks.push(block('doFaceTowards')); blocks.push('-'); blocks.push(block('gotoXY')); blocks.push(block('doGotoObject')); blocks.push(block('doGlide')); blocks.push('-'); blocks.push(block('changeXPosition')); blocks.push(block('setXPosition')); blocks.push(block('changeYPosition')); blocks.push(block('setYPosition')); blocks.push('-'); blocks.push(block('bounceOffEdge')); blocks.push('-'); blocks.push(watcherToggle('xPosition')); blocks.push(block('xPosition')); blocks.push(watcherToggle('yPosition')); blocks.push(block('yPosition')); blocks.push(watcherToggle('direction')); blocks.push(block('direction')); } else if (cat === 'looks') { blocks.push(block('doSwitchToCostume')); blocks.push(block('doWearNextCostume')); blocks.push(watcherToggle('getCostumeIdx')); blocks.push(block('getCostumeIdx')); blocks.push('-'); blocks.push(block('doSayFor')); blocks.push(block('bubble')); blocks.push(block('doThinkFor')); blocks.push(block('doThink')); blocks.push('-'); blocks.push(block('changeEffect')); blocks.push(block('setEffect')); blocks.push(block('clearEffects')); blocks.push('-'); blocks.push(block('changeScale')); blocks.push(block('setScale')); blocks.push(watcherToggle('getScale')); blocks.push(block('getScale')); blocks.push('-'); blocks.push(block('show')); blocks.push(block('hide')); blocks.push('-'); blocks.push(block('comeToFront')); blocks.push(block('goBack')); // for debugging: /////////////// if (this.world().isDevMode) { blocks.push('-'); txt = new TextMorph(localize('development mode \ndebugging primitives:')); txt.fontSize = 9; txt.setColor(new Color(230, 230, 230)); blocks.push(txt); blocks.push('-'); blocks.push(block('log')); blocks.push(block('alert')); } ///////////////////////////////// } else if (cat === 'sound') { blocks.push(block('playSound')); blocks.push(block('doPlaySoundUntilDone')); blocks.push(block('doStopAllSounds')); blocks.push('-'); blocks.push(block('doRest')); blocks.push('-'); blocks.push(block('doPlayNote')); blocks.push('-'); blocks.push(block('doChangeTempo')); blocks.push(block('doSetTempo')); blocks.push(watcherToggle('getTempo')); blocks.push(block('getTempo')); } else if (cat === 'pen') { blocks.push(block('clear')); blocks.push('-'); blocks.push(block('down')); blocks.push(block('up')); blocks.push('-'); blocks.push(block('setColor')); blocks.push(block('changeHue')); blocks.push(block('setHue')); blocks.push('-'); blocks.push(block('changeBrightness')); blocks.push(block('setBrightness')); blocks.push('-'); blocks.push(block('changeSize')); blocks.push(block('setSize')); blocks.push('-'); blocks.push(block('doStamp')); } else if (cat === 'control') { blocks.push(block('receiveGo')); blocks.push(block('receiveKey')); blocks.push(block('receiveClick')); blocks.push(block('receiveMessage')); blocks.push('-'); blocks.push(block('doBroadcast')); blocks.push(block('doBroadcastAndWait')); blocks.push('-'); blocks.push(block('doWarp')); blocks.push('-'); blocks.push(block('doWait')); blocks.push(block('doWaitUntil')); blocks.push('-'); blocks.push(block('doForever')); blocks.push(block('doRepeat')); blocks.push(block('doUntil')); blocks.push('-'); blocks.push(block('doIf')); blocks.push(block('doIfElse')); blocks.push('-'); blocks.push(block('doReport')); blocks.push('-'); blocks.push(block('doStopBlock')); blocks.push(block('doStop')); blocks.push(block('doStopAll')); blocks.push('-'); blocks.push(block('doRun')); blocks.push(block('fork')); blocks.push(block('evaluate')); blocks.push('-'); /* // list variants commented out for now (redundant) blocks.push(block('doRunWithInputList')); blocks.push(block('forkWithInputList')); blocks.push(block('evaluateWithInputList')); blocks.push('-'); */ blocks.push(block('doCallCC')); blocks.push(block('reportCallCC')); blocks.push('-'); blocks.push(block('receiveOnClone')); blocks.push(block('createClone')); blocks.push(block('removeClone')); } else if (cat === 'sensing') { blocks.push(block('reportTouchingObject')); blocks.push(block('reportTouchingColor')); blocks.push(block('reportColorIsTouchingColor')); blocks.push('-'); blocks.push(block('doAsk')); blocks.push(watcherToggle('getLastAnswer')); blocks.push(block('reportLastAnswer')); blocks.push('-'); blocks.push(block('reportMouseX')); blocks.push(block('reportMouseY')); blocks.push(block('reportMouseDown')); blocks.push('-'); blocks.push(block('reportKeyPressed')); blocks.push('-'); blocks.push(block('reportDistanceTo')); blocks.push('-'); blocks.push(block('doResetTimer')); blocks.push(watcherToggle('getTimer')); blocks.push(block('reportTimer')); blocks.push('-'); blocks.push(block('reportAttributeOf')); blocks.push('-'); blocks.push(block('reportURL')); blocks.push('-'); blocks.push(block('reportIsFastTracking')); blocks.push(block('doSetFastTracking')); blocks.push('-'); blocks.push(block('device')); blocks.push(block('compass')); // for debugging: /////////////// if (this.world().isDevMode) { blocks.push('-'); txt = new TextMorph(localize('development mode \ndebugging primitives:')); txt.fontSize = 9; txt.setColor(new Color(230, 230, 230)); blocks.push(txt); blocks.push('-'); blocks.push(block('colorFiltered')); blocks.push(block('reportStackSize')); blocks.push(block('reportFrameCount')); } } else if (cat === 'operators') { blocks.push(block('reifyScript')); blocks.push(block('reifyReporter')); blocks.push(block('reifyPredicate')); blocks.push('#'); blocks.push('-'); blocks.push(block('reportSum')); blocks.push(block('reportDifference')); blocks.push(block('reportProduct')); blocks.push(block('reportQuotient')); blocks.push('-'); blocks.push(block('reportModulus')); blocks.push(block('reportRound')); blocks.push(block('reportMonadic')); blocks.push(block('reportRandom')); blocks.push('-'); blocks.push(block('reportLessThan')); blocks.push(block('reportEquals')); blocks.push(block('reportGreaterThan')); blocks.push('-'); blocks.push(block('reportAnd')); blocks.push(block('reportOr')); blocks.push(block('reportNot')); blocks.push('-'); blocks.push(block('reportTrue')); blocks.push(block('reportFalse')); blocks.push('-'); blocks.push(block('reportJoinWords')); blocks.push(block('reportLetter')); blocks.push(block('reportStringSize')); blocks.push('-'); blocks.push(block('reportUnicode')); blocks.push(block('reportUnicodeAsLetter')); blocks.push('-'); blocks.push(block('reportIsA')); blocks.push(block('reportIsIdentical')); // for debugging: /////////////// if (this.world().isDevMode) { blocks.push('-'); txt = new TextMorph('development mode \ndebugging primitives:'); txt.fontSize = 9; txt.setColor(new Color(230, 230, 230)); blocks.push(txt); blocks.push('-'); blocks.push(block('reportTypeOf')); } ///////////////////////////////// } else if (cat === 'variables') { button = new PushButtonMorph( null, function () { new VariableDialogMorph( null, function (pair) { if (pair) { myself.addVariable(pair[0], pair[1]); myself.toggleVariableWatcher(pair[0], pair[1]); myself.blocksCache[cat] = null; myself.paletteCache[cat] = null; myself.parentThatIsA(IDE_Morph).refreshPalette(); } }, myself).prompt('Variable name', null, myself.world()); }, 'Make a variable'); blocks.push(button); if (this.variables.allNames().length > 0) { button = new PushButtonMorph( null, function () { var menu = new MenuMorph( myself.deleteVariable, null, myself); myself.variables.allNames().forEach(function (name) { menu.addItem(name, name); }); menu.popUpAtHand(myself.world()); }, 'Delete a variable'); blocks.push(button); } blocks.push('-'); varNames = this.variables.allNames(); if (varNames.length > 0) { varNames.forEach(function (name) { blocks.push(variableWatcherToggle(name)); blocks.push(variableBlock(name)); }); blocks.push('-'); } blocks.push(block('doSetVar')); blocks.push(block('doChangeVar')); blocks.push(block('doShowVar')); blocks.push(block('doHideVar')); blocks.push(block('doDeclareVariables')); blocks.push('='); blocks.push(block('reportNewList')); blocks.push('-'); blocks.push(block('reportCONS')); blocks.push(block('reportListItem')); blocks.push(block('reportCDR')); blocks.push('-'); blocks.push(block('reportListLength')); blocks.push(block('reportListContainsItem')); blocks.push('-'); blocks.push(block('doAddToList')); blocks.push(block('doDeleteFromList')); blocks.push(block('doInsertInList')); blocks.push(block('doReplaceInList')); blocks.push('='); button = new PushButtonMorph( null, function () { var ide = myself.parentThatIsA(IDE_Morph), stage = myself.parentThatIsA(StageMorph); new BlockDialogMorph( null, function (definition) { if (definition.spec !== '') { if (definition.isGlobal) { stage.globalBlocks.push(definition); } else { myself.customBlocks.push(definition); } ide.flushPaletteCache(); ide.refreshPalette(); new BlockEditorMorph(definition, myself).popUp(); } }, myself).prompt('Make a block', null, myself.world()); }, 'Make a block'); blocks.push(button); } return blocks; }; SyntaxElementMorph.prototype.labelPart = function (spec) { var part; if ((spec[0] === '%') && (spec.length > 1)) { // check for variable multi-arg-slot: if ((spec.length > 5) && (spec.slice(0, 5) === '%mult')) { part = new MultiArgMorph(spec.slice(5)); part.addInput(); return part; } // single-arg and specialized multi-arg slots: switch (spec) { case '%inputs': part = new MultiArgMorph('%s', 'with inputs'); part.isStatic = false; part.canBeEmpty = false; break; case '%scriptVars': part = new MultiArgMorph('%t', null, 1, spec); part.canBeEmpty = false; break; case '%parms': part = new MultiArgMorph('%t', 'Input Names:', 0, spec); part.canBeEmpty = false; break; case '%ringparms': part = new MultiArgMorph('%t', 'input names:', 0, spec); break; case '%cmdRing': part = new RingMorph(); part.color = SpriteMorph.prototype.blockColor.other; part.selector = 'reifyScript'; part.setSpec('%rc %ringparms'); part.isDraggable = true; break; case '%repRing': part = new RingMorph(); part.color = SpriteMorph.prototype.blockColor.other; part.selector = 'reifyReporter'; part.setSpec('%rr %ringparms'); part.isDraggable = true; part.isStatic = true; break; case '%predRing': part = new RingMorph(true); part.color = SpriteMorph.prototype.blockColor.other; part.selector = 'reifyPredicate'; part.setSpec('%rp %ringparms'); part.isDraggable = true; part.isStatic = true; break; case '%words': part = new MultiArgMorph('%s', null, 0); part.addInput(); // allow for default value setting part.addInput(); // allow for default value setting part.isStatic = false; break; case '%exp': part = new MultiArgMorph('%s', null, 0); part.addInput(); part.isStatic = true; part.canBeEmpty = false; break; case '%br': part = new Morph(); part.setExtent(new Point(0, 0)); part.isBlockLabelBreak = true; part.getSpec = function () { return '%br'; }; break; case '%inputName': part = new ReporterBlockMorph(); part.category = 'variables'; part.color = SpriteMorph.prototype.blockColor.variables; part.setSpec(localize('Input name')); break; case '%s': part = new InputSlotMorph(); break; case '%anyUE': part = new InputSlotMorph(); part.isUnevaluated = true; break; case '%txt': part = new InputSlotMorph(); part.minWidth = part.height() * 1.7; // "landscape" part.fixLayout(); break; case '%obj': part = new ArgMorph('object'); break; case '%n': part = new InputSlotMorph(null, true); break; case '%dir': part = new InputSlotMorph( null, true, { '(90) right': 90, '(-90) left': -90, '(0) up': '0', '(180) down': 180 }); part.setContents(90); break; case '%mdir': part = new InputSlotMorph( null, false, { 'x': 'x', 'y': 'y', 'z': 'z', }, true); part.setContents("x"); break; case '%mtype': part = new InputSlotMorph( null, false, { 'acceleration': 'acceleration', 'acceleration (with gravity)': 'acceleration (with gravity)', 'rotation': 'rotation', 'rotation rate': 'rotation rate' }, true); part.setContents("acceleration"); break; case '%inst': part = new InputSlotMorph( null, true, { '(1) Acoustic Grand': 1, '(2) Bright Acoustic': 2, '(3) Electric Grand': 3, '(4) Honky Tonk': 4, '(5) Electric Piano 1': 5, '(6) Electric Piano 2': 6, '(7) Harpsichord': 7 }); part.setContents(1); break; case '%month': part = new InputSlotMorph( null, // text false, // numeric? { 'January': ['January'], 'February': ['February'], 'March': ['March'], 'April': ['April'], 'May': ['May'], 'June': ['June'], 'July': ['July'], 'August': ['August'], 'September': ['September'], 'October': ['October'], 'November': ['November'], 'December': ['December'] }, true // read-only ); break; case '%ida': part = new InputSlotMorph( null, true, { '1': 1, last: ['last'], '~': null, all: ['all'] }); part.setContents(1); break; case '%idx': part = new InputSlotMorph( null, true, { '1': 1, last: ['last'], any: ['any'] }); part.setContents(1); break; case '%spr': part = new InputSlotMorph( null, false, 'objectsMenu', true); break; case '%col': // collision detection part = new InputSlotMorph( null, false, 'collidablesMenu', true); break; case '%dst': // distance measuring part = new InputSlotMorph( null, false, 'distancesMenu', true); break; case '%cln': // clones part = new InputSlotMorph( null, false, 'clonablesMenu', true); break; case '%cst': part = new InputSlotMorph( null, false, 'costumesMenu', true); break; case '%eff': part = new InputSlotMorph( null, false, { /* color : 'color', fisheye : 'fisheye', whirl : 'whirl', pixelate : 'pixelate', mosaic : 'mosaic', brightness : 'brightness', */ ghost: ['ghost'] }, true); part.setContents(['ghost']); break; case '%snd': part = new InputSlotMorph( null, false, 'soundsMenu', true); break; case '%key': part = new InputSlotMorph( null, false, { 'up arrow': ['up arrow'], 'down arrow': ['down arrow'], 'right arrow': ['right arrow'], 'left arrow': ['left arrow'], space: ['space'], 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'] }, true); part.setContents(['space']); break; case '%keyHat': part = this.labelPart('%key'); part.isStatic = true; break; case '%msg': part = new InputSlotMorph( null, false, 'messagesMenu', true); break; case '%msgHat': part = new InputSlotMorph( null, false, 'messagesMenu', true); part.isStatic = true; break; case '%att': part = new InputSlotMorph( null, false, 'attributesMenu', true); part.isStatic = true; break; case '%fun': part = new InputSlotMorph( null, false, { abs: ['abs'], sqrt: ['sqrt'], sin: ['sin'], cos: ['cos'], tan: ['tan'], asin: ['asin'], acos: ['acos'], atan: ['atan'], ln: ['ln'], // log : 'log', 'e^': ['e^'] // '10^' : '10^' }, true); part.setContents(['sqrt']); break; case '%typ': part = new InputSlotMorph( null, false, { number: ['number'], text: ['text'], Boolean: ['Boolean'], list: ['list'], command: ['command'], reporter: ['reporter'], predicate: ['predicate'] // ring : 'ring' // object : 'object' }, true); part.setContents(['number']); break; case '%var': part = new InputSlotMorph( null, false, 'getVarNamesDict', true); part.isStatic = true; break; case '%lst': part = new InputSlotMorph( null, false, { list1: 'list1', list2: 'list2', list3: 'list3' }, true); break; case '%l': part = new ArgMorph('list'); break; case '%b': case '%boolUE': part = new BooleanSlotMorph(null, true); break; case '%cmd': part = new CommandSlotMorph(); break; case '%rc': part = new RingCommandSlotMorph(); part.isStatic = true; break; case '%rr': part = new RingReporterSlotMorph(); part.isStatic = true; break; case '%rp': part = new RingReporterSlotMorph(true); part.isStatic = true; break; case '%c': part = new CSlotMorph(); part.isStatic = true; break; case '%cs': part = new CSlotMorph(); // non-static break; case '%clr': part = new ColorSlotMorph(); part.isStatic = true; break; case '%t': part = new TemplateSlotMorph('a'); break; case '%upvar': part = new TemplateSlotMorph('\u2191'); // up-arrow break; case '%f': part = new FunctionSlotMorph(); break; case '%r': part = new ReporterSlotMorph(); break; case '%p': part = new ReporterSlotMorph(true); break; // symbols: case '%turtle': part = new SymbolMorph('turtle'); part.size = this.fontSize * 1.2; part.color = new Color(255, 255, 255); part.shadowColor = this.color.darker(this.labelContrast); part.shadowOffset = this.embossing; part.drawNew(); break; case '%turtleOutline': part = new SymbolMorph('turtleOutline'); part.size = this.fontSize; part.color = new Color(255, 255, 255); part.isProtectedLabel = true; // doesn't participate in zebraing part.shadowColor = this.color.darker(this.labelContrast); part.shadowOffset = this.embossing; part.drawNew(); break; case '%clockwise': part = new SymbolMorph('turnRight'); part.size = this.fontSize * 1.5; part.color = new Color(255, 255, 255); part.isProtectedLabel = false; // zebra colors part.shadowColor = this.color.darker(this.labelContrast); part.shadowOffset = this.embossing; part.drawNew(); break; case '%counterclockwise': part = new SymbolMorph('turnLeft'); part.size = this.fontSize * 1.5; part.color = new Color(255, 255, 255); part.isProtectedLabel = false; // zebra colors part.shadowColor = this.color.darker(this.labelContrast); part.shadowOffset = this.embossing; part.drawNew(); break; case '%greenflag': part = new SymbolMorph('flag'); part.size = this.fontSize * 1.5; part.color = new Color(0, 200, 0); part.isProtectedLabel = true; // doesn't participate in zebraing part.shadowColor = this.color.darker(this.labelContrast); part.shadowOffset = this.embossing; part.drawNew(); break; case '%stop': part = new SymbolMorph('octagon'); part.size = this.fontSize * 1.5; part.color = new Color(200, 0, 0); part.isProtectedLabel = true; // doesn't participate in zebraing part.shadowColor = this.color.darker(this.labelContrast); part.shadowOffset = this.embossing; part.drawNew(); break; default: // nop(); } } else { part = new StringMorph(spec); part.fontName = this.labelFontName; part.fontStyle = this.labelFontStyle; part.fontSize = this.fontSize; part.color = new Color(255, 255, 255); part.isBold = true; part.shadowColor = this.color.darker(this.labelContrast); part.shadowOffset = this.embossing; part.drawNew(); } return part; };
To test it on an iPad, dump this file into a the snap source, add changes.js to the HTML file, and then run this server:
#!/usr/bin/python from twisted.web.server import Site from twisted.web.static import File from twisted.web.resource import Resource from twisted.internet import reactor import socket IP = socket.gethostbyname(socket.gethostname()) root = Resource() mstatic = File(raw_input("Input the directory where Snap! is located:\n>>> ")) root.putChild("snap",mstatic) factory = Site(root) reactor.listenTCP(8000, factory, interface=IP) print "Connection successful. Open Safari on an iPad and go to:" print IP+":8000/snap/snap.html" reactor.run()
Then follow the instructions on-screen.
(sorry for the laziness/lack of fancy hosting).
Offline
Hardmath123 wrote:
To test it on an iPad, dump this file into a the snap source, add changes.js to the HTML file, and then run this server:
Code:
#!/usr/bin/python from twisted.web.server import Site from twisted.web.static import File from twisted.web.resource import Resource from twisted.internet import reactor import socket IP = socket.gethostbyname(socket.gethostname()) root = Resource() mstatic = File(raw_input("Input the directory where Snap! is located:\n>>> ")) root.putChild("snap",mstatic) factory = Site(root) reactor.listenTCP(8000, factory, interface=IP) print "Connection successful. Open Safari on an iPad and go to:" print IP+":8000/snap/snap.html" reactor.run()
Is that just a static webserver to serve up a directory?
Offline
bharvey wrote:
I'm not asking about Kurt b/c it sounds like we should wait for version 2, right?
Yup!
Offline