o
    /hK<                     @   s`   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 dejZdS )
z3CSSPageRule implements DOM Level 2 CSS CSSPageRule.CSSPageRule    N)chain   )cssrule)CSSStyleDeclaration)
MarginRulec                       s  e Zd ZdZ					d/ fdd	Zdd Zdd	 Zd
d Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Z fddZeeeddZdd Zd d! Zeeed"dZd#d$ Zed%d& ed'dZd0d(d)Zed*d& d+dZed,d& d-dZed.d& Z  ZS )1r   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.
    NFc                    s~   t  j||d d| _d| _|  }|r|| _|| jd n|  | _|r*|| _nt	 | _|| jd | 
| || _dS )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__ L/var/www/html/myenv/lib/python3.10/site-packages/cssutils/css/csspagerule.pyr   ;   s   


zCSSPageRule.__init__c                 C   s"   d| j j d| jd| jjdS )Nzcssutils.css.z(selectorText=z, style=))r   __name__r   r   cssTextr   r   r   r   __repr__a   s   "zCSSPageRule.__repr__c                 C   s*   d| j j| j| j| jjt| jt| f 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    r   r   r   __str__d   s   zCSSPageRule.__str__c                 C   s   |t |  v S )z#Check if margin is set in the rule.)listkeys)r   marginr   r   r   __contains__q   s   zCSSPageRule.__contains__c                 C   s   t dd | jD S )z,Return list of all set margins (MarginRule).c                 s   s    | ]}|j V  qd S N)r)   ).0rr   r   r   	<genexpr>w   s    z#CSSPageRule.keys.<locals>.<genexpr>)r'   r$   r    r   r   r   r(   u   s   zCSSPageRule.keysc                 C   s$   | j D ]}|j|kr|j  S qdS )z\Retrieve the style (of MarginRule)
        for `margin` (which must be normalized).
        N)r$   r)   r   r   r)   r-   r   r   r   __getitem__y   s
   


zCSSPageRule.__getitem__c                 C   s<   t | jD ]\}}|j|kr||_|  S q| t||S )zWSet the style (of MarginRule)
        for `margin` (which must be normalized).
        )	enumerater$   r)   r   addr   )r   r)   r   ir-   r   r   r   __setitem__   s   
zCSSPageRule.__setitem__c                 C   s$   | j D ]}|j|kr| | qdS )z[Delete the style (the MarginRule)
        for `margin` (which must be normalized).
        N)r$   r)   
deleteRuler/   r   r   r   __delitem__   s
   


zCSSPageRule.__delitem__c           	   	      s   dddddd d fdd	}d fdd		}d fd
d	}ddd}  }jd||||||d d\}}|oA d }|dkrQjd|  || 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lrNc                    s    |} d sm| dv rmd|krmzt|}W n ty(   jd| Y | S w  ||}}jj|krEjd| | | S |dvrVjjdd| f dd	 |d
kr_d d
< nd d< |	|| d dS d d< jd| | | S )Nr8   )page: or EOF:z)CSSPageRule selectorText: No IDENT found.z6CSSPageRule selectorText: Expected IDENT but found: %r)r:   leftrightz'CSSPageRule: Unknown @page selector: %rT)
neverraiser:   r   r;   pseudoEOFFr7   z-CSSPageRule selectorText: Unexpected CHAR: %r)
_tokenvaluenextStopIteration_logerror_type_prodsIDENTwarnr   )expectedseqtoken	tokenizerval
identtokenivalitypnewr   r   r   _char   sD   

z.CSSPageRule.__parseSelectorText.<locals>._charc                    s   | dkrd d< | S )Does not raise if EOF is found.r=   Tr8   r   rM   rN   rO   rP   )rV   r   r   S   s   z*CSSPageRule.__parseSelectorText.<locals>.Sc                    sh    |}d| kr%|dkrjd| dS d d< ||d dS d d	< jd
| | | S ) r<   autoz+CSSPageRule selectorText: Invalid pagename.r   r9   rK   r=   Fr7   z.CSSPageRule selectorText: Unexpected IDENT: %r)rD   
_normalizerG   rH   r   )rM   rN   rO   rP   rQ   rU   r   r   rK      s   
z.CSSPageRule.__parseSelectorText.<locals>.IDENTc                 S   s   | tj|gd | S )rX   COMMENT)r   cssutilscss
CSSCommentrY   r   r   r   r^      s   z0CSSPageRule.__parseSelectorText.<locals>.COMMENTr<   )CHARrK   r^   rZ   )rM   rN   rP   productionsrV   r7   identz/CSSPageRule selectorText: No valid selector: %rr9   r:   r;   r+   )r   _parse
_tokenize2rG   rH   	_valuestr)	r   r   rW   rZ   rK   r^   newseqr7   rM   r   rU   r   __parseSelectorText   s*   %

zCSSPageRule.__parseSelectorTextc           	      C   s   t |}g }g }|D ]F}|d dkrK| |d tjv rKt| | jd}t|g||_|D ]}|j|jkrD|jD ]
}|jj	|dd q7 nq,|
| q
|
| q
||fS )z$tokens is a list, no generator (yet)r   	ATKEYWORDr   r   F)replace)iterr]   r   marginsr
   r   r   r)   r   setPropertyr   )	r   tokensgstyletokensr$   rO   mr-   pr   r   r   __parseMarginAndStyle   s$   

z!CSSPageRule.__parseMarginAndStylec                 C   s   t j| S )z#Return serialized property cssText.)r_   serdo_CSSPageRuler    r   r   r   _getCssText  s   zCSSPageRule._getCssTextc                    s  t  | | |}| | || jjkr(| jjd| 	| t
jjd dS t| d}d}| j|ddd\}}| j|ddd\}}| |}	| |dkr^d}| jd	| 	| | n|	rjd}| jjd
|	d | |\}
}}|ou|
}| || |}}|dkr|dkrd}| jd| 	|  nd|kr|| | |\}}||_|r|| _|| _|| _tj | _|D ]
}| j| qdS dS )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rH   )r	   T)blockstartonlyseparateEnd)blockendonlyrz   {Fz6CSSPageRule: No start { of style declaration found: %rz$CSSPageRule: Trailing content found.)rO   }rC   z5CSSPageRule: No "}" after style declaration found: %rN)r   _setCssTextrf   rI   
_nexttokenrJ   PAGE_SYMrG   rH   rg   xmldomInvalidModificationErrr   _tokensupto2rD   _CSSPageRule__parseSelectorTextr   !_CSSPageRule__parseMarginAndStyler   r   r   r   r_   r`   CSSRuleListr$   )r   r   rP   newStyleokselectortokens
startbracerq   braceorEOFtoken	nonetokenselok	newselseqr"   rQ   type_r$   r-   r   r   r   r~     sd   






