o
    %e&                     @   sd  d Z ddlmZ ddlmZ ddlmZ ddlmZm	Z	m
Z
 ddlmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ dZ e! Z"e! Z#i Z$G d	d
 d
eZ%		d@ddZ&dAddZ'e& eedd Z(e&de&de&de&de&de&ddde&dedd Z)e& edd Z*e& ed d! Z+e& ed"d# Z,e&d$ed%d$ Z-e&d&dd'eed(d) Z.e&d*dd'ed+d, Z/e& d-d. Z0e& ed/d0 Z1e& ed1d2 Z2e& ed3d4 Z3e& ed5d6 Z4e&d7e&d8eed9d: Z5e& d;d< Z6e&d=e&d>e&d?e&d@dAdB Z7e&dCe&dDe&dEe&dFe&dGddedHdI Z8e&dJe&dKedLdM Z9e& edNdO Z:e& edPdQ Z;e& edRdS Z<e&dTddedUdV Z=e&ddedWdX Z>e&ddedYdZ Z?e&dded[d\ Z@e&d]dde&d^dde&d_dde&d`ddedadb ZAe&dddcdd ZBe&deedfdg ZCe&dhe&die&dje&dke&dldde&dmedndo ZDe&ddedpdq ZEe&ddedrds ZFe& edtdu ZGe& edvdw ZHe& edxdy ZIe& edzd{ ZJe&dd'd|d} ZKe& d~d ZLe& dd ZMe& dd ZNdd ZOe&de&de&de&de&de&de&de&dedd ZPe&de&dedd ZQe&ddedd ZRe&ddedd ZSe& edd ZTe& dd ZUe&dedd ZVe& edd ZWe& edd ZXe& edd ZYe& dd ZZe& edd Z[e& edd Z\e& dd Z]e& dd Z^e& edd Z_e& dd Z`e& dd Zae& edd Zbe& edd Zce& edd Zde& edd Zee& edd Zfe&ddedd Zge&de&deddĄ Zhe& eddƄ Zie& eddȄ Zje& eddʄ Zke&d˃e&d̃edd΄ Zle&dσe&dЃe&dуe&d҃eddԄ Zme&dՃe&dփedd؄ Zne& eddڄ Zoe& edd܄ Zpe&d݃e&dރedd Zqe&ddedd Zre& edd Zse& edd Zte& edd Zue& dd Zve& edd Zwe& edd Zxe& edd Zye& dd Zze& edd Z{e& edd Z|e& edd Z}e& edd Z~e& edd Ze& edd Ze& edd  Ze& edd Ze& edd Ze& edd Ze&de&ded	d
 Ze& edd Ze& edd Ze& edd Ze& edd Ze& edd Ze& edd Ze&ddedd Ze&dddd Ze&dddd Ze&ddedd Ze&ddd ed!d" Ze& ed#d$ Ze&dded%d& Ze&dded'd( Ze&dded)d* Ze&ddd+d, Ze&dded-d. Ze&ddd/d0d1 Ze&dded2d3 Ze&dded4d5 Ze&dded6d7 Ze&dded8d9 Ze&ddd/ed:d; Ze& d<d= Ze& ed>d? ZdS (B  z^Validate properties.

See https://www.w3.org/TR/CSS21/propidx.html and various CSS3 modules.

    )infparse_color   )computed_values)KNOWN_PROPERTIESZERO_PIXELS	Dimension)InvalidValuesPendingcheck_var_functioncomma_separated_list	get_angleget_content_listget_content_list_tokenget_custom_ident	get_imageget_keyword
get_lengthget_resolutionget_single_keywordget_urlparse_2d_positionparse_functionparse_positionremove_whitespacesingle_keywordsingle_tokenz-weasy-c                   @   s   e Zd ZdZdd ZdS )PendingPropertyz>Property with validation done when defining calculated values.c                 C   s   t || jd d S )Nr      )validate_non_shorthandname)selftokens
wanted_key r%   W/var/www/html/venv/lib/python3.10/site-packages/weasyprint/css/validation/properties.pyvalidate"   s   zPendingProperty.validateN)__name__
__module____qualname____doc__r'   r%   r%   r%   r&   r       s    r   NFc                    s    fdd}|S )u@  Decorator adding a function to the ``PROPERTIES``.

    The name of the property covered by the decorated function is set to
    ``property_name`` if given, or is inferred from the function name
    (replacing underscores by hyphens).

    :param proprietary:
        Proprietary (vendor-specific, non-standard) are prefixed: anchors can
        for example be set using ``-weasy-anchor: attr(id)``.
        See https://www.w3.org/TR/CSS/#proprietary
    :param unstable:
        Mark properties that are defined in specifications that didn't reach
        the Candidate Recommandation stage. They can be used both
        vendor-prefixed or unprefixed.
        See https://www.w3.org/TR/CSS/#unstable-syntax
    :param wants_base_url:
        The function takes the stylesheet’s base URL as an additional
        parameter.

    c                    sj    du r| j dd}n }|tv sJ ||tvsJ || _| t|< r,t| r3t| | S )z'Add ``function`` to the ``PROPERTIES``.N_-)r(   replacer   
PROPERTIESwants_base_urlPROPRIETARYaddUNSTABLE)functionr!   property_nameproprietaryunstabler0   r%   r&   	decorator>   s   

zproperty.<locals>.decoratorr%   )r6   r7   r8   r0   r9   r%   r5   r&   property(   s   r:   c           	      C   s   | dr
|| ffS |s&|tvr&|dd}|tv r"td| dtd|s0|tvr0tdt| }| D ]}t|rF|t| |ff  S q6t| }|dv rR|}n|jr[|| |}n|| }|d	u ret||ffS )
z'Validator for non-shorthand properties.z--r,   r-   zyou probably mean ""zunknown propertyzproperty not supported yet)initialinheritN)	
startswithr   r.   r
   r/   r   r   r   r0   )	r#   r!   base_urlrequiredhyphens_namer4   tokenkeywordvaluer%   r%   r&   r    Q   s.   


r    c                 C      | dv S )z.``background-attachment`` property validation.)scrollfixedlocalr%   rC   r%   r%   r&   background_attachmentt      rJ   zbackground-colorzborder-top-colorzborder-right-colorzborder-bottom-colorzborder-left-colorzcolumn-rule-colorT)r8   ztext-decoration-colorc                 C      t | S Nr   rB   r%   r%   r&   other_colors|   s   	rO   c                 C   s   t | dkrdS t| S )NinvertcurrentColor)r   r   rN   r%   r%   r&   outline_color   s   rR   c                 C   rE   )N)separatecollapser%   rI   r%   r%   r&   border_collapse      rU   c                 C   rE   )z$``empty-cells`` property validation.)showhider%   rI   r%   r%   r&   empty_cells      rY   colorc                 C   s   t | }|dkr
dS |S )z0``*-color`` and ``color`` properties validation.rQ   r=   r   )rB   resultr%   r%   r&   r[      s   zbackground-image)r0   c                 C   s$   | j dkrt| dkrdS t| |S )Nr4   noner]   N)typer   r   )rB   r?   r%   r%   r&   background_image   s   

r`   zlist-style-imagec                 C   sV   t | dkrdS t| |}|r%|d dkr'|d d dkr)d|d d fS dS dS dS )z)``list-style-image`` property validation.r]   r^   r   urlr   externalN)r   r   )rB   r?   
parsed_urlr%   r%   r&   list_style_image   s   
rd   c                 C   s    t | dkr| dd } t| S )z)``transform-origin`` property validation.   Nr   )lenr   r#   r%   r%   r&   transform_origin   s   rh   c                 C   rL   )z,``background-position`` property validation.r   rg   r%   r%   r&   background_position   rZ   rj   c                 C   rL   )z(``object-position`` property validation.ri   rg   r%   r%   r&   object_position   rZ   rk   c                 C   s`   t tt| }|dkrdS |dkrdS |dv r|d S t|dkr,tdd |D r.|S d	S d	S )
z*``background-repeat`` property validation.)zrepeat-x)repeat	no-repeat)zrepeat-y)rm   rl   ))rm   )rl   )space)roundr   c                 s   s    | ]}|d v V  qdS ))rm   rl   rn   ro   Nr%   ).0kr%   r%   r&   	<genexpr>   s
    
