Files
mixly3-server/mixly/boards/default_src/python/converters/text.js

377 lines
12 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
'use strict';
//01."text" 在 python_to_blockly.js实现
//02.str('Hello') + str('Mixly') 在 python_to_blockly.js实现
//03.int(str('123'))这种形式的在math.js实现
function numConvert(mode) {
function converter(py2block, func, args, keywords, starargs, kwargs, node) {
if ((mode != 'b' && args.length != 1) || (mode == 'b' && args.length != 2)) {
throw new Error("Incorrect number of arguments");
}
var paramblock = py2block.convert(args[0]);
if (args[0]._astname == "Call" && args[0].func._astname == "Name" && py2block.Name_str(args[0].func) == "str") {
paramblock = py2block.convert(args[0].args[0]);
}else if(args[0]._astname == "Call" && args[0].func._astname == "Name" && py2block.Name_str(args[0].func) == "input"){
if(pbc.board == pbc.MIXPY) {
paramblock = py2block.convert(args[0].args[0]);
return block("inout_type_input", func.lineno, {
"DIR": "float"
}, {
'VAR': paramblock
}, {
"inline": "true"
});
}
}else if(args[0]._astname == "Call" && args[0].func._astname == "Attribute" && args[0].func.attr.v == "input"){
if(pbc.board == pbc.MIXPY) {
paramblock = py2block.convert(args[0].args[0]);
return block("inout_type_input", func.lineno, {
"DIR": "float"
}, {
'VAR': paramblock
}, {
"inline": "true"
});
}
}
return block("text_to_number", func.lineno, {
'TOWHAT': mode
}, {
'VAR': paramblock,
}, {
"inline": "false"
});
}
return converter;
}
pbc.globalFunctionD['float'] = numConvert('float');
pbc.globalFunctionD['bytes'] = numConvert('b');
pbc.globalFunctionD['chr'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length != 1) {
throw new Error("Incorrect number of arguments");
}
var numblock = py2block.convert(args[0]);
return block("ascii_to_char", func.lineno, {}, {
'VAR': numblock,
}, {
"inline": "false"
});
}
pbc.globalFunctionD['ord'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length != 1) {
throw new Error("Incorrect number of arguments");
}
var numblock = py2block.convert(args[0]);
return block("char_to_ascii", func.lineno, {}, {
'VAR': numblock,
}, {
"inline": "false"
});
}
pbc.globalFunctionD['str'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length != 1) {
throw new Error("Incorrect number of arguments");
}
var numblock = py2block.convert(args[0]);
return block("number_to_text", func.lineno, {}, {
'VAR': numblock,
}, {
"inline": "false"
});
}
pbc.globalFunctionD['len'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length != 1) {
throw new Error("Incorrect number of arguments");
}
var numblock = py2block.convert(args[0]);
return block("text_length", func.lineno, {}, {
'VAR': numblock,
}, {
"inline": "false"
});
}
// 'mixly'[0]这种形式的在python_to_blockly.js中实现
pbc.moduleFunctionD.get('random')['choice'] = 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]);
var argAstname = args[0]._astname;
if(args[0]._astname == "Call" && args[0].func._astname == "Name" && py2block.Name_str(args[0].func) == "str"){
argblock = py2block.convert(args[0].args[0]);
argAstname = "Str";
}
if(argAstname == "Str"){
return block('text_random_char', func.lineno, {}, {
'VAR':argblock
}, {
"inline": "true"
});
}else{
return block('lists_get_random_item', func.lineno, {}, {
'LIST':argblock
}, {
"inline": "true"
});
}
}
//str('123') == str('234')这种形式的在python_to_blockly.js中实现
function startEndWithStr(mode){
function converter(py2block, func, args, keywords, starargs, kwargs, node){
if (args.length !== 1) {
throw new Error("Incorrect number of arguments");
}
var objblock = py2block.convert(func.value);
if(func.value._astname == "Call" && func.value.func._astname == "Name" && py2block.Name_str(func.value.func) == "str"){
objblock = py2block.convert(func.value.args[0]);
}
var argblock = py2block.convert(args[0]);
if(args[0]._astname == "Call" && args[0].func._astname == "Name" && py2block.Name_str(args[0].func) == "str"){
argblock = py2block.convert(args[0].args[0]);
}
return block('text_equals_starts_ends', func.lineno, {
'DOWHAT':mode
}, {
'STR1':objblock,
'STR2':argblock
}, {
"inline": "true"
});
}
return converter;
}
pbc.objectFunctionD.get('startswith')['Str'] = startEndWithStr('startswith');
pbc.objectFunctionD.get('endswith')['Str'] = startEndWithStr('endswith');
// 'mixly'[0:8]这种形式的在python_to_blockly.js中实现
function strTitle(mode){
function converter(py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 0) {
throw new Error("Incorrect number of arguments");
}
var textblock = py2block.convert(func.value);
return block("text_capital", func.lineno, {
'CAPITAL': mode,
}, {
"VAR": textblock,
}, {
"inline": "true"
});
}
return converter;
}
pbc.objectFunctionD.get('upper')['Str'] = strTitle('upper');
pbc.objectFunctionD.get('title')['Str'] = strTitle('title');
pbc.objectFunctionD.get('lower')['Str'] = strTitle('lower');
pbc.objectFunctionD.get('swapcase')['Str'] = strTitle('swapcase');
pbc.objectFunctionD.get('capitalize')['Str'] = strTitle('capitalize');
function strencode(mode){
function converter(py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 1) {
throw new Error("Incorrect number of arguments");
}
var textblock = py2block.convert(func.value);
return block("text_to_number", func.lineno, {
'TOWHAT': mode,
}, {
"VAR": textblock,
}, {
"inline": "true"
});
}
return converter;
}
pbc.objectFunctionD.get('encode')['Str'] = strencode('b');
function textStrip(mode){
function converter(py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 0) {
throw new Error("Incorrect number of arguments");
}
var objblock = py2block.convert(func.value);
return block("text_strip", func.lineno, {
'TOWHAT': mode,
}, {
"VAR": objblock,
}, {
"inline": "true"
});
}
return converter;
}
pbc.objectFunctionD.get('strip')['Str'] = textStrip('strip');
pbc.objectFunctionD.get('lstrip')['Str'] = textStrip('lstrip');
pbc.objectFunctionD.get('rstrip')['Str'] = textStrip('rstrip');
function textAlign(mode){
function converter(py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 2) {
throw new Error("Incorrect number of arguments");
}
var objblock = py2block.convert(func.value);
var argblock1 = py2block.convert(args[0]);
var argblock2 = py2block.convert(args[1]);
return block("text_center", func.lineno, {
'CENTER': mode,
}, {
"VAR": objblock,
"WID": argblock1,
"Symbol": argblock2
}, {
"inline": "true"
});
}
return converter;
}
pbc.objectFunctionD.get('ljust')['Str'] = textAlign('ljust');
pbc.objectFunctionD.get('center')['Str'] = textAlign('center');
pbc.objectFunctionD.get('rjust')['Str'] = textAlign('rjust');
pbc.objectFunctionD.get('split')['Str'] = function converter(py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 1) {
throw new Error("Incorrect number of arguments");
}
var objblock = py2block.convert(func.value);
var argblock = py2block.convert(args[0]);
return block("text_split", func.lineno, {
}, {
"VAR": objblock,
"VAL": argblock
}, {
"inline": "true"
});
}
pbc.objectFunctionD.get('replace')['Str'] = function converter(py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 2) {
throw new Error("Incorrect number of arguments");
}
var objblock = py2block.convert(func.value);
var argblock1 = py2block.convert(args[0]);
var argblock2 = py2block.convert(args[1]);
return block("text_replace", func.lineno, {
}, {
"VAR": objblock,
"STR1": argblock1,
"STR2": argblock2
}, {
"inline": "true"
});
}
pbc.objectFunctionD.get('find')['Str'] = function converter(py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 1) {
throw new Error("Incorrect number of arguments");
}
var objblock = py2block.convert(func.value);
var argblock = py2block.convert(args[0]);
return block("text_find", func.lineno, {
}, {
"VAR": objblock,
"STR": argblock
}, {
"inline": "true"
});
}
pbc.objectFunctionD.get('join')['Str'] = function converter(py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 1) {
throw new Error("Incorrect number of arguments");
}
var objblock = py2block.convert(func.value);
var argblock = py2block.convert(args[0]);
return block("text_join_seq", func.lineno, {
}, {
"VAR": objblock,
"LIST": argblock
}, {
"inline": "true"
});
}
pbc.objectFunctionD.get('format')['Str'] = function converter(py2block, func, args, keywords, starargs, kwargs, node) {
var objblock = py2block.convert(func.value);
var d = py2block.convertElements("ADD", args);
d['VAR'] = objblock;
return block("text_format_noreturn", node.lineno, {
}, d, {
"inline": "true",
}, {
"@items":args.length
});
}
function strEncodeDecode(mode){
function converter(py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 1) {
throw new Error("Incorrect number of arguments");
}
var objblock = py2block.convert(func.value);
return block("text_encode", func.lineno, {
'DIR': mode,
'CODE':args[0].s.v
}, {
"VAR": objblock,
}, {
"inline": "true"
});
}
return converter;
}
pbc.objectFunctionD.get('encode')['Str'] = strEncodeDecode('encode');
pbc.objectFunctionD.get('decode')['Str'] = strEncodeDecode('decode');
pbc.globalFunctionD['eval'] = 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]);
return block("text_eval", func.lineno, {}, {
"VAR":argblock
}, {
"inline": "true"
});
}
pbc.moduleFunctionD.get('os')['system'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 1) {
throw new Error("Incorrect number of arguments");
}
var varblock = py2block.convert(args[0]);
return [block("os_system", func.lineno, {}, {
'VAR': varblock
}, {
"inline": "true"
})];
}