Spaces:
No application file
No application file
| import json | |
| def update_and_clean_blocks(all_generated_blocks, generated_output_blocks): | |
| """ | |
| Updates the generated_output_blocks with values from all_generated_blocks | |
| and removes specified keys from the updated blocks. | |
| Args: | |
| all_generated_blocks (dict): The dictionary containing all generated block data. | |
| generated_output_blocks (dict): The dictionary to be updated and cleaned. | |
| Returns: | |
| dict: The updated and cleaned dictionary. | |
| """ | |
| keys_to_remove = ["functionality", "block_shape", "id", "block_name", "block_type"] | |
| updated_blocks = {} | |
| for block_id, generated_block_data in generated_output_blocks.items(): | |
| if block_id in all_generated_blocks: | |
| all_block_data = all_generated_blocks[block_id] | |
| # Create a new dictionary for the updated block, including only desired fields | |
| current_updated_block = {} | |
| for key, value in generated_block_data.items(): | |
| if key not in keys_to_remove: | |
| current_updated_block[key] = value | |
| # Update specific values from all_generated_blocks if they exist | |
| # and are not among the keys to be removed | |
| if "next" in all_block_data and "next" not in keys_to_remove: | |
| current_updated_block["next"] = all_block_data["next"] | |
| if "parent" in all_block_data and "parent" not in keys_to_remove: | |
| current_updated_block["parent"] = all_block_data["parent"] | |
| if "topLevel" in all_block_data and "topLevel" not in keys_to_remove: | |
| current_updated_block["topLevel"] = all_block_data["topLevel"] | |
| updated_blocks[block_id] = current_updated_block | |
| else: | |
| # If a block_id from generated_output_blocks is not in all_generated_blocks, | |
| # just clean it | |
| current_updated_block = {} | |
| for key, value in generated_block_data.items(): | |
| if key not in keys_to_remove: | |
| current_updated_block[key] = value | |
| updated_blocks[block_id] = current_updated_block | |
| return updated_blocks | |
| # Load the provided JSON data | |
| all_generated_blocks = { | |
| "event_whenflagclicked_1": { | |
| "block_name": "when green flag pressed", | |
| "block_type": "Events", | |
| "op_code": "event_whenflagclicked", | |
| "block_shape": "Hat Block", | |
| "functionality": "This Hat block initiates the script when the green flag is clicked, serving as the common starting point for most Scratch projects.", | |
| "inputs": {}, | |
| "fields": {}, | |
| "shadow": False, | |
| "topLevel": True, | |
| "id": "event_whenflagclicked_1", | |
| "next": "data_setvariableto_1", | |
| "parent": None | |
| }, | |
| "data_setvariableto_1": { | |
| "block_name": "set [my variable v] to ()", | |
| "block_type": "Data", | |
| "block_shape": "Stack Block", | |
| "op_code": "data_setvariableto", | |
| "functionality": "Assigns a specific value (number, string, or boolean) to a variable.", | |
| "inputs": { | |
| "VALUE": { | |
| "kind": "value", | |
| "value": 0 | |
| } | |
| }, | |
| "fields": { | |
| "VARIABLE": [ | |
| "score", | |
| None | |
| ] | |
| }, | |
| "shadow": False, | |
| "topLevel": False, | |
| "id": "data_setvariableto_1", | |
| "next": "control_forever_1", | |
| "parent": "event_whenflagclicked_1" | |
| }, | |
| "data_setvariableto_2": { | |
| "block_name": "set [my variable v] to ()", | |
| "block_type": "Data", | |
| "block_shape": "Stack Block", | |
| "op_code": "data_setvariableto", | |
| "functionality": "Assigns a specific value (number, string, or boolean) to a variable.", | |
| "inputs": { | |
| "VALUE": [ | |
| 1, | |
| [ | |
| 10, | |
| "0" | |
| ] | |
| ] | |
| }, | |
| "fields": { | |
| "VARIABLE": [ | |
| "my variable", | |
| "`jEk@4|i[#Fk?(8x)AV.-my variable" | |
| ] | |
| }, | |
| "shadow": False, | |
| "topLevel": False, | |
| "parent": None, | |
| "next": None | |
| }, | |
| "control_forever_1": { | |
| "block_name": "forever", | |
| "block_type": "Control", | |
| "block_shape": "C-Block", | |
| "op_code": "control_forever", | |
| "functionality": "Continuously runs the blocks inside it.", | |
| "inputs": { | |
| "SUBSTACK": [ | |
| 2, | |
| "control_if_1" | |
| ] | |
| }, | |
| "fields": {}, | |
| "shadow": False, | |
| "topLevel": False, | |
| "id": "control_forever_1", | |
| "next": None, | |
| "parent": "event_whenflagclicked_1" | |
| }, | |
| "control_if_1": { | |
| "block_name": "if <> then", | |
| "block_type": "Control", | |
| "block_shape": "C-Block", | |
| "op_code": "control_if", | |
| "functionality": "Executes the blocks inside it only if the specified boolean condition is true. [NOTE: it takes boolean blocks as input]", | |
| "inputs": { | |
| "CONDITION": { | |
| "kind": "block", | |
| "block": "sensing_touchingobject_1" | |
| }, | |
| "SUBSTACK": [ | |
| 2, | |
| "data_changevariableby_1" | |
| ] | |
| }, | |
| "fields": {}, | |
| "shadow": False, | |
| "topLevel": False, | |
| "id": "control_if_1", | |
| "next": None, | |
| "parent": "control_forever_1" | |
| }, | |
| "control_wait_1": { | |
| "block_name": "wait () seconds", | |
| "block_type": "Control", | |
| "block_shape": "Stack Block", | |
| "op_code": "control_wait", | |
| "functionality": "Pauses the script for a specified duration.", | |
| "inputs": { | |
| "DURATION": { | |
| "kind": "value", | |
| "value": 0.1 | |
| } | |
| }, | |
| "fields": {}, | |
| "shadow": False, | |
| "topLevel": False, | |
| "id": "control_wait_1", | |
| "next": None, | |
| "parent": "control_if_1" | |
| }, | |
| "sensing_touchingobject_1": { | |
| "block_name": "<touching [edge v]?>", | |
| "block_type": "Sensing", | |
| "op_code": "sensing_touchingobject", | |
| "block_shape": "Boolean Block", | |
| "functionality": "Checks if its sprite is touching the mouse-pointer, edge, or another specified sprite.", | |
| "inputs": { | |
| "TOUCHINGOBJECTMENU": [ | |
| 1, | |
| "sensing_touchingobjectmenu_1" | |
| ] | |
| }, | |
| "fields": {}, | |
| "shadow": False, | |
| "topLevel": False, | |
| "id": "sensing_touchingobject_1", | |
| "parent": "control_if_1", | |
| "next": None | |
| }, | |
| "sensing_touchingobjectmenu_1": { | |
| "block_name": "touching object menu", | |
| "block_type": "Sensing", | |
| "block_shape": "Reporter Block", | |
| "op_code": "sensing_touchingobjectmenu", | |
| "functionality": "Menu for touching object block.", | |
| "inputs": {}, | |
| "fields": { | |
| "TOUCHINGOBJECTMENU": [ | |
| "other sprite", | |
| None | |
| ] | |
| }, | |
| "shadow": True, | |
| "topLevel": False, | |
| "id": "sensing_touchingobjectmenu_1", | |
| "parent": "sensing_touchingobject_1", | |
| "next": None | |
| }, | |
| "data_changevariableby_1": { | |
| "block_name": "change [my variable v] by ()", | |
| "block_type": "Data", | |
| "block_shape": "Stack Block", | |
| "op_code": "data_changevariableby", | |
| "functionality": "Increases or decreases a variable's numerical value by a specified amount.", | |
| "inputs": { | |
| "VALUE": { | |
| "kind": "value", | |
| "value": -1 | |
| } | |
| }, | |
| "fields": { | |
| "VARIABLE": [ | |
| "score", | |
| None | |
| ] | |
| }, | |
| "shadow": False, | |
| "topLevel": False, | |
| "id": "data_changevariableby_1", | |
| "next": "control_wait_1", | |
| "parent": "control_if_1" | |
| } | |
| } | |
| generated_output_blocks = { | |
| "event_whenflagclicked_1": { | |
| "block_name": "when green flag pressed", | |
| "block_type": "Events", | |
| "op_code": "event_whenflagclicked", | |
| "block_shape": "Hat Block", | |
| "functionality": "This Hat block initiates the script when the green flag is clicked, serving as the common starting point for most Scratch projects.", | |
| "inputs": {}, | |
| "fields": {}, | |
| "shadow": False, | |
| "topLevel": True, | |
| "parent": None, | |
| "next": None | |
| }, | |
| "data_setvariableto_1": { | |
| "block_name": "set [my variable v] to ()", | |
| "block_type": "Data", | |
| "block_shape": "Stack Block", | |
| "op_code": "data_setvariableto", | |
| "functionality": "Assigns a specific value (number, string, or boolean) to a variable.", | |
| "inputs": { | |
| "VALUE": [ | |
| 1, | |
| [ | |
| 10, | |
| "0" | |
| ] | |
| ] | |
| }, | |
| "fields": { | |
| "VARIABLE": [ | |
| "my variable", | |
| "`jEk@4|i[#Fk?(8x)AV.-my variable" | |
| ] | |
| }, | |
| "shadow": False, | |
| "topLevel": True, | |
| "parent": None, | |
| "next": None | |
| }, | |
| "data_setvariableto_2": { | |
| "block_name": "set [my variable v] to ()", | |
| "block_type": "Data", | |
| "block_shape": "Stack Block", | |
| "op_code": "data_setvariableto", | |
| "functionality": "Assigns a specific value (number, string, or boolean) to a variable.", | |
| "inputs": { | |
| "VALUE": [ | |
| 1, | |
| [ | |
| 10, | |
| "0" | |
| ] | |
| ] | |
| }, | |
| "fields": { | |
| "VARIABLE": [ | |
| "my variable", | |
| "`jEk@4|i[#Fk?(8x)AV.-my variable" | |
| ] | |
| }, | |
| "shadow": False, | |
| "topLevel": True, | |
| "parent": None, | |
| "next": None | |
| }, | |
| "control_forever_1": { | |
| "block_name": "forever", | |
| "block_type": "Control", | |
| "block_shape": "C-Block", | |
| "op_code": "control_forever", | |
| "functionality": "Continuously runs the blocks inside it.", | |
| "inputs": { | |
| "SUBSTACK": [ | |
| 2, | |
| None | |
| ] | |
| }, | |
| "fields": {}, | |
| "shadow": False, | |
| "topLevel": True, | |
| "parent": None, | |
| "next": None | |
| }, | |
| "control_if_1": { | |
| "block_name": "if <> then", | |
| "block_type": "Control", | |
| "block_shape": "C-Block", | |
| "op_code": "control_if", | |
| "functionality": "Executes the blocks inside it only if the specified boolean condition is true. [NOTE: it takes boolean blocks as input]", | |
| "inputs": { | |
| "CONDITION": [ | |
| 2, | |
| None | |
| ], | |
| "SUBSTACK": [ | |
| 2, | |
| None | |
| ] | |
| }, | |
| "fields": {}, | |
| "shadow": False, | |
| "topLevel": True, | |
| "parent": None, | |
| "next": None | |
| }, | |
| "control_wait_1": { | |
| "block_name": "wait () seconds", | |
| "block_type": "Control", | |
| "block_shape": "Stack Block", | |
| "op_code": "control_wait", | |
| "functionality": "Pauses the script for a specified duration.", | |
| "inputs": { | |
| "DURATION": [ | |
| 1, | |
| [ | |
| 5, | |
| "1" | |
| ] | |
| ] | |
| }, | |
| "fields": {}, | |
| "shadow": False, | |
| "topLevel": True, | |
| "parent": None, | |
| "next": None | |
| }, | |
| "sensing_touchingobject_1": { | |
| "block_name": "<touching [edge v]?>", | |
| "block_type": "Sensing", | |
| "op_code": "sensing_touchingobject", | |
| "block_shape": "Boolean Block", | |
| "functionality": "Checks if its sprite is touching the mouse-pointer, edge, or another specified sprite.", | |
| "inputs": { | |
| "TOUCHINGOBJECTMENU": [ | |
| 1, | |
| "sensing_touchingobjectmenu_1" | |
| ] | |
| }, | |
| "fields": {}, | |
| "shadow": False, | |
| "topLevel": True, | |
| "parent": None, | |
| "next": None | |
| }, | |
| "sensing_touchingobjectmenu_1": { | |
| "block_name": "touching object menu", | |
| "block_type": "Sensing", | |
| "block_shape": "Reporter Block", | |
| "op_code": "sensing_touchingobjectmenu", | |
| "functionality": "Menu for touching object block.", | |
| "inputs": {}, | |
| "fields": { | |
| "TOUCHINGOBJECTMENU": [ | |
| "_mouse_", | |
| None | |
| ] | |
| }, | |
| "shadow": True, | |
| "topLevel": False, | |
| "next": None, | |
| "parent": "sensing_touchingobject_1" | |
| } | |
| } | |
| # Process the blocks | |
| processed_blocks = update_and_clean_blocks(all_generated_blocks, generated_output_blocks) | |
| # Print the processed blocks in a readable JSON format | |
| print(json.dumps(processed_blocks, indent=2)) |