o
    Zh0h                     @   s  d Z ddlmZ ddlmZ ddlmZmZ ddlZddl	Z	ddl
Z	ddlZ	ddlmZ ddlmZmZ dd	lmZmZmZ d
dlmZ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$m%Z%m&Z&m'Z'm(Z( dZ)edg dZ*G dd dZ+dd Z,dd Z-dd Z.d/ddZ/dd  Z0d!d" Z1G d#d$ d$e2Z3G d%d& d&e2Z4			d0d'd(Z5d)d* Z6	d1d+d,Z7			d2d-d.Z8dS )3u  Find and apply CSS.

This module takes care of steps 3 and 4 of “CSS 2.1 processing model”: Retrieve
stylesheets associated with a document and annotate every element with a value
for every CSS property.

https://www.w3.org/TR/CSS21/intro.html#processing-model

This module does this in more than two steps. The
:func:`get_all_computed_styles` function does everything, but it is itsef based
on other functions in this module.

    )
namedtuple)groupby)DEBUGWARNINGN   )CSS)LOGGERPROGRESS_LOGGER)URLFetchingErrorget_url_attributeurl_join   )countersmedia_queries)COMPUTER_FUNCTIONS)	INHERITEDINITIAL_NOT_COMPUTEDINITIAL_VALUESZERO_PIXELS)preprocess_declarations)preprocess_descriptors)InvalidValuesPendingcheck_var_functionget_urlparse_functionremove_whitespace)Nbeforeaftermarkerz
first-linezfirst-letterzfootnote-callzfootnote-markerPageSelectorType)sideblankfirstindexnamec                   @   sT   e Zd ZdZdd ZdddZ		dddZd	d
 Zdd Zdd Z	e
dd ZdS )StyleForz?Convenience function to get the computed styles for an element.c              	   C   s  i  | _ }i | _|| _td t|j||jD ];\}}|\}}	}
||d fi }t	|
|	D ]$\}}}t
d|}||f}||dd }|d u sL||krR||f||< q.q|j D ]c}|D ]H\}}}|j|D ]<}|\}}}}	|ps|}||j|fi }|	D ]$\}}}t
||}||f}||dd }|d u s||kr||f||< qqhq]|jr|jjnd }| j|j|j||j|d qY|D ]\}}|r| j|||j||j|d q| j   d S )NzStep 3 - Applying CSSauthorNNr   )rootparentbase_urltarget_collector)pseudo_typer)   r*   r+   r,   )_cascaded_styles_computed_styles_sheetsr	   infofind_style_attributesetree_elementr+   
setdefaultr   declaration_precedencegetwrapper_elementiter_subtreematchermatchr*   set_computed_stylesclear)selfhtmlsheetspresentational_hintsr,   cascaded_stylesspecificity
attributeselementdeclarationsr+   styler%   values
importance
precedenceweight
old_weightsheetoriginsheet_specificityselectororderr-   r*    rQ   M/var/www/html/rh/venv/lib/python3.10/site-packages/weasyprint/css/__init__.py__init__0   sd   







zStyleFor.__init__Nc                 C   s   | j ||f }rDd|d v r"|d dkr"dD ]	}t|d| < qt|d dkrD|d \}|drD|d	krDdD ]	}t|d
| < q:|S )Ntabledisplayborder_collapsecollapse)topbottomleftrightpadding_r   ztable-ztable-captionmargin_)r/   r6   r   len
startswith)r=   rD   r-   rF   r!   rU   rQ   rQ   rR   __call__~   s   
zStyleFor.__call__c                 C   s   |   }|  }||kr|du r|du sJ d}	dtd i}
n|dus%J ||df }	||df }
|||fi }t|||	||
|||||f< dS )a!  Set the computed values of styles to ``element``.

        Take the properties left by ``apply_style_rule`` on an element or
        pseudo-element and assign computed values with respect to the cascade,
        declaration priority (ie. ``!important``) and selector specificity.

        N	font_size)get_cascaded_stylesget_computed_stylesr   r6   computed_from_cascaded)r=   rD   r*   r)   r-   r+   r,   rA   computed_stylesparent_style
