
     hK<                     x    d Z dgZddlZddlmZ ddlZddlmZ ddl	m
Z
 ddlmZ  G d	 dej                        Zy)
z3CSSPageRule implements DOM Level 2 CSS CSSPageRule.CSSPageRule    N)chain   )cssrule)CSSStyleDeclaration)
MarginRulec                       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)super__init__
_atkeyword_specificity_tempSeqr   append_selectorTextr   r   _setSeq	_readonly)selfr   r   r   r   readonlytempseq	__class__s          X/var/www/api/v1/venv_getwork_v1/lib/python3.12/site-packages/cssutils/css/csspagerule.pyr   zCSSPageRule.__init__;   s      	JAQR!%--/ ,DNN4,,n=!%DDJ,.DJtzz7+W!    c                 ~    d| j                   j                   d| j                  d| j                  j                  dS )Nzcssutils.css.z(selectorText=z, style=))r   __name__r   r   cssTextr   s    r   __repr__zCSSPageRule.__repr__a   s?    t~~667~dFWFWEZZbcgcmcmcucubxxyzzr   c           	          d| j                   j                  | j                  | j                  | j                  j
                  t        | j                        t        |       fz  S )NzT<cssutils.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__d   sW    . NN##JJtH


 
	
r   c                 8    |t        | j                               v S )z#Check if margin is set in the rule.)listkeys)r   margins     r   __contains__zCSSPageRule.__contains__q   s    diik***r   c                 :    t        d | j                  D              S )z,Return list of all set margins (MarginRule).c              3   4   K   | ]  }|j                     y wN)r.   ).0rs     r   	<genexpr>z#CSSPageRule.keys.<locals>.<genexpr>w   s     4mAHHms   )r,   r(   r#   s    r   r-   zCSSPageRule.keysu   s    4dmm444r   c                 `    | j                   D ]  }|j                  |k(  s|j                  c S  y)z\Retrieve the style (of MarginRule)
        for `margin` (which must be normalized).
        N)r(   r.   r   r   r.   r4   s      r   __getitem__zCSSPageRule.__getitem__y   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).
        )	enumerater(   r.   r   addr   )r   r.   r   ir4   s        r   __setitem__zCSSPageRule.__setitem__   sK     dmm,DAqxx6! -
 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)r(   r.   
deleteRuler7   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)NrC   )page: or EOF:z6CSSPageRule selectorText: Expected IDENT but found: %r)rE   leftrightz%CSSPageRule: Unknown @page selector: T)
neverraiserE   r   rF   pseudoEOFz)CSSPageRule selectorText: No IDENT found.FrB   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   sI   ""5)Cx=X1E%E#QT*%!%iJ "&!1!1*!=tzz*?U$D{{((D0		2489!$    'AA IINN25*!?+/ + 
  7?+,CL()CI

