o
    1Ö_’+  ã                   @   sÔ   d Z dZddlZddlZddlZddlZddlmZmZm	Z	 ddlm
Z
mZ ddlmZmZ ddlmZmZm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jƒZdZddd„ZdS )zø
Transforms for PEP processing.

- `Headers`: Used to transform a PEP's initial RFC-2822 header.  It remains a
  field list, but some entries get processed.
- `Contents`: Auto-inserts a table of contents.
- `PEPZero`: Special processing for PEP 0.
ÚreStructuredTexté    N)ÚnodesÚutilsÚ	languages)ÚApplicationErrorÚ	DataError)Ú	TransformÚTransformError)ÚpartsÚ
referencesÚmiscc                   @   sD   e Zd ZdZdZdZdZe dej	¡dfe d¡dffZ
dd	„ Zd
S )ÚHeadersz<
    Process fields in a PEP's initial RFC-2822 header.
    ih  zpep-%04dz3http://hg.python.org/peps/file/default/pep-%04d.txtz\$RCSfile: (.+),v \$$z\1z\$[a-zA-Z]+: (.+) \$$c                 C   s  t | jƒs	tdƒ‚| jd }t|tjƒrd|d vrtdƒ‚d }|D ]r}|d  ¡  ¡ dkr”|d  ¡ }zt|ƒ}| j	| }W nR t
y‘   |}d }| jjjd| |d	�}| j |¡}tj||pad
|d�}| j |¡}	| |	¡ t |d ƒr‚|g|d d d d …< n|d  t dd|¡7  < Y nw  nq"|d u r�tdƒ‚|dkr³t t¡}
| j d|
¡ | j |
¡ t |ƒdk sÅ|d d  ¡  ¡ dkrÉtdƒ‚|D �]=}|d  ¡  ¡ }|d }t |ƒdkrêtd|jdd� ƒ‚t |ƒdk�rt|d tjƒ�std|jdd� ƒ‚n9|dk�r=zt dt t | jd ¡d ¡¡}W n t�y)   d}Y nw |�r<|t ddtjd||d�¡7 }nqË|d }|dk�r\|D ]}t|tjƒ�rY| t|ƒ¡ �qIqË|dk�rw|D ]}t|tjƒ�rt| t||ƒ¡ �qcqË|dv �r¶g }t d¡}t  !d| ¡ ¡D ]}t|ƒ}| "tj||| jj#j$| j%|  d�¡ | "|¡ �q‹|d d… |d d …< qË|dk�r×t& '|| j(¡ |�rÖ| ¡ }tjd||d�g|d d …< qË|d k�rø| ¡ }| jj#j$| j%d!  }tjd||d�g|d d …< qË|d"k�r	t |ƒ�r	t& '|| j(¡ qËd S )#NzDocument tree is empty.r   Úrfc2822ÚclasseszADocument does not begin with an RFC-2822 header; it is not a PEP.Úpepé   z?"PEP" header must contain an integer; "%s" is an invalid value.)Ú	base_nodez(none))ÚrefidÚ z3Document does not contain an RFC-2822 "PEP" header.é   Útitlez	No title!z4PEP header field body contains multiple elements:
%s)Úlevelz=PEP header field body may only contain a single paragraph:
%szlast-modifiedz%d-%b-%YÚsourceé   Úunknown©ÚrefuriÚauthorzdiscussions-to)Úreplaceszreplaced-byÚrequiresú z,?\s+éÿÿÿÿzcontent-typeé   Úversion))ÚlenÚdocumentr   Ú
isinstancer   Ú
field_listÚastextÚlowerÚintÚpep_cvs_urlÚ
ValueErrorÚreporterÚwarningÚset_idÚproblematicÚadd_backrefÚ	paragraphÚpendingÚPEPZeroÚinsertÚnote_pendingÚpformatÚtimeÚstrftimeÚ	localtimeÚosÚstatÚOSErrorÚ	referenceÚreplace_selfÚ
mask_emailÚTextÚreÚsplitÚappendÚsettingsÚpep_base_urlÚpep_urlr   Úclean_rcs_keywordsÚrcs_keyword_substitutions)ÚselfÚheaderr   ÚfieldÚvalueÚcvs_urlÚmsgÚmsgidÚprbÚprbidr3   ÚnameÚbodyÚdateÚparaÚnodeÚnewbodyÚspaceÚrefpepÚpepnoÚpep_typeÚuri© r^   ú:/usr/lib/python3/dist-packages/docutils/transforms/peps.pyÚapply)   sÞ   

ÿþÿ
€òì
$

ÿ
þÿ
þÿÿ€
€þ
€þ

ÿþ
€
€ÊzHeaders.applyN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Údefault_priorityrG   r+   rB   ÚcompileÚ
IGNORECASErI   r`   r^   r^   r^   r_   r      s    þr   c                   @   ó   e Zd ZdZdZdd„ ZdS )ÚContentsz~
    Insert an empty table of contents topic and a transform placeholder into
    the document after the RFC 2822 header.
    i|  c                 C   s    t  | jjj| jj¡}|jd }t d|¡}tj	d|dgd�}t 
|¡}| j |¡s1|d  |¡ | j |¡ t tj¡}||7 }| j d|¡ | j |¡ d S )NÚcontentsr   )r   Únamesr   )r   Úget_languager%   rE   Úlanguage_coder-   Úlabelsr   r   ÚtopicÚfully_normalize_nameÚhas_namerD   Únote_implicit_targetr3   r
   ri   r5   r6   )rJ   ÚlanguagerS   r   ro   r3   r^   r^   r_   r`   •   s   ÿ

