File size: 4,723 Bytes
c115883
8d18f89
c369c5b
0b8de4d
c369c5b
 
 
c115883
2a0d582
8d18f89
60d8ae5
 
 
 
2a0d582
 
8d18f89
60d8ae5
 
 
d2d5258
0f4c765
 
8d18f89
0f4c765
 
 
 
dae80b9
 
0f4c765
 
 
8d18f89
dae80b9
0f4c765
 
 
8d18f89
0f4c765
 
 
 
dae80b9
 
 
 
8d18f89
0f4c765
dae80b9
2a0d582
e03657f
c115883
5efd7b1
8d18f89
 
 
5efd7b1
c369c5b
 
 
1e41501
 
 
 
 
3468d5b
 
1e41501
 
5a98ee7
60d8ae5
 
bb209bb
60d8ae5
0f4c765
5cabe30
5867a9c
1e41501
 
 
 
 
3468d5b
 
1e41501
5cabe30
dae80b9
 
 
 
 
bb209bb
dae80b9
 
 
 
 
 
bb209bb
60d8ae5
 
 
 
 
dae80b9
 
 
60d8ae5
 
 
 
 
dae80b9
 
 
 
 
bb209bb
60d8ae5
 
 
 
 
dae80b9
bb209bb
60d8ae5
 
 
 
 
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
import gradio as gr
from htrflow.volume.volume import Collection
from jinja2 import Environment, FileSystemLoader

_ENV = Environment(loader=FileSystemLoader("app/assets/jinja-templates"))
_IMAGE_TEMPLATE = _ENV.get_template("image")
_TRANSCRIPTION_TEMPLATE = _ENV.get_template("transcription")


def render_image(collection: Collection, current_page_index):
    return _IMAGE_TEMPLATE.render(
        page=collection[current_page_index],
        lines=collection[current_page_index].traverse(lambda node: node.is_line()),
    )


def render_transcription(collection: Collection, current_page_index):
    regions = collection[current_page_index].traverse(
        lambda node: node.children and all(child.is_line() for child in node)
    )
    return _TRANSCRIPTION_TEMPLATE.render(regions=regions)


def toggle_navigation_button(collection: Collection):
    visible = len(collection.pages) > 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.pages)
    return gr.update(interactive=interactive)


def right_button_click(collection: Collection, current_page_index):
    max_index = len(collection.pages) - 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.pages)
    return f"Image {current_page_index + 1} of {n_pages}: `{collection[current_page_index].label}`"


with gr.Blocks() as visualizer:
    gr.Markdown("# Result")
    gr.Markdown(
        "The image to the left shows where HTRflow found text in the image. The transcription can be seen to the right."
    )

    with gr.Row():
        # Annotated image panel
        with gr.Column(scale=2):
            image = gr.HTML(
                label="Annotated image",
                padding=False,
                elem_classes="svg-image",
                container=True,
                max_height="65vh",
                min_height="65vh",
                show_label=True,
            )

            image_caption = gr.Markdown(elem_classes="button-group-viz")
            with gr.Row(elem_classes="button-group-viz"):
                left = gr.Button("← Previous", visible=False, interactive=False, scale=0)
                right = gr.Button("Next →", visible=False, scale=0)

        # Transcription panel
        with gr.Column(scale=1, elem_classes="transcription-column"):
            transcription = gr.HTML(
                label="Transcription",
                show_label=True,
                elem_classes="transcription",
                container=True,
                max_height="65vh",
                min_height="65vh",
            )

    collection = gr.State()
    current_page_index = gr.State(0)

    # Wiring of navigation buttons
    left.click(left_button_click, current_page_index, current_page_index)
    right.click(right_button_click, [collection, current_page_index], current_page_index)

    # Updates on collection change:
    # - update the view
    # - reset the page index (always start on page 0)
    # - toggle visibility of navigation buttons (don't show them for single pages)
    # - update the image caption
    collection.change(render_image, inputs=[collection, current_page_index], outputs=image)
    collection.change(
        render_transcription,
        inputs=[collection, current_page_index],
        outputs=transcription,
    )
    collection.change(lambda _: 0, current_page_index, current_page_index)
    collection.change(toggle_navigation_button, collection, left)
    collection.change(toggle_navigation_button, collection, right)
    collection.change(
        update_image_caption,
        inputs=[collection, current_page_index],
        outputs=image_caption,
    )

    # Updates on page change:
    # - update the view
    # - activate/deactivate buttons
    # - update the image caption
    current_page_index.change(render_image, inputs=[collection, current_page_index], outputs=image)
    current_page_index.change(
        render_transcription,
        inputs=[collection, current_page_index],
        outputs=transcription,
    )
    current_page_index.change(activate_left_button, current_page_index, left)
    current_page_index.change(activate_right_button, [collection, current_page_index], right)
    current_page_index.change(
        update_image_caption,
        inputs=[collection, current_page_index],
        outputs=image_caption,
    )