1127 lines
38 KiB
JavaScript
1127 lines
38 KiB
JavaScript
'use strict';
|
|
|
|
var turtleClass = 'turtle.Turtle';
|
|
var screenClass = 'turtle.getscreen';
|
|
pbc.assignD.get('Turtle')['check_assign'] = function (py2block, node, targets, value) {
|
|
if(value.func._astname != "Attribute" || value.func.value._astname != "Name"){
|
|
return false;
|
|
}
|
|
var moduleName = py2block.Name_str(value.func.value);
|
|
var funcName = py2block.identifier(value.func.attr);
|
|
value.args = value.args || [];
|
|
if (value._astname === "Call" && moduleName === "turtle"
|
|
&& (funcName === "Turtle" || funcName === "Pen")&& !value.args.length)
|
|
return true;
|
|
return false;
|
|
}
|
|
|
|
pbc.assignD.get('Turtle')['create_block'] = function (py2block, node, targets, value) {
|
|
var turtle = py2block.Name_str(node.targets[0]);
|
|
return block('turtle_create', node.lineno, {
|
|
'VAR': turtle
|
|
}, {});
|
|
}
|
|
|
|
pbc.assignD.get('Pen')['create_block'] = function (py2block, node, targets, value) {
|
|
var turtle = py2block.Name_str(node.targets[0]);
|
|
return block('turtle_create', node.lineno, {
|
|
'VAR': turtle
|
|
}, {});
|
|
}
|
|
|
|
pbc.assignD.get('getscreen')['check_assign'] = function (py2block, node, targets, value) {
|
|
if(value.func._astname != "Attribute" || value.func.value._astname != "Name"){
|
|
return false;
|
|
}
|
|
var moduleName = py2block.Name_str(value.func.value);
|
|
var funcName = py2block.identifier(value.func.attr);
|
|
value.args = value.args || [];
|
|
if (value._astname === "Call"
|
|
&& funcName === "getscreen" && !value.args.length)
|
|
return true;
|
|
return false;
|
|
}
|
|
|
|
pbc.assignD.get('getscreen')['create_block'] = function (py2block, node, targets, value) {
|
|
var turtle = py2block.Name_str(node.targets[0]);
|
|
var moduleName = py2block.convert(value.func.value);
|
|
return block('turtle_getscreen', node.lineno, {
|
|
'VAR': turtle
|
|
}, {
|
|
'TUR':moduleName
|
|
});
|
|
}
|
|
|
|
function turtleForwardBackward(mode){
|
|
function converter(py2block, func, args, keywords, starargs, kwargs, node) {
|
|
if (args.length !== 1) {
|
|
throw new Error("Incorrect number of arguments");
|
|
}
|
|
var turtleblock = py2block.convert(func.value);
|
|
var argblock = py2block.convert(args[0]);
|
|
return [block('turtle_move', func.lineno, {
|
|
'DIR': mode
|
|
}, {
|
|
'TUR': turtleblock,
|
|
'VAR': argblock,
|
|
}, {
|
|
"inline": "true"
|
|
})];
|
|
}
|
|
return converter;
|
|
}
|
|
|
|
pbc.objectFunctionD.get('fd')[turtleClass] = turtleForwardBackward('forward');
|
|
pbc.objectFunctionD.get('bk')[turtleClass] = turtleForwardBackward('backward');
|
|
pbc.objectFunctionD.get('forward')[turtleClass] = turtleForwardBackward('forward');
|
|
pbc.objectFunctionD.get('backward')[turtleClass] = turtleForwardBackward('backward');
|
|
|
|
|
|
function turtleSetxy(mode){
|
|
function converter(py2block, func, args, keywords, starargs, kwargs, node) {
|
|
if (args.length !== 1) {
|
|
throw new Error("Incorrect number of arguments");
|
|
}
|
|
var turtleblock = py2block.convert(func.value);
|
|
var argblock = py2block.convert(args[0]);
|
|
return [block('turtle_setxy', func.lineno, {
|
|
'DIR': mode
|
|
}, {
|
|
'TUR': turtleblock,
|
|
'VAR': argblock,
|
|
}, {
|
|
"inline": "true"
|
|
})];
|
|
}
|
|
return converter;
|
|
}
|
|
|
|
pbc.objectFunctionD.get('setx')[turtleClass] = turtleSetxy('x');
|
|
pbc.objectFunctionD.get('sety')[turtleClass] = turtleSetxy('y');
|
|
|
|
|
|
function turtleLeftRight(mode){
|
|
function converter(py2block, func, args, keywords, starargs, kwargs, node) {
|
|
if (args.length !== 1) {
|
|
throw new Error("Incorrect number of arguments");
|
|
}
|
|
var turtleblock = py2block.convert(func.value);
|
|
var argblock = py2block.convert(args[0]);
|
|
return [block('turtle_rotate', func.lineno, {
|
|
'DIR': mode
|
|
}, {
|
|
'TUR': turtleblock,
|
|
'VAR': argblock
|
|
}, {
|
|
"inline": "true"
|
|
})];
|
|
}
|
|
return converter;
|
|
}
|
|
|
|
pbc.objectFunctionD.get('left')[turtleClass] = turtleLeftRight('left');
|
|
pbc.objectFunctionD.get('right')[turtleClass] = turtleLeftRight('right');
|
|
pbc.objectFunctionD.get('lt')[turtleClass] = turtleLeftRight('left');
|
|
pbc.objectFunctionD.get('rt')[turtleClass] = turtleLeftRight('right');
|
|
|
|
|
|
|
|
pbc.objectFunctionD.get('setheading')[turtleClass] = function (py2block, func, args, keywords, starargs, kwargs, node) {
|
|
if (args.length !== 1) {
|
|
throw new Error("Incorrect number of arguments");
|
|
}
|
|
var turtleblock = py2block.convert(func.value);
|
|
var argblock = py2block.convert(args[0]);
|
|
return [block('turtle_setheading', func.lineno, {}, {
|
|
'TUR': turtleblock,
|
|
'data': argblock,
|
|
}, {
|
|
"inline": "true"
|
|
})];
|
|
}
|
|
|
|
pbc.objectFunctionD.get('delay')[turtleClass] = function (py2block, func, args, keywords, starargs, kwargs, node) {
|
|
if (args.length !== 1) {
|
|
throw new Error("Incorrect number of arguments");
|
|
}
|
|
var turtleblock = py2block.convert(func.value.value);
|
|
var argblock = py2block.convert(args[0]);
|
|
return [block('turtle_screen_delay', func.lineno, {}, {
|
|
'TUR': turtleblock,
|
|
'data': argblock,
|
|
}, {
|
|
"inline": "true"
|
|
})];
|
|
}
|
|
|
|
pbc.objectFunctionD.get('postscript')[screenClass] = function (py2block, func, args, keywords, starargs, kwargs, node) {
|
|
|
|
var turtleblock = py2block.convert(func.value.func.value);
|
|
var argblock = py2block.convert(keywords[0].value);
|
|
return [block('turtle_screen_savefig', func.lineno, {}, {
|
|
'TUR': turtleblock,
|
|
'FILE': argblock,
|
|
}, {
|
|
"inline": "true"
|
|
})];
|
|
}
|
|
|
|
pbc.moduleFunctionD.get('turtle')['done'] = function(py2block, func, args, keywords, starargs, kwargs, node) {
|
|
if (args.length != 0) {
|
|
throw new Error("Incorrect number of arguments");
|
|
}
|
|
return [block("turtle_done", func.lineno, {}, {}, {
|
|
"inline": "true"
|
|
})];
|
|
}
|
|
|
|
pbc.moduleFunctionD.get('turtle')['mainloop'] = function(py2block, func, args, keywords, starargs, kwargs, node) {
|
|
if (args.length != 0) {
|
|
throw new Error("Incorrect number of arguments");
|
|
}
|
|
return [block("turtle_done", func.lineno, {}, {}, {
|
|
"inline": "true"
|
|
})];
|
|
}
|
|
|
|
pbc.moduleFunctionD.get('turtle')['exitonclick'] = function(py2block, func, args, keywords, starargs, kwargs, node) {
|
|
if (args.length != 0) {
|
|
throw new Error("Incorrect number of arguments");
|
|
}
|
|
return [block("turtle_exitonclick", func.lineno, {}, {}, {
|
|
"inline": "true"
|
|
})];
|
|
}
|
|
|
|
pbc.moduleFunctionD.get('turtle')['bgcolor'] = function(py2block, func, args, keywords, starargs, kwargs, node) {
|
|
if (args.length != 1) {
|
|
throw new Error("Incorrect number of arguments");
|
|
}
|
|
var argblock = py2block.convert(args[0]);
|
|
if (args[0]._astname != "Str") {
|
|
return [block("turtle_bgcolor_hex", func.lineno, {}, {
|
|
'VAR': argblock
|
|
}, {
|
|
"inline": "true"
|
|
})];
|
|
}
|
|
else{
|
|
|
|
return [block("turtle_bgcolor", func.lineno, {"FIELDNAME":py2block.Str_value(args[0])}, {}, {
|
|
"inline": "true"
|
|
})];
|
|
}
|
|
}
|
|
|
|
|
|
pbc.objectFunctionD.get('goto')[turtleClass] = function (py2block, func, args, keywords, starargs, kwargs, node) {
|
|
if (args.length !== 2) {
|
|
throw new Error("Incorrect number of arguments");
|
|
}
|
|
var turtleblock = py2block.convert(func.value);
|
|
var xblock = py2block.convert(args[0]);
|
|
var yblock = py2block.convert(args[1]);
|
|
return [block('turtle_goto', func.lineno, {}, {
|
|
'TUR': turtleblock,
|
|
'data': xblock,
|
|
'val': yblock
|
|
}, {
|
|
"inline": "true"
|
|
})];
|
|
}
|
|
|
|
|
|
function turtleClearResetHome(mode){
|
|
function converter(py2block, func, args, keywords, starargs, kwargs, node) {
|
|
if (args.length !== 0) {
|
|
throw new Error("Incorrect number of arguments");
|
|
}
|
|
var turtleblock = py2block.convert(func.value);
|
|
return [block('turtle_clear', func.lineno, {
|
|
'DIR': mode
|
|
}, {
|
|
'TUR': turtleblock,
|
|
}, {
|
|
"inline": "true"
|
|
})];
|
|
}
|
|
return converter;
|
|
}
|
|
|
|
//turtle.clear方法和list里的clear方法重复
|
|
pbc.objectFunctionD.get('clear')[turtleClass] = turtleClearResetHome('clear');
|
|
pbc.objectFunctionD.get('reset')[turtleClass] = turtleClearResetHome('reset');
|
|
pbc.objectFunctionD.get('home')[turtleClass] = turtleClearResetHome('home');
|
|
|
|
|
|
function turtlePenupPendown(mode){
|
|
function converter(py2block, func, args, keywords, starargs, kwargs, node) {
|
|
if (args.length !== 0) {
|
|
throw new Error("Incorrect number of arguments");
|
|
}
|
|
var turtleblock = py2block.convert(func.value);
|
|
return [block('turtle_penup', func.lineno, {
|
|
'DIR': mode
|
|
}, {
|
|
'TUR': turtleblock,
|
|
}, {
|
|
"inline": "true"
|
|
})];
|
|
}
|
|
return converter;
|
|
}
|
|
|
|
pbc.objectFunctionD.get('penup')[turtleClass] = turtlePenupPendown('penup');
|
|
pbc.objectFunctionD.get('pendown')[turtleClass] = turtlePenupPendown('pendown');
|
|
|
|
|
|
pbc.objectFunctionD.get('pensize')[turtleClass] = function (py2block, func, args, keywords, starargs, kwargs, node) {
|
|
if (args.length !== 1) {
|
|
throw new Error("Incorrect number of arguments");
|
|
}
|
|
var turtleblock = py2block.convert(func.value);
|
|
var sizeblock = py2block.convert(args[0]);
|
|
return [block('turtle_size', func.lineno, {}, {
|
|
'TUR': turtleblock,
|
|
'data': sizeblock,
|
|
}, {
|
|
"inline": "true"
|
|
})];
|
|
}
|
|
|
|
|
|
pbc.objectFunctionD.get('speed')[turtleClass] = function (py2block, func, args, keywords, starargs, kwargs, node) {
|
|
if (args.length !== 1&& args.length !== 0) {
|
|
throw new Error("Incorrect number of arguments");
|
|
}
|
|
if (args.length == 1){
|
|
var turtleblock = py2block.convert(func.value);
|
|
var speedblock = py2block.convert(args[0]);
|
|
return [block('turtle_speed', func.lineno, {}, {
|
|
'TUR': turtleblock,
|
|
'data': speedblock,
|
|
}, {
|
|
"inline": "true"
|
|
})];}
|
|
if(args.length == 0){
|
|
var turtleblock = py2block.convert(func.value);
|
|
return block('turtle_pos_shape', func.lineno, {
|
|
'DIR': 'speed'
|
|
}, {
|
|
'TUR': turtleblock
|
|
}, {
|
|
"inline": "true"
|
|
});}
|
|
}
|
|
|
|
pbc.objectFunctionD.get('shape')[turtleClass] = function (py2block, func, args, keywords, starargs, kwargs, node) {
|
|
if (args.length !== 1 && args.length !== 0) {
|
|
throw new Error("Incorrect number of arguments");
|
|
}
|
|
if (args.length == 1){
|
|
var turtleblock = py2block.convert(func.value);
|
|
var shapeblock = py2block.Str_value(args[0]);
|
|
return [block('turtle_shape', func.lineno, {
|
|
|
|
'DIR': shapeblock
|
|
}, {
|
|
'TUR': turtleblock,
|
|
|
|
|
|
}, {
|
|
"inline": "true"
|
|
})];}
|
|
if(args.length == 0){
|
|
var turtleblock = py2block.convert(func.value);
|
|
return block('turtle_pos_shape', func.lineno, {
|
|
'DIR': 'shape'
|
|
}, {
|
|
'TUR': turtleblock
|
|
}, {
|
|
"inline": "true"
|
|
});}
|
|
}
|
|
|
|
pbc.objectFunctionD.get('shapesize')[turtleClass] = function (py2block, func, args, keywords, starargs, kwargs, node) {
|
|
if (args.length !== 3 && args.length !== 0) {
|
|
throw new Error("Incorrect number of arguments");
|
|
}
|
|
if (args.length == 3){
|
|
var turtleblock = py2block.convert(func.value);
|
|
var widblock = py2block.convert(args[0]);
|
|
var lenblock = py2block.convert(args[1]);
|
|
var outlineblock = py2block.convert(args[2]);
|
|
return [block('turtle_shapesize', func.lineno, {}, {
|
|
'TUR': turtleblock,
|
|
'WID': widblock,
|
|
'LEN': lenblock,
|
|
'OUTLINE': outlineblock,
|
|
|
|
|
|
}, {
|
|
"inline": "true"
|
|
})];}
|
|
if(args.length == 0){
|
|
var turtleblock = py2block.convert(func.value);
|
|
return block('turtle_pos_shape', func.lineno, {
|
|
'DIR': 'shapesize'
|
|
}, {
|
|
'TUR': turtleblock
|
|
}, {
|
|
"inline": "true"
|
|
});}
|
|
}
|
|
|
|
|
|
pbc.objectFunctionD.get('width')[turtleClass] = function (py2block, func, args, keywords, starargs, kwargs, node) {
|
|
if (args.length !== 1 && args.length !== 0) {
|
|
throw new Error("Incorrect number of arguments");
|
|
}
|
|
if (args.length == 1){
|
|
var turtleblock = py2block.convert(func.value);
|
|
var widthblock = py2block.convert(args[0]);
|
|
return [block('turtle_size', func.lineno, {}, {
|
|
'TUR': turtleblock,
|
|
'data': widthblock
|
|
|
|
}, {
|
|
"inline": "true"
|
|
})];}
|
|
if(args.length == 0){
|
|
var turtleblock = py2block.convert(func.value);
|
|
return block('turtle_pos_shape', func.lineno, {
|
|
'DIR': 'width'
|
|
}, {
|
|
'TUR': turtleblock
|
|
}, {
|
|
"inline": "true"
|
|
});}
|
|
}
|
|
|
|
pbc.moduleFunctionD.get('turtle')['textinput'] = function(py2block, func, args, keywords, starargs, kwargs, node) {
|
|
if (args.length !== 2) {
|
|
throw new Error("Incorrect number of arguments");
|
|
}
|
|
var argblock1 = py2block.convert(args[0]);
|
|
var argblock2 = py2block.convert(args[1]);
|
|
return block('turtle_textinput', func.lineno, {}, {
|
|
'TITLE':argblock1,
|
|
'PROMPT':argblock2
|
|
}, {
|
|
"inline": "true"
|
|
});
|
|
}
|
|
|
|
pbc.moduleFunctionD.get('turtle')['numinput'] = function(py2block, func, args, keywords, starargs, kwargs, node) {
|
|
if (args.length <2 || args.length + keywords.length >5 || keywords.length>2) {
|
|
throw new Error("Incorrect number of arguments");
|
|
}
|
|
if(args.length==5){
|
|
var argblock1 = py2block.convert(args[0]);
|
|
var argblock2 = py2block.convert(args[1]);
|
|
var argblock3 = py2block.convert(args[2]);
|
|
var argblock4 = py2block.convert(args[3]);
|
|
var argblock5 = py2block.convert(args[4]);
|
|
return block('turtle_numinput', func.lineno, {}, {
|
|
'TITLE':argblock1,
|
|
'PROMPT':argblock2,
|
|
'DEFAULT':argblock3,
|
|
'MAX':argblock5,
|
|
'MIN':argblock4
|
|
}, {
|
|
"inline": "true"
|
|
});
|
|
|
|
}
|
|
if(args.length==4){
|
|
var argblock1 = py2block.convert(args[0]);
|
|
var argblock2 = py2block.convert(args[1]);
|
|
var argblock3 = py2block.convert(args[2]);
|
|
var argblock4 = py2block.convert(args[3]);
|
|
if(keywords.length==1){
|
|
if(py2block.identifier(keywords[0].arg) === "maxval"){
|
|
var maxblock=py2block.convert(keywords[0].value)
|
|
return block('turtle_numinput', func.lineno, {}, {
|
|
'TITLE':argblock1,
|
|
'PROMPT':argblock2,
|
|
'DEFAULT':argblock3,
|
|
'MAX':maxblock,
|
|
'MIN':argblock4
|
|
}, {
|
|
"inline": "true"
|
|
});
|
|
}
|
|
if(py2block.identifier(keywords[0].arg) === "minval"){
|
|
var minblock=py2block.convert(keywords[0].value)
|
|
return block('turtle_numinput', func.lineno, {}, {
|
|
'TITLE':argblock1,
|
|
'PROMPT':argblock2,
|
|
'DEFAULT':argblock3,
|
|
'MIN':minblock,
|
|
'MAX':argblock4
|
|
}, {
|
|
"inline": "true"
|
|
});
|
|
|
|
}
|
|
}
|
|
if(keywords.length==0){
|
|
return block('turtle_numinput', func.lineno, {}, {
|
|
'TITLE':argblock1,
|
|
'PROMPT':argblock2,
|
|
'DEFAULT':argblock3,
|
|
'MIN':argblock4,
|
|
|
|
}, {
|
|
"inline": "true"
|
|
});
|
|
}
|
|
}
|
|
if(args.length==3){
|
|
var argblock1 = py2block.convert(args[0]);
|
|
var argblock2 = py2block.convert(args[1]);
|
|
var argblock3 = py2block.convert(args[2]);
|
|
if(keywords.length==1){
|
|
if(py2block.identifier(keywords[0].arg) === "maxval"){
|
|
var maxblock=py2block.convert(keywords[0].value)
|
|
return block('turtle_numinput', func.lineno, {}, {
|
|
'TITLE':argblock1,
|
|
'PROMPT':argblock2,
|
|
'DEFAULT':argblock3,
|
|
'MAX':maxblock
|
|
}, {
|
|
"inline": "true"
|
|
});
|
|
}
|
|
if(py2block.identifier(keywords[0].arg) === "minval"){
|
|
var minblock=py2block.convert(keywords[0].value)
|
|
return block('turtle_numinput', func.lineno, {}, {
|
|
'TITLE':argblock1,
|
|
'PROMPT':argblock2,
|
|
'DEFAULT':argblock3,
|
|
'MIN':minblock
|
|
}, {
|
|
"inline": "true"
|
|
});
|
|
|
|
}
|
|
}
|
|
if(keywords.length==2){
|
|
if(py2block.identifier(keywords[0].arg) === "maxval"){var maxblock=py2block.convert(keywords[0].value)}
|
|
else if(py2block.identifier(keywords[1].arg) === "maxval"){var maxblock=py2block.convert(keywords[1].value)}
|
|
if(py2block.identifier(keywords[0].arg) === "minval"){var minblock=py2block.convert(keywords[0].value)}
|
|
else if(py2block.identifier(keywords[1].arg) === "minval"){var minblock=py2block.convert(keywords[1].value)}
|
|
|
|
return block('turtle_numinput', func.lineno, {}, {
|
|
'TITLE':argblock1,
|
|
'PROMPT':argblock2,
|
|
'DEFAULT':argblock3,
|
|
'MIN':minblock,
|
|
'MAX':maxblock
|
|
}, {
|
|
"inline": "true"
|
|
});}
|
|
}
|
|
if(args.length==2){
|
|
var argblock1 = py2block.convert(args[0]);
|
|
var argblock2 = py2block.convert(args[1]);
|
|
|
|
if(keywords.length==1){
|
|
if(py2block.identifier(keywords[0].arg) === "maxval"){
|
|
var maxblock=py2block.convert(keywords[0].value)
|
|
return block('turtle_numinput', func.lineno, {}, {
|
|
'TITLE':argblock1,
|
|
'PROMPT':argblock2,
|
|
'MAX':maxblock
|
|
}, {
|
|
"inline": "true"
|
|
});
|
|
}
|
|
if(py2block.identifier(keywords[0].arg) === "minval"){
|
|
var minblock=py2block.convert(keywords[0].value)
|
|
return block('turtle_numinput', func.lineno, {}, {
|
|
'TITLE':argblock1,
|
|
'PROMPT':argblock2,
|
|
'MIN':minblock
|
|
}, {
|
|
"inline": "true"
|
|
});
|
|
|
|
}
|
|
}
|
|
if(keywords.length==2){
|
|
if(py2block.identifier(keywords[0].arg) === "maxval"){var maxblock=py2block.convert(keywords[0].value)}
|
|
else if(py2block.identifier(keywords[1].arg) === "maxval"){var maxblock=py2block.convert(keywords[1].value)}
|
|
if(py2block.identifier(keywords[0].arg) === "minval"){var minblock=py2block.convert(keywords[0].value)}
|
|
else if(py2block.identifier(keywords[1].arg) === "minval"){var minblock=py2block.convert(keywords[1].value)}
|
|
|
|
return block('turtle_numinput', func.lineno, {}, {
|
|
'TITLE':argblock1,
|
|
'PROMPT':argblock2,
|
|
'MIN':minblock,
|
|
'MAX':maxblock
|
|
}, {
|
|
"inline": "true"
|
|
});}
|
|
}
|
|
}
|
|
|
|
pbc.objectFunctionD.get('write')[turtleClass] = function (py2block, func, args, keywords, starargs, kwargs, node) {
|
|
var args0 = {
|
|
_astname: "Str",
|
|
s: {
|
|
'v': 'Arial'
|
|
}
|
|
|
|
};
|
|
var args1 = {
|
|
_astname: "Num",
|
|
n: {
|
|
'v': 8
|
|
}
|
|
|
|
};
|
|
|
|
if (args.length !== 1 && args.length !== 2) {
|
|
throw new Error("Incorrect number of arguments");
|
|
}
|
|
if(args.length == 1){
|
|
if (keywords.length == 0){
|
|
var turtleblock = py2block.convert(func.value);
|
|
var argblock = py2block.convert(args[0]);
|
|
|
|
return [block('turtle_write', func.lineno, {}, {
|
|
'TUR': turtleblock,
|
|
|
|
'VAR': argblock,
|
|
}, {
|
|
"inline": "true"
|
|
})];
|
|
}
|
|
else if (keywords.length == 1){
|
|
var tag = py2block.identifier(keywords[0].arg)
|
|
var turtleblock = py2block.convert(func.value);
|
|
var argblock = py2block.convert(args[0]);
|
|
if (tag=='align') {
|
|
var formatblock = py2block.Str_value(keywords[0].value);
|
|
var fontnumblock = py2block.convert(args1);
|
|
var fontnameblock = py2block.convert(args0);
|
|
return [block('turtle_write_format', func.lineno, {
|
|
'ALIGN':formatblock
|
|
}, {
|
|
|
|
'TUR': turtleblock,
|
|
'FONTNAME':fontnameblock,
|
|
'FONTNUM':fontnumblock,
|
|
'VAR': argblock
|
|
}, {
|
|
"inline": "true"
|
|
})];
|
|
}
|
|
if (tag=='font') {
|
|
var fontnameblock = py2block.convert(keywords[0].value.elts[0]);
|
|
var fontnumblock = py2block.convert(keywords[0].value.elts[1]);
|
|
var fonttypeblock = py2block.Str_value(keywords[0].value.elts[2]);
|
|
if (keywords[0].value.elts.length == 4){
|
|
if((keywords[0].value.elts[2].s.v=='bold'&&keywords[0].value.elts[3].s.v=='italic')||
|
|
(keywords[0].value.elts[3].s.v=='bold'&&keywords[0].value.elts[2].s.v=='italic')){
|
|
keywords[0].value.elts[2].s.v = 'bold","italic'
|
|
var fonttypeblock = py2block.Str_value(keywords[0].value.elts[2]);
|
|
}
|
|
}
|
|
|
|
return [block('turtle_write_format', func.lineno, {
|
|
'FONTTYPE':fonttypeblock
|
|
}, {
|
|
'TUR': turtleblock,
|
|
'VAR': argblock,
|
|
'FONTNAME':fontnameblock,
|
|
'FONTNUM':fontnumblock
|
|
}, {
|
|
"inline": "true"
|
|
})];
|
|
}
|
|
}
|
|
else if (keywords.length == 2){
|
|
var tag1 = py2block.identifier(keywords[0].arg)
|
|
var tag2 = py2block.identifier(keywords[1].arg)
|
|
var turtleblock = py2block.convert(func.value);
|
|
var argblock = py2block.convert(args[0]);
|
|
if (tag1=='align' && tag2=='font') {
|
|
var formatblock = py2block.Str_value(keywords[0].value);
|
|
var fontnameblock = py2block.convert(keywords[1].value.elts[0]);
|
|
var fontnumblock = py2block.convert(keywords[1].value.elts[1]);
|
|
var fonttypeblock = py2block.Str_value(keywords[1].value.elts[2]);
|
|
if (keywords[1].value.elts.length == 4){
|
|
if((keywords[1].value.elts[2].s.v=='bold'&&keywords[1].value.elts[3].s.v=='italic')||
|
|
(keywords[1].value.elts[3].s.v=='bold'&&keywords[1].value.elts[2].s.v=='italic')){
|
|
keywords[1].value.elts[2].s.v = 'bold","italic'
|
|
var fonttypeblock = py2block.Str_value(keywords[1].value.elts[2]);
|
|
}
|
|
}
|
|
}
|
|
if (tag2=='align' && tag1=='font') {
|
|
var formatblock = py2block.Str_value(keywords[1].value);
|
|
var fontnameblock = py2block.convert(keywords[0].value.elts[0]);
|
|
var fontnumblock = py2block.convert(keywords[0].value.elts[1]);
|
|
var fonttypeblock = py2block.Str_value(keywords[0].value.elts[2]);
|
|
if (keywords[0].value.elts.length == 4){
|
|
if((keywords[0].value.elts[2].s.v=='bold'&&keywords[0].value.elts[3].s.v=='italic')||
|
|
(keywords[0].value.elts[3].s.v=='bold'&&keywords[0].value.elts[2].s.v=='italic')){
|
|
keywords[0].value.elts[2].s.v = 'bold","italic'
|
|
var fonttypeblock = py2block.Str_value(keywords[0].value.elts[2]);
|
|
}
|
|
}
|
|
}
|
|
return [block('turtle_write_format', func.lineno, {
|
|
'FONTTYPE':fonttypeblock,
|
|
'ALIGN':formatblock
|
|
}, {
|
|
'TUR': turtleblock,
|
|
'VAR': argblock,
|
|
'FONTNAME':fontnameblock,
|
|
'FONTNUM':fontnumblock
|
|
}, {
|
|
"inline": "true"
|
|
})];
|
|
|
|
}
|
|
}
|
|
if(args.length == 2){
|
|
var moveblock = py2block.Name_str(args[1]);
|
|
if (keywords.length == 0){
|
|
var turtleblock = py2block.convert(func.value);
|
|
var argblock = py2block.convert(args[0]);
|
|
var fontnameblock = py2block.convert(args0);
|
|
var fontnumblock = py2block.convert(args1);
|
|
return [block('turtle_write_format', func.lineno, {
|
|
'MOVE':moveblock
|
|
}, {
|
|
'TUR': turtleblock,
|
|
'FONTNAME':fontnameblock,
|
|
'FONTNUM':fontnumblock,
|
|
'VAR': argblock,
|
|
}, {
|
|
"inline": "true"
|
|
})];
|
|
}
|
|
else if (keywords.length == 1){
|
|
var tag = py2block.identifier(keywords[0].arg)
|
|
var turtleblock = py2block.convert(func.value);
|
|
var argblock = py2block.convert(args[0]);
|
|
if (tag=='align') {
|
|
var formatblock = py2block.Str_value(keywords[0].value);
|
|
var fontnameblock = py2block.convert(args0);
|
|
var fontnumblock = py2block.convert(args1);
|
|
return [block('turtle_write_format', func.lineno, {
|
|
'ALIGN':formatblock,
|
|
'MOVE':moveblock
|
|
}, {
|
|
|
|
'TUR': turtleblock,
|
|
'FONTNAME':fontnameblock,
|
|
'FONTNUM':fontnumblock,
|
|
'VAR': argblock
|
|
}, {
|
|
"inline": "true"
|
|
})];
|
|
}
|
|
if (tag=='font') {
|
|
var fontnameblock = py2block.convert(keywords[0].value.elts[0]);
|
|
var fontnumblock = py2block.convert(keywords[0].value.elts[1]);
|
|
var fonttypeblock = py2block.Str_value(keywords[0].value.elts[2]);
|
|
if (keywords[0].value.elts.length == 4){
|
|
if((keywords[0].value.elts[2].s.v=='bold'&&keywords[0].value.elts[3].s.v=='italic')||
|
|
(keywords[0].value.elts[3].s.v=='bold'&&keywords[0].value.elts[2].s.v=='italic')){
|
|
keywords[0].value.elts[2].s.v = 'bold","italic'
|
|
var fonttypeblock = py2block.Str_value(keywords[0].value.elts[2]);
|
|
}
|
|
}
|
|
return [block('turtle_write_format', func.lineno, {
|
|
'FONTTYPE':fonttypeblock,
|
|
'MOVE':moveblock
|
|
}, {
|
|
'TUR': turtleblock,
|
|
'VAR': argblock,
|
|
'FONTNAME':fontnameblock,
|
|
'FONTNUM':fontnumblock
|
|
}, {
|
|
"inline": "true"
|
|
})];
|
|
}
|
|
}
|
|
else if (keywords.length == 2){
|
|
var tag1 = py2block.identifier(keywords[0].arg)
|
|
var tag2 = py2block.identifier(keywords[1].arg)
|
|
var turtleblock = py2block.convert(func.value);
|
|
var argblock = py2block.convert(args[0]);
|
|
if (tag1=='align' && tag2=='font') {
|
|
var formatblock = py2block.Str_value(keywords[0].value);
|
|
var fontnameblock = py2block.convert(keywords[1].value.elts[0]);
|
|
var fontnumblock = py2block.convert(keywords[1].value.elts[1]);
|
|
var fonttypeblock = py2block.Str_value(keywords[1].value.elts[2]);
|
|
if (keywords[1].value.elts.length == 4){
|
|
if((keywords[1].value.elts[2].s.v=='bold'&&keywords[1].value.elts[3].s.v=='italic')||
|
|
(keywords[1].value.elts[3].s.v=='bold'&&keywords[1].value.elts[2].s.v=='italic')){
|
|
keywords[1].value.elts[2].s.v = 'bold","italic'
|
|
var fonttypeblock = py2block.Str_value(keywords[1].value.elts[2]);
|
|
}
|
|
}
|
|
}
|
|
if (tag2=='align' && tag1=='font') {
|
|
var formatblock = py2block.Str_value(keywords[1].value);
|
|
var fontnameblock = py2block.convert(keywords[0].value.elts[0]);
|
|
var fontnumblock = py2block.convert(keywords[0].value.elts[1]);
|
|
var fonttypeblock = py2block.Str_value(keywords[0].value.elts[2]);
|
|
if (keywords[0].value.elts.length == 4){
|
|
if((keywords[0].value.elts[2].s.v=='bold'&&keywords[0].value.elts[3].s.v=='italic')||
|
|
(keywords[0].value.elts[3].s.v=='bold'&&keywords[0].value.elts[2].s.v=='italic')){
|
|
keywords[0].value.elts[2].s.v = 'bold","italic'
|
|
var fonttypeblock = py2block.Str_value(keywords[0].value.elts[2]);
|
|
}
|
|
}
|
|
}
|
|
return [block('turtle_write_format', func.lineno, {
|
|
'FONTTYPE':fonttypeblock,
|
|
'ALIGN':formatblock,
|
|
'MOVE':moveblock
|
|
}, {
|
|
'TUR': turtleblock,
|
|
'VAR': argblock,
|
|
'FONTNAME':fontnameblock,
|
|
'FONTNUM':fontnumblock
|
|
}, {
|
|
"inline": "true"
|
|
})];
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
pbc.objectFunctionD.get('circle')['Turtle'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
|
|
if (args.length !== 2 && args.length !== 1) {
|
|
throw new Error("Incorrect number of arguments");
|
|
}
|
|
if(args.length == 2){
|
|
var turtleblock = py2block.convert(func.value);
|
|
var varblock = py2block.convert(args[0]);
|
|
var datablock = py2block.convert(args[1]);
|
|
|
|
return [block('turtle_circle_advanced', func.lineno, {}, {
|
|
'TUR': turtleblock,
|
|
'VAR': varblock,
|
|
'data': datablock
|
|
}, {
|
|
"inline": "true"
|
|
})];
|
|
}
|
|
if(args.length == 1){
|
|
var turtleblock = py2block.convert(func.value);
|
|
var varblock = py2block.convert(args[0]);
|
|
|
|
|
|
return [block('turtle_circle', func.lineno, {
|
|
'DIR': 'circle'
|
|
}, {
|
|
'TUR': turtleblock,
|
|
'VAR': varblock
|
|
}, {
|
|
"inline": "true"
|
|
})];
|
|
}
|
|
}
|
|
|
|
|
|
pbc.objectFunctionD.get('dot')['turtleClass'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
|
|
if (args.length !== 1) {
|
|
throw new Error("Incorrect number of arguments");
|
|
}
|
|
var turtleblock = py2block.convert(func.value);
|
|
var varblock = py2block.convert(args[0]);
|
|
|
|
return [block('turtle_circle', func.lineno, {
|
|
'DIR': 'dot'
|
|
}, {
|
|
'TUR': turtleblock,
|
|
'VAR': varblock
|
|
}, {
|
|
"inline": "true"
|
|
})];
|
|
}
|
|
|
|
|
|
pbc.objectFunctionD.get('clone')[turtleClass] = function (py2block, func, args, keywords, starargs, kwargs, node) {
|
|
if (args.length !== 0) {
|
|
throw new Error("Incorrect number of arguments");
|
|
}
|
|
var turtleblock = py2block.convert(func.value);
|
|
return block('turtle_clone', func.lineno, {}, {
|
|
'TUR': turtleblock
|
|
}, {
|
|
"inline": "true"
|
|
});
|
|
}
|
|
|
|
pbc.objectFunctionD.get('pos')[turtleClass] = function (py2block, func, args, keywords, starargs, kwargs, node) {
|
|
if (args.length !== 0) {
|
|
throw new Error("Incorrect number of arguments");
|
|
}
|
|
var turtleblock = py2block.convert(func.value);
|
|
return block('turtle_pos_shape', func.lineno, {
|
|
'DIR': 'pos'
|
|
}, {
|
|
'TUR': turtleblock
|
|
}, {
|
|
"inline": "true"
|
|
});
|
|
}
|
|
|
|
pbc.objectFunctionD.get('position')['Turtle'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
|
|
if (args.length !== 0) {
|
|
throw new Error("Incorrect number of arguments");
|
|
}
|
|
var turtleblock = py2block.convert(func.value);
|
|
return block('turtle_pos_shape', func.lineno, {
|
|
'DIR': 'pos'
|
|
}, {
|
|
'TUR': turtleblock
|
|
}, {
|
|
"inline": "true"
|
|
});
|
|
}
|
|
|
|
pbc.objectFunctionD.get('heading')['Turtle'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
|
|
if (args.length !== 0) {
|
|
throw new Error("Incorrect number of arguments");
|
|
}
|
|
var turtleblock = py2block.convert(func.value);
|
|
return block('turtle_pos_shape', func.lineno, {
|
|
'DIR': 'heading'
|
|
}, {
|
|
'TUR': turtleblock
|
|
}, {
|
|
"inline": "true"
|
|
});
|
|
}
|
|
|
|
function turtleHideShow(mode){
|
|
function converter(py2block, func, args, keywords, starargs, kwargs, node) {
|
|
if (args.length !== 0) {
|
|
throw new Error("Incorrect number of arguments");
|
|
}
|
|
var turtleblock = py2block.convert(func.value);
|
|
return [block('turtle_visible', func.lineno, {
|
|
'DIR': mode
|
|
}, {
|
|
'TUR': turtleblock
|
|
}, {
|
|
"inline": "true"
|
|
})];
|
|
}
|
|
return converter;
|
|
}
|
|
|
|
pbc.objectFunctionD.get('hideturtle')[turtleClass] = turtleHideShow('hideturtle');
|
|
pbc.objectFunctionD.get('showturtle')[turtleClass] = turtleHideShow('showturtle');
|
|
|
|
|
|
pbc.objectFunctionD.get('pencolor')[turtleClass] = function (py2block, func, args, keywords, starargs, kwargs, node) {
|
|
if (args.length !== 1) {
|
|
throw new Error("Incorrect number of arguments");
|
|
}
|
|
var turtleblock = py2block.convert(func.value);
|
|
var argblock = py2block.convert(args[0]);
|
|
|
|
|
|
|
|
|
|
if (args[0]._astname != "Str") {
|
|
return [block("turtle_pencolor_hex", func.lineno, {}, {
|
|
'TUR': turtleblock,
|
|
'VAR': argblock
|
|
}, {
|
|
"inline": "true"
|
|
})];
|
|
}
|
|
else{
|
|
return [block('turtle_pencolor', func.lineno, {
|
|
"FIELDNAME":py2block.Str_value(args[0])
|
|
}, {
|
|
'TUR': turtleblock
|
|
}, {
|
|
"inline": "true"
|
|
})];
|
|
}
|
|
|
|
}
|
|
|
|
|
|
pbc.objectFunctionD.get('fillcolor')[turtleClass] = function (py2block, func, args, keywords, starargs, kwargs, node) {
|
|
if (args.length !== 1) {
|
|
throw new Error("Incorrect number of arguments");
|
|
}
|
|
var turtleblock = py2block.convert(func.value);
|
|
var argblock = py2block.convert(args[0]);
|
|
if (args[0]._astname == "Str" ) {
|
|
return [block('turtle_fillcolor', func.lineno, {
|
|
"FIELDNAME":py2block.Str_value(args[0])
|
|
}, {
|
|
'TUR': turtleblock
|
|
}, {
|
|
"inline": "true"
|
|
})];
|
|
} else {
|
|
return [block("turtle_fillcolor_hex", func.lineno, {}, {
|
|
'TUR': turtleblock,
|
|
'VAR': argblock
|
|
}, {
|
|
"inline": "true"
|
|
})];
|
|
}
|
|
|
|
|
|
}
|
|
|
|
pbc.objectFunctionD.get('color')[turtleClass] = function (py2block, func, args, keywords, starargs, kwargs, node) {
|
|
if (args.length !== 2 &&args.length !== 1) {
|
|
throw new Error("Incorrect number of arguments");
|
|
}
|
|
if(args.length == 2){
|
|
var turtleblock = py2block.convert(func.value);
|
|
var argblock = py2block.convert(args[0]);
|
|
var argblock1 = py2block.convert(args[1]);
|
|
if (args[0]._astname == "Str" ) {
|
|
return [block('turtle_color', func.lineno, {
|
|
"FIELDNAME":py2block.Str_value(args[0]),
|
|
"FIELDNAME2":py2block.Str_value(args[1])
|
|
}, {
|
|
'TUR': turtleblock
|
|
}, {
|
|
"inline": "true"
|
|
})];
|
|
} else {
|
|
return [block("turtle_color_hex", func.lineno, {}, {
|
|
'TUR': turtleblock,
|
|
'VAR1': argblock,
|
|
'VAR2': argblock1
|
|
}, {
|
|
"inline": "true"
|
|
})];
|
|
}
|
|
}
|
|
if(args.length == 1){
|
|
var turtleblock = py2block.convert(func.value);
|
|
var argblock = py2block.convert(args[0]);
|
|
if (args[0]._astname != "Str") {
|
|
return [block("turtle_pencolor_hex", func.lineno, {}, {
|
|
'TUR': turtleblock,
|
|
'VAR': argblock
|
|
}, {
|
|
"inline": "true"
|
|
})];
|
|
}
|
|
else{
|
|
return [block('turtle_pencolor', func.lineno, {
|
|
"FIELDNAME":py2block.Str_value(args[0])
|
|
}, {
|
|
'TUR': turtleblock
|
|
}, {
|
|
"inline": "true"
|
|
})];
|
|
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function turtleBeginEndFill(mode){
|
|
function converter(py2block, func, args, keywords, starargs, kwargs, node) {
|
|
if (args.length !== 0) {
|
|
throw new Error("Incorrect number of arguments");
|
|
}
|
|
var turtleblock = py2block.convert(func.value);
|
|
return [block("turtle_fill", func.lineno, {
|
|
'DIR': mode
|
|
}, {
|
|
'TUR': turtleblock,
|
|
}, {
|
|
"inline": "true"
|
|
})];
|
|
}
|
|
return converter;
|
|
}
|
|
|
|
pbc.objectFunctionD.get('begin_fill')[turtleClass] = turtleBeginEndFill('begin');
|
|
pbc.objectFunctionD.get('end_fill')[turtleClass] = turtleBeginEndFill('end');
|
|
|
|
|
|
pbc.objectFunctionD.get('onkey')[screenClass] = function (py2block, func, args, keywords, starargs, kwargs, node) {
|
|
if (args.length !== 2) {
|
|
throw new Error("Incorrect number of arguments");
|
|
}
|
|
var turtleblock = py2block.convert(func.value);
|
|
pbc.pinType = "pins_callback";
|
|
var callback = py2block.convert(args[0]);
|
|
pbc.pinType=null;
|
|
var tupblock = py2block.convert(args[1]);
|
|
return [block("turtle_onkey", func.lineno, {},{
|
|
'TUR': turtleblock,
|
|
"callback":callback,
|
|
"VAR":tupblock
|
|
},{
|
|
"inline": "true"
|
|
})];
|
|
};
|
|
|
|
pbc.objectFunctionD.get('onclick')[screenClass] = function (py2block, func, args, keywords, starargs, kwargs, node) {
|
|
if (args.length !== 1) {
|
|
throw new Error("Incorrect number of arguments");
|
|
}
|
|
var turtleblock = py2block.convert(func.value);
|
|
pbc.pinType = "pins_callback";
|
|
var callback = py2block.convert(args[0]);
|
|
|
|
return [block("turtle_onclick", func.lineno, {},{
|
|
'TUR': turtleblock,
|
|
"callback":callback,
|
|
|
|
},{
|
|
"inline": "true"
|
|
})];
|
|
};
|
|
|
|
pbc.objectFunctionD.get('ontimer')[screenClass] = function (py2block, func, args, keywords, starargs, kwargs, node) {
|
|
if (args.length !== 2) {
|
|
throw new Error("Incorrect number of arguments");
|
|
}
|
|
var turtleblock = py2block.convert(func.value);
|
|
pbc.pinType = "pins_callback";
|
|
var callback = py2block.convert(args[0]);
|
|
pbc.pinType=null;
|
|
var tupblock = py2block.convert(args[1]);
|
|
return [block("turtle_ontimer", func.lineno, {},{
|
|
'TUR': turtleblock,
|
|
"callback":callback,
|
|
"VAR":tupblock
|
|
},{
|
|
"inline": "true"
|
|
})];
|
|
};
|
|
|
|
|
|
pbc.objectFunctionD.get('listen')['Turtle'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
|
|
if (args.length !== 0) {
|
|
throw new Error("Incorrect number of arguments");
|
|
}
|
|
var turtleblock = py2block.convert(func.value);
|
|
return [block('turtle_listen', func.lineno, {
|
|
|
|
}, {
|
|
'TUR': turtleblock
|
|
}, {
|
|
"inline": "true"
|
|
})];
|
|
} |