
    AHj."              
      &   d dl mZ d dlmZmZ d dlmZ d dlmZ d dl	m
Z
mZ d dlZd dlmZ d dlmZ d d	lmZ d d
lmZ e
rd dl	mZ d dlmZ d dlmZ  G d de      Z G d de      Zd dZd dZd dZd dZ ejB                  eejD                  eejF                  eejH                  e ejJ                  eiZ&e G d d             Z'e G d d             Z(ejR                  jU                  d      e G d d                    Z+e G d d             Z,y)!    )annotations)	dataclassfield)Enum)partial)TYPE_CHECKINGIterableN)HelpText)Styles)Token)Specificity3)Callable)Self)DOMNodec                  ,    e Zd ZdZdZ	 dZ	 dZ	 dZ	 dZy)SelectorTypezType of selector.               N)	__name__
__module____qualname____doc__	UNIVERSALTYPECLASSIDNESTED     I/root/tools/cai/cai_env/lib/python3.12/site-packages/textual/css/model.pyr   r      s-    ID E!	
BF1r"   r   c                       e Zd ZdZdZ	 dZ	 dZy)CombinatorTypezType of combinator.r   r   r   N)r   r   r   r   SAME
DESCENDENTCHILDr!   r"   r#   r%   r%   &   s    D5J;EAr"   r%   c                &    |j                  d       S )zCheck node matches universal selector.

    Args:
        name: Selector name.
        node: A DOM node.

    Returns:
        `True` if the selector matches.
    z-textual-system)	has_classnamenodes     r#   _check_universalr.   1   s     ~~/000r"   c                    | |j                   v S )zCheck node matches a type selector.

    Args:
        name: Selector name.
        node: A DOM node.

    Returns:
        `True` if the selector matches.
    )_css_type_namesr+   s     r#   _check_typer1   >   s     4''''r"   c                    | |j                   v S )zCheck node matches a class selector.

    Args:
        name: Selector name.
        node: A DOM node.

    Returns:
        `True` if the selector matches.
    )_classesr+   s     r#   _check_classr4   K   s     4==  r"   c                     |j                   | k(  S )zCheck node matches an ID selector.

    Args:
        name: Selector name.
        node: A DOM node.

    Returns:
        `True` if the selector matches.
    idr+   s     r#   	_check_idr8   X   s     77d?r"   c                      e Zd ZU dZded<   ej                  Zded<   ej                  Z
ded<    ee      Zd	ed
<    ed       Zded<   dZded<   ddZedd       ZddZddZy)SelectorzjRepresents a CSS selector.

    Some examples of selectors:

    *
    Header.title
    App > Content
    strr,   r%   
combinatorr   typedefault_factoryset[str]pseudo_classesc                      y)Nr   r   r   r!   r!   r"   r#   <lambda>zSelector.<lambda>}   s    r"   r   specificityr   intadvancec                \    t        t        | j                     | j                        | _        y N)r   _CHECKSr=   r,   _checkselfs    r#   __post_init__zSelector.__post_init__   s    189KTYY1Wr"   c                l   dj                  d t        | j                        D              }| j                  t        j
                  k(  ry| j                  t        j                  k(  r| j                   | S | j                  t        j                  k(  rd| j                   | S d| j                   | S )z0Rebuilds the selector as it would appear in CSS. c              3  &   K   | ]	  }d |   yw):Nr!   ).0r,   s     r#   	<genexpr>zSelector.css.<locals>.<genexpr>   s     St!D6
