
    ]hg?                         d dl mZmZmZm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lmZ 	 dgZd	Zd
Zd dlZej(                  d    dk\  reZneZd Z G d de	j2                        Zy)    )unicode_literalsdivisionabsolute_importprint_functionN   )cssrule)
MarginRule)CSSStyleDeclaration)chainCSSPageRulerestructuredtextz$Id$   c                 <    t        | t              r| S t        |       S N)
isinstancelist)ps    /home/pod-website-builder.sw7ft.com/pod-website-builder/website-analyzer/venv/lib/python3.12/site-packages/css_parser/css/csspagerule.pyas_listr      s    !T7N    c                   
    e Zd ZdZ	 	 d fd	Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Z fdZ eeed      Zd Zd Z eeed      Zd Z ed ed      ZddZ ed d      Z ed d      Z ed       Z xZS )r   a  
    The CSSPageRule interface represents a @page rule within a CSS style
    sheet. The @page rule is used to specify the dimensions, orientation,
    margins, etc. of a page box for paged media.

    Format::

        page :
               PAGE_SYM S* IDENT? pseudo_page? S*
               '{' S* [ declaration | margin ]? [ ';' S* [ declaration | margin ]? ]* '}' S*
               ;

        pseudo_page :
               ':' [ "left" | "right" | "first" ]
               ;

        margin :
               margin_sym S* '{' declaration [ ';' S* declaration? ]* '}' S*
               ;

        margin_sym :
               TOPLEFTCORNER_SYM |
               TOPLEFT_SYM |
               TOPCENTER_SYM |
               TOPRIGHT_SYM |
               TOPRIGHTCORNER_SYM |
               BOTTOMLEFTCORNER_SYM |
               BOTTOMLEFT_SYM |
               BOTTOMCENTER_SYM |
               BOTTOMRIGHT_SYM |
               BOTTOMRIGHTCORNER_SYM |
               LEFTTOP_SYM |
               LEFTMIDDLE_SYM |
               LEFTBOTTOM_SYM |
               RIGHTTOP_SYM |
               RIGHTMIDDLE_SYM |
               RIGHTBOTTOM_SYM
               ;

    `cssRules` contains a list of `MarginRule` objects.
    c                 |   t         t        |   ||       d| _        d| _        | j                         }|r$|| _        |j                  | j                  d       n| j                         | _        |r|| _	        nt               | _	        |j                  | j                  d       | j                  |       || _        y)z
        If readonly allows setting of properties in constructor only.

        :param selectorText:
            type string
        :param style:
            CSSStyleDeclaration for this CSSStyleRule
        
parentRuleparentStyleSheetz@page)r   r   r   selectorTextstyleN)superr   __init__
_atkeyword_specificity_tempSeqr   append_selectorTextr   r
   _setSeq	_readonly)selfr   r   r   r   readonlytempseq	__class__s          r   r   zCSSPageRule.__init__F   s     	k4)Z;K 	* 	M!%--/ ,DNN4,,n=!%DDJ,.DJtzz7+W!r   c                 ~    d| j                   j                  d| j                  d| j                  j                  dS )Nzcss_parser.css.z(selectorText=z, style=))r*   __name__r   r   cssTextr'   s    r   __repr__zCSSPageRule.__repr__g   s/    NN##JJ  	 r   c           	          d| j                   j                  | j                  | j                  | j                  j
                  t        | j                        t        |       fz  S )NzV<css_parser.css.%s object selectorText=%r specificity=%r style=%r cssRules=%r at 0x%x>)	r*   r-   r   specificityr   r.   lencssRulesidr/   s    r   __str__zCSSPageRule.__str__m   sU    0NN##JJtH4 	r   c                 8    |t        | j                               v S )z#Check if margin is set in the rule.)r   keys)r'   margins     r   __contains__zCSSPageRule.__contains__w   s    ---r   c                 :    t        d | j                  D              S )z,Return list of all set margins (MarginRule).c              3   4   K   | ]  }|j                     y wr   )r9   ).0rs     r   	<genexpr>z#CSSPageRule.keys.<locals>.<genexpr>}   s     7Aqxx7s   )r   r4   r/   s    r   r8   zCSSPageRule.keys{   s    7777r   c                 `    | j                   D ]  }|j                  |k(  s|j                  c S  y)z\Retrieve the style (of MarginRule)
        for `margin` (which must be normalized).
        N)r4   r9   r   r'   r9   r>   s      r   __getitem__zCSSPageRule.__getitem__   s,      	Axx6!ww	r   c                     t        | j                        D ]  \  }}|j                  |k(  s||_        |c S  | j	                  t        ||            S )zWSet the style (of MarginRule)
        for `margin` (which must be normalized).
        )	enumerater4   r9   r   addr	   )r'   r9   r   ir>   s        r   __setitem__zCSSPageRule.__setitem__   sP     dmm, 	7DAqxx6!	7
 88Jvu566r   c                 h    | j                   D ]#  }|j                  |k(  s| j                  |       % y)z[Delete the style (the MarginRule)
        for `margin` (which must be normalized).
        N)r4   r9   
