U
    :gp!                     @   s   d Z ddlmZ zddlmZ ddlmZ W n, ek
rX   ddlmZ ddl	mZ Y nX dZ
e
d Ze
d Ze
d Zd	ZG d
d dejZG dd deZdddZdddZdd ZddefddZddedfddZdS )a  
Limited XInclude support for the ElementTree package.

While lxml.etree has full support for XInclude (see
`etree.ElementTree.xinclude()`), this module provides a simpler, pure
Python, ElementTree compatible implementation that supports a simple
form of custom URL resolvers.
    )etree)urljoin)urlopenz!{http://www.w3.org/2001/XInclude}includefallback*   c                   @   s   e Zd ZdS )FatalIncludeErrorN__name__
__module____qualname__ r   r   7/tmp/pip-unpacked-wheel-m1sofc2u/lxml/ElementInclude.pyr	   K   s   r	   c                   @   s   e Zd ZdS )LimitedRecursiveIncludeErrorNr
   r   r   r   r   r   O   s   r   Nc                 C   sH   t | d}|dkr"t| }n| }|s2d}||}|  |S )Nrbxmlutf-8)openr   parsegetrootreaddecodeclose)hrefr   encodingfiledatar   r   r   default_loader`   s    

r   c                 C   s\   |dkrt | | }n>d| kr,t| }n
t| d}| }|  |sNd}||}|S )Nr   z://r   r   )r   r   r   r   r   r   r   r   )r   r   r   parserr   fr   r   r   _lxml_default_loaderq   s    


r!   c                    s   d fdd	}|S )Nc                    s    | ||S )Nr   )r   r   r   r   loaderr   r   load   s    z_wrap_et_loader.<locals>.load)NNr   )r#   r$   r   r"   r   _wrap_et_loader   s    r%   c                 C   s   |d krd}n|dk r"t d| |d kr^t| drB| }|  } n|  }t|drp|jj}nt| drp|  } t| ||| d S )Nr   z;expected non-negative depth or None for 'max_depth', got %rr   docinfo)
ValueErrorhasattrr   getroottreer'   URL_include)elemr#   base_url	max_depthtreer   r   r   r      s    




c                 C   s  |d k	rt |}nt}|d kr$t }|  j}t| t}|D ]}|jt	krt
||d}	|dd}
| }|
dkr"|	|krtd|	 |dkrtd|	 ||	|
|d}|d krtd|	|
f t|||	|d	 |	h|B }|jr|jpd
|j |_|d kr|  S ||| n|
dkr||	|
|dd}|d krZtd|	|
f | }|d k	r|jpvd
| |_n0|d kr|  S |jpd
| |jpd
 |_|| ntd|
 q@|jtkr| }|d k	r|jt	krtd|j q@td|j q@| S )Nr   r   r   z recursive include of %r detectedr   z5maximum xinclude depth reached when including file %s)r   zcannot load %r as %r    textr   )r   z)unknown parse type in xi:include tag (%r)z0xi:fallback tag must be child of xi:include (%r)z0Invalid element found in XInclude namespace (%r))r%   r!   setr*   r   listiterXINCLUDE_ITER_TAGtagXINCLUDE_INCLUDEr   getZ	getparentr	   r   r,   tailreplaceZgetpreviousr3   removeXINCLUDE_FALLBACK)r-   r#   r.   r/   Z_parent_hrefsZload_includer   Zinclude_elementser   r   parentnoder3   Zpredecessorr   r   r   r,      sx    










r,   )N)NN)__doc__lxmlr   urlparser   urllib2r   ImportErrorurllib.parseurllib.requestZXINCLUDEr9   r>   r7   ZDEFAULT_MAX_INCLUSION_DEPTHZLxmlSyntaxErrorr	   r   r   r!   r%   r   r,   r   r   r   r   <module>,   s0   	


 