From 867ff3c646d5c8fbad303c81ebf6a586237c5e84 Mon Sep 17 00:00:00 2001 From: linearcombination <4829djaskdfj@gmail.com> Date: Mon, 24 Nov 2025 15:33:27 -0800 Subject: [PATCH 1/6] Remove book_code attribute from TWBook Translation words are scoped by language and not by book. This could have been changed a long time ago, but it was doing no harm. Just cleaning up the design a bit. --- ...ly_strategies_book_then_lang_by_chapter.py | 29 ++++++------------- ...ly_strategies_lang_then_book_by_chapter.py | 10 ++----- ...ly_strategies_book_then_lang_by_chapter.py | 18 ++++-------- ...ly_strategies_lang_then_book_by_chapter.py | 18 ++---------- backend/doc/domain/model.py | 1 - backend/doc/domain/parsing.py | 1 - 6 files changed, 19 insertions(+), 58 deletions(-) diff --git a/backend/doc/domain/assembly_strategies/assembly_strategies_book_then_lang_by_chapter.py b/backend/doc/domain/assembly_strategies/assembly_strategies_book_then_lang_by_chapter.py index 61f6a778..bc37c4a7 100644 --- a/backend/doc/domain/assembly_strategies/assembly_strategies_book_then_lang_by_chapter.py +++ b/backend/doc/domain/assembly_strategies/assembly_strategies_book_then_lang_by_chapter.py @@ -67,7 +67,6 @@ def assemble_content_by_chapter( {usfm_book.book_code for usfm_book in usfm_books} .union(tn_book.book_code for tn_book in tn_books) .union(tq_book.book_code for tq_book in tq_books) - .union(tw_book.book_code for tw_book in tw_books) .union(bc_book.book_code for bc_book in bc_books) .union(rg_book.book_code for rg_book in rg_books) ) @@ -85,9 +84,6 @@ def assemble_content_by_chapter( selected_tq_books = [ tq_book for tq_book in tq_books if tq_book.book_code == book_code ] - selected_tw_books = [ - tw_book for tw_book in tw_books if tw_book.book_code == book_code - ] selected_bc_books = [ bc_book for bc_book in bc_books if bc_book.book_code == book_code ] @@ -103,7 +99,7 @@ def assemble_content_by_chapter( selected_usfm_books, selected_tn_books, selected_tq_books, - selected_tw_books, + tw_books, selected_bc_books, selected_rg_books, use_section_visual_separator, @@ -127,7 +123,7 @@ def assemble_content_by_chapter( selected_usfm_books, selected_tn_books, selected_tq_books, - selected_tw_books, + tw_books, selected_bc_books, selected_rg_books, use_section_visual_separator, @@ -152,7 +148,7 @@ def assemble_content_by_chapter( selected_usfm_books, selected_tn_books, selected_tq_books, - selected_tw_books, + tw_books, selected_bc_books, selected_rg_books, use_section_visual_separator, @@ -166,7 +162,7 @@ def assemble_content_by_chapter( not selected_usfm_books and not selected_tn_books and not selected_tq_books - and (selected_tw_books or selected_bc_books or selected_rg_books) + and (tw_books or selected_bc_books or selected_rg_books) and ( assembly_layout_kind == AssemblyLayoutEnum.ONE_COLUMN or assembly_layout_kind == AssemblyLayoutEnum.ONE_COLUMN_COMPACT @@ -177,7 +173,7 @@ def assemble_content_by_chapter( selected_usfm_books, selected_tn_books, selected_tq_books, - selected_tw_books, + tw_books, selected_bc_books, selected_rg_books, use_section_visual_separator, @@ -194,7 +190,7 @@ def assemble_content_by_chapter( selected_usfm_books, selected_tn_books, selected_tq_books, - selected_tw_books, + tw_books, selected_bc_books, selected_rg_books, use_section_visual_separator, @@ -364,13 +360,8 @@ def assemble_usfm_by_chapter( ): content.append(hr) # Add list of tw words used in chapter - selected_tw_books = [ - tw_book - for tw_book in tw_books - if tw_book.book_code == book_code - ] - if selected_tw_books: - tw_book = selected_tw_books[0] + if tw_books: + tw_book = tw_books[0] words = translation_words_for_content( tw_book, usfm_book.chapters[chapter_num].content ) @@ -561,9 +552,7 @@ def assemble_usfm_by_verse_chapter_at_a_time( if tq_book.book_code == book_code and tq_book.lang_code == lang_code ] selected_tw_books = [ - tw_book - for tw_book in tw_books - if tw_book.book_code == book_code and tw_book.lang_code == lang_code + tw_book for tw_book in tw_books if tw_book.lang_code == lang_code ] usfm_book = None usfm_book2 = None diff --git a/backend/doc/domain/assembly_strategies/assembly_strategies_lang_then_book_by_chapter.py b/backend/doc/domain/assembly_strategies/assembly_strategies_lang_then_book_by_chapter.py index 2bf607f8..a1329804 100755 --- a/backend/doc/domain/assembly_strategies/assembly_strategies_lang_then_book_by_chapter.py +++ b/backend/doc/domain/assembly_strategies/assembly_strategies_lang_then_book_by_chapter.py @@ -72,7 +72,6 @@ def assemble_content_by_book( {usfm_book.book_code for usfm_book in usfm_books} .union(tn_book.book_code for tn_book in tn_books) .union(tq_book.book_code for tq_book in tq_books) - .union(tw_book.book_code for tw_book in tw_books) .union(bc_book.book_code for bc_book in bc_books) .union(rg_book.book_code for rg_book in rg_books) ) @@ -115,9 +114,7 @@ def assemble_content_by_book( ] tq_book = selected_tq_books[0] if selected_tq_books else None selected_tw_books = [ - tw_book - for tw_book in tw_books - if tw_book.lang_code == lang_code and tw_book.book_code == book_code + tw_book for tw_book in tw_books if tw_book.lang_code == lang_code ] tw_book = selected_tw_books[0] if selected_tw_books else None selected_bc_books = [ @@ -247,7 +244,6 @@ def assemble_content_by_verse_book_at_a_time( {usfm_book.book_code for usfm_book in usfm_books} .union(tn_book.book_code for tn_book in tn_books) .union(tq_book.book_code for tq_book in tq_books) - .union(tw_book.book_code for tw_book in tw_books) .union(bc_book.book_code for bc_book in bc_books) .union(rg_book.book_code for rg_book in rg_books) ) @@ -292,9 +288,7 @@ def assemble_content_by_verse_book_at_a_time( ] tq_book = selected_tq_books[0] if selected_tq_books else None selected_tw_books = [ - tw_book - for tw_book in tw_books - if tw_book.lang_code == lang_code and tw_book.book_code == book_code + tw_book for tw_book in tw_books if tw_book.lang_code == lang_code ] tw_book = selected_tw_books[0] if selected_tw_books else None selected_bc_books = [ diff --git a/backend/doc/domain/assembly_strategies_docx/assembly_strategies_book_then_lang_by_chapter.py b/backend/doc/domain/assembly_strategies_docx/assembly_strategies_book_then_lang_by_chapter.py index 89aeee6f..8d04c23e 100644 --- a/backend/doc/domain/assembly_strategies_docx/assembly_strategies_book_then_lang_by_chapter.py +++ b/backend/doc/domain/assembly_strategies_docx/assembly_strategies_book_then_lang_by_chapter.py @@ -60,7 +60,6 @@ def assemble_content_by_chapter( [usfm_book.book_code for usfm_book in usfm_books], [tn_book.book_code for tn_book in tn_books], [tq_book.book_code for tq_book in tq_books], - [tw_book.book_code for tw_book in tw_books], [bc_book.book_code for bc_book in bc_books], [rg_book.book_code for rg_book in rg_books], ], @@ -79,9 +78,6 @@ def assemble_content_by_chapter( selected_tq_books = [ tq_book for tq_book in tq_books if tq_book.book_code == book_code ] - selected_tw_books = [ - tw_book for tw_book in tw_books if tw_book.book_code == book_code - ] selected_bc_books = [ bc_book for bc_book in bc_books if bc_book.book_code == book_code ] @@ -94,7 +90,7 @@ def assemble_content_by_chapter( selected_usfm_books, selected_tn_books, selected_tq_books, - selected_tw_books, + tw_books, selected_bc_books, selected_rg_books, use_section_visual_separator, @@ -111,7 +107,7 @@ def assemble_content_by_chapter( selected_usfm_books, selected_tn_books, selected_tq_books, - selected_tw_books, + tw_books, selected_bc_books, selected_rg_books, use_section_visual_separator, @@ -128,7 +124,7 @@ def assemble_content_by_chapter( selected_usfm_books, selected_tn_books, selected_tq_books, - selected_tw_books, + tw_books, selected_bc_books, selected_rg_books, use_section_visual_separator, @@ -142,14 +138,14 @@ def assemble_content_by_chapter( not selected_usfm_books and not selected_tn_books and not selected_tq_books - and (selected_tw_books or selected_bc_books or selected_rg_books) + and (tw_books or selected_bc_books or selected_rg_books) ): document_parts.extend( assemble_tw_by_chapter( selected_usfm_books, selected_tn_books, selected_tq_books, - selected_tw_books, + tw_books, selected_bc_books, selected_rg_books, use_section_visual_separator, @@ -642,9 +638,7 @@ def assemble_usfm_by_verse_chapter_at_a_time( if tq_book.book_code == book_code and tq_book.lang_code == lang_code ] selected_tw_books = [ - tw_book - for tw_book in tw_books - if tw_book.book_code == book_code and tw_book.lang_code == lang_code + tw_book for tw_book in tw_books if tw_book.lang_code == lang_code ] usfm_book = None usfm_book2 = None diff --git a/backend/doc/domain/assembly_strategies_docx/assembly_strategies_lang_then_book_by_chapter.py b/backend/doc/domain/assembly_strategies_docx/assembly_strategies_lang_then_book_by_chapter.py index a0a16619..6844d070 100755 --- a/backend/doc/domain/assembly_strategies_docx/assembly_strategies_lang_then_book_by_chapter.py +++ b/backend/doc/domain/assembly_strategies_docx/assembly_strategies_lang_then_book_by_chapter.py @@ -70,7 +70,6 @@ def assemble_content_by_book( {usfm_book.book_code for usfm_book in usfm_books} .union(tn_book.book_code for tn_book in tn_books) .union(tq_book.book_code for tq_book in tq_books) - .union(tw_book.book_code for tw_book in tw_books) .union(bc_book.book_code for bc_book in bc_books) .union(rg_book.book_code for rg_book in rg_books) ) @@ -115,14 +114,8 @@ def assemble_content_by_book( if tq_book.lang_code == lang_code and tq_book.book_code == book_code ] tq_book = selected_tq_books[0] if selected_tq_books else None - # TODO TWBook doesn't really need to have a book_code attribute - # because TW resources are language centric not book centric. - # We could do something about that later if desired for - # design cleanness sake. selected_tw_books = [ - tw_book - for tw_book in tw_books - if tw_book.lang_code == lang_code and tw_book.book_code == book_code + tw_book for tw_book in tw_books if tw_book.lang_code == lang_code ] tw_book = selected_tw_books[0] if selected_tw_books else None selected_bc_books = [ @@ -251,7 +244,6 @@ def assemble_content_by_verse_book_at_a_time( {usfm_book.book_code for usfm_book in usfm_books} .union(tn_book.book_code for tn_book in tn_books) .union(tq_book.book_code for tq_book in tq_books) - .union(tw_book.book_code for tw_book in tw_books) .union(bc_book.book_code for bc_book in bc_books) .union(rg_book.book_code for rg_book in rg_books) ) @@ -292,14 +284,8 @@ def assemble_content_by_verse_book_at_a_time( if tq_book.lang_code == lang_code and tq_book.book_code == book_code ] tq_book = selected_tq_books[0] if selected_tq_books else None - # TODO TWBook doesn't really need to have a book_code attribute - # because TW resources are language centric not book centric. - # We could do something about that later if desired for - # design cleanness sake. selected_tw_books = [ - tw_book - for tw_book in tw_books - if tw_book.lang_code == lang_code and tw_book.book_code == book_code + tw_book for tw_book in tw_books if tw_book.lang_code == lang_code ] tw_book = selected_tw_books[0] if selected_tw_books else None selected_bc_books = [ diff --git a/backend/doc/domain/model.py b/backend/doc/domain/model.py index fec5c529..5a78613a 100644 --- a/backend/doc/domain/model.py +++ b/backend/doc/domain/model.py @@ -448,7 +448,6 @@ def __init__(self, localized_word: str, path: str, content: str): class TWBook(NamedTuple): lang_code: str lang_name: str - book_code: str resource_type_name: str lang_direction: LangDirEnum name_content_pairs: list[TWNameContentPair] = [] diff --git a/backend/doc/domain/parsing.py b/backend/doc/domain/parsing.py index 10234005..1077817b 100644 --- a/backend/doc/domain/parsing.py +++ b/backend/doc/domain/parsing.py @@ -861,7 +861,6 @@ def tw_book_content( return TWBook( lang_code=resource_lookup_dto.lang_code, lang_name=resource_lookup_dto.lang_name, - book_code=resource_lookup_dto.book_code, resource_type_name=resource_lookup_dto.resource_type_name, name_content_pairs=name_content_pairs, lang_direction=resource_lookup_dto.lang_direction, From 62017186eaf191fe60a30845855ed00217ed1145 Mon Sep 17 00:00:00 2001 From: linearcombination <4829djaskdfj@gmail.com> Date: Mon, 24 Nov 2025 15:36:50 -0800 Subject: [PATCH 2/6] Remove superfluous comments and commented out code --- ...ly_strategies_book_then_lang_by_chapter.py | 5 --- backend/doc/domain/resource_lookup.py | 30 ----------------- .../passages/passages/AddNTComponent.svelte | 7 ---- .../passages/passages/AddOTComponent.svelte | 33 ------------------- .../passages/passages/AddSTETComponent.svelte | 8 ----- 5 files changed, 83 deletions(-) diff --git a/backend/doc/domain/assembly_strategies/assembly_strategies_book_then_lang_by_chapter.py b/backend/doc/domain/assembly_strategies/assembly_strategies_book_then_lang_by_chapter.py index bc37c4a7..308ec20b 100644 --- a/backend/doc/domain/assembly_strategies/assembly_strategies_book_then_lang_by_chapter.py +++ b/backend/doc/domain/assembly_strategies/assembly_strategies_book_then_lang_by_chapter.py @@ -713,12 +713,7 @@ def assemble_tn_by_chapter( book_chapters: Mapping[str, int] = BOOK_CHAPTERS, fmt_str: str = settings.LEFT_ALIGNED_HEADER_FMT_STR, ) -> list[str]: - """ - Construct the HTML for a 'by chapter' strategy wherein at least - tn_books exists. - """ content = [] - # TODO Should we use lang_codes again here to ensure order? if show_tn_book_intro: for tn_book in tn_books: content.append(tn_language_direction_html(tn_book)) diff --git a/backend/doc/domain/resource_lookup.py b/backend/doc/domain/resource_lookup.py index a8810443..34243b71 100644 --- a/backend/doc/domain/resource_lookup.py +++ b/backend/doc/domain/resource_lookup.py @@ -1227,12 +1227,6 @@ def nt_survey_rg_passages( BibleReference(book_code='mat', book_name='Matthew', start_chapter=2, start_chapter_verse_ref='1-12', end_chapter=None, end_chapter_verse_ref=None) """ path = join(resource_dir, docx_file_path) - # logger.debug("path: %s exists: %s", path, exists(path)) - # TODO Check if resource_dir exists and if it doesn't then submit - # a document request to DOC API to make sure it is cloned. - # Currently we don't have to do this because at startup we copy - # English NT Survey RG doc into place. - # assert exists(path) rg_books = get_rg_books( path, lang_code, @@ -1275,12 +1269,6 @@ def ot_survey_rg1_passages( BibleReference(book_code='gen', book_name='Genesis', start_chapter=2, start_chapter_verse_ref='1-12', end_chapter=None, end_chapter_verse_ref=None) """ path = join(resource_dir, docx_file_path) - # logger.debug("path: %s exists: %s", path, exists(path)) - # TODO Check if resource_dir exists and if it doesn't then submit - # a document request to DOC API to make sure it is cloned. - # Currently we don't have to do this because at startup we copy - # English OT Survey RG1 doc into place. - # assert exists(path) rg_books = get_rg_books( path, lang_code, @@ -1323,12 +1311,6 @@ def ot_survey_rg2_passages( BibleReference(book_code='jos', book_name='Joshua', start_chapter=2, start_chapter_verse_ref='1-12', end_chapter=None, end_chapter_verse_ref=None) """ path = join(resource_dir, docx_file_path) - # logger.debug("path: %s exists: %s", path, exists(path)) - # TODO Check if resource_dir exists and if it doesn't then submit - # a document request to DOC API to make sure it is cloned. - # Currently we don't have to do this because at startup we copy - # English OT Survey RG2 doc into place. - # assert exists(path) rg_books = get_rg_books( path, lang_code, @@ -1371,12 +1353,6 @@ def ot_survey_rg3_passages( BibleReference(book_code='job', book_name='Job', start_chapter=2, start_chapter_verse_ref='1-12', end_chapter=None, end_chapter_verse_ref=None) """ path = join(resource_dir, docx_file_path) - # logger.debug("path: %s exists: %s", path, exists(path)) - # TODO Check if resource_dir exists and if it doesn't then submit - # a document request to DOC API to make sure it is cloned. - # Currently we don't have to do this because at startup we copy - # English OT Survey RG3 doc into place. - # assert exists(path) rg_books = get_rg_books( path, lang_code, @@ -1419,12 +1395,6 @@ def ot_survey_rg4_passages( BibleReference(book_code='isa', book_name='Isaiah', start_chapter=2, start_chapter_verse_ref='1-12', end_chapter=None, end_chapter_verse_ref=None) """ path = join(resource_dir, docx_file_path) - # logger.debug("path: %s exists: %s", path, exists(path)) - # TODO Check if resource_dir exists and if it doesn't then submit - # a document request to DOC API to make sure it is cloned. - # Currently we don't have to do this because at startup we copy - # English OT Survey RG4 doc into place. - # assert exists(path) rg_books = get_rg_books( path, lang_code, diff --git a/frontend/src/routes/passages/passages/AddNTComponent.svelte b/frontend/src/routes/passages/passages/AddNTComponent.svelte index 7b597d76..06b97bcf 100644 --- a/frontend/src/routes/passages/passages/AddNTComponent.svelte +++ b/frontend/src/routes/passages/passages/AddNTComponent.svelte @@ -16,9 +16,6 @@ try { await addNTSurveyRGPassages() ntSurveySuccessMessage = '✔' - // setTimeout(() => { - // ntSurveySuccessMessage = '' - // }, 4000) } catch (error) { console.error('Error:', error) } finally { @@ -32,10 +29,7 @@ isLoadingNTSurvey = true try { await removeNTSurveyRGPassages() - // ntSurveySuccessMessage = '✔' - // setTimeout(() => { ntSurveySuccessMessage = '' - // }, 4000) } catch (error) { console.error('Error:', error) } finally { @@ -73,7 +67,6 @@ try { const langCode = $langCodeAndNameStore.split(',')[0] const bibleReferences = await getNTSurveyRGPassages(langCode) - console.log(`bibleReferences[0]: ${bibleReferences[0]}`) for (const bibleRef of bibleReferences) { addBibleReference( langCode, diff --git a/frontend/src/routes/passages/passages/AddOTComponent.svelte b/frontend/src/routes/passages/passages/AddOTComponent.svelte index c4ddc619..cda05fe1 100644 --- a/frontend/src/routes/passages/passages/AddOTComponent.svelte +++ b/frontend/src/routes/passages/passages/AddOTComponent.svelte @@ -89,7 +89,6 @@ try { const langCode = $langCodeAndNameStore.split(',')[0] const bibleReferences = await getOTSurveyRG1Passages(langCode) - console.log(`bibleReferences[0]: ${bibleReferences[0]}`) for (const bibleRef of bibleReferences) { addBibleReference( langCode, @@ -112,7 +111,6 @@ try { const langCode = $langCodeAndNameStore.split(',')[0] const bibleReferences = await getOTSurveyRG2Passages(langCode) - console.log(`bibleReferences[0]: ${bibleReferences[0]}`) for (const bibleRef of bibleReferences) { addBibleReference( langCode, @@ -135,7 +133,6 @@ try { const langCode = $langCodeAndNameStore.split(',')[0] const bibleReferences = await getOTSurveyRG3Passages(langCode) - console.log(`bibleReferences[0]: ${bibleReferences[0]}`) for (const bibleRef of bibleReferences) { addBibleReference( langCode, @@ -158,7 +155,6 @@ try { const langCode = $langCodeAndNameStore.split(',')[0] const bibleReferences = await getOTSurveyRG4Passages(langCode) - console.log(`bibleReferences[0]: ${bibleReferences[0]}`) for (const bibleRef of bibleReferences) { addBibleReference( langCode, @@ -181,7 +177,6 @@ try { const langCode = $langCodeAndNameStore.split(',')[0] const bibleReferences = await getOTSurveyRG1Passages(langCode) - console.log(`bibleReferences[0]: ${bibleReferences[0]}`) for (const bibleRef of bibleReferences) { removeBibleReference( langCode, @@ -203,7 +198,6 @@ try { const langCode = $langCodeAndNameStore.split(',')[0] const bibleReferences = await getOTSurveyRG2Passages(langCode) - console.log(`bibleReferences[0]: ${bibleReferences[0]}`) for (const bibleRef of bibleReferences) { removeBibleReference( langCode, @@ -225,7 +219,6 @@ try { const langCode = $langCodeAndNameStore.split(',')[0] const bibleReferences = await getOTSurveyRG3Passages(langCode) - console.log(`bibleReferences[0]: ${bibleReferences[0]}`) for (const bibleRef of bibleReferences) { removeBibleReference( langCode, @@ -247,7 +240,6 @@ try { const langCode = $langCodeAndNameStore.split(',')[0] const bibleReferences = await getOTSurveyRG4Passages(langCode) - console.log(`bibleReferences[0]: ${bibleReferences[0]}`) for (const bibleRef of bibleReferences) { removeBibleReference( langCode, @@ -271,9 +263,6 @@ try { await addOTSurveyRG1Passages() otSurveyRG1SuccessMessage = '✔' - // setTimeout(() => { - // ntSurveySuccessMessage = '' - // }, 4000) } catch (error) { console.error('Error:', error) } finally { @@ -288,9 +277,6 @@ try { await addOTSurveyRG2Passages() otSurveyRG2SuccessMessage = '✔' - // setTimeout(() => { - // ntSurveySuccessMessage = '' - // }, 4000) } catch (error) { console.error('Error:', error) } finally { @@ -305,9 +291,6 @@ try { await addOTSurveyRG3Passages() otSurveyRG3SuccessMessage = '✔' - // setTimeout(() => { - // ntSurveySuccessMessage = '' - // }, 4000) } catch (error) { console.error('Error:', error) } finally { @@ -322,9 +305,6 @@ try { await addOTSurveyRG4Passages() otSurveyRG4SuccessMessage = '✔' - // setTimeout(() => { - // ntSurveySuccessMessage = '' - // }, 4000) } catch (error) { console.error('Error:', error) } finally { @@ -338,10 +318,7 @@ isLoadingOTSurveyRG1 = true try { await removeOTSurveyRG1Passages() - // ntSurveySuccessMessage = '✔' - // setTimeout(() => { otSurveyRG1SuccessMessage = '' - // }, 4000) } catch (error) { console.error('Error:', error) } finally { @@ -355,10 +332,7 @@ isLoadingOTSurveyRG2 = true try { await removeOTSurveyRG2Passages() - // ntSurveySuccessMessage = '✔' - // setTimeout(() => { otSurveyRG2SuccessMessage = '' - // }, 4000) } catch (error) { console.error('Error:', error) } finally { @@ -372,10 +346,7 @@ isLoadingOTSurveyRG3 = true try { await removeOTSurveyRG3Passages() - // ntSurveySuccessMessage = '✔' - // setTimeout(() => { otSurveyRG3SuccessMessage = '' - // }, 4000) } catch (error) { console.error('Error:', error) } finally { @@ -389,10 +360,7 @@ isLoadingOTSurveyRG4 = true try { await removeOTSurveyRG4Passages() - // ntSurveySuccessMessage = '✔' - // setTimeout(() => { otSurveyRG4SuccessMessage = '' - // }, 4000) } catch (error) { console.error('Error:', error) } finally { @@ -401,7 +369,6 @@ } } - // track checkbox states let otSurveyRG1Checked = false let otSurveyRG2Checked = false let otSurveyRG3Checked = false diff --git a/frontend/src/routes/passages/passages/AddSTETComponent.svelte b/frontend/src/routes/passages/passages/AddSTETComponent.svelte index eab4d7d8..8b11879c 100644 --- a/frontend/src/routes/passages/passages/AddSTETComponent.svelte +++ b/frontend/src/routes/passages/passages/AddSTETComponent.svelte @@ -30,7 +30,6 @@ try { const langCode = $langCodeAndNameStore.split(',')[0] const bibleReferences = await getSTETPassages(langCode) - console.log(`bibleReferences[0]: ${bibleReferences[0]}`) for (const bibleRef of bibleReferences) { addBibleReference( langCode, @@ -53,7 +52,6 @@ try { const langCode = $langCodeAndNameStore.split(',')[0] const bibleReferences = await getSTETPassages(langCode) - console.log(`bibleReferences[0]: ${bibleReferences[0]}`) for (const bibleRef of bibleReferences) { removeBibleReference( langCode, @@ -77,9 +75,6 @@ try { await addSTETPassages() stetSuccessMessage = '✔' - // setTimeout(() => { - // stetSuccessMessage = '' - // }, 4000) } catch (error) { console.error('Error:', error) } finally { @@ -93,10 +88,7 @@ isLoadingStetPassages = true try { await removeSTETPassages() - // stetSuccessMessage = '✔' - // setTimeout(() => { stetSuccessMessage = '' - // }, 4000) } catch (error) { console.error('Error:', error) } finally { From 76a265d56bd812dedd6531e71ed39d0f66d3b8df Mon Sep 17 00:00:00 2001 From: linearcombination <4829djaskdfj@gmail.com> Date: Mon, 24 Nov 2025 15:38:00 -0800 Subject: [PATCH 3/6] Clear passages when language changes --- frontend/src/routes/passages/language/+page.svelte | 10 ++++++++++ .../passages/language/DesktopLanguageDisplay.svelte | 3 +++ .../passages/language/MobileLanguageDisplay.svelte | 3 +++ 3 files changed, 16 insertions(+) diff --git a/frontend/src/routes/passages/language/+page.svelte b/frontend/src/routes/passages/language/+page.svelte index 88227c7a..ee47107c 100644 --- a/frontend/src/routes/passages/language/+page.svelte +++ b/frontend/src/routes/passages/language/+page.svelte @@ -10,6 +10,7 @@ import WizardBasket from '$lib/passages/WizardBasket.svelte' import { langCodeAndNameStore, langCountStore } from '$lib/passages/stores/LanguageStore' import { getCode, getName } from '$lib/passages/utils' + import { passagesStore } from '$lib/passages/stores/PassagesStore' let showGatewayLanguages = true @@ -52,6 +53,13 @@ await loadLangCodeNameAndTypes() }) + function handleLangChange(e: Event, lang: string) { + const input = e.currentTarget as HTMLInputElement + if (input.checked) { + $passagesStore = [] + } + } + // Set $langCountStore $: { if ($langCodeAndNameStore) { @@ -120,6 +128,7 @@ {heartCodesAndNames} {filteredHeartCodeAndNames} {filteredGatewayCodeAndNames} + onLangChange={handleLangChange} /> {:else} {/if} {/if} diff --git a/frontend/src/routes/passages/language/DesktopLanguageDisplay.svelte b/frontend/src/routes/passages/language/DesktopLanguageDisplay.svelte index 275e984b..5b893912 100644 --- a/frontend/src/routes/passages/language/DesktopLanguageDisplay.svelte +++ b/frontend/src/routes/passages/language/DesktopLanguageDisplay.svelte @@ -7,6 +7,7 @@ export let heartCodesAndNames: Array export let filteredGatewayCodeAndNames: Array export let filteredHeartCodeAndNames: Array + export let onLangChange: (e: Event, lang: string) => void
@@ -23,6 +24,7 @@ type="radio" bind:group={$langCodeAndNameStore} value={langCodeAndName} + on:change={(e) => onLangChange(e, langCodeAndName.split(',')[0])} class="checkbox-target checkbox-style" /> {getName(langCodeAndName)} @@ -44,6 +46,7 @@ type="radio" bind:group={$langCodeAndNameStore} value={langCodeAndName} + on:change={(e) => onLangChange(e, langCodeAndName.split(',')[0])} class="checkbox-target checkbox-style" /> {getName(langCodeAndName)} diff --git a/frontend/src/routes/passages/language/MobileLanguageDisplay.svelte b/frontend/src/routes/passages/language/MobileLanguageDisplay.svelte index c73284a4..6ba8439d 100644 --- a/frontend/src/routes/passages/language/MobileLanguageDisplay.svelte +++ b/frontend/src/routes/passages/language/MobileLanguageDisplay.svelte @@ -7,6 +7,7 @@ export let heartCodesAndNames: Array export let filteredGatewayCodeAndNames: Array export let filteredHeartCodeAndNames: Array + export let onLangChange: (e: Event, lang: string) => void
@@ -24,6 +25,7 @@ type="radio" bind:group={$langCodeAndNameStore} value={langCodeAndName} + on:change={(e) => onLangChange(e, langCodeAndName.split(',')[0])} class="checkbox-target checkbox-style" /> {getName(langCodeAndName)} @@ -47,6 +49,7 @@ type="radio" bind:group={$langCodeAndNameStore} value={langCodeAndName} + on:change={(e) => onLangChange(e, langCodeAndName.split(',')[0])} class="checkbox-target checkbox-style" /> {getName(langCodeAndName)} From c65115942135ae95267b47408500012a2d617d58 Mon Sep 17 00:00:00 2001 From: linearcombination <4829djaskdfj@gmail.com> Date: Mon, 24 Nov 2025 15:39:13 -0800 Subject: [PATCH 4/6] Fix parsing of OT reviewer's guide input doc --- backend/doc/reviewers_guide/parser.py | 58 +++++++++++++++++++++------ 1 file changed, 45 insertions(+), 13 deletions(-) diff --git a/backend/doc/reviewers_guide/parser.py b/backend/doc/reviewers_guide/parser.py index def7268b..6713f0b8 100644 --- a/backend/doc/reviewers_guide/parser.py +++ b/backend/doc/reviewers_guide/parser.py @@ -27,7 +27,9 @@ def get_book_code(book_name: str, book_names: dict[str, str] = BOOK_NAMES) -> st def parse_bible_reference( - raw_bible_reference: str, book_names: list[str] = list(BOOK_NAMES.values()) + raw_bible_reference: str, + book_names: list[str] = list(BOOK_NAMES.values()), + exceptional_book_name: str = "Song of Songs", ) -> BibleReference: bible_reference_components = raw_bible_reference.split() if ( @@ -97,7 +99,6 @@ def parse_bible_reference( elif bible_reference_components[1][ 0 ].isdigit() and not bible_reference_components[2].endswith("continued"): - # Likely an OT reviewer's guide reference which sometimes looks like ['Genesis', '1:1-2:3', 'God', 'creates', 'everything'] bible_reference_components = bible_reference_components[0:2] logger.debug( "2. Updated bible_reference_components: %s", @@ -106,9 +107,37 @@ def parse_bible_reference( book_name = bible_reference_components[0] book_code = get_book_code(book_name) chapter_verse_components = bible_reference_components[1].split(":") - bible_reference = get_ordinal_bible_reference( - chapter_verse_components, book_code, book_name + if ( + len(chapter_verse_components) == 3 + and "-" in chapter_verse_components[1] + ): + bible_reference = get_bible_reference_spanning_chapter_boundary( + chapter_verse_components, book_code, book_name + ) + else: + bible_reference = get_ordinal_bible_reference( + chapter_verse_components, book_code, book_name + ) + elif ( + not bible_reference_components[2].endswith("continued") + and f"{bible_reference_components[0]} {bible_reference_components[1]} {bible_reference_components[2]} == {exceptional_book_name}" + ): + bible_reference_components = bible_reference_components[0:4] + book_code = get_book_code( + f"{bible_reference_components[0]} {bible_reference_components[1]} Solomon" ) + chapter_verse_components = bible_reference_components[3].split(":") + if ( + len(chapter_verse_components) == 3 + and "-" in chapter_verse_components[1] + ): + bible_reference = get_bible_reference_spanning_chapter_boundary( + chapter_verse_components, book_code, exceptional_book_name + ) + else: + bible_reference = get_ordinal_bible_reference( + chapter_verse_components, book_code, exceptional_book_name + ) return bible_reference @@ -158,7 +187,9 @@ def get_bible_reference_spanning_chapter_boundary( def find_bible_references( - docx_file: str, book_names: list[str] = list(BOOK_NAMES.values()) + docx_file: str, + book_names: list[str] = list(BOOK_NAMES.values()), + solomon: str = "Solomon", ) -> tuple[list[str], list[str]]: """ Identifies Bible passage references and text between references. @@ -185,7 +216,6 @@ def find_bible_references( if "Old Testament" in testament_paragraph.text.strip(): logger.info("Parsing Old Testament rg document") for paragraph in doc.paragraphs: - # Check if the paragraph is a potential Bible reference paragraph_text = paragraph.text.strip() words = paragraph_text.split() if ( @@ -195,10 +225,15 @@ def find_bible_references( and ( words[1][0].isdigit() or (len(words) > 2 and words[2][0].isdigit()) ) + ) or ( + words + and len(words) > 3 + and ( + f"{words[0]} {words[1]} {solomon}" in book_names + ) # Input doc uses Song of Songs, but lookup is Song of Solomon + and words[3][0].isdigit() ): - if paragraph_text.endswith( - "continued" - ): # or "\t" in paragraph_text # \t is in paragraph_text when it is a TOC entry + if paragraph_text.endswith("continued"): continue if inside_bible_reference: if current_text: @@ -212,7 +247,6 @@ def find_bible_references( else: logger.info("Parsing New Testament rg document") for paragraph in doc.paragraphs: - # Check if the paragraph is a potential Bible reference paragraph_text = paragraph.text.strip() words = paragraph_text.split() if ( @@ -221,9 +255,7 @@ def find_bible_references( and len(words) < 5 and (words[0] in book_names or (f"{words[0]} {words[1]}" in book_names)) ): - if ( - paragraph_text.endswith("continued") or "\t" in paragraph_text - ): # \t is in paragraph_text when it is a TOC entry + if paragraph_text.endswith("continued") or "\t" in paragraph_text: continue if inside_bible_reference: if current_text: From 91c0c6ab97bed4e84836b19bdb838333e133e670 Mon Sep 17 00:00:00 2001 From: linearcombination <4829djaskdfj@gmail.com> Date: Mon, 24 Nov 2025 15:40:27 -0800 Subject: [PATCH 5/6] Fix Passages app passages feature Make checkboxes for each passage group type only be visible if the language chosen has at least one of the members of that group. Only show select all for OT rg if all four rg groups (rg1, rg2, rg3, rg4) are present. Only add those passages from each group type which actually exist for the language chosen. Add e2e tests to test this. --- frontend/src/lib/bible-books.ts | 8 + .../src/routes/passages/passages/+page.svelte | 22 +- .../passages/passages/AddNTComponent.svelte | 65 ++-- .../passages/passages/AddOTComponent.svelte | 286 ++++++++++-------- .../passages/passages/AddSTETComponent.svelte | 69 +++-- .../passages/BibleReferenceSelector.svelte | 29 +- frontend/tests/e2e/passages_test.ts | 118 ++++++-- 7 files changed, 377 insertions(+), 220 deletions(-) diff --git a/frontend/src/lib/bible-books.ts b/frontend/src/lib/bible-books.ts index 424f1f78..f0939d15 100644 --- a/frontend/src/lib/bible-books.ts +++ b/frontend/src/lib/bible-books.ts @@ -70,3 +70,11 @@ export const booksMap: { [key: string]: string } = { export type BookKey = keyof typeof booksMap export const bookCodes = Object.keys(booksMap) as BookKey[] + +export function bookRange(start: string, end: string): BookKey[] { + const codes = bookCodes + const s = codes.indexOf(start) + const e = codes.indexOf(end) + if (s === -1 || e === -1 || s > e) return [] + return codes.slice(s, e + 1) +} diff --git a/frontend/src/routes/passages/passages/+page.svelte b/frontend/src/routes/passages/passages/+page.svelte index 1c0b30f1..5a39a2b4 100644 --- a/frontend/src/routes/passages/passages/+page.svelte +++ b/frontend/src/routes/passages/passages/+page.svelte @@ -15,8 +15,8 @@ import { passagesStore } from '$lib/passages/stores/PassagesStore' import CheckIcon from '$lib/CheckIcon.svelte' - // For use by Mobile UI - let showWizardBasketModal = false + let showWizardBasketModal = false // For use by Mobile UI + let bookCodesAndNames: Array<[string, string]> = [] async function getBookCodesAndNames( langCode: string, @@ -34,17 +34,15 @@ return bookCodesAndNames } - let bookCodesAndNames: Array<[string, string]> = [] - - onMount(() => { + onMount(async () => { let langCode = $langCodeAndNameStore.split(',')[0] - console.log(langCode) - console.log(`langCode: ${JSON.stringify(langCode)}`) - getBookCodesAndNames(langCode) - .then((bookCodesAndNames_) => { - bookCodesAndNames = [...bookCodesAndNames_] // Ensure reactivity with [...blah] - }) - .catch((err) => console.error(err)) + try { + bookCodesAndNames = await getBookCodesAndNames(langCode) + } catch (error) { + console.error('Failed to retrieve book codes and names:', error) + } finally { + console.log('Book codes and names retrieved successfully') + } }) function removePassage(id: number) { diff --git a/frontend/src/routes/passages/passages/AddNTComponent.svelte b/frontend/src/routes/passages/passages/AddNTComponent.svelte index 06b97bcf..4fb7467a 100644 --- a/frontend/src/routes/passages/passages/AddNTComponent.svelte +++ b/frontend/src/routes/passages/passages/AddNTComponent.svelte @@ -1,4 +1,5 @@ -
- - -
- {#if isLoadingNTSurvey} -
- {:else if ntSurveySuccessMessage} -
- {@html checkIcon} -
- {/if} +{#if showNT} +
+ + +
+ {#if isLoadingNTSurvey} +
+ {:else if ntSurveySuccessMessage} +
+ {@html checkIcon} +
+ {/if} +
-
+{/if}