z$background_repeat.<locals>.<genexpr>N)tuplemapr   rf   all)r#   keywordsr%   r%   r&   background_repeat   s   rw   c                 C   s   t | dkr)| d }t|}|dv r|S |dkrdS t|ddd}|r'|dfS d
S t | d	krZg }| D ]}t|ddd}|rD|| q3t|dkrO|d q3t |d	kr\t|S d
S d
S )z#Validation for ``background-size``.r   r   )containcoverauto)rz   rz   FTnegative
percentager   N)rf   r   r   appendrs   )r#   rB   rC   lengthvaluesr%   r%   r&   background_size   s0   
r   zbackground-clipzbackground-originc                 C   rE   )z\Validation for the ``<box>`` type used in ``background-clip``
    and ``background-origin``.)
border-boxpadding-boxcontent-boxr%   rI   r%   r%   r&   box  s   r   c                 C   N   dd | D }t |r#t|dkr|d |d fS t|dkr%t|S dS dS )z,Validator for the `border-spacing` property.c                 S      g | ]}t |d dqS Fr|   r   rp   rB   r%   r%   r&   
<listcomp>      z"border_spacing.<locals>.<listcomp>r   r   r   Nru   rf   rs   r#   lengthsr%   r%   r&   border_spacing  s   r   zborder-top-right-radiuszborder-bottom-right-radiuszborder-bottom-left-radiuszborder-top-left-radiusc                 C   r   )z/Validator for the `border-*-radius` properties.c                 S   s   g | ]	}t |d ddqS )FTr{   r   r   r%   r%   r&   r     s    z(border_corner_radius.<locals>.<listcomp>r   r   r   Nr   r   r%   r%   r&   border_corner_radius  s   r   zborder-top-stylezborder-right-stylezborder-left-stylezborder-bottom-stylezcolumn-rule-stylec                 C   rE   )z)``border-*-style`` properties validation.)
r]   hiddendotteddasheddoubleinsetoutsetgrooveridgesolidr%   rI   r%   r%   r&   border_style%  s   r   zbreak-beforezbreak-afterc                 C   rE   )z;``break-before`` and ``break-after`` properties validation.)rz   avoid
avoid-pagepageleftrightrectoversoavoid-columncolumnalwaysr%   rI   r%   r%   r&   break_before_after1  rK   r   c                 C   rE   )z%``break-inside`` property validation.)rz   r   r   r   r%   rI   r%   r%   r&   break_inside:  rZ   r   c                 C   rE   )z-``box-decoration-break`` property validation.)slicecloner%   rI   r%   r%   r&   box_decoration_breakA  rZ   r   c                 C   s,   | j dkr
d| jfS t| }|dv r|S dS )z%``box-ellipsis`` property validation.stringr]   rz   N)r_   rD   r   rB   rC   r%   r%   r&   block_ellipsisH  s   

