U
    祡c	y                     @   s  d dl mZmZmZ d dlZd dlZd dlmZ d dlm	Z	m
Z
 d dlmZ d dlmZ ejdkrejdkr|d dlZejZqd	d
lmZ eZnd dlmZ ejZdej ZedZede d d d e d d d e d ZedZedej Zedej ejZedZedZ edZ!edZ"edZ#edej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%ej-Z.d&d' Z/d(d) Z0G d*d+ d+e1Z2dS ),    )absolute_importunicode_literalsdivisionN)common)normalize_uriunescape_string)Node)normalize_reference)   r   )r
         )	_unescape)entitytransz\\a  [!"#$%&\'()*+,\-./:;<=>?@\[\]\\^_`{|}~\xA1\xA7\xAB\xB6\xB7\xBB\xBF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061E\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u0AF0\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166D\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u2308-\u230B\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E42\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65]|\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC9\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9]|\uD805[\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDF3C-\uDF3E]|\uD809[\uDC70-\uDC74]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD82F\uDC9F|\uD836[\uDE87-\uDE8B]z^(?:"(z|[^"\x00])*"|z'(z|[^'\x00])*'z\((z|[^()\x00])*\))z^(?:<(?:[^<>\n\\\x00]|\\.)*>)^z`+z^`+z\.\.\.z--+z^<([a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)>z/^<[A-Za-z][A-Za-z0-9.+-]{1,31}:[^<>\x00-\x20]*>z^ *(?:\n *)?z^^[ \t\n\x0b\x0c\x0d]z[ \t\n\x0b\x0c\x0d]+z^\sz *$z^ *z^ *(?:\n|$)z^\[(?:[^\\\[\]]|\\.){0,1000}\]z^[^\n`\[\]\\!<&*_\'"]+c                 C   s   t dd }| |_|S )Ntext)r   literal)snode r   6/tmp/pip-unpacked-wheel-4s07asnf/commonmark/inlines.pyr   V   s    
r   c                 C   s   d}d}t | d dkr&t | d }nXt | d dkrDt | d }n:t | d dkrjd}t | d d }nd}t | d d }d| d|  S )Nr   r
      r   r   u   —u   –)len)charsZen_countZem_countr   r   r   smart_dashes\   s    r   c                   @   s   e Zd 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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d(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 Zd2d3 Zd4d5 Zd6d7 ZeZ d8S )9InlineParserzINLINE PARSER

    These are methods of an InlineParser class, defined below.
    An InlineParser keeps track of a subject (a string to be
    parsed) and a position in that subject.
    c                 C   s"   d| _ d | _d| _i | _|| _d S )N r   )subjectbracketsposrefmapoptions)selfr!   r   r   r   __init__y   s
    zInlineParser.__init__c                 C   sB   t || j| jd }|dkr$dS |  j| 7  _| S dS )z
        If regexString matches at current position in the subject, advance
        position in subject and return the match; otherwise return None.
        N)researchr   r   endgroup)r"   ZregexStringmatchr   r   r   r(      s
    zInlineParser.matchc                 C   s$   | j t| jk r| j| j  S dS dS )zh Returns the character at the current subject position, or None if
        there are no more characters.N)r   r   r   r"   r   r   r   peek   s    zInlineParser.peekc                 C   s   |  t dS )zL Parse zero or more space characters, including at
        most one newline.T)r(   reSpnlr)   r   r   r   spnl   s    
zInlineParser.spnlc                 C   s   |  t}|dkrdS | j}|  t}|dk	r||krtdd}| j|| jt|  dd}|dr|d |d   krdkrn n|dd |_	n||_	|
| d	S |  t}q&|| _|
t| d	S )
z Attempt to parse backticks, adding either a backtick code span or a
        literal sequence of backticks to the 'inlines' list.NFcode
 r   r   T)r(   reTicksHerer   reTicksr   r   r   replacelstripr   append_childr   )r"   blockZticksZafter_open_ticksmatchedr   contentsr   r   r   parseBackticks   s*    


 *
zInlineParser.parseBackticksc                 C   s   | j }|  jd7  _z|| j }W n tk
r:   d}Y nX |  dkrl|  jd7  _tdd}|| n<|rtt|r|t	| |  jd7  _n|t	d dS )a  
        Parse a backslash-escaped special character, adding either the
        escaped character, a hard line break (if the backslash is followed
        by a newline), or a literal backslash to the block's children.
        Assumes current character is a backslash.
        r   Nr.   	linebreak\T)
