@@ -15,11 +15,14 @@ class ScriptureTextType(Enum):
1515 NONE = auto ()
1616 NONVERSE = auto ()
1717 VERSE = auto ()
18- NOTE_TEXT = auto ()
18+ EMBED = auto ()
1919
2020
21- EMBED_PART_START_CHAR_STYLES = ("f" , "x" , "z" )
22- EMBED_STYLES = ("f" , "fe" , "fig" , "fm" , "x" )
21+ _EMBED_STYLES = {"f" , "fe" , "x" , "fig" }
22+
23+
24+ def _is_embed_style (marker : Optional [str ]) -> bool :
25+ return marker is not None and (marker .strip ("*" ) in _EMBED_STYLES or marker .startswith ("z" ))
2326
2427
2528class ScriptureRefUsfmParserHandler (UsfmParserHandler , ABC ):
@@ -28,18 +31,11 @@ def __init__(self) -> None:
2831 self ._cur_elements_stack : List [ScriptureElement ] = []
2932 self ._cur_text_type_stack : List [ScriptureTextType ] = []
3033 self ._duplicate_verse : bool = False
31- self ._in_preserved_paragraph : bool = False
32- self ._in_embed : bool = False
33- self ._in_note_text : bool = False
34- self ._in_nested_embed : bool = False
3534
3635 @property
3736 def _current_text_type (self ) -> ScriptureTextType :
3837 return ScriptureTextType .NONE if len (self ._cur_text_type_stack ) == 0 else self ._cur_text_type_stack [- 1 ]
3938
40- def _is_in_note_text (self ) -> bool :
41- return self ._in_note_text
42-
4339 def end_usfm (self , state : UsfmParserState ) -> None :
4440 self ._end_verse_text_wrapper (state )
4541
@@ -115,32 +111,6 @@ def start_sidebar(self, state: UsfmParserState, marker: str, category: str) -> N
115111 def end_sidebar (self , state : UsfmParserState , marker : str , closed : bool ) -> None :
116112 self ._end_parent_element ()
117113
118- def start_note (self , state : UsfmParserState , marker : str , caller : str , category : Optional [str ]) -> None :
119- self ._in_embed = True
120- self ._start_embed_wrapper (state , marker )
121-
122- def end_note (self , state : UsfmParserState , marker : str , closed : bool ) -> None :
123- self ._end_note_text_wrapper (state )
124- self ._end_embed (state , marker , None , closed )
125- self ._in_embed = False
126-
127- def _start_embed_wrapper (self , state : UsfmParserState , marker : str ) -> None :
128- if self ._cur_verse_ref .is_default :
129- self ._update_verse_ref (state .verse_ref , marker )
130-
131- if not self ._duplicate_verse :
132- self ._check_convert_verse_para_to_non_verse (state )
133- self ._next_element (marker )
134-
135- self ._start_embed (state , self ._create_non_verse_ref ())
136-
137- def _start_embed (self , state : UsfmParserState , scripture_ref : ScriptureRef ) -> None : ...
138-
139- def _end_embed (
140- self , state : UsfmParserState , marker : str , attributes : Optional [Sequence [UsfmAttribute ]], closed : bool
141- ) -> None :
142- pass
143-
144114 def text (self , state : UsfmParserState , text : str ) -> None :
145115 # if we hit text in a verse paragraph and we aren't in a verse, then start a non-verse segment
146116 if text .strip ():
@@ -152,29 +122,23 @@ def opt_break(self, state: UsfmParserState) -> None:
152122 def start_char (
153123 self , state : UsfmParserState , marker : str , unknown : bool , attributes : Optional [Sequence [UsfmAttribute ]]
154124 ) -> None :
155- if self ._is_embed_part_style (marker ) and self ._in_note_text :
156- self ._in_nested_embed = True
157125 # if we hit a character marker in a verse paragraph and we aren't in a verse, then start a non-verse segment
158126 self ._check_convert_verse_para_to_non_verse (state )
159127
160- if self ._is_embed_style (marker ):
161- self ._in_embed = True
162- self ._start_embed_wrapper (state , marker )
163-
164- if self ._is_note_text (marker ):
165- self ._start_note_text_wrapper (state )
128+ if _is_embed_style (marker ):
129+ self ._start_embed_text_wrapper (state , marker )
166130
167131 def end_char (
168132 self , state : UsfmParserState , marker : str , attributes : Optional [Sequence [UsfmAttribute ]], closed : bool
169133 ) -> None :
170- if self . _is_embed_part_style (marker ):
171- if self ._in_nested_embed :
172- self . _in_nested_embed = False
173- elif self . _is_note_text ( marker ) :
174- self ._end_note_text_wrapper (state )
175- if self . _is_embed_style ( marker ):
176- self . _end_embed ( state , marker , attributes , closed )
177- self ._in_embed = False
134+ if _is_embed_style (marker ):
135+ self ._end_embed_text_wrapper ( state )
136+
137+ def start_note ( self , state : UsfmParserState , marker : str , caller : str , category : Optional [ str ]) -> None :
138+ self ._start_embed_text_wrapper (state , marker )
139+
140+ def end_note ( self , state : UsfmParserState , marker : str , closed : bool ) -> None :
141+ self ._end_embed_text_wrapper ( state )
178142
179143 def _start_verse_text (self , state : UsfmParserState , scripture_refs : Optional [Sequence [ScriptureRef ]]) -> None : ...
180144
@@ -184,20 +148,9 @@ def _start_non_verse_text(self, state: UsfmParserState, scripture_ref: Scripture
184148
185149 def _end_non_verse_text (self , state : UsfmParserState , scripture_ref : ScriptureRef ) -> None : ...
186150
187- def _start_note_text_wrapper (self , state : UsfmParserState ):
188- self ._in_note_text = True
189- self ._cur_text_type_stack .append (ScriptureTextType .NOTE_TEXT )
190- self ._start_note_text (state )
191-
192- def _start_note_text (self , state : UsfmParserState ) -> None : ...
151+ def _start_embed_text (self , state : UsfmParserState , scripture_ref : ScriptureRef ) -> None : ...
193152
194- def _end_note_text_wrapper (self , state : UsfmParserState ):
195- if self ._cur_text_type_stack and self ._cur_text_type_stack [- 1 ] == ScriptureTextType .NOTE_TEXT :
196- self ._end_note_text (state , self ._create_non_verse_ref ())
197- self ._cur_text_type_stack .pop ()
198- self ._in_note_text = False
199-
200- def _end_note_text (self , state : UsfmParserState , scripture_ref : ScriptureRef ) -> None : ...
153+ def _end_embed_text (self , state : UsfmParserState , scripture_ref : ScriptureRef ) -> None : ...
201154
202155 def _start_verse_text_wrapper (self , state : UsfmParserState ) -> None :
203156 self ._duplicate_verse = False
@@ -225,6 +178,25 @@ def _update_verse_ref(self, verse_ref: VerseRef, marker: str) -> None:
225178 self ._cur_elements_stack .append (ScriptureElement (0 , marker ))
226179 self ._cur_verse_ref = verse_ref .copy ()
227180
181+ def _start_embed_text_wrapper (self , state : UsfmParserState , marker : str ) -> None :
182+ if self ._cur_verse_ref .is_default :
183+ self ._update_verse_ref (state .verse_ref , marker )
184+
185+ if not self ._duplicate_verse :
186+ self ._check_convert_verse_para_to_non_verse (state )
187+ self ._next_element (marker )
188+ self ._cur_text_type_stack .append (ScriptureTextType .EMBED )
189+ self ._start_embed_text (state , self ._create_non_verse_ref ())
190+
191+ def _end_embed_text_wrapper (self , state : UsfmParserState ) -> None :
192+ if (
193+ not self ._duplicate_verse
194+ and self ._cur_text_type_stack
195+ and self ._cur_text_type_stack [- 1 ] == ScriptureTextType .EMBED
196+ ):
197+ self ._end_embed_text (state , self ._create_non_verse_ref ())
198+ self ._cur_text_type_stack .pop ()
199+
228200 def _next_element (self , marker : str ) -> None :
229201 prev_elem : ScriptureElement = self ._cur_elements_stack .pop ()
230202 self ._cur_elements_stack .append (ScriptureElement (prev_elem .position + 1 , marker ))
@@ -237,7 +209,7 @@ def _end_parent_element(self) -> None:
237209 self ._cur_elements_stack .pop ()
238210
239211 def _end_embed_elements (self ) -> None :
240- if self ._cur_elements_stack and self . _is_embed_style (self ._cur_elements_stack [- 1 ].name ):
212+ if self ._cur_elements_stack and _is_embed_style (self ._cur_elements_stack [- 1 ].name ):
241213 self ._cur_elements_stack .pop ()
242214
243215 def _create_verse_refs (self ) -> List [ScriptureRef ]:
@@ -266,23 +238,3 @@ def _check_convert_verse_para_to_non_verse(self, state: UsfmParserState) -> None
266238 ):
267239 self ._start_parent_element (para_tag .marker )
268240 self ._start_non_verse_text_wrapper (state )
269-
270- def _is_in_embed (self , marker : Optional [str ]) -> bool :
271- return self ._in_embed or self ._is_embed_style (marker )
272-
273- def _is_in_nested_embed (self , marker : Optional [str ]) -> bool :
274- return self ._in_nested_embed or (
275- marker is not None
276- and marker .startswith ("+" )
277- and marker [1 ] in EMBED_PART_START_CHAR_STYLES
278- and marker != "fm"
279- )
280-
281- def _is_note_text (self , marker : Optional [str ]) -> bool :
282- return marker == "ft"
283-
284- def _is_embed_part_style (self , marker : Optional [str ]) -> bool :
285- return marker is not None and marker .startswith (EMBED_PART_START_CHAR_STYLES ) and marker != "fm"
286-
287- def _is_embed_style (self , marker : Optional [str ]) -> bool :
288- return marker is not None and marker .strip ("*" ) in EMBED_STYLES
0 commit comments