r   continuec                 C   rE   )z!``continue`` property validation.)rz   discardr%   rI   r%   r%   r&   	continue_T  rZ   r   c                 C   s<   | j dkr| jd ur| jdkr| jS t| }|dkr|S d S )Nnumberr   r]   r_   	int_valuer   r   r%   r%   r&   	max_lines[  s   
r   c                 C   rE   )z%``margin-break`` property validation.)rz   keepr   r%   rI   r%   r%   r&   margin_breakf  rZ   r   c                 C   s"   | j dkr| jdkrdS | jS dS )z``page`` property validation.identrz   N)r_   lower_valuerD   rN   r%   r%   r&   r   m  s   
r   z
bleed-leftzbleed-rightz	bleed-topzbleed-bottomc                 C   s   t | }|dkr
dS t| S )z``bleed`` property validation.rz   r   r   r   r%   r%   r&   bleedu  s   r   c                 C   st   t | dkrtdd | D }d|v rd|v r|S dS dS t | dkr6t| d }|dv r0|fS |d	kr8d
S dS dS )z``marks`` property validation.r   c                 s       | ]}t |V  qd S rM   r   r   r%   r%   r&   rr         zmarks.<locals>.<genexpr>cropcrossr   r   )r   r   r]   r%   N)rf   rs   r   )r#   rv   rC   r%   r%   r&   marks  s   r   zoutline-stylec                 C   rE   )z(``outline-style`` properties validation.)	r]   r   r   r   r   r   r   r   r   r%   rI   r%   r%   r&   outline_style  rZ   r   zborder-top-widthzborder-right-widthzborder-left-widthzborder-bottom-widthzcolumn-rule-widthzoutline-widthc                 C   ,   t | dd}|r
|S t| }|dv r|S dS )z=Border, column rule and outline widths properties validation.Fr   )thinmediumthickNr   r   rB   r   rC   r%   r%   r&   border_width  s   	r   c                 C   ,   t | dd}|r
|S t| }|dkr|S dS )z%``column-width`` property validation.Fr   rz   Nr   r   r%   r%   r&   column_width     r   c                 C   rE   )z$``column-span`` property validation.)ru   r]   r%   rI   r%   r%   r&   column_span  rZ   r   c                 C   rE   )z7Validation for the ``box-sizing`` property from css3-ui)r   r   r   r%   rI   r%   r%   r&   
box_sizing  rZ   r   c                 C   rE   )z'``caption-side`` properties validation.)topbottomr%   rI   r%   r%   r&   caption_side  rZ   r   c                 C   rE   )z``clear`` property validation.)r   r   bothr]   r%   rI   r%   r%   r&   clear  rZ   r   c                 C   s   t | }|r<|\}}|dkr<t|dkr<g }|D ]}t|dkr&|d qt|}|r1|| qt|dkr<t|S t| dkrDdS dS )z%Validation for the ``clip`` property.rect   rz   r%   N)r   rf   r   r~   r   rs   )rB   r4   r!   argsr   argr   r%   r%   r&   clip  s"   
r   c                 C   s   t | } g }| r>t| dkr;| d jdkr;| d jdkr;| d | dd }} t||p0t||}|r9|| ndS n| st| dkrFdS t| dkrg| d jd	krg| d
 jdkrg| d
 jdkrg| dd
 } t| }|dv rr|fS t| |S )z ``content`` property validation.r   r   literal,r   Nre   r   /normalr]   )	listrf   r_   rD   r   r   r~   r   r   )r#   r?   parsed_tokensrB   parsed_tokenrC   r%   r%   r&   content  s,   
