Spaces:
Running
Running
File size: 5,146 Bytes
a383d0e edb694c a383d0e edb694c a383d0e |
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 |
import subprocess
import sys
import os
import json
# A simple placeholder for prompt injection
# In a real scenario, this should be a more robust mechanism
def inject_prompt_to_generator(prompt_text):
if not prompt_text:
return
# In this example, we assume the prompt is a simple string for the "main content"
# A more complex implementation would parse a structured prompt
user_instruction = {
"sidebar": "Make all icons look better; fill in relevant English text; beautify the layout.",
"header": "Make the Google logo look better; change the avatar color to be more appealing.",
"navigation": "Please beautify the layout.",
"main content": prompt_text
}
generator_path = os.path.join(os.path.dirname(__file__), 'html_generator.py')
with open(generator_path, 'r', encoding='utf-8') as f:
lines = f.readlines()
# Find the user_instruction dictionary and replace it
new_lines = []
in_dict = False
for line in lines:
if 'user_instruction = {' in line:
in_dict = True
new_lines.append(f"user_instruction = {json.dumps(user_instruction, indent=4)}\n")
elif in_dict and '}' in line:
in_dict = False
continue # Skip the closing brace of the old dict
elif not in_dict:
new_lines.append(line)
with open(generator_path, 'w', encoding='utf-8') as f:
f.writelines(new_lines)
def run_script(script_path):
script_path = os.path.normpath(script_path)
print(f"\n{'='*20}")
print(f"Executing: python {script_path}")
print(f"{'='*20}")
try:
result = subprocess.run(
[sys.executable, script_path],
check=True,
capture_output=True,
text=True
)
print("Success!")
print("Output:")
print(result.stdout)
if result.stderr:
print("Stderr:")
print(result.stderr)
except FileNotFoundError:
print(f"ERROR: Script not found at '{script_path}'")
sys.exit(1)
except subprocess.CalledProcessError as e:
print(f"ERROR: Script '{script_path}' failed with exit code {e.returncode}")
print("Stdout:")
print(e.stdout)
print("Stderr:")
print(e.stderr)
sys.exit(1)
except Exception as e:
print(f"An unexpected error occurred while running '{script_path}': {e}")
sys.exit(1)
def generate_html_for_demo(image_path, prompt, output_dir="screencoder/data/output"):
"""
A modified workflow for the Gradio demo.
It takes an image path and a prompt, and returns the path to the final HTML file.
"""
print("Starting the Screencoder demo workflow...")
# Setup paths
project_root = os.path.dirname(__file__)
# The block_parsor script expects a specific input file name, so we must place our image there.
# IMPORTANT: This assumes a single-user-at-a-time workflow.
# For multi-user, you'd need isolated temp directories.
target_input_path = os.path.join(project_root, "data/input/test1.png")
# Ensure the input directory exists
os.makedirs(os.path.dirname(target_input_path), exist_ok=True)
# Copy the user-uploaded image to the location the script expects
import shutil
shutil.copy(image_path, target_input_path)
# --- Part 1: Initial Generation with Placeholders ---
print("\n--- Part 1: Initial Generation with Placeholders ---")
inject_prompt_to_generator(prompt)
run_script(os.path.join(project_root, "block_parsor.py"))
run_script(os.path.join(project_root, "html_generator.py"))
# --- Part 2: Final HTML Code Generation ---
print("\n--- Part 2: Final HTML Code Generation ---")
run_script(os.path.join(project_root, "image_box_detection.py"))
run_script(os.path.join(project_root, "UIED/run_single.py"))
run_script(os.path.join(project_root, "mapping.py"))
run_script(os.path.join(project_root, "image_replacer.py"))
final_html_path = os.path.join(output_dir, "test1_layout_final.html")
print(f"\nScreencoder demo workflow completed! Final HTML at: {final_html_path}")
# Check if the final file exists
if os.path.exists(final_html_path):
with open(final_html_path, 'r', encoding='utf-8') as f:
return f.read()
else:
return "<html><body><h1>Error: Final HTML not generated.</h1></body></html>"
def main():
"""Main function to run the entire Screencoder workflow."""
print("Starting the Screencoder full workflow...")
# --- Part 1: Initial Generation with Placeholders ---
print("\n--- Part 1: Initial Generation with Placeholders ---")
run_script("block_parsor.py")
run_script("html_generator.py")
# --- Part 2: Final HTML Code Generation ---
print("\n--- Part 2: Final HTML Code Generation ---")
run_script("image_box_detection.py")
run_script("UIED/run_single.py")
run_script("mapping.py")
run_script("image_replacer.py")
print("\nScreencoder workflow completed successfully!")
if __name__ == "__main__":
main() |