File size: 3,466 Bytes
2f92e9e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
def send_to_sandbox(code):
    wrapped_code=f"""
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        ...
    </body>
    </html>
    """
    encoded_html=base64.b64encode(wrapped_code.encode('utf-8')).decode('utf-8')
    data_uri=f"data:text/html;charset=utf-8;base64,{encoded_html}"
    return f'<iframe src="{data_uri}" width="100%" height="920px" sandbox="allow-scripts allow-same-origin allow-forms allow-popups allow-modals allow-presentation" allow="display-capture"></iframe>'

def demo_card_click(e: gr.EventData):
    ...
    return DEMO_LIST[index]['description']

def wrap_html_in_gradio_app(html_code):
    safe_html=html_code.replace('"""',r'\"\"\"')
    return (
        'import gradio as gr\n\n'
        'def show_html():\n'
        f'    return """{safe_html}"""\n\n'
        'demo = gr.Interface(fn=show_html, inputs=None, outputs=gr.HTML())\n\n'
        'if __name__ == "__main__":\n'
        '    demo.launch()\n'
    )

def deploy_to_spaces(code):
    if not code.strip(): return
    app_py=wrap_html_in_gradio_app(code.strip())
    ...
    webbrowser.open_new_tab(full_url)

def wrap_html_in_static_app(html_code):
    return html_code

def deploy_to_spaces_static(code):
    if not code.strip(): return
    app_html=wrap_html_in_static_app(code.strip())
    ...
    webbrowser.open_new_tab(full_url)

def check_hf_space_url(url: str) -> Tuple[bool, Optional[str], Optional[str]]:
    import re
    url_pattern=re.compile(
        r'^(https?://)?(huggingface\.co|hf\.co)/spaces/([\w-]+)/([\w-]+)$',
        re.IGNORECASE
    )
    match=url_pattern.match(url.strip())
    if match:
        return True, match.group(3), match.group(4)
    return False, None, None

def fetch_hf_space_content(username: str, project_name: str) -> str:
    try:
        api=HfApi()
        space_info=api.space_info(f"{username}/{project_name}")
        sdk=space_info.sdk
        ...
        return f"""IMPORTED PROJECT FROM HUGGING FACE SPACE
==============================================
Space: {username}/{project_name}
SDK: {sdk}
Main File: {main_file}
{file_content}"""
    except Exception as e:
        return f"Error fetching space content: {str(e)}"

def load_project_from_url(url: str) -> Tuple[str, str]:
    is_valid,username,project_name=check_hf_space_url(url)
    if not is_valid:
        return "Error: Please enter a valid Hugging Face Spaces URL.\n\nExpected format: https://huggingface.co/spaces/username/project",""
    content=fetch_hf_space_content(username,project_name)
    if content.startswith("Error:"):
        return content,""
    lines=content.split('\n')
    code_start=0
    for i,line in enumerate(lines):
        if line.strip() and not line.startswith(('=','IMPORTED','Space:','SDK:','Main File:')):
            code_start=i
            break
    code_content='\n'.join(lines[code_start:])
    return f"✅ Successfully imported project from {username}/{project_name}",code_content

def deploy_to_user_space(code, space_name, sdk_name, profile=None, token=None):
    import shutil
    if not code.strip():
        return gr.update(value="No code to deploy.", visible=True)
    if profile is None or token is None:
        return gr.update(value="Please log in with your Hugging Face account to deploy to your own Space. Otherwise, use the default deploy (opens in new tab).", visible=True)
    ...
    return gr.update(value=f"✅ {action_text}! [Open your Space here]({space_url})", visible=True)