B
    j9C\)              
   @   s   d Z ddgZyddlmZ W n. ek
rJ Z zddlmZ W ddZ[X Y nX ddlmZ ddlm	Z	 ddl
mZ dd	lmZmZmZmZmZ dd
lmZmZmZmZmZmZmZ ddlmZ dZdd ZG dd deZG dd deeZdS )ZMITLXMLTreeBuilderForXMLLXMLTreeBuilder    )CallableN)BytesIO)StringIO)etree)CommentDoctypeNamespacedAttributeProcessingInstructionXMLProcessingInstruction)FASTHTMLHTMLTreeBuilder
PERMISSIVEParserRejectedMarkupTreeBuilderXML)EncodingDetectorlxmlc             C   s   t dd t|  D S )zInvert a dictionary.c             s   s   | ]\}}||fV  qd S )N ).0kvr   r   0lib/python3.7/site-packages/bs4/builder/_lxml.py	<genexpr>&   s    z_invert.<locals>.<genexpr>)dictlistitems)dr   r   r   _invert$   s    r    c                   s   e Zd ZejZdZeZdZ	dgZ
e	eeeegZdZeddZeeZ fddZd	d
 Zdd Zdd Zd*ddZdd Zd+ddZdd Zdd Zi 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 ),r   Tzlxml-xmlxmli   z$http://www.w3.org/XML/1998/namespace)r!   c                s    t t| | | | j dS )zXLet the BeautifulSoup object know about the standard namespace
        mapping.
        N)superr   initialize_soup_register_namespacesDEFAULT_NSMAPS)selfsoup)	__class__r   r   r#   <   s    z%LXMLTreeBuilderForXML.initialize_soupc             C   s:   x4t | D ]$\}}|r|| jjkr|| jj|< qW dS )zLet the BeautifulSoup object know about namespaces encountered
        while parsing the document.

        This might be useful later on when creating CSS selectors.
        N)r   r   r'   Z_namespaces)r&   mappingkeyvaluer   r   r   r$   C   s    z*LXMLTreeBuilderForXML._register_namespacesc             C   s"   | j d k	r| j S tj| dd|dS )NFT)targetstrip_cdataZrecoverencoding)_default_parserr   	XMLParser)r&   r.   r   r   r   default_parserP   s    
z$LXMLTreeBuilderForXML.default_parserc             C   s&   |  |}t|tr"|| d|d}|S )NF)r,   r-   r.   )r1   
isinstancer   )r&   r.   parserr   r   r   
parser_forX   s    

z LXMLTreeBuilderForXML.parser_forNc             C   s,   || _ |d k	rt|| _d | _| jg| _d S )N)r/   setempty_element_tagsr'   DEFAULT_NSMAPS_INVERTEDnsmaps)r&   r3   r6   r   r   r   __init__a   s
    
zLXMLTreeBuilderForXML.__init__c             C   s0   |d dkr$t |dd  ddS d |fS d S )Nr   {   })tuplesplit)r&   tagr   r   r   	_getNsTagk   s    zLXMLTreeBuilderForXML._getNsTagc       	      c   s   | j  }|rt| _nt| _t|tr2|d|dfV  t|trP|dd|dfV  ||g}t||||}x|jD ]}|j	||dfV  qnW dS )z
        :yield: A series of 4-tuples.
         (markup, encoding, declared encoding,
          has undergone character replacement)

        Each 4-tuple represents a strategy for parsing the document.
        NFutf8)
is_xmlr   processing_instruction_classr   r2   strencoder   Z	encodingsmarkup)	r&   rF   Zuser_specified_encodingZexclude_encodingsZdocument_declared_encodingZis_htmlZtry_encodingsZdetectorr.   r   r   r   prepare_markups   s    



