
    Dj4                    j   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
           G d d                      ZdGdZdHdZdddIdZ G d d          Z G d d e          Z G d! d"e          Z G d# d$e          Z G d% d&e          Z G d' d(e          Z G d) d*e          Z G d+ d,e          Z G d- d.e          Z G d/ d0e          Z G d1 d2e          Z G d3 d4e          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%d5Z+d6e,d7<   d8e#fd9e#fd:e#fd;e#fd<e#fd=e#fd>e#fd?e#fd@e#fdAe#fg
Z-dBe,dC<   dJdFZ.dS )Ka  
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                      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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                T    d| j         | j        d}|r|                    |           |S )z3Build base HTML attributes for attachment elements.
attachment)classzdata-utizdata-id)r   r   update)selfr   bases      h/home/thesage/.hermes/venv/lib/python3.11/site-packages/pyicloud/services/notes/rendering/attachments.py
base_attrszAttachmentContext.base_attrs1   s>     "w
 

  	KK    )N)r   r   r   r   )__name__
__module____qualname____doc____annotations__r   r   r   r   r   r'    r(   r&   r   r      s         @@GGGHHH!!!! $J$$$$!%K%%%%"H"""")-----'+++++	 	 	 	 	 	 	r(   r   urlr   allowed_schemesset[str]r   c               l   | sd S d                     d t          |                                           D                       }|r|                    d          rd S t	          |          }|j        s|S |j                                        }||vrd S |dv r	|j        sd S |dv r|j        s	|j        sd S |S )N c              3  2   K   | ]}|d k    |dk    |V  dS ) Nr.   ).0chs     r&   	<genexpr>z_safe_url.<locals>.<genexpr>E   s.      TTrsrV||||||TTr(   z//>   httphttps>   telmailto)	joinr   strip
startswithr   schemecasefoldnetlocpath)r/   r0   	candidatepartsrA   s        r&   	_safe_urlrG   =   s    
  tTTSXX^^%5%5TTTTTI 	,,T22 tYE< \""$$F_$$t"""5<"t"""EJ"%,"tr(   r   boolc                V    t          |           }|j                                        dv S )N>   r:   r;   )r   rA   rB   )r/   rF   s     r&   _is_remote_urlrJ   W   s'    SMME<  ""&777r(   )hrefctx
class_namerK   r   c                   d|i}|r||d<   | j         r
| j         |d<   | j        r
| j        |d<   | j        r
| j        |d<   |S )Nr"   rK   relreferrerpolicytarget)r   r   r   )rL   rM   rK   attrss       r&   _link_attrsrS   \   sg     j!E f
| $|e
 :"%"9
 */hLr(   c                      e Zd ZdZd
dZd	S )	_Rendererz)Base class for attachment type renderers.rL   r   render_note_cbr   r   r   c                    t           )z5Render attachment to HTML fragment based on its type.)NotImplementedError)r$   rL   rV   s      r&   renderz_Renderer.renderq   s
     "!r(   NrL   r   rV   r   r   r   r)   r*   r+   r,   rY   r.   r(   r&   rU   rU   n   s.        33" " " " " "r(   rU   c                      e Zd ZdZd
dZd	S )_DefaultRendererz/Fallback renderer for unknown attachment types.rL   r   rV   r   r   r   c                    |j         p|j        pd}t          |j        ddh          } t	          	 di |                    t          |d|                    |                                          S )	Nr!   r:   r;   r0   aattachment linkrM   rK   r`   r   r   rG   r   r	   r'   rS   rY   )r$   rL   rV   labelrK   s        r&   rY   z_DefaultRenderer.render{   s    	4SW467:KLLL
q
 
nn[9JQUVVVWW
 
   	r(   NrZ   r[   r.   r(   r&   r]   r]   x   s.        99     r(   r]   c                      e Zd ZdZd
dZd	S )_TableRendererz2Render table attachments with embedded table data.rL   r   rV   r   r   r   c                (   |j         rt          |j         |          }|r|S |j        p|j        pd}t	          |j        ddh          } t          	 di |                    t          |d|                    |          	                                S )	Ntabler:   r;   r_   r`   ra   rb   rc   )
r   r   r   r   rG   r   r	   r'   rS   rY   )r$   rL   rV   html_tblre   rK   s         r&   rY   z_TableRenderer.render   s     	 233C^TTH  	/SW/67:KLLL
q
 
