import os import gradio as gr from jinja2 import Environment, FileSystemLoader from typing_extensions import TypeAlias _ENV = Environment(loader=FileSystemLoader("app/assets/jinja-templates")) _IMAGE_TEMPLATE = _ENV.get_template("image.j2") from typing import NamedTuple, TypeAlias class TableCell(NamedTuple): polygon: tuple[tuple[int, int], ...] text_x: int text_y: int text: str class Page(NamedTuple): width: int height: int cells: list[TableCell] path: str Collection: TypeAlias = list[Page] def render_image(collection: Collection, current_page_index: int) -> str: return _IMAGE_TEMPLATE.render( page=collection[current_page_index], ) def toggle_navigation_button(collection: Collection): visible = len(collection) > 1 return gr.update(visible=visible) def activate_left_button(current_page_index): interactive = current_page_index > 0 return gr.update(interactive=interactive) def activate_right_button(collection: Collection, current_page_index): interactive = current_page_index + 1 < len(collection) return gr.update(interactive=interactive) def right_button_click(collection: Collection, current_page_index): max_index = len(collection) - 1 return min(max_index, current_page_index + 1) def left_button_click(current_page_index): return max(0, current_page_index - 1) def update_image_caption(collection: Collection, current_page_index): n_pages = len(collection) label = os.path.split(collection[current_page_index].path)[-1] return f"image {current_page_index + 1} of {n_pages}: `{label}`"