r   c                 C      t | ddS )z*``counter-increment`` property validation.r   default_integercounterrg   r%   r%   r&   counter_increment     r   c                 C   r   )z&``counter-reset`` property validation.r   r   r   rg   r%   r%   r&   counter_reset  r   r   c                 C   r   )z$``counter-set`` property validation.r   r   r   rg   r%   r%   r&   counter_set  r   r   c                 C   s   t | dkrdS t| } t| d}|sJ dg }|dur[|jdkr$dS |j}|dv r2td| t| d}|durN|jdkrN|jdurN|j}t| d}n|}|||f |dust|S )	zB``counter-increment`` and ``counter-reset`` properties validation.r]   r%   Nzgot an empty token listr   )r]   r<   r=   zInvalid counter name: r   )	r   iternextr_   rD   r
   r   r~   rs   )r#   r   rB   resultscounter_nameintegerr%   r%   r&   r     s*   


r   r   r   r   r   z
margin-topzmargin-rightzmargin-bottomzmargin-leftc                 C   s(   t | dd}|r
|S t| dkrdS dS )z#``margin-*`` properties validation.Tr}   rz   Nr   rB   r   r%   r%   r&   lenght_precentage_or_auto5  s   r   heightwidthc                 C   s*   t | ddd}|r|S t| dkrdS dS )z7Validation for the ``width`` and ``height`` properties.FTr{   rz   Nr   r   r%   r%   r&   width_heightG  s   r   c                 C   r   )z+Validation for the ``column-gap`` property.Fr   r   Nr   r   r%   r%   r&   
column_gapS  r   r   c                 C   rE   )z$``column-fill`` property validation.)rz   balancer%   rI   r%   r%   r&   column_fill_  rZ   r   c                 C   rE   )z"``direction`` property validation.)ltrrtlr%   rI   r%   r%   r&   	directionf  rZ   r   c                 C   s   | D ]
}|j dkr dS qt| dkr0| d j}|dv r|fS |dv r*t|dS |dkr0d	S d } }}| D ]+}|j}|d
v rI|rF dS |}q8|dv rU|rR dS |}q8|dkra|r^ dS |}q8 dS |pgd}|pkd}|ry|dv rw|||fS dS ||fS )z ``display`` property validation.r   Nr   r   )	r]   ztable-captionztable-row-groupz
table-cellztable-header-groupztable-footer-groupz	table-rowztable-column-groupztable-column)zinline-tablezinline-flexr-   zinline-block)inline	flow-root)blockr   )flowr   tableflexz	list-itemr  r  )r  r   )r_   rf   rD   rs   split)r#   rB   rD   outsideinside	list_itemr%   r%   r&   displaym  sF   


r	  floatc                 C   rE   )z``float`` property validation.)r   r   footnoter]   r%   rI   r%   r%   r&   float_  rZ   r  c                 C   sV   t | dkr| d jdkr| d jS | r'tdd | D r)ddd | D S dS dS )	z$``font-family`` property validation.r   r   r   c                 s       | ]}|j d kV  qdS )r   Nr_   r   r%   r%   r&   rr         zfont_family.<locals>.<genexpr> c                 s       | ]}|j V  qd S rM   rD   r   r%   r%   r&   rr         N)rf   r_   rD   ru   joinrg   r%   r%   r&   font_family  s
   
r  c                 C   rE   )N)rz   r   r]   r%   rI   r%   r%   r&   font_kerning  rV   r  c                 C   s(   t | }|dkr
|S | jdkr| jS d S )Nr   r   r   r_   rD   r   r%   r%   r&   font_language_override  s   
r  c                    s   t | dkrt| d }|dv r|S g d}g }|D ]}|| q| D ]1  jdkr. d S  j|v rS fdd|D d }tfdd	|D rL d S  j q$ d S r\tS d S )
Nr   r   r   ))zcommon-ligatureszno-common-ligatures)zhistorical-ligatureszno-historical-ligatures)zdiscretionary-ligatureszno-discretionary-ligatures)
contextualzno-contextualr   c                       g | ]	} j |v r|qS r%   r  rp   couplerN   r%   r&   r         z*font_variant_ligatures.<locals>.<listcomp>c                 3       | ]}| v V  qd S rM   r%   rp   rD   r   r%   r&   rr     r   z)font_variant_ligatures.<locals>.<genexpr>rf   r   extendr_   rD   anyr~   rs   r#   rC   couples
all_valuesr  concurrent_valuesr%   rB   r   r&   font_variant_ligatures  2   


