U
    yag
$  ã                   @   s`   d Z ddlmZ ddlmZ ddlmZ dZdZdZ	eee	fZ
dd	„ Zd
d„ ZG dd„ dƒZdS )z# Tablib - reStructuredText Support
é    )Úzip_longest)Úmedian)ÚTextWrapperÚleftÚcenterÚrightc                 C   s   t | tƒr|  d¡S t| ƒS )Nzutf-8)Ú
isinstanceÚbytesÚdecodeÚstr)Úvalue© r   úG/var/www/html/myvenv/lib/python3.8/site-packages/tablib/formats/_rst.pyÚto_str   s    

r   c                 C   s"   | rt dd„ |  ¡ D ƒdd�S dS )z}
    Return the length of the longest word in `text`.

    >>> _max_word_len('Python Module for Tabular Datasets')
    8
    c                 s   s   | ]}t |ƒV  qd S ©N©Úlen)Ú.0Úwordr   r   r   Ú	<genexpr>   s     z _max_word_len.<locals>.<genexpr>r   )Údefault)ÚmaxÚsplit)Útextr   r   r   Ú_max_word_len   s    r   c                   @   sˆ   e Zd ZdZdZdZedd„ ƒZedefdd„ƒZ	eed	fd
d„ƒZ
eddd„ƒZeddd„ƒZedd„ ƒZedd„ ƒZedd„ ƒZdS )Ú
ReSTFormatÚrst)r   éP   c           	      C   sÀ   |j r(dd„ |j D ƒ}dd„ |j D ƒ}n(dd„ t|jƒD ƒ}dd„ t|jƒD ƒ}|jD ]`}tt|dƒrn| ¡ n|ƒ}t|ƒD ]8\}}t|ƒ}||  	t
|ƒ¡ t|| t|ƒƒ||< q|qV||fS )zn
        Returns a list of string lengths of each column, and a list of
        maximum word lengths.
        c                 S   s   g | ]}t |ƒg‘qS r   r   ©r   Úhr   r   r   Ú
<listcomp>+   s     z9ReSTFormat._get_column_string_lengths.<locals>.<listcomp>c                 S   s   g | ]}t |ƒ‘qS r   )r   r   r   r   r   r    ,   s     c                 S   s   g | ]}g ‘qS r   r   ©r   Ú_r   r   r   r    .   s     c                 S   s   g | ]}d ‘qS )r   r   r!   r   r   r   r    /   s     Úvalues)ÚheadersÚrangeÚwidthÚdictÚiterÚhasattrr#   Ú	enumerater   Úappendr   r   r   )	ÚclsÚdatasetÚcolumn_lengthsÚ	word_lensÚrowr#   ÚiÚvalr   r   r   r   Ú_get_column_string_lengths$   s    
z%ReSTFormat._get_column_string_lengthsú|c                    sÊ   ˆt krtd d t ¡¡ƒ‚‡fdd„‰ |r4|d nd‰|rDd| nd‰d| d ‰g }t|ˆƒD ]*\}}||_t|ƒ}	| |	¡}
| |
¡ qbt	|ddiŽ}‡ ‡fdd	„|D ƒ}‡‡‡fd
d„|D ƒ}|S )zJ
        Returns a table row of wrapped values as a list of lines
        z&Value of "justify" must be one of "{}"z", "c                    s2   ˆ t kr|  |¡S ˆ tkr$|  |¡S |  |¡S d S r   )ÚJUSTIFY_LEFTÚljustÚJUSTIFY_CENTERr   Úrjust)Ztext_Zwidth_©Újustifyr   r   ÚjustB   s
    

