�
�c@sydZddkZddkZddkZd�Zd�Zd�Zd�Zeid�Z d�Z
eid �Zd
�Zd�Z
d�Zd
�Zd�Zedjo�ddklZd�Zeeid�i�Zeee�Zeee�Zeee�Zeee�Zee
e�Zeee�Zee
e�Zeee�Zdid�eD��GHndS(s�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.
It only supports a small subset of reStructuredText:
- paragraphs
- definition lists (must use ' ' to indent definitions)
- lists (items must start with '-')
- field lists (colons cannot be escaped)
- literal blocks
- option lists (supports only long options without arguments)
- inline markup is not recognized at all.
i�Nc Cs�gg}|i�}xL|D]D}|i�o|di|�q|do|ig�qqW|dp|d=nxht|�D]Z\}}td�|D��}td|dg}|D]}|||q�~�||<q�W|S(s�Find continuous blocks of lines in text.
Returns a list of dictionaries representing the blocks. Each block
has an 'indent' field and a 'lines' field.
i�css/x(|]!}t|�t|i��VqWdS(N(tlentlstrip(t.0tl((s$/sys/lib/python/mercurial/minirst.pys <genexpr>6stindenttlines(t
splitlineststriptappendt enumeratetmintdict( ttexttblocksRtlinetitblockRt_[1]R((s$/sys/lib/python/mercurial/minirst.pyt
findblocks%s
<cCs�d}x�|t|�jo�d||d<||ddid�op|dt|�joY||d}||dd|}||ddgjo||=|d8}ne||ddid �o&||ddd
||dd<n#||ddd ||dd<||ddid�o|d7}|d8}nxm|dt|�joQ||dd|jo8d
||dd<||ddc|8<|d7}qIWn|d7}q W|S(s�Finds 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'.
it paragraphttypeRi�s::iRs ::i�s- itliteral(Rtendswitht
startswith(R
RRt
adjustment((s$/sys/lib/python/mercurial/minirst.pytfindliteralblocks;s*
3&"
3cCsrxk|D]c}|ddjoLt|d�djo5|dddt|dd�jod|d<qqW|S( s�Finds sections.
The blocks must have a 'type' field, i.e., they should have been
run through findliteralblocks first.
RRRiit-itsection(R(R
R((s$/sys/lib/python/mercurial/minirst.pytfindsectionsns'c
Csd}x�t|�jo�||ddjo�||ddid�o�g}xs||dD]c}|id�o8|itdddgd||d��|d}n|d di|�qbW||||d
+|t|�d
7}n|d
7}q W|S(s�Finds bullet lists.
The blocks must have a 'type' field, i.e., they should have been
run through findliteralblocks first.
iRRRs- tbulletRii�i(RRRR(R
RtitemsR((s$/sys/lib/python/mercurial/minirst.pytfindbulletlists�s s-^(--[a-z-]+)((?:[ =][a-zA-Z][\w-]*)? +)(.*)$c Cs2d}x%|t|�jo||ddjo�ti||dd�o�g}x�||dD]�}ti|�}|o_|i�\}}}t|�t|�}|itdddgd||dd|��n|ddi|�qbW||||d +|t|�d 7}n|d 7}q W|S(
s�Finds option lists.
The blocks must have a 'type' field, i.e., they should have been
run through findliteralblocks first.
iRRRtoptionRtwidthi�i(Rt _optionretmatchtgroupsRR( R
RtoptionsRtmR targtrestR!((s$/sys/lib/python/mercurial/minirst.pytfindoptionlists�s&s:(?![: ])([^:]*)(?<! ):( +)(.*)c
CsOd}xB|t|�jo.||ddjoti||dd�o�||d}g}x�||dD]�}ti|�}|on|i�\}}}dt|�t|�} |itdddgd|d| ��d |||f}n|d
di|�qpW||||d+|t|�d7}n|d7}q W|S(s�Finds fields lists.
The blocks must have a 'type' field, i.e., they should have been
run through findliteralblocks first.
iRRRRitfieldR!s%s %s%si�i(Rt_fieldreR#R$RR(
R
RRtfieldsRR&tkeytspacesR(R!((s$/sys/lib/python/mercurial/minirst.pytfindfieldlists�s( c
CsWd}xJ|t|�jo6||ddjot||d�djo�|ddid�o�||ddid�o�g}x�||dD]}}|id�p.|itdddgd||d��n|d di|�t|�t|i��|d d
<q�W||||d+|t|�d7}n|d7}q W|S(s�Finds definition lists.
The blocks must have a 'type' field, i.e., they should have been
run through findliteralblocks first.
iRRRis t
definitionRi�thang(RRRRR(R
RtdefinitionsR((s$/sys/lib/python/mercurial/minirst.pytfinddefinitionlists�s$ (c Cs�d}x�|t|�joz||d||ddjo#||dd
jo|d7}q |i|tddgd d
dd��|d7}q W|S(s�Adds 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.
iRRR R*R0RtRitmargini(sbulletsoptionsfields
definition(RtinsertR(R
R((s$/sys/lib/python/mercurial/minirst.pyt
addmarginss!(cCs�d|d}|ddjodSn�|ddjo'|d7}|d|i|d �SnL|dd
jo|d|i|d �Sn|ddjot||d d}||d
d}ditti|d d��}d|ti|d|d|d|�fSn�|}}ditti|d ��}|ddjo|d}|d}n(|ddjo||dd}nti|d|d|d|�SdS(s"Format a block according to width.t RRR5R4Rs s
RRR0iR1is%s
%sR!tinitial_indenttsubsequent_indentRs- R R*N(soptionsfield(tjointmaptstrRttextwraptfill(RR!Rttermt defindentRt
initindentt subindent((s$/sys/lib/python/mercurial/minirst.pytformatblocks2
#
cs}t|�}t|�}t|�}t|�}t|�}t|�}t|�}t|�}di�fd�|D��S(s-Parse and format the text according to width.s
c3s"x|]}t|��VqWdS(N(RD(Rtb(R!(s$/sys/lib/python/mercurial/minirst.pys <genexpr>As( RRRRR)R/R3R7R;(RR!R
((R!s$/sys/lib/python/mercurial/minirst.pytformat7st__main__(tpprintcCs'||�}d|iGHt|�H|S(Ns
*** after %s:(t__name__RH(tfuncR
((s$/sys/lib/python/mercurial/minirst.pytdebugGs
is
ccs"x|]}t|d�VqWdS(iN(RD(RRE((s$/sys/lib/python/mercurial/minirst.pys <genexpr>Ws(t__doc__tretsysR>RRRRtcompileR"R)R+R/R3R7RDRFRIRHRKtopentargvtreadRR
R;(((s$/sys/lib/python/mercurial/minirst.pys<module> s4$ 3 ! $ !
|