r)  c                 C   rE   )N)r   subsuperr%   rI   r%   r%   r&   font_variant_position  rV   r-  c                 C   rE   )N)r   z
small-capszall-small-capszpetite-capszall-petite-capsunicaseztitling-capsr%   rI   r%   r%   r&   font_variant_caps  rV   r/  c                       t | dkrt| d }|dkr|S g d}g }|D ]}|| q| D ]1  jdkr. d S  j|v rS fdd|D d }tfdd	|D rL d S  j q$ d S r\tS d S )
Nr   r   r   ))zlining-numszoldstyle-nums)zproportional-numsztabular-nums)zdiagonal-fractionszstacked-fractions)ordinal)zslashed-zeror   c                    r  r%   r  r  rN   r%   r&   r     r  z(font_variant_numeric.<locals>.<listcomp>c                 3   r  rM   r%   r  r   r%   r&   rr     r   z'font_variant_numeric.<locals>.<genexpr>r!  r$  r%   r(  r&   font_variant_numeric  r*  r2  c                 C   4   t | dkrt| d dkrdS tdd }|| S )z.``font-feature-settings`` property validation.r   r   r   c                 S   s   d\}}t | dkr7| d d | d } }|jdkr$ddd|j}n|jdkr6|jd ur6|jdkr6|j}nt | dkr?d}t | dkra| \}|jd	krat |jd
kratdd |jD ra|j}|d urm|d uro||fS d S d S )NNNr   r   r   r   r   )onoffr   r   r   c                 s   s,    | ]}d t |  kodkn  V  qdS )       N)ord)rp   letterr%   r%   r&   rr     s   * zLfont_feature_settings.<locals>.font_feature_settings_list.<locals>.<genexpr>)rf   r_   getrD   r   ru   )r#   featurerD   rB   r%   r%   r&   font_feature_settings_list  s&   

z9font_feature_settings.<locals>.font_feature_settings_listrf   r   r   )r#   r=  r%   r%   r&   font_feature_settings  s
   
r?  c                 C   rE   )N)r   zhistorical-formsr%   rI   r%   r%   r&   font_variant_alternates(  rK   r@  c                    r0  )
Nr   r   r   ))jis78jis83jis90jis04
simplifiedtraditional)
full-widthzproportional-width)rubyr   c                    r  r%   r  r  rN   r%   r&   r   B  r  z+font_variant_east_asian.<locals>.<listcomp>c                 3   r  rM   r%   r  r   r%   r&   rr   D  r   z*font_variant_east_asian.<locals>.<genexpr>r!  r$  r%   r(  r&   font_variant_east_asian0  s2   


rI  c                 C   r3  )z0``font-variation-settings`` property validation.r   r   r   c                 S   s@   t | dkr| \}}|jdkr|jdkr|j|jfS d S d S d S )Nr   r   r   )rf   r_   rD   )r#   keyrD   r%   r%   r&   font_variation_settings_listT  s   z=font_variation_settings.<locals>.font_variation_settings_listr>  )r#   rK  r%   r%   r&   font_variation_settingsN  s
   
