Spaces:
Runtime error
Runtime error
File size: 7,660 Bytes
a522962 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 |
import json
import secrets
import string
from collections import defaultdict
def generate_secure_token(length=20):
charset = string.ascii_letters + string.digits + "!@#$%^&*()[]{}=+-_~"
return ''.join(secrets.choice(charset) for _ in range(length))
def process_scratch_blocks(all_generated_blocks, generated_output_json):
processed_blocks = {}
# Initialize dictionaries to store and reuse generated unique IDs
# This prevents creating multiple unique IDs for the same variable/broadcast across different blocks
variable_id_map = defaultdict(lambda: generate_secure_token(20))
broadcast_id_map = defaultdict(lambda: generate_secure_token(20))
for block_id, gen_block_data in generated_output_json.items():
processed_block = {}
all_gen_block_data = all_generated_blocks.get(block_id, {})
# Copy and update fields, inputs, next, parent, shadow, topLevel, mutation, and opcode
processed_block["opcode"] = all_gen_block_data.get("op_code", gen_block_data.get("op_code"))
processed_block["inputs"] = {}
processed_block["fields"] = {}
processed_block["shadow"] = all_gen_block_data.get("shadow", gen_block_data.get("shadow"))
processed_block["topLevel"] = all_gen_block_data.get("topLevel", gen_block_data.get("topLevel"))
processed_block["parent"] = all_gen_block_data.get("parent", gen_block_data.get("parent"))
processed_block["next"] = all_gen_block_data.get("next", gen_block_data.get("next"))
if "mutation" in all_gen_block_data:
processed_block["mutation"] = all_gen_block_data["mutation"]
# Process inputs
if "inputs" in all_gen_block_data:
for input_name, input_data in all_gen_block_data["inputs"].items():
if input_name in ["SUBSTACK", "CONDITION"]:
# These should always be type 2
if isinstance(input_data, list) and len(input_data) == 2:
processed_block["inputs"][input_name] = [2, input_data[1]]
elif isinstance(input_data, dict) and input_data.get("kind") == "block":
processed_block["inputs"][input_name] = [2, input_data.get("block")]
else: # Fallback for unexpected formats, try to use the original if possible
processed_block["inputs"][input_name] = gen_block_data["inputs"].get(input_name, [2, None])
elif isinstance(input_data, dict):
if input_data.get("kind") == "value":
# Case 1: Direct value input
processed_block["inputs"][input_name] = [
1,
[
4,
str(input_data.get("value", ""))
]
]
elif input_data.get("kind") == "block":
# Case 3: Nested block input
existing_shadow_value = ""
if input_name in gen_block_data.get("inputs", {}) and \
isinstance(gen_block_data["inputs"][input_name], list) and \
len(gen_block_data["inputs"][input_name]) > 2 and \
isinstance(gen_block_data["inputs"][input_name][2], list) and \
len(gen_block_data["inputs"][input_name][2]) > 1:
existing_shadow_value = gen_block_data["inputs"][input_name][2][1]
processed_block["inputs"][input_name] = [
3,
input_data.get("block", ""),
[
10, # Assuming 10 for number/string shadow
existing_shadow_value
]
]
elif input_data.get("kind") == "menu":
# Handle menu inputs like in event_broadcast
menu_option = input_data.get("option", "")
# Generate or retrieve a unique ID for the broadcast message
broadcast_id = broadcast_id_map[menu_option] # Use defaultdict for unique IDs
processed_block["inputs"][input_name] = [
1,
[
11, # This is typically the code for menu dropdowns
menu_option,
broadcast_id
]
]
elif isinstance(input_data, list):
# For cases like TOUCHINGOBJECTMENU, where input_data is a list [1, "block_id"]
processed_block["inputs"][input_name] = input_data
# Process fields
if "fields" in all_gen_block_data:
for field_name, field_value in all_gen_block_data["fields"].items():
if field_name == "VARIABLE" and isinstance(field_value, list) and len(field_value) > 0:
# Generate or retrieve a unique ID for the variable
variable_name = field_value[0]
unique_id = variable_id_map[variable_name] # Use defaultdict for unique IDs
processed_block["fields"][field_name] = [
variable_name,
unique_id
]
elif field_name == "STOP_OPTION":
processed_block["fields"][field_name] = [
field_value[0],
None
]
elif field_name == "TOUCHINGOBJECTMENU":
referenced_menu_block_id = all_gen_block_data["inputs"].get("TOUCHINGOBJECTMENU", [None, None])[1]
if referenced_menu_block_id and referenced_menu_block_id in all_generated_blocks:
menu_block = all_generated_blocks[referenced_menu_block_id]
menu_value = menu_block.get("fields", {}).get("TOUCHINGOBJECTMENU", ["", None])[0]
processed_block["fields"][field_name] = [menu_value, None]
else:
processed_block["fields"][field_name] = [field_value[0], None]
else:
processed_block["fields"][field_name] = field_value
# Remove unwanted keys from the processed block
keys_to_remove = ["functionality", "block_shape", "id", "block_name", "block_type"]
for key in keys_to_remove:
if key in processed_block:
del processed_block[key]
processed_blocks[block_id] = processed_block
return processed_blocks
# Path to your JSON file
if __name__ == "__main__":
all_generated_blocks_path = 'all_generated_blocks.json'
generated_output_json_path = 'generated_output_json.json'
# Open and load the JSON files into Python dictionaries
with open(all_generated_blocks_path, 'r') as f:
all_generated_blocks_data = json.load(f)
with open(generated_output_json_path, 'r') as f:
generated_output_json_data = json.load(f)
processed_blocks = process_scratch_blocks(all_generated_blocks_data, generated_output_json_data)
print(json.dumps(processed_blocks, indent=4)) |