
    Dj)                       d Z ddlmZ ddlZddlmZmZ ddlmZ ddl	m
Z
mZmZ ddlmZmZ dd	lmZ  G d
 dee          Z G d dee          Z edd           G d d                      Z eej        ej        ej        ej                  ZdZdZ ed           G d d                      Z ed           G d d                      Z ed           G d d                      Z ej        j!        ddhZ"d%d$Z#dS )&ah  
Table reconstruction for Apple Notes MergeableData payloads (CloudKit/iCloud path).

Given a gzipped MergeableData payload for a table attachment, reconstructs the
row/column ordering and renders a plain HTML <table> with cell contents. Cell
contents are themselves Notes; callers provide a callback to render a pb.Note
into HTML using the existing renderer.
    )annotationsN)	dataclassfield)Enum)CallableListOptional)hraw   )	notes_pb2c                      e Zd ZdZdZdS )TypeNamez#Enum for CloudKit table type names.zcom.apple.notes.ICTableN)__name__
__module____qualname____doc__ICTABLE     j/home/thesage/.hermes/venv/lib/python3.11/site-packages/pyicloud/services/notes/rendering/table_builder.pyr   r      s        --'GGGr   r   c                      e Zd ZdZdZdZdZdS )MapKeyz'Enum for CloudKit table structure keys.crRows	crColumnscellColumnsN)r   r   r   r   CR_ROWS
CR_COLUMNSCELL_COLUMNSr   r   r   r   r      s#        11GJ LLLr   r   T)frozenslotsc                  <    e Zd ZU dZded<   ded<   ded<   ded<   dS )		TableSpecz*Configuration for table structure parsing.r   	type_namer   rows_keycols_keycellcols_keyN)r   r   r   r   __annotations__r   r   r   r#   r#   $   sH         44r   r#   )r$   r%   r&   r'   i   iP  )r!   c                  "    e Zd ZU dZdZded<   dS )Cellz,Table cell containing rendered HTML content. strhtmlN)r   r   r   r   r-   r(   r   r   r   r*   r*   9   s#         66DNNNNNNr   r*   c                  D    e Zd ZU dZ ee          Zded<   dZded<   dS )		AxisStatez-Tracks row or column indices and total count.default_factoryzdict[int, int]indicesr   inttotalN)	r   r   r   r   r   dictr2   r(   r4   r   r   r   r/   r/   @   sA         77#eD999G9999ENNNNNNr   r/   c                     e Zd ZU dZded<   ded<   ded<   ded<   d	ed
<    ed          Zded<    ee          Zded<    ee          Z	ded<    ee
          Zded<   d%dZd&dZd'dZd(dZd(dZd%d Zd(d!Zd)d#Zd$S )*TableBuilderzEReconstructs and renders tables from MergeableData protobuf payloads.z	List[str]	key_items
type_itemszList[bytes]
uuid_itemszList[pb.MergeableDataObjectRow]entriesCallable[[pb.Note], str]render_note_cbF)initzdict[bytes, int]
uuid_indexr0   r/   rowscolszList[List[Cell]]cellsreturnNonec                L    d t          | j                  D             | _        dS )z,Initialize UUID index for efficient lookups.c                    i | ]\  }}||	S r   r   ).0ius      r   
<dictcomp>z.TableBuilder.__post_init__.<locals>.<dictcomp>Y   s    GGGDAq1aGGGr   N)	enumerater:   r?   selfs    r   __post_init__zTableBuilder.__post_init__W   s%    GGIdo,F,FGGGr   entrypb.MergeableDataObjectRowOptional[int]c                    	 |j         j        d         j        j        }d|cxk    rt	          | j                  k     r)n n&| j                            | j        |         d          ndS # t          $ r Y dS w xY w)z/Extract UUID index from a mergeable data entry.r   N)	
custom_map	map_entryvalueunsigned_integer_valuelenr:   r?   get	Exception)rM   rO   vals      r   _uuid_index_from_entryz#TableBuilder._uuid_index_from_entry[   s    		",Q/5LC 2222c$/2222222 ##DOC$8$???
  	 	 	44	s   A%A( (
A65A6axisc                   d|_         |j                                         	 |j        j        j        j        D ]C}| j                            |j	                  }|$|j         |j        |<   |xj         dz  c_         Dn# t          $ r Y nw xY w	 |j        j        j        j        D ]}| j        |j        j                 }| j        |j        j                 }|                     |          }|                     |          }	|	]|j                            ||j                            |	d                    }
t%          |j         |
dz             |_         |
|j        |	<   dS # t          $ r Y dS w xY w)z9Parse row or column ordering from a mergeable data entry.r   N   )r4   r2   clearordered_setorderingarray
attachmentr?   rX   uuidrY   contentselementr;   keyobject_indexrU   r[   max)rM   rO   r\   attidxelemk_entv_entk_idxv_idxposs              r   _parse_axiszTableBuilder._parse_axish   s   
	(17B    o))#(33;$(JS!