root_stylecascadedrQ   rQ   rR   r;      s   	zStyleFor.set_computed_stylesc                 C   s   | j D ]R\}}}|jD ]I\}}}|D ]A}|\}	}
}| ||rS|p"|	}	| j||
fi }|D ]$\}}}t||}||	f}||dd }|d u sL||krR||f||< q.qqqd S )Nr(   r   )r0   
page_rules_page_type_matchr.   r4   r5   r6   )r=   	page_typerL   rM   rN   _ruleselector_listrE   rO   rB   r-   page_selector_typerF   r%   rG   rH   rI   rJ   rK   rQ   rQ   rR   add_page_declarations   s&   

zStyleFor.add_page_declarationsc                 C      | j S N)r.   r=   rQ   rQ   rR   rb         zStyleFor.get_cascaded_stylesc                 C   rp   rq   )r/   rr   rQ   rQ   rR   rc      rs   zStyleFor.get_computed_stylesc                 C   s  | j d |j fvr
dS | jd |jfvrdS | jd |jdkfvr dS | jd |jfvr*dS | jd ur| j\}}}|d u rU|j}|d | }|dkrJ|dkS || dkoT||  S ||jkr\dS |jD ]'\}}||krhq_|d | }|dkry|dkr dS || dkr|| s dS q_dS dS )NFr   r   T)r!   r"   r#   r$   r%   groups)rn   rk   abr%   r$   offset
group_namerQ   rQ   rR   rj      s6   
&
zStyleFor._page_type_matchrq   NNNN)__name__
__module____qualname____doc__rS   r`   r;   ro   rb   rc   staticmethodrj   rQ   rQ   rQ   rR   r&   .   s    
N
r&   c                 C   s8   | j r| j gng }| D ]}|jr||j qd|S )z9Return the text directly in the element, not descendants. )texttailappendjoin)rD   contentchildrQ   rQ   rR   get_child_text   s   
r   c                 C   sD   d}| |v r|s
|}|S | dkr |dkr |dkr|}|S ||B }|S )N)text_decoration_colortext_decoration_styletext_decoration_thicknesstext_decoration_linenonerQ   )keyvalueparent_valuerh   text_propertiesrQ   rQ   rR   text_decoration   s   r   c                 c   sR   ddl m} | ddD ]}|j}	|	ddddd	  }
|
dkr%q|	d
d p.d}dd |dD }t||s@q|	j	dkrXt
|	}t|||||||d}|V  q|	j	dkr|	dr||	drl||	drmqt|	d|}|durzt||d||||dV  W q ty } ztd|| tjd|d W Y d}~qd}~ww qdS )zgYield the stylesheets in ``element_tree``.

    The output order is the same as the source order.

    r   )element_has_link_typerF   linktypeztext/css;r   r   mediar   allc                 S   s   g | ]}|  qS rQ   )strip).0
media_typerQ   rQ   rR   
<listcomp>  s    z$find_stylesheets.<locals>.<listcomp>,)stringr+   url_fetcherr   font_configcounter_styleri   href
stylesheet	alternateNT)urlr   _check_mime_typer   r   r   ri   z#Failed to load stylesheet at %s: %sError while loading stylesheet:exc_info)r>   r   	query_allr3   r6   splitr   r   evaluate_media_querytagr   r   r   r
   r   errordebug)r7   device_media_typer   r+   r   r   ri   r   wrapperrD   	mime_type
media_attrr   r   cssr   	exceptionrQ   rQ   rR   find_stylesheets   sR   

r   Fc                 #   s
    fdd}|   D ]>}d}|d}|r||||fV  |s"qd}|jdkrdD ]0\}}d}d	| | d	fD ]}	||	rPd
| d||	 d} nq;|r[||||fV  q+|drrd|d d}||||fV  |drd|d }||||fV  |drd|d }||||fV  q|jdkr|||dfV  q|jdkr|dd }
|
dkr|||dfV  q|
dv r|||d|
 fV  q|jdkrm|dr|||d|d fV  |dr|||d|d fV  |d rl|d  }|d!}|d"}|s|r'|d#d  }zt|}W n ty=   t	d$| Y qw d%d&d'd(d)d*d+d,}|rP|d-7 }n|rW|d-8 }t
d#td.|}|||d/||  fV  q|jd0kr|d1r|||d2|d1 dfV  |d3r|d3}| r|d7 }|  D ]}|jd4v r|||d5| d6| d7| d8| d9	fV  q|d:r|d:}| r|d7 }|||d;| d<| fV  |d=r|d=}| r|d7 }|||d>| d?| fV  |d@r%dA|d@ }|d@ r|d7 }||||fV  |dBrGdC|dB }|dB r?|d7 }||||fV  |dr^d|d d}||||fV  |drtd|d }||||fV  |dDrdE|dD }||||fV  |dFrdG|dF d}||||fV  q|jdHv rL|dd }
|
dkr|||dfV  n|
dv r|||d|
 fV  |drd|d d}||||fV  |drd|d }||||fV  |jdIv rK|dBr#dC|dB }|dB r|d7 }||||fV  |jd4v rK|d@rKdA|d@ }|d@ rC|d7 }||||fV  q|jdJkry|dd }
|
dkrh|||dfV  q|
dv rx|||d|
 fV  q|jdKkr|d@rdA|d@ }|d@ r|d7 }||||fV  q|jdLkrCdM}|d rz	t|d }W n ty   t	d$| Y nw |d|dNfdOkr|d#kr|||dG|dP  dfV  n!|d#kr|||dQfV  n|d#kr|||dC|dP  dfV  |d@r.dA|d@ }|d@ r&|d7 }||||fV  |drB|||d|d fV  q|jdRv r|jdSksZ|dTd dUkr|dd }
|
dVv ro|||dWfV  |d:r|d:}| r|d7 }|||d;| d<| fV  |d=r|d=}| r|d7 }|||d>| d?| fV  |d@rdA|d@ }|d@ r|d7 }||||fV  |dBrdC|dB }|dB r|d7 }||||fV  |jdXv r|dFr|||dG|dF dYfV  q|jdZkr/|d[r.|||d\|d[ d]fV  q|jd^krJ|d_rJ|||d\|d_ d`fV  qdS )aa  Yield ``specificity, (element, declaration, base_url)`` rules.

    Rules from "style" attribute are returned with specificity
    ``(1, 0, 0)``.

    If ``presentational_hints`` is ``True``, rules from presentational hints
    are returned with specificity ``(0, 0, 0)``.

    c                    s   t |}| | fS rq   )tinycss2parse_blocks_contents)rD   style_attributerE   r+   rQ   rR   check_style_attribute1  s   

