o
    l>j4                     @  s  U d Z ddlmZ ddlZddlmZ ddlmZmZm	Z	 ddl
mZ ddlmZ dd	lmZ ed
dG dd dZdKddZdLddZdddMddZG d d! d!ZG d"d# d#eZG d$d% d%eZG d&d' d'eZG d(d) d)eZG d*d+ d+eZG d,d- d-eZG d.d/ d/eZG d0d1 d1eZG d2d3 d3eZG d4d5 d5eZG d6d7 d7eZe Z e Z!e Z"e Z#e Z$e Z%e Z&e Z'e Z(e Z)e Z*e!e"e$e&e&e&e'e(e)e*e#e%e%e%e%d8Z+d9e,d:< d;e#fd<e#fd=e#fd>e#fd?e#fd@e#fdAe#fdBe#fdCe#fdDe#fg
Z-dEe,dF< dNdIdJZ.dS )Oa  
UTI-based attachment rendering strategies for Apple Notes.

This module contains a small, pure dispatcher that maps a note attachment's
type_uti (and available datasource metadata) to an HTML fragment. It
intentionally performs no I/O; all data must be provided by the caller via the
AttachmentContext.

Design:
  - AttachmentContext: immutable bundle of fields the strategies may use
  - Renderers: small classes implementing `render(ctx, render_note_cb)`
  - Dispatcher: exact UTI map, then prefix rules, then default fallback

`render_note_cb` is a callback used by the table renderer to render nested
pb.Note cells (delegates back to the main note renderer without creating a
cyclic import).
    )annotationsN)	dataclass)AnyCallableOptional)urlsplit)h   )render_table_from_mergeableT)frozenc                   @  s   e Zd ZU dZded< ded< ded< ded< ded< d	ed
< dZded< dZded< dZded< dZded< dZ	ded< ddddZ
dS )AttachmentContextz6Immutable bundle of attachment metadata for rendering.stridutiOptional[str]titleprimary_url	thumb_urlzOptional[bytes]mergeable_gzN
prior_textlink_targetlink_rellink_referrerpolicyzOptional[int]pdf_object_heightextradict[str, str] | Nonereturndict[str, str]c                 C  s"   d| j | jd}|r|| |S )z3Build base HTML attributes for attachment elements.
attachment)classzdata-utizdata-id)r   r   update)selfr   base r#   b/home/thesage/.local/lib/python3.10/site-packages/pyicloud/services/notes/rendering/attachments.py
base_attrs1   s   
zAttachmentContext.base_attrs)N)r   r   r   r   )__name__
__module____qualname____doc____annotations__r   r   r   r   r   r%   r#   r#   r#   r$   r      s   
 r   urlr   allowed_schemesset[str]r   c                C  s   | sd S d dd t|  D }|r|drd S t|}|js$|S |j }||vr/d S |dv r8|js8d S |dv rD|jsD|jsDd S |S )N c                 s  s$    | ]}|d kr|dkr|V  qdS ) Nr#   ).0chr#   r#   r$   	<genexpr>E   s   " z_safe_url.<locals>.<genexpr>z//>   httphttps>   telmailto)	joinr   strip
startswithr   schemecasefoldnetlocpath)r+   r,   	candidatepartsr;   r#   r#   r$   	_safe_url=   s    
rA   r   boolc                 C  s   t | }|j dv S )N>   r4   r5   )r   r;   r<   )r+   r@   r#   r#   r$   _is_remote_urlW   s   rC   )hrefctx
class_namerD   r   c                C  sH   d|i}|r
||d< | j r| j |d< | jr| j|d< | jr"| j|d< |S )Nr   rD   relreferrerpolicytarget)r   r   r   )rE   rF   rD   attrsr#   r#   r$   _link_attrs\   s   