S   *.#)	joinsortedrA   r=   r   r   r   r,   r   )rM   pseudo_suffixs     r#   csszSelector.css   s     Svd>Q>Q7RSS99...YY,+++ii[00YY,,,,tyyk-11tyyk-11r"   c                t    | j                   j                  |       | j                  \  }}}||dz   |f| _        y)ztAdds a pseudo class and updates specificity.

        Args:
            pseudo_class: Name of pseudo class.
        r   N)rA   addrE   )rM   pseudo_classspecificity1specificity2specificity3s        r#   _add_pseudo_classzSelector._add_pseudo_class   s>     	-373C3C0lL(,*:LIr"   c                z    | j                  |      xr) | j                  r|j                  | j                        S dS )zCheck if a given node matches the selector.

        Args:
            node: A DOM node.

        Returns:
            True if the selector matches, otherwise False.
        T)rK   rA   has_pseudo_classes)rM   r-   s     r#   checkzSelector.check   sC     {{4  
"" ##D$7$78	
 	
r"   NreturnNonerh   r;   )r_   r;   rh   ri   )r-   r   rh   bool)r   r   r   r   __annotations__r%   r'   r<   r   r   r=   r   setrA   rE   rG   rN   propertyr\   rc   rf   r!   r"   r#   r:   r:   n   s|     I!/!:!:J:%**D,*$S9NH9 %6G HKHGSX 
2 
2J
r"   r:   c                  B    e Zd ZU dZded<   ded<    ee      Zded<   y	)
Declarationz-A single CSS declaration (not yet processed).r   tokenr;   r,   r>   zlist[Token]tokensN)r   r   r   r   rl   r   listrr   r!   r"   r#   rp   rp      s    7L
I5FK5r"   rp   T)angularc                      e Zd ZU dZ ee      Zded<   dZded<   ddZ	e
dd	       Ze
dd
       ZddZddZedd       Zy)SelectorSetz.A set of selectors associated with a rule set.r>   list[Selector]	selectorsrC   r   rE   c                    t         j                  }t        | j                  | j                  dd        D ]"  \  }}t	        |j
                  |k7        |_        $ y )Nr   )r%   r&   ziprx   rF   r<   rG   )rM   r&   selectornext_selectors       r#   rN   zSelectorSet.__post_init__   sQ    ""'*4>>4>>!";M'N 	E#Hm"=#;#;t#CDH	Er"   c                @    t         j                  | j                        S rI   )RuleSet_selector_to_cssrx   rL   s    r#   r\   zSelectorSet.css   s    ''77r"   c                    t         j                  t         j                  ht        fd| j                  D              S )zGAre all the selectors simple (i.e. only dependent on static DOM state).c              3  X   K   | ]!  }|j                   v xr |j                    # y wrI   )r=   rA   )rS   r{   simple_typess     r#   rT   z(SelectorSet.is_simple.<locals>.<genexpr>   s3      
 ]]l*J83J3J/JJ
s   '*)r   r   r   allrx   )rM   r   s    @r#   	is_simplezSelectorSet.is_simple   s7     %):):; 
 NN
 
 	
r"   c              #  r   K   t         j                  | j                        }| d | j                  f y wrI   )r~   r   rx   rE   )rM   rx   s     r#   __rich_repr__zSelectorSet.__rich_repr__   s0     ,,T^^<	D$$$$s   57c                    dx}x}}| j                   D ]!  }|j                  \  }}}||z  }||z  }||z  }# |||f| _        | S )zVCalculate total specificity of selectors.

        Returns:
            Self.
        r   )rx   rE   )rM   id_totalclass_total
type_totalr{   _id_class_types           r#   _total_specificityzSelectorSet._total_specificity   sk     /0//; 	 H!)!5!5COH6!K%J		 
 %k:>r"   c              #     K   |D ]?  }dx}x}}|D ]!  }|j                   \  }}}	||z  }||z  }||	z  }# t        ||||f       A y w)Nr   )rE   rv   )
clsrx   selector_listr   r   r   r{   r   r   r   s
             r#   from_selectorszSelectorSet.from_selectors   sz     & 	RM233H3{Z) $%-%9%9"VUCv%e#
	$
 mhZ-PQQ	Rs   AANrg   rj   )rh   rk   )rh   zrich.repr.Result)rh   r   )rx   zlist[list[Selector]]rh   zIterable[SelectorSet])r   r   r   r   r   rs   rx   rl   rE   rN   rn   r\   r   r   r   classmethodr   r!   r"   r#   rv   rv      sn     9 %d ;I~; )K)E
 8 8 
 
