U
    Pe>s                     @   s  d Z ddlZddlZddlZddlZddlZddl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 ddlmZ ddlmZ dZejZi Z e!d g a"dZ#e$de# dej%Z&e$de# dej%Z'e$dZ(e$dZ)e$dZ*e$dZ+eeee,Z-G dd de.Z/e/ e d< ej0e d< ej1e d< ej2e d< ej3e d< ej4e d< ej5e d< ee d < G d!d" d"e6Z7G d#d$ d$e.Z8G d%d& d&e.Z9G d'd( d(e.Z:G d)d* d*e.Z;G d+d, d,e;Z<G d-d. d.e;Z=dS )/zD
Parser
======

Class used for the parsing of .kv files into rules.
    N)subfindall)CodeType)partial)OrderedDictdefaultdict)Logger)Cache)require)resource_find)rgba)ParserParserExceptionzkv.langz{(?:'''.*?''')|(?:(?:(?<!')|''')'(?:[^']|\\')+?'(?:(?!')|'''))|(?:""".*?""")|(?:(?:(?<!")|""")"(?:[^"]|\\")+?"(?:(?!")|"""))()z([fF](?:z))z([a-zA-Z_]+)z)([a-zA-Z_][a-zA-Z0-9_.]*\.[a-zA-Z0-9_.]+)z(_\()z, *c                   @   sR   e Zd Zdg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S )ProxyApp_objc                 C   s   t |  t | dd  d S Nr   )object__init____setattr__self r   4/tmp/pip-unpacked-wheel-xzebddm3/kivy/lang/parser.pyr   B   s    
zProxyApp.__init__c                    sN   t  d}|d krJddlm} | }t  d| |j fddd |S )Nr   r   )Appc                    s   t  dd S r   )r   r   )instancer   r   r   <lambda>M   s    z&ProxyApp._ensure_app.<locals>.<lambda>)Zon_stop)r   __getattribute__Zkivy.appr   Zget_running_appr   bind)r   appr   r   r   r   _ensure_appF   s    zProxyApp._ensure_appc                 C   s    t | d  tt | d|S Nr!   r   )r   r   getattrr   namer   r   r   r   Q   s    zProxyApp.__getattribute__c                 C   s$   t | d  tt | d| d S r"   )r   r   delattrr$   r   r   r   __delattr__U   s    zProxyApp.__delattr__c                 C   s&   t | d  tt | d|| d S r"   )r   r   setattr)r   r%   valuer   r   r   r   Y   s    zProxyApp.__setattr__c                 C   s   t | d  tt | dS r"   )r   r   boolr   r   r   r   __bool__]   s    zProxyApp.__bool__c                 C   s   t | d  tt | dS r"   )r   r   strr   r   r   r   __str__a   s    zProxyApp.__str__c                 C   s   t | d  tt | dS r"   )r   r   reprr   r   r   r   __repr__e   s    zProxyApp.__repr__N)__name__
__module____qualname__	__slots__r   r!   r   r'   r   r+   r-   r/   r   r   r   r   r   <   s   r   r    ptinchcmmmdpspr   c                       s"   e Zd ZdZd fdd	Z  ZS )r   zAException raised when something wrong happened in a kv file.
    Nc           
         s   |j pd| _ || _|j}td|d }tt||d }dg}t||D ]J}	|	|krt|d|d || d f g7 }qH|d|	d ||	 d f g7 }qH|dg7 }d	|}d
| j | jd ||f }|r|d	dt	| 7 }t
t| | d S )Nz<inline>r         z...z	>> %4d:%s   z	   %4d:%s
z!Parser: File "%s", line %d:
%s
%s )filenameline
sourcecodemaxminlenrangejoin	traceback	format_tbsuperr   r   )
r   contextr@   messagecauserA   Zsc_startZsc_stopZscx	__class__r   r   r   x   s*      

   zParserException.__init__)N)r0   r1   r2   __doc__r   __classcell__r   r   rN   r   r   t   s   r   c                       sB   e Zd ZdZdZd fdd	Zdd Zedd	 Zd