zContents.applyN©ra   rb   rc   rd   re   r`   r^   r^   r^   r_   ri   Œ   s    ri   c                   @   s$   e Zd ZdZdZdd„ Zdd„ ZdS )ÚTargetNotesz¶
    Locate the "References" section, insert a placeholder for an external
    target footnote insertion transform at the end, and schedule the
    transform to run immediately.
    i  c                 C   s   | j }t|ƒd }d  }}|dkrDt|| tjƒrD|| d  ¡  ¡  ¡ }d|v r.|| }nd|v r4|}|d8 }|dkrDt|| tjƒs|set ¡ }|t dd¡7 }| 	|¡ |r`| 
||¡ n| |¡ t tj¡}| |¡ | j  |d¡ tjtjd| jid�}| |¡ | j  |d¡ d S )	Nr   r   r   Ú	copyrightr   Ú
ReferencesÚcallback)Údetails)r%   r$   r&   r   Úsectionr(   r)   rC   r   r/   r5   rD   r3   r   ru   r6   r   ÚCallBackÚcleanup_callback)rJ   ÚdocÚiÚrefsectrv   Útitle_wordsr3   r^   r^   r_   r`   ¯   s6   ù


ÿ
zTargetNotes.applyc                 C   s&   t |jƒdkr|jj |j¡ dS dS )z�
        Remove an empty "References" section.

        Called after the `references.TargetNotes` transform is complete.
        r   N)r$   ÚparentÚremove)rJ   r3   r^   r^   r_   r|   Í   s   ÿzTargetNotes.cleanup_callbackN)ra   rb   rc   rd   re   r`   r|   r^   r^   r^   r_   ru   ¥   s
    ru   c                   @   rh   )r4   z'
    Special processing for PEP 0.
    iø  c                 C   s*   t | jƒ}| j |¡ | jj | j¡ d S ©N)ÚPEPZeroSpecialr%   ÚwalkÚ	startnoder�   r‚   )rJ   Úvisitorr^   r^   r_   r`   ß   s   
zPEPZero.applyNrt   r^   r^   r^   r_   r4   ×   s    r4   c                   @   sN   e Zd ZdZejZdd„ Zdd„ Zdd„ Zdd	„ Z	d
d„ Z
dd„ Zdd„ ZdS )r„   z´
    Perform the special processing needed by PEP 0:

    - Mask email addresses.

    - Link PEP numbers in the second column of 4-column tables to the PEPs
      themselves.
    c                 C   s   d S rƒ   r^   ©rJ   rW   r^   r^   r_   Úunknown_visitò   s   zPEPZeroSpecial.unknown_visitc                 C   s   |  t|ƒ¡ d S rƒ   )r?   r@   rˆ   r^   r^   r_   Úvisit_referenceõ   s   zPEPZeroSpecial.visit_referencec                 C   s   d|d v r	t j‚d S )Nr   r   )r   ÚSkipNoderˆ   r^   r^   r_   Úvisit_field_listø   s   ÿzPEPZeroSpecial.visit_field_listc                 C   s   |d dk| _ d| _d S )NÚcolsé   r   )Ú	pep_tableÚentryrˆ   r^   r^   r_   Úvisit_tgroupü   s   
zPEPZeroSpecial.visit_tgroupc                 C   s8   |  j d7  _ | jr| j dkr|d  d¡ d S d S d S )Nr   r   r   Únum)r�   r�   rD   rˆ   r^   r^   r_   Úvisit_colspec   s   ÿzPEPZeroSpecial.visit_colspecc                 C   s
   d| _ d S )Nr   )r�   rˆ   r^   r^   r_   Ú	visit_row  s   
zPEPZeroSpecial.visit_rowc                 C   sÀ   |  j d7  _ | jrV| j dkrXt|ƒdkrZ|d  d¡ |d }t|tjƒr\t|ƒdkr^| ¡ }zt|ƒ}| j	j
j| j|  }tj|||d�|d< W d S  tyU   Y d S w d S d S d S d S d S )Nr   r   r   r’   r   r   )r�   r�   r$   rD   r&   r   r2   r(   r*   r%   rE   rF   rG   r>   r,   )rJ   rW   ÚpÚtextr   Úrefr^   r^   r_   Úvisit_entry  s"   ÿÿözPEPZeroSpecial.visit_entryN)ra   rb   rc   rd   r   rG   r‰   rŠ   rŒ   r‘   r“   r”   r˜   r^   r^   r^   r_   r„   å   s    	r„   )zpeps@python.orgzpython-list@python.orgzpython-dev@python.orgc                 C   sŒ   |   d¡rD| d  d¡rD| d dd… tv r| d }n|  ¡  dd¡}tjd|d	d
�}|du r1|S | d  d| 7  < |g| dd…< | S | S )a¨  
    Mask the email address in `ref` and return a replacement node.

    `ref` is returned unchanged if it contains no email address.

    For email addresses such as "user@host", mask the address as "user at
    host" (text) to thwart simple email address harvesters (except for those
    listed in `non_masked_addresses`).  If a PEP number (`pepno`) is given,
    return a reference including a default email subject.
    r   zmailto:r   Nr   ú@z&#32;&#97;t&#32;r   Úhtml)Úformatz?subject=PEP%%20%s)ÚhasattrÚ
startswithÚnon_masked_addressesr(   Úreplacer   Úraw)r—   r[   ÚreplacementÚreplacement_textr^   r^   r_   r@     s   
r@   rƒ   )rd   Ú__docformat__Úsysr;   rB   r8   Údocutilsr   r   r   r   r   Údocutils.transformsr   r	   r
   r   r   r   ri   ru   r4   ÚSparseNodeVisitorr„   rž   r@   r^   r^   r^   r_   Ú<module>   s"   	r23