z&ReSTFormat._row_to_lines.<locals>.justú Ú Ú	fillvaluec                 3   s&   | ]}‡ ‡fd d„t |ƒD ƒV  qdS )c                 3   s    | ]\}}ˆ |ˆ| ƒV  qd S r   r   )r   r1   Z	cell_line©r;   Úwidthsr   r   r   T   s     z5ReSTFormat._row_to_lines.<locals>.<genexpr>.<genexpr>N)r*   ©r   Úliner?   r   r   r   S   s   ÿz+ReSTFormat._row_to_lines.<locals>.<genexpr>c                    s"   g | ]}d   ˆ ˆ  |¡ˆf¡‘qS )r=   )ÚjoinrA   )ÚlpadÚpadÚrpadr   r   r    W   s     z,ReSTFormat._row_to_lines.<locals>.<listcomp>)
ÚJUSTIFY_VALUESÚ
ValueErrorÚformatrC   Úzipr&   r   Úwrapr+   r   )r,   r#   r@   ÚwrapperÚsepr:   Úcellsr   r&   r   ÚcellÚlinesr   )r;   r:   rD   rE   rF   r@   r   Ú_row_to_lines8   s(    ÿ
þzReSTFormat._row_to_linesé   c                    s†   |   |¡\}}dd„ |D ƒ}t|ƒ‰ˆˆ ˆt|ƒ  krN‡ ‡fdd„|D ƒ}ndd„ |D ƒ}‡fdd„|D ƒ}dd„ t||ƒD ƒ}|S )zw
        Returns a list of column widths proportional to the median length
        of the text in their cells.
        c                 S   s   g | ]}t t|ƒƒ‘qS r   )Úintr   ©r   Zlensr   r   r   r    a   s     z1ReSTFormat._get_column_widths.<locals>.<listcomp>c                 3   s   | ]}ˆ | ˆ V  qd S r   r   rT   )Úmax_table_widthÚtotalr   r   r   d   s     z0ReSTFormat._get_column_widths.<locals>.<genexpr>c                 s   s   | ]
}|V  qd S r   r   rT   r   r   r   r   f   s     c                 3   s"   | ]}|ˆ kr|ˆ  n|V  qd S r   r   ©r   Úw©Úpad_lenr   r   r   h   s     c                 S   s   g | ]\}}t ||ƒ‘qS r   )r   )r   rX   Úlr   r   r   r    j   s     )r3   Úsumr   rJ   )r,   r-   rU   rZ   Zstr_lensr/   Zmedian_lensÚcolumn_widthsr   )rU   rZ   rV   r   Ú_get_column_widthsZ   s    zReSTFormat._get_column_widthsNc              	   C   sº   g }t ƒ }|dkr | j|dd�}d dd„ |D ƒ¡}| |¡ |jrj| | j|j||dtd�¡ | |¡ |jD ]4}t	t
|d	ƒrˆ| ¡ n|ƒ}| |  |||d¡¡ qp| |¡ d
 |¡S )zP
        Returns reStructuredText grid table representation of dataset.
        Né   rY   z  c                 S   s   g | ]}d | ‘qS ©ú=r   rW   r   r   r   r    v   s     z9ReSTFormat.export_set_as_simple_table.<locals>.<listcomp>r=   )rM   r:   r#   Ú
©r   r^   rC   r+   r$   ÚextendrQ   r7   r'   r(   r)   r#   )r,   r-   r]   rP   rL   Úborderr0   r#   r   r   r   Úexport_set_as_simple_tablem   s(    
û


z%ReSTFormat.export_set_as_simple_tablec           	      C   sÖ   g }t ƒ }|dkr|  |¡}dd dd„ |D ƒ¡ d }dd d	d„ |D ƒ¡ d
 }| |¡ |jrˆ| | j|j||td�¡ | |¡ |jD ]<}t	t