d Z	  Z
S )ParserRulePropertyz(Represent a property inside a rule.
    )	ctxr@   r%   r)   co_valuewatched_keysmodecountignore_prevFc                    sH   t t|   || _|| _|| _|| _d | _d | _d | _	d| _
|| _d S )Nr   )rI   rR   r   rS   r@   r%   r)   rT   rV   rU   rW   rX   )r   rS   r@   r%   r)   rX   rN   r   r   r      s    zParserRuleProperty.__init__c           
      C   s  | j }| j}ttd| j}| j}| jd krH|d d dkr>dnd | _}|dkrtt|d krd| j | }t	t
|| jjp~dd| _d S d| j | }t
|| jjpd|| _|dkrd S t|}t }|D ](}t|}|t| |jd jO }qttd|}|d	}	|	d
kr&|d |	 }|ttt|O }|rNdd |D | _tt|r| jrv|  jdgg7  _n
dgg| _d S )Nr>   r;   on_execevalr=   z<string>r   #c                 S   s   g | ]}| d qS ).)split.0rM   r   r   r   
<listcomp>   s     z1ParserRuleProperty.precompile.<locals>.<listcomp>_)r%   r)   r   lang_strrV   researchlang_keyr@   r[   compilerS   r?   rT   	lang_fstrr   setastparseget_names_from_expressionbodyfindlang_keyvaluerU   lang_tr)
r   r%   r)   tmprV   ZfstringsZwksZ
expressionidxr   r   r   
precompile   sB    




zParserRuleProperty.precompilec                 c   s  t |tjr|jV  t |tjtjfrd|jD ]6}t |tjrP| |j	E dH  q,| |j
E dH  q,t |tjr| |jE dH  | |jE dH  t |tjr| |jE dH  | |jE dH  | |jE dH  t |tjr| |j
E dH  | |jE dH  t |tjrL| |jE dH  | |jE dH  | |jE dH  t |tjtjtjtjfr|jD ]}| |jE dH  qnt |tjtjtj fr|j!D ]}| |E dH  qt |tj"r|jD ]}| |E dH  qt |tj#r
| |j$E dH  t |tj%r,| |jj
E dH  t |tj&r`t |j
tjr`|j
j d|j' V  t |tj(r| |j)E dH  |j*D ]}| |E dH  q|j+D ]}| |j
E dH  qdS )z?
        Look for all the symbols used in an ast node.
        Nr^   ),
isinstancerk   NameidZ	JoinedStrZBoolOpvaluesZStrrm   rs   r)   ZBinOprightleftZIfExptestrn   ZorelseZ	SubscriptsliceZSlicelowerupperstepZListCompZDictCompZSetCompZGeneratorExp
generatorsiterListTupleSetZeltsDictZUnaryOpZoperandZcomprehension	AttributeattrZCallfuncargskeywords)clsnodengeltvalargkeywordr   r   r   rm      s\    





z,ParserRuleProperty.get_names_from_expressionc                 C   s"   d| j | jj| jd | j| jf S )NzD<ParserRuleProperty name=%r filename=%s:%d value=%r watched_keys=%r>r<   )r%   rS   r?   r@   r)   rU   r   r   r   r   r/   "  s       zParserRuleProperty.__repr__)F)r0   r1   r2   rP   r3   r   ru   classmethodrm   r/   rQ   r   r   rN   r   rR      s   4
BrR   c                       s\   e Zd ZdZdZ 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  ZS )
ParserRulez?Represents a rule, in terms of the Kivy internal language.
    )rS   r@   r%   childrenrx   