%
 R Rr"   rv   c                      e Zd ZU  ee      Zded<    ee      Zded<    ee      Z	ded<   dZ
d	ed
<   dZded<    ee      Zded<    ee      Zded<   d Zedd       Zed        Zedd       ZddZy)r~   r>   zlist[SelectorSet]selector_setr   stylesz"list[tuple[Token, str | HelpText]]errorsFrk   is_default_rulesr   rF   tie_breakerr@   selector_namesrA   c                    t        |       S rI   r6   rL   s    r#   __hash__zRuleSet.__hash__   s    $xr"   c                B   g }|D ]z  }|j                   t        j                  k(  r|j                  d       n.|j                   t        j                  k(  r|j                  d       |j                  |j
                         | dj                  |      j                         S )N z > rP   )r<   r%   r'   appendr(   r\   rY   strip)r   rx   rr   r{   s       r#   r   zRuleSet._selector_to_css   s    ! 	(H""n&?&??c"$$(<(<<e$MM(,,'	( wwv$$&&r"   c                L     dj                   fd j                  D              S )Nz, c              3  T   K   | ]  }j                  |j                         ! y wrI   )r   rx   )rS   r   rM   s     r#   rT   z$RuleSet.selectors.<locals>.<genexpr>	  s*      
 !!,"8"89
s   %()rY   r   rL   s   `r#   rx   zRuleSet.selectors  s'    yy 
 $ 1 1
 
 	
r"   c                    dj                  d | j                  j                  D              }| j                   d| d}|S )zbGenerate the CSS this RuleSet

        Returns:
            A string containing CSS code.
        
c              3  &   K   | ]	  }d |   yw)z    Nr!   )rS   lines     r#   rT   zRuleSet.css.<locals>.<genexpr>  s      Q44v QrU   z {
z
})rY   r   	css_linesrx   )rM   declarationsr\   s      r#   r\   zRuleSet.css  s>     yy Q4;;;P;P QQ l^48
r"   c                2   t         j                  }t         j                  }t         j                  }t         j                  }| j
                  j                  }| j                  j                  }| j                  D ]  }|j                  D ]  } ||j                          |j                  d   }|j                  }	|	|k(  r	 |d       O|	|k(  r ||j                         g|	|k(  r |d|j                          |	|k(  s |d|j                           y)z#Called after the RuleSet is parsed.rV   rW   rX   N)r   r   r   r   r   r   r^   rA   updater   rx   r=   r,   )
rM   
class_typeid_type	type_typeuniversal_typeadd_selectoradd_pseudo_classesr   r{   selector_types
             r#   _post_parsezRuleSet._post_parse  s     "''
// %%	%//**..!0077 -- 	2L(22 <"8#:#:;< $--b1H$MMM.S!)+X]]+*,q01')q01	2r"   N)rx   rw   rh   r;   rj   rg   )r   r   r   r   rs   r   rl   r   r   r   r   r   rm   r   rA   r   r   r   rn   rx   r\   r   r!   r"   r#   r~   r~      s    &+D&AL#A62FF216t1LF.L"d"K$S9NH9$S9NH9 	' 	' 
 
  2r"   r~   )r,   r;   r-   r   rh   rk   )-
__future__r   dataclassesr   r   enumr   	functoolsr   typingr   r	   	rich.reprrichtextual.css._help_renderablesr
   textual.css.stylesr   textual.css.tokenizer   textual.css.typesr   r   typing_extensionsr   textual.domr   r   r%   r.   r1   r4   r8   r   r   r   r   r    rJ   r:   rp   reprautorv   r~   r!   r"   r#   <module>r      s    " (   *  2 % & *&#24 2BT B
1
(
!
 ,{OOY) 8
 8
 8
v 6 6 6 
5R 5R  5Rp D2 D2 D2r"   