o
    .&ßa  ã                   @   s†   d dl mZ G dd„ dejjjƒZG dd„ deƒZG dd„ deƒZG dd	„ d	eƒZ	G d
d„ de	ƒZ
G dd„ de
ƒZG dd„ deƒZdS )é    )Úsixc                   @   sH   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
d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                 C   s    d | _ || _tjjj | ¡ d S ©N)ÚtreeÚdocr   ÚmovesÚhtml_parserÚ
HTMLParserÚ__init__©Úselfr   © r   úE/usr/lib/python3/dist-packages/botocore/docs/bcdoc/docstringparser.pyr
      s   zDocStringParser.__init__c                 C   s    t jjj | ¡ t| jƒ| _d S r   )r   r   r   r	   ÚresetÚHTMLTreer   r   ©r   r   r   r   r      s   zDocStringParser.resetc                 C   s,   t jjj | |¡ | j ¡  t| jƒ| _d S r   )	r   r   r   r	   Úfeedr   Úwriter   r   ©r   Údatar   r   r   r       s   
zDocStringParser.feedc                 C   s*   t jjj | ¡ | j ¡  t| jƒ| _d S r   )	r   r   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_starttag,   ó   zDocStringParser.handle_starttagc                 C   s   | j j|dd� d S )NF)Úis_startr   )r   r   r   r   r   Úhandle_endtag/   r   zDocStringParser.handle_endtagc                 C   s   | j  |¡ d S r   )r   Úadd_datar   r   r   r   Úhandle_data2   ó   zDocStringParser.handle_dataN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r
   r   r   r   r   r   r    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
   <   s   
zHTMLTree.__init__NTc                 C   s`   |   ||¡s| j |¡ d S |r)|dkrt|ƒ}nt||ƒ}| j |¡ || _d S | jj| _d S ©NÚli)Ú_doc_has_handlerr)   ÚappendÚLineItemNodeÚTagNoder(   Ú	add_childÚparent)r   r   r   r   Únoder   r   r   r   B   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   r,   Q   s   
zHTMLTree._doc_has_handlerc                 C   s   | j  t|ƒ¡ d S r   )r(   r0   ÚDataNoder   r   r   r   r   Y   r   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   r,   r   r   r   r   r   r   r   6   s    
r   c                   @   s   e Zd Zddd„Zdd„ ZdS )ÚNodeNc                 C   s
   || _ d S r   )r1   ©r   r1   r   r   r   r
   a   s   
zNode.__init__c                 C   s   t ‚r   )ÚNotImplementedErrorr   r   r   r   r   d   s   z
Node.writer   )r"   r#   r$   r
   r   r   r   r   r   r9   `   s    
r9   c                       s6   e Zd Zd
‡ fdd„	Zdd„ Zdd„ Zdd	„ Z‡  ZS )r&   Nc                    s   t t| ƒ |¡ g | _d S r   )Úsuperr&   r
   Úchildrenr:   ©Ú	__class__r   r   r
   i   s   
zStemNode.__init__c                 C   s   | |_ | j |¡ d S r   )r1   r=   r-   )r   Úchildr   r   r   r0   m   s   zStemNode.add_childc                 C   s   |   |¡ d S r   )Ú_write_childrenr   r   r   r   r   q   s   zStemNode.writec                 C   s   | j D ]}| |¡ qd S r   )r=   r   )r   r   r@   r   r   r   rA   t   s   
ÿzStemNode._write_childrenr   )r"   r#   r$   r
   r0   r   rA   Ú__classcell__r   r   r>   r   r&   h   s
    r&   c                       s:   e Zd ZdZd‡ fdd„	Zdd„ Zdd„ Zd	d
„ Z‡  ZS )r/   zP
    A generic Tag node. It will verify that handlers exist before writing.
    Nc                    s    t t| ƒ |¡ || _|| _d S r   )r<   r/   r
   r   r   )r   r   r   r1   r>   r   r   r
   }   s   
zTagNode.__init__c                 C   s"   |   |¡ |  |¡ |  |¡ d S r   )Ú_write_startrA   Ú
_write_endr   r   r   r   r   ‚   s   

zTagNode.writec                 C   s0   d| j  }t|j|ƒrt|j|ƒ| jƒ d S d S )Nr3   )r   r5   r6   Úgetattrr   ©r   r   r7   r   r   r   rC   ‡   s   
ÿzTagNode._write_startc                 C   s,   d| j  }t|j|ƒrt|j|ƒƒ  d S d S )Nr4   )r   r5   r6   rE   rF   r   r   r   rD   Œ   s   
ÿzTagNode._write_end©NN)	r"   r#   r$   r%   r
   r   rC   rD   rB   r   r   r>   r   r/   y   s    r/   c                       s2   e Zd Zd‡ fdd„	Z‡ fdd„Zdd„ Z‡  ZS )	r.   Nc                    s   t t| ƒ d||¡ d S r*   )r<   r.   r
   )r   r   r1   r>   r   r   r
   “   s   zLineItemNode.__init__c                    s   |   | ¡ tt| ƒ |¡ d S r   )Ú_lstripr<   r.   r   r   r>   r   r   r   –   s   
zLineItemNode.writec                 C   sD   |j D ]}t|tƒr| ¡  |jr dS q|  |¡}|r dS qdS )zÆ
        Traverses the tree, stripping out whitespace until text data is found
        :param node: The node to strip
        :return: True if non-whitespace data was found, False otherwise
        TF)r=   Ú
isinstancer8   Úlstripr   rH   )r   r2   r@   Úfoundr   r   r   rH   š   s   

ÿ
ÿzLineItemNode._lstriprG   )r"   r#   r$   r
   r   rH   rB   r   r   r>   r   r.   ’   s    r.   c                       s2   e Zd ZdZd	‡ fdd„	Zdd„ Zdd„ Z‡  ZS )
r8   z0
    A Node that contains only string data.
    Nc                    s6   t t| ƒ |¡ t|tjƒstdt|ƒ ƒ‚|| _d S )Nz Expecting string type, %s given.)	r<   r8   r
   rI   r   Ústring_typesÚ
ValueErrorÚtyper   )r   r   r1   r>   r   r   r
   ±   s   
zDataNode.__init__c                 C   s   | j  ¡ | _ d S r   )r   rJ   r   r   r   r   rJ   ·   r!   zDataNode.lstripc                 C   s`   | j sd S | j  ¡ rd}n| j d  ¡ }| j  ¡ }| |¡}d |¡}|r)|d7 }| |¡ d S )Nú éÿÿÿÿ)r   ÚisspaceÚsplitÚtranslate_wordsÚjoinr    )r   r   Ústr_dataÚ	end_spaceÚwordsr   r   r   r   º   s   



zDataNode.writer   )r"   r#   r$   r%   r
   rJ   r   rB   r   r   r>   r   r8   ­   s
    r8   N)Úbotocore.compatr   r   r   r	   r   Úobjectr   r9   r&   r/   r.   r8   r   r   r   r   Ú<module>   s   &*