deleteRulerA   s      r   __delitem__zCSSPageRule.__delitem__   s/      	#Axx6!"	#r   c           
      X   	 dddddd	d	 fd	}d	fd	}d	 fd	}dd} j                         } j                  d	| j                  |      ||||d
	      \  }}|xr 	d   }|dk(  r- j                  j	                  d j                  |      z         ||	d   	d   	d   ffS )z
        Parse `selectorText` which may also be a list of tokens
        and returns (selectorText, seq).

        see _setSelectorText for details
        TFr   )
wellformedlast-Snamefirstlrc                 P   	j                  |      }d   s| dv rd|k(  r	 t        |      }	j                  |      	j                  |      }}	j                  j                  |k7  r!	j
                  j                  d|z  |       | S |dvr#	j
                  j                  dd|z   d       |d	k(  rd
d	<   nd
d<   |j                  ||z   d       ydd<   	j
                  j                  d|z  |       | S # t        $ r  	j
                  j                  d|       Y | S w xY w)NrM   )page: or EOF:z6CSSPageRule selectorText: Expected IDENT but found: %r)rO   leftrightz%CSSPageRule: Unknown @page selector: T)
neverraiserO   r   rP   pseudoEOFz)CSSPageRule selectorText: No IDENT found.FrL   z-CSSPageRule selectorText: Unexpected CHAR: %r)
_tokenvaluenext_type_prodsIDENT_logerrorwarnr#   StopIteration)
expectedseqtoken	tokenizerval
identtokenivalitypnewr'   s
           r   _charz.CSSPageRule.__parseSelectorText.<locals>._char   sP   ""5)Cx=X1E%E#:%!%iJ
 "&!1!1*!=tzz*?U$D{{((D0		 )>@D)EFKM    'AA IINN.1$h,9EI + K  7?+,CL()CI

