o
    %em,                     @   s@   d Z ddlmZ ddlmZ dd Zdd ZG d	d
 d
eZdS )zImplement counter styles.

These are defined in CSS Counter Styles Level 3:
https://www.w3.org/TR/css-counter-styles-3/#counter-style-system

    )inf   )remove_whitespacec                 C   s   | \}}|dkr
|S dS )zCreate a string from a symbol.string  )string_or_urltype_valuer   r   J/var/www/html/venv/lib/python3.10/site-packages/weasyprint/css/counters.pysymbol   s   r   c                 C   s^   t | } t| dkr)| \}|jdkr+|jdv r!|j|vr|jS d S |jdkr-|jS d S d S d S )Nr   ident)decimaldiscnone)r   lentypelower_valuer
   )tokenscounter_styletokenr   r   r   parse_counter_style_name   s   



r   c                       s@   e Zd ZdZdddZ		dddZdd Z fd	d
Z  ZS )CounterStylezCounter styles dictionary.

    Keep a list of counter styles defined by ``@counter-style`` rules, indexed
    by their names.

    See https://www.w3.org/TR/css-counter-styles-3/.

    Nc              
   C   s  |d dv rF|\}}|dkrd}d|ff}d}n"|dkr:d |d |d dkr(dnd f}t d	d
 |dd  D }d}|dd|ddd|dd	S || v r|d u rQg }n||v rWd S || | |  }|d rn|d \}	}}
nd\}	}|	r|| v r| | }|d |d< || |d r|d \}	}}
nd\}	}|	r||v rd\}	}qr| D ]\}}|| d u r|d ur|||< qn|S |	st|S d S )Nr   )	symbols()r   r   )NcyclicNr   r   r   fixedr   c                 s   s    | ]}d |fV  qdS )r   Nr   ).0argumentr   r   r   	<genexpr>6       
z/CounterStyle.resolve_counter.<locals>.<genexpr>)r    )r   -r   autor   r   r   r   )	systemnegativeprefixsuffixrangepadfallbacksymbolsadditive_symbolsr&   )Nsymbolic)extendsr   )tupleappendcopyitems)selfcounter_nameprevious_typescounter_type	argumentsr&   r-   r)   counterr0   _extended_counternamer
   r   r   r   resolve_counter,   sj   



zCounterStyle.resolve_counterc                 C   s  |s|sJ |p|  ||}|du rd| v r| |dS dS |d r*|d \}}}nd\}}}|du r6g }n
||v r@| |dS || |r|| v r| | }|d |d< |d ra|d \}}}nd\}}}||v rp| |dS || | D ]\}	}
||	 du r|
dur|
||	< qyn| |dS |sG|d dv rt t}}|dv rd	}n|d
krd}||ff}n|d }|D ]\}}||  kr|krn q nq| j||d pd|dS d}|dk }|rdd |d pdD \}}|dv }|rt|}|dkrt|d }|d	k r| |dS |d	 | }t|d | }ne|dkr]t|d }|d	k r4| |dS || }d|  krD|k rPn n
t|d | }n3| j||d pYd|dS |dkrt|d }|d	k rs| |dS |d	 | }|d	 | d	 }t|d | | }n|dkrt|d }|dk r| |dS g }|dkr|d	8 }|t|d ||   || }|dksdt	|}n|dkr|dkrt|d d }ng }t|d }|dk r| |dS t|}|dkr|t|d ||   || }|dksdt	|}nk|d
kr|dkr6|d D ]\}}|dkr3t|}q&n;g }t|d d	k rG| |dS |d D ]%\}}|| }|
t|g|  ||| 8 }|dkrod|} nqK|du r| j||d pd|dS |dusJ |d pd}|d t| }|r|r|t|t| 8 }|dkr|t|d	  | }|r|r|| | }|S )zzGenerate the counter representation.

        See https://www.w3.org/TR/css-counter-styles-3/#generate-a-counter

        Nr   r   r&   )Nr/   Nr*   )r$   N)
alphabeticr/   r   additiver   r,   )r7   c                 s   s    | ]}t |V  qd S N)r   )r   	characterr   r   r   r      r    z,CounterStyle.render_value.<locals>.<genexpr>r'   r"   )r/   r?   numericr@   r   r-   r   r/   r?      rC   r.   r+   r%   )r>   render_valuer2   r4   r   absr   r   joinreversedextend)r5   counter_valuer6   r:   r7   r0   r&   fixed_numberr<   r=   r
   	min_range	max_rangecounter_rangesinitialis_negativenegative_prefixnegative_suffixuse_negativelengthindexrepeatreversed_partsweightsymbol_stringpartsrepetitionsr+   pad_differencer   r   r   rE   g   s   



























zCounterStyle.render_valuec                 C   sp   |  |}|du rd| v r| d|S dS t|d pd}t|d p#d}| j||d}|dus2J || | S )	z2Generate the content of a ::marker pseudo-element.Nr   r   r(   r   r)   )r   z. )r6   )r>   render_markerr   rE   )r5   r6   rJ   r:   r(   r)   r
   r   r   r   r]     s   
zCounterStyle.render_markerc                    s   t t  S rA   )r   superr3   )r5   	__class__r   r   r3   &  s   zCounterStyle.copyrA   )NNN)	__name__
__module____qualname____doc__r>   rE   r]   r3   __classcell__r   r   r_   r   r   #   s    
;
 /r   N)	rd   mathr   utilsr   r   r   dictr   r   r   r   r   <module>   s    