zCSSPageRule._setCssTextz7(DOM) The parsable textual representation of this rule.)docc                 C   s   t j| jS )z%Wrapper for cssutils Selector object.)r_   ru   do_CSSPageRuleSelectorr   r    r   r   r   _getSelectorTextl  s   zCSSPageRule._getSelectorTextc                 C   s0   |    | |\}}}|r|| _|| _dS dS )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   r7   rh   r"   r   r   r   _setSelectorTextp  s   
zCSSPageRule._setSelectorTextzL(DOM) The parsable textual representation of the page selector for the rule.c                 C   s4   |    t|trt|| d| _dS | |_|| _dS )zK
        :param style:
            a CSSStyleDeclaration or string
        )r   r	   N)r   
isinstancestrr   _style_parentRule)r   r   r   r   r   	_setStyle  s
   

zCSSPageRule._setStylec                 C      | j S r+   )r   r    r   r   r   <lambda>      zCSSPageRule.<lambda>z[(DOM) The declaration-block of this rule set, a :class:`~cssutils.css.CSSStyleDeclaration`.c                 C   s   |  ||\}}|du s|du rdS t|tjjs:t|tjjs:t|tjjs:t|tjjs:t|ts:t|tjj	rM| j
jd| jj|jf tjjd dS | ||S )zImplements base ``insertRule``.FTNz-%s: This type of rule is not allowed here: %srx   )_prepareInsertRuler   r_   r`   CSSCharsetRuleCSSFontFaceRuleCSSImportRuleCSSNamespaceRuler   CSSMediaRulerG   rH   r   r   r   r   r   HierarchyRequestErr_finishInsertRule)r   ruleindexr   r   r   
insertRule  s.   zCSSPageRule.insertRulec                 C   r   r+   )r   r    r   r   r   r     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                 C   r   r+   )	PAGE_RULEr    r   r   r   r     r   z=The type of this rule, as defined by a CSSRule type constant.c                 C   s   dS )NTr   r    r   r   r   r     s    )NNNNFr+   )r   
__module____qualname____doc__r   r!   r&   r*   r(   r0   r4   r6   r   r   rw   r~   propertyr   r   r   r   r   r   r   r"   typer7   __classcell__r   r   r   r   r      s^    -&b!K
)r   __all__xml.domr   	itertoolsr   r_    r   cssstyledeclarationr   
marginruler   CSSRuleRulesr   r   r   r   r   <module>   s    