a
    &0_3t                  
   @   s  d Z ddlmZ ddlZddlmZ ddlmZmZm	Z	 ddl
mZ dd	 Zd
d Zdd Zdd Zdd Zdd ZedZdd Zdd ZedZedZedZedZedZdd Zd Zd!d" Zd#d$ Zd%d& Zed'Z d(d) Z!d*d+ Z"d,d- Z#d.d/ Z$d0d1 Z%d2d3 Z&dWd4d5Z'ed6ed7ed8ed9ed:ed;ed<ed=ed>d?	Z(d@dA Z)dBdC Z*dDdE Z+dXdFdGZ,dHdI Z-dJdK Z.dYdNdOZ/dPdQ Z0dRdS Z1dZdUdVZ2dS )[a  simplified reStructuredText parser.

This parser knows just enough about reStructuredText to parse the
Mercurial docstrings.

It cheats in a major way: nested blocks are not really nested. They
are just indented blocks that look like they are nested. This relies
on the user to keep the right indentation for the blocks.

Remember to update https://mercurial-scm.org/wiki/HelpStyleGuide
when adding support for new constructs.
    )absolute_importN   )_)encodingpycompaturl)
stringutilc                 C   s   d| dt |  f S )N   %s
%s

   "r   colwidths r   3/usr/lib/python3/dist-packages/mercurial/minirst.pysection"   s    r   c                 C   s   d| dt |  f S )Nr	      =r   r   r   r   r   
subsection&   s    r   c                 C   s   d| dt |  f S )Nr	      -r   r   r   r   r   subsubsection*   s    r   c                 C   s   d| dt |  f S )Nr	      .r   r   r   r   r   subsubsubsection.   s    r   c                 C   s   d| dt |  f S )Nr	      'r   r   r   r   r   subsubsubsubsection2   s    r   c                 C   sJ   |  ttj}|D ] \}}|| d| d}q|ttjS )aB  
    Apply a list of (find, replace) pairs to a text.

    >>> replace(b"foo bar", [(b'f', b'F'), (b'b', b'B')])
    'Foo Bar'
    >>> encoding.encoding = b'latin1'
    >>> replace(b'\x81\\', [(b'\\', b'/')])
    '\x81/'
    >>> encoding.encoding = b'shiftjis'
    >>> replace(b'\x81\\', [(b'\\', b'/')])
    '\x81\\'
    ascii)decoder   Zsysstrr   replaceencode)textsubstsZutextftr   r   r   r   6   s    r   s   \n(?:\s*\n)+c                    sb   g }t | d D ]D}| }|rtdd |D   fdd|D }| |d q|S )zFind continuous blocks of lines in text.

    Returns a list of dictionaries representing the blocks. Each block
    has an 'indent' field and a 'lines' field.
       
c                 s   s"   | ]}t |t |  V  qd S N)lenlstrip.0lr   r   r   	<genexpr>[       zfindblocks.<locals>.<genexpr>c                    s   g | ]}| d  qS r#   r   r&   indentr   r   
<listcomp>\   r*   zfindblocks.<locals>.<listcomp>)   indent   lines)_blockresplitr%   rstrip
splitlinesminappend)r   blocksblinesr   r+   r   
findblocksQ   s    r9   c                 C   s  d}|t | k rd| | d< | | d d dr|d t | k r| | d }| |d  d | }| | d dgkr| |= |d8 }n| | d d d	r| | d d d
d | | d d< nt | | d dkr$| | d d ddr$| | d d dddkr$|d7 }qn$| | d d d
d | | d d< t| | d d }|r||| 7 }|| 8 }|d t | k r| |d  d |krd| |d  d< | |d  d  |8  < |d7 }q||d7 }q| S )zFinds literal blocks and adds a 'type' field to the blocks.

    Literal blocks are given the type 'literal', all other blocks are
    given type the 'paragraph'.
    r   	   paragraph   typer/   s   ::r   r.   s    ::N       ..       literal)r$   endswithr%   
