o
    _h@                     @   s  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
 ddlmZ dZdZh dZeh d	B ZG d
d dZdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$Zd%Zd&Z d'Z!d(d) Z"d*d+ Z#d,d- Z$e	% Z	e	&d. e'ee	 Z(d/S )0    )
hls_to_rgb)cosdegreesradianssin   )_BASIC_COLOR_KEYWORDS_EXTENDED_COLOR_KEYWORDS_HASH_REGEXPS)parse_one_component_value)g>?r   gqAg?)g=_"j?r   gl?>	   a98-rgb
display-p3srgb-linearprophoto-rgbxyzsrgbrec2020xyz-d50xyz-d65>   hslhwblablchoklaboklchc                       sP   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Z fddZ	dd Z
  ZS )ColorzA specified color in a defined color space.

    The color space is one of ``COLOR_SPACES``.

    Coordinates are floats with undefined ranges, but alpha channel is clipped
    to [0, 1]. Coordinates can also be set to ``None`` when undefined.

    c                 C   sJ   |t v sJ | d|| _tdd |D | _tdtdt|| _d S )Nz is not a supported color spacec                 s   s$    | ]}|d u r
d nt |V  qd S N)float.0
coordinate r!   C/var/www/html/myenv/lib/python3.10/site-packages/tinycss2/color4.py	<genexpr>   s
    
z!Color.__init__.<locals>.<genexpr>g              ?)COLOR_SPACESspacetuplecoordinatesmaxminr   alpha)selfr&   r(   r+   r!   r!   r"   __init__   s   
zColor.__init__c                 C   s2   d dd | jD }d| j d| d| j dS )N c                 s   s    | ]}t |V  qd S r   )strr   r!   r!   r"   r#   #       z!Color.__repr__.<locals>.<genexpr>zcolor(z / ))joinr(   r&   r+   )r,   r(   r!   r!   r"   __repr__"   s   zColor.__repr__c                 c   s    | j E d H  | jV  d S r   r(   r+   r,   r!   r!   r"   __iter__&   s   zColor.__iter__c                 C   s   g | j | jR | S r   r4   )r,   keyr!   r!   r"   __getitem__*   s   zColor.__getitem__c                 C   s   t t| S r   )hashr/   r5   r!   r!   r"   __hash__-   s   zColor.__hash__c                    sR   t |trdS t |trt| |kS t |tr#| j|jko"| j|jkS t |S )NF)
isinstancer/   r'   r   r&   r(   super__eq__)r,   other	__class__r!   r"   r=   0   s   


zColor.__eq__c                    s\  t dd | jD }|dkrd}|| jkrt||| jS |dkrv| jdkr>t|d d |d	 d
 |d d
 }t||| jS | jdkrt|dd \   d
kr[   fd }n fddt|d d ddD }t||| jS t|dkr| jdkrtg |tR  }t||| jS | jdkr|d tt	|d	  }|d t
t	|d	  }t|d ||t}t||| jS t|dkr| jdkrt| }t||| jS | jdkr|d tt	|d	  }|d t
t	|d	  }t|d ||}t||| jS t|dkr| jdkrtg |tR  }t||| jS | jdkr2tg |tR  }t||| jS | jdkr\|d tt	|d	  }|d t
t	|d	  }t||d ||f| jS | jdkrvt| }tg |tR  }t||| jS | jdkr|d tt	|d	  }|d t
t	|d	  }t|d ||}tg |tR  }t||| jS t)a  Return new instance with coordinates transformed to given ``space``.

        The destination color space is one of ``SPACES``.

        ``None`` coordinates are always transformed into ``0`` values.

        Here are the supported combinations:

        - from hsl and hwb to srgb;
        - from lab and lch to xyz-d50;
        - from oklab and oklch to xyz-d65;
        - from xyz-d50, xyz-d65, lch, oklab and oklch to lab.

        c                 s   s    | ]}|pd V  qdS )r   Nr!   r   r!   r!   r"   r#   H   r0   zColor.to.<locals>.<genexpr>r   r   r   r   r   h     d   r   r   N   c                 3   s(    | ]}|d      d  V  qdS )rC   Nr!   r   channelblackwhiter!   r"   r#   Z   s
    
g      ?r   r   r   r   r   )r'   r(   r&   r   r+   r   _lab_to_xyzD50r   r   r   _oklab_to_xyz_xyz_to_labD65NotImplementedError)r,   r&   r(   rgbr   abr   r!   rG   r"   to9   s   





(





zColor.to)__name__
__module____qualname____doc__r-   r3   r6   r8   r:   r=   rS   __classcell__r!   r!   r?   r"   r      s    	r   c                    s|  t | trt| dd}n| }|jdkr>|jdkrdS |jdkr%tdddS t|j }r<td	d
 |D }td|dS dS |jdkrrt	D ]*\ }||j
}|ro fdd| D }t|dkre| nd}td||  S qEdS |jdkr8dd |jD }|j}	|	dkr|^}
}t|}|dv rtdd
 |ddd D rd}|ddd }n|dkrd}n|dkr|d dkr|d d}ndS |dd t|dd }}|du rdS |	dv rt||S |	dv rt||S |	dkrt||S |	dkr|st||S |	dkr|st||S |	d kr|st||S |	d!kr*|s*t||S |	dkr:|s<t|