z4find_style_attributes.<locals>.check_style_attribute)r   r   r   rF   r   r   r   body))heightrX   )r   rY   )widthrZ   )r   r[   Nmarginzmargin-:px
backgroundzbackground-image:url()bgcolorzbackground-color:r   zcolor:centerztext-align:centerdivalignr   middle)r   rZ   r[   justifyztext-align:fontcolorfacezfont-family:size+-r   zInvalid value for size: %szx-smallsmallmediumlargezx-largezxx-large48px)r   r                  r   r   z
font-size:rT   cellspacingzborder-spacing:cellpadding)tdthzpadding-left:z;padding-right:z;padding-top:z;padding-bottom:r   hspacezmargin-left:z;margin-right:vspacezmargin-top:z;margin-bottom:r   zwidth:r   zheight:bordercolorzborder-color:borderzborder-width:)trr   r   theadtbodytfoot)r   r   r   captioncolhrr   noshader(   r   zborder-bottom-width:0)iframeappletembedimginputobjectr   r   image)r   r   zvertical-align:middle)r   r   r   zpx;border-style:solidolstartzcounter-reset:list-item z;counter-increment:list-item -1lir   z;counter-increment:none)iterr6   r   lowerr   r_   int
ValueErrorr   warningmaxminisdigit)treer@   r+   r   rD   rB   r   partpositionpropr   r   relative_plusrelative_minus
font_sizesr   
subelementr   r   rQ   r   rR   r2   '  s  











	




















 r2   c                 C   sH   | dkrdS | dkr|sdS | dkr|sdS | dkrdS | dks"J dS )	zReturn the precedence for a declaration.

    Precedence values have no meaning unless compared to each other.

    Acceptable values for ``origin`` are the strings ``'author'``, ``'user'``
    and ``'user agent'``.

    