startswithfind	_bulletrematchend)r6   ir,   
adjustmentmr   r   r   findliteralblocksa   s<    
*
&$(
rK   s+   (\*|-|[0-9A-Za-z]+\.|\(?[0-9A-Za-z]+\)|\|) s0   ^(-([a-zA-Z0-9]), )?(--[a-z0-9-]+)((.*)  +)(.*)$s   :(?![: ])([^:]*)(?<! ):[ ]+(.*)s   [^ ]s
   (=+\s+)*=+c                 C   s   dt dfdtdfdtdfdtdfg}dd }d	}|t| k r| | d
 dkr| | d }|D ]|\}}}||d	||r\g }t|D ]B\}	}
|||	||r||g | | d d |d d |
 q|| ||d <  qq\|d7 }q0| S )zSplit paragraphs into lists.   bulletT   option   field
   definitionFc                 S   sj   | | }|d t | k r$| |d  p&d}||s6dS |r\|dkpZ|dd dkpZ||S |dS dS )zDoes itemre match an item at line i?

        A list item can be followed by an indented line or another list
        item (but only if singleline is True).
        r   r*   Fr   r>   N)r$   rF   rC   )r8   rH   itemre
singlelineZline1Zline2r   r   r   rF      s     
"zsplitparagraphs.<locals>.matchr   r;   r:   r/   r.   )r;   r/   r.   r<   r   )rE   	_optionre_fieldre_definitionrer$   	enumerater5   )r6   Z	listtypesrF   rH   r8   typerP   rQ   itemsjliner   r   r   splitparagraphs   s4    

rZ      c                 C   s   d}|t | k r| | d dkr*|d7 }q|}|t | k r| | d dkrt| | d d }| \}}|| | d d< || | d< |d7 }q.|d }q| S )zFind key for field lists.r   r;   rN   r   r/      key)r$   rS   rF   groups)r6   rH   rX   rJ   keyrestr   r   r   updatefieldlists   s    

r`   c                 C   s@  d}|t | k r<| | d dkr,|d7 }qd}|}|t | k r| | d dkrt| | d d }|d}|d}|dd   }|d }|d	 }	|| | d d< d
}
|sd}
d|rd| pd
d|
||	f f }| }|| | d< t|t|}|d7 }q4| || D ]}||d< q"|d }q| S )Nr   r;   rM   r   r/      r@         r*         s   %s%ss   -%s s	   %s--%s %s   optstr   optstrwidth)	r$   rR   rF   groupstripr2   maxr   r   )r6   rH   ZoptstrwidthrX   rJ   ZshortoptionZgroup3Z
longoptiondescZlongoptionargZ	noshortopoptblockr   r   r   updateoptionlists   s<     



rm   c           
      C   s  g }d}|d t | k r| | d dkr| | d d dr| | d }| |d  d | }| | d d dd	 }d
}|D ]}||dv rd}q|r|| | |= |}	|d8 }|	t | k r| |	 d |kr|r| |	= q| |	 d  |8  < |	d7 }	q|d7 }q| |fS )zPrune unwanted containers.

    The blocks must have a 'type' field, i.e., they should have been
    run through findliteralblocks first.
    r   r   r;   r:   r/   s   .. container::r.      NTr   F)r$   rC   r1   r5   )
r6   keepprunedrH   r,   rI   ZcontainertypeZprunecrX   r   r   r   prunecontainers  s6    


rr   s   ^([-=`:.'"~^_*+#])\1+$c                    sL  | D ]@}|d dkrt |d dkrt|d d r|d d |d d krd|d< d|d	< |d d   fd
dtt  D }g }|d dd D ]}| krd|d	< qg }|d }t|D ]j\}}|d t |k r||d  | }	t|||	}
|t |
7 }||
	  q|||d 	  q|| q||d< q| S )zQFind simple tables

       Only simple one-line table elements are supported
    r;   r:   r/   ra   r   r<      tableF   headerc                    s@   g | ]8} ||d   dkr|dks8 |d  | dkr|qS )r   r   r   r>   r   )r'   xdivr   r   r-   _  s   0zfindtables.<locals>.<listcomp>r   TN)