a


   	 	 	D		)2;C 	* 	*TX%:;TZ%<=33E::33E::=l&&udl.>.>ua.H.HII S1W55
&)U##	* 	*  	 	 	DD	s%   AA= =
B
	B
CE 
E-,E-c                <    |                      || j                   dS )z-Parse and cache row ordering from table data.N)rr   r@   rM   rO   s     r   
parse_rowszTableBuilder.parse_rows        	*****r   c                <    |                      || j                   dS )z0Parse and cache column ordering from table data.N)rr   rA   rt   s     r   
parse_colszTableBuilder.parse_cols   rv   r   c                F     j         j        dk    s\ j        j        dk    sL j         j        t          k    s7 j        j        t          k    s" j         j         j        j        z  t          k    r	g  _        dS  fdt           j         j                  D              _        dS )z4Initialize cell buffer grid with correct dimensions.r   Nc                V    g | ]%}d  t          j        j                  D             &S )c                *    g | ]}t                      S r   )r*   )rG   _s     r   
<listcomp>z>TableBuilder.init_table_buffers.<locals>.<listcomp>.<listcomp>   s    444TVV444r   )rangerA   r4   )rG   r|   rM   s     r   r}   z3TableBuilder.init_table_buffers.<locals>.<listcomp>   sA     
 
 
9:44U49?33444
 
 
r   )r@   r4   rA   MAX_TABLE_AXIS_ITEMSMAX_TABLE_CELLSrB   r~   rL   s   `r   init_table_bufferszTableBuilder.init_table_buffers   s     IOq  y!##y!555y!555y0?BBDJF
 
 
 
>CDIO>T>T
 
 



r   c                B   |j         j        D ]}	 | j        |j        j                 }| j        j                            |                     |                    }|P| j        |j	        j                 }n# t          $ r Y tw xY w|j         j        D ]
}	 | j        |j        j                 }| j        j                            |                     |                    }|P| j        |j	        j                 }	n# t          $ r Y tw xY w|	                    d          s	 |	j        }
|                     |
          }|t          | j                  k    s|t          | j        |                   k    r|| j        |         |         _        # t          $ r Y w xY wdS )z6Extract and render cell contents into the cell buffer.Nnote)
dictionaryrf   r;   rg   rh   rA   r2   rX   r[   rU   rY   r@   HasFieldr   r=   rW   rB   r-   )rM   rO   colcol_key_entcol_poscol_dict_entrowrow_key_entrow_poscell_ent	cell_note
inner_htmls               r   parse_cell_columnszTableBuilder.parse_cell_columns   s    #+ !	 !	C	"l37+?@)+////<<  ?#|CI,BC   #.6  	"&,sw/C"DK"i/3333K@@ G  #|CI,BCHH    H((00 	 (I!%!4!4Y!?!?J#dj//11W
7+A A 6 6 !8BDJw'055    H+!	 !	sJ   AA5A55
BBAC9!C99
DD AF3F
FFOptional[str]c           	        | j         r | j        j        dk    s| j        j        dk    rdS g }t	          | j        j                  D ]}g }t	          | j        j                  D ]T}| j         |         |         j        pd}|                     t          d          t          |                               U|                     t          d          |             t          d          | 	                                S )z4Generate HTML table from parsed cells and structure.r   Nr+   tdtrtable)
rB   r@   r4   rA   r~   r-   appendr
   r   render)rM   trsrtdsc	cell_htmls         r   render_html_tablezTableBuilder.render_html_table   s    z 	TY_11TY_5I5I4ty'' 	& 	&A "C49?++ 4 4 JqM!,17R	

71T773y>>223333JJwqww}%%%%qzz3&&(((r   N)rC   rD   )rO   rP   rC   rQ   )rO   rP   r\   r/   rC   rD   )rO   rP   rC   rD   )rC   r   )r   r   r   r   r(   r   r?   r/   r@   rA   listrB   rN   r[   rr   ru   rx   r   r   r   r   r   r   r7   r7   H   su        OO,,,,,,,,#(5e#4#4#4J4444eI666D6666eI666D6666#eD999E9999H H H H      :+ + + ++ + + +
 
 
 
$ $ $ $L) ) ) ) ) )r   r7   zcom.apple.notes.ICTable2zcom.apple.notes.CRTablegz_bytesbytesr=   r<   rC   r   c                \   | sdS 	 t          j        |           }n# t          $ r | }Y nw xY w	 t          j                    }|                    |           |j        j        }t          |j	                  t          |j
                  }t          |j                  }t          |j                  }n# t          $ r Y dS w xY w|D ]c}|                    d          s	 |j        j        }	d|	cxk    ot!          |          k     nc o||	         t"          v }
n# t          $ r d}
Y nw xY wdx}x}}	 fd|j        j        D             }t&          j        j        |v }t&          j        j        |v }t&          j        j        |v }n# t          $ r Y nw xY w|
s|r|r|st1          ||||          }d}|j        j        D ]}d|j        cxk    rt!                    k     rn n|j                 nd}	 ||j        j                 }n# t          $ r Y Sw xY w|t&          j        j        k    r'	 |                    |           # t          $ r Y w xY w|t&          j        j        k    r'	 |                    |           # t          $ r Y w xY w|t&          j        j        k    r|}|j        j        dk    s|j        j        dk    r|                                  |j!        s|r(	 |"                    |           n# t          $ r Y Ew xY w|#                                }|r|c S edS )zIParse gzipped MergeableData and render as HTML table, or None if invalid.NrS   r   Fc                n    g | ]1}d |j         cxk    rt                    k     !n n|j                  2S )r   )rg   rW   )rG   mer8   s     r   r}   z/render_table_from_mergeable.<locals>.<listcomp>   sT       ////Y///// "&!///r   )r8   r9   r:   r;   r=   )$gzip
decompressrY   pbMergableDataProtoParseFromStringmergable_data_objectmergeable_data_object_datar   mergeable_data_object_key_itemmergeable_data_object_type_itemmergeable_data_object_uuid_itemmergeable_data_object_entryr   rS   typerW   ALLOWED_TABLE_TYPESrT   
TABLE_SPECr%   rU   r&   r'   r7   rg   rh   ru   rx   r@   r4   rA   r   rB   r   r   )r   r=   payloadmdatar9   r:   r;   etype_idxtname_okhas_rowshas_cols	has_cellskeynamestbpending_cell_columnsr   knametarget
html_tabler8   s                        @r   render_table_from_mergeabler      sL     t/(++   	 ""	'"""%@<==	$>??
$>??
t788   tt  C Czz,'' 		|(HX////J//// @x(,?? H  	 	 	HHH	 +0//8i
	   ,0  H
 "*0H<H!*0H<H"/5AII 	 	 	D	  	X 	( 	y 	!!)
 
 
 EI,( 	. 	.B)*bf)E)E)E)Es9~~)E)E)E)E)EIbf%%4E !67   
+111MM&))))    H*-333MM&))))    H*1777'-$7=A!!3!3
x 	 	%%&:;;;;   ))++
 		4s    ++BB4 4
CC!8DD)(D)3AF
FF4H
HH-I
II)I??
JJ)K??
LL)r   r   r=   r<   rC   r   )$r   
__future__r   r   dataclassesr   r   enumr   typingr   r   r	   tinyhtmlr
   r   protobufr   r   r,   r   r   r#   r   r   r   r   r   r   r   r*   r/   r7   rU   r   r   r   r   r   <module>r      s    # " " " " "  ( ( ( ( ( ( ( (       + + + + + + + + + +         & & & & & &( ( ( ( (sD ( ( (! ! ! ! !S$ ! ! ! $d###       $# Y^$	  
                   D) D) D) D) D) D) D) D)P  Z Z Z Z Z Zr   