r   r   
IndexErrorr*   r   r5   r$   r%   reEscapabler   )r"   r6   ZsubjZsubjcharr   r   r   r   parseBackslash   s    

zInlineParser.parseBackslashc                 C   s   |  t}|rT|dd }tdd}td| |_d|_|t| || dS |  t}|r|dd }tdd}t||_d|_|t| || dS dS )	z?Attempt to parse an autolink (URL or email in pointy brackets).r   r0   linkNzmailto:r   TF)	r(   reEmailAutolinkr   r   destinationtitler5   r   
reAutolink)r"   r6   mdestr   r   r   r   parseAutolink   s&    






zInlineParser.parseAutolinkc                 C   s:   |  tj}|dkrdS tdd}||_|| dS dS )z Attempt to parse a raw HTML tag.NFZhtml_inlineT)r(   r   Z	reHtmlTagr   r   r5   )r"   r6   rD   r   r   r   r   parseHtmlTag   s    

zInlineParser.parseHtmlTagc                 C   sh  d}| j }|dks|dkr2|d7 }|  j d7  _ n$|  |krV|d7 }|  j d7  _ q2|dkrbdS |dkrndn| j|d  }|  }|dkrd}tt|p|dk}tt|}tt|p|dk}tt|}	| o| p|p|	}
| o|	 p|p|}|dkr(|
o| p|	}|o$|
 p$|}n.|dks<|dkrN|
oF| }|}n|
}|}|| _ |||d	S )
a  
        Scan a sequence of characters == c, and return information about
        the number of delimiters and whether they are positioned such that
        they can open and/or close emphasis or strong emphasis.  A utility
        function for strong/emph parsing.
        r   '"r   Nr.       _)	numdelimscan_open	can_close)r   r*   r   r$   r%   reUnicodeWhitespaceCharrePunctuation)r"   crL   startposZc_beforeZc_afterZafter_is_whitespaceZafter_is_punctuationZbefore_is_whitespaceZbefore_is_punctuationZleft_flankingZright_flankingrM   rN   r   r   r   
scanDelims   sl     


zInlineParser.scanDelimsc              
   C   s   |  |}|sdS |d}| j}|  j|7  _|dkr>d}n|dkrLd}n| j|| j }t|}|| ||||| jd|d|d	d
| _| jd dk	r| j| jd d< dS )z2Handle a delimiter marker for emphasis or a quote.FrL   rH      ’rI      “NrM   rN   )ccrL   
origdelimsr   previousnextrM   rN   rX   rY   T)rS   getr   r   r   r5   
delimiters)r"   rV   r6   resrL   rR   r8   r   r   r   r   handleDelim7  s2    



zInlineParser.handleDelimc                 C   sR   | dd k	r | d|d d< | dd kr<| d| _n| d|d d< d S )NrX   rY   )rZ   r[   )r"   delimr   r   r   removeDelimiterX  s
    zInlineParser.removeDelimiterc                 C   s"   |  d|kr|| d< | |d< d S )NrY   rX   )rZ   )Zbottomtopr   r   r   removeDelimitersBetweena  s    z$InlineParser.removeDelimitersBetweenc                 C   s  ||||d}d}d}| j }|d k	r>|d|kr>|d}q|d k	r|ds^|d}q>|d}d}|d}|d k	r||kr||| kr|ds|do|d	 d
 dko|d	 |d	  d
 dk}|d|kr|dr|sd}q|d}qv|}	|dks|dkrn|s(|d}q|d dkrH|d dkrHdnd}|d}
|d}|d  |8  < |d  |8  < |
jd t|
j|  |
_|jd t|j|  |_|dkrtdd }n
tdd }|
j}|r
||kr
|j}|  || |}q|
| | 	|| |d dkr@|
  | 
| |d dkr|  |d }| 
| |}nZ|dkrd|d _|rd|d _|d }n,|dkrd|d _|rd|d _|d }|s>|s>|	d ||< |	d s>| 
|	 q>| j d k	r| j |kr| 
| j  qd S )N)rK   *rH   rI   Fr   rX   rN   rY   rV   rM   rW   r
   Trb   rK   rL   r   r   r   emphstrongrH   rT   u   ‘rI   u   ”rU   )r[   rZ   r   r   r   nxtunlinkr5   Zinsert_afterra   r_   )r"   Zstack_bottomZopeners_bottomZ	odd_matchZ
