U
    ôDk\^  ã                   @   s€   d Z ddlmZ ddlmZ ddlmZ ddlmZ ddlm	Z	 dd	l
Z
dZdZdZG d
d„ deƒZG dd„ deƒZdd„ Zd	S )aŽ  
Tables Extension for Python-Markdown
====================================

Added parsing of tables to Python-Markdown.

See <https://Python-Markdown.github.io/extensions/tables>
for documentation.

Original code Copyright 2009 [Waylan Limberg](http://achinghead.com)

All changes Copyright 2008-2014 The Python Markdown Project

License: [BSD](http://www.opensource.org/licenses/bsd-license.php)

é    )Úabsolute_import)Úunicode_literalsé   )Ú	Extensioné   )ÚBlockProcessor)ÚetreeNc                       sd   e Zd ZdZe d¡Ze d¡Z‡ fdd„Zdd„ Z	dd	„ Z
d
d„ Zdd„ Zdd„ Zdd„ Z‡  ZS )ÚTableProcessorz Process Tables. z"(?:(\\\\)|(\\`+)|(`+)|(\\\|)|(\|))z(?<!\\)(?:\\\\)*\|$c                    s    d| _ d| _tt| ƒ |¡ d S )NFÚ )ÚborderÚ	separatorÚsuperr	   Ú__init__)ÚselfÚparser©Ú	__class__© ú</usr/lib/python3/dist-packages/markdown/extensions/tables.pyr   #   s    zTableProcessor.__init__c           	      C   s   d}dd„ |  d¡D ƒ}t|ƒdkr|d }t| _| d¡rL|  jtO  _| j |¡dk	rj|  jtO  _|  	|¡}t|ƒ}|dk}|sØ|dkrØ| jrØt
dt|ƒƒD ]2}||  d¡}|sÎ| j || ¡dk	}|s¤ qØq¤|r|  	|d ¡}t|ƒ|kotd	 |¡ƒtd
ƒk}|r|| _|S )z©
        Ensure first two rows (column header and separator row) are valid table rows.

        Keep border check and separator row do avoid repeating the work.
        Fc                 S   s   g | ]}|  d ¡‘qS )ú )Ústrip)Ú.0Úrowr   r   r   Ú
<listcomp>/   s     z'TableProcessor.test.<locals>.<listcomp>Ú
r   r   ú|Nr
   z|:- )ÚsplitÚlenÚ	PIPE_NONEr   Ú
startswithÚ	PIPE_LEFTÚRE_END_BORDERÚsearchÚ
PIPE_RIGHTÚ
_split_rowÚrangeÚsetÚjoinr   )	r   ÚparentÚblockZis_tableÚrowsZheader0r   Zrow0_lenÚindexr   r   r   Útest(   s2    

$zTableProcessor.testc                 C   s  |  d¡ d¡}|d  d¡}t|ƒdk r.g n
|dd… }g }| jD ]d}| d¡}| d¡rr| d¡rr| d¡ qD| d¡rˆ| d	¡ qD| d¡rž| d
¡ qD| d¡ qDt 	|d¡}t 	|d¡}	|  
||	|¡ t 	|d¡}
t|ƒdkrö|  |
|¡ n|D ]}|  
| d¡|
|¡ qúdS )z& Parse a table block and build table. r   r   r   é   r   Nú:ÚcenterÚleftÚrightÚtableÚtheadÚtbody)Úpopr   r   r   r   r   ÚendswithÚappendr   Ú
SubElementÚ
_build_rowÚ_build_empty_row)r   r(   Zblocksr)   Úheaderr*   ÚalignÚcr2   r3   r4   r   r   r   r   ÚrunL   s*    



zTableProcessor.runc                 C   s2   t  |d¡}t|ƒ}|r.t  |d¡ |d8 }qdS )zBuild an empty row.ÚtrÚtdr   N)r   r8   r   )r   r(   r<   r?   Úcountr   r   r   r:   k   s
    zTableProcessor._build_empty_rowc           
   	   C   sŠ   t  |d¡}d}|jdkrd}|  |¡}t|ƒD ]T\}}t  ||¡}	z||  d¡|	_W n tk
rr   d|	_Y nX |r0|	 d|¡ q0dS )	z) Given a row of text, build table cells. r?   r@   r3   Zthr   r
   r<   N)	r   r8   Útagr$   Ú	enumerater   ÚtextÚ
IndexErrorr&   )
r   r   r(   r<   r?   rB   ZcellsÚiÚar=   r   r   r   r9   s   s    

zTableProcessor._build_rowc                 C   s4   | j r*| d¡r|dd… }| j d|¡}|  |¡S )z) split a row of text into list of cells. r   r   Nr
   )r   r   r!   ÚsubÚ_split)r   r   r   r   r   r$   …   s
    
zTableProcessor._split_rowc                 C   s  g }g }g }g }g }g }| j  |¡D ]¢}| d¡rl| t| d¡ƒd ¡ | | d¡| d¡d df¡ q$| d¡r¬| t| d¡ƒ¡ | | d¡| d¡d df¡ q$| d¡r$| | d¡¡ q$d}	t|ƒ}
|	|
k rnzn||	 ||	 d  }|dkrt‚||	d d…  |¡d }| ||	 d ||	|  d f¡ |	|d 7 }	W qÔ tk
rj   |	d7 }	Y qÔX qÔ|D ]j}d}|D ]J}||d k r˜ qÊn.|d |  kr¸|d kr~n n
d} qÊq~|sr| |¡ qrd}	|D ] }| ||	|… ¡ |d }	qæ| ||	d… ¡ |S )	z: split a row of text with some code into a list of cells. r   r   r-   r   é   NFT)	ÚRE_CODE_PIPESÚfinditerÚgroupr7   r   ÚstartÚendÚ
ValueErrorr+   )r   r   ÚelementsZpipesZticsZ
tic_pointsZ
tic_regionZ
good_pipesÚmÚposZtic_lenZtic_sizer+   ÚpipeZ	throw_outZregionr   r   r   rI      sV    
"
"


"$
zTableProcessor._split)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚreÚcompilerK   r!   r   r,   r>   r:   r9   r$   rI   Ú__classcell__r   r   r   r   r	      s   

$r	   c                   @   s   e Zd ZdZdd„ ZdS )ÚTableExtensionz Add tables to Markdown. c                 C   s2   d|j kr|j  d¡ |jj t|jƒdd¡ dS )z3 Add an instance of TableProcessor to BlockParser. r   r2   éK   N)ZESCAPED_CHARSr7   r   ÚblockprocessorsÚregisterr	   )r   Zmdr   r   r   ÚextendMarkdownÙ   s    
zTableExtension.extendMarkdownN)rU   rV   rW   rX   r`   r   r   r   r   r\   Ö   s   r\   c                  K   s
   t f | ŽS )N)r\   )Úkwargsr   r   r   ÚmakeExtensionà   s    rb   )rX   Z
__future__r   r   r
   r   r^   r   Úutilr   rY   r   r    r#   r	   r\   rb   r   r   r   r   Ú<module>   s    :