rL  c                 C   s<   t | ddd}|r|S t| }|dv r|S |tjv r|S dS )z"``font-size`` property validation.FTr{   )smallerlargerN)r   r   r   FONT_SIZE_KEYWORDS)rB   r   font_size_keywordr%   r%   r&   	font_size^  s   
rQ  c                 C   rE   )z#``font-style`` property validation.)r   italicobliquer%   rI   r%   r%   r&   
font_stylel  rZ   rT  c                 C   rE   )z-Validation for the ``font-stretch`` property.)	zultra-condensedzextra-condensed	condensedzsemi-condensedr   zsemi-expandedexpandedzextra-expandedzultra-expandedr%   rI   r%   r%   r&   font_stretchs  rZ   rW  c                 C   sD   t | }|dv r
|S | jdkr| jdur| jdv r | jS dS dS dS )z$``font-weight`` property validation.)r   boldbolderlighterr   N)	d      i,  i  i  iX  i  i   i  r   r_   r   r   r%   r%   r&   font_weight}  s   
r^  c                 C   rE   )N)fillrx   ry   r]   z
scale-downr%   rI   r%   r%   r&   
object_fit  s   r`  c                 C   rL   rM   )r   rN   r%   r%   r&   image_resolution  rZ   ra  zletter-spacingzword-spacingc                 C   s$   t | dkrdS t| }|r|S dS )z7Validation for ``letter-spacing`` and ``word-spacing``.r   Nr   r   r%   r%   r&   spacing  s   rb  c                 C   st   t | dkrdS | jdkr| jdkrt| jdS | jdkr(| jdkr(t| jdS | jdkr6| jdkr8t| S dS dS )z$``line-height`` property validation.r   r   r   Nr}   %	dimension)r   r_   rD   r	   r   rN   r%   r%   r&   line_height  s   re  c                 C   rE   )z,``list-style-position`` property validation.)r  r  r%   rI   r%   r%   r&   list_style_position  rZ   rf  c                 C   s  | j dkr| jS | j dkrd| jfS | j dkr| jdkrd}t| j}t|dkrg }|d j dkrF|d j|v rDd}||d j n	dS |d	 d}t||d k rWdS t|t|D ]}|| j dkrj dS ||| j q^|d d
v rt|dk rdS dt|fS dS dS dS )z(``list-style-type`` property validation.r   r   r4   symbols)cyclicnumeric
alphabeticsymbolicrG   r   r   Nrk  )rj  ri  re   z	symbols())	r_   rD   r!   r   	argumentsrf   r~   rangers   )rB   allowed_typesfunction_argumentsrl  indexir%   r%   r&   list_style_type  s8   




rr  z	min-widthz
min-heightc                 C   s   t | }|dkr
|S t| gS )z7``min-width`` and ``min-height`` properties validation.rz   )r   length_or_precentager   r%   r%   r&   min_width_height  s   
rt  zpadding-topzpadding-rightzpadding-bottomzpadding-leftc                 C   s   t | ddd}|r|S dS )z$``padding-*`` properties validation.FTr{   Nr   r   r%   r%   r&   rs    s   rs  z	max-widthz
max-heightc                 C   s0   t | ddd}|r|S t| dkrttdS dS )z'Validation for max-width and max-heightFTr{   r]   pxN)r   r   r	   r   r   r%   r%   r&   max_width_height  s   
rv  c                 C   s@   | j dkrtdtd| jS | j dkrtdtd| jd S dS )z(Validation for the ``opacity`` property.r   r   r   r}   r[  N)r_   minmaxrD   rN   r%   r%   r&   opacity  s
   

ry  c                 C   s2   t | dkrdS | jdkr| jdur| jS dS dS )z(Validation for the ``z-index`` property.rz   r   Nr]  rN   r%   r%   r&   z_index  s
   rz  orphanswidowsc                 C   s2   | j dkr| jdur| j}|dkr|S dS dS dS )z9Validation for the ``orphans`` and ``widows`` properties.r   Nr   r_   r   rB   rD   r%   r%   r&   orphans_widows  s   r  c                 C   s:   | j dkr| jdur| j}|dkr|S t| dkrdS dS )z-Validation for the ``column-count`` property.r   Nr   rz   r   r~  r%   r%   r&   column_count!  s   r  c                 C   rE   )z)Validation for the ``overflow`` property.)rz   visibler   rF   r%   rI   r%   r%   r&   overflow-  rZ   r  c                 C   rE   )z.Validation for the ``text-overflow`` property.)r   ellipsisr%   rI   r%   r%   r&   text_overflow4  rZ   r  c                 C   s\   | j dkr!| jdkr!t| jdkr!| jd j dkr!d| jd jfS t| g}|dv r,|S dS )	z!``position`` property validation.r4   runningr   r   r   z	running())staticrelativeabsoluterG   N)r_   r!   rf   rl  rD   r   r   r%   r%   r&   position;  s   
r  c                 C   s`   | r*t | d dkr,tdd | D r.tdd | D }|ddd |ddd fS dS dS dS )z``quotes`` property validation.r   r   c                 s   r  )r   Nr  r   r%   r%   r&   rr   K  r  zquotes.<locals>.<genexpr>c                 s   r  rM   r  r   r%   r%   r&   rr   L  r  Nr   )rf   ru   rs   )r#   stringsr%   r%   r&   quotesG  s   r  c                 C      | dv r| S dS )z,Validation for the ``table-layout`` property)rG   rz   Nr%   rI   r%   r%   r&   table_layoutR     r  c                 C   rE   )z'``text-align-all`` property validation.)r   r   centerjustifystartendr%   rI   r%   r%   r&   text_align_allZ  rZ   r  c                 C   rE   )z(``text-align-last`` property validation.)rz   r   r   r  r  r  r  r%   rI   r%   r%   r&   text_align_lasta  rZ   r  c                 C   sJ   dd | D }|dhkrdS h d}t | t |kr!||r#|S dS dS )z-``text-decoration-line`` property validation.c                 S   s   h | ]}t |qS r%   r   r   r%   r%   r&   	<setcomp>l      z'text_decoration_line.<locals>.<setcomp>r]   >   line-throughblinkoverline	underlineN)rf   issubset)r#   rv   allowed_valuesr%   r%   r&   text_decoration_linei  s   
r  c                 C   r  )z.``text-decoration-style`` property validation.)r   r   r   r   wavyNr%   rI   r%   r%   r&   text_decoration_stylet  r  r  c                 C   s   t | dd}|r
|S dS )z$``text-indent`` property validation.Tr   Nr   r   r%   r%   r&   text_indent|  s   r  c                 C   rE   )z#``text-align`` property validation.)r]   	uppercase	lowercase
capitalizerG  r%   rI   r%   r%   r&   text_transform  rZ   r  c                 C   r   )z.Validation for the ``vertical-align`` propertyTr   )baselinemiddler+  r,  ztext-topztext-bottomr   r   Nr   r   r%   r%   r&   vertical_align  s   r  c                 C   rE   )$``white-space`` property validation.)r  r   rT   r%   rI   r%   r%   r&   
visibility  rZ   r  c                 C   rE   )r  )r   prenowrapzpre-wrapzpre-liner%   rI   r%   r%   r&   white_space  rZ   r  c                 C   rE   )z&``overflow-wrap`` property validation.)anywherer   z
break-wordr%   rI   r%   r%   r&   overflow_wrap  rZ   r  c                 C   rE   )z#``word-break`` property validation.)r   z	break-allr%   rI   r%   r%   r&   
word_break  rZ   r  c                 C   s*   t | g}|dur|S t| dkrdS dS )z#``flex-basis`` property validation.Nr   )r   r   )rB   basisr%   r%   r&   
flex_basis  s   
r  c                 C   rE   )z'``flex-direction`` property validation.)rowzrow-reverser   zcolumn-reverser%   rI   r%   r%   r&   flex_direction  rZ   r  z	flex-growzflex-shrinkc                 C   s   | j dkr| jS d S Nr   )r_   rD   rN   r%   r%   r&   flex_grow_shrink  s   
r  c                 C   s"   | j dkr| jd ur| jS d S d S r  r}  rN   r%   r%   r&   order  s   r  c                 C   rE   )z"``flex-wrap`` property validation.)r  wrapzwrap-reverser%   rI   r%   r%   r&   	flex_wrap  rZ   r  c                 C   rE   )z(``justify-content`` property validation.
flex-startflex-endr  zspace-betweenzspace-aroundzspace-evenlystretchr%   rI   r%   r%   r&   justify_content  rZ   r  c                 C   rE   )z$``align-items`` property validation.)r  r  r  r  r  r%   rI   r%   r%   r&   align_items  rZ   r  c                 C   rE   )z#``align-self`` property validation.)rz   r  r  r  r  r  r%   rI   r%   r%   r&   
align_self  rZ   r  c                 C   rE   )z&``align-content`` property validation.r  r%   rI   r%   r%   r&   align_content  rZ   r  c                 C   rE   )z#Validation for ``image-rendering``.)rz   zcrisp-edges	pixelatedr%   rI   r%   r%   r&   image_rendering   rZ   r  c                 C   s   t | }|dv r
|S d\}}| D ]#}t|}|dkr$|dur! dS d}q|du r1t|}|dur1q dS |du r:dn|}|du rBdn|}||fS )z%Validation for ``image-orientation``.)r]   z
from-imager4  flipNTr   F)r   r   r   )r#   rC   angler  rB   r%   r%   r&   image_orientation  s&   r  c           	      C   s  dd | D }t |r#t|dkr|d |d fS t|dkr#t|S dd | D }t|dkrQ|d }|tjv r>tj| S |dv rEtjS |dkrQtjd	d	d
 S t|dkr|d dv rb|\}}n|d dv rm|\}}nd	}|tjv rtj| }|dkr|S |\}}||fS d	S d	S )z]``size`` property validation.

    See https://www.w3.org/TR/css-page-3/#page-size-prop

    c                 S   r   r   r   r   r%   r%   r&   r   &  r   zsize.<locals>.<listcomp>r   r   r   c                 S   s   g | ]}t |qS r%   r   r   r%   r%   r&   r   -  r  )rz   portrait	landscapeNr   )r  r  r  )ru   rf   rs   r   