user agentr   userr   r'   r   r   r   rQ   )rM   rH   rQ   rQ   rR   r5   )  s   
r5   c                 C   s   t |sdS |jdkr@g }t|jD ]\}}|jdkr%|t| || q|| qtj	
|j|j|j|}t| ||p?|fS t|d }|djdd}|}g }	| | pY|D ]}
t| |
|}|	|du rk|
fn| qZ|	S )z)Return token with resolved CSS variables.Nvarfunctionr   r   r   _)r   
lower_name	enumerate	argumentsr   extendresolve_varr   r   astFunctionBlocksource_linesource_columnr%   r   popr   replace)computedtokenrf   r	  iargumentargsvariable_namedefaultcomputed_valuer   resolvedrQ   rQ   rR   r  @  s(   

r  c                   @   (   e Zd ZdZdd Zdd Zdd ZdS )	AnonymousStylez(Computed style used for anonymous boxes.c                 C   sB   |  dddddd || _| | _|r|j| _d S i i d| _d S )Nr   )border_top_widthborder_bottom_widthborder_left_widthborder_right_widthoutline_widthratio_chratio_ex)updaterf   	specifiedcache)r=   rf   rQ   rQ   rR   rS   \  s   zAnonymousStyle.__init__c                 C   s   t | j}||  |S rq   )r  rf   r%  r=   copyrQ   rQ   rR   r)  n  s   

zAnonymousStyle.copyc                 C   s   |t v s|d d dkr| j|  }| |< |S |dkr&| j|  }| |< |S |d d dkrAt|t| | j| dd }| |< |S t|  }| |< |S )Nr   __page   text_decoration_F)rh   )r   rf   r   r   )r=   r   r   rQ   rQ   rR   __missing__s  s   	zAnonymousStyle.__missing__Nrz   r{   r|   r}   rS   r)  r.  rQ   rQ   rQ   rR   r  Z  s
    r  c                   @   r  )	ComputedStylez,Computed style used for non-anonymous boxes.c                 C   sT   i | _ || _|| _|d u | _|| _|| _|| _|| _|r"|j| _d S i i d| _d S )Nr"  )	r&  rf   rh   is_root_elementrD   r-   rg   r+   r'  )r=   rf   rh   rD   r-   rg   r+   rQ   rQ   rR   rS     s   
zComputedStyle.__init__c                 C   s8   t | j| j| j| j| j| j}||  | j	 |_|S rq   )
r0  rf   rh   rD   r-   rg   r+   r%  r&  r)  r(  rQ   rQ   rR   r)    s   
zComputedStyle.copyc           	      C   s<  |dkr	| d  n|dkr| d  | j }|| jv r&| j| d }t|t}n|tv s2|d d dkr5d}nd}d	}|dkrC|d u rCd}|rg }|jD ]}t| ||}|d u r\|| qJ|| qJ|	d
d}z|
||}W n& ty   |tv r|d ur||  | |< }nt| }|tvr|| |< Y nw |dkr|d d dkrg nt| }|tvr|| |< n|dkr||  | |< }|d d dkr|d urt|||| || jv }|| v r| |= n$|dkr|dkr|d u rdn|d }|| v r| |= n
|dv r|| j|< || v r| | S |tv rt| | ||}|| |< |S )Nfloatr   rU   r   r   r*  inheritinitialFr  r   r,  r-  r+  autor   )r   r2  rU   )rf   rh   
isinstancer   r   tokensr  r   r
  r  solver   r   r   r   r&  r   )	r=   r   rf   r   pendingsolved_tokensr  r7  original_keyrQ   rQ   rR   r.    sr   







zComputedStyle.__missing__Nr/  rQ   rQ   rQ   rR   r0    s
    r0  c                 C   sD   |s
