Spaces:
Paused
Paused
Update app.py
Browse files
app.py
CHANGED
|
@@ -525,22 +525,48 @@ def deploy_to_vercel(code: str):
|
|
| 525 |
|
| 526 |
def remove_code_block(text):
|
| 527 |
"""
|
| 528 |
-
|
| 529 |
"""
|
| 530 |
-
|
|
|
|
| 531 |
match = re.search(pattern, text, re.DOTALL)
|
| 532 |
if match:
|
| 533 |
return match.group(1).strip()
|
| 534 |
-
|
| 535 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 536 |
|
| 537 |
def send_to_sandbox(code):
|
| 538 |
"""
|
| 539 |
-
|
| 540 |
"""
|
| 541 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 542 |
data_uri = f"data:text/html;charset=utf-8;base64,{encoded_html}"
|
| 543 |
-
return f
|
| 544 |
|
| 545 |
def boost_prompt(prompt: str) -> str:
|
| 546 |
"""
|
|
@@ -605,6 +631,36 @@ def history_render(history: History):
|
|
| 605 |
"""
|
| 606 |
return gr.update(open=True), history
|
| 607 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 608 |
|
| 609 |
# ------------------------
|
| 610 |
# 6) 데모 클래스
|
|
@@ -685,10 +741,11 @@ class Demo:
|
|
| 685 |
}])
|
| 686 |
|
| 687 |
# 최종 결과(코드) + 샌드박스 미리보기
|
|
|
|
| 688 |
yield [
|
| 689 |
collected_content,
|
| 690 |
_history,
|
| 691 |
-
send_to_sandbox(
|
| 692 |
gr.update(active_key="render"),
|
| 693 |
gr.update(open=True)
|
| 694 |
]
|
|
@@ -912,7 +969,9 @@ with gr.Blocks(css_paths=["app.css"], theme=theme) as demo:
|
|
| 912 |
input_text = antd.InputTextarea(
|
| 913 |
size="large",
|
| 914 |
allow_clear=True,
|
| 915 |
-
placeholder=random.choice(DEMO_LIST)['description']
|
|
|
|
|
|
|
| 916 |
)
|
| 917 |
gr.HTML('<div class="help-text">💡 원하는 게임의 설명을 입력하세요. 예: "Create a platformer game with jumping mechanics"</div>')
|
| 918 |
|
|
@@ -991,18 +1050,6 @@ with gr.Blocks(css_paths=["app.css"], theme=theme) as demo:
|
|
| 991 |
)
|
| 992 |
|
| 993 |
# (G) 'Code실행' 버튼 => 미리보기 iframe 로드
|
| 994 |
-
def execute_code(query: str):
|
| 995 |
-
if not query or query.strip() == '':
|
| 996 |
-
return None, gr.update(active_key="empty")
|
| 997 |
-
try:
|
| 998 |
-
if '```html' in query and '```' in query:
|
| 999 |
-
code = remove_code_block(query)
|
| 1000 |
-
else:
|
| 1001 |
-
code = query.strip()
|
| 1002 |
-
return send_to_sandbox(code), gr.update(active_key="render")
|
| 1003 |
-
except Exception:
|
| 1004 |
-
return None, gr.update(active_key="empty")
|
| 1005 |
-
|
| 1006 |
execute_btn.click(
|
| 1007 |
fn=execute_code,
|
| 1008 |
inputs=[input_text],
|
|
|
|
| 525 |
|
| 526 |
def remove_code_block(text):
|
| 527 |
"""
|
| 528 |
+
More robust function to extract code from markdown code blocks
|
| 529 |
"""
|
| 530 |
+
# First try to find ```html blocks
|
| 531 |
+
pattern = r'```html\s*([\s\S]+?)\s*```'
|
| 532 |
match = re.search(pattern, text, re.DOTALL)
|
| 533 |
if match:
|
| 534 |
return match.group(1).strip()
|
| 535 |
+
|
| 536 |
+
# If no html block found, try any code block
|
| 537 |
+
pattern = r'```(?:\w+)?\s*([\s\S]+?)\s*```'
|
| 538 |
+
match = re.search(pattern, text, re.DOTALL)
|
| 539 |
+
if match:
|
| 540 |
+
return match.group(1).strip()
|
| 541 |
+
|
| 542 |
+
# If no code block, return the original text (might be raw code)
|
| 543 |
+
return text.strip()
|
| 544 |
|
| 545 |
def send_to_sandbox(code):
|
| 546 |
"""
|
| 547 |
+
Improved function to create iframe with proper code cleaning
|
| 548 |
"""
|
| 549 |
+
# Make sure we have clean code without markdown delimiters
|
| 550 |
+
clean_code = remove_code_block(code)
|
| 551 |
+
|
| 552 |
+
# Ensure the code has basic HTML structure if it's missing
|
| 553 |
+
if not clean_code.strip().startswith('<!DOCTYPE') and not clean_code.strip().startswith('<html'):
|
| 554 |
+
clean_code = f"""<!DOCTYPE html>
|
| 555 |
+
<html>
|
| 556 |
+
<head>
|
| 557 |
+
<meta charset="UTF-8">
|
| 558 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 559 |
+
<title>Game Preview</title>
|
| 560 |
+
</head>
|
| 561 |
+
<body>
|
| 562 |
+
{clean_code}
|
| 563 |
+
</body>
|
| 564 |
+
</html>"""
|
| 565 |
+
|
| 566 |
+
# Create data URI for iframe
|
| 567 |
+
encoded_html = base64.b64encode(clean_code.encode('utf-8')).decode('utf-8')
|
| 568 |
data_uri = f"data:text/html;charset=utf-8;base64,{encoded_html}"
|
| 569 |
+
return f'<iframe src="{data_uri}" width="100%" height="920px" style="border:none;"></iframe>'
|
| 570 |
|
| 571 |
def boost_prompt(prompt: str) -> str:
|
| 572 |
"""
|
|
|
|
| 631 |
"""
|
| 632 |
return gr.update(open=True), history
|
| 633 |
|
| 634 |
+
def execute_code(query: str):
|
| 635 |
+
"""
|
| 636 |
+
Improved function to execute code directly from input
|
| 637 |
+
"""
|
| 638 |
+
if not query or query.strip() == '':
|
| 639 |
+
return None, gr.update(active_key="empty")
|
| 640 |
+
try:
|
| 641 |
+
# Handle markdown code blocks or raw code
|
| 642 |
+
clean_code = remove_code_block(query)
|
| 643 |
+
|
| 644 |
+
# Add HTML structure if it's just a fragment
|
| 645 |
+
if not clean_code.strip().startswith('<!DOCTYPE') and not clean_code.strip().startswith('<html'):
|
| 646 |
+
if not ('<body' in clean_code and '</body>' in clean_code):
|
| 647 |
+
clean_code = f"""<!DOCTYPE html>
|
| 648 |
+
<html>
|
| 649 |
+
<head>
|
| 650 |
+
<meta charset="UTF-8">
|
| 651 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 652 |
+
<title>Game Preview</title>
|
| 653 |
+
</head>
|
| 654 |
+
<body>
|
| 655 |
+
{clean_code}
|
| 656 |
+
</body>
|
| 657 |
+
</html>"""
|
| 658 |
+
|
| 659 |
+
return send_to_sandbox(clean_code), gr.update(active_key="render")
|
| 660 |
+
except Exception as e:
|
| 661 |
+
print(f"Execute code error: {str(e)}")
|
| 662 |
+
return None, gr.update(active_key="empty")
|
| 663 |
+
|
| 664 |
|
| 665 |
# ------------------------
|
| 666 |
# 6) 데모 클래스
|
|
|
|
| 741 |
}])
|
| 742 |
|
| 743 |
# 최종 결과(코드) + 샌드박스 미리보기
|
| 744 |
+
clean_code = remove_code_block(collected_content)
|
| 745 |
yield [
|
| 746 |
collected_content,
|
| 747 |
_history,
|
| 748 |
+
send_to_sandbox(clean_code),
|
| 749 |
gr.update(active_key="render"),
|
| 750 |
gr.update(open=True)
|
| 751 |
]
|
|
|
|
| 969 |
input_text = antd.InputTextarea(
|
| 970 |
size="large",
|
| 971 |
allow_clear=True,
|
| 972 |
+
placeholder=random.choice(DEMO_LIST)['description'],
|
| 973 |
+
rows=10, # 입력창 높이 증가
|
| 974 |
+
max_length=100000 # 입력 최대 길이 증가
|
| 975 |
)
|
| 976 |
gr.HTML('<div class="help-text">💡 원하는 게임의 설명을 입력하세요. 예: "Create a platformer game with jumping mechanics"</div>')
|
| 977 |
|
|
|
|
| 1050 |
)
|
| 1051 |
|
| 1052 |
# (G) 'Code실행' 버튼 => 미리보기 iframe 로드
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1053 |
execute_btn.click(
|
| 1054 |
fn=execute_code,
|
| 1055 |
inputs=[input_text],
|