File size: 5,614 Bytes
b5f1359
 
 
64c9080
b5f1359
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
64c9080
 
 
 
 
 
 
b5f1359
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
64c9080
 
 
 
 
 
 
 
 
 
 
 
 
 
b5f1359
 
 
 
64c9080
 
b5f1359
64c9080
b5f1359
64c9080
b5f1359
 
 
 
 
 
 
 
 
 
 
 
 
 
64c9080
 
 
 
 
 
 
b5f1359
 
 
 
 
 
 
 
 
 
 
 
 
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
133
134
135
136
import gradio as gr
# from TranslationNoteFinder import TranslationNoteFinder
from TranslationNoteFinderLLMOnly import TranslationNoteFinder
from ScriptureReference import ScriptureReference as SR

# Updated dictionary mapping language codes to URLs of Bible text files
bible_urls = {
    'en': 'https://raw.githubusercontent.com/BibleNLP/ebible/main/corpus/eng-engkjvcpb.txt',
    'hi': 'https://raw.githubusercontent.com/BibleNLP/ebible/main/corpus/hin-hin2017.txt',
    'es': 'https://raw.githubusercontent.com/BibleNLP/ebible/main/corpus/spa-spabes.txt',
    'ru': 'https://raw.githubusercontent.com/BibleNLP/ebible/main/corpus/rus-russyn.txt'
}

tnf = None

def load_resources(api_key, lang_code):
    global tnf
    bible_text_url = bible_urls.get(lang_code)
    # 'translation_notes.json'
    # 'translation_notes/tn_ROM.tsv'
    tnf = TranslationNoteFinder(bible_text_url, api_key, lang_code=lang_code)
    return "Language resources loaded successfully.", "", "", ""

def validate_verse_ref(verse_ref):
    verse_ref = SR(verse_ref)
    is_valid = verse_ref.is_valid
    print(f"Verse reference is valid: {is_valid}")
    # return gr.Button.update(interactive=is_valid)
    return gr.Button("Translate", interactive=is_valid)


with gr.Blocks(css="highlightNote.css") as app:
    
    def find_notes(verse_ref):
        global tnf
        if tnf is None:
            return "Please load language resources first.", "", "", ""
        
        # Clear the output fields by returning empty strings
        # yield "", "", "", ""

        results = tnf.verse_notes(verse_ref)
        verse_ref_formatted = f"{results['verse_ref']['bookCode']} {results['verse_ref']['startChapter']}:{results['verse_ref']['startVerse']}"
        
        target_text = results['target_verse_text']
        ngrams_formatted = ""

        line_number = str(results['line_number'])
        # Apply highlights to Greek terms in translation notes
        for i, ngram in enumerate(results['ngrams']):
            note_id = f"note_{i}"
            ngram_text = f"""<span id='{note_id}' 
                            class='note' 
                            data-verse-text='{target_text}' 
                            data-start-pos='{ngram['start_pos']}' 
                            data-end-pos='{ngram['end_pos']}' 
                            onmouseover="
                                const noteElement = document.getElementById('{note_id}');
                                if (noteElement) {{
                                    const highlightedText = `<span class='highlight'>{target_text[ngram['start_pos']:ngram['end_pos']]}</span>`;
                                    const verseTextElement = document.querySelector('.verse-text');
                                    if (verseTextElement) {{
                                        verseTextElement.innerHTML = `{target_text[:ngram['start_pos']]}`
                                            + highlightedText
                                            + `{target_text[ngram['end_pos']:]}`;
                                    }}
                                }}
                            "
                            onmouseout="document.querySelector('.verse-text').innerHTML = '{target_text}'" 
                            >
                            {ngram['source_term']}: {ngram['trans_note']}
                            </span><br><br>"""
            ngrams_formatted += ngram_text

        # Since HTML component is used, all outputs must be strings
        return verse_ref_formatted, target_text, line_number, ngrams_formatted
    
    gr.Markdown(
        """
        # Translation Note Finder
        ## Purpose 
        To align the Greek terms in Unfolding Word's translation notes with the corresponding terms in any target language verse.
        ## Value
        This tool demonstrates the capability to localize translation resources faster or even on the fly.
        ## How to Use
        1. Enter the API key for the OpenAI API.
        2. Select the language code for the Bible text. Load the language.
        3. Enter a verse reference and click "Translate".
        4. Hover over the translation notes to see the equivalent terms highlighted in the target language.
        """
    )
    api_key_input = gr.Textbox(label="API Key", type='password')
    with gr.Row():
        lang_dropdown = gr.Dropdown(choices=list(bible_urls.keys()), label="Language Code")
        load_btn = gr.Button("Load Language")
    verse_input = gr.Textbox(label="Verse Reference", placeholder="e.g. jhn3:16")
    translate_btn = gr.Button("Translate", interactive=False)
    verse_ref_output = gr.Textbox(label="Verse Reference")
    line_number_output = gr.Textbox(label="Line Number", visible=False)
    target_text_output = gr.HTML(label="Target Verse Text", elem_classes=["verse-text"])
    
    notes_output = gr.HTML(label="N-grams") # needs elem_classes?
    
    load_btn.click(
        fn=load_resources, 
        inputs=[
            api_key_input, 
            lang_dropdown], 
        outputs=[
            verse_ref_output, 
            target_text_output, 
            line_number_output, 
            notes_output
            ]
        )
    
    verse_input.change(
        fn=validate_verse_ref, 
        inputs=verse_input, 
        outputs=translate_btn
        )

    translate_btn.click(
        fn=find_notes, 
        inputs=verse_input, 
        outputs=[
            verse_ref_output, 
            target_text_output, 
            line_number_output, 
            notes_output
            ]
        )


app.launch(share=True)