ó
    "`'j†  ã                   óŽ   • S r SSKrSSKJr  SSKJr  SSKJrJrJrJ	r	  SSK
Jr  SSKJr   " S S	5      rS
\\   S\\-  SS4S jrg)u  
Header consolidation post-processor.

Operates on a DoclingDocument (the canonical Parser output) and returns
TableMetadata for each table. Pulled out of the parser to keep that layer
engine-agnostic â€” the consolidation logic is independent of how the
DoclingDocument was produced.
é    N)Údatetime)ÚPath)ÚAnyÚListÚOptionalÚTuple)ÚDoclingDocument)ÚTableMetadatac                   óâ   • \ rS rSr    SS\S\S\S\SS4
S jjrS	\S\	\
   4S
 jrS\	\   S\S\\	\   \	\   4   4S jrS\	\   S\\   4S jrSS\	\   S\S\S\\   4S jjrS\
SS4S jrSrg)ÚHeaderConsolidatoré   Ú	separatorÚmax_lookbackÚenable_consolidationÚdebugÚreturnNc                 ó4   • Xl         X l        X0l        X@l        g )N)r   r   r   r   )Úselfr   r   r   r   s        Ú6/home/mande/repo/quber/src/quber/core/consolidation.pyÚ__init__ÚHeaderConsolidator.__init__   s   € ð #ŒØ(ÔØ$8Ô!Ø�
ó    Údocumentc                 óž  • / nSn[        UR                  5       5      nU VVs/ s H  u  pVUPM	     nnn[        U5       VV	s0 s H  u  p‰[        U	5      U_M     n
nn	UR                   GHS  n[        US5      (       aH  UR                  (       a7  [        UR                  S   S5      (       a  UR                  S   R                  OSnU
R                  [        U5      S5      n/ n/ nUS:”  a  U R                  X}5      u  pïS nU R                  (       a  U(       a  U R                  U5      nSnSnS n[        US5      (       aí  UR                  (       aÜ  UR                  R                  nUR                  R                  nUS:”  aª  US:”  a¤  [        UR                  S5      (       a‰  UR                  R                  (       an  [!        UR                  R                  5      S:”  a  UR                  R                  S   O/ nU(       a)  [!        U5      S:”  a  US   (       a  [#        US   5      OS nU R%                  X}SS	9n[        US
5      (       a  UR'                  U5      OS n[)        UUUUU(       a  US   OS UUUUUS9
nUR+                  U5        US-  nU R,                  (       d  GMB  U R/                  U5        GMV     U$ s  snnf s  sn	nf )Nr   ÚprovÚpage_noé   éÿÿÿÿÚdataÚgridé   )ÚlimitÚexport_to_markdown)
Útable_indexÚpage_numberÚheadersÚconsolidated_headerÚdescriptive_textÚtable_markdownÚpreceding_textÚrowsÚcolsÚfirst_cell_content)ÚlistÚiterate_itemsÚ	enumerateÚidÚtablesÚhasattrr   r   ÚgetÚfind_preceding_headersr   Úconsolidate_headersr   Únum_rowsÚnum_colsr    ÚlenÚstrÚget_preceding_textr#   r
   Úappendr   Úprint_debug_info)r   r   Útables_metadatar$   Úelements_with_depthÚitemÚ_Úelements_listÚiÚelemÚelement_to_indexÚtableÚpage_numÚ	table_idxr&   Údescriptive_textsr'   r+   r,   Ú
first_cellÚ	first_rowr*   Útable_mdÚmetadatas                           r   ÚconsolidateÚHeaderConsolidator.consolidate!   sv  € Ø/1ˆØˆä" 8×#9Ñ#9Ó#;Ó<ÐÙ-@ÔAÒ-@¡' $›Ñ-@ˆÑAÜ7@ÀÔ7OÔPÒ7O©G¨AœB˜t›H ašKÑ7OÐÑPà—_•_ˆEô ˜E 6×*Ñ*¨u¯z¯z¼gÀeÇjÁjÐQRÁmÐU^×>_Ñ>_ð —
‘
˜1‘×%Ò%àð ð )×,Ñ,¬R°«Y¸Ó;ˆIà!#ˆGØ+-ÐØ˜1‹}Ø-1×-HÑ-HÈÓ-bÑ*�à15ÐØ×(×(®WØ&*×&>Ñ&>¸wÓ&GÐ#àˆDØˆDØ(,ˆJÜ�u˜f×%Ñ%¨%¯*¯*Ø—z‘z×*Ñ*�Ø—z‘z×*Ñ*�Ø˜!“8  q£Ü˜uŸz™z¨6×2Ñ2°u·z±z··Ü:=¸e¿j¹j¿o¹oÓ:NÐQRÓ:R E§J¡J§O¡O°AÒ$6ÐXZ˜	Þ$¬¨Y«¸!Ó);Ø>GÈ¿l¬¨Y°q©\Ô):ÐPT˜Jà!×4Ñ4°]ÐUVÐ4ÐWˆNä=DÀUÐL`×=aÑ=a�u×/Ñ/°Ô9ÐgkˆHä$Ø'Ø$ØØ$7Þ9JÐ!2°1Ò!5ÐPTØ'Ø-ØØØ#-ñˆHð ×"Ñ" 8Ô,Ø˜1ÑˆKà�z�zŠzØ×%Ñ% h×/ñe %ðh Ðùóo BùÛPs   £KÁK	ÚelementsrH   c                 ó¼  • / n/ nS nSn[        [        U R                  U5      5       GH.  nX'-
  S-
  nX   n	[        U	5      R                  n
U
S;   a    X44$ U
S:X  a  U(       a    X44$ [        U	S5      (       a  U	R                  (       d  Mc  U	R                  R                  5       nU(       d  M†  [        U	S5      =(       a    U	R                  S LnU(       aI  U	R                  nUc  UnUR                  SU5        MÓ  XÕ:X  a  U(       a  UR                  SU5        Mó    X44$ U(       d$  [        U5      S:X  a  UR                  SU5        GM"  U(       d  GM,  SnGM1     X44$ )	NTr   )Ú	TableItemÚPictureItemÚListItemÚtextÚlevelr   F)ÚrangeÚminr   ÚtypeÚ__name__r3   rU   ÚstriprV   Úinsertr9   )r   rP   rH   r&   rI   Úcurrent_levelÚconsecutiverC   ÚidxrD   Ú	elem_typerU   Ú	is_headerrV   s                 r   r5   Ú)HeaderConsolidator.find_preceding_headers_   sP  € ØˆØ')ÐØ'+ˆØˆä”s˜4×,Ñ,¨iÓ8×9ˆAØ‘- !Ñ#ˆCØ‘=ˆDÜ˜T›
×+Ñ+ˆIàÐ8Ó8Øð8 Ð)Ð)ð5 ˜JÓ&®7Øð2 Ð)Ð)ô/ ˜4 ×(Ñ(°·	·	Ùà—9‘9—?‘?Ó$ˆDÞÙä  gÓ.×I°4·:±:ÀTÐ3IˆIÞØŸ
™
�Ø Ñ(Ø$)�MØ—N‘N 1 dÖ+ØÓ+¶Ø—N‘N 1 dÖ+àð Ð)Ð)ö ¤3Ð'8Ó#9¸QÓ#>Ø%×,Ñ,¨Q°×5ß‘WØ"'“KñA :ðD Ð)Ð)r   r&   c                 óp   • U(       d  g [        U5      S:X  a  US   $ U R                  R                  U5      $ )Nr   r   )r9   r   Újoin)r   r&   s     r   r6   Ú&HeaderConsolidator.consolidate_headers‰   s3   € ÞØÜˆw‹<˜1ÓØ˜1‘:ÐØ�~‰~×"Ñ" 7Ó+Ð+r   r"   c                 óÌ  • / nSn[        [        U R                  U5      5       H¤  nX&-
  S-
  nX   n[        U5      R                  n	U	S:X  a  UR                  SS5        M=  [        US5      (       d  MP  UR                  (       d  Mc  UR                  R                  5       n
U
(       d  M†  UR                  SU
5        US-  nXS:¼  d  M¤    O   U(       a  SR                  U5      $ S $ )Nr   r   rR   z[Table]rU   Ú
)
rW   rX   r   rY   rZ   r\   r3   rU   r[   rd   )r   rP   rH   r"   ÚtextsÚcountrC   r_   rD   r`   rU   s              r   r;   Ú%HeaderConsolidator.get_preceding_text�   sÄ   € ØˆØˆä”s˜4×,Ñ,¨iÓ8Ö9ˆAØ‘- !Ñ#ˆCØ‘=ˆDÜ˜T›
×+Ñ+ˆIà˜KÓ'Ø—‘˜Q 	Ô*Ùä�t˜V×$Ó$¨¯¯©Ø—y‘y—‘Ó(�ß�4Ø—L‘L  DÔ)Ø˜Q‘J�EØ•~Ùñ :ö" $)ˆt�y‰y˜ÓÐ2¨dÐ2r   rM   c                 óü  • [        SUR                  S-    SUR                   S35        UR                  (       a  [        SUR                   35        UR                  (       a  [        SUR                   35        UR
                  (       a  [        SUR
                  S S  S	35        [        S
UR                   SUR                   S35        UR                  (       a  [        SUR                  S S  S	35        g g )Nz
=== Table r   z (Page z) ===zConsolidated Header: zIndividual Headers: zDescriptive Text: éd   z...zSize: z rows x z colszFirst Cell: é2   )	Úprintr$   r%   r'   r&   r(   r+   r,   r-   )r   rM   s     r   r=   Ú#HeaderConsolidator.print_debug_info§   sâ   € Ü�˜X×1Ñ1°AÑ5Ð6°g¸h×>RÑ>RÐ=SÐSXÐYÔZØ×'×'ÜÐ)¨(×*FÑ*FÐ)GÐHÔIØ××ÜÐ(¨×)9Ñ)9Ð(:Ð;Ô<Ø×$×$ÜÐ& x×'@Ñ'@ÀÀ#Ð'FÐ&GÀsÐKÔLÜ��x—}‘}�o X¨h¯m©m¨_¸EÐBÔCØ×&×&Ü�L ×!<Ñ!<¸S¸bÐ!AÐ BÀ#ÐFÕGð 'r   )r   r   r   r   )z ^ é
   TF)r!   )rZ   Ú
__module__Ú__qualname__Ú__firstlineno__r:   ÚintÚboolr   r	   r   r
   rN   r   r   r5   r   r6   r;   r=   Ú__static_attributes__© r   r   r   r      sò   † ð ØØ%)Øñ
àð
ð ð
ð #ð	
ð
 ð
ð 
õ
ð< Oð <¸¸]Ñ8Kô <ð|(*¨t°C©yð (*ÀSð (*ÈUÐSWÐX[ÑS\Ð^bÐcfÑ^gÐSgÑMhô (*ðT,¨4°©9ð ,¸À#¹ô ,ñ3¨4°©9ð 3Àð 3ÈSð 3ÐYaÐbeÑYfõ 3ð.
H¨ð 
H¸4÷ 
Hr   r   Úmetadata_listÚoutput_pathr   c                 óÒ  • [         R                  " 5       R                  5       [        U 5      U  Vs/ s Hk  nUR                  UR
                  UR                  UR                  UR                  UR                  UR                  UR                  S.UR                  S.PMm     snS.n[        USSS9 n[        R                  " X4SSS	9  S S S 5        g s  snf ! , (       d  f       g = f)
N)r+   r,   )r$   r%   r'   r&   r(   r*   Ú
dimensionsrJ   )Úextraction_dateÚtotal_tablesr2   Úwzutf-8)Úencodingé   F)ÚindentÚensure_ascii)r   ÚnowÚ	isoformatr9   r$   r%   r'   r&   r(   r*   r+   r,   r-   ÚopenÚjsonÚdump)rx   ry   Úmetar   Úfs        r   Úsave_metadatarŠ   ´   sÉ   € ä#Ÿ<š<›>×3Ñ3Ó5Ü˜MÓ*ñ &ó
ò &�ð  $×/Ñ/Ø#×/Ñ/Ø'+×'?Ñ'?ØŸ<™<Ø$(×$9Ñ$9Ø"&×"5Ñ"5Ø'+§y¡y¸$¿)¹)ÑDØ"×5Ñ5ô	ñ &ñ
ñ€Dô" 
ˆk˜3¨Ò	1°QÜ�	Š	�$ !°%Ò8÷ 
2Ð	1ùò
÷ 
2Õ	1ús   ±A2CÂ3CÃ
C&)Ú__doc__r†   r   Úpathlibr   Útypingr   r   r   r   Údocling_core.types.doc.documentr	   Úquber.core.modelsr
   r   r:   rŠ   rw   r   r   Ú<module>r�      sT   ðñó Ý Ý ß -Ó -å ;å +÷]Hñ ]Hð@9  mÑ!4ð 9À3ÈÁ:ð 9ÐRVõ 9r   