3:x8$ %*L!		 O"%!&',.1 % LIIOOCUL$  'Ls   C< <%D%$D%c                     | dk(  rdd<   | S )Does not raise if EOF is found.rS   TrM    )rc   rd   re   rf   rk   s       r   Sz*CSSPageRule.__parseSelectorText.<locals>.S   s    :% $HOr   c                    j                  |      }d| k(  rIj                  |      dk(  rj                  j                  d|       ydd<   |j	                  |d       ydd	<   j                  j                  d
|z  |       | S ) rR   autoz+CSSPageRule selectorText: Invalid pagename.r   rN   r^   rS   FrL   z.CSSPageRule selectorText: Unexpected IDENT: %r)rZ   
_normalizer_   r`   r#   )rc   rd   re   rf   rg   rk   r'   s        r   r^   z.CSSPageRule.__parseSelectorText.<locals>.IDENT   s    ""5)C!??3'61IIOO$Q$)+ " #$CKJJsG,!$)L!		 !%'*!+,13r   c                 f    |j                  t        j                  j                  |g      d       | S )rn   COMMENT)r#   
css_parsercss
CSSComment)rc   rd   re   rf   s       r   rv   z0CSSPageRule.__parseSelectorText.<locals>.COMMENT   s&    JJz~~00%99EOr   rR   )CHARr^   rv   rp   )rc   rd   rf   productionsrk   rL   identz/CSSPageRule selectorText: No valid selector: %rrN   rO   rP   r   )r"   _parse
_tokenize2r_   r`   	_valuestr)
r'   r   rl   rp   r^   rv   newseqrL   rc   rk   s
   `        @r   __parseSelectorTextzCSSPageRule.__parseSelectorText   s     "U1A/	 B		 $	
 #{{F/5Q]A^@EAFCJ=>8@ 03  +  4
H  5C$5
 wIIOOA|,-. 6CKWs4y#IIIr   c                    t        |      }g }g }|D ]  }|d   dk(  r| j                  |d         t        j                  v rt        | | j                        }t        |g|      |_        |D ]K  }|j                  |j                  k(  s|j                  D ]  }|j                  j                  |d       !  n |j                  |       |j                  |        ||fS )z$tokens is a list, no generator (yet)r   	ATKEYWORDr   r   F)replace)iterrt   r	   marginsr   r   r.   r9   r   setPropertyr#   )	r'   tokensgstyletokensr4   re   mr>   r   s	            r   __parseMarginAndStylez!CSSPageRule.__parseMarginAndStyle   s    L  	&EQx;&uQx(J,>,>> $040E0EG!5'1-	 " 'Axx188+!" BAGG//5/AB	' OOA& u%+	&. $$r   c                 @    t         j                  j                  |       S )z#Return serialized property cssText.)rw   serdo_CSSPageRuler/   s    r   _getCssTextzCSSPageRule._getCssText  s    ~~,,T22r   c                    t         t        |   |       | j                  |      }| j	                  | j                  |            | j                  j                  k7  rH| j                  j                  d| j                  |      z  t        j                  j                         yt        |       }d}| j                  |dd      \  }}| j                  |dd      \  }}| j                  |      }	| j!                  |      dk7  r1d}| j                  j                  d	| j                  |      z  |       n!|	rd}| j                  j                  d
|	       | j#                  |      \  }
}}|xr |
}| j!                  |      | j	                  |      }}|dk7  r5|dk7  r0d}| j                  j                  d| j                  |      z         n1d|k(  r|j%                  |       | j'                  |      \  }}||_        |r[|| _        || _        || _        t0        j2                  j5                         | _        D ]  }| j6                  j%                  |        yy)ad  
        :exceptions:
            - :exc:`~xml.dom.SyntaxErr`:
              Raised if the specified CSS string value has a syntax error and
              is unparsable.
            - :exc:`~xml.dom.InvalidModificationErr`:
              Raised if the specified CSS string value represents a different
              type of rule than the current one.
            - :exc:`~xml.dom.HierarchyRequestErr`:
              Raised if the rule cannot be inserted at this point in the
              style sheet.
            - :exc:`~xml.dom.NoModificationAllowedErr`:
              Raised if the rule is readonly.
        z%CSSPageRule: No CSSPageRule found: %sr`   )r   T)blockstartonlyseparateEnd)blockendonlyr   {Fz6CSSPageRule: No start { of style declaration found: %rz$CSSPageRule: Trailing content found.)re   }rY   z5CSSPageRule: No "}" after style declaration found: %rN)r   r   _setCssTextr~   r\   