|dur
t |S t||| |||}|r |d r ||d  |S )zCGet a dict of computed style mixed from parent and cascaded styles.Nanchor)r  r0  collect_anchor)rD   rh   rf   r-   rg   r+   r,   rF   rQ   rQ   rR   rd     s   rd   c              	   C   s  t t| j}g }|s|dddddg dd |S |r\dddddg dd}|d jdkr@|d}|j|d< d|d d< t|dkrHdS |sQ|| |S |rU|d}|jd	kr`dS |jd
kr@|sjdS |d jdkr|d}|j}|dv r|d r|d |krdS ||d< |d d  d7  < qQ|dv rd||< |d d  d7  < qQdS |d jdkr>|d}|j	dkrdS t
|jD ]"\}	}
|
jdkr|
jdkr|jd|	d  }|j|	d d } nq|j}d}tj|}|du rdS |durdd |D }t|dkrdS |\}|jdkrdS |j}g ||R |d< |d d  d7  < |r=|d d  d7  < qQdS |jdkrS|rQt|d rQndS |sT|| |s|S )a  Parse a page selector rule.

    Return a list of page data if the rule is correctly parsed. Page data are a
    dict containing:

    - 'side' ('left', 'right' or None),
    - 'blank' (True or None),
    - 'first' (True or None),
    - 'index' (page number or None),
    - 'name' (page name string or None), and
    - 'specificity' (list of numbers).

    Return ``None` if something went wrong while parsing the rule.

    Nr   )r!   r"   r#   r$   r%   rB   r   identr%   r   rB   literalr   )rZ   r[   r!   r   )r"   r#   Tr  nthofc                 S   s   g | ]	}|j d vr|qS ))comment
whitespace)r   )r   r  rQ   rQ   rR   r   Z  s
    
z(parse_page_selectors.<locals>.<listcomp>r$   r   )listr   preluder   r   r  r   r^   lower_valuer%   r  r	  r   r@  	parse_nthany)ruler7  	page_datatypesr  r?  r>  pseudo_classr  r  r  r@  group
nth_valuesrQ   rQ   rR   parse_page_selectors  s   





&



DVrO  c	           &      C   s  |D ]S}	t |	dddu r3|	jdkrtd|	j|	j|	j |	jdkr#q|	jdkr3td|	|	j|	j q|	jdkrzft}
t	
|	j}tt|||	j}|rt|d	d
 d}|D ]C\}}dd |D }|D ]3}||| |jtvrt	|	j}|jdrt}