use_delimscloseropenerZopener_foundZcloserccZ
old_closerZ
opener_inlZ
closer_inlrc   tmpre   Z	tempstackr   r   r   processEmphasisg  s    






















zInlineParser.processEmphasisc                 C   s*   |  t}|dkrdS t|dd S dS )zn
        Attempt to parse link title (sans quotes), returning the string
        or None if no match.
        Nr   r0   )r(   reLinkTitler   )r"   rB   r   r   r   parseLinkTitle  s    
zInlineParser.parseLinkTitlec                 C   sT  |  t}|dkr<|  dkr$dS | j}d}|  }|dkrBq|dkrtt| j| jd | jd  r|  jd7  _|  dk	r|  jd7  _q.|dkr|  jd7  _|d7 }q.|dkr|dk r̐qn|  jd7  _|d8 }q.tt|rqq.|  jd7  _q.| j|kr |dkr dS | j|| j }t	t
|S t	t
|dd	 S dS )
zf
        Attempt to parse link destination, returning the string or
        None if no match.
        N<r   r;   r   r   ()r0   )r(   reLinkDestinationBracesr*   r   r$   r%   r=   r   reWhitespaceCharr   r   )r"   r\   saveposZ
openparensrQ   r   r   r   parseLinkDestination  s@    

 

z!InlineParser.parseLinkDestinationc                 C   s.   |  t}|dkst|dkr"dS t|S dS )z_
        Attempt to parse a link label, returning number of
        characters parsed.
        Ni  r   )r(   reLinkLabelr   )r"   rD   r   r   r   parseLinkLabel  s    
zInlineParser.parseLinkLabelc                 C   s8   | j }|  j d7  _ td}|| | ||d dS )zf
        Add open bracket to delimiter stack and add a text node to
        block's children.
        r   [FT)r   r   r5   