3:x8$ %*L!		CcI5  ; % XIIOO$OQVW,  /Xs   C< <%D%$D%c                     | dk(  rdd<   | S )Does not raise if EOF is found.rI   TrC    )rY   rZ   r[   r\   ra   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 ) rH   autoz+CSSPageRule selectorText: Invalid pagename.r   rD   rT   rI   FrB   z.CSSPageRule selectorText: Unexpected IDENT: %r)rP   
_normalizerU   rV   r   )rY   rZ   r[   r\   r]   ra   r   s        r   rT   z.CSSPageRule.__parseSelectorText.<locals>.IDENT   s    ""5)C!??3'61IIOOEu " #$CKJJsG,!$)L!		G#Mu  r   c                 f    |j                  t        j                  j                  |g      d       | S )rd   COMMENT)r   cssutilscss
CSSComment)rY   rZ   r[   r\   s       r   rl   z0CSSPageRule.__parseSelectorText.<locals>.COMMENT   s&    JJx||..w7COr   rH   )CHARrT   rl   rf   )rY   rZ   r\   productionsra   rB   identz/CSSPageRule selectorText: No valid selector: %rrD   rE   rF   r2   )r   _parse
_tokenize2rU   rV   	_valuestr)
r   r   rb   rf   rT   rl   newseqrB   rY   ra   s
   `        @r   __parseSelectorTextzCSSPageRule.__parseSelectorText   s     "UAQRS#	 J		 (	
 #{{ool3!&7QRS  +  

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)iterrj   r   marginsr   r   r"   r.   r   setPropertyr   )	r   tokensgstyletokensr(   r[   mr4   ps	            r   __parseMarginAndStylez!CSSPageRule.__parseMarginAndStyle   s    L EaK'OOE!H-1C1CC $AVAVW!5'1-	 "Axx188+!"AGG//5/A ")	 " OOA& u%+ . $$r   c                 @    t         j                  j                  |       S )z#Return serialized property cssText.)rm   serdo_CSSPageRuler#   s    r   _getCssTextzCSSPageRule._getCssText  s    ||**400r   c                    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[|| _        || _        || _        t.        j0                  j3                         | _        D ]  }| j4                  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rV   )r   T)blockstartonlyseparateEnd)blockendonlyr   {Fz6CSSPageRule: No start { of style declaration found: %rz$CSSPageRule: Trailing content found.)r[   }rO   z5CSSPageRule: No "}" after style declaration found: %rN)r   _setCssTextrt   rR   
_nexttokenrS   PAGE_SYMrU   rV   ru   xmldomInvalidModificationErrr   _tokensupto2rP   _CSSPageRule__parseSelectorTextr   !_CSSPageRule__parseMarginAndStyler"   r   r   r   rm   rn   CSSRuleListr(   )r   r"   r\   newStyleokselectortokens
startbracer   braceorEOFtoken	nonetokenselok	newselseqr&   r]   type_r(   r4   r   s                    r   r   zCSSPageRule._setCssText  s6    	G$OOG,	::dooi01T[[5I5IIIIOO7$..:QQgg44  
 +d;HB)-):):$D *; *&NJ ,0+<+<$ ,= ,(K 	2I
+s2		 "&.."9:
 		 FiX,0,D,D^,T)E9kB))/:DJJ<WCczeun		KnnW-.
 E>&&7 )-(B(B;(O%+ $/ %."$/!%
 ( 8 8 :!AMM((+ " r   z7(DOM) The parsable textual representation of this rule.)docc                 T    t         j                  j                  | j                        S )z%Wrapper for cssutils Selector object.)rm   r   do_CSSPageRuleSelectorr   r#   s    r   _getSelectorTextzCSSPageRule._getSelectorTextl  s    ||2243E3EFFr   c                 p    | j                          | j                  |      \  }}}|r|| _        || _        yy)a  Wrapper for cssutils 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   rB   rv   r&   s        r   _setSelectorTextzCSSPageRule._setSelectorTextp  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   
isinstancestrr   _style_parentRule)r   r   s     r   	_setStylezCSSPageRule._setStyle  s7    
 	eS!-eMDK $EDKr   c                     | j                   S r2   )r   r#   s    r   <lambda>zCSSPageRule.<lambda>  s    T[[r   z[(DOM) The declaration-block of this rule set, a :class:`~cssutils.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   rm   rn   CSSCharsetRuleCSSFontFaceRuleCSSImportRuleCSSNamespaceRuler   CSSMediaRulerU   rV   r   r!   r"   r   r   HierarchyRequestErr_finishInsertRule)r   ruleindexs      r   
insertRulezCSSPageRule.insertRule  s    --dE:e5=DDL tX\\889$ < <=$ : :;$ = =>$,$ 9 9:IIOO>>**DLL:gg11  
 %%dE22r   c                     | j                   S r2   )r   r#   s    r   r   zCSSPageRule.<lambda>  s
    T&&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 r2   )	PAGE_RULEr#   s    r   r   zCSSPageRule.<lambda>  s    T^^r   z=The type of this rule, as defined by a CSSRule type constant.c                      y)NTre   r#   s    r   r   zCSSPageRule.<lambda>  s    tr   )NNNNFr2   )r!   
__module____qualname____doc__r   r$   r*   r/   r-   r8   r=   r@   r   r   r   r   propertyr"   r   r   r   r   r   r   r&   typerB   __classcell__)r   s   @r   r   r      s    )Z $"L{
+5	7#`JD%B1I,V EGG,4 *L
   8E34 &	K #ND +,Jr   )r   __all__xml.domr   	itertoolsr   rm    r   cssstyledeclarationr   
marginruler   CSSRuleRulesr   re   r   r   <module>r      s5    9/     4 "@-'&& @-r   