||S dS dS dS )"a  Parse a color value as defined in CSS Color Level 4.

    https://www.w3.org/TR/css-color-4/

    :type input: :obj:`str` or :term:`iterable`
    :param input: A string or an iterable of :term:`component values`.
    :returns:
        * :obj:`None` if the input is not a valid color value.
          (No exception is raised.)
        * The string ``'currentcolor'`` for the ``currentcolor`` keyword
        * A :class:`Color` object for every other values, including keywords.

    T)skip_commentsidentcurrentcolortransparentr   )r   r   r   r   c                 s   s    | ]}|d  V  qdS )   Nr!   rE   r!   r!   r"   r#      r0   zparse_color.<locals>.<genexpr>r   r9   c                    s   g | ]}t |  d d qS )   r]   )int)r   group
multiplierr!   r"   
<listcomp>   s    zparse_color.<locals>.<listcomp>   functionc                 S   s   g | ]	}|j d vr|qS ))
whitespacecomment)typer   tokenr!   r!   r"   rc      s
    
color)      c                 s   s    | ]}|d kV  qdS ),Nr!   ri   r!   r!   r"   r#      r0   NrB   rD   Frl   /)rP   rgba)r   hslar   r   r   r   r   )r;   r/   r   rh   lower_valuer   _COLOR_KEYWORDSgetr'   r
   valuegroupslenpop	arguments
lower_nameall_parse_alpha
_parse_rgb
_parse_hsl
_parse_hwb
_parse_lab
_parse_lch_parse_oklab_parse_oklch_parse_color)inputrj   rk   rP   regexpmatchchannelsr+   tokensnamer&   length
old_syntaxargsr!   ra   r"   parse_color   sz   






$







#r   c                 C   sp   t | dkrdS t | dkr4| d jdkr tdtd| d jS | d jdkr6tdtd| d jd S dS dS )zParse a list of one alpha value.

    If args is a list of a single INTEGER, NUMBER or PERCENTAGE token,
    return its value clipped to the 0..1 range. Otherwise, return None.

    r   r$   r   number
percentagerC   N)rw   rh   r*   r)   ru   )r   r!   r!   r"   r|      s   r|   c                 C   s6   t | t dhdhfvrdS dd | D }td||S )zParse a list of RGB channels.

    If args is a list of 3 NUMBER tokens or 3 PERCENTAGE tokens, return
    sRGB :class:`Color`. Otherwise, return None.

    Input R, G, B ranges are [0, 255], output are [0, 1].

    r   r   Nc                 S   s8   g | ]}|j d kr|jd n|j dkr|jd ndqS )r   r]   r   rC   Nrh   ru   r   argr!   r!   r"   rc      s
    z_parse_rgb.<locals>.<listcomp>r   )_typessetr   r   r+   r(   r!   r!   r"   r}      s   	r}   c                 C   s   t | dd t dhdhfvrdS t| d  }du rdS | d jdkr'dn|| d jdkr1dn| d j| d jdkr>dn| d jg}td||S )	zParse a list of HSL channels.

    If args is a list of 1 NUMBER or ANGLE token and 2 PERCENTAGE tokens,
    return HSL :class:`Color`. Otherwise, return None.

    H range is [0, 360). S, L ranges are [0, 100].

    r   Nr   r   r   rZ   rB   r   )r   r   
_parse_huerh   ru   r   r   r+   huer(   r!   r!   r"   r~      s    	r~   c                 C   s   t | dd ddhksdS t| d  }du rdS | d jdkr#dn|| d jdkr-dn| d j| d jdkr:dn| d jg}td||S )	zParse a list of HWB channels.

    If args is a list of 1 NUMBER or ANGLE token and 2 NUMBER or PERCENTAGE
    tokens, return HWB :class:`Color`. Otherwise, return None.

    H range is [0, 360). W, B ranges are [0, 100].

    r   Nr   r   r   rZ   rB   r   r   r   rh   ru   r   r   r!   r!   r"   r   	  s   	r   c                 C   s   t | ddhks
dS | d jdkrdn| d j| d jdkr dn| d j| d jdkr-dnd | d jdkr8dn| d j| d jdkrEdnd g}td	||S )
zParse a list of CIE Lab channels.

    If args is a list of 3 NUMBER or PERCENTAGE tokens, return Lab
    :class:`Color`. Otherwise, return None.

    L range is [0, 100]. a, b ranges are [-125, 125].

    r   r   Nr   rZ   r   g      ?rB   r   r   rh   ru   r   r   r!   r!   r"   r     s   	r   c                 C   s   t | dd ddhksdS t| d  }du rdS | d jdkr#dn| d j| d jdkr0dn| d j| d jdkr=dnd | d jdkrHdn|g}td	||S )
