davidberenstein1957's picture
Add Gradio web interface for code GIF generator
63a30f4
import random
import tempfile
import gradio as gr
from main import create_code_gif
def _create_code_gif(
code: str,
style_name: str = "monokai",
start_color: str = "#FF6B6B",
end_color: str = "#4ECDC4",
title: str = "Code GIF",
favicon: str = "https://huggingface.co/front/assets/huggingface_logo-noborder.svg",
photo: str = "https://photo.jpg",
aspect_ratio: float = 16 / 9,
):
# Convert hex colors to RGB tuples
def parse_color(color: str) -> tuple:
if color.startswith("rgba"):
# Extract numbers from rgba(r, g, b, a) format
values = color.strip("rgba()").split(",")
return tuple(int(float(x)) for x in values[:3]) # Only use RGB values
else:
# Handle hex colors
return tuple(int(color.lstrip("#")[i : i + 2], 16) for i in (0, 2, 4))
start_rgb = parse_color(start_color)
end_rgb = parse_color(end_color)
with tempfile.NamedTemporaryFile(suffix=".gif", delete=False) as tmp:
create_code_gif(
code=code,
output_file=tmp.name,
style=style_name,
gradient_start=start_rgb,
gradient_end=end_rgb,
line_numbers=False,
title=title,
filename="code.py",
favicon=favicon,
photo=photo,
aspect_ratio=aspect_ratio,
)
return tmp.name
code_placeholder = """
def main():
print("Hello, World!")
if __name__ == "__main__":
main()
"""
# Create Gradio interface
def get_random_color():
return f"#{random.randint(0, 0xFFFFFF):06x}"
start_color = get_random_color()
end_color = get_random_color()
with gr.Blocks(title="Python Code GIF Generator") as demo:
gr.Markdown("# Python Code GIF Generator")
gr.Markdown("Generate animated code GIFs with customizable styles and effects")
with gr.Row():
with gr.Column():
gr.Markdown("### Input Settings")
code = gr.Code(
label="Code", lines=10, language="python", value=code_placeholder
)
title = gr.Textbox(
label="Title", value="Code GIF", placeholder="My animated code"
)
with gr.Row(variant="compact"):
style = gr.Dropdown(
choices=[
"monokai",
"dracula",
"nord-darker",
"gruvbox-dark",
"solarized-dark",
"one-dark",
"github-dark",
"material",
"zenburn",
"vs-dark",
"tomorrow-night",
"paraiso-dark",
"native",
"fruity",
"vim",
],
label="Style",
value="monokai",
)
aspect_ratio = gr.Dropdown(
label="Aspect Ratio",
choices=[("Portrait (9:16)", 9 / 16), ("Landscape (16:9)", 16 / 9)],
value=9 / 16,
type="value",
)
with gr.Row(variant="compact"):
start_color_picker = gr.ColorPicker(
label="Start Color", value=start_color
)
end_color_picker = gr.ColorPicker(label="End Color", value=end_color)
refresh_colors = gr.Button("Refresh Colors")
with gr.Row():
photo = gr.Textbox(
label="Photo",
value="https://www.indiewire.com/wp-content/uploads/2017/10/matrix-code.jpg",
placeholder="https://www.indiewire.com/wp-content/uploads/2017/10/matrix-code.jpg",
)
favicon = gr.Textbox(
label="Favicon",
value="https://huggingface.co/front/assets/huggingface_logo-noborder.svg",
placeholder="https://huggingface.co/front/assets/huggingface_logo-noborder.svg",
)
with gr.Row():
submit_btn = gr.Button("Generate GIF")
# Right column - Output display
with gr.Column():
gr.Markdown("### Generated Output")
output_image = gr.Image(label="Generated GIF", type="filepath")
submit_btn.click(
fn=_create_code_gif,
inputs=[
code,
style,
start_color_picker,
end_color_picker,
title,
favicon,
photo,
aspect_ratio,
],
outputs=output_image,
)
gr.on(
[refresh_colors.click, demo.load],
fn=lambda: (get_random_color(), get_random_color()),
inputs=[],
outputs=[start_color_picker, end_color_picker],
)
if __name__ == "__main__":
demo.launch()