B
    0Z                 @   s   d Z ddlmZ y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G d	d
 d
ejZdddZdddZdd ZdddZd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}includeZfallback*c               @   s   e Zd ZdS )FatalIncludeErrorN)__name__
__module____qualname__ r   r   2lib/python3.7/site-packages/lxml/ElementInclude.pyr   G   s   r   Nc             C   sH   t | d}|dkr"t| }n| }|s2d}||}|  |S )Nrbxmlzutf-8)openr   parsegetrootreaddecodeclose)hrefr   encodingfiledatar   r   r   default_loaderW   s    

r   c             C   s\   |dkrt | | }n>d| kr,t| }n
t| d}| }|  |sNd}||}|S )Nr   z://r   zutf-8)r   r   r   r   r   r   r   r   )r   r   r   parserr   fr   r   r   _lxml_default_loaderg   s    


r   c                s   d fdd	}|S )Nc                s    | ||S )Nr   )r   r   r   r   )loaderr   r   loadz   s    z_wrap_et_loader.<locals>.load)NNr   )r   r   r   )r   r   _wrap_et_loadery   s    r   c             C   s`   |d kr<t | dr | }|  } n|  }t |drN|jj}nt | drN|  } t| ||d d S )Nr   docinfo)base_url)hasattrr   getroottreer    ZURL_include)elemr   r!   Ztreer   r   r   r      s    




c             C   s  |d k	rt |}nt}|d kr$t }|  j}t| t}x|D ]}|jt	krt
||d}|dd}	| }
|	dkr||krtd| || |||	|d}|d krtd||	f t|||}|jr|jpd|j |_|
d kr|S |
|| n|	dkr|||	|d	d
}|d kr>td||	f | }|d k	rd|jpZd| |_n,|
d krr|S |
jp|d| |jpd |
_|
| ntd|	 qD|jtkr| }
|
d k	r|
jt	krtd|j qDtd|j qDW | S )Nr   r   r   z recursive include of %r detected)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   addr$   tailreplaceZgetpreviousr'   removeXINCLUDE_FALLBACK)r%   r   Z_parent_hrefsr!   Zload_includer   Zinclude_elementser   r   parentZnoder'   Zpredecessorr   r   r   r$      sd    








r$   )N)NN)NN)NNN)__doc__Zlxmlr   Zurlparser   Zurllib2r   ImportErrorZurllib.parseZurllib.requestZXINCLUDEr-   r3   r+   ZLxmlSyntaxErrorr   r   r   r   r   r$   r   r   r   r   <module>3   s"   


