o
    e<                     @   s`   d Z dgZddlmZ ddlmZ ddlmZ ddlm	Z	 ddl
Z
ddlZG d	d de	jZdS )
z3CSSPageRule implements DOM Level 2 CSS CSSPageRule.CSSPageRule    )chain   )CSSStyleDeclaration)
MarginRule)cssruleNc                       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__Z
_atkeyword_specificity_tempSeqr   append_selectorTextr   r   Z_setSeqZ	_readonly)selfr   r   r	   r
   readonlyZtempseq	__class__ HD:\Projects\ConvertPro\env\Lib\site-packages\cssutils/css/csspagerule.pyr   8   s   


zCSSPageRule.__init__c                 C   s   d | jj| j| jjS )Nz.cssutils.css.{}(selectorText={!r}, style={!r}))formatr   __name__r   r   cssTextr   r   r   r   __repr__^   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__e   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__r   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>x   s    z#CSSPageRule.keys.<locals>.<genexpr>)r#   r    r   r   r   r   r$   v   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__z   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%   Z
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 )Nr3   )page: or EOF:z)CSSPageRule selectorText: No IDENT found.z6CSSPageRule selectorText: Expected IDENT but found: %r)r5   leftrightz'CSSPageRule: Unknown @page selector: %rT)Z
neverraiser5   r   r6   ZpseudoEOFFr2   z-CSSPageRule selectorText: Unexpected CHAR: %r)
_tokenvaluenextStopIteration_logerror_type_prodsIDENTwarnr   )expectedseqtoken	tokenizervalZ
identtokenZivalZ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.r8   Tr3   r   rF   rG   rH   rI   )rL   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 ) r7   autoz+CSSPageRule selectorText: Invalid pagename.r   r4   rD   r8   Fr2   z.CSSPageRule selectorText: Unexpected IDENT: %r)r=   
_normalizer@   rA   r   )rF   rG   rH   rI   rJ   rK   r   r   rD      s   
z.CSSPageRule.__parseSelectorText.<locals>.IDENTc                 S   s   | tj|gd | S )rN   COMMENT)r   cssutilscssZ
CSSCommentrO   r   r   r   rT      s   z0CSSPageRule.__parseSelectorText.<locals>.COMMENTr7   )CHARrD   rT   rP   )rF   rG   rI   ZproductionsrL   r2   identz/CSSPageRule selectorText: No valid selector: %rr4   r5   r6   r'   )r   _parse
_tokenize2r@   rA   	_valuestr)	r   r   rM   rP   rD   rT   newseqr2   rF   r   rK   r   Z__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   Z	ATKEYWORDr   r   F)replace)iterrS   r   Zmarginsr
   r   r   r%   r   ZsetPropertyr   )	r   tokensgstyletokensr    rH   mr)   pr   r   r   Z__parseMarginAndStyle   s$   

z!CSSPageRule.__parseMarginAndStylec                 C   s   t j| S )z#Return serialized property cssText.)rU   serZ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rA   )r	   T)ZblockstartonlyseparateEnd)Zblockendonlyrg   {Fz6CSSPageRule: No start { of style declaration found: %rz$CSSPageRule: Trailing content found.)rH   }r<   z5CSSPageRule: No "}" after style declaration found: %rN)r   _setCssTextrZ   rB   Z
_nexttokenrC   ZPAGE_SYMr@   rA   r[   xmldomZInvalidModificationErrr   Z_tokensupto2r=   _CSSPageRule__parseSelectorTextr   !_CSSPageRule__parseMarginAndStyler   r   r   r   rU   rV   ZCSSRuleListr    )r   r   rI   ZnewStyleokZselectortokensZ
startbracera   ZbraceorEOFtokenZ	nonetokenZselokZ	newselseqr   rJ   type_r    r)   r   r   r   rj     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.)rU   rd   Zdo_CSSPageRuleSelectorr   r   r   r   r   _getSelectorTextm  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)_checkReadonlyrm   r   r   )r   r   r2   r\   r   r   r   r   _setSelectorTextq  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)rs   
isinstancestrr   _styleZ_parentRule)r   r   r   r   r   	_setStyle  s
   

zCSSPageRule._setStylec                 C      | j S r'   )rw   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: %srf   )Z_prepareInsertRuleru   rU   rV   ZCSSCharsetRuleZCSSFontFaceRuleZCSSImportRuleZCSSNamespaceRuler   ZCSSMediaRuler@   rA   r   r   r   rk   rl   ZHierarchyRequestErrZ_finishInsertRule)r   ruleindexr   r   r   
insertRule  s.   zCSSPageRule.insertRulec                 C   ry   r'   )r   r   r   r   r   rz     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   ry   r'   )Z	PAGE_RULEr   r   r   r   rz     r{   z=The type of this rule, as defined by a CSSRule type constant.c                 C   s   dS )NTr   r   r   r   r   rz     s    )NNNNFr'   )r   
__module____qualname____doc__r   r   r"   r&   r$   r,   r0   r1   rm   rn   re   rj   propertyr   rr   rt   r   rx   r   r~   r   typer2   __classcell__r   r   r   r   r      s^    -&b!K
)r   __all__	itertoolsr   Zcssstyledeclarationr   Z
marginruler    r   rU   Zxml.domrk   ZCSSRuleRulesr   r   r   r   r   <module>   s    