td| d|j td| d|j qcd}qVnd}W q tjy } zt|
d| W Y d}~qd}~ww |	jdkrq|	jdkrq|rtdt	|	j|	j|	j qt|	j}d}|r|d jdkrt||d jdd|	j|	jfd}nt|d |}|r|d d dkr|d d }|du rqt|dd }|du r4tdt	|	j|	j|	j qt|| s<q|durpzt ||| ||||d W q t!yo } zt"d|| tj#d|d  W Y d}~qd}~ww q|	jdkr|	jd!krt|	j}|du rtd"t	|	j|	j|	j qd}t|| sqt	$|	j}t%| |||||||dd#	 q|	jdkr@|	jd$kr@t&|	}|du rtd%t	|	j|	j|	j qd}|D ]a}|'d&}t(d;i |}t	
|	j}tt||}|r	|d|fg}|)|	||f |D ]1}|jdks|jdu rqtt|t	
|j}|r;|d'|j |fg}|)|||f qqq|	jdkr|	jd(krd}t	
|	j}t*t+d(||}d)D ]} | |vrutd*| ,d+d|	j|	j  nq^|dur|-|| q|	jdkrL|	jd,krLt./|	j|}!|!du rtd-t	|	j|	j|	j qd}t	
|	j}dddddddddd.	}"t+d,||}|D ]	\}#}$|$|"|#< q|"d/ du rd0}%n|"d/ }%|%d du rG|%d d1v rt0|"d2 pg dk rtd3|!|	j|	j|%d  qn@|%d d4v r)t0|"d2 pg d5k r(td6|!|	j|	j|%d  qn|%d d7krGt0|"d8 p7g d5k rGtd9|!|	j|	j q|"||!< qtd:|	|	j|	j qdS )<zDDo what can be done early on stylesheet, before being in a document.r   Nr   zParse error at %d:%d: %szat-ruleimportzUnknown empty rule %s at %d:%dzqualified-rulec                 S   s   | d S )Nr   rQ   )xrQ   rQ   rR   <lambda>  s    z'preprocess_stylesheet.<locals>.<lambda>)r   c                 S   s   g | ]}|d  qS )r   rQ   )r   declarationrQ   rQ   rR   r     s    z)preprocess_stylesheet.<locals>.<listcomp>r   'z$', ignored prefixed pseudo-element: z', unknown pseudo-element: Tz#Invalid or unsupported selector, %szP@import rule %r not at the beginning of the the whole rule was ignored at %d:%d.r   r   Fz@import at %s:%s)allow_relativecontextcontext_argsr   externalzBInvalid media type %r the whole @import rule was ignored at %d:%d.)r   r   r   r   r   r9   ri   z$Failed to load stylesheet at %s : %sr   r   r   zAInvalid media type %r the whole @media rule was ignored at %d:%d.)ignore_importsr+  zIUnsupported @page selector %r, the whole @page rule was ignored at %d:%d.rB   @z	font-face)srcfont_familyz3Missing %s descriptor in '@font-face' rule at %d:%dr  zcounter-stylezRInvalid counter style name %r, the whole @counter-style rule was ignored at %d:%d.)	systemnegativeprefixsuffixrangepadfallbacksymbolsadditive_symbolsr]  )NsymbolicN)cyclicfixedrf  rd  zHIn counter style %r at %d:%d, counter style %r needs at least one symbol)
alphabeticnumericr   zIIn counter style %r at %d:%d, counter style %r needs at least two symbolsadditivere  zZIn counter style %r at %d:%d, counter style "additive" needs at least two additive symbolszUnknown rule %s at %d:%drQ   )1getattrr   r   r   r  r  messagelower_at_keywordr   r   r   r   rD  r   rE  r   add_selectorpseudo_elementPSEUDO_ELEMENTS	serializer_   r   
cssselect2SelectorErrorlogr   r   r   r   r   parse_media_queryr   r   r
   r   r   parse_rule_listpreprocess_stylesheetrO  r  r    r   dictr   r  add_font_facer   parse_counter_style_namer^   )&r   r+   stylesheet_rulesr   r9   ri   r   r   rY  rI  logger_levelcontentsselectors_declarations	selectorsrE   rO   rE  excr7  r   	url_tupler   r   content_rulesdatarJ  rB   rn   r   rm   margin_rulerule_descriptorsr   r%   counterdescriptor_namedescriptor_valuer]  rQ   rQ   rR   rx  x  s  





























 rx  c                 C   s   g }|du r
t  }|  D ]}	|	 D ]\}
}|||
< qq| |p$g D ]
}||ddf q%|rC|  p7g D ]
}||ddf q8t| j| j	| j
| j|||D ]
}||ddf qQ|p_g D ]
}||ddf q`t| |||S )a   Compute all the computed styles of all elements in ``html`` document.

    Do everything from finding author stylesheets to parsing and applying them.

    Return a ``style_for`` function that takes an element and an optional
    pseudo-element type, and return a style dict object.

    Nr  r'   r   r  )r   CounterStyle_ua_counter_styleitems_ua_stylesheetsr   _ph_stylesheetsr   r7   r   r   r+   r&   )r>   user_stylesheetsr@   r   r   ri   r,   formsr?   rF   r   r   rL   rQ   rQ   rR   get_all_computed_styles\  s(   

r  )FNry   )F)NFNNNNF)9r}   collectionsr   	itertoolsr   loggingr   r   rs  r   tinycss2.asttinycss2.nthr   r   loggerr   r	   urlsr
   r   r   r   r   computed_valuesr   
propertiesr   r   r   r   
validationr   validation.descriptorsr   utilsr   r   r   r   r   r   rq  r    r&   r   r   r   r2   r5   r  ry  r  r0  rd   rO  rx  r  rQ   rQ   rQ   rR   <module>   sZ      .	
0  't
w
 e