|dƒr¦| ¡ n|ƒ}| |  |||¡¡ | |¡ qŽd |¡S )a…  
        Returns reStructuredText grid table representation of dataset.


        >>> from tablib import Dataset
        >>> from tablib.formats import registry
        >>> bits = ((0, 0), (1, 0), (0, 1), (1, 1))
        >>> data = Dataset()
        >>> data.headers = ['A', 'B', 'A and B']
        >>> for a, b in bits:
        ...     data.append([bool(a), bool(b), bool(a * b)])
        >>> rst = registry.get_format('rst')
        >>> print(rst.export_set(data, force_grid=True))
        +-------+-------+-------+
        |   A   |   B   | A and |
        |       |       |   B   |
        +=======+=======+=======+
        | False | False | False |
        +-------+-------+-------+
        | True  | False | False |
        +-------+-------+-------+
        | False | True  | False |
        +-------+-------+-------+
        | True  | True  | True  |
        +-------+-------+-------+

        Nz+=z=+=c                 S   s   g | ]}d | ‘qS r`   r   rW   r   r   r   r    ©   s     z7ReSTFormat.export_set_as_grid_table.<locals>.<listcomp>z=+z+-z-+-c                 S   s   g | ]}d | ‘qS )ú-r   rW   r   r   r   r    ª   s     z-+r9   r#   rb   rc   )	r,   r-   r]   rP   rL   Z
header_sepZrow_sepr0   r#   r   r   r   Úexport_set_as_grid_tableˆ   s(    

ü

z#ReSTFormat.export_set_as_grid_tablec                 C   sH   |dk	r t |ƒ}t|ƒ|kr dS |D ]}t |ƒ}t|ƒ|kr$ dS q$dS )a[  
        Use a simple table if the text in the first column is never wrapped


        >>> from tablib.formats import registry
        >>> rst = registry.get_format('rst')
        >>> rst._use_simple_table('menu', ['egg', 'bacon'], 10)
        True
        >>> rst._use_simple_table(None, ['lobster thermidor', 'spam'], 10)
        False

        NFT)r   r   )r,   Zhead0Zcol0Zwidth0rO   r   r   r   Ú_use_simple_table¼   s    zReSTFormat._use_simple_tablec                 K   s|   |j s
dS | dd¡}| d| j¡}|  ||¡}|  |jrD|jd nd| d¡|d ¡}|rl|sl|  ||¡S |  ||¡S dS )a†  
        Returns reStructuredText table representation of dataset.

        Returns a simple table if the text in the first column is never
        wrapped, otherwise returns a grid table.


        >>> from tablib import Dataset
        >>> bits = ((0, 0), (1, 0), (0, 1), (1, 1))
        >>> data = Dataset()
        >>> data.headers = ['A', 'B', 'A and B']
        >>> for a, b in bits:
        ...     data.append([bool(a), bool(b), bool(a * b)])
        >>> table = data.rst
        >>> table.split('\n') == [
        ...     '=====  =====  =====',
        ...     '  A      B    A and',
        ...     '                B  ',
        ...     '=====  =====  =====',
        ...     'False  False  False',
        ...     'True   False  False',
        ...     'False  True   False',
        ...     'True   True   True ',
        ...     '=====  =====  =====',
        ... ]
        True

        r=   Ú
force_gridFrU   r   N)	r'   ÚgetÚMAX_TABLE_WIDTHr^   ri   r$   Zget_colrf   rh   )r,   r-   Úkwargsrj   rU   r]   Zuse_simple_tabler   r   r   Ú
export_setÔ   s    ýzReSTFormat.export_setc                    s   d  ‡ fdd„|jD ƒ¡S )z—
        reStructuredText representation of a Databook.

        Tables are separated by a blank line. All tables use the grid
        format.
        z

c                 3   s   | ]}ˆ j |d d�V  qdS )T)rj   N)rn   )r   r-   ©r,   r   r   r   
  s   ÿz)ReSTFormat.export_book.<locals>.<genexpr>)rC   Z	_datasets)r,   Zdatabookr   ro   r   Úexport_book  s    ÿzReSTFormat.export_book)N)N)Ú__name__Ú
__module__Ú__qualname__ÚtitleÚ
extensionsrl   Úclassmethodr3   r5   rQ   r^   rf   rh   ri   rn   rp   r   r   r   r   r      s&   
!3

-r   N)Ú__doc__Ú	itertoolsr   Ú
statisticsr   Útextwrapr   r5   r7   ZJUSTIFY_RIGHTrG   r   r   r   r   r   r   r   Ú<module>   s   