r$   _tablererF   r   xrangerU   r   Zgetcolsr5   rh   )r6   rl   columnsZrowsr(   rowposnstartwidthvr   rv   r   
findtablesD  s@    




r   c                 C   s   | D ]~}|d dkrt |d dkrt|d d t |d d krt|d d r|d d dd |d< d|d< |d d= q| S )	zFinds sections.

    The blocks must have a 'type' field, i.e., they should have been
    run through findliteralblocks first.
    r;   r:   r/   ra   r   r   	   underline   section)r$   r   r   
_sectionrerF   )r6   rl   r   r   r   findsections|  s    
 r   c                    s:   dg | D ]*}|d dv r
 fdd|d D |d< q
| S )N)s   ``r
   r;   r:   r   c                    s   g | ]}t | qS r   r   r&   r   r   r   r-     r*   z"inlineliterals.<locals>.<listcomp>r/   r   r6   r7   r   r   r   inlineliterals  s
    r   c                    s<   ddg | D ]*}|d dv r fdd|d D |d< q| S )N)s   :hg:`s   'hg )   `r   r;   r   c                    s   g | ]}t | qS r   r   r&   r   r   r   r-     r*   zhgrole.<locals>.<listcomp>r/   r   r   r   r   r   hgrole  s
    r   c                 C   s   d}|t | k r| | d | |d  d krF| | d dv rF|d7 }q| |d  d s`|d7 }q| |dgddd |d	7 }q| S )
zAdds empty blocks for vertical spacing.

    This groups bullets, options, and definitions together with no vertical
    space between them, and adds an empty block between all other blocks.
    r   r;   )rL   rM   rN   r/   r*   r      margin)r/   r.   r;   ra   )r$   insert)r6   rH   r   r   r   
addmargins  s    "


r   c                 C   s|   d}|t | k rx| | }|d dkrn|d d dsD|d dgkrn| |= |t | k rv| | d dkrv| |= q|d7 }q| S )	zRemove comments.r   r;   r:   r/   r?   s   ..r   r   )r$   rC   )r6   rH   r7   r   r   r   prunecomments  s    
r   c                 C   s   |p
t  }tjddt| tjd}d}|t| k r|| | d d }|rd| | d< | | d d d|	 d	  
 }| | d d |	 d
 d }|r| | d d
d|  || | d< | | d d= |d
 }q.| S )zj
    Makes the type of the block an admonition block if
    the first line is an admonition directive
    s   \.\. (%s)::   |)flagsr   r/   
   admonitionr;   r@   ra   r   Nrd      admonitiontitle)_admonitiontitleskeysrecompilejoinsorted
IGNORECASEr$   rF   rG   lowerr   )r6   admonitionsZadmonitionrerH   rJ   Zadmonitiontitle	firstliner   r   r   findadmonitions  s"    $ 
r   s
   Attention:s   Caution:s   !Danger!s   Error:s   Hint:s
   Important:s   Note:s   Tip:s   Warning!)	s	   attentions   cautions   dangers   errors   hints	   importants   notes   tips   warningc                 C   st   d ttj| d }t| d }|d }| d }d| d d||  f }dt|d  }dtj||||d S )	Nr>   r/   re   r   rf   s   %s%s  s    %s
)
initindent
hangindent)r   mapbytesrh   r   r   r   wrap)rl   r   rj   r   ZusablewidthZhangingr   r   r   r   r   formatoption  s    r   c                 C   s  |dkrd}d| d  }| d dkrt | d  }| d sD|| d	 S t| d d
 t| d d
   }||d  }dttj| d }d|| tj||||df S | d dkrd	S | d dkr|d7 }|d	| | d  d	 S | d dkr&t	
| d d | d  }d|| d d ||f S | d dkr,| d }dd t| D }	d}t|	t|	 d }
d| d  }dt||
 |	d
   }|D ]}g }t|	|D ]*\}}d|t	
|  }|||  qd|}tj||||d}|s| d r|d	 | dt||
  d	 }n||d	 7 }q|S | d dkr|| d d  }t| d d
 t| d d
   }||d  }dttj| d dd }d|tj||||df S |}| d dkr| d d dr| d d dd | d d< n"t| d d }|| d  }n|| d dkr~| d  }|td  }t|d tkrZ||}n
|t}|| d d  | d d< n| d d!krt| |S dttj| d }tj||||dd	 S )"z"Format a block according to width.r   N   r>   r.   r;   r   r   r/   r"   r<   s   %s
%s
)r   r   r   r   rA   s     r   r   s
   %s%s
%s%s
rs   c                 S   s   g | ]}t d d |D qS )c                 S   s   g | ]}t |qS r   r   r'   er   r   r   r-   %  r*   z*formatblock.<locals>.<listcomp>.<listcomp>ri   r'   rq   r   r   r   r-   %  r*   zformatblock.<locals>.<listcomp>r*   r   rt   r   rO   NrL   s   | ra   rN   r\   rM   )r   r$   r%   r   r   r   rh   r   r   r   r   zipsumr5   r4   rC   rE   rF   rG   _fieldwidthljustr   )rl   r   r,   
admonitionZhangZ	defindentr   Z	underlinetablewidthsspanr{   r(   wr   padtermZ	subindentrJ   r^   r   r   r   formatblock  s    $
 $

r   c                    s  g d}g  dd } fdd}dd | D } t | D ]`\}}|d }|d	 }|d
 }|dkr|t|d  }	|dttj|}