PAGE_SIZESINITIAL_PAGE_SIZE)	r#   r   rv   rC   orientation	page_sizer   r   r   r%   r%   r&   size  s:   





r  )r7   c                 C   sZ   t | dkrdS t| }|r)|\}}|dd |D f}|ddgfkr+d|d jfS dS dS )	zValidation for ``anchor``.r]   c                 S      g | ]}|j qS r%   r  rp   r   r%   r%   r&   r   P      zanchor.<locals>.<listcomp>attrr   attr()r   N)r   r   rD   rB   r4   r!   r   	prototyper%   r%   r&   anchorG  s   r  )r7   r0   c                 C   sl   t | dkrdS t| |}|r|S t| }|r2|\}}|dd |D f}|ddgfkr4d|d jfS dS dS )	zValidation for ``link``.r]   c                 S   r  r%   r  r  r%   r%   r&   r   a  r  zlink.<locals>.<listcomp>r  r   r  r   N)r   r   r   rD   )rB   r?   rc   r4   r!   r   r  r%   r%   r&   linkU  s   
r  c                 C   s2   | j dkr| jdur| j}|dkr|S t| ddS )zVValidation for ``tab-size``.

    See https://www.w3.org/TR/css-text-3/#tab-size

    r   Nr   Fr   )r_   r   r   r~  r%   r%   r&   tab_sizef  s
   r  c                 C      t | }|dv r
