
    bi                        d dl mZ d dlZd dlZd dlmZ d dlmZ ddZddZ	ddZ
ddZdd	Zdd
Z	 d	 	 	 	 	 	 	 ddZdddZddZddZdddZedk(  r e e             y)    )annotationsN)Path)parse_all_custom_propertiesc                2    | j                  d      r| S d|  S )Nz--)
startswith)names    7/home/jay/workspace/tools/insane-design/var_resolver.py_normalize_namer
   
   s    ??4(494&k9    c                0   | j                         }|j                  d      r|j                  d      sy d}t        |      D ];  \  }}|dk(  r|dz  }|dk(  s|dz  }|dk  r y |dk(  s)|t	        |      dz
  k7  s; y  |dk7  ry |dd j                         S )Nvar()r   (      )stripr   endswith	enumeratelen)valuestrippeddepthindexchars        r	   _unwrap_var_callr      s    {{}Hv&h.?.?.DE * t3;QJES[QJEqyzes8}q'88 zAb>!!r   c                    d}t        |       D ]]  \  }}|dk(  r|dz  }|dk(  r|dkD  s|dz  }"|dk(  s(|dk(  s.| |dz   d  j                         }| d | j                         |xs d fc S  | j                         d fS )Nr   r   r   r   ,)r   r   )innerr   r   r   fallbacks        r	   _split_var_argumentsr!   $   s    E ' ;t3;QJES[qy
S[UaZUQY[)//1H%=&&((*:d::; ;;=$r   c                    dd l }| j                         }|j                         }t        |j	                  d|      xs+ |j                  d      xr d|vxs |j	                  d|            S )Nr   z#[0-9a-fA-F]{3,8})zrgb(zrgba(zhsl(zhsla(r   z+[-+]?(?:\d+(?:\.\d+)?|\.\d+)(?:[a-zA-Z%]+)?)rer   lowerbool	fullmatchr   )r   r#   r   lowereds       r	   _is_terminal_valuer(   2   sm    {{}HnnG
)84 	RAB\vU\G\	R<<FQ r   c                0    |r|d   | k(  r| g|dd  S | g|S )Nr   r    )headtails     r	   _prepend_chainr-   >   s/    Q4 tABx  =4=r   c                   | j                         }t        |      r||gfS t        |      }|d |gfS t        |      \  }}t	        |      }||v rt        |||      S |d |gfS t        |||      \  }}	|t        ||	      fS N)r   r(   r   r!   r
   _resolve_var_with_chain_resolve_valuer-   )
r   propsseenr   r   	referencer    
normalizedresolvedchains
             r	   r1   r1   D   s    {{}H(#(##X&E}hZ.u5Ix +JU&z5$??j\!!$Xud;OHe^J666r   c                    t        |       }|
t               n
t        |      }||v rd |gfS |j                  |      }|d |gfS |j                  |       t	        |||      \  }}|t        ||      fS r/   )r
   setgetaddr1   r-   )r   r2   r3   r5   activerawr6   r7   s           r	   r0   r0   X   s     !&JlSUD	FVj\!!
))J
C
{j\!!
JJz$S%8OHe^J666r   c                &    t        | ||      \  }}|S )zRecursively resolve var(--x, fallback) chains to terminal hex or rgba/hsl string. Returns None for unresolvable, detects cycles via `seen`.)r0   )r   r2   r3   r6   _s        r	   resolve_varr@   i   s    )$t<KHaOr   c                j    i }| j                         D ]  \  }}t        ||       \  }}|||d||<    |S )zHReturn {var_name: {raw, resolved_terminal, chain: [str]}} for every var.)r=   resolved_terminalr7   )itemsr0   )r2   r6   r   r=   terminalr7   s         r	   resolve_allrE   o   sK     "H[[] 
	c1$>%!)

 Or   c           	        t        j                         dz  | z  dz  }t        j                         dz  | z  dz  dz  }i }|j                         rJt        |j	                  d            D ]-  }|j                  t        |j                  dd                   / t        |      }t        d	 |j                         D              }i }t        |j                               d
d D ]  \  }}	|	d   |	d   |	d   d||<    | t        |      |t        |      |z
  |d}
|j                  j                  dd       |j!                  t#        j$                  |
dd      dz   d       |
S )z\Top-level: read CSS, parse, resolve, write insane-design/{slug}/phase1/resolved_tokens.json.zinsane-designcssphase1zresolved_tokens.jsonz*.csszutf-8ignore)encodingerrorsc              3  ,   K   | ]  }|d    	d  yw)rB   Nr   r*   ).0detailss     r	   	<genexpr>zresolve_slug.<locals>.<genexpr>   s     hwwGZ?[?ghs   
N2   r=   rB   r7   )r=   r6   r7   )slug
total_varsresolved_countunresolved_countsamplesT)parentsexist_okF   ensure_asciiindent
)rJ   )r   cwdexistssortedglobupdater   	read_textrE   sumvalueslistrC   r   parentmkdir
write_textjsondumps)rQ   css_diroutput_pathr2   css_filer6   rS   rU   r   rN   results              r	   resolve_slugro   |   sq   hhj?*T1E9G((*.5@CYYKE~~w||G45 	mHLL4X5G5GQXai5G5jkl	m 5!Hh(//*;hhN!Ghnn./4 
g5> 34W%

 %j(J7F TD9

6a84?   Mr   c                    | t         j                  dd  n| }|r|d   nd}t        t        j                  t        |      dd             y)Nr   r   stripeFrX   rY   )sysargvprintri   rj   ro   )rs   argsrQ   s      r	   mainrv      sA    <388AB<TD47D	$**\$'eA
FGr   __main__)r   strreturnrx   )r   rx   ry   
str | None)r   rx   ry   ztuple[str, str | None])r   rx   ry   r%   )r+   rx   r,   	list[str]ry   r{   )r   rx   r2   dict[str, str]r3   zset[str]ry   tuple[str | None, list[str]]r/   )r   rx   r2   r|   r3   set[str] | Nonery   r}   )r   rx   r2   r|   r3   r~   ry   rz   )r2   r|   ry   zdict[str, dict])rQ   rx   ry   dict)rs   zlist[str] | Nonery   int)
__future__r   ri   rr   pathlibr   
css_parserr   r
   r   r!   r(   r-   r1   r0   r@   rE   ro   rv   __name__
SystemExitr*   r   r	   <module>r      s    "  
  2:",	7* ?C7
7$7,;7!7"
!H z
TV
 r   