d|	|
f  nz|dkrd|d|  nV|dkrΐnJ|dkrd|d|  n&|dkrD|d }||vr||7 }||d }d|||d |f  n|dkr|d }d |D ]Z}d |D ]2}d || d d qv  d qdd  nJ|d!kr |d"| ||d }|dttj|dd# }
d$||
f  n|d%kr|d 	dd\}}|d&v rT|d'| n
|d(| d)|d|g|dd#    n|d*kr|d"| ||d+ }|dttj|}
d$||
f  nH|d,kr|d"| ||d- }|dttj|}d$||f   r8 d. \}}|t
| d krRd/|     q8| |d  }|d	 }||k s||kr8|d d0vr8d/|     q8dS )1zFormat RST blocks as HTMLr*   c                 S   s   t | dS )NT)r   escaper   r   r   r   r   j  s    zformathtml.<locals>.escapec                    s4    r d d | kr0  | |f  d|   d S )Nr<   r   s   <%s>
)r5   )r~   levelZlistnestoutr   r   openlistm  s    zformathtml.<locals>.openlistc                 S   s   g | ]}|d  dkr|qS )r;   r   r   r'   r7   r   r   r   r-   r  r*   zformathtml.<locals>.<listcomp>r;   r.   r/   r   r   r>   s   <p>
<b>%s</b> %s
</p>
r:   s   <p>
%s
</p>
r"   r   rA   s   <pre>
%s
</pre>
r   r   r   s   <h%d>%s</h%d>
r   rs   s   <table>
s   <tr>s   <td>s   </td>s   </tr>
s	   </table>
rO   s   dlNs    <dt>%s
 <dd>%s
