U
    m/e'                     @   s   d dl mZ d dlmZ dZdZdZdZG dd deZG d	d
 d
Z	G dd dZ
G dd de
ZG dd deZG dd de
ZdS )    )
HTMLParser)zip_longest)codea)spanir   r   )r   b)pZnoteullic                       sX   e Zd ZdZ fddZdd Z fddZ fdd	Zd
d Zdd Z	dd Z
  ZS )DocStringParserz
    A simple HTML parser.  Focused on converting the subset of HTML
    that appears in the documentation strings of the JSON models into
    simple ReST format.
    c                    s   d | _ || _t   d S N)treedocsuper__init__selfr   	__class__ G/tmp/pip-unpacked-wheel-3gylhwtm/botocore/docs/bcdoc/docstringparser.pyr      s    zDocStringParser.__init__c                 C   s   t |  t| j| _d S r   )r   resetHTMLTreer   r   r   r   r   r   r   "   s    
zDocStringParser.resetc                    s&   t  | | j  t| j| _d S r   )r   feedr   writer   r   r   datar   r   r   r   &   s    
zDocStringParser.feedc                    s$   t    | j  t| j| _d S r   )r   closer   r   r   r   r   r   r   r   r   +   s    

zDocStringParser.closec                 C   s   | j j||d d S )N)attrsr   add_tag)r   tagr    r   r   r   handle_starttag1   s    zDocStringParser.handle_starttagc                 C   s   | j j|dd d S )NF)is_startr!   )r   r#   r   r   r   handle_endtag4   s    zDocStringParser.handle_endtagc                 C   s   | j | d S r   )r   add_datar   r   r   r   handle_data7   s    zDocStringParser.handle_data)__name__
__module____qualname____doc__r   r   r   r   r$   r&   r(   __classcell__r   r   r   r   r      s   r   c                   @   s:   e Zd ZdZdd ZdddZdd	 Zd
d Zdd ZdS )r   z
    A tree which handles HTML nodes. Designed to work with a python HTML parser,
    meaning that the current_node will be the most recently opened tag. When
    a tag is closed, the current_node moves up to the parent node.
    c                 C   s    || _ t | _| j| _g | _d S r   )r   StemNodeheadcurrent_nodeunhandled_tagsr   r   r   r   r   B   s    zHTMLTree.__init__NTc                 C   sL   |  ||s| j| d S |r>t||}| j| || _n
| jj| _d S r   )_doc_has_handlerr1   appendTagNoder0   	add_childparent)r   r#   r    r%   noder   r   r   r"   H   s    
zHTMLTree.add_tagc                 C   s$   |rd| }nd| }t | jj|S )Nstart_%send_%s)hasattrr   style)r   r#   r%   handler_namer   r   r   r2   T   s    
zHTMLTree._doc_has_handlerc                 C   s   | j t| d S r   )r0   r5   DataNoder   r   r   r   r'   \   s    zHTMLTree.add_datac                 C   s   | j | j d S r   )r/   r   r   r   r   r   r   r   _   s    zHTMLTree.write)NT)	r)   r*   r+   r,   r   r"   r2   r'   r   r   r   r   r   r   ;   s   
r   c                   @   s   e Zd ZdddZdd ZdS )NodeNc                 C   s
   || _ d S r   )r6   r   r6   r   r   r   r   d   s    zNode.__init__c                 C   s   t d S r   )NotImplementedErrorr   r   r   r   r   g   s    z
Node.write)N)r)   r*   r+   r   r   r   r   r   r   r>   c   s   
r>   c                       sf   e Zd Zd 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
dd Zdd Z  ZS )r.   Nc                    s   t  | g | _d S r   )r   r   childrenr?   r   r   r   r   l   s    zStemNode.__init__c                 C   s   | |_ | j| d S r   )r6   rA   r3   r   childr   r   r   r5   p   s    zStemNode.add_childc                 C   s   |    | | d S r   )collapse_whitespace_write_childrenr   r   r   r   r   t   s    zStemNode.writec                 C   sN   t | j| jdd  D ]2\}}t|tr>|d k	r>||| q|| qd S )N   )r   rA   
isinstancer4   r   )r   r   rC   
next_childr   r   r   rE   x   s    zStemNode._write_childrenc                 C   s   t dd | jD S )Nc                 s   s   | ]}|  V  qd S r   )is_whitespace.0rC   r   r   r   	<genexpr>   s     z)StemNode.is_whitespace.<locals>.<genexpr>)allrA   r   r   r   r   rI      s    zStemNode.is_whitespacec                 C   s   | j o| j d  S )Nr   )rA   startswith_whitespacer   r   r   r   rN      s    zStemNode.startswith_whitespacec                 C   s   | j o| j d  S N)rA   endswith_whitespacer   r   r   r   rQ      s    zStemNode.endswith_whitespacec                 C   s>   | j r&| j d  r&| j dd  | _ q | j r:| j d   d S )Nr   rF   )rA   rI   lstripr   r   r   r   rR      s    zStemNode.lstripc                 C   s>   | j r&| j d  r&| j d d | _ q | j r:| j d   d S rO   )rA   rI   rstripr   r   r   r   rS      s    zStemNode.rstripc                 C   s(   |    |   | jD ]}|  qdS )a~  Remove collapsible white-space from HTML.

        HTML in docstrings often contains extraneous white-space around tags,
        for readability. Browsers would collapse this white-space before
        rendering. If not removed before conversion to RST where white-space is
        part of the syntax, for example for indentation, it can result in
        incorrect output.
        N)rR   rS   rA   rD   rB   r   r   r   rD      s    	
