o
    ;/bp!                     @   s   d Z ddlmZ zddlmZ ddlmZ W n ey+   ddlmZ ddl	mZ Y nw 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                   @      e Zd ZdS )FatalIncludeErrorN__name__
__module____qualname__ r   r   5/usr/lib/python3/dist-packages/lxml/ElementInclude.pyr
   K       r
   c                   @   r	   )LimitedRecursiveIncludeErrorNr   r   r   r   r   r   O   r   r   Nc                 C   sH   t | d}|dkrt| }n| }|sd}||}|  |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 | | }|S d| v rt| }nt| d}| }|  |s(d}||}|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 u rd}n
|dk rt d| |d u r/t| dr!| }|  } n|  }t|dr.|jj}n	t| dr8|  } t| ||| d S )Nr   z;expected non-negative depth or None for 'max_depth', got %rr   docinfo)
ValueErrorhasattrr   getroottreer+   ZURL_include)elemr&   base_url	max_depthZtreer   r   r   r      s   



c                 C   s  |d ur	t |}nt}|d u rt }|  j}t| t}|D ]}|jt	krt
||d}	|dd}
| }|
dkr|	|v rGtd|	 |dkrQtd|	 ||	|
|d}|d u rdtd|	|
f t|||	|d	 |	h|B }|jr}|jpxd
|j |_|d u r|  S ||| q |
dkr||	|
|dd}|d u rtd|	|
f | }|d ur|jpd
| |_n|d u r|  S |jpd
| |jpd
 |_|| q td|
 |jtkr| }|d ur|jt	krtd|j q td|j | 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getpreviousr5   removeXINCLUDE_FALLBACK)r0   r&   r1   r2   Z_parent_hrefsZload_includer!   Zinclude_elementser   r   parentZnoder5   Zpredecessorr   r   r   r/      sz   





r/   r$   r(   )__doc__Zlxmlr   Zurlparser   Zurllib2r   ImportErrorZurllib.parseZurllib.requestZXINCLUDEr;   r@   r9   ZDEFAULT_MAX_INCLUSION_DEPTHZLxmlSyntaxErrorr
   r   r    r#   r)   r   r/   r   r   r   r   <module>   s2   +	