zParse a list of CIE LCH channels.

    If args is a list of 2 NUMBER or PERCENTAGE tokens and 1 NUMBER or ANGLE
    token, return LCH :class:`Color`. Otherwise, return None.

    L range is [0, 100]. C range is [0, 150]. H ranges is [0, 360).

    NrB   r   r   r   rZ   r   g      ?r   r   r   r!   r!   r"   r   3  s   	r   c                 C   s   t | ddhks
dS | d jdkrdn| d j| d jdkr dnd | d jdkr+dn| d j| d jdkr8dnd | d	 jdkrCdn| d	 j| d	 jdkrPdnd g}td
||S )zParse a list of Oklab channels.

    If args is a list of 3 NUMBER or PERCENTAGE tokens, return Oklab
    :class:`Color`. Otherwise, return None.

    L range is [0, 100]. a, b ranges are [-0.4, 0.4].

    r   r   Nr   rZ   r   {Gz?Mbp?rB   r   r   r   r!   r!   r"   r   I  s   	r   c                 C   s   t | dd ddhksdS t| d  }du rdS | d jdkr#dn| d j| d jdkr0dnd | d jdkr;dn| d j| d jdkrHdnd	 | d jdkrSdn|g}td
||S )zParse a list of Oklch channels.

    If args is a list of 2 NUMBER or PERCENTAGE tokens and 1 NUMBER or ANGLE
    token, return Oklch :class:`Color`. Otherwise, return None.

    L range is [0, 1]. C range is [0, 0.4]. H range is [0, 360).

    NrB   r   r   r   rZ   r   r   r   r   r   r   r!   r!   r"   r   _  s   	r   c                 C   sV   t |ddhks
dS | jdks| j } tvrdS | dkrd} dd |D }t| ||S )	zKParse a color space name list of coordinates.

    Ranges are [0, 1].

    r   r   NrZ   r   r   c                 S   s4   g | ]}|j d kr|jn|j dkr|jd ndqS )r   r   rC   Nr   r   r!   r!   r"   rc     s
    z _parse_color.<locals>.<listcomp>)r   rh   rr   _FUNCTION_SPACESr   )r&   r   r+   r(   r!   r!   r"   r   v  s   r   c                 C   s   | j dkr
| jd S | j dkrA| jdkr| jd S | jdkr'| jd d d S | jdkr3t| jd S | jdkr?| jd d S dS | j d	krM| jd
krOdS dS dS )zCParse hue token.

    Range is [0, 360). ``none`` value is 0.

    r   rA   	dimensiondeggradi  radturnrZ   noner   N)rh   ru   unitr   rr   )rj   r!   r!   r"   r     s   







r   c                 C   s6   t  }| D ]}|jdkr|jdkrq||j q|S )z3Get a set of token types, ignoring ``none`` values.rZ   r   )r   rh   rr   add)r   typesrj   r!   r!   r"   r     s   r   g&^:@g|T#?))g3DL?g՞g|yO?)gXƤg@F?g͎[)gvy-gy"ڿgfm"r
d?))g
+?g/]?gȜ!u?)gYb  ?g qg[HX)g9  ?gpso趿g!Fc                 C   s   | |d  }||d  }||d  }|t kr|d nt| d d }|t kr*|d nt| d d }|t kr:|d nt| d d }	d| d }
d||  }d||	  }|
||fS )	Nr   r   rB   gUUUUUU?r^   t           _ε   _κ)XYZdxyzf0f1f2LrQ   rR   r!   r!   r"   rM     s      
rM   c                 C   s   | d d }|d | }||d  }|d t kr|d nd| d t }| tt  kr2| d d d n| t }|d t kr@|d nd| d t }	||d  }
||d  }|	|d  }|
||fS )	Nr^   r   r   r   rD   r   r   rB   r   )r   rQ   rR   r   r   r   r   r   r   r   r   r   r   r!   r!   r"   rJ     s   $$$
rJ   c                    sF   | ||f  fddt dD fddt dD \}}}|||fS )Nc                    (   g | ] t  fd dtdD qS )c                 3   s$    | ]}t   | |  V  qd S r   )_OKLAB_TO_LMSr   j)ir   r!   r"   r#     s   " +_oklab_to_xyz.<locals>.<listcomp>.<genexpr>rD   sumranger   )r   r   r"   rc        ( z!_oklab_to_xyz.<locals>.<listcomp>rD   c                    r   )c                 3   s(    | ]}t   | | d   V  qdS )rD   N)_LMS_TO_XYZr   )r   lmsr!   r"   r#     s   & r   rD   r   r   )r   r   r"   rc     r   )r   )r   rQ   rR   r   r   r   r!   )r   r   r"   rL     s   

rL   )rebeccapurple)f   3      N))colorsysr   mathr   r   r   r   color3r   r	   r
   parserr   rK   rN   r   r%   r   r   r|   r}   r~   r   r   r   r   r   r   r   r   r   r   r   r   rM   rJ   rL   copyappenddictrs   r!   r!   r!   r"   <module>   s>    wJ
