o
    l>j)                     @  s&  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 deeZG dd deeZedddG dd dZeejejejejdZdZdZeddG dd dZeddG dd dZeddG dd dZ ejj!ddhZ"d&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                   @  s   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 r   r   d/home/thesage/.local/lib/python3.10/site-packages/pyicloud/services/notes/rendering/table_builder.pyr      s    r   c                   @  s   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
    r   T)frozenslotsc                   @  s2   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   $   s   
 r   )r   r    r!   r"   i   iP  )r   c                   @  s   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   
 r$   c                   @  s0   e Zd ZU dZeed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   dictr+   r#   r-   r   r   r   r   r(   @   s   
 r(   c                   @  s   e Zd ZU dZded< ded< ded< ded< d	ed
< eddZded< eedZded< eedZ	ded< ee
dZded< d-ddZd.ddZd/dd Zd0d!d"Zd0d#d$Zd-d%d&Zd0d'd(Zd1d*d+Zd,S )2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_indexr)   r(   rowscolszList[List[Cell]]cellsreturnNonec                 C  s   dd t | jD | _dS )z,Initialize UUID index for efficient lookups.c                 S  s   i | ]\}}||qS r   r   ).0iur   r   r   
<dictcomp>Y   s    z.TableBuilder.__post_init__.<locals>.<dictcomp>N)	enumerater2   r7   selfr   r   r   __post_init__W   s   zTableBuilder.__post_init__entrypb.MergeableDataObjectRowOptional[int]c                 C  s`   z%|j jd jj}d|  krt| jk r#n n| j| j| dW S dW S  ty/   Y dS w )z/Extract UUID index from a mergeable data entry.r   N)	
custom_map	map_entryvalueunsigned_integer_valuelenr2   r7   get	Exception)rC   rE   valr   r   r   _uuid_index_from_entry[   s   z#TableBuilder._uuid_index_from_entryaxisc                 C  s  d|_ |j  z$|jjjjD ]}| j|j	}|du rq|j |j|< | j d7  _ qW n	 t
y5   Y nw zC|jjjjD ]9}| j|jj }| j|jj }| |}| |}	|	du r\q=|j||j|	d}
t|j |
d |_ |
|j|	< q=W dS  t
y   Y dS w )z9Parse row or column ordering from a mergeable data entry.r   N   )r-   r+   clearordered_setorderingarray
attachmentr7   rM   uuidrN   contentselementr3   keyobject_indexrJ   rP   max)rC   rE   rQ   attidxelemk_entv_entk_idxv_idxposr   r   r   _parse_axish   s8   



zTableBuilder._parse_axisc                 C     |  || j dS )z-Parse and cache row ordering from table data.N)rf   r8   rC   rE   r   r   r   
parse_rows      zTableBuilder.parse_rowsc                 C  rg   )z0Parse and cache column ordering from table data.N)rf   r9   rh   r   r   r   
parse_cols   rj   zTableBuilder.parse_colsc                   sn    j jdks" jjdks" j jtks" jjtks" j j jj tkr'g  _dS  fddt j jD  _dS )z4Initialize cell buffer grid with correct dimensions.r   Nc                   s"   g | ]}d d t  jjD qS )c                 S  s   g | ]}t  qS r   )r$   r=   _r   r   r   
<listcomp>   s    z>TableBuilder.init_table_buffers.<locals>.<listcomp>.<listcomp>)ranger9   r-   rl   rB   r   r   rn      s    z3TableBuilder.init_table_buffers.<locals>.<listcomp>)r8   r-   r9   MAX_TABLE_AXIS_ITEMSMAX_TABLE_CELLSr:   ro   rB   r   rB   r   init_table_buffers   s   

zTableBuilder.init_table_buffersc              
   C  s.  |j jD ]}z | j|jj }| jj| |}|du rW q| j|j	j }W n	 t
y/   Y qw |j jD ]_}z | j|jj }| jj| |}|du rNW q4| j|j	j }	W n	 t
y_   Y q4w |	dsfq4z$|	j}
| |
}|t| jks|t| j| krW q4|| j| | _W q4 t
y   Y q4w qdS )z6Extract and render cell contents into the cell buffer.Nnote)
dictionaryrZ   r3   r[   r\   r9   r+   rM   rP   rJ   rN   r8   HasFieldrs   r5   rL   r:   r'   )rC   rE   colcol_key_entcol_poscol_dict_entrowrow_key_entrow_poscell_ent	cell_note
inner_htmlr   r   r   parse_cell_columns   sN   

zTableBuilder.parse_cell_columnsOptional[str]c                 C  s   | j r| jjdks| jjdkrdS g }t| jjD ]+}g }t| jjD ]}| j | | jp.d}|tdt| q#|td|  qtd| 	 S )z4Generate HTML table from parsed cells and structure.r   Nr%   tdtrtable)
r:   r8   r-   r9   ro   r'   appendr	   r
   render)rC   trsrtdsc	cell_htmlr   r   r   render_html_table   s   zTableBuilder.render_html_tableN)r;   r<   )rE   rF   r;   rG   )rE   rF   rQ   r(   r;   r<   )rE   rF   r;   r<   )r;   r   )r   r   r   r   r#   r   r7   r(   r8   r9   listr:   rD   rP   rf   ri   rk   rr   r   r   r   r   r   r   r/   H   s&   
 






&r/   zcom.apple.notes.ICTable2zcom.apple.notes.CRTablegz_bytesbytesr5   r4   r;   r   c              
     s  | sdS zt | }W n ty   | }Y nw z#t }|| |jj}t|j	 t|j
}t|j}t|j}W n
 tyD   Y dS w |D ]}|dsPqGz|jj}	d|	  ko`t|k n  oh||	 tv }
W n tyu   d}
Y nw d } }}z fdd|jjD }tjj|v }tjj|v }tjj|v }W n	 ty   Y nw |
s|r|r|sqGt ||||d}d}|jjD ]c}d|j  krt k rn n |j nd}z||jj }W n	 ty   Y qw |tjjkrz|| W q ty   Y qw |tjjkrz|| W q ty   Y qw |tjjkr |}q|jjdks/|jjdkr0qG|   |j!s9qG|rNz|"| W n
 tyM   Y qGw |# }|rY|  S qGdS )zIParse gzipped MergeableData and render as HTML table, or None if invalid.NrH   r   Fc                   s4   g | ]}d |j   krt k rn n |j  qS )r   )r[   rL   )r=   mer0   r   r   rn      s
    z/render_table_from_mergeable.<locals>.<listcomp>)r0   r1   r2   r3   r5   )$gzip
decompressrN   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_entryru   rH   typerL   ALLOWED_TABLE_TYPESrI   
TABLE_SPECr    rJ   r!   r"   r/   r[   r\   ri   rk   r8   r-   r9   rr   r:   r   r   )r   r5   payloadmdatar1   r2   r3   etype_idxtname_okhas_rowshas_cols	has_cellskeynamestbpending_cell_columnsr   knametarget
html_tabler   r   r   render_table_from_mergeable   s   







,r   )r   r   r5   r4   r;   r   )$r   
__future__r   r   dataclassesr   r   enumr   typingr   r   r   tinyhtmlr	   r
   protobufr   r   r&   r   r   r   r   r   r   r   r   rp   rq   r$   r(   r/   rJ   r   r   r   r   r   r   <module>   s@    	
	 	