U
    祡cv                     @   sb  d dl mZmZ d dlZd dlmZ d dlmZ d dlm	Z	 d dl
mZ dZeded	ejed
ededededejedej d ej d ejgZededejededededgZedZedZedZedZedZedZedZedZedZed Zd!d" Zd#d$ Zd%d& Zd'd( Z d)d* Z!d+d, Z"G d-d. d.e#Z$G d/d0 d0e$Z%G d1d2 d2e$Z&G d3d4 d4e$Z'G d5d6 d6e$Z(G d7d8 d8e$Z)G d9d: d:e$Z*G d;d< d<e$Z+G d=d> d>e$Z,G d?d@ d@e$Z-G dAdB dBe#Z.G dCdD dDe#Z/edEZ0e1dFdG e$2 D e/_3dS )H    )absolute_importunicode_literalsN)common)unescape_string)InlineParser)Node   .z ^<(?:script|pre|style)(?:\s|>|$)z^<!--z^<[?]z^<![A-Z]z^<!\[CDATA\[at  ^<[/]?(?:address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h1|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|nav|noframes|ol|optgroup|option|p|param|section|source|title|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul)(?:\s|[/]?[>]|$)z^(?:|z)\s*$z<\/(?:script|pre|style)>z-->z\?>>z\]\]>z<^(?:(?:\*[ \t]*){3,}|(?:_[ \t]*){3,}|(?:-[ \t]*){3,})[ \t]*$z^[#`~*+_=<>0-9-]z[^ \t\f\v\r\n]z^[*+-]z^(\d{1,9})([.)])z^#{1,6}(?:[ \t]+|$)z^`{3,}(?!.*`)|^~{3,}z^(?:`{3,}|~{3,})(?= *$)z^(?:=+|-+)[ \t]*$z
\r\n|\n|\rc                 C   s   t t| dkS )z6Returns True if string contains only space characters.N)research
reNonSpaces r   5/tmp/pip-unpacked-wheel-4s07asnf/commonmark/blocks.pyis_blank4   s    r   c                 C   s   | dkS )N) 	r   r   r   r   r   is_space_or_tab9   s    r   c                 C   s   |t | k r| | S d S d S N)len)lnposr   r   r   peek=   s    r   c                 C   s:   | r6| j rdS | js,| jdkr,d| _| j} q d| _q6q dS )z` Returns true if block ends with a blank line,
    descending if needed into lists and sublists.T)listitemF)last_line_blankZlast_line_checkedt
last_child)blockr   r   r   ends_with_blank_lineD   s    r"   c                 C   s  | j | jd }dddddd| jd}| jdkr4dS tt|}tt|}|rjd|d< | d |d< nN|r|jd	ks|d
dkr|}d|d< t	|d
|d< |d|d< ndS t
| j | jt|  }|dks|dks|dksdS |jd	kr$tt| j | jt|  d s$dS |   | t| d | j}| j}| d
d t
| j | j}| j| dk rt|rnqqLt
| j | jdk}	| j| }
|
dks|
d
k s|	rt| d
 |d< || _|| _tt
| j | jr| d
d nt| |
 |d< |S )zs Parse a list marker and return data on the marker (type,
    start, delimiter, bullet character, padding) or None.NT)typetightbullet_charstart	delimiterpaddingmarker_offsetr   Zbulletr#   r   r%   	paragraph   1Zorderedr&      r'   r   r      r(   )current_linenext_nonspaceindentr   r   reBulletListMarkerreOrderedListMarkergroupr   intr   r   r   advance_next_nonspaceadvance_offsetcolumnoffsetr   )parser	containerrestdatamm2ZnextcZspaces_start_colZspaces_start_offsetZ
blank_itemZspaces_after_markerr   r   r   parse_list_markerU   sr    	


r@   c                 C   s<   |  d| dko:|  d| dko:|  d| dkS )z
    Returns True if the two list items are of the same type,
    with the same delimiter and bullet character.  This is used
    in agglomerating list items into lists.
    r#   r'   r%   )get)	list_dataZ	item_datar   r   r   lists_match   s
    rC   c                   @   s8   e Zd ZdZedddZed	ddZedd ZdS )
BlockNc                 C   s   d S r   r   r:   r;   r   r   r   	continue_   s    zBlock.continue_c                 C   s   d S r   r   r:   r!   r   r   r   finalize   s    zBlock.finalizec                 C   s   d S r   r   r   r   r   r   can_contain   s    zBlock.can_contain)NN)NN__name__
__module____qualname__accepts_linesstaticmethodrF   rH   rJ   r   r   r   r   rD      s   rD   c                   @   s8   e Zd ZdZed	ddZed
ddZedd ZdS )DocumentFNc                 C   s   dS Nr   r   rE   r   r   r   rF      s    zDocument.continue_c                 C   s   d S r   r   rG   r   r   r   rH      s    zDocument.finalizec                 C   s   | dkS Nr   r   rI   r   r   r   rJ      s    zDocument.can_contain)NN)NNrK   r   r   r   r   rQ      s   rQ   c                   @   s8   e Zd ZdZed	ddZed
ddZedd ZdS )ListFNc                 C   s   dS rR   r   rE   r   r   r   rF      s    zList.continue_c                 C   sb   |j }|r^t|r$|jr$d|jd< q^|j }|rVt|rN|jsB|jrNd|jd< qV|j}q*|j}qd S )NFr$   )first_childr"   nxtrB   )r:   r!   r   subitemr   r   r   rH      s     

zList.finalizec                 C   s   | dkS rS   r   rI   r   r   r   rJ      s    zList.can_contain)NN)NNrK   r   r   r   r   rT      s   rT   c                   @   s8   e Zd ZdZed	ddZed
ddZedd ZdS )
BlockQuoteFNc                 C   sV   | j }| jsNt|| jdkrN|   | dd tt|| jrR| dd ndS dS )Nr   r+   FTr   )r/   indentedr   r0   r6   r7   r   r9   )r:   r;   r   r   r   r   rF      s    zBlockQuote.continue_c                 C   s   d S r   r   rG   r   r   r   rH      s    zBlockQuote.finalizec                 C   s   | dkS rS   r   rI   r   r   r   rJ      s    zBlockQuote.can_contain)NN)NNrK   r   r   r   r   rX      s   rX   c                   @   s8   e Zd ZdZed	ddZed
ddZedd ZdS )ItemFNc                 C   s^   | j r|jd krdS |   n<| j|jd |jd  krV| |jd |jd  d ndS dS )Nr+   r)   r(   Tr   )blankrU   r6   r1   rB   r7   rE   r   r   r   rF      s    

zItem.continue_c                 C   s   d S r   r   rG   r   r   r   rH     s    zItem.finalizec                 C   s   | dkS rS   r   rI   r   r   r   rJ     s    zItem.can_contain)NN)NNrK   r   r   r   r   rZ      s   rZ   c                   @   s8   e Zd ZdZed	ddZed
ddZedd ZdS )HeadingFNc                 C   s   dS Nr+   r   rE   r   r   r   rF     s    zHeading.continue_c                 C   s   d S r   r   rG   r   r   r   rH   !  s    zHeading.finalizec                 C   s   dS NFr   rI   r   r   r   rJ   %  s    zHeading.can_contain)NN)NNrK   r   r   r   r   r\     s   r\   c                   @   s8   e Zd ZdZed	ddZed
ddZedd ZdS )ThematicBreakFNc                 C   s   dS r]   r   rE   r   r   r   rF   -  s    zThematicBreak.continue_c                 C   s   d S r   r   rG   r   r   r   rH   2  s    zThematicBreak.finalizec                 C   s   dS r^   r   rI   r   r   r   rJ   6  s    zThematicBreak.can_contain)NN)NNrK   r   r   r   r   r_   *  s   r_   c                   @   s8   e Zd ZdZed	ddZed
ddZedd ZdS )	CodeBlockTNc                 C   s   | j }| j}|jr|dkoPt|| jd koP|| j |jkoPtt|| jd  }|rzt|	 |j
krz| || j dS |j}|dkrtt|| jr| dd |d8 }qn*|tkr| td n| jr|   ndS dS )N   r+   r-   r   T)r/   r1   	is_fencedr   r0   
fence_charr   r   reClosingCodeFencer4   fence_lengthrH   line_numberfence_offsetr   r   r9   r7   CODE_INDENTr[   r6   )r:   r;   r   r1   matchir   r   r   rF   >  s.    
zCodeBlock.continue_c                 C   sd   |j rH|j}|d}|d| }||d d  }t| |_||_ntdd|j|_d |_d S )N
r   r+   (\n *)+$)	rb   string_contentindexr   stripinfoliteralr   sub)r:   r!   contentZnewline_pos
first_liner<   r   r   r   rH   [  s    
zCodeBlock.finalizec                 C   s   dS r^   r   rI   r   r   r   rJ   k  s    zCodeBlock.can_contain)NN)NNrK   r   r   r   r   r`   ;  s   r`   c                   @   s8   e Zd ZdZed	ddZed
ddZedd ZdS )	HtmlBlockTNc                 C   s&   | j r|jdks|jdkrdS dS d S )N      r+   r   )r[   html_block_typerE   r   r   r   rF   s  s
    zHtmlBlock.continue_c                 C   s   t dd|j|_d |_d S )Nrl    )r   rr   rm   rq   rG   r   r   r   rH   {  s    zHtmlBlock.finalizec                 C   s   dS r^   r   rI   r   r   r   rJ     s    zHtmlBlock.can_contain)NN)NNrK   r   r   r   r   ru   p  s   ru   c                   @   s8   e Zd ZdZed	ddZed
ddZedd ZdS )	ParagraphTNc                 C   s   | j r
dS dS )Nr+   r   )r[   rE   r   r   r   rF     s    zParagraph.continue_c                 C   s\   d}t |jddkrB| j|j| j}|s,qB|j|d  |_d}q|rXt|jrX|  d S )NFr   [T)r   rm   inline_parserparseReferencerefmapr   unlink)r:   r!   Zhas_reference_defsr   r   r   r   rH     s     zParagraph.finalizec                 C   s   dS r^   r   rI   r   r   r   rJ     s    zParagraph.can_contain)NN)NNrK   r   r   r   r   rz     s   rz   c                   @   s   e Zd ZdZdddddddd	gZedddZedddZedddZedddZ	edddZ
ed ddZed!ddZed"ddZd
S )#BlockStartszBlock start functions.

    Return values:
    0 = no match
    1 = matched container, keep going
    2 = matched leaf, no more block starts
    block_quoteatx_headingfenced_code_block
html_blocksetext_headingthematic_break	list_itemindented_code_blockNc                 C   sh   | j sdt| j| jdkrd|   | dd tt| j| jrJ| dd |   | 	d| j dS dS )Nr   r+   FTr   r   )
rY   r   r/   r0   r6   r7   r   r9   close_unmatched_blocks	add_childrE   r   r   r   r     s    zBlockStarts.block_quotec                 C   s   | j stt| j| jd  }|r|   | t|	 d | 
  | d| j}t|	  |_tddtdd| j| jd  |_| t| j| j d dS dS )NFheadingz[ \t]+#+[ \t]*$ry   z^[ \t]*#+[ \t]*$r-   r   )rY   r   r   reATXHeadingMarkerr/   r0   r6   r7   r   r4   r   r   ro   levelrr   r9   rm   )r:   r;   r>   r   r   r   r     s2       zBlockStarts.atx_headingc                 C   s   | j s~tt| j| jd  }|r~t| }|   | 	d| j}d|_
||_| d |_| j|_|   | |d dS dS )N
code_blockTr   Fr-   )rY   r   r   reCodeFencer/   r0   r   r4   r   r   rb   re   rc   r1   rg   r6   r7   )r:   r;   r>   re   r   r   r   r     s(     zBlockStarts.fenced_code_blockc                 C   s   | j s|t| j| jdkr|| j| jd  }tddD ]H}tt| |r2|dk sX|jdkr2| 	  | 
d| j}||_ dS q2dS )	N<r+      rw   r*   r   r-   r   )rY   r   r/   r0   ranger   r   reHtmlBlockOpenr   r   r   r9   rx   )r:   r;   r   Z
block_typebr   r   r   r     s    zBlockStarts.html_blockc                 C   s   | j s|jdkrtt| j| jd  }|r|   t|j	ddkrn| j
|j	| j}|s\qn|j	|d  |_	q4|j	rtd|j}| d dkrdnd|_|j	|_	|| |  || _| t| j| j d dS dS dS )	Nr*   r   r{   r   =r+   r-   F)rY   r   r   r   reSetextHeadingLiner/   r0   r   r   rm   r|   r}   r~   r   	sourceposr4   r   Zinsert_afterr   tipr7   r   r9   )r:   r;   r>   r   r   r   r   r   r     s:     
 zBlockStarts.setext_headingc                 C   sT   | j sPtt| j| jd  rP|   | d| j | t	| j| j
 d dS dS )Nr   Fr-   r   )rY   r   r   reThematicBreakr/   r0   r   r   r7   r   r9   rE   r   r   r   r     s    
  zBlockStarts.thematic_breakc                 C   sn   | j r|jdkrjt| |}|rj|   | jjdks>t|j|sR| d| j}||_| d| j}||_dS dS )Nr   r   r+   r   )	rY   r   r@   r   r   rC   rB   r   r0   )r:   r;   r=   r   r   r   r   *  s    

zBlockStarts.list_itemc                 C   sB   | j r>| jjdkr>| js>| td |   | d| j dS dS )Nr*   Tr   r-   r   )	rY   r   r   r[   r7   rh   r   r   r9   rE   r   r   r   r   >  s    
zBlockStarts.indented_code_block)N)N)N)N)N)N)N)N)rL   rM   rN   __doc__METHODSrP   r   r   r   r   r   r   r   r   r   r   r   r   r     s4   
r   c                   @   sh   e Z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
dd Zdd Zdd ZdS )Parserc                 C   s   t dddgddgg| _t | _| j| _| j| _d| _d| _d| _d| _	d| _
d| _d| _d| _d| _d| _d| _| j| _i | _d| _t|| _|| _d S )Ndocumentr+   r   ry   FT)r   docr   block_startsr   oldtipr/   rf   r9   r8   r0   next_nonspace_columnr1   rY   r[   partially_consumed_tab
all_closedlast_matched_containerr~   last_line_lengthr   r|   options)selfr   r   r   r   __init__M  s(    
zParser.__init__c                 C   sZ   | j r6|  jd7  _d| jd  }| j jd| 7  _| j j| j| jd d 7  _dS )z Add a line to the block at the tip.  We assume the tip
        can accept lines -- that check should be done before calling this.r+   r   r   Nrk   )r   r9   r8   r   rm   r/   )r   chars_to_tabr   r   r   add_linec  s
    zParser.add_linec                 C   sf   | j | jj |s*| | j| jd  q |d }t|| j|gddgg}d|_| j| || _|S )z Add block of type tag as a child of the tip.  If the tip can't
        accept children, close and finalize it and try its parent,
        and so on til we find a block that can accept children.r+   r   ry   )	blocksr   r   rJ   rH   rf   r   rm   Zappend_child)r   tagr9   Zcolumn_numberZ	new_blockr   r   r   r   n  s    zParser.add_childc                 C   s@   | j s<| j| jkr6| jj}| | j| jd  || _qd| _ dS )z(Finalize and close any unmatched blocks.r+   TN)r   r   r   parentrH   rf   )r   r   r   r   r   r   |  s    zParser.close_unmatched_blocksc                 C   s   | j }| j}| j}z|| }W n tk
r6   d}Y nX |dkr|dkrZ|d7 }|d7 }n$|dkr|d7 }|d|d  7 }nqz|| }W q8 tk
r   d}Y q8X q8|dkp|dkp|dk| _|| _|| _| j| j | _| jtk| _	d S )Nry   r   r+   r   r   rk   )
r/   r9   r8   
IndexErrorr[   r0   r   r1   rh   rY   )r   r/   rj   colscr   r   r   find_next_nonspace  s0    

zParser.find_next_nonspacec                 C   s   | j | _| j| _d| _d S r^   )r0   r9   r   r8   r   )r   r   r   r   r6     s    zParser.advance_next_nonspacec                 C   s&  | j }z|| j }W n tk
r,   d }Y nX |dkr"|d k	r"|dkrd| jd  }|r||k| _t||}|  j|7  _|  j| jrdnd7  _||8 }qd| _|  j|7  _|  jd7  _|d8 }n*d| _|  jd7  _|  jd7  _|d8 }z|| j }W q. tk
r   d }Y q.X q.d S )Nr   r   r   r+   F)r/   r9   r   r8   r   min)r   countcolumnsr/   r   r   Zchars_to_advancer   r   r   r7     s4    




zParser.advance_offsetc                 C   s$  d}| j }| j| _d| _d| _d| _d| _|  jd7  _t	d|dk	rVt
dd|}|| _|j}|r|jsnq|}|   | j|j | |}|dkrn,|dkrd}n|d	krt|| _dS td
|s\|j}qq\|| jk| _|| _|jdko| j|j j}| j}t|j}|s|   | jsFt	t|| jd sF|   qd}	|	|k rt||j|	 | |}
|
dkr| j}qn"|
d	kr| j}d}qn|	d7 }	qJ|	|kr|   qq| js| js| jjdkr|    n,| !  | jr
|jr
d|j_"|j}| jo\|dkpZ|dkr4|j#pZ|dkoZ|j$ oZ|j%d d | jk }|}|rx||_"|j}qb| j| jr|    |dkr|j&dkr|j&dkrt	t'|j& | j| jd r| (|| j n6| jt|k r| js| )d| j}|   |    t|| _dS )zAnalyze a line of text and update the document appropriately.

        We parse markdown text by calling this on each line of input,
        then finalizing the document.
        Tr   Fr+   z\u0000Nz\0u   �r-   z4continue_ returned illegal value, must be 0, 1, or 2r*   r   r   r   r   r.   )*r   r   r   r9   r8   r[   r   rf   r   r   rr   r/   r    is_openr   r   r   rF   r   r   
ValueErrorr   r   r   rO   r   r   rY   reMaybeSpecialr0   r6   getattrr   r   r   rb   rU   r   rx   reHtmlBlockCloserH   r   )r   r   Zall_matchedr;   r    rvZmatched_leafZstartsZ
starts_lenrj   resr   r   Zcontr   r   r   incorporate_line  s    












zParser.incorporate_linec                 C   s:   |j }d|_|| jg|jd< | j|j | | || _dS )a3   Finalize a block.  Close it and do any necessary postprocessing,
        e.g. creating string_content from strings, setting the 'tight'
        or 'loose' status of a list, and parsing the beginnings
        of paragraphs for reference definitions.  Reset the tip to the
        parent of the closed block.Fr+   N)r   r   r   r   r   r   rH   r   )r   r!   rf   Zabover   r   r   rH   S  s
    zParser.finalizec                 C   sl   |  }| j| j_| j| j_| }|dk	rh|d }|j}|d s^|dksR|dkr^| j| | }q$dS )z
        Walk through a block & children recursively, parsing string content
        into inline content where appropriate.
        NnodeZenteringr*   r   )walkerr~   r|   r   rV   r   parse)r   r!   r   eventr   r   r   r   r   process_inlinesa  s    

zParser.process_inlinesc                 C   s   t dddgddgg| _| j| _i | _d| _d| _d| _d| _| j| _d| _	t
t|}t|}t|dkr|d dkr|d8 }t|D ]}| ||  q| jr| | j| q| | j | jS )z; The main parsing function.  Returns a parsed document AST.r   r+   r   ry   rk   )r   r   r   r~   rf   r   r9   r8   r   r/   r   splitreLineEndingr   r   r   rH   r   )r   Zmy_inputlineslengthrj   r   r   r   r   q  s&    zParser.parseN)rL   rM   rN   r   r   r   r   r   r6   r7   r   rH   r   r   r   r   r   r   r   L  s   	 r   z#(.)([A-Z](?:[a-z]+|(?<=[a-z0-9].)))c                 c   s$   | ]}t d |j |fV  qdS )z\1_\2N)CAMEL_RErr   rL   lower).0clsr   r   r   	<genexpr>  s   r   )4
__future__r   r   r   Z
commonmarkr   Zcommonmark.commonr   Zcommonmark.inlinesr   Zcommonmark.noder   rh   compile
IGNORECASEZOPENTAGZCLOSETAGr   r   r   r   r   r2   r3   r   r   rd   r   r   r   r   r   r"   r@   rC   objectrD   rQ   rT   rX   rZ   r\   r_   r`   ru   rz   r   r   r   dict__subclasses__r   r   r   r   r   <module>   s   	








E5 ,  ?