nn[9JQUVVVWW
 
   	r(   NrZ   r[   r.   r(   r&   rg   rg      s.        <<     r(   rg   c                      e Zd ZdZd
dZd	S )_UrlRendererzRender URL/link attachments.rL   r   rV   r   r   r   c                   |j         p|j        pd}t          |j        h d          }|rK t	          	 di |                    t          |d|                    |                                          S  t	          	 di |                    t          |d                    |                                          S )	Nlink>   r<   r:   r;   r=   r_   r`   ra   rb   )rM   rc   rd   r$   rL   rV   r   rK   s        r&   rY   z_UrlRenderer.render   s    	.SW.O>>>
 
 
  	1 ..0AMMM  
  
 VXX
q
 
nn[9JKKKLL
 
   	r(   NrZ   r[   r.   r(   r&   rl   rl      s.        &&     r(   rl   c                      e Zd ZdZd
dZd	S )_ImageRendererz0Render image attachments with responsive sizing.rL   r   rV   r   r   r   c           	        t          |j        ddh          pt          |j        ddh          }|j        p|j        pd}|rQ|                    ||ddd          }d                    d	 |                                D                       }d
| dS  t          di |                    ddi          |          	                                S )Nr:   r;   r_   imagezattachment imagemax-width:100%;height:auto)srcaltr"   styler5   c              3  P   K   | ]!\  }}| d t          j        |           dV  "dS z=""Nhtmlescaper7   kvs      r&   r9   z(_ImageRenderer.render.<locals>.<genexpr>   ?       U Utq!A!:!:Q!:!:!: U U U U U Ur(   z<img >r`   r"   ra   rc   )
rG   r   r   r   r   r'   r>   itemsr	   rY   )r$   rL   rV   r/   rv   rR   	attr_htmls          r&   rY   z_ImageRenderer.render   s	   O#W-
 
 
 
 M#W-
 
 
 	 i-37-g 	(NN/9	  E  U Uu{{}} U U UUUI'9''''EqEE1B'CDDEEcJJQQSSSr(   NrZ   r[   r.   r(   r&   rq   rq      s4        ::T T T T T Tr(   rq   c                      e Zd ZdZd
dZd	S )_AudioRendererz'Render audio attachments with controls.rL   r   rV   r   r   r   c           	     l   t          |j        ddh          }|rO|                    |dd          }d                    d |                                D                       }d| d	S |j        p|j        pd
} t          di |                    ddi          |                                          S )Nr:   r;   r_   zattachment audio)ru   r"   r5   c              3  P   K   | ]!\  }}| d t          j        |           dV  "dS ry   r{   r~   s      r&   r9   z(_AudioRenderer.render.<locals>.<genexpr>   r   r(   z<audio controls z	></audio>audior`   r"   ra   rc   	rG   r   r'   r>   r   r   r   r	   rY   r$   rL   rV   r/   rR   r   r   s          r&   rY   z_AudioRenderer.render   s    &'9JKKK 	;NN39K#L#LMME U Uu{{}} U U UUUI:i::::	/SW/EqEE1B'CDDEEeLLSSUUUr(   NrZ   r[   r.   r(   r&   r   r      s4        11V V V V V Vr(   r   c                      e Zd ZdZd
dZd	S )_VideoRendererz=Render video attachments with controls and responsive sizing.rL   r   rV   r   r   r   c           	     p   t          |j        ddh          }|rQ|                    |dddd          }d                    d	 |                                D                       }d
| dS |j        p|j        pd} t          di |                    ddi          |                                          S )Nr:   r;   r_   zattachment videocontrolsrt   )ru   r"   r   rw   r5   c              3  P   K   | ]!\  }}| d t          j        |           dV  "dS ry   r{   r~   s      r&   r9   z(_VideoRenderer.render.<locals>.<genexpr>   r   r(   z<video z	></video>videor`   r"   ra   rc   r   r   s          r&   rY   z_VideoRenderer.render   s    &'9JKKK 
	2NN/ *9	  E  U Uu{{}} U U UUUI1Y1111	/SW/EqEE1B'CDDEEeLLSSUUUr(   NrZ   r[   r.   r(   r&   r   r      s4        GGV V V V V Vr(   r   c                      e Zd ZdZd
dZd	S )_PdfRendererz,Render PDF attachments embedded or as links.rL   r   rV   r   r   r   c                   |j         pd}t          |j        ddh          }|rt          |          }|st	          |j        t                    r|j        dk    r|j        nd}|                    |ddd	| d
d          } t          	 di |                    t          |d|                    |          } t          di ||          
                                S  t          	 di |                    t          |d|                    |          
                                S  t          di |                    ddi          |          
                                S )NPDFr:   r;   r_   r   iX  zapplication/pdfzattachment pdfzwidth:100%;height:px)datatyper"   rw   r`   ra   rb   objectzattachment filer"   rc   )r   )r   rG   r   rJ   
isinstancer   intr'   r	   rS   rY   )	r$   rL   rV   r   r/   	is_remote	height_px	obj_attrsfallbacks	            r&   rY   z_PdfRenderer.render   s   	"U&'9JKKK  	&s++I C "#"7==-11 )) 	   NN # 1!1!Ci!C!C!C  	1 nn#C4ECPPP  
   0q//Y//99@@BBB1 ..0ALLL  
  
 VXX FqEE1B'CDDEEeLLSSUUUr(   NrZ   r[   r.   r(   r&   r   r      s4        66%V %V %V %V %V %Vr(   r   c                      e Zd ZdZd
dZd	S )_VCardRendererz!Render contact/vCard attachments.rL   r   rV   r   r   r   c                V   |j         pd}t          |j        ddh          }|rK t          	 d	i |                    t          |d|                    |                                          S  t          d	i |                    ddi          |                                          S )
Ncontactr:   r;   r_   r`   zattachment contactrb   r"   rc   )r   rG   r   r	   r'   rS   rY   ro   s        r&   rY   z_VCardRenderer.render  s    	&Y67:KLLL 	1 ..0D4PPP  
  
 VXX IqHH1E'FGGHHOOVVXXXr(   NrZ   r[   r.   r(   r&   r   r     s4        ++
Y 
Y 
Y 
Y 
Y 
Yr(   r   c                      e Zd ZdZd
dZd	S )_HashtagRendererz"Render hashtag inline attachments.rL   r   rV   r   r   r   c                N   |j         r6|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   r?   r@   r   r'   r	   rY   )r$   rL   rV   rawtexttag_normrR   s          r&   rY   z_HashtagRenderer.render%  s    9 	()//##C..--<339s99DD7'iD#s33=488)=8TTUU!q!!5!!$''..000r(   NrZ   r[   r.   r(   r&   r   r   "  s.        ,,
1 
1 
1 
1 
1 
1r(   r   c                      e Zd ZdZd
dZd	S )_CalculatorRendererz,Render calculator result inline attachments.rL   r   rV   r   r   r   c           	         |j         p|j        pd} t          di |                    ddi          |                                          S )Nresultr   r"   zattachment calcr   r   r   r	   r'   rY   r$   rL   rV   re   s       r&   rY   z_CalculatorRenderer.render5  sS     	0SW0HqHH3>>74E*FGGHHOOVVXXXr(   NrZ   r[   r.   r(   r&   r   r   2  s4        66Y Y Y Y Y Yr(   r   c                      e Zd ZdZd
dZd	S )_GraphExpressionRendererz;Render graph expression inline attachments from calculator.rL   r   rV   r   r   r   c           	         |j         p|j        pd} t          di |                    ddi          |                                          S )N
expressionr   r"   zattachment calc-graphr   r   r   s       r&   rY   z_GraphExpressionRenderer.renderB  sU    	4SW4NqNN3>>74K*LMMNN
 

&((	r(   NrZ   r[   r.   r(   r&   r   r   ?  s.        EE     r(   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]]_PREFIXrV   Callable[[Any], str]c                F   | j         pd                                }t                              |          }||                    | |          S t
          D ]2\  }}|                    |          r|                    | |          c S 3t                              | |          S )Nr3   )r   lowerr   getrY   r   r@   _DEFAULT)rL   rV   r   rprefixrrs         r&   render_attachmentr   {  s     7=b


!
!C

3A}xx^,,, 2 2
>>&!! 	299S.11111	2 ??3///r(   )r/   r   r0   r1   r   r   )r/   r   r   rH   )rL   r   rM   r   rK   r   r   r   )rL   r   rV   r   r   r   )/r,   
__future__r   r|   dataclassesr   typingr   r   r   urllib.parser   tinyhtmlr	   table_builderr   r   rG   rJ   rS   rU   r]   rg   rl   rq   r   r   r   r   r   r   r   r   _TABLE_URL_IMAGE_AUDIO_VIDEO_PDF_VCARD_HASHTAG_CALC_GRAPHr   r-   r   r   r.   r(   r&   <module>r      s    $ # " " " " "  ! ! ! ! ! ! * * * * * * * * * * ! ! ! ! ! !       6 6 6 6 6 6 $       :   48 8 8 8 	     $" " " " " " " "	 	 	 	 	y 	 	 	    Y   "    9   ,T T T T TY T T T6
V 
V 
V 
V 
VY 
V 
V 
VV V V V VY V V V((V (V (V (V (V9 (V (V (VVY Y Y Y YY Y Y Y 1 1 1 1 1y 1 1 1 Y Y Y Y Y) Y Y Y    y    			|~~									|~~				!	!	#	#
 $!#4<<AEK!'!       , VF66FFF66F(    0 0 0 0 0 0r(   