Spaces:
Running
on
Zero
Running
on
Zero
import gradio as gr | |
import os | |
import re | |
def get_sorted_files(folder, extensions): | |
"""Retrieve sorted files by numeric value in their names.""" | |
return sorted( | |
[os.path.join(folder, file) for file in os.listdir(folder) if file.lower().endswith(extensions)], | |
key=lambda x: ( | |
int(re.search(r"\d+", os.path.basename(x)).group()) | |
if re.search(r"\d+", os.path.basename(x)) | |
else float("inf") | |
), | |
) | |
def filter_files_by_prefix(files, prefix_pattern): | |
"""Filter files based on a regex prefix pattern.""" | |
return [file for file in files if re.match(prefix_pattern, os.path.basename(file))] | |
def clean_file_names(files, prefix_to_remove): | |
"""Clean filenames by removing a specific prefix if present.""" | |
return [ | |
( | |
os.path.basename(file)[len(prefix_to_remove) :] | |
if os.path.basename(file).startswith(prefix_to_remove) | |
else os.path.basename(file) | |
) | |
for file in files | |
] | |
def get_yaml_content(yaml_path): | |
"""Read and return YAML content from a file.""" | |
if os.path.isfile(yaml_path): | |
with open(yaml_path, "r") as file: | |
return file.read() | |
return "YAML content not available" | |
# Folder Paths | |
TEMPLATE_IMAGE_FOLDER = "app/assets/images" | |
TEMPLATE_YAML_FOLDER = "app/assets/templates" | |
# File Retrieval | |
image_files = get_sorted_files(TEMPLATE_IMAGE_FOLDER, (".png", ".jpg", ".jpeg", ".webp")) | |
yaml_files = get_sorted_files(TEMPLATE_YAML_FOLDER, (".yaml",)) | |
# Categorize YAML Files | |
yaml_files_numbered = filter_files_by_prefix(yaml_files, r"^\d") | |
yaml_files_c_letter = filter_files_by_prefix(yaml_files, r"^[cC]") | |
# Create Mappings | |
name_yaml_files_c_letter_cleaned = clean_file_names(yaml_files_c_letter, "c_") | |
name_to_yaml_map = dict(zip(name_yaml_files_c_letter_cleaned, yaml_files_c_letter)) | |
def get_yaml_content(yaml_path): | |
if yaml_path and os.path.isfile(yaml_path): | |
with open(yaml_path, "r") as file: | |
return file.read() | |
return "YAML content not available" | |
with gr.Blocks() as templating_block: | |
with gr.Row(variant="panel"): | |
with gr.Column(scale=2): | |
with gr.Row(): | |
dropdown_selection_template = gr.Dropdown( | |
label="Choose template", | |
info="template info", | |
value="Simple", | |
choices=["Simple", "Nested", "Custom"], | |
multiselect=False, | |
interactive=True, | |
) | |
custom_dropdown_selection_template = gr.Dropdown( | |
label="Custom template", | |
info="Choice a different custom templates...", | |
value=name_yaml_files_c_letter_cleaned[0], | |
choices=name_yaml_files_c_letter_cleaned, | |
multiselect=False, | |
interactive=True, | |
visible=False, | |
) | |
with gr.Group(): | |
with gr.Row(): | |
with gr.Column(scale=1): | |
template_image = gr.Image(label="Example Templates", value=image_files[0], height=400) | |
with gr.Column(scale=1): | |
template_output_yaml_code = gr.Code( | |
language="yaml", | |
label="Pipeline", | |
interactive=True, | |
visible=True, | |
) | |
docs_link = gr.HTML( | |
value='<p><a href="https://ai-riksarkivet.github.io/htrflow/latest/getting_started/pipeline.html#example-pipelines" target="_blank">📚 Click here 📚</a> for a detailed description on how to customize the configuration for HTRflow</p>', | |
visible=True, | |
) | |
def on_template_select(dropdown_selection_template): | |
if dropdown_selection_template == "Simple": | |
yaml_content = get_yaml_content(yaml_files_numbered[0]) | |
return image_files[0], yaml_content, gr.update(visible=False) | |
elif dropdown_selection_template == "Nested": | |
yaml_content = get_yaml_content(yaml_files_numbered[1]) | |
return image_files[1], yaml_content, gr.update(visible=False) | |
elif dropdown_selection_template == "Custom": | |
yaml_content = get_yaml_content(yaml_files_c_letter[0]) | |
return image_files[2], yaml_content, gr.update(visible=True) | |
else: | |
return gr.Error(f"{dropdown_selection_template} - is not a valid Template selection") | |
def on_custom_template_select(custom_template_selection): | |
yaml_path = name_to_yaml_map.get(custom_template_selection) | |
if yaml_path: | |
yaml_content = get_yaml_content(yaml_path) | |
return yaml_content | |
else: | |
return gr.Error(f"{custom_template_selection} - is not a valid Custom Template selection") | |
def check_for_custom_template(dropdown_selection_template): | |
if dropdown_selection_template == "Custom": | |
return gr.update(visible=True) | |
else: | |
return gr.skip() | |
templating_block.load( | |
fn=on_template_select, | |
inputs=dropdown_selection_template, | |
outputs=[ | |
template_image, | |
template_output_yaml_code, | |
custom_dropdown_selection_template, | |
], | |
) | |