From dbced89807c715eaf9fd74d38bbf2ff7b474945a Mon Sep 17 00:00:00 2001 From: NilFlow Date: Sun, 8 Sep 2024 14:34:44 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=BB=B6=E6=97=B6=E7=BB=84?= =?UTF-8?q?=E4=BB=B6=EF=BC=8C=E8=B0=83=E6=95=B4=E4=BB=A3=E7=A0=81=E7=94=9F?= =?UTF-8?q?=E6=88=90=EF=BC=8C=E9=A1=B9=E7=9B=AE=E6=9B=B4=E6=96=B0=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E6=9B=B4=E6=96=B0=E4=BA=8B=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- blockly/python_compressed.js | 36 ++++------- blockly/python_compressed.js.map | 2 +- src/components/editor/blockly/blocks.ts | 76 ++++++++++++++---------- src/components/editor/blockly/manager.ts | 1 + src/components/editor/blockly/theme.ts | 4 -- src/services/ProjectService.ts | 2 - src/store/modules/project.ts | 31 +++++++++- 7 files changed, 89 insertions(+), 63 deletions(-) diff --git a/blockly/python_compressed.js b/blockly/python_compressed.js index e0d1e57..a74ad8d 100644 --- a/blockly/python_compressed.js +++ b/blockly/python_compressed.js @@ -61,29 +61,19 @@ b.PASS,b.STATEMENT_SUFFIX&&(e=b.prefixLines(b.injectId(b.STATEMENT_SUFFIX,a),b.I b.valueToCode(a,"IF",Order$$module$build$src$generators$python$python_generator.CONDITIONAL)||"False",d=b.valueToCode(a,"THEN",Order$$module$build$src$generators$python$python_generator.CONDITIONAL)||"None";a=b.valueToCode(a,"ELSE",Order$$module$build$src$generators$python$python_generator.CONDITIONAL)||"None";return[d+" if "+c+" else "+a,Order$$module$build$src$generators$python$python_generator.CONDITIONAL]},controls_repeat_ext$$module$build$src$generators$python$loops=function(a,b){let c;c=a.getField("TIMES")? String(parseInt(a.getFieldValue("TIMES"),10)):b.valueToCode(a,"TIMES",Order$$module$build$src$generators$python$python_generator.NONE)||"0";c=$.isNumber$$module$build$src$core$utils$string(c)?parseInt(c,10):"int("+c+")";let d=b.statementToCode(a,"DO");d=b.addLoopTrap(d,a)||b.PASS;return"for "+b.nameDB_.getDistinctName("count",$.NameType$$module$build$src$core$names.VARIABLE)+" in range("+c+"):\n"+d},controls_whileUntil$$module$build$src$generators$python$loops=function(a,b){const c="UNTIL"===a.getFieldValue("MODE"); let d=b.valueToCode(a,"BOOL",c?Order$$module$build$src$generators$python$python_generator.LOGICAL_NOT:Order$$module$build$src$generators$python$python_generator.NONE)||"False",e=b.statementToCode(a,"DO");e=b.addLoopTrap(e,a)||b.PASS;c&&(d="not "+d);return"while "+d+":\n"+e},controls_for$$module$build$src$generators$python$loops=function(a,b){const c=b.getVariableName(a.getFieldValue("VAR"));var d=b.valueToCode(a,"FROM",Order$$module$build$src$generators$python$python_generator.NONE)||"0",e=b.valueToCode(a, -"TO",Order$$module$build$src$generators$python$python_generator.NONE)||"0",f=b.valueToCode(a,"BY",Order$$module$build$src$generators$python$python_generator.NONE)||"1";let g=b.statementToCode(a,"DO");g=b.addLoopTrap(g,a)||b.PASS;let h="";a=function(){return b.provideFunction_("upRange",` -def ${b.FUNCTION_NAME_PLACEHOLDER_}(start, stop, step): - while start <= stop: - yield start - start += abs(step) -`)};const k=function(){return b.provideFunction_("downRange",` -def ${b.FUNCTION_NAME_PLACEHOLDER_}(start, stop, step): - while start >= stop: - yield start - start -= abs(step) -`)};if($.isNumber$$module$build$src$core$utils$string(d)&&$.isNumber$$module$build$src$core$utils$string(e)&&$.isNumber$$module$build$src$core$utils$string(f))d=Number(d),e=Number(e),f=Math.abs(Number(f)),0===d%1&&0===e%1&&0===f%1?(d<=e?(e++,a=0===d&&1===f?e:d+", "+e,1!==f&&(a+=", "+f)):(e--,a=d+", "+e+", -"+f),a="range("+a+")"):(a=da?Order$$module$build$src$generators$python$python_generator.UNARY_SIGN:Order$$module$build$src$generators$python$python_generator.ATOMIC]}, -math_arithmetic$$module$build$src$generators$python$math=function(a,b){var c={ADD:[" + ",Order$$module$build$src$generators$python$python_generator.ADDITIVE],MINUS:[" - ",Order$$module$build$src$generators$python$python_generator.ADDITIVE],MULTIPLY:[" * ",Order$$module$build$src$generators$python$python_generator.MULTIPLICATIVE],DIVIDE:[" / ",Order$$module$build$src$generators$python$python_generator.MULTIPLICATIVE],POWER:[" ** ",Order$$module$build$src$generators$python$python_generator.EXPONENTIATION]}[a.getFieldValue("OP")]; -const d=c[0];c=c[1];const e=b.valueToCode(a,"A",c)||"0";a=b.valueToCode(a,"B",c)||"0";return[e+d+a,c]},math_single$$module$build$src$generators$python$math=function(a,b){const c=a.getFieldValue("OP");let d;if("NEG"===c)return d=b.valueToCode(a,"NUM",Order$$module$build$src$generators$python$python_generator.UNARY_SIGN)||"0",["-"+d,Order$$module$build$src$generators$python$python_generator.UNARY_SIGN];b.definitions_.import_math="import math";a="SIN"===c||"COS"===c||"TAN"===c?b.valueToCode(a,"NUM", -Order$$module$build$src$generators$python$python_generator.MULTIPLICATIVE)||"0":b.valueToCode(a,"NUM",Order$$module$build$src$generators$python$python_generator.NONE)||"0";switch(c){case "ABS":d="math.fabs("+a+")";break;case "ROOT":d="math.sqrt("+a+")";break;case "LN":d="math.log("+a+")";break;case "LOG10":d="math.log10("+a+")";break;case "EXP":d="math.exp("+a+")";break;case "POW10":d="math.pow(10,"+a+")";break;case "ROUND":d="round("+a+")";break;case "ROUNDUP":d="math.ceil("+a+")";break;case "ROUNDDOWN":d= -"math.floor("+a+")";break;case "SIN":d="math.sin("+a+" / 180.0 * math.pi)";break;case "COS":d="math.cos("+a+" / 180.0 * math.pi)";break;case "TAN":d="math.tan("+a+" / 180.0 * math.pi)"}if(d)return[d,Order$$module$build$src$generators$python$python_generator.FUNCTION_CALL];switch(c){case "ASIN":d="math.asin("+a+") / math.pi * 180";break;case "ACOS":d="math.acos("+a+") / math.pi * 180";break;case "ATAN":d="math.atan("+a+") / math.pi * 180";break;default:throw Error("Unknown math operator: "+c);}return[d, -Order$$module$build$src$generators$python$python_generator.MULTIPLICATIVE]},math_constant$$module$build$src$generators$python$math=function(a,b){const c={PI:["math.pi",Order$$module$build$src$generators$python$python_generator.MEMBER],E:["math.e",Order$$module$build$src$generators$python$python_generator.MEMBER],GOLDEN_RATIO:["(1 + math.sqrt(5)) / 2",Order$$module$build$src$generators$python$python_generator.MULTIPLICATIVE],SQRT2:["math.sqrt(2)",Order$$module$build$src$generators$python$python_generator.MEMBER], -SQRT1_2:["math.sqrt(1.0 / 2)",Order$$module$build$src$generators$python$python_generator.MEMBER],INFINITY:["float('inf')",Order$$module$build$src$generators$python$python_generator.ATOMIC]};a=a.getFieldValue("CONSTANT");"INFINITY"!==a&&(b.definitions_.import_math="import math");return c[a]},math_number_property$$module$build$src$generators$python$math=function(a,b){var c={EVEN:[" % 2 == 0",Order$$module$build$src$generators$python$python_generator.MULTIPLICATIVE,Order$$module$build$src$generators$python$python_generator.RELATIONAL], -ODD:[" % 2 == 1",Order$$module$build$src$generators$python$python_generator.MULTIPLICATIVE,Order$$module$build$src$generators$python$python_generator.RELATIONAL],WHOLE:[" % 1 == 0",Order$$module$build$src$generators$python$python_generator.MULTIPLICATIVE,Order$$module$build$src$generators$python$python_generator.RELATIONAL],POSITIVE:[" > 0",Order$$module$build$src$generators$python$python_generator.RELATIONAL,Order$$module$build$src$generators$python$python_generator.RELATIONAL],NEGATIVE:[" < 0", -Order$$module$build$src$generators$python$python_generator.RELATIONAL,Order$$module$build$src$generators$python$python_generator.RELATIONAL],DIVISIBLE_BY:[null,Order$$module$build$src$generators$python$python_generator.MULTIPLICATIVE,Order$$module$build$src$generators$python$python_generator.RELATIONAL],PRIME:[null,Order$$module$build$src$generators$python$python_generator.NONE,Order$$module$build$src$generators$python$python_generator.FUNCTION_CALL]};const d=a.getFieldValue("PROPERTY"),[e,f,g]=c[d]; -c=b.valueToCode(a,"NUMBER_TO_CHECK",f)||"0";if("PRIME"===d)b.definitions_.import_math="import math",b.definitions_.from_numbers_import_Number="from numbers import Number",a=b.provideFunction_("math_isPrime",` +"TO",Order$$module$build$src$generators$python$python_generator.NONE)||"0",f=b.valueToCode(a,"BY",Order$$module$build$src$generators$python$python_generator.NONE)||"1";let g=b.statementToCode(a,"DO");g=b.addLoopTrap(g,a)||b.PASS;let h="";a=function(){return"module_run.upRange"};const k=function(){return"module_run.downRange"};if($.isNumber$$module$build$src$core$utils$string(d)&&$.isNumber$$module$build$src$core$utils$string(e)&&$.isNumber$$module$build$src$core$utils$string(f))d=Number(d),e=Number(e), +f=Math.abs(Number(f)),0===d%1&&0===e%1&&0===f%1?(d<=e?(e++,a=0===d&&1===f?e:d+", "+e,1!==f&&(a+=", "+f)):(e--,a=d+", "+e+", -"+f),a="range("+a+")"):(a=da?Order$$module$build$src$generators$python$python_generator.UNARY_SIGN:Order$$module$build$src$generators$python$python_generator.ATOMIC]},math_arithmetic$$module$build$src$generators$python$math=function(a,b){var c={ADD:[" + ",Order$$module$build$src$generators$python$python_generator.ADDITIVE], +MINUS:[" - ",Order$$module$build$src$generators$python$python_generator.ADDITIVE],MULTIPLY:[" * ",Order$$module$build$src$generators$python$python_generator.MULTIPLICATIVE],DIVIDE:[" / ",Order$$module$build$src$generators$python$python_generator.MULTIPLICATIVE],POWER:[" ** ",Order$$module$build$src$generators$python$python_generator.EXPONENTIATION]}[a.getFieldValue("OP")];const d=c[0];c=c[1];const e=b.valueToCode(a,"A",c)||"0";a=b.valueToCode(a,"B",c)||"0";return[e+d+a,c]},math_single$$module$build$src$generators$python$math= +function(a,b){const c=a.getFieldValue("OP");let d;if("NEG"===c)return d=b.valueToCode(a,"NUM",Order$$module$build$src$generators$python$python_generator.UNARY_SIGN)||"0",["-"+d,Order$$module$build$src$generators$python$python_generator.UNARY_SIGN];b.definitions_.import_math="import math";a="SIN"===c||"COS"===c||"TAN"===c?b.valueToCode(a,"NUM",Order$$module$build$src$generators$python$python_generator.MULTIPLICATIVE)||"0":b.valueToCode(a,"NUM",Order$$module$build$src$generators$python$python_generator.NONE)|| +"0";switch(c){case "ABS":d="math.fabs("+a+")";break;case "ROOT":d="math.sqrt("+a+")";break;case "LN":d="math.log("+a+")";break;case "LOG10":d="math.log10("+a+")";break;case "EXP":d="math.exp("+a+")";break;case "POW10":d="math.pow(10,"+a+")";break;case "ROUND":d="round("+a+")";break;case "ROUNDUP":d="math.ceil("+a+")";break;case "ROUNDDOWN":d="math.floor("+a+")";break;case "SIN":d="math.sin("+a+" / 180.0 * math.pi)";break;case "COS":d="math.cos("+a+" / 180.0 * math.pi)";break;case "TAN":d="math.tan("+ +a+" / 180.0 * math.pi)"}if(d)return[d,Order$$module$build$src$generators$python$python_generator.FUNCTION_CALL];switch(c){case "ASIN":d="math.asin("+a+") / math.pi * 180";break;case "ACOS":d="math.acos("+a+") / math.pi * 180";break;case "ATAN":d="math.atan("+a+") / math.pi * 180";break;default:throw Error("Unknown math operator: "+c);}return[d,Order$$module$build$src$generators$python$python_generator.MULTIPLICATIVE]},math_constant$$module$build$src$generators$python$math=function(a,b){const c={PI:["math.pi", +Order$$module$build$src$generators$python$python_generator.MEMBER],E:["math.e",Order$$module$build$src$generators$python$python_generator.MEMBER],GOLDEN_RATIO:["(1 + math.sqrt(5)) / 2",Order$$module$build$src$generators$python$python_generator.MULTIPLICATIVE],SQRT2:["math.sqrt(2)",Order$$module$build$src$generators$python$python_generator.MEMBER],SQRT1_2:["math.sqrt(1.0 / 2)",Order$$module$build$src$generators$python$python_generator.MEMBER],INFINITY:["float('inf')",Order$$module$build$src$generators$python$python_generator.ATOMIC]}; +a=a.getFieldValue("CONSTANT");"INFINITY"!==a&&(b.definitions_.import_math="import math");return c[a]},math_number_property$$module$build$src$generators$python$math=function(a,b){var c={EVEN:[" % 2 == 0",Order$$module$build$src$generators$python$python_generator.MULTIPLICATIVE,Order$$module$build$src$generators$python$python_generator.RELATIONAL],ODD:[" % 2 == 1",Order$$module$build$src$generators$python$python_generator.MULTIPLICATIVE,Order$$module$build$src$generators$python$python_generator.RELATIONAL], +WHOLE:[" % 1 == 0",Order$$module$build$src$generators$python$python_generator.MULTIPLICATIVE,Order$$module$build$src$generators$python$python_generator.RELATIONAL],POSITIVE:[" > 0",Order$$module$build$src$generators$python$python_generator.RELATIONAL,Order$$module$build$src$generators$python$python_generator.RELATIONAL],NEGATIVE:[" < 0",Order$$module$build$src$generators$python$python_generator.RELATIONAL,Order$$module$build$src$generators$python$python_generator.RELATIONAL],DIVISIBLE_BY:[null,Order$$module$build$src$generators$python$python_generator.MULTIPLICATIVE, +Order$$module$build$src$generators$python$python_generator.RELATIONAL],PRIME:[null,Order$$module$build$src$generators$python$python_generator.NONE,Order$$module$build$src$generators$python$python_generator.FUNCTION_CALL]};const d=a.getFieldValue("PROPERTY"),[e,f,g]=c[d];c=b.valueToCode(a,"NUMBER_TO_CHECK",f)||"0";if("PRIME"===d)b.definitions_.import_math="import math",b.definitions_.from_numbers_import_Number="from numbers import Number",a=b.provideFunction_("math_isPrime",` def ${b.FUNCTION_NAME_PLACEHOLDER_}(n): # https://en.wikipedia.org/wiki/Primality_test#Naive_methods # If n is not a number but a string, try parsing it. diff --git a/blockly/python_compressed.js.map b/blockly/python_compressed.js.map index ad1f4ce..78b7e24 100644 --- a/blockly/python_compressed.js.map +++ b/blockly/python_compressed.js.map @@ -1 +1 @@ -{"version":3,"sources":["generators/python/common.ts","generators/python/lists.ts","generators/python/logic.ts","generators/python/loops.ts","generators/python/math.ts","generators/python/procedures.ts","generators/python/text.ts","generators/python/variables.ts","generators/python/python_generator.ts","generators/python/variables_dynamic.ts","generators/python.ts"],"names":["common_default","block","generator","type","lists_create_empty","Order","ATOMIC","lists_create_with","elements","Array","itemCount_","i","valueToCode","NONE","join","lists_repeat","item","times","MULTIPLICATIVE","lists_length","FUNCTION_CALL","lists_isEmpty","LOGICAL_NOT","lists_indexOf","list","errorIndex","firstIndexAdjustment","lastIndexAdjustment","workspace","options","oneBasedIndex","functionName","getFieldValue","provideFunction_","FUNCTION_NAME_PLACEHOLDER_","lists_getIndex","mode","where","listOrder","MEMBER","at","getAdjustedInt","definitions_","code","Error","lists_setIndex","value","match","listVar","nameDB_","getDistinctName","NameType","VARIABLE","xVar","lists_getSublist","where1","where2","at1","at2","isNumber","String","lists_sort","reverse","sortFunctionName","lists_split","value_input","value_delim","lists_reverse","controls_if","n","branchCode","conditionCode","STATEMENT_PREFIX","injectId","statementToCode","PASS","STATEMENT_SUFFIX","prefixLines","INDENT","getInput","logic_compare","operator","OPERATORS","order","RELATIONAL","argument0","argument1","logic_operation","LOGICAL_AND","LOGICAL_OR","defaultArgument","logic_negate","logic_boolean","logic_null","logic_ternary","value_if","CONDITIONAL","value_then","value_else","controls_repeat_ext","repeats","getField","parseInt","branch","addLoopTrap","loopVar","controls_whileUntil","until","controls_for","variable0","getVariableName","increment","defineUpRange","defineDownRange","Number","Math","abs","range","scrub","arg","suffix","varName","startVar","endVar","incVar","controls_forEach","controls_flow_statements","xfix","loop","getSurroundLoop","suppressPrefixSuffix","math_number","number","Infinity","UNARY_SIGN","math_arithmetic","tuple","ADDITIVE","EXPONENTIATION","math_single","math_constant","CONSTANTS","constant","math_number_property","PROPERTIES","dropdownProperty","inputOrder","outputOrder","numberToCheck","divisor","math_change","math_on_list","func","math_modulo","math_constrain","argument2","math_random_int","math_random_float","math_atan2","procedures_defreturn","globals","usedVariables","allUsedVarModels","variable","name","getVars","includes","push","devVarList","allDeveloperVariables","length","getName","DEVELOPER_VARIABLE","globalString","funcName","getProcedureName","xfix1","loopTrap","INFINITE_LOOP_TRAP","returnValue","xfix2","args","variables","scrub_","procedures_callreturn","procedures_callnoreturn","forBlock","procedures_ifreturn","hasReturnValue_","text","quote_","text_join","element","codeAndOrder","forceString","element0","element1","tempVar","text_append","text_length","text_isEmpty","text_indexOf","substring","text_charAt","textOrder","text_getSubstring","text_changeCase","text_trim","text_print","text_prompt_ext","msg","text_count","sub","text_replace","from","to","text_reverse","variables_get","variables_set","$jscomp$tmp$exports$module$name","COLLECTION","STRING_CONVERSION","BITWISE_NOT","BITWISE_SHIFT","BITWISE_AND","BITWISE_XOR","BITWISE_OR","LAMBDA","PythonGenerator","CodeGenerator","constructor","ORDER_OVERRIDES","isInitialized","key","addReservedWords","init","reset","Names","RESERVED_WORDS_","setVariableMap","getVariableMap","populateVariables","populateProcedures","defvars","DEVELOPER_VARIABLE_TYPE","getId","finish","imports","definitions","def","replace","scrubNakedValue","line","string","quote","multiline_quote_","split","map","lines","thisOnly","commentCode","outputConnection","targetConnection","comment","getCommentText","wrap","COMMENT_WRAP","inputList","inputTypes","VALUE","childBlock","connection","targetBlock","allNestedComments","nextBlock","nextConnection","nextCode","blockToCode","atId","delta","negate","defaultAtIndex","atOrder","controls_ifelse","controls_repeat","math_round","math_trig","procedures_defnoreturn","strRegExp","test","text_prompt","pythonGenerator","generators","common","lists","logic","loops","math","procedures","variablesDynamic"],"mappings":"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","file":"python_compressed.js","sourcesContent":["import type {Block} from '../../core/block.js';\nimport type {PythonGenerator} from './python_generator.js';\nimport {Order} from './python_generator.js';\n\nexport function common_default(\n block: Block,\n generator: PythonGenerator,\n): string {\n return `pass # 未知模块 ${block.type}`\n}\n","/**\n * @license\n * Copyright 2012 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @file Generating Python for list blocks.\n */\n\n// Former goog.module ID: Blockly.Python.lists\n\nimport type {CreateWithBlock} from '../../blocks/lists.js';\nimport type {Block} from '../../core/block.js';\nimport {NameType} from '../../core/names.js';\nimport * as stringUtils from '../../core/utils/string.js';\nimport type {PythonGenerator} from './python_generator.js';\nimport {Order} from './python_generator.js';\n\nexport function lists_create_empty(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Create an empty list.\n return ['[]', Order.ATOMIC];\n}\n\nexport function lists_create_with(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Create a list with any number of elements of any type.\n const createWithBlock = block as CreateWithBlock;\n const elements = new Array(createWithBlock.itemCount_);\n for (let i = 0; i < createWithBlock.itemCount_; i++) {\n elements[i] = generator.valueToCode(block, 'ADD' + i, Order.NONE) || 'None';\n }\n const code = '[' + elements.join(', ') + ']';\n return [code, Order.ATOMIC];\n}\n\nexport function lists_repeat(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Create a list with one element repeated.\n const item = generator.valueToCode(block, 'ITEM', Order.NONE) || 'None';\n const times =\n generator.valueToCode(block, 'NUM', Order.MULTIPLICATIVE) || '0';\n const code = '[' + item + '] * ' + times;\n return [code, Order.MULTIPLICATIVE];\n}\n\nexport function lists_length(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // String or array length.\n const list = generator.valueToCode(block, 'VALUE', Order.NONE) || '[]';\n return ['len(' + list + ')', Order.FUNCTION_CALL];\n}\n\nexport function lists_isEmpty(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Is the string null or array empty?\n const list = generator.valueToCode(block, 'VALUE', Order.NONE) || '[]';\n const code = 'not len(' + list + ')';\n return [code, Order.LOGICAL_NOT];\n}\n\nexport function lists_indexOf(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Find an item in the list.\n const item = generator.valueToCode(block, 'FIND', Order.NONE) || '[]';\n const list = generator.valueToCode(block, 'VALUE', Order.NONE) || \"''\";\n let errorIndex = ' -1';\n let firstIndexAdjustment = '';\n let lastIndexAdjustment = ' - 1';\n\n if (block.workspace.options.oneBasedIndex) {\n errorIndex = ' 0';\n firstIndexAdjustment = ' + 1';\n lastIndexAdjustment = '';\n }\n\n let functionName;\n if (block.getFieldValue('END') === 'FIRST') {\n functionName = generator.provideFunction_(\n 'first_index',\n `\ndef ${generator.FUNCTION_NAME_PLACEHOLDER_}(my_list, elem):\n try: index = my_list.index(elem)${firstIndexAdjustment}\n except: index =${errorIndex}\n return index\n`,\n );\n } else {\n functionName = generator.provideFunction_(\n 'last_index',\n `\ndef ${generator.FUNCTION_NAME_PLACEHOLDER_}(my_list, elem):\n try: index = len(my_list) - my_list[::-1].index(elem)${lastIndexAdjustment}\n except: index =${errorIndex}\n return index\n`,\n );\n }\n const code = functionName + '(' + list + ', ' + item + ')';\n return [code, Order.FUNCTION_CALL];\n}\n\nexport function lists_getIndex(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] | string {\n // Get element at index.\n // Note: Until January 2013 this block did not have MODE or WHERE inputs.\n const mode = block.getFieldValue('MODE') || 'GET';\n const where = block.getFieldValue('WHERE') || 'FROM_START';\n const listOrder = where === 'RANDOM' ? Order.NONE : Order.MEMBER;\n const list = generator.valueToCode(block, 'VALUE', listOrder) || '[]';\n\n switch (where) {\n case 'FIRST':\n if (mode === 'GET') {\n const code = list + '[0]';\n return [code, Order.MEMBER];\n } else if (mode === 'GET_REMOVE') {\n const code = list + '.pop(0)';\n return [code, Order.FUNCTION_CALL];\n } else if (mode === 'REMOVE') {\n return list + '.pop(0)\\n';\n }\n break;\n case 'LAST':\n if (mode === 'GET') {\n const code = list + '[-1]';\n return [code, Order.MEMBER];\n } else if (mode === 'GET_REMOVE') {\n const code = list + '.pop()';\n return [code, Order.FUNCTION_CALL];\n } else if (mode === 'REMOVE') {\n return list + '.pop()\\n';\n }\n break;\n case 'FROM_START': {\n const at = generator.getAdjustedInt(block, 'AT');\n if (mode === 'GET') {\n const code = list + '[' + at + ']';\n return [code, Order.MEMBER];\n } else if (mode === 'GET_REMOVE') {\n const code = list + '.pop(' + at + ')';\n return [code, Order.FUNCTION_CALL];\n } else if (mode === 'REMOVE') {\n return list + '.pop(' + at + ')\\n';\n }\n break;\n }\n case 'FROM_END': {\n const at = generator.getAdjustedInt(block, 'AT', 1, true);\n if (mode === 'GET') {\n const code = list + '[' + at + ']';\n return [code, Order.MEMBER];\n } else if (mode === 'GET_REMOVE') {\n const code = list + '.pop(' + at + ')';\n return [code, Order.FUNCTION_CALL];\n } else if (mode === 'REMOVE') {\n return list + '.pop(' + at + ')\\n';\n }\n break;\n }\n case 'RANDOM':\n (generator as AnyDuringMigration).definitions_['import_random'] =\n 'import random';\n if (mode === 'GET') {\n const code = 'random.choice(' + list + ')';\n return [code, Order.FUNCTION_CALL];\n } else {\n const functionName = generator.provideFunction_(\n 'lists_remove_random_item',\n `\ndef ${generator.FUNCTION_NAME_PLACEHOLDER_}(myList):\n x = int(random.random() * len(myList))\n return myList.pop(x)\n`,\n );\n const code = functionName + '(' + list + ')';\n if (mode === 'GET_REMOVE') {\n return [code, Order.FUNCTION_CALL];\n } else if (mode === 'REMOVE') {\n return code + '\\n';\n }\n }\n break;\n }\n throw Error('Unhandled combination (lists_getIndex).');\n}\n\nexport function lists_setIndex(block: Block, generator: PythonGenerator) {\n // Set element at index.\n // Note: Until February 2013 this block did not have MODE or WHERE inputs.\n let list = generator.valueToCode(block, 'LIST', Order.MEMBER) || '[]';\n const mode = block.getFieldValue('MODE') || 'GET';\n const where = block.getFieldValue('WHERE') || 'FROM_START';\n const value = generator.valueToCode(block, 'TO', Order.NONE) || 'None';\n // Cache non-trivial values to variables to prevent repeated look-ups.\n // Closure, which accesses and modifies 'list'.\n function cacheList() {\n if (list.match(/^\\w+$/)) {\n return '';\n }\n const listVar = generator.nameDB_!.getDistinctName(\n 'tmp_list',\n NameType.VARIABLE,\n );\n const code = listVar + ' = ' + list + '\\n';\n list = listVar;\n return code;\n }\n\n switch (where) {\n case 'FIRST':\n if (mode === 'SET') {\n return list + '[0] = ' + value + '\\n';\n } else if (mode === 'INSERT') {\n return list + '.insert(0, ' + value + ')\\n';\n }\n break;\n case 'LAST':\n if (mode === 'SET') {\n return list + '[-1] = ' + value + '\\n';\n } else if (mode === 'INSERT') {\n return list + '.append(' + value + ')\\n';\n }\n break;\n case 'FROM_START': {\n const at = generator.getAdjustedInt(block, 'AT');\n if (mode === 'SET') {\n return list + '[' + at + '] = ' + value + '\\n';\n } else if (mode === 'INSERT') {\n return list + '.insert(' + at + ', ' + value + ')\\n';\n }\n break;\n }\n case 'FROM_END': {\n const at = generator.getAdjustedInt(block, 'AT', 1, true);\n if (mode === 'SET') {\n return list + '[' + at + '] = ' + value + '\\n';\n } else if (mode === 'INSERT') {\n return list + '.insert(' + at + ', ' + value + ')\\n';\n }\n break;\n }\n case 'RANDOM': {\n (generator as AnyDuringMigration).definitions_['import_random'] =\n 'import random';\n let code = cacheList();\n const xVar = generator.nameDB_!.getDistinctName(\n 'tmp_x',\n NameType.VARIABLE,\n );\n code += xVar + ' = int(random.random() * len(' + list + '))\\n';\n if (mode === 'SET') {\n code += list + '[' + xVar + '] = ' + value + '\\n';\n return code;\n } else if (mode === 'INSERT') {\n code += list + '.insert(' + xVar + ', ' + value + ')\\n';\n return code;\n }\n break;\n }\n }\n throw Error('Unhandled combination (lists_setIndex).');\n}\n\nexport function lists_getSublist(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Get sublist.\n const list = generator.valueToCode(block, 'LIST', Order.MEMBER) || '[]';\n const where1 = block.getFieldValue('WHERE1');\n const where2 = block.getFieldValue('WHERE2');\n let at1;\n switch (where1) {\n case 'FROM_START':\n at1 = generator.getAdjustedInt(block, 'AT1');\n if (at1 === 0) {\n at1 = '';\n }\n break;\n case 'FROM_END':\n at1 = generator.getAdjustedInt(block, 'AT1', 1, true);\n break;\n case 'FIRST':\n at1 = '';\n break;\n default:\n throw Error('Unhandled option (lists_getSublist)');\n }\n\n let at2;\n switch (where2) {\n case 'FROM_START':\n at2 = generator.getAdjustedInt(block, 'AT2', 1);\n break;\n case 'FROM_END':\n at2 = generator.getAdjustedInt(block, 'AT2', 0, true);\n // Ensure that if the result calculated is 0 that sub-sequence will\n // include all elements as expected.\n if (!stringUtils.isNumber(String(at2))) {\n (generator as AnyDuringMigration).definitions_['import_sys'] =\n 'import sys';\n at2 += ' or sys.maxsize';\n } else if (at2 === 0) {\n at2 = '';\n }\n break;\n case 'LAST':\n at2 = '';\n break;\n default:\n throw Error('Unhandled option (lists_getSublist)');\n }\n const code = list + '[' + at1 + ' : ' + at2 + ']';\n return [code, Order.MEMBER];\n}\n\nexport function lists_sort(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Block for sorting a list.\n const list = generator.valueToCode(block, 'LIST', Order.NONE) || '[]';\n const type = block.getFieldValue('TYPE');\n const reverse = block.getFieldValue('DIRECTION') === '1' ? 'False' : 'True';\n const sortFunctionName = generator.provideFunction_(\n 'lists_sort',\n `\ndef ${generator.FUNCTION_NAME_PLACEHOLDER_}(my_list, type, reverse):\n def try_float(s):\n try:\n return float(s)\n except:\n return 0\n key_funcs = {\n \"NUMERIC\": try_float,\n \"TEXT\": str,\n \"IGNORE_CASE\": lambda s: str(s).lower()\n }\n key_func = key_funcs[type]\n list_cpy = list(my_list)\n return sorted(list_cpy, key=key_func, reverse=reverse)\n`,\n );\n\n const code =\n sortFunctionName + '(' + list + ', \"' + type + '\", ' + reverse + ')';\n return [code, Order.FUNCTION_CALL];\n}\n\nexport function lists_split(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Block for splitting text into a list, or joining a list into text.\n const mode = block.getFieldValue('MODE');\n let code;\n if (mode === 'SPLIT') {\n const value_input =\n generator.valueToCode(block, 'INPUT', Order.MEMBER) || \"''\";\n const value_delim = generator.valueToCode(block, 'DELIM', Order.NONE);\n code = value_input + '.split(' + value_delim + ')';\n } else if (mode === 'JOIN') {\n const value_input =\n generator.valueToCode(block, 'INPUT', Order.NONE) || '[]';\n const value_delim =\n generator.valueToCode(block, 'DELIM', Order.MEMBER) || \"''\";\n code = value_delim + '.join(' + value_input + ')';\n } else {\n throw Error('Unknown mode: ' + mode);\n }\n return [code, Order.FUNCTION_CALL];\n}\n\nexport function lists_reverse(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Block for reversing a list.\n const list = generator.valueToCode(block, 'LIST', Order.NONE) || '[]';\n const code = 'list(reversed(' + list + '))';\n return [code, Order.FUNCTION_CALL];\n}\n","/**\n * @license\n * Copyright 2012 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @file Generating Python for logic blocks.\n */\n\n// Former goog.module ID: Blockly.Python.logic\n\nimport type {Block} from '../../core/block.js';\nimport type {PythonGenerator} from './python_generator.js';\nimport {Order} from './python_generator.js';\n\nexport function controls_if(block: Block, generator: PythonGenerator) {\n // If/elseif/else condition.\n let n = 0;\n let code = '',\n branchCode,\n conditionCode;\n if (generator.STATEMENT_PREFIX) {\n // Automatic prefix insertion is switched off for this block. Add manually.\n code += generator.injectId(generator.STATEMENT_PREFIX, block);\n }\n do {\n conditionCode =\n generator.valueToCode(block, 'IF' + n, Order.NONE) || 'False';\n branchCode = generator.statementToCode(block, 'DO' + n) || generator.PASS;\n if (generator.STATEMENT_SUFFIX) {\n branchCode =\n generator.prefixLines(\n generator.injectId(generator.STATEMENT_SUFFIX, block),\n generator.INDENT,\n ) + branchCode;\n }\n code += (n === 0 ? 'if ' : 'elif ') + conditionCode + ':\\n' + branchCode;\n n++;\n } while (block.getInput('IF' + n));\n\n if (block.getInput('ELSE') || generator.STATEMENT_SUFFIX) {\n branchCode = generator.statementToCode(block, 'ELSE') || generator.PASS;\n if (generator.STATEMENT_SUFFIX) {\n branchCode =\n generator.prefixLines(\n generator.injectId(generator.STATEMENT_SUFFIX, block),\n generator.INDENT,\n ) + branchCode;\n }\n code += 'else:\\n' + branchCode;\n }\n return code;\n}\n\nexport const controls_ifelse = controls_if;\n\nexport function logic_compare(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Comparison operator.\n const OPERATORS = {\n 'EQ': '==',\n 'NEQ': '!=',\n 'LT': '<',\n 'LTE': '<=',\n 'GT': '>',\n 'GTE': '>=',\n };\n type OperatorOption = keyof typeof OPERATORS;\n const operator = OPERATORS[block.getFieldValue('OP') as OperatorOption];\n const order = Order.RELATIONAL;\n const argument0 = generator.valueToCode(block, 'A', order) || '0';\n const argument1 = generator.valueToCode(block, 'B', order) || '0';\n const code = argument0 + ' ' + operator + ' ' + argument1;\n return [code, order];\n}\n\nexport function logic_operation(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Operations 'and', 'or'.\n const operator = block.getFieldValue('OP') === 'AND' ? 'and' : 'or';\n const order = operator === 'and' ? Order.LOGICAL_AND : Order.LOGICAL_OR;\n let argument0 = generator.valueToCode(block, 'A', order);\n let argument1 = generator.valueToCode(block, 'B', order);\n if (!argument0 && !argument1) {\n // If there are no arguments, then the return value is false.\n argument0 = 'False';\n argument1 = 'False';\n } else {\n // Single missing arguments have no effect on the return value.\n const defaultArgument = operator === 'and' ? 'True' : 'False';\n if (!argument0) {\n argument0 = defaultArgument;\n }\n if (!argument1) {\n argument1 = defaultArgument;\n }\n }\n const code = argument0 + ' ' + operator + ' ' + argument1;\n return [code, order];\n}\n\nexport function logic_negate(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Negation.\n const argument0 =\n generator.valueToCode(block, 'BOOL', Order.LOGICAL_NOT) || 'True';\n const code = 'not ' + argument0;\n return [code, Order.LOGICAL_NOT];\n}\n\nexport function logic_boolean(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Boolean values true and false.\n const code = block.getFieldValue('BOOL') === 'TRUE' ? 'True' : 'False';\n return [code, Order.ATOMIC];\n}\n\nexport function logic_null(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Null data type.\n return ['None', Order.ATOMIC];\n}\n\nexport function logic_ternary(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Ternary operator.\n const value_if =\n generator.valueToCode(block, 'IF', Order.CONDITIONAL) || 'False';\n const value_then =\n generator.valueToCode(block, 'THEN', Order.CONDITIONAL) || 'None';\n const value_else =\n generator.valueToCode(block, 'ELSE', Order.CONDITIONAL) || 'None';\n const code = value_then + ' if ' + value_if + ' else ' + value_else;\n return [code, Order.CONDITIONAL];\n}\n","/**\n * @license\n * Copyright 2012 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @file Generating Python for loop blocks.\n */\n\n// Former goog.module ID: Blockly.Python.loops\n\nimport type {ControlFlowInLoopBlock} from '../../blocks/loops.js';\nimport type {Block} from '../../core/block.js';\nimport {NameType} from '../../core/names.js';\nimport * as stringUtils from '../../core/utils/string.js';\nimport type {PythonGenerator} from './python_generator.js';\nimport {Order} from './python_generator.js';\n\nexport function controls_repeat_ext(block: Block, generator: PythonGenerator) {\n // Repeat n times.\n let repeats;\n if (block.getField('TIMES')) {\n // Internal number.\n repeats = String(parseInt(block.getFieldValue('TIMES'), 10));\n } else {\n // External number.\n repeats = generator.valueToCode(block, 'TIMES', Order.NONE) || '0';\n }\n if (stringUtils.isNumber(repeats)) {\n repeats = parseInt(repeats, 10);\n } else {\n repeats = 'int(' + repeats + ')';\n }\n let branch = generator.statementToCode(block, 'DO');\n branch = generator.addLoopTrap(branch, block) || generator.PASS;\n const loopVar = generator.nameDB_!.getDistinctName(\n 'count',\n NameType.VARIABLE,\n );\n const code = 'for ' + loopVar + ' in range(' + repeats + '):\\n' + branch;\n return code;\n}\n\nexport const controls_repeat = controls_repeat_ext;\n\nexport function controls_whileUntil(block: Block, generator: PythonGenerator) {\n // Do while/until loop.\n const until = block.getFieldValue('MODE') === 'UNTIL';\n let argument0 =\n generator.valueToCode(\n block,\n 'BOOL',\n until ? Order.LOGICAL_NOT : Order.NONE,\n ) || 'False';\n let branch = generator.statementToCode(block, 'DO');\n branch = generator.addLoopTrap(branch, block) || generator.PASS;\n if (until) {\n argument0 = 'not ' + argument0;\n }\n return 'while ' + argument0 + ':\\n' + branch;\n}\n\nexport function controls_for(block: Block, generator: PythonGenerator) {\n // For loop.\n const variable0 = generator.getVariableName(block.getFieldValue('VAR'));\n let argument0: string | number =\n generator.valueToCode(block, 'FROM', Order.NONE) || '0';\n let argument1: string | number =\n generator.valueToCode(block, 'TO', Order.NONE) || '0';\n let increment: string | number =\n generator.valueToCode(block, 'BY', Order.NONE) || '1';\n let branch = generator.statementToCode(block, 'DO');\n branch = generator.addLoopTrap(branch, block) || generator.PASS;\n\n let code = '';\n let range;\n\n // Helper functions.\n const defineUpRange = function () {\n return generator.provideFunction_(\n 'upRange',\n `\ndef ${generator.FUNCTION_NAME_PLACEHOLDER_}(start, stop, step):\n while start <= stop:\n yield start\n start += abs(step)\n`,\n );\n };\n const defineDownRange = function () {\n return generator.provideFunction_(\n 'downRange',\n `\ndef ${generator.FUNCTION_NAME_PLACEHOLDER_}(start, stop, step):\n while start >= stop:\n yield start\n start -= abs(step)\n`,\n );\n };\n // Arguments are legal generator code (numbers or strings returned by scrub()).\n const generateUpDownRange = function (\n start: string,\n end: string,\n inc: string,\n ) {\n return (\n '(' +\n start +\n ' <= ' +\n end +\n ') and ' +\n defineUpRange() +\n '(' +\n start +\n ', ' +\n end +\n ', ' +\n inc +\n ') or ' +\n defineDownRange() +\n '(' +\n start +\n ', ' +\n end +\n ', ' +\n inc +\n ')'\n );\n };\n\n if (\n stringUtils.isNumber(argument0) &&\n stringUtils.isNumber(argument1) &&\n stringUtils.isNumber(increment)\n ) {\n // All parameters are simple numbers.\n argument0 = Number(argument0);\n argument1 = Number(argument1);\n increment = Math.abs(Number(increment));\n if (argument0 % 1 === 0 && argument1 % 1 === 0 && increment % 1 === 0) {\n // All parameters are integers.\n if (argument0 <= argument1) {\n // Count up.\n argument1++;\n if (argument0 === 0 && increment === 1) {\n // If starting index is 0, omit it.\n range = argument1;\n } else {\n range = argument0 + ', ' + argument1;\n }\n // If increment isn't 1, it must be explicit.\n if (increment !== 1) {\n range += ', ' + increment;\n }\n } else {\n // Count down.\n argument1--;\n range = argument0 + ', ' + argument1 + ', -' + increment;\n }\n range = 'range(' + range + ')';\n } else {\n // At least one of the parameters is not an integer.\n if (argument0 < argument1) {\n range = defineUpRange();\n } else {\n range = defineDownRange();\n }\n range += '(' + argument0 + ', ' + argument1 + ', ' + increment + ')';\n }\n } else {\n // Cache non-trivial values to variables to prevent repeated look-ups.\n const scrub = function (arg: string, suffix: string) {\n if (stringUtils.isNumber(arg)) {\n // Simple number.\n arg = String(Number(arg));\n } else if (!arg.match(/^\\w+$/)) {\n // Not a variable, it's complicated.\n const varName = generator.nameDB_!.getDistinctName(\n variable0 + suffix,\n NameType.VARIABLE,\n );\n code += varName + ' = ' + arg + '\\n';\n arg = varName;\n }\n return arg;\n };\n const startVar = scrub(argument0, '_start');\n const endVar = scrub(argument1, '_end');\n const incVar = scrub(increment, '_inc');\n\n if (typeof startVar === 'number' && typeof endVar === 'number') {\n if (startVar < endVar) {\n range = defineUpRange();\n } else {\n range = defineDownRange();\n }\n range += '(' + startVar + ', ' + endVar + ', ' + incVar + ')';\n } else {\n // We cannot determine direction statically.\n range = generateUpDownRange(startVar, endVar, incVar);\n }\n }\n code += 'for ' + variable0 + ' in ' + range + ':\\n' + branch;\n return code;\n}\n\nexport function controls_forEach(block: Block, generator: PythonGenerator) {\n // For each loop.\n const variable0 = generator.getVariableName(block.getFieldValue('VAR'));\n const argument0 =\n generator.valueToCode(block, 'LIST', Order.RELATIONAL) || '[]';\n let branch = generator.statementToCode(block, 'DO');\n branch = generator.addLoopTrap(branch, block) || generator.PASS;\n const code = 'for ' + variable0 + ' in ' + argument0 + ':\\n' + branch;\n return code;\n}\n\nexport function controls_flow_statements(\n block: Block,\n generator: PythonGenerator,\n) {\n // Flow statements: continue, break.\n let xfix = '';\n if (generator.STATEMENT_PREFIX) {\n // Automatic prefix insertion is switched off for this block. Add manually.\n xfix += generator.injectId(generator.STATEMENT_PREFIX, block);\n }\n if (generator.STATEMENT_SUFFIX) {\n // Inject any statement suffix here since the regular one at the end\n // will not get executed if the break/continue is triggered.\n xfix += generator.injectId(generator.STATEMENT_SUFFIX, block);\n }\n if (generator.STATEMENT_PREFIX) {\n const loop = (block as ControlFlowInLoopBlock).getSurroundLoop();\n if (loop && !loop.suppressPrefixSuffix) {\n // Inject loop's statement prefix here since the regular one at the end\n // of the loop will not get executed if 'continue' is triggered.\n // In the case of 'break', a prefix is needed due to the loop's suffix.\n xfix += generator.injectId(generator.STATEMENT_PREFIX, loop);\n }\n }\n switch (block.getFieldValue('FLOW')) {\n case 'BREAK':\n return xfix + 'break\\n';\n case 'CONTINUE':\n return xfix + 'continue\\n';\n }\n throw Error('Unknown flow statement.');\n}\n","/**\n * @license\n * Copyright 2012 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @file Generating Python for math blocks.\n */\n\n// Former goog.module ID: Blockly.Python.math\n\nimport type {Block} from '../../core/block.js';\nimport type {PythonGenerator} from './python_generator.js';\nimport {Order} from './python_generator.js';\n\n// If any new block imports any library, add that library name here.\n// RESERVED WORDS: 'math,random,Number'\n\nexport function math_number(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Numeric value.\n let number = Number(block.getFieldValue('NUM'));\n if (number === Infinity) {\n return ['float(\"inf\")', Order.FUNCTION_CALL];\n } else if (number === -Infinity) {\n return ['-float(\"inf\")', Order.UNARY_SIGN];\n } else {\n return [String(number), number < 0 ? Order.UNARY_SIGN : Order.ATOMIC];\n }\n}\n\nexport function math_arithmetic(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Basic arithmetic operators, and power.\n const OPERATORS: Record = {\n 'ADD': [' + ', Order.ADDITIVE],\n 'MINUS': [' - ', Order.ADDITIVE],\n 'MULTIPLY': [' * ', Order.MULTIPLICATIVE],\n 'DIVIDE': [' / ', Order.MULTIPLICATIVE],\n 'POWER': [' ** ', Order.EXPONENTIATION],\n };\n type OperatorOption = keyof typeof OPERATORS;\n const tuple = OPERATORS[block.getFieldValue('OP') as OperatorOption];\n const operator = tuple[0];\n const order = tuple[1];\n const argument0 = generator.valueToCode(block, 'A', order) || '0';\n const argument1 = generator.valueToCode(block, 'B', order) || '0';\n const code = argument0 + operator + argument1;\n return [code, order];\n // In case of 'DIVIDE', division between integers returns different results\n // in generator 2 and 3. However, is not an issue since Blockly does not\n // guarantee identical results in all languages. To do otherwise would\n // require every operator to be wrapped in a function call. This would kill\n // legibility of the generated code.\n}\n\nexport function math_single(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Math operators with single operand.\n const operator = block.getFieldValue('OP');\n let code;\n let arg;\n if (operator === 'NEG') {\n // Negation is a special case given its different operator precedence.\n code = generator.valueToCode(block, 'NUM', Order.UNARY_SIGN) || '0';\n return ['-' + code, Order.UNARY_SIGN];\n }\n // TODO(#7600): find better approach than casting to any to override\n // CodeGenerator declaring .definitions protected (here and below).\n (generator as AnyDuringMigration).definitions_['import_math'] = 'import math';\n if (operator === 'SIN' || operator === 'COS' || operator === 'TAN') {\n arg = generator.valueToCode(block, 'NUM', Order.MULTIPLICATIVE) || '0';\n } else {\n arg = generator.valueToCode(block, 'NUM', Order.NONE) || '0';\n }\n // First, handle cases which generate values that don't need parentheses\n // wrapping the code.\n switch (operator) {\n case 'ABS':\n code = 'math.fabs(' + arg + ')';\n break;\n case 'ROOT':\n code = 'math.sqrt(' + arg + ')';\n break;\n case 'LN':\n code = 'math.log(' + arg + ')';\n break;\n case 'LOG10':\n code = 'math.log10(' + arg + ')';\n break;\n case 'EXP':\n code = 'math.exp(' + arg + ')';\n break;\n case 'POW10':\n code = 'math.pow(10,' + arg + ')';\n break;\n case 'ROUND':\n code = 'round(' + arg + ')';\n break;\n case 'ROUNDUP':\n code = 'math.ceil(' + arg + ')';\n break;\n case 'ROUNDDOWN':\n code = 'math.floor(' + arg + ')';\n break;\n case 'SIN':\n code = 'math.sin(' + arg + ' / 180.0 * math.pi)';\n break;\n case 'COS':\n code = 'math.cos(' + arg + ' / 180.0 * math.pi)';\n break;\n case 'TAN':\n code = 'math.tan(' + arg + ' / 180.0 * math.pi)';\n break;\n }\n if (code) {\n return [code, Order.FUNCTION_CALL];\n }\n // Second, handle cases which generate values that may need parentheses\n // wrapping the code.\n switch (operator) {\n case 'ASIN':\n code = 'math.asin(' + arg + ') / math.pi * 180';\n break;\n case 'ACOS':\n code = 'math.acos(' + arg + ') / math.pi * 180';\n break;\n case 'ATAN':\n code = 'math.atan(' + arg + ') / math.pi * 180';\n break;\n default:\n throw Error('Unknown math operator: ' + operator);\n }\n return [code, Order.MULTIPLICATIVE];\n}\n\nexport function math_constant(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Constants: PI, E, the Golden Ratio, sqrt(2), 1/sqrt(2), INFINITY.\n const CONSTANTS: Record = {\n 'PI': ['math.pi', Order.MEMBER],\n 'E': ['math.e', Order.MEMBER],\n 'GOLDEN_RATIO': ['(1 + math.sqrt(5)) / 2', Order.MULTIPLICATIVE],\n 'SQRT2': ['math.sqrt(2)', Order.MEMBER],\n 'SQRT1_2': ['math.sqrt(1.0 / 2)', Order.MEMBER],\n 'INFINITY': [\"float('inf')\", Order.ATOMIC],\n };\n type ConstantOption = keyof typeof CONSTANTS;\n const constant = block.getFieldValue('CONSTANT') as ConstantOption;\n if (constant !== 'INFINITY') {\n (generator as AnyDuringMigration).definitions_['import_math'] =\n 'import math';\n }\n return CONSTANTS[constant];\n}\n\nexport function math_number_property(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Check if a number is even, odd, prime, whole, positive, or negative\n // or if it is divisible by certain number. Returns true or false.\n const PROPERTIES: Record = {\n 'EVEN': [' % 2 == 0', Order.MULTIPLICATIVE, Order.RELATIONAL],\n 'ODD': [' % 2 == 1', Order.MULTIPLICATIVE, Order.RELATIONAL],\n 'WHOLE': [' % 1 == 0', Order.MULTIPLICATIVE, Order.RELATIONAL],\n 'POSITIVE': [' > 0', Order.RELATIONAL, Order.RELATIONAL],\n 'NEGATIVE': [' < 0', Order.RELATIONAL, Order.RELATIONAL],\n 'DIVISIBLE_BY': [null, Order.MULTIPLICATIVE, Order.RELATIONAL],\n 'PRIME': [null, Order.NONE, Order.FUNCTION_CALL],\n };\n type PropertyOption = keyof typeof PROPERTIES;\n const dropdownProperty = block.getFieldValue('PROPERTY') as PropertyOption;\n const [suffix, inputOrder, outputOrder] = PROPERTIES[dropdownProperty];\n const numberToCheck =\n generator.valueToCode(block, 'NUMBER_TO_CHECK', inputOrder) || '0';\n let code;\n if (dropdownProperty === 'PRIME') {\n // Prime is a special case as it is not a one-liner test.\n (generator as AnyDuringMigration).definitions_['import_math'] =\n 'import math';\n (generator as AnyDuringMigration).definitions_[\n 'from_numbers_import_Number'\n ] = 'from numbers import Number';\n const functionName = generator.provideFunction_(\n 'math_isPrime',\n `\ndef ${generator.FUNCTION_NAME_PLACEHOLDER_}(n):\n # https://en.wikipedia.org/wiki/Primality_test#Naive_methods\n # If n is not a number but a string, try parsing it.\n if not isinstance(n, Number):\n try:\n n = float(n)\n except:\n return False\n if n == 2 or n == 3:\n return True\n # False if n is negative, is 1, or not whole, or if n is divisible by 2 or 3.\n if n <= 1 or n % 1 != 0 or n % 2 == 0 or n % 3 == 0:\n return False\n # Check all the numbers of form 6k +/- 1, up to sqrt(n).\n for x in range(6, int(math.sqrt(n)) + 2, 6):\n if n % (x - 1) == 0 or n % (x + 1) == 0:\n return False\n return True\n`,\n );\n code = functionName + '(' + numberToCheck + ')';\n } else if (dropdownProperty === 'DIVISIBLE_BY') {\n const divisor =\n generator.valueToCode(block, 'DIVISOR', Order.MULTIPLICATIVE) || '0';\n // If 'divisor' is some code that evals to 0, generator will raise an error.\n if (divisor === '0') {\n return ['False', Order.ATOMIC];\n }\n code = numberToCheck + ' % ' + divisor + ' == 0';\n } else {\n code = numberToCheck + suffix;\n }\n return [code, outputOrder];\n}\n\nexport function math_change(block: Block, generator: PythonGenerator) {\n // Add to a variable in place.\n (generator as AnyDuringMigration).definitions_['from_numbers_import_Number'] =\n 'from numbers import Number';\n const argument0 =\n generator.valueToCode(block, 'DELTA', Order.ADDITIVE) || '0';\n const varName = generator.getVariableName(block.getFieldValue('VAR'));\n return (\n varName +\n ' = (' +\n varName +\n ' if isinstance(' +\n varName +\n ', Number) else 0) + ' +\n argument0 +\n '\\n'\n );\n}\n\n// Rounding functions have a single operand.\nexport const math_round = math_single;\n// Trigonometry functions have a single operand.\nexport const math_trig = math_single;\n\nexport function math_on_list(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Math functions for lists.\n const func = block.getFieldValue('OP');\n const list = generator.valueToCode(block, 'LIST', Order.NONE) || '[]';\n let code;\n switch (func) {\n case 'SUM':\n code = 'sum(' + list + ')';\n break;\n case 'MIN':\n code = 'min(' + list + ')';\n break;\n case 'MAX':\n code = 'max(' + list + ')';\n break;\n case 'AVERAGE': {\n (generator as AnyDuringMigration).definitions_[\n 'from_numbers_import_Number'\n ] = 'from numbers import Number';\n // This operation excludes null and values that aren't int or float:\n // math_mean([null, null, \"aString\", 1, 9]) -> 5.0\n const functionName = generator.provideFunction_(\n 'math_mean',\n `\ndef ${generator.FUNCTION_NAME_PLACEHOLDER_}(myList):\n localList = [e for e in myList if isinstance(e, Number)]\n if not localList: return\n return float(sum(localList)) / len(localList)\n`,\n );\n code = functionName + '(' + list + ')';\n break;\n }\n case 'MEDIAN': {\n (generator as AnyDuringMigration).definitions_[\n 'from_numbers_import_Number'\n ] = 'from numbers import Number';\n // This operation excludes null values:\n // math_median([null, null, 1, 3]) -> 2.0\n const functionName = generator.provideFunction_(\n 'math_median',\n `\ndef ${generator.FUNCTION_NAME_PLACEHOLDER_}(myList):\n localList = sorted([e for e in myList if isinstance(e, Number)])\n if not localList: return\n if len(localList) % 2 == 0:\n return (localList[len(localList) // 2 - 1] + localList[len(localList) // 2]) / 2.0\n else:\n return localList[(len(localList) - 1) // 2]\n`,\n );\n code = functionName + '(' + list + ')';\n break;\n }\n case 'MODE': {\n // As a list of numbers can contain more than one mode,\n // the returned result is provided as an array.\n // Mode of [3, 'x', 'x', 1, 1, 2, '3'] -> ['x', 1]\n const functionName = generator.provideFunction_(\n 'math_modes',\n `\ndef ${generator.FUNCTION_NAME_PLACEHOLDER_}(some_list):\n modes = []\n # Using a lists of [item, count] to keep count rather than dict\n # to avoid \"unhashable\" errors when the counted item is itself a list or dict.\n counts = []\n maxCount = 1\n for item in some_list:\n found = False\n for count in counts:\n if count[0] == item:\n count[1] += 1\n maxCount = max(maxCount, count[1])\n found = True\n if not found:\n counts.append([item, 1])\n for counted_item, item_count in counts:\n if item_count == maxCount:\n modes.append(counted_item)\n return modes\n`,\n );\n code = functionName + '(' + list + ')';\n break;\n }\n case 'STD_DEV': {\n (generator as AnyDuringMigration).definitions_['import_math'] =\n 'import math';\n const functionName = generator.provideFunction_(\n 'math_standard_deviation',\n `\ndef ${generator.FUNCTION_NAME_PLACEHOLDER_}(numbers):\n n = len(numbers)\n if n == 0: return\n mean = float(sum(numbers)) / n\n variance = sum((x - mean) ** 2 for x in numbers) / n\n return math.sqrt(variance)\n`,\n );\n code = functionName + '(' + list + ')';\n break;\n }\n case 'RANDOM':\n (generator as AnyDuringMigration).definitions_['import_random'] =\n 'import random';\n code = 'random.choice(' + list + ')';\n break;\n default:\n throw Error('Unknown operator: ' + func);\n }\n return [code, Order.FUNCTION_CALL];\n}\n\nexport function math_modulo(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Remainder computation.\n const argument0 =\n generator.valueToCode(block, 'DIVIDEND', Order.MULTIPLICATIVE) || '0';\n const argument1 =\n generator.valueToCode(block, 'DIVISOR', Order.MULTIPLICATIVE) || '0';\n const code = argument0 + ' % ' + argument1;\n return [code, Order.MULTIPLICATIVE];\n}\n\nexport function math_constrain(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Constrain a number between two limits.\n const argument0 = generator.valueToCode(block, 'VALUE', Order.NONE) || '0';\n const argument1 = generator.valueToCode(block, 'LOW', Order.NONE) || '0';\n const argument2 =\n generator.valueToCode(block, 'HIGH', Order.NONE) || \"float('inf')\";\n const code =\n 'min(max(' + argument0 + ', ' + argument1 + '), ' + argument2 + ')';\n return [code, Order.FUNCTION_CALL];\n}\n\nexport function math_random_int(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Random integer between [X] and [Y].\n (generator as AnyDuringMigration).definitions_['import_random'] =\n 'import random';\n const argument0 = generator.valueToCode(block, 'FROM', Order.NONE) || '0';\n const argument1 = generator.valueToCode(block, 'TO', Order.NONE) || '0';\n const code = 'random.randint(' + argument0 + ', ' + argument1 + ')';\n return [code, Order.FUNCTION_CALL];\n}\n\nexport function math_random_float(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Random fraction between 0 and 1.\n (generator as AnyDuringMigration).definitions_['import_random'] =\n 'import random';\n return ['random.random()', Order.FUNCTION_CALL];\n}\n\nexport function math_atan2(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Arctangent of point (X, Y) in degrees from -180 to 180.\n (generator as AnyDuringMigration).definitions_['import_math'] = 'import math';\n const argument0 = generator.valueToCode(block, 'X', Order.NONE) || '0';\n const argument1 = generator.valueToCode(block, 'Y', Order.NONE) || '0';\n return [\n 'math.atan2(' + argument1 + ', ' + argument0 + ') / math.pi * 180',\n Order.MULTIPLICATIVE,\n ];\n}\n","/**\n * @license\n * Copyright 2012 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @file Generating Python for procedure blocks.\n */\n\n// Former goog.module ID: Blockly.Python.procedures\n\nimport type {IfReturnBlock} from '../../blocks/procedures.js';\nimport type {Block} from '../../core/block.js';\nimport {NameType} from '../../core/names.js';\nimport * as Variables from '../../core/variables.js';\nimport type {PythonGenerator} from './python_generator.js';\nimport {Order} from './python_generator.js';\n\nexport function procedures_defreturn(block: Block, generator: PythonGenerator) {\n // Define a procedure with a return value.\n // First, add a 'global' statement for every variable that is not shadowed by\n // a local parameter.\n const globals = [];\n const workspace = block.workspace;\n const usedVariables = Variables.allUsedVarModels(workspace) || [];\n for (const variable of usedVariables) {\n const varName = variable.name;\n // getVars returns parameter names, not ids, for procedure blocks\n if (!block.getVars().includes(varName)) {\n globals.push(generator.getVariableName(varName));\n }\n }\n // Add developer variables.\n const devVarList = Variables.allDeveloperVariables(workspace);\n for (let i = 0; i < devVarList.length; i++) {\n globals.push(\n generator.nameDB_!.getName(devVarList[i], NameType.DEVELOPER_VARIABLE),\n );\n }\n\n const globalString = globals.length\n ? generator.INDENT + 'global ' + globals.join(', ') + '\\n'\n : '';\n const funcName = generator.getProcedureName(block.getFieldValue('NAME'));\n let xfix1 = '';\n if (generator.STATEMENT_PREFIX) {\n xfix1 += generator.injectId(generator.STATEMENT_PREFIX, block);\n }\n if (generator.STATEMENT_SUFFIX) {\n xfix1 += generator.injectId(generator.STATEMENT_SUFFIX, block);\n }\n if (xfix1) {\n xfix1 = generator.prefixLines(xfix1, generator.INDENT);\n }\n let loopTrap = '';\n if (generator.INFINITE_LOOP_TRAP) {\n loopTrap = generator.prefixLines(\n generator.injectId(generator.INFINITE_LOOP_TRAP, block),\n generator.INDENT,\n );\n }\n let branch = '';\n if (block.getInput('STACK')) {\n // The 'procedures_defreturn' block might not have a STACK input.\n branch = generator.statementToCode(block, 'STACK');\n }\n let returnValue = '';\n if (block.getInput('RETURN')) {\n // The 'procedures_defnoreturn' block (which shares this code)\n // does not have a RETURN input.\n returnValue = generator.valueToCode(block, 'RETURN', Order.NONE) || '';\n }\n let xfix2 = '';\n if (branch && returnValue) {\n // After executing the function body, revisit this block for the return.\n xfix2 = xfix1;\n }\n if (returnValue) {\n returnValue = generator.INDENT + 'return ' + returnValue + '\\n';\n } else if (!branch) {\n branch = generator.PASS;\n }\n const args = [];\n const variables = block.getVars();\n for (let i = 0; i < variables.length; i++) {\n args[i] = generator.getVariableName(variables[i]);\n }\n let code =\n 'def ' +\n funcName +\n '(' +\n args.join(', ') +\n '):\\n' +\n globalString +\n xfix1 +\n loopTrap +\n branch +\n xfix2 +\n returnValue;\n code = generator.scrub_(block, code);\n // Add % so as not to collide with helper functions in definitions list.\n // TODO(#7600): find better approach than casting to any to override\n // CodeGenerator declaring .definitions protected.\n (generator as AnyDuringMigration).definitions_['%' + funcName] = code;\n return null;\n}\n\n// Defining a procedure without a return value uses the same generator as\n// a procedure with a return value.\nexport const procedures_defnoreturn = procedures_defreturn;\n\nexport function procedures_callreturn(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Call a procedure with a return value.\n const funcName = generator.getProcedureName(block.getFieldValue('NAME'));\n const args = [];\n const variables = block.getVars();\n for (let i = 0; i < variables.length; i++) {\n args[i] = generator.valueToCode(block, 'ARG' + i, Order.NONE) || 'None';\n }\n const code = funcName + '(' + args.join(', ') + ')';\n return [code, Order.FUNCTION_CALL];\n}\n\nexport function procedures_callnoreturn(\n block: Block,\n generator: PythonGenerator,\n) {\n // Call a procedure with no return value.\n // Generated code is for a function call as a statement is the same as a\n // function call as a value, with the addition of line ending.\n const tuple = generator.forBlock['procedures_callreturn'](block, generator)!;\n return tuple[0] + '\\n';\n}\n\nexport function procedures_ifreturn(block: Block, generator: PythonGenerator) {\n // Conditionally return value from a procedure.\n const condition =\n generator.valueToCode(block, 'CONDITION', Order.NONE) || 'False';\n let code = 'if ' + condition + ':\\n';\n if (generator.STATEMENT_SUFFIX) {\n // Inject any statement suffix here since the regular one at the end\n // will not get executed if the return is triggered.\n code += generator.prefixLines(\n generator.injectId(generator.STATEMENT_SUFFIX, block),\n generator.INDENT,\n );\n }\n if ((block as IfReturnBlock).hasReturnValue_) {\n const value = generator.valueToCode(block, 'VALUE', Order.NONE) || 'None';\n code += generator.INDENT + 'return ' + value + '\\n';\n } else {\n code += generator.INDENT + 'return\\n';\n }\n return code;\n}\n","/**\n * @license\n * Copyright 2012 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @file Generating Python for text blocks.\n */\n\n// Former goog.module ID: Blockly.Python.texts\n\nimport type {JoinMutatorBlock} from '../../blocks/text.js';\nimport type {Block} from '../../core/block.js';\nimport {NameType} from '../../core/names.js';\nimport * as stringUtils from '../../core/utils/string.js';\nimport type {PythonGenerator} from './python_generator.js';\nimport {Order} from './python_generator.js';\n\nexport function text(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Text value.\n const code = generator.quote_(block.getFieldValue('TEXT'));\n return [code, Order.ATOMIC];\n}\n\n/**\n * Regular expression to detect a single-quoted string literal.\n */\nconst strRegExp = /^\\s*'([^']|\\\\')*'\\s*$/;\n\n/**\n * Enclose the provided value in 'str(...)' function.\n * Leave string literals alone.\n *\n * @param value Code evaluating to a value.\n * @returns Array containing code evaluating to a string\n * and\n * the order of the returned code.[string, number]\n */\nconst forceString = function (value: string): [string, Order] {\n if (strRegExp.test(value)) {\n return [value, Order.ATOMIC];\n }\n return ['str(' + value + ')', Order.FUNCTION_CALL];\n};\n\nexport function text_join(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Create a string made up of any number of elements of any type.\n // Should we allow joining by '-' or ',' or any other characters?\n const joinBlock = block as JoinMutatorBlock;\n switch (joinBlock.itemCount_) {\n case 0:\n return [\"''\", Order.ATOMIC];\n case 1: {\n const element = generator.valueToCode(block, 'ADD0', Order.NONE) || \"''\";\n const codeAndOrder = forceString(element);\n return codeAndOrder;\n }\n case 2: {\n const element0 = generator.valueToCode(block, 'ADD0', Order.NONE) || \"''\";\n const element1 = generator.valueToCode(block, 'ADD1', Order.NONE) || \"''\";\n const code = forceString(element0)[0] + ' + ' + forceString(element1)[0];\n return [code, Order.ADDITIVE];\n }\n default: {\n const elements = [];\n for (let i = 0; i < joinBlock.itemCount_; i++) {\n elements[i] =\n generator.valueToCode(block, 'ADD' + i, Order.NONE) || \"''\";\n }\n const tempVar = generator.nameDB_!.getDistinctName(\n 'x',\n NameType.VARIABLE,\n );\n const code =\n \"''.join([str(\" +\n tempVar +\n ') for ' +\n tempVar +\n ' in [' +\n elements.join(', ') +\n ']])';\n return [code, Order.FUNCTION_CALL];\n }\n }\n}\n\nexport function text_append(block: Block, generator: PythonGenerator) {\n // Append to a variable in place.\n const varName = generator.getVariableName(block.getFieldValue('VAR'));\n const value = generator.valueToCode(block, 'TEXT', Order.NONE) || \"''\";\n return varName + ' = str(' + varName + ') + ' + forceString(value)[0] + '\\n';\n}\n\nexport function text_length(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Is the string null or array empty?\n const text = generator.valueToCode(block, 'VALUE', Order.NONE) || \"''\";\n return ['len(' + text + ')', Order.FUNCTION_CALL];\n}\n\nexport function text_isEmpty(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Is the string null or array empty?\n const text = generator.valueToCode(block, 'VALUE', Order.NONE) || \"''\";\n const code = 'not len(' + text + ')';\n return [code, Order.LOGICAL_NOT];\n}\n\nexport function text_indexOf(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Search the text for a substring.\n // Should we allow for non-case sensitive???\n const operator = block.getFieldValue('END') === 'FIRST' ? 'find' : 'rfind';\n const substring = generator.valueToCode(block, 'FIND', Order.NONE) || \"''\";\n const text = generator.valueToCode(block, 'VALUE', Order.MEMBER) || \"''\";\n const code = text + '.' + operator + '(' + substring + ')';\n if (block.workspace.options.oneBasedIndex) {\n return [code + ' + 1', Order.ADDITIVE];\n }\n return [code, Order.FUNCTION_CALL];\n}\n\nexport function text_charAt(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Get letter at index.\n // Note: Until January 2013 this block did not have the WHERE input.\n const where = block.getFieldValue('WHERE') || 'FROM_START';\n const textOrder = where === 'RANDOM' ? Order.NONE : Order.MEMBER;\n const text = generator.valueToCode(block, 'VALUE', textOrder) || \"''\";\n switch (where) {\n case 'FIRST': {\n const code = text + '[0]';\n return [code, Order.MEMBER];\n }\n case 'LAST': {\n const code = text + '[-1]';\n return [code, Order.MEMBER];\n }\n case 'FROM_START': {\n const at = generator.getAdjustedInt(block, 'AT');\n const code = text + '[' + at + ']';\n return [code, Order.MEMBER];\n }\n case 'FROM_END': {\n const at = generator.getAdjustedInt(block, 'AT', 1, true);\n const code = text + '[' + at + ']';\n return [code, Order.MEMBER];\n }\n case 'RANDOM': {\n // TODO(#7600): find better approach than casting to any to override\n // CodeGenerator declaring .definitions protected (here and below).\n (generator as AnyDuringMigration).definitions_['import_random'] =\n 'import random';\n const functionName = generator.provideFunction_(\n 'text_random_letter',\n `\ndef ${generator.FUNCTION_NAME_PLACEHOLDER_}(text):\n x = int(random.random() * len(text))\n return text[x]\n`,\n );\n const code = functionName + '(' + text + ')';\n return [code, Order.FUNCTION_CALL];\n }\n }\n throw Error('Unhandled option (text_charAt).');\n}\n\nexport function text_getSubstring(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Get substring.\n const where1 = block.getFieldValue('WHERE1');\n const where2 = block.getFieldValue('WHERE2');\n const text = generator.valueToCode(block, 'STRING', Order.MEMBER) || \"''\";\n let at1;\n switch (where1) {\n case 'FROM_START':\n at1 = generator.getAdjustedInt(block, 'AT1');\n if (at1 === 0) {\n at1 = '';\n }\n break;\n case 'FROM_END':\n at1 = generator.getAdjustedInt(block, 'AT1', 1, true);\n break;\n case 'FIRST':\n at1 = '';\n break;\n default:\n throw Error('Unhandled option (text_getSubstring)');\n }\n\n let at2;\n switch (where2) {\n case 'FROM_START':\n at2 = generator.getAdjustedInt(block, 'AT2', 1);\n break;\n case 'FROM_END':\n at2 = generator.getAdjustedInt(block, 'AT2', 0, true);\n // Ensure that if the result calculated is 0 that sub-sequence will\n // include all elements as expected.\n if (!stringUtils.isNumber(String(at2))) {\n (generator as AnyDuringMigration).definitions_['import_sys'] =\n 'import sys';\n at2 += ' or sys.maxsize';\n } else if (at2 === 0) {\n at2 = '';\n }\n break;\n case 'LAST':\n at2 = '';\n break;\n default:\n throw Error('Unhandled option (text_getSubstring)');\n }\n const code = text + '[' + at1 + ' : ' + at2 + ']';\n return [code, Order.MEMBER];\n}\n\nexport function text_changeCase(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Change capitalization.\n const OPERATORS = {\n 'UPPERCASE': '.upper()',\n 'LOWERCASE': '.lower()',\n 'TITLECASE': '.title()',\n };\n type OperatorOption = keyof typeof OPERATORS;\n const operator = OPERATORS[block.getFieldValue('CASE') as OperatorOption];\n const text = generator.valueToCode(block, 'TEXT', Order.MEMBER) || \"''\";\n const code = text + operator;\n return [code, Order.FUNCTION_CALL];\n}\n\nexport function text_trim(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Trim spaces.\n const OPERATORS = {\n 'LEFT': '.lstrip()',\n 'RIGHT': '.rstrip()',\n 'BOTH': '.strip()',\n };\n type OperatorOption = keyof typeof OPERATORS;\n const operator = OPERATORS[block.getFieldValue('MODE') as OperatorOption];\n const text = generator.valueToCode(block, 'TEXT', Order.MEMBER) || \"''\";\n const code = text + operator;\n return [code, Order.FUNCTION_CALL];\n}\n\nexport function text_print(block: Block, generator: PythonGenerator) {\n // Print statement.\n const msg = generator.valueToCode(block, 'TEXT', Order.NONE) || \"''\";\n return 'print(' + msg + ')\\n';\n}\n\nexport function text_prompt_ext(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Prompt function.\n const functionName = generator.provideFunction_(\n 'text_prompt',\n `\ndef ${generator.FUNCTION_NAME_PLACEHOLDER_}(msg):\n try:\n return raw_input(msg)\n except NameError:\n return input(msg)\n`,\n );\n let msg;\n if (block.getField('TEXT')) {\n // Internal message.\n msg = generator.quote_(block.getFieldValue('TEXT'));\n } else {\n // External message.\n msg = generator.valueToCode(block, 'TEXT', Order.NONE) || \"''\";\n }\n let code = functionName + '(' + msg + ')';\n const toNumber = block.getFieldValue('TYPE') === 'NUMBER';\n if (toNumber) {\n code = 'float(' + code + ')';\n }\n return [code, Order.FUNCTION_CALL];\n}\n\nexport const text_prompt = text_prompt_ext;\n\nexport function text_count(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n const text = generator.valueToCode(block, 'TEXT', Order.MEMBER) || \"''\";\n const sub = generator.valueToCode(block, 'SUB', Order.NONE) || \"''\";\n const code = text + '.count(' + sub + ')';\n return [code, Order.FUNCTION_CALL];\n}\n\nexport function text_replace(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n const text = generator.valueToCode(block, 'TEXT', Order.MEMBER) || \"''\";\n const from = generator.valueToCode(block, 'FROM', Order.NONE) || \"''\";\n const to = generator.valueToCode(block, 'TO', Order.NONE) || \"''\";\n const code = text + '.replace(' + from + ', ' + to + ')';\n return [code, Order.MEMBER];\n}\n\nexport function text_reverse(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n const text = generator.valueToCode(block, 'TEXT', Order.MEMBER) || \"''\";\n const code = text + '[::-1]';\n return [code, Order.MEMBER];\n}\n","/**\n * @license\n * Copyright 2012 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @file Generating Python for variable blocks.\n */\n\n// Former goog.module ID: Blockly.Python.variables\n\nimport type {Block} from '../../core/block.js';\nimport type {PythonGenerator} from './python_generator.js';\nimport {Order} from './python_generator.js';\n\nexport function variables_get(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Variable getter.\n const code = generator.getVariableName(block.getFieldValue('VAR'));\n return [code, Order.ATOMIC];\n}\n\nexport function variables_set(block: Block, generator: PythonGenerator) {\n // Variable setter.\n const argument0 = generator.valueToCode(block, 'VALUE', Order.NONE) || '0';\n const varName = generator.getVariableName(block.getFieldValue('VAR'));\n return varName + ' = ' + argument0 + '\\n';\n}\n","/**\n * @license\n * Copyright 2012 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @file Python code generator class, including helper methods for\n * generating Python for blocks.\n */\n\n// Former goog.module ID: Blockly.Python\n\nimport type {Block} from '../../core/block.js';\nimport {CodeGenerator} from '../../core/generator.js';\nimport {inputTypes} from '../../core/inputs/input_types.js';\nimport {Names} from '../../core/names.js';\nimport * as stringUtils from '../../core/utils/string.js';\nimport * as Variables from '../../core/variables.js';\nimport type {Workspace} from '../../core/workspace.js';\n\n/**\n * Order of operation ENUMs.\n * http://docs.python.org/reference/expressions.html#summary\n */\n// prettier-ignore\nexport enum Order {\n ATOMIC = 0, // 0 \"\" ...\n COLLECTION = 1, // tuples, lists, dictionaries\n STRING_CONVERSION = 1, // `expression...`\n MEMBER = 2.1, // . []\n FUNCTION_CALL = 2.2, // ()\n EXPONENTIATION = 3, // **\n UNARY_SIGN = 4, // + -\n BITWISE_NOT = 4, // ~\n MULTIPLICATIVE = 5, // * / // %\n ADDITIVE = 6, // + -\n BITWISE_SHIFT = 7, // << >>\n BITWISE_AND = 8, // &\n BITWISE_XOR = 9, // ^\n BITWISE_OR = 10, // |\n RELATIONAL = 11, // in, not in, is, is not, >, >=, <>, !=, ==\n LOGICAL_NOT = 12, // not\n LOGICAL_AND = 13, // and\n LOGICAL_OR = 14, // or\n CONDITIONAL = 15, // if else\n LAMBDA = 16, // lambda\n NONE = 99, // (...)\n}\n\n/**\n * PythonScript code generator class.\n */\nexport class PythonGenerator extends CodeGenerator {\n /** List of outer-inner pairings that do NOT require parentheses. */\n ORDER_OVERRIDES: [Order, Order][] = [\n // (foo()).bar -> foo().bar\n // (foo())[0] -> foo()[0]\n [Order.FUNCTION_CALL, Order.MEMBER],\n // (foo())() -> foo()()\n [Order.FUNCTION_CALL, Order.FUNCTION_CALL],\n // (foo.bar).baz -> foo.bar.baz\n // (foo.bar)[0] -> foo.bar[0]\n // (foo[0]).bar -> foo[0].bar\n // (foo[0])[1] -> foo[0][1]\n [Order.MEMBER, Order.MEMBER],\n // (foo.bar)() -> foo.bar()\n // (foo[0])() -> foo[0]()\n [Order.MEMBER, Order.FUNCTION_CALL],\n\n // not (not foo) -> not not foo\n [Order.LOGICAL_NOT, Order.LOGICAL_NOT],\n // a and (b and c) -> a and b and c\n [Order.LOGICAL_AND, Order.LOGICAL_AND],\n // a or (b or c) -> a or b or c\n [Order.LOGICAL_OR, Order.LOGICAL_OR],\n ];\n\n /**\n * Empty loops or conditionals are not allowed in Python.\n */\n PASS: string = ''; // Initialised by init().\n\n /** @param name Name of the language the generator is for. */\n constructor(name = 'Python') {\n super(name);\n this.isInitialized = false;\n\n // Copy Order values onto instance for backwards compatibility\n // while ensuring they are not part of the publically-advertised\n // API.\n //\n // TODO(#7085): deprecate these in due course. (Could initially\n // replace data properties with get accessors that call\n // deprecate.warn().)\n for (const key in Order) {\n // Must assign Order[key] to a temporary to get the type guard to work;\n // see https://github.com/microsoft/TypeScript/issues/10530.\n const value = Order[key];\n // Skip reverse-lookup entries in the enum. Due to\n // https://github.com/microsoft/TypeScript/issues/55713 this (as\n // of TypeScript 5.5.2) actually narrows the type of value to\n // never - but that still allows the following assignment to\n // succeed.\n if (typeof value === 'string') continue;\n (this as unknown as Record)['ORDER_' + key] = value;\n }\n\n // List of illegal variable names. This is not intended to be a\n // security feature. Blockly is 100% client-side, so bypassing\n // this list is trivial. This is intended to prevent users from\n // accidentally clobbering a built-in object or function.\n this.addReservedWords(\n // import keyword\n // print(','.join(sorted(keyword.kwlist)))\n // https://docs.python.org/3/reference/lexical_analysis.html#keywords\n // https://docs.python.org/2/reference/lexical_analysis.html#keywords\n 'False,None,True,and,as,assert,break,class,continue,def,del,elif,else,' +\n 'except,exec,finally,for,from,global,if,import,in,is,lambda,nonlocal,' +\n 'not,or,pass,print,raise,return,try,while,with,yield,' +\n // https://docs.python.org/3/library/constants.html\n // https://docs.python.org/2/library/constants.html\n 'NotImplemented,Ellipsis,__debug__,quit,exit,copyright,license,credits,' +\n // >>> print(','.join(sorted(dir(__builtins__))))\n // https://docs.python.org/3/library/functions.html\n // https://docs.python.org/2/library/functions.html\n 'ArithmeticError,AssertionError,AttributeError,BaseException,' +\n 'BlockingIOError,BrokenPipeError,BufferError,BytesWarning,' +\n 'ChildProcessError,ConnectionAbortedError,ConnectionError,' +\n 'ConnectionRefusedError,ConnectionResetError,DeprecationWarning,' +\n 'EOFError,Ellipsis,EnvironmentError,Exception,FileExistsError,' +\n 'FileNotFoundError,FloatingPointError,FutureWarning,GeneratorExit,' +\n 'IOError,ImportError,ImportWarning,IndentationError,IndexError,' +\n 'InterruptedError,IsADirectoryError,KeyError,KeyboardInterrupt,' +\n 'LookupError,MemoryError,ModuleNotFoundError,NameError,' +\n 'NotADirectoryError,NotImplemented,NotImplementedError,OSError,' +\n 'OverflowError,PendingDeprecationWarning,PermissionError,' +\n 'ProcessLookupError,RecursionError,ReferenceError,ResourceWarning,' +\n 'RuntimeError,RuntimeWarning,StandardError,StopAsyncIteration,' +\n 'StopIteration,SyntaxError,SyntaxWarning,SystemError,SystemExit,' +\n 'TabError,TimeoutError,TypeError,UnboundLocalError,UnicodeDecodeError,' +\n 'UnicodeEncodeError,UnicodeError,UnicodeTranslateError,UnicodeWarning,' +\n 'UserWarning,ValueError,Warning,ZeroDivisionError,_,__build_class__,' +\n '__debug__,__doc__,__import__,__loader__,__name__,__package__,__spec__,' +\n 'abs,all,any,apply,ascii,basestring,bin,bool,buffer,bytearray,bytes,' +\n 'callable,chr,classmethod,cmp,coerce,compile,complex,copyright,credits,' +\n 'delattr,dict,dir,divmod,enumerate,eval,exec,execfile,exit,file,filter,' +\n 'float,format,frozenset,getattr,globals,hasattr,hash,help,hex,id,input,' +\n 'int,intern,isinstance,issubclass,iter,len,license,list,locals,long,' +\n 'map,max,memoryview,min,next,object,oct,open,ord,pow,print,property,' +\n 'quit,range,raw_input,reduce,reload,repr,reversed,round,set,setattr,' +\n 'slice,sorted,staticmethod,str,sum,super,tuple,type,unichr,unicode,' +\n 'vars,xrange,zip',\n );\n }\n\n /**\n * Initialise the database of variable names.\n *\n * @param workspace Workspace to generate code from.\n */\n init(workspace: Workspace) {\n super.init(workspace);\n\n this.PASS = this.INDENT + 'pass\\n';\n\n if (!this.nameDB_) {\n this.nameDB_ = new Names(this.RESERVED_WORDS_);\n } else {\n this.nameDB_.reset();\n }\n\n this.nameDB_.setVariableMap(workspace.getVariableMap());\n this.nameDB_.populateVariables(workspace);\n this.nameDB_.populateProcedures(workspace);\n\n const defvars = [];\n // Add developer variables (not created or named by the user).\n const devVarList = Variables.allDeveloperVariables(workspace);\n for (let i = 0; i < devVarList.length; i++) {\n defvars.push(\n this.nameDB_.getName(devVarList[i], Names.DEVELOPER_VARIABLE_TYPE) +\n ' = None',\n );\n }\n\n // Add user variables, but only ones that are being used.\n const variables = Variables.allUsedVarModels(workspace);\n for (let i = 0; i < variables.length; i++) {\n defvars.push(this.getVariableName(variables[i].getId()) + ' = None');\n }\n\n this.definitions_['variables'] = defvars.join('\\n');\n this.isInitialized = true;\n }\n\n /**\n * Prepend the generated code with import statements and variable definitions.\n *\n * @param code Generated code.\n * @returns Completed code.\n */\n finish(code: string): string {\n // Convert the definitions dictionary into a list.\n const imports = [];\n const definitions = [];\n for (let name in this.definitions_) {\n const def = this.definitions_[name];\n if (def.match(/^(from\\s+\\S+\\s+)?import\\s+\\S+/)) {\n imports.push(def);\n } else {\n definitions.push(def);\n }\n }\n // Call Blockly.CodeGenerator's finish.\n code = super.finish(code);\n this.isInitialized = false;\n\n this.nameDB_!.reset();\n const allDefs = imports.join('\\n') + '\\n\\n' + definitions.join('\\n\\n');\n return allDefs.replace(/\\n\\n+/g, '\\n\\n').replace(/\\n*$/, '\\n\\n\\n') + code;\n }\n\n /**\n * Naked values are top-level blocks with outputs that aren't plugged into\n * anything.\n *\n * @param line Line of generated code.\n * @returns Legal line of code.\n */\n scrubNakedValue(line: string): string {\n return line + '\\n';\n }\n\n /**\n * Encode a string as a properly escaped Python string, complete with quotes.\n *\n * @param string Text to encode.\n * @returns Python string.\n */\n quote_(string: string): string {\n string = string.replace(/\\\\/g, '\\\\\\\\').replace(/\\n/g, '\\\\\\n');\n\n // Follow the CPython behaviour of repr() for a non-byte string.\n let quote = \"'\";\n if (string.includes(\"'\")) {\n if (!string.includes('\"')) {\n quote = '\"';\n } else {\n string = string.replace(/'/g, \"\\\\'\");\n }\n }\n return quote + string + quote;\n }\n\n /**\n * Encode a string as a properly escaped multiline Python string, complete\n * with quotes.\n *\n * @param string Text to encode.\n * @returns Python string.\n */\n multiline_quote_(string: string): string {\n const lines = string.split(/\\n/g).map(this.quote_);\n // Join with the following, plus a newline:\n // + '\\n' +\n return lines.join(\" + '\\\\n' + \\n\");\n }\n\n /**\n * Common tasks for generating Python from blocks.\n * Handles comments for the specified block and any connected value blocks.\n * Calls any statements following this block.\n *\n * @param block The current block.\n * @param code The Python code created for this block.\n * @param thisOnly True to generate code for only this statement.\n * @returns Python code with comments and subsequent blocks added.\n */\n scrub_(block: Block, code: string, thisOnly = false): string {\n let commentCode = '';\n // Only collect comments for blocks that aren't inline.\n if (!block.outputConnection || !block.outputConnection.targetConnection) {\n // Collect comment for this block.\n let comment = block.getCommentText();\n if (comment) {\n comment = stringUtils.wrap(comment, this.COMMENT_WRAP - 3);\n commentCode += this.prefixLines(comment + '\\n', '# ');\n }\n // Collect comments for all value arguments.\n // Don't collect comments for nested statements.\n for (let i = 0; i < block.inputList.length; i++) {\n if (block.inputList[i].type === inputTypes.VALUE) {\n const childBlock = block.inputList[i].connection!.targetBlock();\n if (childBlock) {\n comment = this.allNestedComments(childBlock);\n if (comment) {\n commentCode += this.prefixLines(comment, '# ');\n }\n }\n }\n }\n }\n const nextBlock =\n block.nextConnection && block.nextConnection.targetBlock();\n const nextCode = thisOnly ? '' : this.blockToCode(nextBlock);\n return commentCode + code + nextCode;\n }\n\n /**\n * Gets a property and adjusts the value, taking into account indexing.\n * If a static int, casts to an integer, otherwise returns a code string.\n *\n * @param block The block.\n * @param atId The ID of the input block to get (and adjust) the value of.\n * @param delta Value to add.\n * @param negate Whether to negate the value.\n * @returns The adjusted value or code that evaluates to it.\n */\n getAdjustedInt(\n block: Block,\n atId: string,\n delta = 0,\n negate = false,\n ): string | number {\n if (block.workspace.options.oneBasedIndex) {\n delta--;\n }\n const defaultAtIndex = block.workspace.options.oneBasedIndex ? '1' : '0';\n const atOrder = delta ? Order.ADDITIVE : Order.NONE;\n let at: string | number =\n this.valueToCode(block, atId, atOrder) || defaultAtIndex;\n\n if (stringUtils.isNumber(at)) {\n // If the index is a naked number, adjust it right now.\n at = parseInt(at, 10) + delta;\n if (negate) {\n at = -at;\n }\n } else {\n // If the index is dynamic, adjust it in code.\n if (delta > 0) {\n at = 'int(' + at + ' + ' + delta + ')';\n } else if (delta < 0) {\n at = 'int(' + at + ' - ' + -delta + ')';\n } else {\n at = 'int(' + at + ')';\n }\n if (negate) {\n at = '-' + at;\n }\n }\n return at;\n }\n}\n","/**\n * @license\n * Copyright 2018 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @file Generating Python for dynamic variable blocks.\n */\n\n// Former goog.module ID: Blockly.Python.variablesDynamic\n\n// generator is dynamically typed.\nexport {\n variables_get as variables_get_dynamic,\n variables_set as variables_set_dynamic,\n} from './variables.js';\n","/**\n * @license\n * Copyright 2021 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @file Instantiate a PythonGenerator and populate it with the\n * complete set of block generator functions for Python. This is the\n * entrypoint for python_compressed.js.\n */\n\n// Former goog.module ID: Blockly.Python.all\n\nimport * as common from './python/common.js';\nimport * as lists from './python/lists.js';\nimport * as logic from './python/logic.js';\nimport * as loops from './python/loops.js';\nimport * as math from './python/math.js';\nimport * as procedures from './python/procedures.js';\nimport {PythonGenerator} from './python/python_generator.js';\nimport * as text from './python/text.js';\nimport * as variables from './python/variables.js';\nimport * as variablesDynamic from './python/variables_dynamic.js';\n\nexport * from './python/python_generator.js';\n\n/**\n * Python code generator instance.\n * @type {!PythonGenerator}\n */\nexport const pythonGenerator = new PythonGenerator();\n\n// Add reserved words. This list should include all words mentioned\n// in RESERVED WORDS: comments in the imports above.\npythonGenerator.addReservedWords('math,random,Number');\n\n// Install per-block-type generator functions:\n// Install per-block-type generator functions:\nconst generators: typeof pythonGenerator.forBlock = {\n ...common,\n ...lists,\n ...logic,\n ...loops,\n ...math,\n ...procedures,\n ...text,\n ...variables,\n ...variablesDynamic,\n};\nfor (const name in generators) {\n pythonGenerator.forBlock[name] = generators[name];\n}\n"]} \ No newline at end of file +{"version":3,"sources":["generators/python/common.ts","generators/python/lists.ts","generators/python/logic.ts","generators/python/loops.ts","generators/python/math.ts","generators/python/procedures.ts","generators/python/text.ts","generators/python/variables.ts","generators/python/python_generator.ts","generators/python/variables_dynamic.ts","generators/python.ts"],"names":["common_default","block","generator","type","lists_create_empty","Order","ATOMIC","lists_create_with","elements","Array","itemCount_","i","valueToCode","NONE","join","lists_repeat","item","times","MULTIPLICATIVE","lists_length","FUNCTION_CALL","lists_isEmpty","LOGICAL_NOT","lists_indexOf","list","errorIndex","firstIndexAdjustment","lastIndexAdjustment","workspace","options","oneBasedIndex","functionName","getFieldValue","provideFunction_","FUNCTION_NAME_PLACEHOLDER_","lists_getIndex","mode","where","listOrder","MEMBER","at","getAdjustedInt","definitions_","code","Error","lists_setIndex","value","match","listVar","nameDB_","getDistinctName","NameType","VARIABLE","xVar","lists_getSublist","where1","where2","at1","at2","isNumber","String","lists_sort","reverse","sortFunctionName","lists_split","value_input","value_delim","lists_reverse","controls_if","n","branchCode","conditionCode","STATEMENT_PREFIX","injectId","statementToCode","PASS","STATEMENT_SUFFIX","prefixLines","INDENT","getInput","logic_compare","operator","OPERATORS","order","RELATIONAL","argument0","argument1","logic_operation","LOGICAL_AND","LOGICAL_OR","defaultArgument","logic_negate","logic_boolean","logic_null","logic_ternary","value_if","CONDITIONAL","value_then","value_else","controls_repeat_ext","repeats","getField","parseInt","branch","addLoopTrap","loopVar","controls_whileUntil","until","controls_for","variable0","getVariableName","increment","defineUpRange","defineDownRange","Number","Math","abs","range","scrub","arg","suffix","varName","startVar","endVar","incVar","controls_forEach","controls_flow_statements","xfix","loop","getSurroundLoop","suppressPrefixSuffix","math_number","number","Infinity","UNARY_SIGN","math_arithmetic","tuple","ADDITIVE","EXPONENTIATION","math_single","math_constant","CONSTANTS","constant","math_number_property","PROPERTIES","dropdownProperty","inputOrder","outputOrder","numberToCheck","divisor","math_change","math_on_list","func","math_modulo","math_constrain","argument2","math_random_int","math_random_float","math_atan2","procedures_defreturn","globals","usedVariables","allUsedVarModels","variable","name","getVars","includes","push","devVarList","allDeveloperVariables","length","getName","DEVELOPER_VARIABLE","globalString","funcName","getProcedureName","xfix1","loopTrap","INFINITE_LOOP_TRAP","returnValue","xfix2","args","variables","scrub_","procedures_callreturn","procedures_callnoreturn","forBlock","procedures_ifreturn","hasReturnValue_","text","quote_","text_join","element","codeAndOrder","forceString","element0","element1","tempVar","text_append","text_length","text_isEmpty","text_indexOf","substring","text_charAt","textOrder","text_getSubstring","text_changeCase","text_trim","text_print","text_prompt_ext","msg","text_count","sub","text_replace","from","to","text_reverse","variables_get","variables_set","$jscomp$tmp$exports$module$name","COLLECTION","STRING_CONVERSION","BITWISE_NOT","BITWISE_SHIFT","BITWISE_AND","BITWISE_XOR","BITWISE_OR","LAMBDA","PythonGenerator","CodeGenerator","constructor","ORDER_OVERRIDES","isInitialized","key","addReservedWords","init","reset","Names","RESERVED_WORDS_","setVariableMap","getVariableMap","populateVariables","populateProcedures","defvars","DEVELOPER_VARIABLE_TYPE","getId","finish","imports","definitions","def","replace","scrubNakedValue","line","string","quote","multiline_quote_","split","map","lines","thisOnly","commentCode","outputConnection","targetConnection","comment","getCommentText","wrap","COMMENT_WRAP","inputList","inputTypes","VALUE","childBlock","connection","targetBlock","allNestedComments","nextBlock","nextConnection","nextCode","blockToCode","atId","delta","negate","defaultAtIndex","atOrder","controls_ifelse","controls_repeat","math_round","math_trig","procedures_defnoreturn","strRegExp","test","text_prompt","pythonGenerator","generators","common","lists","logic","loops","math","procedures","variablesDynamic"],"mappings":"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","file":"python_compressed.js","sourcesContent":["import type {Block} from '../../core/block.js';\nimport type {PythonGenerator} from './python_generator.js';\nimport {Order} from './python_generator.js';\n\nexport function common_default(\n block: Block,\n generator: PythonGenerator,\n): string {\n return `pass # 未知模块 ${block.type}`\n}\n","/**\n * @license\n * Copyright 2012 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @file Generating Python for list blocks.\n */\n\n// Former goog.module ID: Blockly.Python.lists\n\nimport type {CreateWithBlock} from '../../blocks/lists.js';\nimport type {Block} from '../../core/block.js';\nimport {NameType} from '../../core/names.js';\nimport * as stringUtils from '../../core/utils/string.js';\nimport type {PythonGenerator} from './python_generator.js';\nimport {Order} from './python_generator.js';\n\nexport function lists_create_empty(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Create an empty list.\n return ['[]', Order.ATOMIC];\n}\n\nexport function lists_create_with(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Create a list with any number of elements of any type.\n const createWithBlock = block as CreateWithBlock;\n const elements = new Array(createWithBlock.itemCount_);\n for (let i = 0; i < createWithBlock.itemCount_; i++) {\n elements[i] = generator.valueToCode(block, 'ADD' + i, Order.NONE) || 'None';\n }\n const code = '[' + elements.join(', ') + ']';\n return [code, Order.ATOMIC];\n}\n\nexport function lists_repeat(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Create a list with one element repeated.\n const item = generator.valueToCode(block, 'ITEM', Order.NONE) || 'None';\n const times =\n generator.valueToCode(block, 'NUM', Order.MULTIPLICATIVE) || '0';\n const code = '[' + item + '] * ' + times;\n return [code, Order.MULTIPLICATIVE];\n}\n\nexport function lists_length(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // String or array length.\n const list = generator.valueToCode(block, 'VALUE', Order.NONE) || '[]';\n return ['len(' + list + ')', Order.FUNCTION_CALL];\n}\n\nexport function lists_isEmpty(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Is the string null or array empty?\n const list = generator.valueToCode(block, 'VALUE', Order.NONE) || '[]';\n const code = 'not len(' + list + ')';\n return [code, Order.LOGICAL_NOT];\n}\n\nexport function lists_indexOf(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Find an item in the list.\n const item = generator.valueToCode(block, 'FIND', Order.NONE) || '[]';\n const list = generator.valueToCode(block, 'VALUE', Order.NONE) || \"''\";\n let errorIndex = ' -1';\n let firstIndexAdjustment = '';\n let lastIndexAdjustment = ' - 1';\n\n if (block.workspace.options.oneBasedIndex) {\n errorIndex = ' 0';\n firstIndexAdjustment = ' + 1';\n lastIndexAdjustment = '';\n }\n\n let functionName;\n if (block.getFieldValue('END') === 'FIRST') {\n functionName = generator.provideFunction_(\n 'first_index',\n `\ndef ${generator.FUNCTION_NAME_PLACEHOLDER_}(my_list, elem):\n try: index = my_list.index(elem)${firstIndexAdjustment}\n except: index =${errorIndex}\n return index\n`,\n );\n } else {\n functionName = generator.provideFunction_(\n 'last_index',\n `\ndef ${generator.FUNCTION_NAME_PLACEHOLDER_}(my_list, elem):\n try: index = len(my_list) - my_list[::-1].index(elem)${lastIndexAdjustment}\n except: index =${errorIndex}\n return index\n`,\n );\n }\n const code = functionName + '(' + list + ', ' + item + ')';\n return [code, Order.FUNCTION_CALL];\n}\n\nexport function lists_getIndex(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] | string {\n // Get element at index.\n // Note: Until January 2013 this block did not have MODE or WHERE inputs.\n const mode = block.getFieldValue('MODE') || 'GET';\n const where = block.getFieldValue('WHERE') || 'FROM_START';\n const listOrder = where === 'RANDOM' ? Order.NONE : Order.MEMBER;\n const list = generator.valueToCode(block, 'VALUE', listOrder) || '[]';\n\n switch (where) {\n case 'FIRST':\n if (mode === 'GET') {\n const code = list + '[0]';\n return [code, Order.MEMBER];\n } else if (mode === 'GET_REMOVE') {\n const code = list + '.pop(0)';\n return [code, Order.FUNCTION_CALL];\n } else if (mode === 'REMOVE') {\n return list + '.pop(0)\\n';\n }\n break;\n case 'LAST':\n if (mode === 'GET') {\n const code = list + '[-1]';\n return [code, Order.MEMBER];\n } else if (mode === 'GET_REMOVE') {\n const code = list + '.pop()';\n return [code, Order.FUNCTION_CALL];\n } else if (mode === 'REMOVE') {\n return list + '.pop()\\n';\n }\n break;\n case 'FROM_START': {\n const at = generator.getAdjustedInt(block, 'AT');\n if (mode === 'GET') {\n const code = list + '[' + at + ']';\n return [code, Order.MEMBER];\n } else if (mode === 'GET_REMOVE') {\n const code = list + '.pop(' + at + ')';\n return [code, Order.FUNCTION_CALL];\n } else if (mode === 'REMOVE') {\n return list + '.pop(' + at + ')\\n';\n }\n break;\n }\n case 'FROM_END': {\n const at = generator.getAdjustedInt(block, 'AT', 1, true);\n if (mode === 'GET') {\n const code = list + '[' + at + ']';\n return [code, Order.MEMBER];\n } else if (mode === 'GET_REMOVE') {\n const code = list + '.pop(' + at + ')';\n return [code, Order.FUNCTION_CALL];\n } else if (mode === 'REMOVE') {\n return list + '.pop(' + at + ')\\n';\n }\n break;\n }\n case 'RANDOM':\n (generator as AnyDuringMigration).definitions_['import_random'] =\n 'import random';\n if (mode === 'GET') {\n const code = 'random.choice(' + list + ')';\n return [code, Order.FUNCTION_CALL];\n } else {\n const functionName = generator.provideFunction_(\n 'lists_remove_random_item',\n `\ndef ${generator.FUNCTION_NAME_PLACEHOLDER_}(myList):\n x = int(random.random() * len(myList))\n return myList.pop(x)\n`,\n );\n const code = functionName + '(' + list + ')';\n if (mode === 'GET_REMOVE') {\n return [code, Order.FUNCTION_CALL];\n } else if (mode === 'REMOVE') {\n return code + '\\n';\n }\n }\n break;\n }\n throw Error('Unhandled combination (lists_getIndex).');\n}\n\nexport function lists_setIndex(block: Block, generator: PythonGenerator) {\n // Set element at index.\n // Note: Until February 2013 this block did not have MODE or WHERE inputs.\n let list = generator.valueToCode(block, 'LIST', Order.MEMBER) || '[]';\n const mode = block.getFieldValue('MODE') || 'GET';\n const where = block.getFieldValue('WHERE') || 'FROM_START';\n const value = generator.valueToCode(block, 'TO', Order.NONE) || 'None';\n // Cache non-trivial values to variables to prevent repeated look-ups.\n // Closure, which accesses and modifies 'list'.\n function cacheList() {\n if (list.match(/^\\w+$/)) {\n return '';\n }\n const listVar = generator.nameDB_!.getDistinctName(\n 'tmp_list',\n NameType.VARIABLE,\n );\n const code = listVar + ' = ' + list + '\\n';\n list = listVar;\n return code;\n }\n\n switch (where) {\n case 'FIRST':\n if (mode === 'SET') {\n return list + '[0] = ' + value + '\\n';\n } else if (mode === 'INSERT') {\n return list + '.insert(0, ' + value + ')\\n';\n }\n break;\n case 'LAST':\n if (mode === 'SET') {\n return list + '[-1] = ' + value + '\\n';\n } else if (mode === 'INSERT') {\n return list + '.append(' + value + ')\\n';\n }\n break;\n case 'FROM_START': {\n const at = generator.getAdjustedInt(block, 'AT');\n if (mode === 'SET') {\n return list + '[' + at + '] = ' + value + '\\n';\n } else if (mode === 'INSERT') {\n return list + '.insert(' + at + ', ' + value + ')\\n';\n }\n break;\n }\n case 'FROM_END': {\n const at = generator.getAdjustedInt(block, 'AT', 1, true);\n if (mode === 'SET') {\n return list + '[' + at + '] = ' + value + '\\n';\n } else if (mode === 'INSERT') {\n return list + '.insert(' + at + ', ' + value + ')\\n';\n }\n break;\n }\n case 'RANDOM': {\n (generator as AnyDuringMigration).definitions_['import_random'] =\n 'import random';\n let code = cacheList();\n const xVar = generator.nameDB_!.getDistinctName(\n 'tmp_x',\n NameType.VARIABLE,\n );\n code += xVar + ' = int(random.random() * len(' + list + '))\\n';\n if (mode === 'SET') {\n code += list + '[' + xVar + '] = ' + value + '\\n';\n return code;\n } else if (mode === 'INSERT') {\n code += list + '.insert(' + xVar + ', ' + value + ')\\n';\n return code;\n }\n break;\n }\n }\n throw Error('Unhandled combination (lists_setIndex).');\n}\n\nexport function lists_getSublist(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Get sublist.\n const list = generator.valueToCode(block, 'LIST', Order.MEMBER) || '[]';\n const where1 = block.getFieldValue('WHERE1');\n const where2 = block.getFieldValue('WHERE2');\n let at1;\n switch (where1) {\n case 'FROM_START':\n at1 = generator.getAdjustedInt(block, 'AT1');\n if (at1 === 0) {\n at1 = '';\n }\n break;\n case 'FROM_END':\n at1 = generator.getAdjustedInt(block, 'AT1', 1, true);\n break;\n case 'FIRST':\n at1 = '';\n break;\n default:\n throw Error('Unhandled option (lists_getSublist)');\n }\n\n let at2;\n switch (where2) {\n case 'FROM_START':\n at2 = generator.getAdjustedInt(block, 'AT2', 1);\n break;\n case 'FROM_END':\n at2 = generator.getAdjustedInt(block, 'AT2', 0, true);\n // Ensure that if the result calculated is 0 that sub-sequence will\n // include all elements as expected.\n if (!stringUtils.isNumber(String(at2))) {\n (generator as AnyDuringMigration).definitions_['import_sys'] =\n 'import sys';\n at2 += ' or sys.maxsize';\n } else if (at2 === 0) {\n at2 = '';\n }\n break;\n case 'LAST':\n at2 = '';\n break;\n default:\n throw Error('Unhandled option (lists_getSublist)');\n }\n const code = list + '[' + at1 + ' : ' + at2 + ']';\n return [code, Order.MEMBER];\n}\n\nexport function lists_sort(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Block for sorting a list.\n const list = generator.valueToCode(block, 'LIST', Order.NONE) || '[]';\n const type = block.getFieldValue('TYPE');\n const reverse = block.getFieldValue('DIRECTION') === '1' ? 'False' : 'True';\n const sortFunctionName = generator.provideFunction_(\n 'lists_sort',\n `\ndef ${generator.FUNCTION_NAME_PLACEHOLDER_}(my_list, type, reverse):\n def try_float(s):\n try:\n return float(s)\n except:\n return 0\n key_funcs = {\n \"NUMERIC\": try_float,\n \"TEXT\": str,\n \"IGNORE_CASE\": lambda s: str(s).lower()\n }\n key_func = key_funcs[type]\n list_cpy = list(my_list)\n return sorted(list_cpy, key=key_func, reverse=reverse)\n`,\n );\n\n const code =\n sortFunctionName + '(' + list + ', \"' + type + '\", ' + reverse + ')';\n return [code, Order.FUNCTION_CALL];\n}\n\nexport function lists_split(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Block for splitting text into a list, or joining a list into text.\n const mode = block.getFieldValue('MODE');\n let code;\n if (mode === 'SPLIT') {\n const value_input =\n generator.valueToCode(block, 'INPUT', Order.MEMBER) || \"''\";\n const value_delim = generator.valueToCode(block, 'DELIM', Order.NONE);\n code = value_input + '.split(' + value_delim + ')';\n } else if (mode === 'JOIN') {\n const value_input =\n generator.valueToCode(block, 'INPUT', Order.NONE) || '[]';\n const value_delim =\n generator.valueToCode(block, 'DELIM', Order.MEMBER) || \"''\";\n code = value_delim + '.join(' + value_input + ')';\n } else {\n throw Error('Unknown mode: ' + mode);\n }\n return [code, Order.FUNCTION_CALL];\n}\n\nexport function lists_reverse(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Block for reversing a list.\n const list = generator.valueToCode(block, 'LIST', Order.NONE) || '[]';\n const code = 'list(reversed(' + list + '))';\n return [code, Order.FUNCTION_CALL];\n}\n","/**\n * @license\n * Copyright 2012 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @file Generating Python for logic blocks.\n */\n\n// Former goog.module ID: Blockly.Python.logic\n\nimport type {Block} from '../../core/block.js';\nimport type {PythonGenerator} from './python_generator.js';\nimport {Order} from './python_generator.js';\n\nexport function controls_if(block: Block, generator: PythonGenerator) {\n // If/elseif/else condition.\n let n = 0;\n let code = '',\n branchCode,\n conditionCode;\n if (generator.STATEMENT_PREFIX) {\n // Automatic prefix insertion is switched off for this block. Add manually.\n code += generator.injectId(generator.STATEMENT_PREFIX, block);\n }\n do {\n conditionCode =\n generator.valueToCode(block, 'IF' + n, Order.NONE) || 'False';\n branchCode = generator.statementToCode(block, 'DO' + n) || generator.PASS;\n if (generator.STATEMENT_SUFFIX) {\n branchCode =\n generator.prefixLines(\n generator.injectId(generator.STATEMENT_SUFFIX, block),\n generator.INDENT,\n ) + branchCode;\n }\n code += (n === 0 ? 'if ' : 'elif ') + conditionCode + ':\\n' + branchCode;\n n++;\n } while (block.getInput('IF' + n));\n\n if (block.getInput('ELSE') || generator.STATEMENT_SUFFIX) {\n branchCode = generator.statementToCode(block, 'ELSE') || generator.PASS;\n if (generator.STATEMENT_SUFFIX) {\n branchCode =\n generator.prefixLines(\n generator.injectId(generator.STATEMENT_SUFFIX, block),\n generator.INDENT,\n ) + branchCode;\n }\n code += 'else:\\n' + branchCode;\n }\n return code;\n}\n\nexport const controls_ifelse = controls_if;\n\nexport function logic_compare(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Comparison operator.\n const OPERATORS = {\n 'EQ': '==',\n 'NEQ': '!=',\n 'LT': '<',\n 'LTE': '<=',\n 'GT': '>',\n 'GTE': '>=',\n };\n type OperatorOption = keyof typeof OPERATORS;\n const operator = OPERATORS[block.getFieldValue('OP') as OperatorOption];\n const order = Order.RELATIONAL;\n const argument0 = generator.valueToCode(block, 'A', order) || '0';\n const argument1 = generator.valueToCode(block, 'B', order) || '0';\n const code = argument0 + ' ' + operator + ' ' + argument1;\n return [code, order];\n}\n\nexport function logic_operation(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Operations 'and', 'or'.\n const operator = block.getFieldValue('OP') === 'AND' ? 'and' : 'or';\n const order = operator === 'and' ? Order.LOGICAL_AND : Order.LOGICAL_OR;\n let argument0 = generator.valueToCode(block, 'A', order);\n let argument1 = generator.valueToCode(block, 'B', order);\n if (!argument0 && !argument1) {\n // If there are no arguments, then the return value is false.\n argument0 = 'False';\n argument1 = 'False';\n } else {\n // Single missing arguments have no effect on the return value.\n const defaultArgument = operator === 'and' ? 'True' : 'False';\n if (!argument0) {\n argument0 = defaultArgument;\n }\n if (!argument1) {\n argument1 = defaultArgument;\n }\n }\n const code = argument0 + ' ' + operator + ' ' + argument1;\n return [code, order];\n}\n\nexport function logic_negate(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Negation.\n const argument0 =\n generator.valueToCode(block, 'BOOL', Order.LOGICAL_NOT) || 'True';\n const code = 'not ' + argument0;\n return [code, Order.LOGICAL_NOT];\n}\n\nexport function logic_boolean(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Boolean values true and false.\n const code = block.getFieldValue('BOOL') === 'TRUE' ? 'True' : 'False';\n return [code, Order.ATOMIC];\n}\n\nexport function logic_null(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Null data type.\n return ['None', Order.ATOMIC];\n}\n\nexport function logic_ternary(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Ternary operator.\n const value_if =\n generator.valueToCode(block, 'IF', Order.CONDITIONAL) || 'False';\n const value_then =\n generator.valueToCode(block, 'THEN', Order.CONDITIONAL) || 'None';\n const value_else =\n generator.valueToCode(block, 'ELSE', Order.CONDITIONAL) || 'None';\n const code = value_then + ' if ' + value_if + ' else ' + value_else;\n return [code, Order.CONDITIONAL];\n}\n","/**\n * @license\n * Copyright 2012 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @file Generating Python for loop blocks.\n */\n\n// Former goog.module ID: Blockly.Python.loops\n\nimport type {ControlFlowInLoopBlock} from '../../blocks/loops.js';\nimport type {Block} from '../../core/block.js';\nimport {NameType} from '../../core/names.js';\nimport * as stringUtils from '../../core/utils/string.js';\nimport type {PythonGenerator} from './python_generator.js';\nimport {Order} from './python_generator.js';\n\nexport function controls_repeat_ext(block: Block, generator: PythonGenerator) {\n // Repeat n times.\n let repeats;\n if (block.getField('TIMES')) {\n // Internal number.\n repeats = String(parseInt(block.getFieldValue('TIMES'), 10));\n } else {\n // External number.\n repeats = generator.valueToCode(block, 'TIMES', Order.NONE) || '0';\n }\n if (stringUtils.isNumber(repeats)) {\n repeats = parseInt(repeats, 10);\n } else {\n repeats = 'int(' + repeats + ')';\n }\n let branch = generator.statementToCode(block, 'DO');\n branch = generator.addLoopTrap(branch, block) || generator.PASS;\n const loopVar = generator.nameDB_!.getDistinctName(\n 'count',\n NameType.VARIABLE,\n );\n const code = 'for ' + loopVar + ' in range(' + repeats + '):\\n' + branch;\n return code;\n}\n\nexport const controls_repeat = controls_repeat_ext;\n\nexport function controls_whileUntil(block: Block, generator: PythonGenerator) {\n // Do while/until loop.\n const until = block.getFieldValue('MODE') === 'UNTIL';\n let argument0 =\n generator.valueToCode(\n block,\n 'BOOL',\n until ? Order.LOGICAL_NOT : Order.NONE,\n ) || 'False';\n let branch = generator.statementToCode(block, 'DO');\n branch = generator.addLoopTrap(branch, block) || generator.PASS;\n if (until) {\n argument0 = 'not ' + argument0;\n }\n return 'while ' + argument0 + ':\\n' + branch;\n}\n\nexport function controls_for(block: Block, generator: PythonGenerator) {\n // For loop.\n const variable0 = generator.getVariableName(block.getFieldValue('VAR'));\n let argument0: string | number =\n generator.valueToCode(block, 'FROM', Order.NONE) || '0';\n let argument1: string | number =\n generator.valueToCode(block, 'TO', Order.NONE) || '0';\n let increment: string | number =\n generator.valueToCode(block, 'BY', Order.NONE) || '1';\n let branch = generator.statementToCode(block, 'DO');\n branch = generator.addLoopTrap(branch, block) || generator.PASS;\n\n let code = '';\n let range;\n\n // Helper functions.\n const defineUpRange = function () {\n return 'module_run.upRange';\n// return generator.provideFunction_(\n// 'upRange',\n// `\n// def ${generator.FUNCTION_NAME_PLACEHOLDER_}(start, stop, step):\n// while start <= stop:\n// yield start\n// start += abs(step)\n// `,\n// );\n };\n const defineDownRange = function () {\n return 'module_run.downRange';\n// return generator.provideFunction_(\n// 'downRange',\n// `\n// def ${generator.FUNCTION_NAME_PLACEHOLDER_}(start, stop, step):\n// while start >= stop:\n// yield start\n// start -= abs(step)\n// `,\n// );\n };\n // Arguments are legal generator code (numbers or strings returned by scrub()).\n const generateUpDownRange = function (\n start: string,\n end: string,\n inc: string,\n ) {\n return (\n '(' +\n start +\n ' <= ' +\n end +\n ') and ' +\n defineUpRange() +\n '(' +\n start +\n ', ' +\n end +\n ', ' +\n inc +\n ') or ' +\n defineDownRange() +\n '(' +\n start +\n ', ' +\n end +\n ', ' +\n inc +\n ')'\n );\n };\n\n if (\n stringUtils.isNumber(argument0) &&\n stringUtils.isNumber(argument1) &&\n stringUtils.isNumber(increment)\n ) {\n // All parameters are simple numbers.\n argument0 = Number(argument0);\n argument1 = Number(argument1);\n increment = Math.abs(Number(increment));\n if (argument0 % 1 === 0 && argument1 % 1 === 0 && increment % 1 === 0) {\n // All parameters are integers.\n if (argument0 <= argument1) {\n // Count up.\n argument1++;\n if (argument0 === 0 && increment === 1) {\n // If starting index is 0, omit it.\n range = argument1;\n } else {\n range = argument0 + ', ' + argument1;\n }\n // If increment isn't 1, it must be explicit.\n if (increment !== 1) {\n range += ', ' + increment;\n }\n } else {\n // Count down.\n argument1--;\n range = argument0 + ', ' + argument1 + ', -' + increment;\n }\n range = 'range(' + range + ')';\n } else {\n // At least one of the parameters is not an integer.\n if (argument0 < argument1) {\n range = defineUpRange();\n } else {\n range = defineDownRange();\n }\n range += '(' + argument0 + ', ' + argument1 + ', ' + increment + ')';\n }\n } else {\n // Cache non-trivial values to variables to prevent repeated look-ups.\n const scrub = function (arg: string, suffix: string) {\n if (stringUtils.isNumber(arg)) {\n // Simple number.\n arg = String(Number(arg));\n } else if (!arg.match(/^\\w+$/)) {\n // Not a variable, it's complicated.\n const varName = generator.nameDB_!.getDistinctName(\n variable0 + suffix,\n NameType.VARIABLE,\n );\n code += varName + ' = ' + arg + '\\n';\n arg = varName;\n }\n return arg;\n };\n const startVar = scrub(argument0, '_start');\n const endVar = scrub(argument1, '_end');\n const incVar = scrub(increment, '_inc');\n\n if (typeof startVar === 'number' && typeof endVar === 'number') {\n if (startVar < endVar) {\n range = defineUpRange();\n } else {\n range = defineDownRange();\n }\n range += '(' + startVar + ', ' + endVar + ', ' + incVar + ')';\n } else {\n // We cannot determine direction statically.\n range = generateUpDownRange(startVar, endVar, incVar);\n }\n }\n code += 'for ' + variable0 + ' in ' + range + ':\\n' + branch;\n return code;\n}\n\nexport function controls_forEach(block: Block, generator: PythonGenerator) {\n // For each loop.\n const variable0 = generator.getVariableName(block.getFieldValue('VAR'));\n const argument0 =\n generator.valueToCode(block, 'LIST', Order.RELATIONAL) || '[]';\n let branch = generator.statementToCode(block, 'DO');\n branch = generator.addLoopTrap(branch, block) || generator.PASS;\n const code = 'for ' + variable0 + ' in ' + argument0 + ':\\n' + branch;\n return code;\n}\n\nexport function controls_flow_statements(\n block: Block,\n generator: PythonGenerator,\n) {\n // Flow statements: continue, break.\n let xfix = '';\n if (generator.STATEMENT_PREFIX) {\n // Automatic prefix insertion is switched off for this block. Add manually.\n xfix += generator.injectId(generator.STATEMENT_PREFIX, block);\n }\n if (generator.STATEMENT_SUFFIX) {\n // Inject any statement suffix here since the regular one at the end\n // will not get executed if the break/continue is triggered.\n xfix += generator.injectId(generator.STATEMENT_SUFFIX, block);\n }\n if (generator.STATEMENT_PREFIX) {\n const loop = (block as ControlFlowInLoopBlock).getSurroundLoop();\n if (loop && !loop.suppressPrefixSuffix) {\n // Inject loop's statement prefix here since the regular one at the end\n // of the loop will not get executed if 'continue' is triggered.\n // In the case of 'break', a prefix is needed due to the loop's suffix.\n xfix += generator.injectId(generator.STATEMENT_PREFIX, loop);\n }\n }\n switch (block.getFieldValue('FLOW')) {\n case 'BREAK':\n return xfix + 'break\\n';\n case 'CONTINUE':\n return xfix + 'continue\\n';\n }\n throw Error('Unknown flow statement.');\n}\n","/**\n * @license\n * Copyright 2012 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @file Generating Python for math blocks.\n */\n\n// Former goog.module ID: Blockly.Python.math\n\nimport type {Block} from '../../core/block.js';\nimport type {PythonGenerator} from './python_generator.js';\nimport {Order} from './python_generator.js';\n\n// If any new block imports any library, add that library name here.\n// RESERVED WORDS: 'math,random,Number'\n\nexport function math_number(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Numeric value.\n let number = Number(block.getFieldValue('NUM'));\n if (number === Infinity) {\n return ['float(\"inf\")', Order.FUNCTION_CALL];\n } else if (number === -Infinity) {\n return ['-float(\"inf\")', Order.UNARY_SIGN];\n } else {\n return [String(number), number < 0 ? Order.UNARY_SIGN : Order.ATOMIC];\n }\n}\n\nexport function math_arithmetic(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Basic arithmetic operators, and power.\n const OPERATORS: Record = {\n 'ADD': [' + ', Order.ADDITIVE],\n 'MINUS': [' - ', Order.ADDITIVE],\n 'MULTIPLY': [' * ', Order.MULTIPLICATIVE],\n 'DIVIDE': [' / ', Order.MULTIPLICATIVE],\n 'POWER': [' ** ', Order.EXPONENTIATION],\n };\n type OperatorOption = keyof typeof OPERATORS;\n const tuple = OPERATORS[block.getFieldValue('OP') as OperatorOption];\n const operator = tuple[0];\n const order = tuple[1];\n const argument0 = generator.valueToCode(block, 'A', order) || '0';\n const argument1 = generator.valueToCode(block, 'B', order) || '0';\n const code = argument0 + operator + argument1;\n return [code, order];\n // In case of 'DIVIDE', division between integers returns different results\n // in generator 2 and 3. However, is not an issue since Blockly does not\n // guarantee identical results in all languages. To do otherwise would\n // require every operator to be wrapped in a function call. This would kill\n // legibility of the generated code.\n}\n\nexport function math_single(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Math operators with single operand.\n const operator = block.getFieldValue('OP');\n let code;\n let arg;\n if (operator === 'NEG') {\n // Negation is a special case given its different operator precedence.\n code = generator.valueToCode(block, 'NUM', Order.UNARY_SIGN) || '0';\n return ['-' + code, Order.UNARY_SIGN];\n }\n // TODO(#7600): find better approach than casting to any to override\n // CodeGenerator declaring .definitions protected (here and below).\n (generator as AnyDuringMigration).definitions_['import_math'] = 'import math';\n if (operator === 'SIN' || operator === 'COS' || operator === 'TAN') {\n arg = generator.valueToCode(block, 'NUM', Order.MULTIPLICATIVE) || '0';\n } else {\n arg = generator.valueToCode(block, 'NUM', Order.NONE) || '0';\n }\n // First, handle cases which generate values that don't need parentheses\n // wrapping the code.\n switch (operator) {\n case 'ABS':\n code = 'math.fabs(' + arg + ')';\n break;\n case 'ROOT':\n code = 'math.sqrt(' + arg + ')';\n break;\n case 'LN':\n code = 'math.log(' + arg + ')';\n break;\n case 'LOG10':\n code = 'math.log10(' + arg + ')';\n break;\n case 'EXP':\n code = 'math.exp(' + arg + ')';\n break;\n case 'POW10':\n code = 'math.pow(10,' + arg + ')';\n break;\n case 'ROUND':\n code = 'round(' + arg + ')';\n break;\n case 'ROUNDUP':\n code = 'math.ceil(' + arg + ')';\n break;\n case 'ROUNDDOWN':\n code = 'math.floor(' + arg + ')';\n break;\n case 'SIN':\n code = 'math.sin(' + arg + ' / 180.0 * math.pi)';\n break;\n case 'COS':\n code = 'math.cos(' + arg + ' / 180.0 * math.pi)';\n break;\n case 'TAN':\n code = 'math.tan(' + arg + ' / 180.0 * math.pi)';\n break;\n }\n if (code) {\n return [code, Order.FUNCTION_CALL];\n }\n // Second, handle cases which generate values that may need parentheses\n // wrapping the code.\n switch (operator) {\n case 'ASIN':\n code = 'math.asin(' + arg + ') / math.pi * 180';\n break;\n case 'ACOS':\n code = 'math.acos(' + arg + ') / math.pi * 180';\n break;\n case 'ATAN':\n code = 'math.atan(' + arg + ') / math.pi * 180';\n break;\n default:\n throw Error('Unknown math operator: ' + operator);\n }\n return [code, Order.MULTIPLICATIVE];\n}\n\nexport function math_constant(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Constants: PI, E, the Golden Ratio, sqrt(2), 1/sqrt(2), INFINITY.\n const CONSTANTS: Record = {\n 'PI': ['math.pi', Order.MEMBER],\n 'E': ['math.e', Order.MEMBER],\n 'GOLDEN_RATIO': ['(1 + math.sqrt(5)) / 2', Order.MULTIPLICATIVE],\n 'SQRT2': ['math.sqrt(2)', Order.MEMBER],\n 'SQRT1_2': ['math.sqrt(1.0 / 2)', Order.MEMBER],\n 'INFINITY': [\"float('inf')\", Order.ATOMIC],\n };\n type ConstantOption = keyof typeof CONSTANTS;\n const constant = block.getFieldValue('CONSTANT') as ConstantOption;\n if (constant !== 'INFINITY') {\n (generator as AnyDuringMigration).definitions_['import_math'] =\n 'import math';\n }\n return CONSTANTS[constant];\n}\n\nexport function math_number_property(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Check if a number is even, odd, prime, whole, positive, or negative\n // or if it is divisible by certain number. Returns true or false.\n const PROPERTIES: Record = {\n 'EVEN': [' % 2 == 0', Order.MULTIPLICATIVE, Order.RELATIONAL],\n 'ODD': [' % 2 == 1', Order.MULTIPLICATIVE, Order.RELATIONAL],\n 'WHOLE': [' % 1 == 0', Order.MULTIPLICATIVE, Order.RELATIONAL],\n 'POSITIVE': [' > 0', Order.RELATIONAL, Order.RELATIONAL],\n 'NEGATIVE': [' < 0', Order.RELATIONAL, Order.RELATIONAL],\n 'DIVISIBLE_BY': [null, Order.MULTIPLICATIVE, Order.RELATIONAL],\n 'PRIME': [null, Order.NONE, Order.FUNCTION_CALL],\n };\n type PropertyOption = keyof typeof PROPERTIES;\n const dropdownProperty = block.getFieldValue('PROPERTY') as PropertyOption;\n const [suffix, inputOrder, outputOrder] = PROPERTIES[dropdownProperty];\n const numberToCheck =\n generator.valueToCode(block, 'NUMBER_TO_CHECK', inputOrder) || '0';\n let code;\n if (dropdownProperty === 'PRIME') {\n // Prime is a special case as it is not a one-liner test.\n (generator as AnyDuringMigration).definitions_['import_math'] =\n 'import math';\n (generator as AnyDuringMigration).definitions_[\n 'from_numbers_import_Number'\n ] = 'from numbers import Number';\n const functionName = generator.provideFunction_(\n 'math_isPrime',\n `\ndef ${generator.FUNCTION_NAME_PLACEHOLDER_}(n):\n # https://en.wikipedia.org/wiki/Primality_test#Naive_methods\n # If n is not a number but a string, try parsing it.\n if not isinstance(n, Number):\n try:\n n = float(n)\n except:\n return False\n if n == 2 or n == 3:\n return True\n # False if n is negative, is 1, or not whole, or if n is divisible by 2 or 3.\n if n <= 1 or n % 1 != 0 or n % 2 == 0 or n % 3 == 0:\n return False\n # Check all the numbers of form 6k +/- 1, up to sqrt(n).\n for x in range(6, int(math.sqrt(n)) + 2, 6):\n if n % (x - 1) == 0 or n % (x + 1) == 0:\n return False\n return True\n`,\n );\n code = functionName + '(' + numberToCheck + ')';\n } else if (dropdownProperty === 'DIVISIBLE_BY') {\n const divisor =\n generator.valueToCode(block, 'DIVISOR', Order.MULTIPLICATIVE) || '0';\n // If 'divisor' is some code that evals to 0, generator will raise an error.\n if (divisor === '0') {\n return ['False', Order.ATOMIC];\n }\n code = numberToCheck + ' % ' + divisor + ' == 0';\n } else {\n code = numberToCheck + suffix;\n }\n return [code, outputOrder];\n}\n\nexport function math_change(block: Block, generator: PythonGenerator) {\n // Add to a variable in place.\n (generator as AnyDuringMigration).definitions_['from_numbers_import_Number'] =\n 'from numbers import Number';\n const argument0 =\n generator.valueToCode(block, 'DELTA', Order.ADDITIVE) || '0';\n const varName = generator.getVariableName(block.getFieldValue('VAR'));\n return (\n varName +\n ' = (' +\n varName +\n ' if isinstance(' +\n varName +\n ', Number) else 0) + ' +\n argument0 +\n '\\n'\n );\n}\n\n// Rounding functions have a single operand.\nexport const math_round = math_single;\n// Trigonometry functions have a single operand.\nexport const math_trig = math_single;\n\nexport function math_on_list(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Math functions for lists.\n const func = block.getFieldValue('OP');\n const list = generator.valueToCode(block, 'LIST', Order.NONE) || '[]';\n let code;\n switch (func) {\n case 'SUM':\n code = 'sum(' + list + ')';\n break;\n case 'MIN':\n code = 'min(' + list + ')';\n break;\n case 'MAX':\n code = 'max(' + list + ')';\n break;\n case 'AVERAGE': {\n (generator as AnyDuringMigration).definitions_[\n 'from_numbers_import_Number'\n ] = 'from numbers import Number';\n // This operation excludes null and values that aren't int or float:\n // math_mean([null, null, \"aString\", 1, 9]) -> 5.0\n const functionName = generator.provideFunction_(\n 'math_mean',\n `\ndef ${generator.FUNCTION_NAME_PLACEHOLDER_}(myList):\n localList = [e for e in myList if isinstance(e, Number)]\n if not localList: return\n return float(sum(localList)) / len(localList)\n`,\n );\n code = functionName + '(' + list + ')';\n break;\n }\n case 'MEDIAN': {\n (generator as AnyDuringMigration).definitions_[\n 'from_numbers_import_Number'\n ] = 'from numbers import Number';\n // This operation excludes null values:\n // math_median([null, null, 1, 3]) -> 2.0\n const functionName = generator.provideFunction_(\n 'math_median',\n `\ndef ${generator.FUNCTION_NAME_PLACEHOLDER_}(myList):\n localList = sorted([e for e in myList if isinstance(e, Number)])\n if not localList: return\n if len(localList) % 2 == 0:\n return (localList[len(localList) // 2 - 1] + localList[len(localList) // 2]) / 2.0\n else:\n return localList[(len(localList) - 1) // 2]\n`,\n );\n code = functionName + '(' + list + ')';\n break;\n }\n case 'MODE': {\n // As a list of numbers can contain more than one mode,\n // the returned result is provided as an array.\n // Mode of [3, 'x', 'x', 1, 1, 2, '3'] -> ['x', 1]\n const functionName = generator.provideFunction_(\n 'math_modes',\n `\ndef ${generator.FUNCTION_NAME_PLACEHOLDER_}(some_list):\n modes = []\n # Using a lists of [item, count] to keep count rather than dict\n # to avoid \"unhashable\" errors when the counted item is itself a list or dict.\n counts = []\n maxCount = 1\n for item in some_list:\n found = False\n for count in counts:\n if count[0] == item:\n count[1] += 1\n maxCount = max(maxCount, count[1])\n found = True\n if not found:\n counts.append([item, 1])\n for counted_item, item_count in counts:\n if item_count == maxCount:\n modes.append(counted_item)\n return modes\n`,\n );\n code = functionName + '(' + list + ')';\n break;\n }\n case 'STD_DEV': {\n (generator as AnyDuringMigration).definitions_['import_math'] =\n 'import math';\n const functionName = generator.provideFunction_(\n 'math_standard_deviation',\n `\ndef ${generator.FUNCTION_NAME_PLACEHOLDER_}(numbers):\n n = len(numbers)\n if n == 0: return\n mean = float(sum(numbers)) / n\n variance = sum((x - mean) ** 2 for x in numbers) / n\n return math.sqrt(variance)\n`,\n );\n code = functionName + '(' + list + ')';\n break;\n }\n case 'RANDOM':\n (generator as AnyDuringMigration).definitions_['import_random'] =\n 'import random';\n code = 'random.choice(' + list + ')';\n break;\n default:\n throw Error('Unknown operator: ' + func);\n }\n return [code, Order.FUNCTION_CALL];\n}\n\nexport function math_modulo(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Remainder computation.\n const argument0 =\n generator.valueToCode(block, 'DIVIDEND', Order.MULTIPLICATIVE) || '0';\n const argument1 =\n generator.valueToCode(block, 'DIVISOR', Order.MULTIPLICATIVE) || '0';\n const code = argument0 + ' % ' + argument1;\n return [code, Order.MULTIPLICATIVE];\n}\n\nexport function math_constrain(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Constrain a number between two limits.\n const argument0 = generator.valueToCode(block, 'VALUE', Order.NONE) || '0';\n const argument1 = generator.valueToCode(block, 'LOW', Order.NONE) || '0';\n const argument2 =\n generator.valueToCode(block, 'HIGH', Order.NONE) || \"float('inf')\";\n const code =\n 'min(max(' + argument0 + ', ' + argument1 + '), ' + argument2 + ')';\n return [code, Order.FUNCTION_CALL];\n}\n\nexport function math_random_int(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Random integer between [X] and [Y].\n (generator as AnyDuringMigration).definitions_['import_random'] =\n 'import random';\n const argument0 = generator.valueToCode(block, 'FROM', Order.NONE) || '0';\n const argument1 = generator.valueToCode(block, 'TO', Order.NONE) || '0';\n const code = 'random.randint(' + argument0 + ', ' + argument1 + ')';\n return [code, Order.FUNCTION_CALL];\n}\n\nexport function math_random_float(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Random fraction between 0 and 1.\n (generator as AnyDuringMigration).definitions_['import_random'] =\n 'import random';\n return ['random.random()', Order.FUNCTION_CALL];\n}\n\nexport function math_atan2(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Arctangent of point (X, Y) in degrees from -180 to 180.\n (generator as AnyDuringMigration).definitions_['import_math'] = 'import math';\n const argument0 = generator.valueToCode(block, 'X', Order.NONE) || '0';\n const argument1 = generator.valueToCode(block, 'Y', Order.NONE) || '0';\n return [\n 'math.atan2(' + argument1 + ', ' + argument0 + ') / math.pi * 180',\n Order.MULTIPLICATIVE,\n ];\n}\n","/**\n * @license\n * Copyright 2012 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @file Generating Python for procedure blocks.\n */\n\n// Former goog.module ID: Blockly.Python.procedures\n\nimport type {IfReturnBlock} from '../../blocks/procedures.js';\nimport type {Block} from '../../core/block.js';\nimport {NameType} from '../../core/names.js';\nimport * as Variables from '../../core/variables.js';\nimport type {PythonGenerator} from './python_generator.js';\nimport {Order} from './python_generator.js';\n\nexport function procedures_defreturn(block: Block, generator: PythonGenerator) {\n // Define a procedure with a return value.\n // First, add a 'global' statement for every variable that is not shadowed by\n // a local parameter.\n const globals = [];\n const workspace = block.workspace;\n const usedVariables = Variables.allUsedVarModels(workspace) || [];\n for (const variable of usedVariables) {\n const varName = variable.name;\n // getVars returns parameter names, not ids, for procedure blocks\n if (!block.getVars().includes(varName)) {\n globals.push(generator.getVariableName(varName));\n }\n }\n // Add developer variables.\n const devVarList = Variables.allDeveloperVariables(workspace);\n for (let i = 0; i < devVarList.length; i++) {\n globals.push(\n generator.nameDB_!.getName(devVarList[i], NameType.DEVELOPER_VARIABLE),\n );\n }\n\n const globalString = globals.length\n ? generator.INDENT + 'global ' + globals.join(', ') + '\\n'\n : '';\n const funcName = generator.getProcedureName(block.getFieldValue('NAME'));\n let xfix1 = '';\n if (generator.STATEMENT_PREFIX) {\n xfix1 += generator.injectId(generator.STATEMENT_PREFIX, block);\n }\n if (generator.STATEMENT_SUFFIX) {\n xfix1 += generator.injectId(generator.STATEMENT_SUFFIX, block);\n }\n if (xfix1) {\n xfix1 = generator.prefixLines(xfix1, generator.INDENT);\n }\n let loopTrap = '';\n if (generator.INFINITE_LOOP_TRAP) {\n loopTrap = generator.prefixLines(\n generator.injectId(generator.INFINITE_LOOP_TRAP, block),\n generator.INDENT,\n );\n }\n let branch = '';\n if (block.getInput('STACK')) {\n // The 'procedures_defreturn' block might not have a STACK input.\n branch = generator.statementToCode(block, 'STACK');\n }\n let returnValue = '';\n if (block.getInput('RETURN')) {\n // The 'procedures_defnoreturn' block (which shares this code)\n // does not have a RETURN input.\n returnValue = generator.valueToCode(block, 'RETURN', Order.NONE) || '';\n }\n let xfix2 = '';\n if (branch && returnValue) {\n // After executing the function body, revisit this block for the return.\n xfix2 = xfix1;\n }\n if (returnValue) {\n returnValue = generator.INDENT + 'return ' + returnValue + '\\n';\n } else if (!branch) {\n branch = generator.PASS;\n }\n const args = [];\n const variables = block.getVars();\n for (let i = 0; i < variables.length; i++) {\n args[i] = generator.getVariableName(variables[i]);\n }\n let code =\n 'def ' +\n funcName +\n '(' +\n args.join(', ') +\n '):\\n' +\n globalString +\n xfix1 +\n loopTrap +\n branch +\n xfix2 +\n returnValue;\n code = generator.scrub_(block, code);\n // Add % so as not to collide with helper functions in definitions list.\n // TODO(#7600): find better approach than casting to any to override\n // CodeGenerator declaring .definitions protected.\n (generator as AnyDuringMigration).definitions_['%' + funcName] = code;\n return null;\n}\n\n// Defining a procedure without a return value uses the same generator as\n// a procedure with a return value.\nexport const procedures_defnoreturn = procedures_defreturn;\n\nexport function procedures_callreturn(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Call a procedure with a return value.\n const funcName = generator.getProcedureName(block.getFieldValue('NAME'));\n const args = [];\n const variables = block.getVars();\n for (let i = 0; i < variables.length; i++) {\n args[i] = generator.valueToCode(block, 'ARG' + i, Order.NONE) || 'None';\n }\n const code = funcName + '(' + args.join(', ') + ')';\n return [code, Order.FUNCTION_CALL];\n}\n\nexport function procedures_callnoreturn(\n block: Block,\n generator: PythonGenerator,\n) {\n // Call a procedure with no return value.\n // Generated code is for a function call as a statement is the same as a\n // function call as a value, with the addition of line ending.\n const tuple = generator.forBlock['procedures_callreturn'](block, generator)!;\n return tuple[0] + '\\n';\n}\n\nexport function procedures_ifreturn(block: Block, generator: PythonGenerator) {\n // Conditionally return value from a procedure.\n const condition =\n generator.valueToCode(block, 'CONDITION', Order.NONE) || 'False';\n let code = 'if ' + condition + ':\\n';\n if (generator.STATEMENT_SUFFIX) {\n // Inject any statement suffix here since the regular one at the end\n // will not get executed if the return is triggered.\n code += generator.prefixLines(\n generator.injectId(generator.STATEMENT_SUFFIX, block),\n generator.INDENT,\n );\n }\n if ((block as IfReturnBlock).hasReturnValue_) {\n const value = generator.valueToCode(block, 'VALUE', Order.NONE) || 'None';\n code += generator.INDENT + 'return ' + value + '\\n';\n } else {\n code += generator.INDENT + 'return\\n';\n }\n return code;\n}\n","/**\n * @license\n * Copyright 2012 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @file Generating Python for text blocks.\n */\n\n// Former goog.module ID: Blockly.Python.texts\n\nimport type {JoinMutatorBlock} from '../../blocks/text.js';\nimport type {Block} from '../../core/block.js';\nimport {NameType} from '../../core/names.js';\nimport * as stringUtils from '../../core/utils/string.js';\nimport type {PythonGenerator} from './python_generator.js';\nimport {Order} from './python_generator.js';\n\nexport function text(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Text value.\n const code = generator.quote_(block.getFieldValue('TEXT'));\n return [code, Order.ATOMIC];\n}\n\n/**\n * Regular expression to detect a single-quoted string literal.\n */\nconst strRegExp = /^\\s*'([^']|\\\\')*'\\s*$/;\n\n/**\n * Enclose the provided value in 'str(...)' function.\n * Leave string literals alone.\n *\n * @param value Code evaluating to a value.\n * @returns Array containing code evaluating to a string\n * and\n * the order of the returned code.[string, number]\n */\nconst forceString = function (value: string): [string, Order] {\n if (strRegExp.test(value)) {\n return [value, Order.ATOMIC];\n }\n return ['str(' + value + ')', Order.FUNCTION_CALL];\n};\n\nexport function text_join(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Create a string made up of any number of elements of any type.\n // Should we allow joining by '-' or ',' or any other characters?\n const joinBlock = block as JoinMutatorBlock;\n switch (joinBlock.itemCount_) {\n case 0:\n return [\"''\", Order.ATOMIC];\n case 1: {\n const element = generator.valueToCode(block, 'ADD0', Order.NONE) || \"''\";\n const codeAndOrder = forceString(element);\n return codeAndOrder;\n }\n case 2: {\n const element0 = generator.valueToCode(block, 'ADD0', Order.NONE) || \"''\";\n const element1 = generator.valueToCode(block, 'ADD1', Order.NONE) || \"''\";\n const code = forceString(element0)[0] + ' + ' + forceString(element1)[0];\n return [code, Order.ADDITIVE];\n }\n default: {\n const elements = [];\n for (let i = 0; i < joinBlock.itemCount_; i++) {\n elements[i] =\n generator.valueToCode(block, 'ADD' + i, Order.NONE) || \"''\";\n }\n const tempVar = generator.nameDB_!.getDistinctName(\n 'x',\n NameType.VARIABLE,\n );\n const code =\n \"''.join([str(\" +\n tempVar +\n ') for ' +\n tempVar +\n ' in [' +\n elements.join(', ') +\n ']])';\n return [code, Order.FUNCTION_CALL];\n }\n }\n}\n\nexport function text_append(block: Block, generator: PythonGenerator) {\n // Append to a variable in place.\n const varName = generator.getVariableName(block.getFieldValue('VAR'));\n const value = generator.valueToCode(block, 'TEXT', Order.NONE) || \"''\";\n return varName + ' = str(' + varName + ') + ' + forceString(value)[0] + '\\n';\n}\n\nexport function text_length(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Is the string null or array empty?\n const text = generator.valueToCode(block, 'VALUE', Order.NONE) || \"''\";\n return ['len(' + text + ')', Order.FUNCTION_CALL];\n}\n\nexport function text_isEmpty(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Is the string null or array empty?\n const text = generator.valueToCode(block, 'VALUE', Order.NONE) || \"''\";\n const code = 'not len(' + text + ')';\n return [code, Order.LOGICAL_NOT];\n}\n\nexport function text_indexOf(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Search the text for a substring.\n // Should we allow for non-case sensitive???\n const operator = block.getFieldValue('END') === 'FIRST' ? 'find' : 'rfind';\n const substring = generator.valueToCode(block, 'FIND', Order.NONE) || \"''\";\n const text = generator.valueToCode(block, 'VALUE', Order.MEMBER) || \"''\";\n const code = text + '.' + operator + '(' + substring + ')';\n if (block.workspace.options.oneBasedIndex) {\n return [code + ' + 1', Order.ADDITIVE];\n }\n return [code, Order.FUNCTION_CALL];\n}\n\nexport function text_charAt(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Get letter at index.\n // Note: Until January 2013 this block did not have the WHERE input.\n const where = block.getFieldValue('WHERE') || 'FROM_START';\n const textOrder = where === 'RANDOM' ? Order.NONE : Order.MEMBER;\n const text = generator.valueToCode(block, 'VALUE', textOrder) || \"''\";\n switch (where) {\n case 'FIRST': {\n const code = text + '[0]';\n return [code, Order.MEMBER];\n }\n case 'LAST': {\n const code = text + '[-1]';\n return [code, Order.MEMBER];\n }\n case 'FROM_START': {\n const at = generator.getAdjustedInt(block, 'AT');\n const code = text + '[' + at + ']';\n return [code, Order.MEMBER];\n }\n case 'FROM_END': {\n const at = generator.getAdjustedInt(block, 'AT', 1, true);\n const code = text + '[' + at + ']';\n return [code, Order.MEMBER];\n }\n case 'RANDOM': {\n // TODO(#7600): find better approach than casting to any to override\n // CodeGenerator declaring .definitions protected (here and below).\n (generator as AnyDuringMigration).definitions_['import_random'] =\n 'import random';\n const functionName = generator.provideFunction_(\n 'text_random_letter',\n `\ndef ${generator.FUNCTION_NAME_PLACEHOLDER_}(text):\n x = int(random.random() * len(text))\n return text[x]\n`,\n );\n const code = functionName + '(' + text + ')';\n return [code, Order.FUNCTION_CALL];\n }\n }\n throw Error('Unhandled option (text_charAt).');\n}\n\nexport function text_getSubstring(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Get substring.\n const where1 = block.getFieldValue('WHERE1');\n const where2 = block.getFieldValue('WHERE2');\n const text = generator.valueToCode(block, 'STRING', Order.MEMBER) || \"''\";\n let at1;\n switch (where1) {\n case 'FROM_START':\n at1 = generator.getAdjustedInt(block, 'AT1');\n if (at1 === 0) {\n at1 = '';\n }\n break;\n case 'FROM_END':\n at1 = generator.getAdjustedInt(block, 'AT1', 1, true);\n break;\n case 'FIRST':\n at1 = '';\n break;\n default:\n throw Error('Unhandled option (text_getSubstring)');\n }\n\n let at2;\n switch (where2) {\n case 'FROM_START':\n at2 = generator.getAdjustedInt(block, 'AT2', 1);\n break;\n case 'FROM_END':\n at2 = generator.getAdjustedInt(block, 'AT2', 0, true);\n // Ensure that if the result calculated is 0 that sub-sequence will\n // include all elements as expected.\n if (!stringUtils.isNumber(String(at2))) {\n (generator as AnyDuringMigration).definitions_['import_sys'] =\n 'import sys';\n at2 += ' or sys.maxsize';\n } else if (at2 === 0) {\n at2 = '';\n }\n break;\n case 'LAST':\n at2 = '';\n break;\n default:\n throw Error('Unhandled option (text_getSubstring)');\n }\n const code = text + '[' + at1 + ' : ' + at2 + ']';\n return [code, Order.MEMBER];\n}\n\nexport function text_changeCase(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Change capitalization.\n const OPERATORS = {\n 'UPPERCASE': '.upper()',\n 'LOWERCASE': '.lower()',\n 'TITLECASE': '.title()',\n };\n type OperatorOption = keyof typeof OPERATORS;\n const operator = OPERATORS[block.getFieldValue('CASE') as OperatorOption];\n const text = generator.valueToCode(block, 'TEXT', Order.MEMBER) || \"''\";\n const code = text + operator;\n return [code, Order.FUNCTION_CALL];\n}\n\nexport function text_trim(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Trim spaces.\n const OPERATORS = {\n 'LEFT': '.lstrip()',\n 'RIGHT': '.rstrip()',\n 'BOTH': '.strip()',\n };\n type OperatorOption = keyof typeof OPERATORS;\n const operator = OPERATORS[block.getFieldValue('MODE') as OperatorOption];\n const text = generator.valueToCode(block, 'TEXT', Order.MEMBER) || \"''\";\n const code = text + operator;\n return [code, Order.FUNCTION_CALL];\n}\n\nexport function text_print(block: Block, generator: PythonGenerator) {\n // Print statement.\n const msg = generator.valueToCode(block, 'TEXT', Order.NONE) || \"''\";\n return 'print(' + msg + ')\\n';\n}\n\nexport function text_prompt_ext(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Prompt function.\n const functionName = generator.provideFunction_(\n 'text_prompt',\n `\ndef ${generator.FUNCTION_NAME_PLACEHOLDER_}(msg):\n try:\n return raw_input(msg)\n except NameError:\n return input(msg)\n`,\n );\n let msg;\n if (block.getField('TEXT')) {\n // Internal message.\n msg = generator.quote_(block.getFieldValue('TEXT'));\n } else {\n // External message.\n msg = generator.valueToCode(block, 'TEXT', Order.NONE) || \"''\";\n }\n let code = functionName + '(' + msg + ')';\n const toNumber = block.getFieldValue('TYPE') === 'NUMBER';\n if (toNumber) {\n code = 'float(' + code + ')';\n }\n return [code, Order.FUNCTION_CALL];\n}\n\nexport const text_prompt = text_prompt_ext;\n\nexport function text_count(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n const text = generator.valueToCode(block, 'TEXT', Order.MEMBER) || \"''\";\n const sub = generator.valueToCode(block, 'SUB', Order.NONE) || \"''\";\n const code = text + '.count(' + sub + ')';\n return [code, Order.FUNCTION_CALL];\n}\n\nexport function text_replace(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n const text = generator.valueToCode(block, 'TEXT', Order.MEMBER) || \"''\";\n const from = generator.valueToCode(block, 'FROM', Order.NONE) || \"''\";\n const to = generator.valueToCode(block, 'TO', Order.NONE) || \"''\";\n const code = text + '.replace(' + from + ', ' + to + ')';\n return [code, Order.MEMBER];\n}\n\nexport function text_reverse(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n const text = generator.valueToCode(block, 'TEXT', Order.MEMBER) || \"''\";\n const code = text + '[::-1]';\n return [code, Order.MEMBER];\n}\n","/**\n * @license\n * Copyright 2012 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @file Generating Python for variable blocks.\n */\n\n// Former goog.module ID: Blockly.Python.variables\n\nimport type {Block} from '../../core/block.js';\nimport type {PythonGenerator} from './python_generator.js';\nimport {Order} from './python_generator.js';\n\nexport function variables_get(\n block: Block,\n generator: PythonGenerator,\n): [string, Order] {\n // Variable getter.\n const code = generator.getVariableName(block.getFieldValue('VAR'));\n return [code, Order.ATOMIC];\n}\n\nexport function variables_set(block: Block, generator: PythonGenerator) {\n // Variable setter.\n const argument0 = generator.valueToCode(block, 'VALUE', Order.NONE) || '0';\n const varName = generator.getVariableName(block.getFieldValue('VAR'));\n return varName + ' = ' + argument0 + '\\n';\n}\n","/**\n * @license\n * Copyright 2012 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @file Python code generator class, including helper methods for\n * generating Python for blocks.\n */\n\n// Former goog.module ID: Blockly.Python\n\nimport type {Block} from '../../core/block.js';\nimport {CodeGenerator} from '../../core/generator.js';\nimport {inputTypes} from '../../core/inputs/input_types.js';\nimport {Names} from '../../core/names.js';\nimport * as stringUtils from '../../core/utils/string.js';\nimport * as Variables from '../../core/variables.js';\nimport type {Workspace} from '../../core/workspace.js';\n\n/**\n * Order of operation ENUMs.\n * http://docs.python.org/reference/expressions.html#summary\n */\n// prettier-ignore\nexport enum Order {\n ATOMIC = 0, // 0 \"\" ...\n COLLECTION = 1, // tuples, lists, dictionaries\n STRING_CONVERSION = 1, // `expression...`\n MEMBER = 2.1, // . []\n FUNCTION_CALL = 2.2, // ()\n EXPONENTIATION = 3, // **\n UNARY_SIGN = 4, // + -\n BITWISE_NOT = 4, // ~\n MULTIPLICATIVE = 5, // * / // %\n ADDITIVE = 6, // + -\n BITWISE_SHIFT = 7, // << >>\n BITWISE_AND = 8, // &\n BITWISE_XOR = 9, // ^\n BITWISE_OR = 10, // |\n RELATIONAL = 11, // in, not in, is, is not, >, >=, <>, !=, ==\n LOGICAL_NOT = 12, // not\n LOGICAL_AND = 13, // and\n LOGICAL_OR = 14, // or\n CONDITIONAL = 15, // if else\n LAMBDA = 16, // lambda\n NONE = 99, // (...)\n}\n\n/**\n * PythonScript code generator class.\n */\nexport class PythonGenerator extends CodeGenerator {\n /** List of outer-inner pairings that do NOT require parentheses. */\n ORDER_OVERRIDES: [Order, Order][] = [\n // (foo()).bar -> foo().bar\n // (foo())[0] -> foo()[0]\n [Order.FUNCTION_CALL, Order.MEMBER],\n // (foo())() -> foo()()\n [Order.FUNCTION_CALL, Order.FUNCTION_CALL],\n // (foo.bar).baz -> foo.bar.baz\n // (foo.bar)[0] -> foo.bar[0]\n // (foo[0]).bar -> foo[0].bar\n // (foo[0])[1] -> foo[0][1]\n [Order.MEMBER, Order.MEMBER],\n // (foo.bar)() -> foo.bar()\n // (foo[0])() -> foo[0]()\n [Order.MEMBER, Order.FUNCTION_CALL],\n\n // not (not foo) -> not not foo\n [Order.LOGICAL_NOT, Order.LOGICAL_NOT],\n // a and (b and c) -> a and b and c\n [Order.LOGICAL_AND, Order.LOGICAL_AND],\n // a or (b or c) -> a or b or c\n [Order.LOGICAL_OR, Order.LOGICAL_OR],\n ];\n\n /**\n * Empty loops or conditionals are not allowed in Python.\n */\n PASS: string = ''; // Initialised by init().\n\n /** @param name Name of the language the generator is for. */\n constructor(name = 'Python') {\n super(name);\n this.isInitialized = false;\n\n // Copy Order values onto instance for backwards compatibility\n // while ensuring they are not part of the publically-advertised\n // API.\n //\n // TODO(#7085): deprecate these in due course. (Could initially\n // replace data properties with get accessors that call\n // deprecate.warn().)\n for (const key in Order) {\n // Must assign Order[key] to a temporary to get the type guard to work;\n // see https://github.com/microsoft/TypeScript/issues/10530.\n const value = Order[key];\n // Skip reverse-lookup entries in the enum. Due to\n // https://github.com/microsoft/TypeScript/issues/55713 this (as\n // of TypeScript 5.5.2) actually narrows the type of value to\n // never - but that still allows the following assignment to\n // succeed.\n if (typeof value === 'string') continue;\n (this as unknown as Record)['ORDER_' + key] = value;\n }\n\n // List of illegal variable names. This is not intended to be a\n // security feature. Blockly is 100% client-side, so bypassing\n // this list is trivial. This is intended to prevent users from\n // accidentally clobbering a built-in object or function.\n this.addReservedWords(\n // import keyword\n // print(','.join(sorted(keyword.kwlist)))\n // https://docs.python.org/3/reference/lexical_analysis.html#keywords\n // https://docs.python.org/2/reference/lexical_analysis.html#keywords\n 'False,None,True,and,as,assert,break,class,continue,def,del,elif,else,' +\n 'except,exec,finally,for,from,global,if,import,in,is,lambda,nonlocal,' +\n 'not,or,pass,print,raise,return,try,while,with,yield,' +\n // https://docs.python.org/3/library/constants.html\n // https://docs.python.org/2/library/constants.html\n 'NotImplemented,Ellipsis,__debug__,quit,exit,copyright,license,credits,' +\n // >>> print(','.join(sorted(dir(__builtins__))))\n // https://docs.python.org/3/library/functions.html\n // https://docs.python.org/2/library/functions.html\n 'ArithmeticError,AssertionError,AttributeError,BaseException,' +\n 'BlockingIOError,BrokenPipeError,BufferError,BytesWarning,' +\n 'ChildProcessError,ConnectionAbortedError,ConnectionError,' +\n 'ConnectionRefusedError,ConnectionResetError,DeprecationWarning,' +\n 'EOFError,Ellipsis,EnvironmentError,Exception,FileExistsError,' +\n 'FileNotFoundError,FloatingPointError,FutureWarning,GeneratorExit,' +\n 'IOError,ImportError,ImportWarning,IndentationError,IndexError,' +\n 'InterruptedError,IsADirectoryError,KeyError,KeyboardInterrupt,' +\n 'LookupError,MemoryError,ModuleNotFoundError,NameError,' +\n 'NotADirectoryError,NotImplemented,NotImplementedError,OSError,' +\n 'OverflowError,PendingDeprecationWarning,PermissionError,' +\n 'ProcessLookupError,RecursionError,ReferenceError,ResourceWarning,' +\n 'RuntimeError,RuntimeWarning,StandardError,StopAsyncIteration,' +\n 'StopIteration,SyntaxError,SyntaxWarning,SystemError,SystemExit,' +\n 'TabError,TimeoutError,TypeError,UnboundLocalError,UnicodeDecodeError,' +\n 'UnicodeEncodeError,UnicodeError,UnicodeTranslateError,UnicodeWarning,' +\n 'UserWarning,ValueError,Warning,ZeroDivisionError,_,__build_class__,' +\n '__debug__,__doc__,__import__,__loader__,__name__,__package__,__spec__,' +\n 'abs,all,any,apply,ascii,basestring,bin,bool,buffer,bytearray,bytes,' +\n 'callable,chr,classmethod,cmp,coerce,compile,complex,copyright,credits,' +\n 'delattr,dict,dir,divmod,enumerate,eval,exec,execfile,exit,file,filter,' +\n 'float,format,frozenset,getattr,globals,hasattr,hash,help,hex,id,input,' +\n 'int,intern,isinstance,issubclass,iter,len,license,list,locals,long,' +\n 'map,max,memoryview,min,next,object,oct,open,ord,pow,print,property,' +\n 'quit,range,raw_input,reduce,reload,repr,reversed,round,set,setattr,' +\n 'slice,sorted,staticmethod,str,sum,super,tuple,type,unichr,unicode,' +\n 'vars,xrange,zip',\n );\n }\n\n /**\n * Initialise the database of variable names.\n *\n * @param workspace Workspace to generate code from.\n */\n init(workspace: Workspace) {\n super.init(workspace);\n\n this.PASS = this.INDENT + 'pass\\n';\n\n if (!this.nameDB_) {\n this.nameDB_ = new Names(this.RESERVED_WORDS_);\n } else {\n this.nameDB_.reset();\n }\n\n this.nameDB_.setVariableMap(workspace.getVariableMap());\n this.nameDB_.populateVariables(workspace);\n this.nameDB_.populateProcedures(workspace);\n\n const defvars = [];\n // Add developer variables (not created or named by the user).\n const devVarList = Variables.allDeveloperVariables(workspace);\n for (let i = 0; i < devVarList.length; i++) {\n defvars.push(\n this.nameDB_.getName(devVarList[i], Names.DEVELOPER_VARIABLE_TYPE) +\n ' = None',\n );\n }\n\n // Add user variables, but only ones that are being used.\n const variables = Variables.allUsedVarModels(workspace);\n for (let i = 0; i < variables.length; i++) {\n defvars.push(this.getVariableName(variables[i].getId()) + ' = None');\n }\n\n this.definitions_['variables'] = defvars.join('\\n');\n this.isInitialized = true;\n }\n\n /**\n * Prepend the generated code with import statements and variable definitions.\n *\n * @param code Generated code.\n * @returns Completed code.\n */\n finish(code: string): string {\n // Convert the definitions dictionary into a list.\n const imports = [];\n const definitions = [];\n for (let name in this.definitions_) {\n const def = this.definitions_[name];\n if (def.match(/^(from\\s+\\S+\\s+)?import\\s+\\S+/)) {\n imports.push(def);\n } else {\n definitions.push(def);\n }\n }\n // Call Blockly.CodeGenerator's finish.\n code = super.finish(code);\n this.isInitialized = false;\n\n this.nameDB_!.reset();\n const allDefs = imports.join('\\n') + '\\n\\n' + definitions.join('\\n\\n');\n return allDefs.replace(/\\n\\n+/g, '\\n\\n').replace(/\\n*$/, '\\n\\n\\n') + code;\n }\n\n /**\n * Naked values are top-level blocks with outputs that aren't plugged into\n * anything.\n *\n * @param line Line of generated code.\n * @returns Legal line of code.\n */\n scrubNakedValue(line: string): string {\n return line + '\\n';\n }\n\n /**\n * Encode a string as a properly escaped Python string, complete with quotes.\n *\n * @param string Text to encode.\n * @returns Python string.\n */\n quote_(string: string): string {\n string = string.replace(/\\\\/g, '\\\\\\\\').replace(/\\n/g, '\\\\\\n');\n\n // Follow the CPython behaviour of repr() for a non-byte string.\n let quote = \"'\";\n if (string.includes(\"'\")) {\n if (!string.includes('\"')) {\n quote = '\"';\n } else {\n string = string.replace(/'/g, \"\\\\'\");\n }\n }\n return quote + string + quote;\n }\n\n /**\n * Encode a string as a properly escaped multiline Python string, complete\n * with quotes.\n *\n * @param string Text to encode.\n * @returns Python string.\n */\n multiline_quote_(string: string): string {\n const lines = string.split(/\\n/g).map(this.quote_);\n // Join with the following, plus a newline:\n // + '\\n' +\n return lines.join(\" + '\\\\n' + \\n\");\n }\n\n /**\n * Common tasks for generating Python from blocks.\n * Handles comments for the specified block and any connected value blocks.\n * Calls any statements following this block.\n *\n * @param block The current block.\n * @param code The Python code created for this block.\n * @param thisOnly True to generate code for only this statement.\n * @returns Python code with comments and subsequent blocks added.\n */\n scrub_(block: Block, code: string, thisOnly = false): string {\n let commentCode = '';\n // Only collect comments for blocks that aren't inline.\n if (!block.outputConnection || !block.outputConnection.targetConnection) {\n // Collect comment for this block.\n let comment = block.getCommentText();\n if (comment) {\n comment = stringUtils.wrap(comment, this.COMMENT_WRAP - 3);\n commentCode += this.prefixLines(comment + '\\n', '# ');\n }\n // Collect comments for all value arguments.\n // Don't collect comments for nested statements.\n for (let i = 0; i < block.inputList.length; i++) {\n if (block.inputList[i].type === inputTypes.VALUE) {\n const childBlock = block.inputList[i].connection!.targetBlock();\n if (childBlock) {\n comment = this.allNestedComments(childBlock);\n if (comment) {\n commentCode += this.prefixLines(comment, '# ');\n }\n }\n }\n }\n }\n const nextBlock =\n block.nextConnection && block.nextConnection.targetBlock();\n const nextCode = thisOnly ? '' : this.blockToCode(nextBlock);\n return commentCode + code + nextCode;\n }\n\n /**\n * Gets a property and adjusts the value, taking into account indexing.\n * If a static int, casts to an integer, otherwise returns a code string.\n *\n * @param block The block.\n * @param atId The ID of the input block to get (and adjust) the value of.\n * @param delta Value to add.\n * @param negate Whether to negate the value.\n * @returns The adjusted value or code that evaluates to it.\n */\n getAdjustedInt(\n block: Block,\n atId: string,\n delta = 0,\n negate = false,\n ): string | number {\n if (block.workspace.options.oneBasedIndex) {\n delta--;\n }\n const defaultAtIndex = block.workspace.options.oneBasedIndex ? '1' : '0';\n const atOrder = delta ? Order.ADDITIVE : Order.NONE;\n let at: string | number =\n this.valueToCode(block, atId, atOrder) || defaultAtIndex;\n\n if (stringUtils.isNumber(at)) {\n // If the index is a naked number, adjust it right now.\n at = parseInt(at, 10) + delta;\n if (negate) {\n at = -at;\n }\n } else {\n // If the index is dynamic, adjust it in code.\n if (delta > 0) {\n at = 'int(' + at + ' + ' + delta + ')';\n } else if (delta < 0) {\n at = 'int(' + at + ' - ' + -delta + ')';\n } else {\n at = 'int(' + at + ')';\n }\n if (negate) {\n at = '-' + at;\n }\n }\n return at;\n }\n}\n","/**\n * @license\n * Copyright 2018 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @file Generating Python for dynamic variable blocks.\n */\n\n// Former goog.module ID: Blockly.Python.variablesDynamic\n\n// generator is dynamically typed.\nexport {\n variables_get as variables_get_dynamic,\n variables_set as variables_set_dynamic,\n} from './variables.js';\n","/**\n * @license\n * Copyright 2021 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @file Instantiate a PythonGenerator and populate it with the\n * complete set of block generator functions for Python. This is the\n * entrypoint for python_compressed.js.\n */\n\n// Former goog.module ID: Blockly.Python.all\n\nimport * as common from './python/common.js';\nimport * as lists from './python/lists.js';\nimport * as logic from './python/logic.js';\nimport * as loops from './python/loops.js';\nimport * as math from './python/math.js';\nimport * as procedures from './python/procedures.js';\nimport {PythonGenerator} from './python/python_generator.js';\nimport * as text from './python/text.js';\nimport * as variables from './python/variables.js';\nimport * as variablesDynamic from './python/variables_dynamic.js';\n\nexport * from './python/python_generator.js';\n\n/**\n * Python code generator instance.\n * @type {!PythonGenerator}\n */\nexport const pythonGenerator = new PythonGenerator();\n\n// Add reserved words. This list should include all words mentioned\n// in RESERVED WORDS: comments in the imports above.\npythonGenerator.addReservedWords('math,random,Number');\n\n// Install per-block-type generator functions:\n// Install per-block-type generator functions:\nconst generators: typeof pythonGenerator.forBlock = {\n ...common,\n ...lists,\n ...logic,\n ...loops,\n ...math,\n ...procedures,\n ...text,\n ...variables,\n ...variablesDynamic,\n};\nfor (const name in generators) {\n pythonGenerator.forBlock[name] = generators[name];\n}\n"]} \ No newline at end of file diff --git a/src/components/editor/blockly/blocks.ts b/src/components/editor/blockly/blocks.ts index bbc3b42..b137de1 100644 --- a/src/components/editor/blockly/blocks.ts +++ b/src/components/editor/blockly/blocks.ts @@ -1,6 +1,5 @@ import * as Blockly from 'blockly'; import {Order, pythonGenerator} from "blockly/python"; -import {BlocklyColors} from "./theme"; export const DefaultBlocklyToolboxes = [ { @@ -18,6 +17,20 @@ export const DefaultBlocklyToolboxes = [ kind: 'block', type: 'text', }, + { + kind: 'block', + type: 'sleep', + inputs: { + VALUE: { + block: { + type: 'text', + fields: { + TEXT: 1, + }, + }, + }, + } + }, { "kind": "block", "type": "controls_if" @@ -51,7 +64,7 @@ export const DefaultBlocklyToolboxes = [ block: { type: 'text', fields: { - NUM: 10, + TEXT: 10, }, }, }, @@ -72,7 +85,7 @@ export const DefaultBlocklyToolboxes = [ block: { type: 'text', fields: { - NUM: 1, + TEXT: 1, }, }, }, @@ -80,7 +93,7 @@ export const DefaultBlocklyToolboxes = [ block: { type: 'text', fields: { - NUM: 10, + TEXT: 10, }, }, }, @@ -88,7 +101,7 @@ export const DefaultBlocklyToolboxes = [ block: { type: 'text', fields: { - NUM: 1, + TEXT: 1, }, }, }, @@ -149,7 +162,7 @@ export const DefaultBlocklyToolboxes = [ block: { type: 'text', fields: { - NUM: 1, + TEXT: 1, }, }, }, @@ -157,7 +170,7 @@ export const DefaultBlocklyToolboxes = [ block: { type: 'text', fields: { - NUM: 100, + TEXT: 100, }, }, }, @@ -171,7 +184,7 @@ export const DefaultBlocklyToolboxes = [ block: { type: 'text', fields: { - NUM: 1, + TEXT: 1, }, }, }, @@ -179,7 +192,7 @@ export const DefaultBlocklyToolboxes = [ block: { type: 'text', fields: { - NUM: 100, + TEXT: 100, }, }, }, @@ -278,7 +291,7 @@ export const DefaultBlocklyToolboxes = [ block: { type: 'text', fields: { - NUM: 5, + TEXT: 5, }, }, }, @@ -432,25 +445,26 @@ export const DefaultBlocklyToolboxes = [ // }) // console.log('blocks', JSON.stringify(blocks, null, 2)) -// Blockly.defineBlocksWithJsonArray([ -// { -// "type": "input_text_block", -// "message0": "字符串%1", -// "args0": [ -// { -// "type": "field_input", -// "name": "VALUE", -// "text": "" -// } -// ], -// "output": "String", -// "colour": BlocklyColors.StringColor, -// "tooltip": "变量输入块", -// }, -// ]) -// -// let results: any[] = [] -// pythonGenerator.forBlock['input_text_block'] = function (block, generator) { -// return [generator.quote_(block.getFieldValue('VALUE')), Order.ATOMIC]; -// } +Blockly.defineBlocksWithJsonArray([ + { + "type": "sleep", + "message0": "延迟 %1 秒", + "args0": [ + { + "type": "input_value", + "name": "VALUE", + "text": "" + } + ], + "previousStatement": null, + "nextStatement": null, + 'style': 'basic_blocks', + "tooltip": "延迟指定秒数", + }, +]) + +pythonGenerator.forBlock['sleep'] = function (block, generator) { + const value = generator.valueToCode(block, 'VALUE', Order.ATOMIC) + return `module_run.sleep(${value})` +} diff --git a/src/components/editor/blockly/manager.ts b/src/components/editor/blockly/manager.ts index b971434..9feceda 100644 --- a/src/components/editor/blockly/manager.ts +++ b/src/components/editor/blockly/manager.ts @@ -169,6 +169,7 @@ export class BlocklyManager { let codeBlockIndex = 0 + code.push('import module_run'); projectStore.currentExtends.forEach(e => { code.push(`import extend.${e.name}.main`) }) diff --git a/src/components/editor/blockly/theme.ts b/src/components/editor/blockly/theme.ts index 0eaf07f..3cac010 100644 --- a/src/components/editor/blockly/theme.ts +++ b/src/components/editor/blockly/theme.ts @@ -1,9 +1,5 @@ import * as Blockly from 'blockly'; -export const BlocklyColors = { - StringColor: 50, -} - const theme = Blockly.Theme.defineTheme('mTheme', { base: Blockly.Themes.Classic, categoryStyles: { diff --git a/src/services/ProjectService.ts b/src/services/ProjectService.ts index af5e4ba..a67cc5a 100644 --- a/src/services/ProjectService.ts +++ b/src/services/ProjectService.ts @@ -61,8 +61,6 @@ export const ProjectService = { ]) as ProjectRecord projects.push(project) } - // order by updatedAt desc - projects = projects.sort((a, b) => a.updatedAt > b.updatedAt ? -1 : 1) return projects }, async add(project: ProjectRecord): Promise { diff --git a/src/store/modules/project.ts b/src/store/modules/project.ts index 168af8f..9e50cd8 100644 --- a/src/store/modules/project.ts +++ b/src/store/modules/project.ts @@ -25,7 +25,7 @@ export const projectStore = defineStore("project", { }), actions: { async refreshIfNeed() { - if(this.recordsInitialized){ + if (this.recordsInitialized) { return } this.recordsInitialized = true @@ -33,6 +33,10 @@ export const projectStore = defineStore("project", { }, async refresh() { this.records = await ProjectService.list() + this.refreshUpdateTime() + }, + refreshUpdateTime() { + this.records = this.records.sort((a, b) => a.updatedAt > b.updatedAt ? -1 : 1) }, async add(record: ProjectRecord): Promise { record = clone(record) @@ -45,13 +49,26 @@ export const projectStore = defineStore("project", { await this.refresh() return record }, + async editField(record: ProjectRecord, field: string | null = null, value: string | null = null) { + const project = this.getById(record?.id) + if (!project) { + return + } + if (field) { + project[field] = value + } + project.updatedAt = Date.now() + await ProjectService.edit(project) + this.refreshUpdateTime() + }, async edit(record: ProjectRecord) { - const project = this.records.find(p => p.id === record.id) + const project = this.getById(record.id) if (!project) { return } project.title = record.title await ProjectService.edit(project) + this.refreshUpdateTime() }, async open(id: string) { await this.refreshIfNeed() @@ -86,6 +103,7 @@ export const projectStore = defineStore("project", { return } this.current.pipDependencies.push(pip) + this.current.updatedAt = Date.now() await ProjectService.edit(this.current) }, async deletePipDependency(pip: ProjectPipRecord) { @@ -96,6 +114,7 @@ export const projectStore = defineStore("project", { return } this.current.pipDependencies = this.current.pipDependencies.filter(p => p.name !== pip.name) + this.current.updatedAt = Date.now() await ProjectService.edit(this.current) }, async activeModule(module: ProjectModuleRecord | string | null = null) { @@ -134,6 +153,7 @@ export const projectStore = defineStore("project", { const module = await ProjectService.addModule(this.current) await this.loadModules() await this.activeModule(module) + await this.editField(this.current) }, async deleteModule(module: ProjectModuleRecord | string | null) { if (!this.current) { @@ -150,6 +170,7 @@ export const projectStore = defineStore("project", { if (this.currentModuleActive === module.name) { await this.activeModule() } + await this.editField(this.current) }, async editModuleName(nameOld: string, nameNew: string) { if (!this.current) { @@ -164,6 +185,7 @@ export const projectStore = defineStore("project", { await ProjectService.editModuleName(this.current, nameOld, nameNew) await this.loadModules() await this.activeModule(nameNew) + await this.editField(this.current) }, async editModule(module: ProjectModuleRecord) { if (!this.current) { @@ -179,6 +201,7 @@ export const projectStore = defineStore("project", { m.logo = module.logo m.updatedAt = Date.now() await ProjectService.editModule(this.current, m) + await this.editField(this.current) }, async editModuleData(data: ProjectModuleDataRecord) { if (!this.current || !this.currentModuleActive) { @@ -187,6 +210,7 @@ export const projectStore = defineStore("project", { const module = this.currentModules.find(m => m.name === this.currentModuleActive) if (module) { await ProjectService.editModuleData(this.current, module, data) + await this.editField(this.current) } }, async setDefaultDevice(device: DeviceRecord) { @@ -196,6 +220,7 @@ export const projectStore = defineStore("project", { // console.log('setDefaultDevice', JSON.stringify(device)) this.current.defaultDevice = device.id as string await ProjectService.edit(this.current) + await this.editField(this.current) }, async loadExtends() { if (!this.current) { @@ -209,6 +234,7 @@ export const projectStore = defineStore("project", { } await ProjectService.addExtend(this.current, extend, files) await this.loadExtends() + await this.editField(this.current) }, async deleteExtend(extend: ProjectExtendRecord) { if (!this.current) { @@ -216,6 +242,7 @@ export const projectStore = defineStore("project", { } await ProjectService.deleteExtend(this.current, extend) await this.loadExtends() + await this.editField(this.current) } } }) -- Gitee