addBracketr"   r6   rR   r   r   r   r   parseOpenBracket!  s    
zInlineParser.parseOpenBracketc                 C   sf   | j }|  j d7  _ |  dkrT|  j d7  _ td}|| | ||d d n|td dS )z
        If next character is [, and ! delimiter to delimiter stack and
        add a text node to block's children. Otherwise just add a text
        node.
        r   rv   z![T!)r   r*   r   r5   rw   rx   r   r   r   	parseBang0  s    
zInlineParser.parseBangc                 C   sx  d}d}|  j d7  _ | j }| j}|dkr<|td dS |ds`|td |   dS |d}| j }|  dkr|  j d7  _ |   |  }|dk	r|  rt	
t| j| j d  r|  }|  r|  d	kr|  j d7  _ d}n|| _ |s| j }	|  }
|
d
kr*| j|	|	|
  }n |dsJ| j|d| }|
dkrZ|| _ |r| jt|}|r|d }|d }d}|rTt|rdndd}||_|pd|_|dj}|r|j}|  || |}q|| | |d |   |d  |sP| j}|dk	rP|dsBd|d< |d}q$dS |   || _ |td dS dS )z
        Try to match close bracket against an opening in the delimiter
        stack. Add either a link or image, or a plain [ character,
        to block's children. If there is a matching delimiter,
        remove it from the delimiter stack.
        NFr   ]Tactiveimagern   ro   r   Zbracket_afterindexr   rA   rB   r?   r   r   previousDelimiterrX   )r   r   r5   r   rZ   removeBracketr*   r,   rs   r$   r%   rq   r   rl   ru   r    r	   r   rA   rB   re   rf   rj   )r"   r6   rB   r7   rR   rh   Zis_imagerr   rE   ZbeforelabelnZreflabelr?   r   ri   re   r   r   r   parseCloseBracketE  s    






zInlineParser.parseCloseBracketc                 C   s0   | j d k	rd| j d< || j | j||dd| _ d S )NTZbracketAfter)r   rX   r   r   r~   r}   )r   r[   )r"   r   r   r~   r   r   r   rw     s    

zInlineParser.addBracketc                 C   s   | j d| _ d S )NrX   )r   rZ   r)   r   r   r   r     s    zInlineParser.removeBracketc                 C   s,   |  t}|r$|tt| dS dS dS )zAttempt to parse an entity.TFN)r(   reEntityHerer5   r   HTMLunescape)r"   r6   rD   r   r   r   parseEntity  s
    
zInlineParser.parseEntityc                 C   sd   |  t}|r\| jdrJttd|}ttdd |}|t	| n|t	| dS dS dS )z
        Parse a run of ordinary characters, or a single character with
        a special meaning in markdown, as a plain string.
        smartu   …c                 S   s   t |  S )N)r   r'   )xr   r   r   <lambda>      z*InlineParser.parseString.<locals>.<lambda>TFN)
r(   reMainr!   rZ   r$   sub
reEllipsesreDashr5   r   )r"   r6   rD   r   r   r   r   parseString  s    
zInlineParser.parseStringc                 C   s   |  j d7  _ |j}|r|jdkr|jd dkrt|jdkoJ|jd dk}ttd|j|_|rntdd	}n
td
d	}|	| n|	td
d	 | 
t dS )z
        Parse a newline.  If it was preceded by two spaces, return a hard
        line break; otherwise a soft line break.
        r   r   r0   r/   r   r   r:   NZ	softbreakT)r   Z
last_childtr   r   r$   r   reFinalSpacer   r5   r(   reInitialSpace)r"   r6   Zlastcr:   r   r   r   r   parseNewline  s    

zInlineParser.parseNewlinec                 C   sF  || _ d| _| j}|  }|dks*|dkr.dS | j d| }|  dkrX|  jd7  _n
|| _dS |   |  }|dkr|| _dS | j}|   d}| j|kr|  }|dkrd}|| _d}	| tdkr|dkrd}	n|dk || _| tdk	}	|	s|| _dS t	|}
|
dkr"|| _dS |
|
s<||d	||
< | j| S )
z4Attempt to parse a link reference, modifying refmap.r   r   N:r   r   TF)rA   rB   )r   r   ru   r*   r,   rs   rl   r(   reSpaceAtEndOfLiner	   rZ   )r"   r   r    rR   Zmatch_charsZrawlabelrE   ZbeforetitlerB   Zat_line_endZ	normlabelr   r   r   parseReference  sV    


zInlineParser.parseReferencec                 C   s<  d}|   }|dkrdS |dkr,| |}n|dkr@| |}n|dkrT| |}n|dksd|dkrr| ||}n|dks|d	kr| jd
o| ||}nz|dkr| |}nf|dkr| |}nR|dkr| 	|}n>|dkr| 
|p| |}n |dkr| |}n
| |}|s8|  jd7  _|t| dS )z
        Parse the next inline element in subject, advancing subject
        position.

        On success, add the result to block's children and return True.
        On failure, return False.
        FNr.   r;   `rb   rK   rH   rI   r   rv   rz   r|   rm   &r   T)r*   r   r>   r9   r]   r!   rZ   ry   r{   r   rF   rG   r   r   r   r5   r   )r"   r6   r\   rQ   r   r   r   parseInline:  s:    

zInlineParser.parseInlinec                 C   s>   |j  | _d| _d| _d| _| |r*qd|_ | d dS )zq
        Parse string content in block into inline children,
        using refmap to resolve references.
        r   N)Zstring_contentstripr   r   r[   r   r   rj   )r"   r6   r   r   r   parseInlinesc  s    
zInlineParser.parseInlinesN)!__name__
__module____qualname____doc__r#   r(   r*   r,   r9   r>   rF   rG   rS   r]   r_   staticmethodra   rj   rl   rs   ru   ry   r{   r   rw   r   r   r   r   r   r   r   parser   r   r   r   r   q   s<   
?!	
w*n	F)r   )3
__future__r   r   r   r$   sysZ
commonmarkr   Zcommonmark.commonr   r   Zcommonmark.noder   Zcommonmark.normalize_referencer	   version_infohtmlunescaper   r   r   Z	ESCAPABLEZESCAPED_CHARcompilerP   rk   rp   r=   ZENTITY
IGNORECASEr   r2   r1   r   r   r@   rC   r+   rq   ZreWhitespacerO   r   r   r   rt   	MULTILINEr   r   r   objectr   r   r   r   r   <module>   s~   
















