@@ -26,14 +26,12 @@ def __init__(self):
2626
2727 def render (self , document : Any , page : PageContext ) -> list [str ]:
2828 """Render a single page to RTF."""
29-
29+
3030 page_elements = []
3131
3232 # 1. Page Break (except first page)
3333 if not page .is_first_page :
34- page_elements .append (
35- self .document_service .generate_page_break (document )
36- )
34+ page_elements .append (self .document_service .generate_page_break (document ))
3735
3836 # 2. Title
3937 if (
@@ -52,7 +50,9 @@ def render(self, document: Any, page: PageContext) -> list[str]:
5250 if (
5351 document .rtf_subline
5452 and document .rtf_subline .text
55- and self ._should_show (document .rtf_page .page_title , page ) # Using page_title rule for subline visibility as per original
53+ and self ._should_show (
54+ document .rtf_page .page_title , page
55+ ) # Using page_title rule for subline visibility as per original
5656 ):
5757 subline_content = self .encoding_service .encode_subline (
5858 document .rtf_subline , method = "line"
@@ -62,9 +62,7 @@ def render(self, document: Any, page: PageContext) -> list[str]:
6262
6363 # 4. Subline Header (from Strategy)
6464 if page .subline_header :
65- subline_header_content = self ._generate_subline_header (
66- page .subline_header
67- )
65+ subline_header_content = self ._generate_subline_header (page .subline_header )
6866 if subline_header_content :
6967 page_elements .append (subline_header_content )
7068
@@ -97,11 +95,9 @@ def render(self, document: Any, page: PageContext) -> list[str]:
9795 col_idx = 0
9896 # Try to find column index for legacy reasons, though likely unused if we handle spanning cleanly
9997 if document .rtf_body .page_by and isinstance (document .df , pl .DataFrame ):
100- try :
101- col_idx = document .df .columns .index (
102- document .rtf_body .page_by [0 ]
103- )
104- except ValueError :
98+ try :
99+ col_idx = document .df .columns .index (document .rtf_body .page_by [0 ])
100+ except ValueError :
105101 col_idx = 0
106102
107103 header_text = self ._format_group_header (page .pageby_header_info )
@@ -124,9 +120,9 @@ def render(self, document: Any, page: PageContext) -> list[str]:
124120 and document .rtf_footnote .text
125121 and self ._should_show (document .rtf_page .page_footnote , page )
126122 ):
127- # Check for border override from processor
123+ # Check for border override from processor
128124 border_style = page .component_borders .get ("footnote" )
129-
125+
130126 footnote_content = self .encoding_service .encode_footnote (
131127 document .rtf_footnote ,
132128 page .page_number ,
@@ -168,9 +164,12 @@ def render(self, document: Any, page: PageContext) -> list[str]:
168164 return page_elements
169165
170166 def _should_show (self , location : str , page : PageContext ) -> bool :
171- if location == "all" : return True
172- if location == "first" : return page .is_first_page
173- if location == "last" : return page .is_last_page
167+ if location == "all" :
168+ return True
169+ if location == "first" :
170+ return page .is_first_page
171+ if location == "last" :
172+ return page .is_last_page
174173 return False
175174
176175 def _format_group_header (self , info : dict ) -> str :
@@ -181,27 +180,30 @@ def _format_group_header(self, info: dict) -> str:
181180
182181 def _generate_subline_header (self , info : dict ) -> str :
183182 text = self ._format_group_header (info )
184- if not text : return ""
185- return fr"{{\pard\hyphpar\fi0\li0\ri0\ql\fs18{{\f0 { text } }}\par}}"
183+ if not text :
184+ return ""
185+ return rf"{{\pard\hyphpar\fi0\li0\ri0\ql\fs18{{\f0 { text } }}\par}}"
186186
187187 def _render_column_headers (self , document : Any , page : PageContext ) -> list [str ]:
188188 # Similar logic to PaginatedStrategy.encode header section
189-
189+
190190 header_elements = []
191191 headers_to_process = []
192-
192+
193193 if is_nested_header_list (document .rtf_column_header ):
194- for section in document .rtf_column_header :
195- if section : headers_to_process .extend (section )
194+ for section in document .rtf_column_header :
195+ if section :
196+ headers_to_process .extend (section )
196197 elif is_flat_header_list (document .rtf_column_header ):
197198 headers_to_process = document .rtf_column_header
198199 elif is_single_header (document .rtf_column_header ):
199200 headers_to_process = [document .rtf_column_header ]
200-
201+
201202 for i , header in enumerate (headers_to_process ):
202- if header is None : continue
203+ if header is None :
204+ continue
203205 header_copy = deepcopy (header )
204-
206+
205207 # Auto-populate header text from columns if missing and as_colheader is True
206208 if (
207209 header_copy .text is None
@@ -218,53 +220,62 @@ def _render_column_headers(self, document: Any, page: PageContext) -> list[str]:
218220 orient = "row" ,
219221 )
220222 header_copy .text = header_df
221-
223+
222224 # Adjust col_rel_width if needed (logic from PaginatedStrategy)
223- # Since we are using page.data which is already sliced/processed,
225+ # Since we are using page.data which is already sliced/processed,
224226 # we might need to adjust widths if they were originally defined for full table
225227 if document .rtf_body .col_rel_width is not None :
226- # If body has specific widths, try to map them.
228+ # If body has specific widths, try to map them.
227229 # For simplicity in this refactor, if we have header text now, we proceed.
228230 pass
229-
231+
230232 # Remove columns if necessary (page_by/subline_by)
231233 # Note: If we just populated from page.data, page.data already has columns removed!
232234 # So we only need to filter if text came from original document and has extra columns.
233235 if isinstance (header_copy .text , pl .DataFrame ):
234236 cols_remove = set ()
235- if document .rtf_body .page_by : cols_remove .update (document .rtf_body .page_by )
236- if document .rtf_body .subline_by : cols_remove .update (document .rtf_body .subline_by )
237-
237+ if document .rtf_body .page_by :
238+ cols_remove .update (document .rtf_body .page_by )
239+ if document .rtf_body .subline_by :
240+ cols_remove .update (document .rtf_body .subline_by )
241+
238242 if cols_remove :
239- remaining = [c for c in header_copy .text .columns if c not in cols_remove ]
243+ remaining = [
244+ c for c in header_copy .text .columns if c not in cols_remove
245+ ]
240246 if remaining :
241247 header_copy .text = header_copy .text .select (remaining )
242248
243249 # Apply top border for first page/first header
244- if page .is_first_page and i == 0 and document .rtf_page .border_first and header_copy .text is not None :
245- if isinstance (header_copy .text , pl .DataFrame ):
246- dims = header_copy .text .shape
247- else :
248- dims = (1 , len (header_copy .text ) if header_copy .text else 0 )
249-
250- header_copy .border_top = BroadcastValue (
251- value = header_copy .border_top , dimension = dims
252- ).update_row (0 , [document .rtf_page .border_first ] * dims [1 ])
250+ if (
251+ page .is_first_page
252+ and i == 0
253+ and document .rtf_page .border_first
254+ and header_copy .text is not None
255+ ):
256+ if isinstance (header_copy .text , pl .DataFrame ):
257+ dims = header_copy .text .shape
258+ else :
259+ dims = (1 , len (header_copy .text ) if header_copy .text else 0 )
260+
261+ header_copy .border_top = BroadcastValue (
262+ value = header_copy .border_top , dimension = dims
263+ ).update_row (0 , [document .rtf_page .border_first ] * dims [1 ])
253264
254265 header_rtf = self .encoding_service .encode_column_header (
255266 header_copy .text , header_copy , document .rtf_page .col_width
256267 )
257268 header_elements .extend (header_rtf )
258-
269+
259270 return header_elements
260271
261272 def _render_body (self , document : Any , page : PageContext ) -> list [str ]:
262273 page_attrs = page .final_body_attrs or document .rtf_body
263274 page_df = page .data
264275 col_widths = page .col_widths
265-
276+
266277 elements = []
267-
278+
268279 # Check for internal group boundaries
269280 if (
270281 is_single_body (document .rtf_body )
@@ -277,41 +288,43 @@ def _render_body(self, document: Any, page: PageContext) -> list[str]:
277288 col_idx = 0
278289 # Find col idx for spanning
279290 if document .rtf_body .page_by and isinstance (document .df , pl .DataFrame ):
280- try :
281- col_idx = document .df .columns .index (
282- document .rtf_body .page_by [0 ]
283- )
284- except ValueError :
291+ try :
292+ col_idx = document .df .columns .index (document .rtf_body .page_by [0 ])
293+ except ValueError :
285294 col_idx = 0
286295
287296 prev_row = 0
288297 for boundary in page .group_boundaries :
289298 page_rel_row = boundary ["page_relative_row" ]
290-
299+
291300 if page_rel_row > prev_row :
292301 segment = page_df [prev_row :page_rel_row ]
293302 # We must use internal _encode method of TableAttributes (attrs are already finalized)
294303 # Note: We need to ensure page_attrs is the TableAttributes object
295- elements .extend (page_attrs ._encode (segment , col_widths , row_offset = prev_row ))
296-
304+ elements .extend (
305+ page_attrs ._encode (segment , col_widths , row_offset = prev_row )
306+ )
307+
297308 # Spanning Row
298309 header_text = self ._format_group_header (boundary )
299310 if header_text :
300311 spanning = self .encoding_service .encode_spanning_row (
301- text = header_text ,
302- page_width = document .rtf_page .col_width or 8.5 ,
303- rtf_body_attrs = document .rtf_body ,
304- col_idx = col_idx
312+ text = header_text ,
313+ page_width = document .rtf_page .col_width or 8.5 ,
314+ rtf_body_attrs = document .rtf_body ,
315+ col_idx = col_idx ,
305316 )
306317 elements .extend (spanning )
307-
318+
308319 prev_row = page_rel_row
309-
320+
310321 if prev_row < len (page_df ):
311322 segment = page_df [prev_row :]
312- elements .extend (page_attrs ._encode (segment , col_widths , row_offset = prev_row ))
323+ elements .extend (
324+ page_attrs ._encode (segment , col_widths , row_offset = prev_row )
325+ )
313326 else :
314327 # Simple body render
315328 elements .extend (page_attrs ._encode (page_df , col_widths , row_offset = 0 ))
316-
329+
317330 return elements
0 commit comments