zStemNode.collapse_whitespace)N)r)   r*   r+   r   r5   r   rE   rI   rN   rQ   rR   rS   rD   r-   r   r   r   r   r.   k   s   r.   c                       sL   e Zd ZdZd fdd	Zdd ZdddZd	d
 Zdd Zdd Z	  Z
S )r4   zP
    A generic Tag node. It will verify that handlers exist before writing.
    Nc                    s   t  | || _|| _d S r   )r   r   r    r#   )r   r#   r    r6   r   r   r   r      s    zTagNode.__init__c                 C   s   t dd | jD S )Nc                 s   s   | ]}t |tV  qd S r   )rG   r4   rJ   r   r   r   rL      s     z+TagNode._has_nested_tags.<locals>.<genexpr>)anyrA   r   r   r   r   _has_nested_tags   s    zTagNode._has_nested_tagsc                 C   sn   | j tko|  }t| jto2| jj tko2| j tk}|s<|rJ| | d S | 	| | | | 
|| d S r   )r#   OMIT_SELF_TAGSrU   rG   r6   r4   PRIORITY_PARENT_TAGSOMIT_NESTED_TAGSrE   _write_start
_write_end)r   r   rH   Zprioritize_nested_tagsZprioritize_parent_tagr   r   r   r      s    



zTagNode.writec                 C   s   | j tkr|   |   t| jdd | jdd D ]*\}}t|tr8| r8|	 r8|  q8t| jdd | jdd D ]*\}}t|tr| r|	 r|  q| jD ]}|
  qdS )a  Remove collapsible white-space.

        All tags collapse internal whitespace. Block-display HTML tags also
        strip all leading and trailing whitespace.

        Approximately follows the specification used in browsers:
        https://www.w3.org/TR/css-text-3/#white-space-rules
        https://developer.mozilla.org/en-US/docs/Web/API/Document_Object_Model/Whitespace
        NrP   rF   )r#   HTML_BLOCK_DISPLAY_TAGSrR   rS   ziprA   rG   r=   rQ   rN   rD   )r   prevcurZnxtrC   r   r   r   rD      s*    

&
&

zTagNode.collapse_whitespacec                 C   s,   d| j  }t|j|r(t|j|| j d S )Nr8   )r#   r:   r;   getattrr    )r   r   r<   r   r   r   rY      s    
zTagNode._write_startc                 C   sB   d| j  }t|j|r>|dkr0t|j|| nt|j|  d S )Nr9   Zend_a)r#   r:   r;   r_   )r   r   rH   r<   r   r   r   rZ      s
    
zTagNode._write_end)NN)N)r)   r*   r+   r,   r   rU   r   rD   rY   rZ   r-   r   r   r   r   r4      s   
"r4   c                       sf   e Zd ZdZd fdd	Ze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=   z0
    A Node that contains only string data.
    Nc                    s   t  | t|ts&tdt| d| _d| _d| _|dkrDd S |	 rV|| _d S t
dd t|D }t|t
dd tt|D  }|d | | _||d  | _||| | _d S )Nz Expecting string type, %s given. c                 s   s   | ]\}}|  s|V  qd S r   isspacerK   idxchr   r   r   rL     s     z$DataNode.__init__.<locals>.<genexpr>c                 s   s   | ]\}}|  s|V  qd S r   ra   rc   r   r   r   rL     s     )r   r   rG   str
ValueErrortype_leading_whitespace_trailing_whitespace_stripped_datarb   next	enumeratelenreversed)r   r   r6   Zfirst_non_spaceZlast_non_spacer   r   r   r      s(    


zDataNode.__init__c                 C   s   | j  | j | j S r   ri   rk   rj   r   r   r   r   r     s    zDataNode.datac                 C   s   | j dko| jdkp| jdkS Nr`   )rk   ri   rj   r   r   r   r   rI     s    
zDataNode.is_whitespacec                 C   s   | j dkp| jdko| jdkS rq   rp   r   r   r   r   rN     s    
zDataNode.startswith_whitespacec                 C   s   | j dkp| jdko| jdkS rq   )rj   rk   ri   r   r   r   r   rQ     s    
zDataNode.endswith_whitespacec                 C   s(   | j dkrd| _ n| jdkr$|   d S rq   )ri   rk   rS   r   r   r   r   rR   $  s    

zDataNode.lstripc                 C   s(   | j dkrd| _ n| jdkr$|   d S rq   )rj   rk   rR   r   r   r   r   rS   *  s    

zDataNode.rstripc                 C   s   dS )z4Noop, ``DataNode.write`` always collapses whitespaceNr   r   r   r   r   rD   0  s    zDataNode.collapse_whitespacec                 C   s@   | | j }| j d| | j }|dkr<|| d S )N r`   )Ztranslate_wordsrk   splitri   joinrj   r(   )r   r   wordsZstr_datar   r   r   r   4  s
    zDataNode.write)N)r)   r*   r+   r,   r   propertyr   rI   rN   rQ   rR   rS   rD   r   r-   r   r   r   r   r=      s   
r=   N)html.parserr   	itertoolsr   rW   rX   rV   r[   r   r   r>   r.   r4   r=   r   r   r   r   <module>   s   %(8P