
    iE                        d Z ddlmZ ddlZddlZddlZddlm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edk(  r e        yy)z4Extract typography metadata from captured CSS files.    )annotationsN)Counter)Path)parse_all_custom_propertiesc           
       
 i }| j                         D ]  \  }}t        j                  d|      }|s|j                  d      }|j                  d      xs d}|j                  d      }|dk(  rd}n|dk(  rd	}| d
| }||vri ||<   |j	                         ||   |<    dddddddddd	
dddddddddd	i }	t        |
fd      D ]#  }dD ci c]  }|||   v r	|||   |    c}|	|<   % |	S c c}w )znGroup --*-font-<category>-<variant>-<prop> into {category-variant: {size, weight, lineHeight, letterSpacing}}.z--(.*)font-(heading|text|display|title|label|caption|input|quote|body)-?([a-z0-9]*)-(size|weight|lineHeight|line-height|letterSpacing|letter-spacing)$      base   zline-height
lineHeightzletter-spacingletterSpacing-r                  )	headingtextdisplaytitlelabelcaptioninputquotebody)	r
   xxsxssmmdlgxlxxlxxxlc                    j                  | j                  dd      d   t                    j                  | j                  dd      d   t                    | fS )Nr   r   r   )getsplitlen)itemcategory_ordervariant_orders    S/home/jay/workspace/.worktrees/task-2116-dev1/tools/insane-design/typo_extractor.py<lambda>z)group_typography_tokens.<locals>.<lambda>?   sW    tzz#q1!4c.6IJdjja03S5GH
     key)sizeweightr   r   )itemsrematchgroupstripsorted)propsgroupednamevaluer5   categoryvariantpropr0   resultr*   r+   s             @@r,   group_typography_tokensrA      sl   )+G{{} +e f
 ;;q>++a.*F{{1~= D%%"D
!G9%gGCL"[[]T#+( 
N 
M )+F
 
 J
ws|# '#,t$$
s
 M
s   C5c                   t               }t        j                  d| t        j                        D ]{  }|j	                  d      j                         }t        j                  dd|t        j                        }t        j                  d|t        j                        ro||xx   dz  cc<   } g }t        |j                         d       D ]q  \  }}t        j                  dd|t        j                        j                  d	d      d
   j                         }|j                  ||j                  d      |d       s |S )z]Return [{declaration, first_name, count}] from all font-family declarations. Skip var() only.zfont-family\s*:\s*([^;{}]+)r   z\s*!important\s*$ )flagszvar\([^)]*\)c                    | d    | d   fS )Nr   r    )r)   s    r,   r-   z'extract_font_families.<locals>.<lambda>X   s    QxQUVWQXFY r.   r/   ,r   z"')declaration
first_namecount)r   r4   finditer
IGNORECASEr6   r7   sub	fullmatchr8   r3   r'   append)csscountsr5   rH   parse_targetr@   rJ   rI   s           r,   extract_font_familiesrS   M   s   YF;S"--P !kk!n**,vv2B2==Y<<r}}E{q ! F$V\\^9YZ 
UVV0"kW]]^acdefghnnp
*(..u5	

 Mr.   c                    t        d t        j                  d| t        j                        D              }t	        |d       D ci c]  }|||   
 c}S c c}w )z:Return {weight_value: count} for font-weight declarations.c              3  Z   K   | ]#  }|j                  d       j                          % yw)r   N)r6   lower).0r5   s     r,   	<genexpr>z,extract_font_weights_used.<locals>.<genexpr>f   s)       	As   )+z4font-weight\s*:\s*(\d{3}|normal|bold|lighter|bolder)c                D    | j                         rdt        |       fS d| fS )Nr   r   )isdigitint)r2   s    r,   r-   z+extract_font_weights_used.<locals>.<lambda>r   s     6>>3C3v;/ !V r.   r/   )r   r4   rK   rL   r8   )rP   rQ   r2   s      r,   extract_font_weights_usedr\   d   se     [[CMM
 F T
 	v  s   Ac           	        t        j                         dz  | z  dz  }|j                         st        d|       t	        |j                  d            }|st        d|       dj                  d |D              }t        |      }t        |      }t        |      }t        |      }| |||t        |      t        |      t        |      dd	}| d
k(  r|d   d   dk  rt        d      t        j                         dz  | z  dz  dz  }	|	j                  j                  dd       |	j                  t!        j"                  |dd      dz   d       |S )zKRead CSS, run all three, write insane-design/{slug}/phase1/typography.json.zinsane-designrP   zMissing CSS directory: z*.csszNo CSS files found in 
c              3  B   K   | ]  }|j                  d d        yw)utf-8replace)encodingerrorsN)	read_text)rW   paths     r,   rX   zextract_slug.<locals>.<genexpr>   s     ]4DNNGINF]s   )scale_entriesunique_familiesunique_weights)slugscalefamiliesweights_usedstatsstriperm   rf   r   z7stripe must produce at least 7 typography scale entriesphase1ztypography.jsonT)parentsexist_okr   F)indentensure_asciir`   )rb   )r   cwdis_dirFileNotFoundErrorr8   globjoinr   rA   rS   r\   r(   
ValueErrorparentmkdir
write_textjsondumps)
ri   css_dir	css_filesrP   r9   rj   rk   rl   r@   output_paths
             r,   extract_slugr   w   sW   hhj?*T1E9G>>"9' CDDw||G,-I"8	 BCC
))]S\]
]C',E#E*E$S)H,S1L$ Z"8}!,/

F xF7OO<q@RSS((*.5@CTTKTD94::fQUKdR]deMr.   c                     t        t        j                        dkD  rt        j                  d   nd} t        |       }t	        t        j                  | d|  d|d   dd             y )	Nr   rn   zinsane-design/z/phase1/typography.jsonrm   )ri   outputrm   F)rs   )r(   sysargvr   printr}   r~   )ri   r@   s     r,   mainr      s_    chh-!+388A;D$F	

*4&0GH
 	
	r.   __main__)r9   zdict[str, str]returnzdict[str, dict])rP   strr   z
list[dict])rP   r   r   zdict[str, int])ri   r   r   dict)r   None)__doc__
__future__r   r}   r4   r   collectionsr   pathlibr   
css_parserr   rA   rS   r\   r   r   __name__rF   r.   r,   <module>r      sL    : "  	 
   2;|.&"J zF r.   