rK   c                   @     e Zd ZdZddd	Zd
S )	_Rendererz)Base class for attachment type renderers.rE   r   render_note_cbr   r   r   c                 C  s   t )z5Render attachment to HTML fragment based on its type.)NotImplementedError)r!   rE   rN   r#   r#   r$   renderq   s   z_Renderer.renderNrE   r   rN   r   r   r   r&   r'   r(   r)   rP   r#   r#   r#   r$   rM   n       rM   c                   @  rL   )_DefaultRendererz/Fallback renderer for unknown attachment types.rE   r   rN   r   r   r   c              
   C  sJ   |j p|jpd}t|jddhd}t	di |t|d|d| S )	Nr   r4   r5   r,   aattachment linkrF   rD   rV   r   r   rA   r   r   r%   rK   rP   )r!   rE   rN   labelrD   r#   r#   r$   rP   {   s   z_DefaultRenderer.renderNrQ   rR   r#   r#   r#   r$   rT   x   rS   rT   c                   @  rL   )_TableRendererz2Render table attachments with embedded table data.rE   r   rN   r   r   r   c              
   C  sd   |j rt|j |}|r|S |jp|jpd}t|jddhd}t	di |t|d|d|	 S )	Ntabler4   r5   rU   rV   rW   rX   rY   )
r   r
   r   r   rA   r   r   r%   rK   rP   )r!   rE   rN   html_tblr[   rD   r#   r#   r$   rP      s   z_TableRenderer.renderNrQ   rR   r#   r#   r#   r$   r\      rS   r\   c                   @  rL   )_UrlRendererzRender URL/link attachments.rE   r   rN   r   r   r   c              
   C  st   |j p|jpd}t|jh dd}|r't	di |t|d|d| S t	di |t|dd| S )	Nlink>   r6   r4   r5   r7   rU   rV   rW   rX   )rF   rY   rZ   r!   rE   rN   r   rD   r#   r#   r$   rP      s4   z_UrlRenderer.renderNrQ   rR   r#   r#   r#   r$   r_      rS   r_   c                   @  rL   )_ImageRendererz0Render image attachments with responsive sizing.rE   r   rN   r   r   r   c                 C  s   t |jddhdpt |jddhd}|jp|jpd}|r8|||ddd}dd	d
 | D }d| dS tdi |ddi|	 S )Nr4   r5   rU   imagezattachment imagemax-width:100%;height:auto)srcaltr   styler/   c                 s  *    | ]\}}| d t | dV  qdS z=""Nhtmlescaper1   kvr#   r#   r$   r3         ( z(_ImageRenderer.render.<locals>.<genexpr>z<img >rV   r   rW   rY   )
rA   r   r   r   r   r%   r8   itemsr   rP   )r!   rE   rN   r+   rf   rJ   	attr_htmlr#   r#   r$   rP      s*    z_ImageRenderer.renderNrQ   rR   r#   r#   r#   r$   rb      rS   rb   c                   @  rL   )_AudioRendererz'Render audio attachments with controls.rE   r   rN   r   r   r   c                 C  sz   t |jddhd}|r%||dd}ddd | D }d	| d
S |jp,|jp,d}tdi |ddi| S )Nr4   r5   rU   zattachment audio)re   r   r/   c                 s  rh   ri   rk   rn   r#   r#   r$   r3      rq   z(_AudioRenderer.render.<locals>.<genexpr>z<audio controls z	></audio>audiorV   r   rW   rY   	rA   r   r%   r8   rs   r   r   r   rP   r!   rE   rN   r+   rJ   rt   r   r#   r#   r$   rP      s    z_AudioRenderer.renderNrQ   rR   r#   r#   r#   r$   ru      rS   ru   c                   @  rL   )_VideoRendererz=Render video attachments with controls and responsive sizing.rE   r   rN   r   r   r   c                 C  s~   t |jddhd}|r'||dddd}dd	d
 | D }d| dS |jp.|jp.d}tdi |ddi| S )Nr4   r5   rU   zattachment videocontrolsrd   )re   r   rz   rg   r/   c                 s  rh   ri   rk   rn   r#   r#   r$   r3      rq   z(_VideoRenderer.render.<locals>.<genexpr>z<video z	></video>videorV   r   rW   rY   rw   rx   r#   r#   r$   rP      s    z_VideoRenderer.renderNrQ   rR   r#   r#   r#   r$   ry      rS   ry   c                   @  rL   )_PdfRendererz,Render PDF attachments embedded or as links.rE   r   rN   r   r   r   c           	   
   C  s   |j pd}t|jddhd}|ret|}|sQt|jtr$|jdkr$|jnd}||ddd	| d
