o
    l>j                     @  sf  d Z ddlmZ ddlZddlmZ ddlmZ ddlm	Z	m
Z
mZmZ ddlmZ dd	lmZ d
dlmZmZ d
dlmZ d
dlmZmZ G dd deZdDddZdEddZg dg dg dg dg dg dg dg dg dg dd
ZdFd"d#Zed$d%G d&d' d'ZeG d(d) d)Z dGd+d,Z!dHd2d3Z"	dIdJd:d;Z#dKdLd@dAZ$G dBdC dCZ%dS )Mzi
Pure renderer for Apple Notes (proto3).

Converts a parsed pb.Note into minimal, readable HTML. No I/O.
    )annotationsN)	dataclass)IntEnum)ListOptionalTuplecast)urlsplit   )	notes_pb2   )AttachmentContextrender_attachment)ExportConfig)AttachmentRefNoteDataSourcec                   @  s0   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
S )	StyleTyper   r   r
      d   e   f   g   N)__name__
__module____qualname__DEFAULTTITLEHEADING
SUBHEADING
MONOSPACEDDOTTED_LISTDASHED_LISTNUMBERED_LISTCHECKBOX r%   r%   _/home/thesage/.local/lib/python3.10/site-packages/pyicloud/services/notes/rendering/renderer.pyr      s    r   stOptional[int]returnboolc                 C  s   | t jt jt jt jfv S N)r   r!   r"   r#   r$   )r'   r%   r%   r&   _is_list_style"   s   r,   urlOptional[str]c                 C  sx   | sd S d dd t|  D }|sd S t|}|j }|dvr%d S |dv r.|js.d S |dv r:|js:|js:d S |S )N c                 s  s$    | ]}|d kr|dkr|V  qdS ) Nr%   .0chr%   r%   r&   	<genexpr>/   s   " z$_safe_anchor_href.<locals>.<genexpr>>   telhttphttpsmailto>   r7   r8   >   r6   r9   )joinstrstripr	   schemecasefoldnetlocpath)r-   	candidatepartsr=   r%   r%   r&   _safe_anchor_href+   s   
rC   )z"Comic Sans MS"z"Comic Sans"z"Chalkboard SE"z"Comic Neue"cursive)z"Helvetica Neue"	HelveticaArial
sans-serif)rF   rE   rG   )z"Times New Roman"Timesserif)z"Courier New"Courier	monospace)
ComicSansMSzComic Sans MSHelveticaNeuezHelvetica NeueArialMTrF   TimesNewRomanPSMTzTimes New RomanCourierNewPSMTzCourier Newnamer;   c                 C  s   t | }|rd|S z| dd}W n ty   | }Y nw |  }d}d|v s2d|v s2d|v r5d}nd	|v sAd
|v sAd|v rDd	}nd|v sPd|v sPd|v rRd}d| d| S )Nz, "'rG   monocouriercoderK   rI   timesgeorgiacomicchalkhandrD   z", )_FONT_STACKSgetr:   replace	Exceptionlower)rQ   stacksafer`   genericr%   r%   r&   _css_font_stackX   s"   

rd   T)frozenc                   @  s   e Zd ZU ded< ded< ded< ded< ded< ded< ded	< d
ed< ded< ded< ded< ded< ded< ded< ded< ded< ded< ded< ed&ddZd'dd Zd'd!d"Zd'd#d$Zd%S )(StyleSigr(   font_weight
underlinedstrikethroughsuperscriptr.   link	color_hexemphasis_stylezOptional[float]font_size_pt	font_name
style_type	alignmentindent_amountblock_quotewriting_directionchecklist_donestart_number	highlightzOptional[bytes]paragraph_uuidrunpb.AttributeRunr)   
'StyleSig'c                 C  s  |  dr| jnd }d  } } } }}d }t| dd }t| dd }	t| dd }
t| dd }t| dd }t| dd }|  drB| jnd }|d urNt|d	d nd }|d urZt|d
d nd }t| dd }d }t| dr|  drzGt| jdd}t| jdd}t| jdd}tdtdt|d }tdtdt|d }tdtdt|d }d|d|d|d}W n t	y   d }Y nw d }|d urz
| dr|j
}W n	 t	y   Y nw z
| dr|j}W n	 t	y   Y nw z| dr|j}t|tr|dk rd}W n
 t	y   Y nw z| dr|j}W n
 t	y(   Y nw z| dr3|j}W n
 t	y>   Y nw z| drLt|dd }W n t	yY   d }Y nw zt|drj| drj|jnd }W n t	yy   d }Y nw z | drz	t|jdd }W n t	y   d }Y nw d }W n t	y   d }Y nw d }d }td$i d|d|	d|
d|d|d|d|d|d
|d|d|d|d|d |d!|d"|d#|d|S )%Nparagraph_stylerg   rh   ri   rj   rk   rm   font
point_sizero   highlight_colorcolorredg        greenbluer      #02Xrp   rq   rr   rs   writing_direction_paragraphrx   starting_list_item_number	checklistdonerl   rn   rt   ru   rv   rw   r%   )HasFieldr|   getattrr}   hasattrr   maxminroundr_   rp   rq   rr   
isinstanceintrs   r   r   r   rf   )ry   psr'   alignindentbqwd	start_numfwulsttsuprk   emphr}   fszfnamehlrl   rgbr8g8b8	para_uuidru   r%   r%   r&   from_run   s
  



	
zStyleSig.from_runotherr*   c                 C  s   | j r|j r| j |j krdS | j}|j}t|r|d u rdS ||koE| j|jkoE| j|jkoE| j|jkoE| j|jkoE| j|jkoE| j|jkS )NFT)	rx   rp   r,   rq   rr   rs   rt   ru   rv   )selfr   st_selfst_otherr%   r%   r&   same_paragraph_as   s.   





	zStyleSig.same_paragraph_asc                 C  sx   | j |j ko;| j|jko;| j|jko;| j|jko;| j|jko;| j|jko;| j|jko;| j|jko;| j|jko;| j	|j	kS r+   )
rg   rh   ri   rj   rk   rl   rm   rn   ro   rw   r   r   r%   r%   r&   same_inline_as  s&   








	zStyleSig.same_inline_asc                 C  s   |  |o	| |S r+   )r   r   r   r%   r%   r&   same_effective_style  s   zStyleSig.same_effective_styleN)ry   rz   r)   r{   )r   r{   r)   r*   )	r   r   r   __annotations__staticmethodr   r   r   r   r%   r%   r%   r&   rf   k   s0   
 
k
rf   c                   @  s&   e Zd ZU ded< ded< ded< dS )	MergedRunr   lengthrf   sigzOptional[AttachmentRef]
attachmentN)r   r   r   r   r%   r%   r%   r&   r     s   
 r   List[MergedRun]c                 C  s   g }| D ]R}t |}d }|dr+|j}t|dd pd }t|dd p$d }t||d}|rK|d u rK|d jd u rK|d j|rK|d  j	|j	7  _	q|
t|j	||d q|S )Nattachment_infoattachment_identifiertype_uti)
identifieruti_hintr   )r   r   r   )rf   r   r   r   r   r   r   r   r   r   appendr   )runsoutr   r   r   air   r   r%   r%   r&   _merge_runs$  s$   

r   sstartr   length_unitsTuple[str, int]c                 C  sJ   || }	 | || }t dd |D }|| | }||kr"||fS |}q)NTc                 s  s     | ]}t |d krdV  qdS )i  r   N)ordr2   r%   r%   r&   r5   >  s    z!_slice_for_run.<locals>.<genexpr>)sum)r   r   r   	end_guesschunkastralsnew_endr%   r%   r&   _slice_for_run:  s   r   notepb.Note
datasourceOptional[NoteDataSource]configOptional[ExportConfig]c           4        s  | j pd}t| j}g d
d	ddKddd}g dLfd
ddMfdd d d ddNfdddO 	
fdd}dL	fdd}dPd d!}dQfd#d$}	t|}
d }t|D ]\}}|d% |
k rv||d%  nd }|d u p|j|j }|d u s||js|d urd&}tt|d'd rtt|jd'd rt	t|d(dpd}t	t|jd(dpd}||krd)}|r|  ||j |j
d ur|j
jpd}|j
pd }d }d }d }d }d }z$|d*d|}|d+d|}t||}||dkr|d% nd| }W n ty   d }Y nw ry|rytd,d }td-d }td.d }td/d } t|rGttt ||nd }t|rWttt ||nd }t|rgttt ||nd }t| rwttt | |nd }rtd0d&rd1nd }!rtd2d nd }"rtd3d nd }#t||||||||!|"rtd4d nd |#d5}$t|$fd6d7}%|% rԈd8 d9 rd&d8 d:< ||j7 }nGt|||j\}&}|&d;d<d=d}&rTd8 d9 rTt|jjr|&d*}'t|'D ]\}(})|)rrwd8 d9 rwd8 d> }|d urw|tk rw| }*d?|*v rwd@ d)d8 d9< dA d&d8 d9< td% d8 d>< d)d8 d:< |jjtjkrw|jj d%krldBnd}+dC|+ dD |	|jt!"|) |)# rd&d8 d:< n	 |(t|'d% k r|(d% t|'k r|'|(d%  nd },|,dkr|(d% t|'d% krqd@ d)d8 d9< d}-|,dk}.|.rdE}-dF|- dG td% d8 d>< d&d8 d9< |.rdH d)d8 d:< |jjtjkr|.s|jj d%krdBnd}+dC|+ dD qn|&d*}'t|'D ]-\}(})|)rC|	|jt!"|) |)# rCd&d8 d:< |(t|'d% k rQdI q%n|r\|&$dJ}&rÈd8 d9 rÈd8 d> }|d ur|tk rÈ| }*d?|*v rÈd@ d)d8 d9< dA d&d8 d9< td% d8 d>< d)d8 d:< |jjtjkr|jj d%krdBnd}+dC|+ dD |&d*dd+ddkr݈|&%d*|&%d+ 7 nEdkrdI  d|jjtj&krt!"|&}/n||&}/|	|j|/ r"d8 d9 r"d8 'd:p|&# dkd8 d:< |r]d&}0|d urW|jj}1|jj}2t|1rWt|2rWt	|jj(pEd}t	|jj(pNd}3|3|krWd)}0|0r]|  |j}qe|d url	rl|   d8 d)S )RNr/   r   emph_valr(   r)   	List[str]c                 S  s.   | d u rg S t | }|dvrg S d| dgS )Nr   r
      r      background-color:var(--hl-bg))r   )r   idxr%   r%   r&   _emphasis_cssS  s   z+render_note_fragment.<locals>._emphasis_cssNonec                    s>   sd S   } | dr d  d| d  d d S )Nli_open</li></tag>)popr]   r   )top)	fragments
list_stackr%   r&   _close_top_listc  s   

z-render_note_fragment.<locals>._close_top_listtarget_indentr   c                   s>   rd d | kr   rd d | ks
d S d S d S d S )Nr   r   r%   )r   )r   r   r%   r&   _close_lists_tok  s   $z-render_note_fragment.<locals>._close_lists_tor   clsr   desired_tagr;   r   r   r.   c                  s  r7d d | ksd d | kr7d d |kr7   r7d d | ksd d | kr7d d |ksrAd d | k rΈrdd d sd d dd d< td d d< d	d d
< rnd d d nd}|}g }|r|dkr| dt| d |r|dkr|| krt|dkr| dt| d |rdd| nd} d| | d  ||d	d d	d rAd d | k sAd S d S )Nr   r   r   r   <li>Tr   li_indexFli_has_contentr   r   zclass="rR   olzstart="r0   r/   <r   )r   r   r   r   r   )r   lenhtmlescaper   r:   )r   r   r   r   levelr   attrs	attr_text)r   r   r   r%   r&   _ensure_listo  sB   
 z*render_note_fragment.<locals>._ensure_listr   rf   c           	        s(  | j tjtjtjtjfv rt| jpd}| j tjkrdnd}| j tjkr&dnd }||| j|d d d rId 	drI
d	 d
d d< d d sj
d dd d< td d d< d
d d< | j tjkr| jdkrwdnd}
d| d dd	d S  d | j tjkrd}n| j tjkrd}n| j tjkrd}n| j tjkrd}nd}| jdkr|dkrd}g }| jdkr|
d n| jdkr|
d n
| jdkr|
d d}| jdv rd}n| jd v rd!}|rd"d#| d$nd}d%| | | d&d'| d&
 d S )(Nr   r   r   dashedr   r   r   r   r   Fr   Tr   r    checkedr/   <input type="checkbox" disabled> h1h2h3prep
blockquoteztext-align:centerr
   ztext-align:rightr   ztext-align:justify)r
   r   z
 dir="rtl"r   r   z
 dir="ltr"z style="; rR   r   r   r   )rp   r   r!   r"   r#   r$   r   rr   rv   r]   r   r   ru   r   r   r   r    rs   rq   rt   r:   )	r   r   desiredr   checkedr   stylesdir_attr
style_attr)r   r   r   r   para_tag_closepara_tag_openr%   r&   paragraph_open  sh   







z,render_note_fragment.<locals>.paragraph_openc                    s  d rdkr}r}d d ryd  dsLd  d} t| tr5d|   kr/tk r5n nd| < rKtd trKd  drK  n'rntd trnd d	krn  rntd trnd d	ks[ d
d d< dd S dkr dd S )Nr   r   r   r   r   r   r/   z<input type="checkbox"<br>F)	r]   r   r   r   r;   lstrip
startswithr   r   )r   )deferred_breaksr   r   r	  r%   r&   paragraph_close  sF   &

z-render_note_fragment.<locals>.paragraph_closetextc           
      S  s   g }d}t | }||k r{|}||k r&| | dvr&|d7 }||k r&| | dvs| || }t|}d}g }|D ]}	|	dkrG|d |d7 }q7|	dkrU|d |d7 }q7 |rcd|||d   }|| ||k ru|d	 |d7 }|}||k sd|S )
Nr   )
    r   r0   &nbsp;	z&nbsp;&nbsp;&nbsp;&nbsp;r/   r  )r   r   r   r   r:   )
r  r   injlineesckprefixr4   r%   r%   r&   _preserve_leading_ws  s:   







z2render_note_fragment.<locals>._preserve_leading_ws	html_textc           
   	     s0  g }| j dv r|d | j dv r|d | jr"|d| j  | | jp*| j | jrQ| jsQzt| j}|dv rF|d| d W n	 tyP   Y nw | jrmz|d	t	| jd
d W n	 tyl   Y nw | j
r}|dtt| j
  g }| jdkr|d | jdkr|d |r|dd|  |rd|}d| d| d}n|}t| j}|rd}d}	zrtdd rtj}rtdd rtj}	W n	 ty   Y nw dt| dt| dt|	 d| d	}| jdkr
d| d }|S | jd!krd"| d#}|S )$Nr  zfont-weight:bold)r
   r   zfont-style:italiczcolor:r   r   r   z
font-size:z.0fptzfont-family:r   	underlinezline-throughztext-decoration:r0   r  z<span style='z'>z</span>znoopener noreferrerzno-referrerlink_relreferrer_policyz	<a href="z" target="_blank" rel="z" referrerpolicy="z">z</a>z<sup>z</sup>r   z<sub>z</sub>)rg   r   rl   extendrw   rm   r   r_   rn   floatro   rd   r;   rh   ri   r:   rC   rk   r   r!  r"  r   r   rj   )
r   r  r  r   decor  styled	safe_hrefrelrp)r   r   r%   r&   wrap_inline  sp   












0z)render_note_fragment.<locals>.wrap_inliner   Trp   rr   Fr  r  	get_titleget_primary_asset_urlget_thumbnail_urlget_mergeable_gzlink_target_blank_blankr!  pdf_object_heightr"  )idutititleprimary_url	thumb_urlmergeable_gz
prior_textlink_targetr!  link_referrerpolicyr1  c                   s   t |  dS )Nr   )render_note_fragment)	cell_note)r   r   r%   r&   <lambda>  s    z&render_note_fragment.<locals>.<lambda>r   r   r    u   ␀u   ￼r   zstyle="list-style-type: none"r   r   r   r   r   z style="list-style-type: none"z<lir   r  r  u   
 )r   r(   r)   r   )r)   r   )r   r   r)   r   )
r   r   r   r;   r   r(   r   r.   r)   r   )r   rf   r)   r   )r  r;   r)   r;   )r   rf   r  r;   r)   r;   )*	note_textr   attribute_runr   	enumerater   r   r,   r   r   r   r   resolved_utir`   rfindr   r_   callabler   r   r;   bytesr   r   r   r   r   r^   rp   splitr   r$   ru   r   r   r<   rstripcountr    r]   rr   r:   )4r   r   r   r  mergedr  r  r  r  r*  totalprev_sigr   mrnext_mris_para_boundary
close_prevprev_indent
cur_indentidentr3  r4  primarythumbgzr8  lb_nlb_ulbr+  get_pget_tget_mr9  r!  pdf_hctxhtml_attr   segsr  segr   r  next_segr  is_next_emptyrb   should_closecur_stnxt_st
nxt_indentr%   )r   r   r   r   r   r   r  r   r   r	  r
  r&   r<  E  s  


);
%$7


