o
    !d                     @   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   @usr/lib/python3.10/site-packages/awscli/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 NZ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(   r/   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   )r0   r   r0   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   r8   `   s    
r8   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
   childrenr9   	__class__r   r   r
   i   s   
zStemNode.__init__c                 C   s   | |_ | j| d S r   )r0   r<   r,   )r   childr   r   r   r/   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   r@   t   s   
zStemNode._write_childrenr   )r"   r#   r$   r
   r/   r   r@   __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   r0   r=   r   r   r
   }   s   
zTagNode.__init__c                 C   s"   |  | | | | | d S r   )_write_startr@   
_write_endr   r   r   r   r      s   

zTagNode.writec                 C   s0   d| j  }t|j|rt|j|| j d S d S )Nr2   )r   r4   r5   getattrr   r   r   r6   r   r   r   rB      s   
zTagNode._write_startc                 C   s,   d| j  }t|j|rt|j|  d S d S )Nr3   )r   r4   r5   rD   rE   r   r   r   rC      s   
zTagNode._write_endNN)	r"   r#   r$   r%   r
   r   rB   rC   rA   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   r0   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<   
isinstancer7   lstripr   rG   )r   r1   r?   foundr   r   r   rG      s   


zLineItemNode._lstriprF   )r"   r#   r$   r
   r   rG   rA   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 )
r7   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;   r7   r
   rH   r   Zstring_types
ValueErrortyper   )r   r   r0   r=   r   r   r
      s   
zDataNode.__init__c                 C   s   | j  | _ d S r   )r   rI   r   r   r   r   rI      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splitZtranslate_wordsjoinr    )r   r   Zstr_dataZ	end_spacewordsr   r   r   r      s   



zDataNode.writer   )r"   r#   r$   r%   r
   rI   r   rA   r   r   r=   r   r7      s
    r7   N)Zbotocore.compatr   r   r   r	   r   objectr   r8   r&   r.   r-   r7   r   r   r   r   <module>   s   &*