d}t	di |t	|d|d|}tdi ||
 S t	di |t	|d|d|
 S tdi |ddi|
 S )NPDFr4   r5   rU   r   iX  zapplication/pdfzattachment pdfzwidth:100%;height:px)datatyper   rg   rV   rW   rX   objectzattachment filer   rY   )r   )r   rA   r   rC   
isinstancer   intr%   r   rK   rP   )	r!   rE   rN   r   r+   	is_remote	height_px	obj_attrsfallbackr#   r#   r$   rP      sP   



	 z_PdfRenderer.renderNrQ   rR   r#   r#   r#   r$   r|      rS   r|   c                   @  rL   )_VCardRendererz!Render contact/vCard attachments.rE   r   rN   r   r   r   c              
   C  sh   |j pd}t|jddhd}|r$t	d	i |t|d|d| S td	i |ddi| S )
Ncontactr4   r5   rU   rV   zattachment contactrX   r   rY   )r   rA   r   r   r%   rK   rP   ra   r#   r#   r$   rP     s   
 z_VCardRenderer.renderNrQ   rR   r#   r#   r#   r$   r     rS   r   c                   @  rL   )_HashtagRendererz"Render hashtag inline attachments.rE   r   rN   r   r   r   c                 C  st   |j r|j  }|dr|nd| }n|jpd}|dr%|dd  n|}|d|d}tdi || S )N#hashtagr	   zattachment hashtag)r   zdata-tagspanr   )r   r9   r:   r   r%   r   rP   )r!   rE   rN   rawtexttag_normrJ   r#   r#   r$   rP   %  s   

z_HashtagRenderer.renderNrQ   rR   r#   r#   r#   r$   r   "  rS   r   c                   @  rL   )_CalculatorRendererz,Render calculator result inline attachments.rE   r   rN   r   r   r   c                 C  0   |j p|jpd}tdi |ddi| S )Nresultr   r   zattachment calcr   r   r   r   r%   rP   r!   rE   rN   r[   r#   r#   r$   rP   5  s    z_CalculatorRenderer.renderNrQ   rR   r#   r#   r#   r$   r   2  rS   r   c                   @  rL   )_GraphExpressionRendererz;Render graph expression inline attachments from calculator.rE   r   rN   r   r   r   c                 C  r   )N
expressionr   r   zattachment calc-graphr   r   r   r#   r#   r$   rP   B  s   z_GraphExpressionRenderer.renderNrQ   rR   r#   r#   r#   r$   r   ?  rS   r   )zcom.apple.notes.tablez
public.urlzcom.apple.m4a-audiozcom.adobe.pdfz
public.pdfzcom.apple.paper.doc.pdfzpublic.vcardz,com.apple.notes.inlinetextattachment.hashtagz4com.apple.notes.inlinetextattachment.calculateresultz=com.apple.notes.inlinetextattachment.calculategraphexpressionzcom.apple.paperzcom.apple.quicktime-moviezpublic.moviezpublic.videozpublic.mpeg-4zdict[str, _Renderer]_EXACTzpublic.imagezpublic.jpegz
public.jpgz
public.pngzpublic.heiczpublic.heifzpublic.tiffz
public.gifz
public.bmpzpublic.webpzlist[tuple[str, _Renderer]]_PREFIXrN   Callable[[Any], str]c                 C  s`   | j pd }t|}|d ur|| |S tD ]\}}||r)|| |  S qt| |S )Nr.   )r   lowerr   getrP   r   r:   _DEFAULT)rE   rN   r   rprefixrrr#   r#   r$   render_attachment{  s   

r   )r+   r   r,   r-   r   r   )r+   r   r   rB   )rE   r   rF   r   rD   r   r   r   )rE   r   rN   r   r   r   )/r)   
__future__r   rl   dataclassesr   typingr   r   r   urllib.parser   tinyhtmlr   table_builderr
   r   rA   rC   rK   rM   rT   r\   r_   rb   ru   ry   r|   r   r   r   r   r   _TABLE_URL_IMAGE_AUDIO_VIDEO_PDF_VCARD_HASHTAG_CALC_GRAPHr   r*   r   r   r#   r#   r#   r$   <module>   s    

	
+