o
    %e4                     @   s  d 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mZmZm Z m!Z!m"Z" d	dl#m$Z$ d	dl%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 Z.d d! Z/G d"d# d#e0Z1G d$d% d%e0Z2			d/d&d'Z3d(d) Z4	d0d*d+Z5				d1d,d-Z6dS )2u  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)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)InvalidValuesPendingcheck_var_functionget_urlparse_functionremove_whitespace)preprocess_declarations)preprocess_descriptors)Nbeforeaftermarkerz
first-linezfirst-letterzfootnote-callzfootnote-markerPageType)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 ]\}}|rt|ts| 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
isinstancer   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   J/var/www/html/venv/lib/python3.10/site-packages/weasyprint/css/__init__.py__init__.   sd   







zStyleFor.__init__Nc                 C   s   | j ||f}|rGd|d v r"|d dkr"dD ]	}t|d| < qt|d dkrG|d d d	rG|d d d
krGdD ]	}t|d| < q=|S )Ntabledisplayborder_collapsecollapse)topbottomleftrightpadding_r   r   ztable-ztable-captionmargin_)r.   r5   r   len
startswith)r=   rD   r,   rF   r    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   r5   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   )r/   
page_rules_page_type_matchr-   r3   r4   r5   )r=   	page_typerL   rM   rN   _ruleselector_listrE   rO   rB   r,   selector_page_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fvrdS | jd |jfvr(dS | jd urM| j\}}}|jd | }|dkrB|dkS || dkoL||  S dS )NFr   r   T)r    r!   r"   r$   r#   )rn   rk   abgroupoffsetrQ   rQ   rR   rj      s   
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   s@   | 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_linenonerQ   )keyvalueparent_valuerh   rQ   rQ   rR   text_decoration   s   r   c                 c   sD   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|| 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)r>   r   	query_allr2   r5   splitr   r   evaluate_media_querytagr   r   r
   r	   r   error)r6   device_media_typer   r*   r   r   ri   r   wrapperrD   	mime_type
media_attrr   r   cssr   excrQ   rQ   rR   find_stylesheets   sT   

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_declaration_list)rD   style_attributerE   r*   rQ   rR   check_style_attribute+  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)iterr5   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   r1   !  sz  














	













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






  r1   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   r4   =  s   
r4   c                 C   s   t |sdS |jdkrEg }t|jD ]\}}|jdkr*|jdkr*|t| || q|| qtj	
|j|j|j|}t| ||pD|fS t|d }|djdd}|}g }	| | p^|D ]}
t| |
|}|	|du rp|
fn| q_|	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  T  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   p  s   zAnonymousStyle.__init__c                 C   s   t | j}||  |S rq   )r  rf   r  r=   copyrQ   rQ   rR   r"    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   
zAnonymousStyle.__missing__Nry   rz   r{   r|   rS   r"  r'  rQ   rQ   rQ   rR   r  n  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   )
r)  rf   rh   rD   r,   rg   r*   r  r  r"  r!  rQ   rQ   rR   r"    s   
zComputedStyle.copyc           	      C   s2  |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||  | |< }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   r+  rU   )rf   rh   r;   r   r   tokensr  r   r  r
  solver   r   r   r   r  r   )	r=   r   rf   r   pendingsolved_tokensr  r/  original_keyrQ   rQ   rR   r'    sv   






zComputedStyle.__missing__Nr(  rQ   rQ   rQ   rR   r)    s
    r)  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  r)  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 |rOd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 |rH|d}|jd	kr`dS |jd
kr3|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r1|d}|j	dkrdS t
|jD ] \}	}
|
jdkr|
jdkr|jd|	d  }|j|	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}dS g ||R |d< |d d  d7  < qQdS |jdkrF|rDt|d rDn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whitespacespace)r   )r   r  rQ   rQ   rR   r   p  s
    
z(parse_page_selectors.<locals>.<listcomp>r#   r   )listr   preluder   r   r	  r   r^   lower_valuer$   r  r  r   r8  	parse_nthany)ruler/  	page_datatypesr  r7  r6  pseudo_classr   r  r  r8  rv   
nth_valuesrQ   rQ   rR   parse_page_selectors  s   





(



FXrF  c	           !      C   s  |D ]}	t |	dddu r|	jdks|	jdkrq|	jdkrtt|t|	j}
|
rt}z4t	
|	j}|D ]'}|||
 |jtvr\|jdrSt}t	d|j t	d|j q5d	}W q t	jy } zt|d
t|	j| W Y d}~qd}~ww d	}q|	jdkr/|	jdkr/|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 rqt|dd }|du rtdt|	j|	j|	j qt|| sq|dur.zt||| ||||d W q t y- } zt!d|| W Y d}~qd}~ww q|	jdkrs|	jdkrst|	j}|du rUtdt|	j|	j|	j qd	}t|| s_qt"|	j}t#| |||||||d	d	 q|	jdkr|	jdkrt$|	}|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ِqtt|t|j}
|
r|d|j |fg}|'|||
f qɐqq|	jdkrA|	jdkrAd	}t|	j}t(t)d||}dD ]}||vr3td|*d d|	j|	j  nq|dur@|+|| q|	jdkr	|	jd!kr	t,-|	j|}|du rht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 rd%} n|d$ } | d du r| d d&v rt.|d' pg dk rtd(||	j|	j| d  qn@| d d)v rt.|d' pg d*k rtd+||	j|	j| d  qn| d d,krt.|d- pg d*k rtd.||	j|	j q|||< qdS )0zDDo what can be done early on stylesheet, before being in a document.r   Nzat-ruleimportzqualified-ruler   z!ignored prefixed pseudo-element: zunknown pseudo-element: Tz(Invalid or unsupported selector '%s', %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   r8   ri   z$Failed to load stylesheet at %s : %sr   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_symbolsrP  )NsymbolicN)cyclicfixedrY  rW  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additiverX  zZIn counter style %r at %d:%d, counter style "additive" needs at least two additive symbolsrQ   )/getattrr   lower_at_keywordr<  r   r   r   r   r   
cssselect2compile_selector_listr=  add_selectorpseudo_elementPSEUDO_ELEMENTSr_   r   SelectorErrorr   log	serializer   r  r  r   r   r   r   r   parse_media_queryr   r   r	   r   parse_rule_listpreprocess_stylesheetrF  r	  r   r   dictr   r
  add_font_facer   parse_counter_style_namer^   )!r   r*   stylesheet_rulesr   r8   ri   r   r   rL  rA  rE   logger_level	selectorsrO   r   r/  r   	url_tupler   content_rulesdatark   rB   r   rm   margin_rulerule_descriptorsr   r$   counterdescriptor_namedescriptor_valuerP  rQ   rQ   rR   rk    s  























 rk  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   r6   r   r   r*   r%   )r>   user_stylesheetsr@   r   r   ri   r+   formsr?   rF   r   r   rL   rQ   rQ   rR   get_all_computed_stylesk  s(   

r  )FNrx   )F)NFNNNNF)7r|   collectionsr   loggingr   r   ra  r   tinycss2.asttinycss2.nthr~   r   loggerr   r   urlsr	   r
   r   r   r   computed_valuesr   
propertiesr   r   r   r   utilsr   r   r   r   r   r   
validationr   validation.descriptorsr   re  r   r%   r   r   r   r1   r4   r  rl  r  r)  rd   rF  rk  r  rQ   rQ   rQ   rR   <module>   sV      ,	
0  (u
y
 \