z$LXMLTreeBuilderForXML.prepare_markupc          
   C   s   t |trt|}nt |tr&t|}|| j}y`| | jj	| _
| j
| x4t|dkr|| j}t|dkrR| j
| qRW | j
  W n6 tttjfk
r } ztt|W d d }~X Y nX d S )Nr   )r2   bytesr   rD   r   read
CHUNK_SIZEr4   r'   original_encodingr3   feedlencloseUnicodeDecodeErrorLookupErrorr   ParserErrorr   )r&   rF   dataer   r   r   rL      s    


zLXMLTreeBuilderForXML.feedc             C   s   | j g| _d S )N)r7   r8   )r&   r   r   r   rN      s    zLXMLTreeBuilderForXML.closec             C   s  t |}d }t|dkr4t| jdkr4| jd  n\t|dkr| | | jt| | }x,t| D ]\}}t	d|d}|||< qpW i }xVt| D ]F\}	}
| 
|	\}}	|d kr|
||	< q| |}t	||	|}	|
||	< qW |}| 
|\}}| |}| j|||| d S )Nr   r;   Zxmlnszhttp://www.w3.org/2000/xmlns/)r   rM   r8   appendr$   r    copyr   r   r
   r@   _prefix_for_namespacer'   Zhandle_starttag)r&   nameZattrsZnsmapnsprefixprefix	namespaceZ	attributeZ	new_attrsattrr+   r   r   r   start   s0    




zLXMLTreeBuilderForXML.startc             C   s<   |dkrdS x*t | jD ]}|dk	r||kr|| S qW dS )z9Find the currently active prefix for the given namespace.N)reversedr8   )r&   rZ   inverted_nsmapr   r   r   rV      s    z+LXMLTreeBuilderForXML._prefix_for_namespacec             C   s   | j   | j jd }| |\}}d }|d k	r^x,t| jD ]}|d k	r<||kr<|| }P q<W | j || t| jdkr| j  d S )Nr;   )	r'   endDataZtagStackr@   r]   r8   Zhandle_endtagrM   pop)r&   rW   Zcompleted_tagrZ   rX   r^   r   r   r   end   s    
zLXMLTreeBuilderForXML.endc             C   s0   | j   | j |d |  | j | j d S )N )r'   r`   handle_datarC   )r&   r,   rR   r   r   r   pi   s    
zLXMLTreeBuilderForXML.pic             C   s   | j | d S )N)r'   rd   )r&   contentr   r   r   rR      s    zLXMLTreeBuilderForXML.datac             C   s(   | j   t|||}| j | d S )N)r'   r`   r	   Zfor_name_and_idsZobject_was_parsed)r&   rW   Zpubidsystemdoctyper   r   r   rh      s    
zLXMLTreeBuilderForXML.doctypec             C   s&   | j   | j | | j t dS )z#Handle comments as Comment objects.N)r'   r`   rd   r   )r&   rf   r   r   r   comment  s    
zLXMLTreeBuilderForXML.commentc             C   s   d| S )zSee `TreeBuilder`.z)<?xml version="1.0" encoding="utf-8"?>
%sr   )r&   fragmentr   r   r   test_fragment_to_document
  s    z/LXMLTreeBuilderForXML.test_fragment_to_document)NN)NNN)'__name__
__module____qualname__r   r0   ZDEFAULT_PARSER_CLASSrB   r   rC   NAMEALTERNATE_NAMESLXMLr   r   r   featuresrJ   r   r%   r    r7   r#   r$   r1   r4   r9   r@   rG   rL   rN   r\   rV   rb   re   rR   rh   ri   rk   __classcell__r   r   )r(   r   r   (   s8   
	

  
#.	c               @   sF   e Zd ZeZdgZeeeeeg Z	dZ
eZdd Zdd Zdd Zd	S )
r   z	lxml-htmlFc             C   s   t jS )N)r   Z
HTMLParser)r&   r.   r   r   r   r1     s    zLXMLTreeBuilder.default_parserc          
   C   sj   | j j}y&| || _| j| | j  W n6 tttj	fk
rd } zt
t|W d d }~X Y nX d S )N)r'   rK   r4   r3   rL   rN   rO   rP   r   rQ   r   rD   )r&   rF   r.   rS   r   r   r   rL     s    zLXMLTreeBuilder.feedc             C   s   d| S )zSee `TreeBuilder`.z<html><body>%s</body></html>r   )r&   rj   r   r   r   rk   %  s    z)LXMLTreeBuilder.test_fragment_to_documentN)rl   rm   rn   rq   ro   rp   r   r   r   rr   rB   r   rC   r1   rL   rk   r   r   r   r   r     s   
) Z__license____all__Zcollections.abcr   ImportErrorrS   collectionsior   r   r   r   Zbs4.elementr   r	   r
   r   r   Zbs4.builderr   r   r   r   r   r   r   Z
bs4.dammitr   rq   r    r   r   r   r   r   r   <module>   s"   $ h