propertiescanvas_beforecanvas_rootcanvas_afterhandlerslevelcache_markedavoid_previous_rulesc                    s|   t t|   || _|| _|| _|| _g | _d | _t	 | _
d | _d | _d | _g | _g | _d| _|dkrp|   n|   d S )NFr   )rI   r   r   r   rS   r@   r%   r   rx   r   r   r   r   r   r   r   r   _detect_selectors_forbid_selectors)r   rS   r@   r%   r   rN   r   r   r   1  s"    
zParserRule.__init__c                 C   st   | j  D ]}|  q
| jD ]}|  q| jD ]}|  q2| jrP| j  | jr`| j  | jrp| j  d S N)r   ry   ru   r   r   r   r   r   )r   rM   r   r   r   ru   S  s    






zParserRule.precompilec                 C   sh   |j }|| jkrd S | j| | jD ]<}t||r6q&| j| j}t|tkrRd }|j||dd q&d S )NF)default_value)	rO   r   appendr   hasattrrT   typer   Zcreate_property)r   widgetr   r%   r)   r   r   r   create_missinga  s    


zParserRule.create_missingc                 C   s.   | j d }|dks|dkr*t| j| jdd S )Nr   <[z3Selectors rules are allowed only at the first level)r%   r   rS   r@   r   cr   r   r   r   o  s    
 zParserRule._forbid_selectorsc                 C   sV   | j d }|dkr|   n6|dkr.|   n$| jjd k	rJt| j| jd| | j_d S )Nr   r   r   z&Only one root object is allowed by .kv)r%   _build_rule_build_templaterS   rootr   r@   r   r   r   r   r   v  s    


 zParserRule._detect_selectorsc                 C   s  | j }td|  |d dks*|d dkr:t| j| jd|dd }|d d dkrhd	| _|dd  }tt|D ]}d }|st| j| jd
d|kr|dd\}}t	t
|st| j| jd|| jj|< t|}n&|d dkrt|dd  }nt|}| jj|| f qtd S )NzBuilder: build rule for %sr   r   r]   >z Invalid rule (must be inside <>)r<   -TzEmpty rule detected@zInvalid dynamic class namer^   )r%   tracer   rS   r@   r   re   r_   lang_cls_split_patmatchrg   dynamic_classesParserSelectorNameParserSelectorClassrulesr   )r   r%   ruleZcruleZbaseclassesr   r   r   r     s8    



zParserRule._build_rulec                 C   s   | j }t| j| jd|}|dkr.t| td|  |d dksR|d dkrbt| j| jd|d	d }d
|krt| j| jd|d
\}}| jj	
||| f d S )Nz]Deprecated Kivy lang template syntax used "{}". Templates will be removed in a future version)z([FileListEntry@FloatLayout+TreeViewNode]z[FileIconEntry@Widget]z[AccordionItemTitle@Label]zBuilder: build template for %sr   r   r]   ]z$Invalid template (must be inside [])r<   r   z!Invalid template name (missing @))r%   r   rS   r@   formatr   warningr   r_   	templatesr   )r   r%   	exceptionZitem_contentZtemplate_nameZtemplate_root_clsr   r   r   r     s,     


zParserRule._build_templatec                 C   s   d| j f S )Nz<ParserRule name=%r>)r%   r   r   r   r   r/     s    zParserRule.__repr__)r0   r1   r2   rP   r3   r   ru   r   r   r   r   r   r/   rQ   r   r   rN   r   r   )  s   "+r   c                       s   e Zd ZdZdZeeededd Zeeededd eeededd  eeeded	d  ed
g Z	dZ
 fddZdd Zdd Zdd ZdddZ  ZS )r   zJCreate a Parser object to parse a Kivy language file or Kivy content.
    )canvas.beforecanvas.afterAZr<   az09rc   )r   r   r   rA   
directivesr?   r   c                    sj   t t|   g | _g | _d | _g | _g | _i | _|	dd | _
|	dd }|d kr\td| | d S )Nr?   contentzNo content passed)rI   r   r   r   r   r   rA   r   r   getr?   
ValueErrorrl   )r   kwargsr   rN   r   r   r     s    zParser.__init__c              	   C   s  | j D ]~\}}| }td|  |d d dkrh|dd   }t|ddkr^|d7 }t| q|d d dkrz |dd   d	d
\}}W n"   td t| |dY nX zt	|t
}W n"   td t| |dY nX |t
|< q|d d dkrj|dd   }d}|d d dkrD|dd   }d}|d |d kr|d dkr|d d |d }|dkr|||  n|}|dd  dkrtd|  q|tkr>tjt|p|st| |d||std| qn2td| tjjj| tjjj| qtdd t| tjjj| q|d d d krz|dd   }	|	 }
t|
dkrt| |d!|
\}}	z|	tjkr2zt|	}W n8 tk
r
   d |	dd d }t|}Y nX |	dd
d  D ]}t!||}qn
tj|	 }|t
|< W n0 tk
rv   td t| |d"|	 Y nX qt| |d#qd S )$NzParser: got directive <%s>   zkivy r^   r:   z.0   zset  r<   r>   zInvalid directive syntaxzInvalid value   zinclude F   zforce Tr   r]   )"'r;   z.kvz<Lang: {0} does not have a valid KivyLanguage extension (.kv)zInvalid or unknown file: {0}z$Lang: {0} has already been included!z/Lang: Reloading {0} because include was forced.zLang: Including file: {0}   zimport zInvalid import syntaxzUnable to import package %rzUnknown directive)"r   stripr   rD   r_   r
   r   r   r   r[   global_idmaprW   r   r   __KV_INCLUDES__ospathisfiler   debugkivylangZbuilderZBuilderZunload_fileZ	load_filer   sysmodules	importlib
__import__ImportErrorrF   r#   )r   lncmdversionr%   r)   refZ
force_loadr   packager   aliasmodmodule_namepartr   r   r   execute_directives  s    
 


 



zParser.execute_directivesc                 C   s   |  }|sdS t|}tttt||}|dd | _td|  | | |   | 	d|\}}|D ]}|
  qn|r|d \}}t| |ddS )zWParse the contents of a Parser file and return a list
        of root objects.
        NzParser: parsing %d linesr   zInvalid data (not parsed))
splitlinesrD   listziprE   rA   r   strip_commentsr   parse_levelru   r   )r   r   linesZ	num_linesobjectsZremaining_linesr   r   r   r   r   rl   ;  s    

zParser.parsec                 C   sz   |dd D ]h\}}|  }|dd dkrD| j||dd f |dd dkrb|||f |s|||f qdS )zRemove all comments from all lines in-place.
           Comments need to be on a single line and not at the end of a line.
           i.e. a comment line's first non-whitespace character must be a #.
        Nr:   z#:r<   r\   )r   r   r   remove)r   r   r   r@   strippedr   r   r   r   ]  s    zParser.strip_commentsr   c                 C   sN  |dkr|| nd}g }d}d}d}d}	|	t |k rF||	 }
|
\}}|d}|dt |t |  }|dd}|dkrt |}t |}|dkr|| dkrt| |d| | }|dkr|| nd}||k r|||	d d fS ||kr|dd}|d st| |d	t |d
krPt |d rP|d  dsPt| |d|d  }|dkrddd |D krt| |dt| |||}d}|	| n||| krR|dd}|d st| |d	d}|d  }|d dk}|r|dd }t
|d tjkrX|r*t| |d| |d ||	d |\}}||_|}d}	n|tjkrtdd |D st| |dt |dkrt| |d|d  }|dkrt |dkrt| |d|dkrt| |d||_nRt |r6t| ||||}|dd dkr&|j	| nd}||j|< n|}d}|r<t| |dn||d
|  kr0|dkr| |d
 ||	d |\}}t| |||}||_|dkr||_n|dkr||_n||_d}|}d}	nV|dkrt| |||}|dd dkr|j	| n
||j|< n| jd | 7  _nt| |d!|	d7 }	q(|g fS )"z>Parse the current level (level * spaces) indentation.
        r   Nz 		z    z4Invalid indentation, must be a multiple of %s spacesr<   :zIdentifier missingr:   r\   zInvalid data after declarationFc                 S   s   g | ]}t |tjkqS r   ordr   
PROP_RANGEra   r   r   r   r   rb     s     z&Parser.parse_level.<locals>.<listcomp>zInvalid class namer   z%clear previous, `-`, not allowed herec                 s   s   | ]}t |tjkV  qd S r   r   r   r   r   r   	<genexpr>  s     z%Parser.parse_level.<locals>.<genexpr>zInvalid property namezSyntax errorrx   zEmpty id)r   r   z&Invalid id, cannot be "self" or "root"r;   rY   )canvasr   r   r   r   r=   z%Invalid indentation (too many levels))rD   lstripreplacer   r   r_   
startswithrstripr   r   r   r   CLASS_RANGEr   r   PROP_ALLOWEDallrx   rR   r   r   r   r   r   r)   )r   r   r   spacesindentr   Zcurrent_objectZcurrent_propertyZcurrent_propobjectir@   r   r   rr   rW   ZrlevelrM   r%   rX   _objects_linesr)   r   Zrlr   r   r   r   l  s   




   
 

 
      
 
 


   

zParser.parse_level)r   )r0   r1   r2   rP   r  r   rE   r   r  r   r3   r   r   rl   r   r   rQ   r   r   rN   r   r     s"   V"r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )ParserSelectorc                 C   s   |  | _d S r   )r~   key)r   r  r   r   r   r   	  s    zParserSelector.__init__c                 C   s   t d S r   )NotImplementedErrorr   r   r   r   r   r     s    zParserSelector.matchc                 C   s   d| j j| jf S )Nz<%s key=%s>)rO   r0   r  r   r   r   r   r/     s    zParserSelector.__repr__N)r0   r1   r2   r   r   r/   r   r   r   r   r
    s   r
  c                   @   s   e Zd Zdd ZdS )r   c                 C   s   | j |jkS r   )r  r   r  r   r   r   r     s    zParserSelectorClass.matchN)r0   r1   r2   r   r   r   r   r   r     s   r   c                   @   s(   e Zd Zi Zdd Zdd Zdd ZdS )r   c                 c   sH   |j D ]<}|jdkr qD|V  |jdkr, qD| |D ]
}|V  q6qd S )Nr   ZWidget)	__bases__r0   	get_bases)r   r   baseZcbaser   r   r   r    s    


zParserSelectorName.get_basesc                 C   sH   t j}|j}||kr:dd |gt| | D }|||< | j|| kS )Nc                 S   s   g | ]}|j  qS r   )r0   r~   r`   r   r   r   rb   +  s     z,ParserSelectorName.match.<locals>.<listcomp>)r   parentsrO   r   r  r  )r   r   r  r   classesr   r   r   r   '  s    zParserSelectorName.matchc                 C   s   | j | kS r   )r  r~   )r   Z	rule_namer   r   r   match_rule_name0  s    z"ParserSelectorName.match_rule_nameN)r0   r1   r2   r  r  r   r  r   r   r   r   r     s   
	r   )>rP   r   re   r   rG   rk   r   r   r   typesr   	functoolsr   collectionsr   r   Zkivy.lang.builderr   Zkivy.loggerr   Z
kivy.cacher	   r
   Zkivy.resourcesr   Z
kivy.utilsr   Zkivy.metricsZmetricsZMetrics__all__r   r   registerr   Zstr_rerh   DOTALLrd   ri   rg   rp   rq   r   r   	_handlersr   r   r4   r5   r6   r7   r8   r9   	Exceptionr   rR   r   r   r
  r   r   r   r   r   r   <module>   sf   




.






  !  @