"   







" 



e












r<  r/   r4  html_fragment	extra_cssc                 C  s   dt |  d| d| dS )Nz[<!doctype html><meta charset="utf-8"><meta name="color-scheme" content="light dark"><title>u  </title><style> :root{--hl1-bg:#BA55D333;--hl2-bg:#D5000044;--hl3-bg:#FF6F0022;--hl4-bg:#289C8ECC;--hl5-bg:#2196F333}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif;line-height:1.4;background:#fff;color:#000}pre{white-space:pre-wrap}blockquote{margin:.5em 0 .5em 1em;padding-left:.8em;border-left:3px solid #ddd}a{text-decoration:underline}img{max-width:100%;height:auto}table{border-collapse:collapse;margin:.5rem 0}td,th{border:1px solid #ccc;padding:.25rem .5rem;vertical-align:top}ul.dashed{list-style:none;padding-left:1.2em}ul.dashed li::before{content:'— ';position:relative;left:-0.6em}@media (prefers-color-scheme: dark){ :root{--hl1-bg:#BA55D380;--hl2-bg:#FF525266;--hl3-bg:#FFB74D55;--hl4-bg:#80CBC480;--hl5-bg:#64B5F680}body{background:#111;color:#eee}a{color:#8ab4f8}blockquote{border-left-color:#444}td,th{border-color:#555}img{max-width:100%;height:auto}pre{background:#1b1b1b;color:#eee}ul.dashed li::before{color:#bbb}}z"</style><div class="note-content">z</div>)r   r   )r4  rh  ri  r%   r%   r&   render_note_pagem  s   rj  c                   @  s2   e Zd ZdZddddZddddZdddZdS )NoteRendererz)Class-based interface for note rendering.Nr   r   c                 C  s   |pt  | _d S r+   )r   r   )r   r   r%   r%   r&   __init__  s   zNoteRenderer.__init__r   r   r   r   r)   r;   c                 C  s   t ||| jdS )z0Render the note body to an HTML fragment string.r;  )r<  r   )r   r   r   r%   r%   r&   render  s   zNoteRenderer.renderr4  rh  c                 C  s
   t ||S )z.Wrap an HTML fragment in a full page with CSS.)rj  )r   r4  rh  r%   r%   r&   render_full_page  s   
zNoteRenderer.render_full_pager+   )r   r   )r   r   r   r   r)   r;   )r4  r;   rh  r;   r)   r;   )r   r   r   __doc__rl  rm  rn  r%   r%   r%   r&   rk    s
    rk  )r'   r(   r)   r*   )r-   r.   r)   r.   )rQ   r;   r)   r;   )r)   r   )r   r;   r   r   r   r   r)   r   r+   )r   r   r   r   r   r   r)   r;   )r/   )r4  r;   rh  r;   ri  r;   r)   r;   )&ro  
__future__r   r   dataclassesr   enumr   typingr   r   r   r   urllib.parser	   protobufr   pbattachmentsr   r   optionsr   renderer_ifacer   r   r   r,   rC   r\   rd   rf   r   r   r   r<  rj  rk  r%   r%   r%   r&   <module>   sR    

	
 2

    ,"