|S dS )zValidation for ``hyphens``.)r]   manualrz   Nr   r   r%   r%   r&   hyphensu     r  c                 C   s(   t | }|dkr
dS | jdkr| jS dS )z'Validation for ``hyphenate-character``.rz   u   ‐r   Nr  r   r%   r%   r&   hyphenate_character~  s   
r  c                 C   s   t | dddS )z(Validation for ``hyphenate-limit-zone``.FTr{   r   rN   r%   r%   r&   hyphenate_limit_zone  s   r  c                 C   s  t | dkr'| \}t|}|dkrdS |jdkr#|jdur%|jddfS dS dS t | dkr| \}}t|}t|}|jdkra|jdura|jdkrU|jdurU|j|j|jfS |dkr_|jddfS dS |dkr||jdkrv|jdurvd|j|jfS |dkr~dS dS dS t | dkr| \}}}t|dks|jdkr|jdurt|dks|jdkr|jdurt|dks|jdkr|jdur|jdkr|jnd}|jdkr|jnd}|jdkr|jnd}|||fS dS dS dS dS dS dS dS )	z)Validation for ``hyphenate-limit-chars``.r   rz   )   r   r   r   Nr   r  re   )rf   r   r_   r   rD   )r#   rB   rC   totalr   total_keywordleft_keywordr   r%   r%   r&   hyphenate_limit_chars  sR   

r  c                 C   sn   t | dkrdS t| }|r+|\}}|dd |D f}|ddgfkr)d|d jfS d	S | jdkr5d| jfS d	S )
zValidation for ``lang``.r]   c                 S   r  r%   r  r  r%   r%   r&   r     r  zlang.<locals>.<listcomp>r  r   r  r   r   N)r   r   rD   r_   r  r%   r%   r&   lang  s   

r  )r8   r0   c                    s&   t  fdd| D }d|vr|S dS )z"Validation for ``bookmark-label``.c                 3       | ]}t | V  qd S rM   r   r   r?   r%   r&   rr         

z!bookmark_label.<locals>.<genexpr>N)rs   )r#   r?   r   r%   r  r&   bookmark_label  s   r  c                 C   s>   | j dkr| jdur| j}|dkr|S dS t| dkrdS dS )z"Validation for ``bookmark-level``.r   Nr   r]   r   r~  r%   r%   r&   bookmark_level  s   r  c                 C   rE   )z"Validation for ``bookmark-state``.)openclosedr%   rI   r%   r%   r&   bookmark_state  rZ   r  c                 C   rE   )z$Validation for ``footnote-display``.)r  r   compactr%   rI   r%   r%   r&   footnote_display  rZ   r  c                 C   rE   )z#Validation for ``footnote-policy``.)rz   liner  r%   rI   r%   r%   r&   footnote_policy  rZ   r  c                    sv   t | dkr+t| d }|du rdS t fdd| dd D }d|vr)||fS dS | r7t| d dkr9dS dS dS )	zValidation for ``string-set``.r   r   Nc                 3   r  rM   r  r   r  r%   r&   rr     r  zstring_set.<locals>.<genexpr>r   r]   )r]   r%   )rf   r   rs   r   )r#   r?   var_namer   r%   r  r&   
string_set  s   
r  c           
      C   s  t | dkrdS g }| D ]Q}t|}|s dS |\}}t|dkrt|d }t|d dd}|dkr@|dur@|||f q|d	v rR|durR|d
|dff q|dkrd|durd|d
d|ff q|dv rt|rt|d|tff q|dkr|r|dt|ff q|dkr|d jdkr|d|d jdff q|dkr|d jdkr|dd|d jff q|dkr|d jdkr|d|d jfd f q dS t|dkr7|dkrt	dd |D r||t
dd |D f q|dkrt
dd |D }t	|r|||f q dS |d
kr4t
dd |D }	t	dd |	D r1|||	f q dS  dS t|dkr\|dkr\t	dd |D r\||t
dd |D f q dS t
|S )zValidation for ``transform``.r]   r%   Nr   r   Tr   rotate)skewxskewr  skewy)
translatex	translater  
translateyscalexr   scalescaleyr   c                 s   r  r   Nr  rp   ar%   r%   r&   rr   &  r  ztransform.<locals>.<genexpr>c                 s   r  rM   r  r  r%   r%   r&   rr   '  r  c                 s   s    | ]	}t |d dV  qdS )Tr   Nr   r   r%   r%   r&   rr   )  s    
c                 s   r   rM   )r   r   r%   r%   r&   rr   0  r   c                 s   s    | ]}|d uV  qd S rM   r%   )rp   r  r%   r%   r&   rr   1  r      matrixc                 s   r  r  r  r  r%   r%   r&   rr   7  r  c                 s   r  rM   r  r  r%   r%   r&   rr   9  r  )r   r   rf   r   r   r~   r   r_   rD   ru   rs   )
r#   
transformsrB   r4   r!   r   r  r   r   anglesr%   r%   r&   	transform  sd   



 
r  c                 C   r  )z#``appearance`` property validation.r   Nr   r   r%   r%   r&   
appearance?  r  r  )NFFF)NF)r+   mathr   tinycss2.color3r    r   
propertiesr   r   r	   utilsr
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   PREFIXsetr1   r3   r/   r   r:   r    rJ   rO   rR   rU   rY   r[   r`   rd   rh   rj   rk   rw   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r	  r  r  r  r  r)  r-  r/  r2  r?  r@  rI  rL  rQ  rT  rW  r^  r`  ra  rb  re  rf  rr  rt  rs  rv  ry  rz  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r%   r%   r%   r&   <module>   s   X)#

	







	



	







		

-





	!
	





	
'	
'
;