rL   )   *r   s   uls   ols	    <li> %s
rN   r\   rM   re   r<   s   </%s>
s   definition bullet field option)rU   r   r   r   r   rh   r5   indexpopr1   r$   )r6   Z
headernestr   r   r|   r7   Zbtyper   r8   r   r   rH   r   r{   r   r   Zbulletheadr^   rk   rj   r~   ZnbZnir   r   r   
formathtmlc  s    

 









(







r   c                 C   s   t | }|D ]}|d  |7  < qt|}t|}t||p<g \}}t|}t|}t|}t|}t|}t	|}t
||d}t|}t|}||fS )z Parse text into a list of blocksr.   )r   )r9   rK   r   rr   r   r   r   rZ   r`   rm   r   r   r   )r   r,   ro   r   r6   r7   rp   r   r   r   parse  s     r   c                    s   d  fdd| D }|S )Nr*   c                 3   s   | ]}t | V  qd S r#   r   r   r   r   r   r)     r*   zformatblocks.<locals>.<genexpr>r   )r6   r   r   r   r   r   formatblocks  s    r   c                    s   d  fdd| D S )z"Format parsed blocks as plain textr*   c                 3   s   | ]}t | V  qd S r#   r   r   r   r   r   r)     r*   zformatplain.<locals>.<genexpr>r   )r6   r   r   r   r   formatplain  s    r   P      plainc                 C   sB   t | ||pg \}}|r"t||}|dkr2t|S t||dS dS )z-Parse and format the text according to width.s   htmlr   N)r   filtersectionsr   r   )r   r   r,   ro   Zstyler   r6   rp   r   r   r   format  s    
r   c                    s  g }t  }g  d}g }g }d}|t|k rt|| \}}	}
||	d= || ||ksh|d| rj||krt|}t|}|r||krd}g }td|d D ]V}|| }||ks|| |kr|t  || d } |d   |d	  q|r|| |dd } |
 |d t|k rj||d  d |	krj|d7 } || d  q$|d7 }q |r|  |D ]b} fd
d|D }|d	 d } | d }dd||d g 	dd |d<  |d |= q S )zSelect parsed blocks under the specified section

    The section name is separated by a dot, and matches the suffix of the
    full section path.
    r   TNr   Fr@   r   ra   r<   c                    s   g | ]} | d  d qS )r/   r   r   )r'   Zsynr6   r   r   r-     r*   z"filtersections.<locals>.<listcomp>r/   s   "%s"r
   r*   )
_getsectionsr$   r5   rB   r   ry   extendreverser   r   )r6   r   parentsZsectionsrH   ZlastparentsZ	syntheticZcollapsepathnestr7   Zllenplenr   rX   parentsecrealZrealliner   r   r   r     sX    




(

r   c                 C   s  d}d}g }dd }| D ]x}|d dkr|d }||vrB||7 }| |d }|d	| }|d	| ||f }|d
|||gf q|d dv rd}||vr||7 }| |d }|d	| }tdt|d D ]z}||  }|d |k r qVdd |d D }	|	r|	d d }
|d }|
|k r>|d7 } qVq|
|kr|d } qVq|d	| ||f }|d
|||gf q|sddg fg}|d dkrd}|d }|t|k r>||  d d }|d dkr2|d }t|d dkr$|t|d d t|d d d 7 }||kr2q>|d7 }q|dkr||  d }|d |d krp|d7 }|d|g f |d d | q|S )z=return a list of (section path, nesting level, blocks) tuplesr*   r   c                 S   sL   | d dkr| d }n| d d }t |d}d|v rH|dd }|S )Nr;   rN   r\   r/   r   r
      ()r   r   rh   r1   )r7   ru   r   r   r   getname'  s    
z_getsections.<locals>.getnamer;   r   r   r   Nr   )rO   rN   r>   c                 S   s   g | ]}|d  dkr|qS )r;   rO   r   )r'   ar   r   r   r-   D  r*   z _getsections.<locals>.<listcomp>ra   r<   r.   r   r   r/   )r   r5   r   ranger$   r%   )r6   r   namesZsecsr   r7   rH   r   r   ZsiblingsZsiblingindentr,   ZpointerZbindentr   ZsindentZblevelr   r   r   r   !  st    





r   Fc                 C   s   dd t |  D }d| }|ddd |D  d }|g}| D ]v}g }t ||D ]J\}}	d|	v r|ddd |	dD }	d|t|	  }
||	|
  qR||d| d  q@|rt| dkr|d	| || |S )
zAGenerate an RST table for the given table data as a list of linesc                 S   s   g | ]}t d d |D qS )c                 s   s   | ]}t |V  qd S r#   r   r   r   r   r   r)   n  r*   z'maketable.<locals>.<listcomp>.<genexpr>r   r   r   r   r   r-   n  r*   zmaketable.<locals>.<listcomp>r>   c                 s   s   | ]}d | V  qdS )r   Nr   )r'   r   r   r   r   r)   p  r*   zmaketable.<locals>.<genexpr>r"   c                 s   s   | ]}|  V  qd S r#   )r%   r   r   r   r   r)   y  r*   r   ra   )r   r   r1   r   r   r5   r$   r   )datar,   headerr   rw   r   r{   r(   r   r   r   r   r   r   	maketablek  s     
r   )N)r   NN)r   r   Nr   N)r   F)3__doc__Z
__future__r   r   Zi18nr    r   r   r   Zutilsr   r   r   r   r   r   r   r   r0   r9   rK   rE   rR   rS   rT   rx   rZ   r   r`   rm   rr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   sl   
<



2&+
8
\]

8J