_nexttokenr]   PAGE_SYMr_   r`   r   xmldomInvalidModificationErrr
   _tokensupto2rZ   _CSSPageRule__parseSelectorTextr#   !_CSSPageRule__parseMarginAndStyler.   r$   r!   r   rw   rx   CSSRuleListr4   )r'   r.   rf   newStyleokselectortokens
startbracer   braceorEOFtoken	nonetokenselok	newselseqr2   rg   type_r4   r>   r*   s                    r   r   zCSSPageRule._setCssText  sN    	k4,W5OOG,	::dooi01T[[5I5IIIIOOC NN734"%''"@"@  B +d;HB)-):):9JNGK *; *M&NJ ,0+<+<YJNIM ,= ,O(K 	2I
+s2		 !, $w 7!89CE 		 F&/   1 -1,D,D^,T)E9kB))/:DJJ<WCczeun		KNN7+,- E>&&7 )-(B(B;(O%+ $/ %."$/!%
 * : : <! ,AMM((+, r   z7(DOM) The parsable textual representation of this rule.)docc                 T    t         j                  j                  | j                        S )z'Wrapper for css_parser Selector object.)rw   r   do_CSSPageRuleSelectorr$   r/   s    r   _getSelectorTextzCSSPageRule._getSelectorTextf  s    ~~44T5G5GHHr   c                 p    | j                          | j                  |      \  }}}|r|| _        || _        yy)a  Wrapper for css_parser Selector object.

        :param selectorText:
            DOM String, in CSS 2.1 one of

            - :first
            - :left
            - :right
            - empty

        :exceptions:
            - :exc:`~xml.dom.SyntaxErr`:
              Raised if the specified CSS string value has a syntax error
              and is unparsable.
            - :exc:`~xml.dom.NoModificationAllowedErr`:
              Raised if this rule is readonly.
        N)_checkReadonlyr   r$   r!   )r'   r   rL   r   r2   s        r   _setSelectorTextzCSSPageRule._setSelectorTextj  sA    $ 	 +/*B*B<*P'
FK!'D +D r   zL(DOM) The parsable textual representation of the page selector for the rule.c                     | j                          t        |t              rt        ||       | _        y| |_        || _        y)zK
        :param style:
            a CSSStyleDeclaration or string
        )r.   r   N)r   r   string_typer
   _style_parentRule)r'   r   s     r   	_setStylezCSSPageRule._setStyle  s7    
 	e[)-eMDK $EDKr   c                     | j                   S r   )r   r/   s    r   <lambda>zCSSPageRule.<lambda>  s
    $++ r   z](DOM) The declaration-block of this rule set, a :class:`~css_parser.css.CSSStyleDeclaration`.c                    | j                  ||      \  }}|du s|du ryt        |t        j                  j                        st        |t        j                  j
                        s|t        |t        j                  j                        sXt        |t        j                  j                        s4t        |t              s$t        |t        j                  j                        rY| j                  j                  | j                  j                  d|j                  t        j                   j"                         y| j%                  ||      S )zImplements base ``insertRule``.FTNz): This type of rule is not allowed here: r   )_prepareInsertRuler   rw   rx   CSSCharsetRuleCSSFontFaceRuleCSSImportRuleCSSNamespaceRuler   CSSMediaRuler_   r`   r*   r-   r.   r   r   HierarchyRequestErr_finishInsertRule)r'   ruleindexs      r   
insertRulezCSSPageRule.insertRule  s    --dE:e5=DDL dJNN99:dJNN::;dJNN889dJNN;;<dK(dJNN778IIOO#~~66F"%''"="=  ? %%dE22r   c                     | j                   S r   )r!   r/   s    r   r   zCSSPageRule.<lambda>  s    (9(9 r   a  Specificity of this page rule (READONLY).
Tuple of (f, g, h) where:

 - if the page selector has a named page, f=1; else f=0
 - if the page selector has a ':first' pseudo-class, g=1; else g=0
 - if the page selector has a ':left' or ':right' pseudo-class, h=1; else h=0
c                     | j                   S r   )	PAGE_RULEr/   s    r   r   zCSSPageRule.<lambda>  s
     r   z=The type of this rule, as defined by a CSSRule type constant.c                      y)NTro   r/   s    r   r   zCSSPageRule.<lambda>  s    r   )NNNNFr   )r-   
__module____qualname____doc__r   r0   r6   r:   r8   rB   rG   rJ   r   r   r   r   propertyr.   r   r   r   r   r   r   r2   typerL   __classcell__)r*   s   @r   r   r      s    (T BF16"B .8	7#ZJx%B3F,P {KTVGI,4 ,.>!BCL  -yKLE3, 9 K /)*D
 +,Jr   )
__future__r   r   r   r   xml.domr   rw   rr   r   
marginruler	   cssstyledeclarationr
   	itertoolsr   __all____docformat____version__sysversion_infostrr   
basestringr   CSSRuleRulesr   ro   r   r   <module>r      sj    R R    " 4  9/" 
A!KKb-'&& b-r   