
­­­­­­­­­­­­­­­­­­
<!DOCTYPE html>
<html>
3
F`Q                 @   s`  d Z ddlZddlZddlZddlZddlZddlZddlZddlZej	d dkZ
e
rxeZeZeZeZeZddlmZ nejZejZeZddlmZ e
rej	d dkrddlmZ nddlmZ dZdZdZdZdZ d	Z!d
Z"dZ#ej$dZ%dd Z&G dd de'Z(dd Z)dd Z*d"ddZ+dd Z,G dd deZ-dd Z.dd Z/dd  Z0e1d!kr\e0  dS )#z0.7.2    N   )
HTMLParser      )escape
            z\[[0-9;]*mc             C   s,   | j d}t|}tdd |D }||fS )N
c             S   s   g | ]}t |qS  )_str_block_width).0liner   r   !/usr/lib/python3.6/prettytable.py
<listcomp>O   s    z_get_size.<locals>.<listcomp>)splitlenmax)textlinesZheightwidthr   r   r   	_get_sizeL   s    
r   c               @   sB  e Zd ZdddZdd Zdd Zdd	 Zd
d Zer@dd Z	ndd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 ZeeeZd5d6 Zd7d8 Z eee Z!d9d: Z"d;d< Z#ee"e#Z$d=d> Z%d?d@ Z&ee%e&Z'dAdB Z(dCdD Z)ee(e)Z*dEdF Z+dGdH Z,ee+e,Z-dIdJ Z.dKdL Z/ee.e/Z0dMdN Z1dOdP Z2ee1e2Z3dQdR Z4dSdT Z5ee4e5Z6dUdV Z7dWdX Z8ee7e8Z9dYdZ Z:d[d\ Z;ee:e;Z<d]d^ Z=d_d` Z>ee=e>Z?dadb Z@dcdd ZAee@eAZBdedf ZCdgdh ZDeeCeDZEdidj ZFdkdl ZGeeFeGZHdmdn ZIdodp ZJeeIeJZKdqdr ZLdsdt ZMeeLeMZNdudv ZOdwdx ZPeeOePZQdydz ZRd{d| ZSeeReSZTd}d~ ZUdd ZVeeUeVZWdd ZXdd ZYeeXeYZZdd Z[dd Z\ee[e\Z]dd Z^dd Z_ee^e_Z`dd Zadd ZbeeaebZcdd Zddd ZeeedeeZfdd Zgdd ZheegehZidd Zjdd Zkdd Zldd Zmdd Zndd Zodd Zpdd ZqdddZrdd Zsdd Ztdd Zudd Zvdd Zwdd Zxdd Zydd Zzdd Z{dd Z|dd Z}ddĄ Z~ddƄ ZddȄ Zddʄ Zdd̄ ZdS )PrettyTableNc             K   sZ  |j dd| _g | _i | _i | _i | _g | _|r8|| _ng | _dj	 | _
| j
jdj	  | j
jdj	  x0| j
D ]&}||kr| j|||  qpd||< qpW |d pd| _|d	 pd| _|d
 pd| _|d d'kr|d | _nd| _|d pd| _|d d(kr
|d | _nd| _|d pt| _|d p,t| _|d p<d| _|d d)krZ|d | _nd| _|d ppdd | _|d pi | _|d pi | _|d pd| _|d pd| _|d pd| _|d p| jd| _ |d p| jd | _!|d! p| jd"| _"|d# d*kr |d# | _#nd| _#|d$ p2d| _$|d% pBd| _%|d& pRi | _&dS )+a  Return a new PrettyTable instance

        Arguments:

        encoding - Unicode encoding scheme used to decode any encoded input
        field_names - list or tuple of field names
        fields - list or tuple of field names to include in displays
        start - index of first data row to include in output
        end - index of last data row to include in output PLUS ONE (list slice style)
        header - print a header showing field names (True or False)
        header_style - stylisation to apply to field names in header ("cap", "title", "upper", "lower" or None)
        border - print a border around the table (True or False)
        hrules - controls printing of horizontal rules after rows.  Allowed values: FRAME, HEADER, ALL, NONE
        vrules - controls printing of vertical rules between columns.  Allowed values: FRAME, ALL, NONE
        int_format - controls formatting of integer data
        float_format - controls formatting of floating point data
        padding_width - number of spaces on either side of column data (only used if left and right paddings are None)
        left_padding_width - number of spaces on left hand side of column data
        right_padding_width - number of spaces on right hand side of column data
        vertical_char - single character string used to draw vertical lines
        horizontal_char - single character string used to draw horizontal lines
        junction_char - single character string used to draw line junctions
        sortby - name of field to sort rows by
        sort_key - sorting key function, applied to data points before sorting
        valign - default valign for each row (None, "t", "m" or "b")
        reversesort - True or False to sort in descending or ascending orderencodingzUTF-8zZstart end fields header border sortby reversesort sort_key attributes format hrules vruleszLint_format float_format padding_width left_padding_width right_padding_widthzQvertical_char horizontal_char junction_char header_style valign xhtml print_emptyNstartr   endfieldsheaderTFheader_styleborderhrulesvrulessortbyreversesortsort_keyc             S   s   | S )Nr   )xr   r   r   <lambda>   s    z&PrettyTable.__init__.<locals>.<lambda>
int_formatfloat_formatpadding_widthr   left_padding_widthright_padding_widthvertical_char|horizontal_char-junction_char+print_emptyformatxhtml
attributes)TF)TF)TF)TF)'getr   _field_names_align_valign
_max_width_rowsfield_names_widthsr   _optionsextend_validate_option_start_end_fields_header_header_style_borderFRAME_hrulesALL_vrules_sortby_reversesort	_sort_key_int_format_float_format_padding_width_left_padding_width_right_padding_width_unicode_vertical_char_horizontal_char_junction_char_print_empty_formatZ_xhtml_attributes)selfr=   kwargsoptionr   r   r   __init__T   s^    
zPrettyTable.__init__c             C   s.   t |tst|}t |ts*t|| jd}|S )Nstrict)
isinstance
basestringstrunicoder   )r[   valuer   r   r   rT      s
    

zPrettyTable._unicodec             C   s   |t | }|dkr ||d  S |dkr4|d | S |d rt |d rh|d d | |d d d  S |d d d | |d d  S n|d d | |d d  S d S )Nl rr   r   )r   )r[   r   r   alignZexcessr   r   r   _justify   s     "zPrettyTable._justifyc             C   sP   |dkrt | jS |dkrD| jr*t | jS | jr>t | jd S dS nt|d S )NrowcountZcolcountr   )r   r<   r8   AttributeError)r[   namer   r   r   __getattr__   s    

zPrettyTable.__getattr__c             C   s   t  }| j|_x(| jD ]}t|d| t| d|  qW t|dt| d t|trtxJ| j| D ]}|j| q`W n,t|t	r|j| j|  nt
dt| |S )N_r9   z0Index %s is invalid, must be an integer or slice)r   r=   r?   setattrgetattrr`   slicer<   add_rowint	Exceptionrb   )r[   indexnewattrrowr   r   r   __getitem__   s    

zPrettyTable.__getitem__c             C   s   | j  S )N)__unicode__)r[   r   r   r   __str__   s    zPrettyTable.__str__c             C   s   | j  j| jS )N)rz   encoder   )r[   r   r   r   r{      s    c             C   s   | j  S )N)
get_string)r[   r   r   r   rz      s    zPrettyTable.__unicode__c             C   s4  |dkr| j | n|dkr.| j|| n|d	krD| j|| n|d
krZ| j|| n|dkrp| j|| n|dkr| j|| n|dkr| j|| n|dkr| j|| n~|dkr| j| nj|dkr| j	|| nT|dk r| j
|| n<|dkr| j|| n$|dkr$| j|| ntd| d S )Nr=   r   r   	max_widthr*   r+   r,   r4   r#   r%   r!   r"   r   r   r    r$   r5   r3   r   r(   r)   r-   r/   r1   r6   zUnrecognised option: %s!)r   r   r~   r*   r+   r,   r4   )r   r    r$   r5   r3   )r-   r/   r1   )_validate_field_names_validate_nonnegative_int_validate_field_name_validate_function_validate_hrules_validate_vrules_validate_all_field_names_validate_true_or_false_validate_header_style_validate_int_format_validate_float_format_validate_single_char_validate_attributesrt   )r[   r]   valr   r   r   rA      s6    


zPrettyTable._validate_optionc             C   s   | j rPyt|t| j kstW n. tk
rN   tdt|t| j f Y nX | jryt|t| jd ksrtW n2 tk
r   tdt|t| jd f Y nX yt|tt|kstW n tk
r   tdY nX d S )NzJField name list has incorrect number of values, (actual) %d!=%d (expected)r   zField names must be unique!)r8   r   AssertionErrorrt   r<   set)r[   r   r   r   r   r     s     $z!PrettyTable._validate_field_namesc             C   s2   y|dkst W n t k
r,   tdY nX d S )Ncaptitleupperlowerz;Invalid header style, use cap, title, upper, lower or None!)r   r   r   r   N)r   rt   )r[   r   r   r   r   r   0  s    z"PrettyTable._validate_header_stylec             C   s6   y|dkst W n  t k
r0   td| Y nX d S )Nre   crg   z'Alignment %s is invalid, use l, c or r!)re   r   rg   )r   rt   )r[   r   r   r   r   _validate_align6  s    zPrettyTable._validate_alignc             C   s6   y|dkst W n  t k
r0   td| Y nX d S )Ntmbz-Alignment %s is invalid, use t, m, b or None!)r   r   r   N)r   rt   )r[   r   r   r   r   _validate_valign<  s    zPrettyTable._validate_valignc             C   sD   yt |dkstW n* tk
r>   td|| j|f Y nX d S )Nr   zInvalid value for %s: %s!)rs   r   rt   rT   )r[   rl   r   r   r   r   r   B  s    z%PrettyTable._validate_nonnegative_intc             C   s6   y|dkst W n  t k
r0   td| Y nX d S )NTFz-Invalid value for %s!  Must be True or False.)TF)r   rt   )r[   rl   r   r   r   r   r   H  s    z#PrettyTable._validate_true_or_falsec             C   sV   |dkrd S y$t |ttfks"t|j s.tW n  tk
rP   td| Y nX d S )N z8Invalid value for %s!  Must be an integer format string.)typerb   rc   r   isdigitrt   )r[   rl   r   r   r   r   r   N  s    z PrettyTable._validate_int_formatc             C   s   |dkrd S yvt |ttfks"td|ks.t|jd}t|dksHt|d dksd|d j sdt|d dks|d j stW n  tk
r   td| Y nX d S )Nr   .r   r   r   z5Invalid value for %s!  Must be a float format string.)r   rb   rc   r   r   r   r   rt   )r[   rl   r   bitsr   r   r   r   W  s    
 z"PrettyTable._validate_float_formatc             C   s8   yt |dstW n  tk
r2   td| Y nX d S )N__call__z*Invalid value for %s!  Must be a function.)hasattrr   rt   )r[   rl   r   r   r   r   r   d  s    zPrettyTable._validate_functionc             C   s>   y|t tttfkstW n  tk
r8   td| Y nX d S )Nz:Invalid value for %s!  Must be ALL, FRAME, HEADER or NONE.)rJ   rH   HEADERNONEr   rt   )r[   rl   r   r   r   r   r   j  s    zPrettyTable._validate_hrulesc             C   s<   y|t ttfkstW n  tk
r6   td| Y nX d S )Nz3Invalid value for %s!  Must be ALL, FRAME, or NONE.)rJ   rH   r   r   rt   )r[   rl   r   r   r   r   r   p  s    zPrettyTable._validate_vrulesc             C   s@   y|| j ks|d kstW n  tk
r:   td| Y nX d S )NzInvalid field name: %s!)r8   r   rt   )r[   rl   r   r   r   r   r   v  s    z PrettyTable._validate_field_namec             C   s@   yx|D ]}| j || qW W n tk
r:   tdY nX d S )Nz)fields must be a sequence of field names!)r   r   rt   )r[   rl   r   r&   r   r   r   r   |  s
    
z%PrettyTable._validate_all_field_namesc             C   s:   yt |dkstW n  tk
r4   td| Y nX d S )Nr   z4Invalid value for %s!  Must be a string of length 1.)r   r   rt   )r[   rl   r   r   r   r   r     s    z!PrettyTable._validate_single_charc             C   s4   yt |tstW n tk
r.   tdY nX d S )Nz4attributes must be a dictionary of name/value pairs!)r`   dictr   rt   )r[   rl   r   r   r   r   r     s    z PrettyTable._validate_attributesc             C   s   | j S )N)r8   )r[   r   r   r   _get_field_names  s    zPrettyTable._get_field_namesc                s$   fdd|D } j d|  jr2 jd d  }| _ jr|rx&t||D ]\}} j|  j|< qNW x>|D ]}| jkrp jj| qpW nx jD ]}d j|< qW  jo|rx&t||D ]\}} j|  j|< qW x@|D ]}| jkr jj| qW nx jD ]}d j|< qW d S )Nc                s   g | ]} j |qS r   )rT   )r   r&   )r[   r   r   r     s    z0PrettyTable._set_field_names.<locals>.<listcomp>r=   r   r   )rA   r8   r9   zippopr:   )r[   r   Z	old_namesZold_namenew_namefieldr   )r[   r   _set_field_names  s*    




zPrettyTable._set_field_namesc             C   s   | j S )N)r9   )r[   r   r   r   
_get_align  s    zPrettyTable._get_alignc             C   s(   | j | x| jD ]}|| j|< qW d S )N)r   r8   r9   )r[   r   r   r   r   r   
_set_align  s    
zPrettyTable._set_alignc             C   s   | j S )N)r:   )r[   r   r   r   _get_valign  s    zPrettyTable._get_valignc             C   s(   | j | x| jD ]}|| j|< qW d S )N)r   r8   r:   )r[   r   r   r   r   r   _set_valign  s    
zPrettyTable._set_valignc             C   s   | j S )N)r;   )r[   r   r   r   _get_max_width  s    zPrettyTable._get_max_widthc             C   s*   | j d| x| jD ]}|| j|< qW d S )Nr~   )rA   r8   r;   )r[   r   r   r   r   r   _set_max_width  s    zPrettyTable._set_max_widthc             C   s   | j S )zList or tuple of field names to include in displays

        Arguments:

        fields - list or tuple of field names to include in displays)rD   )r[   r   r   r   _get_fields  s    zPrettyTable._get_fieldsc             C   s   | j d| || _d S )Nr   )rA   rD   )r[   r   r   r   r   _set_fields  s    zPrettyTable._set_fieldsc             C   s   | j S )z{Start index of the range of rows to print

        Arguments:

        start - index of first data row to include in output)rB   )r[   r   r   r   
_get_start  s    zPrettyTable._get_startc             C   s   | j d| || _d S )Nr   )rA   rB   )r[   r   r   r   r   
_set_start  s    zPrettyTable._set_startc             C   s   | j S )zEnd index of the range of rows to print

        Arguments:

        end - index of last data row to include in output PLUS ONE (list slice style))rC   )r[   r   r   r   _get_end  s    zPrettyTable._get_endc             C   s   | j d| || _d S )Nr   )rA   rC   )r[   r   r   r   r   _set_end  s    zPrettyTable._set_endc             C   s   | j S )z_Name of field by which to sort rows

        Arguments:

        sortby - field name to sort by)rL   )r[   r   r   r   _get_sortby  s    zPrettyTable._get_sortbyc             C   s   | j d| || _d S )Nr#   )rA   rL   )r[   r   r   r   r   _set_sortby  s    zPrettyTable._set_sortbyc             C   s   | j S )zControls direction of sorting (ascending vs descending)

        Arguments:

        reveresort - set to True to sort by descending order, or False to sort by ascending order)rM   )r[   r   r   r   _get_reversesort  s    zPrettyTable._get_reversesortc             C   s   | j d| || _d S )Nr$   )rA   rM   )r[   r   r   r   r   _set_reversesort  s    zPrettyTable._set_reversesortc             C   s   | j S )zSorting key function, applied to data points before sorting

        Arguments:

        sort_key - a function which takes one argument and returns something to be sorted)rN   )r[   r   r   r   _get_sort_key	  s    zPrettyTable._get_sort_keyc             C   s   | j d| || _d S )Nr%   )rA   rN   )r[   r   r   r   r   _set_sort_key  s    zPrettyTable._set_sort_keyc             C   s   | j S )zControls printing of table header with field names

        Arguments:

        header - print a header showing field names (True or False))rE   )r[   r   r   r   _get_header  s    zPrettyTable._get_headerc             C   s   | j d| || _d S )Nr   )rA   rE   )r[   r   r   r   r   _set_header  s    zPrettyTable._set_headerc             C   s   | j S )zControls stylisation applied to field names in header

        Arguments:

        header_style - stylisation to apply to field names in header ("cap", "title", "upper", "lower" or None))rF   )r[   r   r   r   _get_header_style!  s    zPrettyTable._get_header_stylec             C   s   | j | || _d S )N)r   rF   )r[   r   r   r   r   _set_header_style(  s    
zPrettyTable._set_header_stylec             C   s   | j S )z~Controls printing of border around table

        Arguments:

        border - print a border around the table (True or False))rG   )r[   r   r   r   _get_border-  s    zPrettyTable._get_borderc             C   s   | j d| || _d S )Nr    )rA   rG   )r[   r   r   r   r   _set_border4  s    zPrettyTable._set_borderc             C   s   | j S )zControls printing of horizontal rules after rows

        Arguments:

        hrules - horizontal rules style.  Allowed values: FRAME, ALL, HEADER, NONE)rI   )r[   r   r   r   _get_hrules9  s    zPrettyTable._get_hrulesc             C   s   | j d| || _d S )Nr!   )rA   rI   )r[   r   r   r   r   _set_hrules@  s    zPrettyTable._set_hrulesc             C   s   | j S )zControls printing of vertical rules between columns

        Arguments:

        vrules - vertical rules style.  Allowed values: FRAME, ALL, NONE)rK   )r[   r   r   r   _get_vrulesE  s    zPrettyTable._get_vrulesc             C   s   | j d| || _d S )Nr"   )rA   rK   )r[   r   r   r   r   _set_vrulesL  s    zPrettyTable._set_vrulesc             C   s   | j S )zbControls formatting of integer data
        Arguments:

        int_format - integer format string)rO   )r[   r   r   r   _get_int_formatQ  s    zPrettyTable._get_int_formatc             C   s   x| j D ]}|| j|< qW d S )N)r8   rO   )r[   r   r   r   r   r   _set_int_formatW  s    zPrettyTable._set_int_formatc             C   s   | j S )zrControls formatting of floating point data
        Arguments:

        float_format - floating point format string)rP   )r[   r   r   r   _get_float_format]  s    zPrettyTable._get_float_formatc             C   s   x| j D ]}|| j|< qW d S )N)r8   rP   )r[   r   r   r   r   r   _set_float_formatc  s    zPrettyTable._set_float_formatc             C   s   | j S )zThe number of empty spaces between a column's edge and its content

        Arguments:

        padding_width - number of spaces, must be a positive integer)rQ   )r[   r   r   r   _get_padding_widthi  s    zPrettyTable._get_padding_widthc             C   s   | j d| || _d S )Nr*   )rA   rQ   )r[   r   r   r   r   _set_padding_widthp  s    zPrettyTable._set_padding_widthc             C   s   | j S )zThe number of empty spaces between a column's left edge and its content

        Arguments:

        left_padding - number of spaces, must be a positive integer)rR   )r[   r   r   r   _get_left_padding_widthu  s    z#PrettyTable._get_left_padding_widthc             C   s   | j d| || _d S )Nr+   )rA   rR   )r[   r   r   r   r   _set_left_padding_width|  s    z#PrettyTable._set_left_padding_widthc             C   s   | j S )zThe number of empty spaces between a column's right edge and its content

        Arguments:

        right_padding - number of spaces, must be a positive integer)rS   )r[   r   r   r   _get_right_padding_width  s    z$PrettyTable._get_right_padding_widthc             C   s   | j d| || _d S )Nr,   )rA   rS   )r[   r   r   r   r   _set_right_padding_width  s    z$PrettyTable._set_right_padding_widthc             C   s   | j S )zThe charcter used when printing table borders to draw vertical lines

        Arguments:

        vertical_char - single character string used to draw vertical lines)rU   )r[   r   r   r   _get_vertical_char  s    zPrettyTable._get_vertical_charc             C   s    | j |}| jd| || _d S )Nr-   )rT   rA   rU   )r[   r   r   r   r   _set_vertical_char  s    
zPrettyTable._set_vertical_charc             C   s   | j S )zThe charcter used when printing table borders to draw horizontal lines

        Arguments:

        horizontal_char - single character string used to draw horizontal lines)rV   )r[   r   r   r   _get_horizontal_char  s    z PrettyTable._get_horizontal_charc             C   s    | j |}| jd| || _d S )Nr/   )rT   rA   rV   )r[   r   r   r   r   _set_horizontal_char  s    
z PrettyTable._set_horizontal_charc             C   s   | j S )zThe charcter used when printing table borders to draw line junctions

        Arguments:

        junction_char - single character string used to draw line junctions)rW   )r[   r   r   r   _get_junction_char  s    zPrettyTable._get_junction_charc             C   s    | j |}| jd| || _d S )Nr-   )rT   rA   rW   )r[   r   r   r   r   _set_junction_char  s    
zPrettyTable._set_junction_charc             C   s   | j S )z~Controls whether or not HTML tables are formatted to match styling options

        Arguments:

        format - True or False)rY   )r[   r   r   r   _get_format  s    zPrettyTable._get_formatc             C   s   | j d| || _d S )Nr4   )rA   rY   )r[   r   r   r   r   _set_format  s    zPrettyTable._set_formatc             C   s   | j S )zControls whether or not empty tables produce a header and frame or just an empty string

        Arguments:

        print_empty - True or False)rX   )r[   r   r   r   _get_print_empty  s    zPrettyTable._get_print_emptyc             C   s   | j d| || _d S )Nr3   )rA   rX   )r[   r   r   r   r   _set_print_empty  s    zPrettyTable._set_print_emptyc             C   s   | j S )zA dictionary of HTML attribute name/value pairs to be included in the <table> tag when printing HTML

        Arguments:

        attributes - dictionary of attributes)rZ   )r[   r   r   r   _get_attributes  s    zPrettyTable._get_attributesc             C   s   | j d| || _d S )Nr6   )rA   rZ   )r[   r   r   r   r   _set_attributes  s    zPrettyTable._set_attributesc             C   sP   i }xF| j D ]<}||kr6| j|||  || ||< qt| d| ||< qW |S )Nrn   )r?   rA   rp   )r[   r\   optionsr]   r   r   r   _get_options  s    zPrettyTable._get_optionsc             C   sT   |t kr| j  n>|tkr$| j  n,|tkr6| j  n|tkrH| j  ntdd S )NzInvalid pre-set style!)	DEFAULT_set_default_styleMSWORD_FRIENDLY_set_msword_stylePLAIN_COLUMNS_set_columns_styleRANDOM_set_random_stylert   )r[   Zstyler   r   r   	set_style  s    



zPrettyTable.set_stylec             C   s@   d| _ d| _t| _t| _d| _d| _d| _d| _	d| _
d| _d S )NTr   r.   r0   r2   )r   r    rH   rI   rJ   rK   r*   r+   r,   r-   r/   r1   )r[   r   r   r   r     s    zPrettyTable._set_default_stylec             C   s.   d| _ d| _t| _d| _d| _d| _d| _d S )NTr   r.   )r   r    r   rI   r*   r+   r,   r-   )r[   r   r   r   r     s    zPrettyTable._set_msword_stylec             C   s"   d| _ d| _d| _d| _d| _d S )NTFr   r      )r   r    r*   r+   r,   )r[   r   r   r   r     s
    zPrettyTable._set_columns_stylec             C   s   t jd| _t jd| _t jttttf| _t jtttf| _	t j
dd| _t j
dd| _t jd| _t jd| _t jd| _d S )NTFr      z ~!@#$%^&*()_+|-=\{}[];':",./;<>?)TF)TF)randomZchoicer   r    rJ   rH   r   r   rI   rK   Zrandintr+   r,   r-   r/   r1   )r[   r   r   r   r     s    zPrettyTable._set_random_stylec             C   sf   | j r2t|t| j kr2tdt|t| j f | j sRdd tdt|D | _| jjt| dS )zAdd a row to the table

        Arguments:

        row - row of data, should be a list with as many elements as the table
        has fieldsz>Row has incorrect number of values, (actual) %d!=%d (expected)c             S   s   g | ]}d |d  qS )zField %dr   r   )r   nr   r   r   r   4  s    z'PrettyTable.add_row.<locals>.<listcomp>r   N)r8   r   rt   ranger=   r<   appendlist)r[   rx   r   r   r   rr   (  s
    	zPrettyTable.add_rowc             C   s4   |t | jd kr(td|t | jf | j|= dS )zDelete a row to the table

        Arguments:

        row_index - The index of the row you want to delete.  Indexing starts at 0.r   z4Cant delete row at index %d, table only has %d rows!N)r   r<   rt   )r[   Z	row_indexr   r   r   del_row7  s    zPrettyTable.del_rowr   r   c             C   s   t | jdt |fkr| j| | j| | jj| || j|< || j|< xdtdt |D ]6}t | j|d k r|| jjg  | j| j||  qZW nt	dt |t | jf dS )a  Add a column to the table.

        Arguments:

        fieldname - name of the field to contain the new column of data
        column - column of data, should be a list with as many elements as the
        table has rows
        align - desired alignment for this column - "l" for left, "c" for centre and "r" for right
        valign - desired vertical alignment for new columns - "t" for top, "m" for middle and "b" for bottomr   r   z2Column length %d does not match number of rows %d!N)
r   r<   r   r   r8   r   r9   r:   r   rt   )r[   	fieldnamecolumnrh   valignir   r   r   
add_columnC  s    



zPrettyTable.add_columnc             C   s
   g | _ dS )z?Delete all rows from the table but keep the current field namesN)r<   )r[   r   r   r   
clear_rows\  s    zPrettyTable.clear_rowsc             C   s   g | _ g | _g | _dS )zWDelete all rows and field names from the table, maintaining nothing but styling optionsN)r<   r8   r>   )r[   r   r   r   clearb  s    zPrettyTable.clearc             C   s
   t j| S )N)copydeepcopy)r[   r   r   r   r   n  s    zPrettyTable.copyc             C   sd   t |tr.|| jkr.| jd| j|  | }n,t |trZ|| jkrZ| jd| j|  | }| j|S )Nz%%%sdz%%%sf)r`   rs   rO   rT   floatrP   )r[   r   rd   r   r   r   _format_valueu  s
    zPrettyTable._format_valuec             C   s   |d rdd | j D }nt| jdg }xx|D ]p}xjt|D ]^\}}| j| }|| jkrt|| tt|d | j| ||< q>t|| t|d ||< q>W q0W || _d S )Nr   c             S   s   g | ]}t |d  qS )r   )r   )r   r   r   r   r   r   ~  s    z/PrettyTable._compute_widths.<locals>.<listcomp>r   )	r8   r   r=   	enumerater~   r   minr   r>   )r[   rowsr   Zwidthsrx   ru   rd   r   r   r   r   _compute_widths|  s    


("zPrettyTable._compute_widthsc             C   sD   |d d k	r|d }n|d }|d d k	r4|d }n|d }||fS )Nr+   r*   r,   r   )r[   r   lpadrpadr   r   r   _get_padding_widths  s    

zPrettyTable._get_padding_widthsc                sn   t j| j|d |d  }|d rj| jj|d   fdd|D }|j|d |d d d	d |D }|S )
zReturn only those data rows that should be printed, based on slicing and sorting.

        Arguments:

        options - dictionary of option settings.r   r   r#   c                s   g | ]}|  g| qS r   r   )r   rx   )	sortindexr   r   r     s    z)PrettyTable._get_rows.<locals>.<listcomp>r$   r%   )reversekeyc             S   s   g | ]}|d d qS )r   Nr   )r   rx   r   r   r   r     s    )r   r   r<   r8   ru   sort)r[   r   r   r   )r   r   	_get_rows  s    zPrettyTable._get_rowsc                s    fddt  j|D S )Nc                s   g | ]\}} j ||qS r   )r   )r   r   rd   )r[   r   r   r     s    z+PrettyTable._format_row.<locals>.<listcomp>)r   r8   )r[   rx   r   r   )r[   r   _format_row  s    zPrettyTable._format_rowc                s    fdd|D S )Nc                s   g | ]}j | qS r   )r  )r   rx   )r   r[   r   r   r     s    z,PrettyTable._format_rows.<locals>.<listcomp>r   )r[   r   r   r   )r   r[   r   _format_rows  s    zPrettyTable._format_rowsc             K   s   | j |}g }| jdkr0|d  s,|d  r0dS | j|}| j||}| j|| | j|| _|d rx|j| j| n$|d r|d t	t
fkr|j| j x|D ]}|j| j|| qW |d r|d t
kr|j| j | jdj|S )a"  Return string representation of table in current state.

        Arguments:

        start - index of first data row to include in output
        end - index of last data row to include in output PLUS ONE (list slice style)
        fields - names of fields (columns) to include
        header - print a header showing field names (True or False)
        border - print a border around the table (True or False)
        hrules - controls printing of horizontal rules after rows.  Allowed values: ALL, FRAME, HEADER, NONE
        vrules - controls printing of vertical rules between columns.  Allowed values: FRAME, ALL, NONE
        int_format - controls formatting of integer data
        float_format - controls formatting of floating point data
        padding_width - number of spaces on either side of column data (only used if left and right paddings are None)
        left_padding_width - number of spaces on left hand side of column data
        right_padding_width - number of spaces on right hand side of column data
        vertical_char - single character string used to draw vertical lines
        horizontal_char - single character string used to draw horizontal lines
        junction_char - single character string used to draw line junctions
        sortby - name of field to sort rows by
        sort_key - sorting key function, applied to data points before sorting
        reversesort - True or False to sort in descending or ascending order
        print empty - if True, stringify just the header for an empty table, if False return an empty string r   r3   r    r   r   r!   r   )r   rj   r  r  r   _stringify_hrule_hruler   _stringify_headerrJ   rH   _stringify_rowrT   join)r[   r\   r   r   r   formatted_rowsrx   r   r   r   r}     s"    


zPrettyTable.get_stringc             C   s   |d sdS | j |\}}|d ttfkr6|d g}n
|d g}| js^|j|d  dj|S xtt| j| jD ]b\}}|d r||d krqn|j|| | |d   |d tkr|j|d  qn|j|d  qnW |d tkr|j  |j|d  dj|S )Nr    r   r"   r1   r/   r   )	r   rJ   rH   r8   r   r  r   r>   r   )r[   r   r   r   r   r   r   r   r   r   r    s(    

zPrettyTable._stringify_hrulec             C   s  g }| j |\}}|d rj|d ttfkr@|j| j |jd |d ttfkr`|j|d  n
|jd | js|d ttfkr|j|d  n
|jd xt| j| jD ]\}}|d r||d krq| jdkr|j	 }nD| jd	kr|j
 }n0| jd
kr|j }n| jdkr|j }n|}|jd| | j||| j|  d|   |d r|d tkrp|j|d  q|jd qW |d r|d tkr|j  |j|d  |d r|d tkr|jd |j| j dj|S )Nr    r!   r   r"   r-   rf   r   r   r   r   r   r   )r   rJ   rH   r   r  r8   r   r>   rF   
capitalizer   r   r   ri   r9   r   r   r  )r[   r   r   r   r   r   r   r   r   r   r   r	    sJ    








*
zPrettyTable._stringify_headerc          	   C   s  xt tdt|| j|| jD ]`\}}}}|jd}g }x.|D ]&}	t|	|krZtj|	|}	|j	|	 q>W |}dj
|}|||< qW d}
x$|D ]}t|d }||
kr|}
qW g }| j|\}}xVtd|
D ]H}|j	g  |d r|d ttfkr|| j	| j q|| j	d qW xFt | j|| jD ]0\}}}| j| }|jd}|
t| }|r|dkrdgt|d	  | dg|t|d	    }n(|d
krdg| | }n|dg|  }d}x|D ]}|d r||d krq|| j	d| | j||| j|  d|   |d rL|d tkr>|| j	| j n|| j	d |d7 }qW q*W xJtd|
D ]<}|d rl|d tkrl|| j  || j	|d  qlW |d r|d tkr||
d  j	d ||
d  j	| j x&td|
D ]}dj
|| ||< qW dj
|S )Nr   r   r   r    r"   rf   r   r   r   r   r   r-   r!   )r   r   r   r8   r>   r   r   textwrapZfillr   r  r   r   rJ   rH   r-   r:   rs   ri   r9   r   r  )r[   rx   r   ru   r   rd   r   r   Z	new_linesr   Z
row_heightr   hr   r   r   yr   ZdHeightre   r   r   r   r
  :  sj    *




 


.

.
zPrettyTable._stringify_rowc             K   s,   | j |}|d r| j|}n
| j|}|S )a;  Return string representation of HTML formatted version of table in current state.

        Arguments:

        start - index of first data row to include in output
        end - index of last data row to include in output PLUS ONE (list slice style)
        fields - names of fields (columns) to include
        header - print a header showing field names (True or False)
        border - print a border around the table (True or False)
        hrules - controls printing of horizontal rules after rows.  Allowed values: ALL, FRAME, HEADER, NONE
        vrules - controls printing of vertical rules between columns.  Allowed values: FRAME, ALL, NONE
        int_format - controls formatting of integer data
        float_format - controls formatting of floating point data
        padding_width - number of spaces on either side of column data (only used if left and right paddings are None)
        left_padding_width - number of spaces on left hand side of column data
        right_padding_width - number of spaces on right hand side of column data
        sortby - name of field to sort rows by
        sort_key - sorting key function, applied to data points before sorting
        attributes - dictionary of name/value pairs to include as HTML attributes in the <table> tag
        xhtml - print <br/> tags if True, <br> tags if falser4   )r   _get_formatted_html_string_get_simple_html_string)r[   r\   r   stringr   r   r   get_html_string  s
    

zPrettyTable.get_html_stringc             C   sr  g }|d rd}nd}g }|j d |d rXx*|d D ]}|j d||d | f  q6W |j d |j dj| |d	 r|j d
 x>| jD ]4}|d r||d krq|j dt|jd|  qW |j d | j|}| j||}xr|D ]j}	|j d
 xPt| j|	D ]@\}}
|d r*||d kr*q|j dt|
jd|  qW |j d qW |j d | jdj|S )Nr5   z<br/>z<br>z<tabler6   z %s="%s">r   r   z    <tr>r   z        <th>%s</th>r   z	    </tr>z        <td>%s</td>z</table>)	r   r  r8   r   replacer  r  r   rT   )r[   r   r   	linebreakopen_tag	attr_namer   r   r  rx   datumr   r   r   r    s:    






 
z#PrettyTable._get_simple_html_stringc             C   s  g }| j |\}}|d r d}nd}g }|jd |d r|d tkr`|d tkr`|jd n|d tkr|d tkr|jd	 n|d tkr|d tkr|jd
 n`|d tkr|jd nH|d tkr|jd n0|d tkr|jd n|d tkr|jd |d r@x,|d D ] }|jd||d | f  qW |jd |jdj| |d r|jd xL| jD ]B}|d r||d krqv|jd||t|jd|f  qvW |jd | j|}	| j	|	|}
g }g }xH| jD ]>}|jdddd| j
|   |jdddd | j|   qW x|
D ]~}|jd xbt| j|||D ]N\}}}}|d r|||d kr|qT|jd!||||t|jd|f  qTW |jd q4W |jd" | jdj|S )#Nr5   z<br/>z<br>z<tabler    r!   r"   z frame="box" rules="all"z frame="box"z frame="box" rules="cols"z frame="hsides"z frame="hsides" rules="rows"z frame="vsides"z frame="vsides" rules="cols"r6   z %s="%s"r  r   r   z    <tr>r   zW        <th style="padding-left: %dem; padding-right: %dem; text-align: center">%s</th>r   z	    </tr>leftrightcenter)re   rg   r   topZmiddleZbottom)r   r   r   zg        <td style="padding-left: %dem; padding-right: %dem; text-align: %s; vertical-align: %s">%s</td>z</table>)r   r   rJ   rH   r  r8   r   r  r  r  r9   r:   r   rT   )r[   r   r   r   r   r  r  r  r   r   r  ZalignsZvalignsrx   r  rh   r   r   r   r   r    sd    



 


&

"

*
z&PrettyTable._get_formatted_html_string)N)r   r   )__name__
__module____qualname__r^   rT   ri   rm   ry   py3kr{   rz   rA   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   propertyr=   r   r   rh   r   r   r   r   r   r~   r   r   r   r   r   r   r   r   r   r   r   r#   r   r   r$   r   r   r%   r   r   r   r   r   r   r   r   r    r   r   r!   r   r   r"   r   r   r(   r   r   r)   r   r   r*   r   r   r+   r   r   r,   r   r   r-   r   r   r/   r   r   r1   r   r   r4   r   r   r3   r   r   r6   r   r   r   r   r   r   rr   r   r   r   r   r   r   r   r   r  r  r  r}   r  r	  r
  r  r  r  r   r   r   r   r   R   s   
]
	




























=/L (r   c             C   s   d|   kodkn  rdS d|   ko.dkn  r8dS d|   koJdkn  rTdS t jt| rfd	S d
|   koxdkn  sd|   kodkn  rdS d|   kodkn  rdS d|   kodkn  rdS | dkrdS | dkrd	S dS )N!   ~   r   i N  i  r   i   i  r   i@0  i0  i0  i0  i  i`  i 0  i>0  r         )r   r&  )r   r'  )unicodedataZ	combininguni_chr)charr   r   r   _char_block_width  s&    0r,  c             C   s   t tttttjd| S )Nr   )sumitermapr,  ord_resub)r   r   r   r   r   /  s    r   c             K   s   t j j| jd}| jd t j| |}tf |}|r@||_n.trZdd t	|D |_ndd |j	 D |_x |D ]}|j
dd |D  qtW |S )Ni   r   c             S   s   g | ]}|j  qS r   )strip)r   r&   r   r   r   r   B  s    zfrom_csv.<locals>.<listcomp>c             S   s   g | ]}|j  qS r   )r2  )r   r&   r   r   r   r   D  s    c             S   s   g | ]}|j  qS r   )r2  )r   r&   r   r   r   r   G  s    )csvZSnifferZsniffreadseekreaderr   r=   r"  nextrr   )fpr=   r\   Zdialectr6  tablerx   r   r   r   from_csv7  s    


r:  c             K   sF   | j rBtf |}dd | j D |_x| j D ]}|j| q,W |S d S )Nc             S   s   g | ]}|d  qS )r   r   )r   colr   r   r   r   O  s    z"from_db_cursor.<locals>.<listcomp>)descriptionr   r=   Zfetchallrr   )Zcursorr\   r9  rx   r   r   r   from_db_cursorK  s    
r=  c               @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )TableHandlerc             K   s>   t j|  || _g | _g | _g | _d| _d | _d| _d| _	d S )Nr   r   F)
r   r^   r\   tableslast_rowr   max_row_widthactivelast_contentis_last_row_header)r[   r\   r   r   r   r^   V  s    
zTableHandler.__init__c             C   s   || _ |dkrd| _d S )NthT)rB  rD  )r[   tagattrsr   r   r   handle_starttaga  s    zTableHandler.handle_starttagc             C   s   |dkr| j j }| jj| |dkrZ| jj| j| jf t| jt| j| _g | _d| _|dkr| j	| j}| j
j| g | _d| _ d | _d S )NrE  tdZtrFr9  rf   )rE  rI  )rC  r2  r@  r   r   rD  r   rA  r   generate_tabler?  rB  )r[   rF  Zstripped_contentr9  r   r   r   handle_endtagf  s    
zTableHandler.handle_endtagc             C   s   |  j |7  _ d S )N)rC  )r[   datar   r   r   handle_datax  s    zTableHandler.handle_datac             C   s   t f | j}x| jD ]~}t|d | jk r^| jt|d  }x td|D ]}|d jd qHW |d dkr| j|d  |d |_q|j	|d  qW |S )zE
        Generates from a list of rows a PrettyTable object.
        r   r   r0   T)
r   r\   r   r   rA  r   r   make_fields_uniquer=   rr   )r[   r   r9  rx   Zappendsr   r   r   r   rJ  {  s    zTableHandler.generate_tablec             C   sX   xRt dt|D ]@}x:t |d t|D ]$}|| || kr(||  d7  < q(W qW dS )zB
        iterates over the row and make each field unique
        r   r   'N)r   r   )r[   r   r   jr   r   r   rN    s    zTableHandler.make_fields_uniqueN)	r  r   r!  r^   rH  rK  rM  rJ  rN  r   r   r   r   r>  T  s   r>  c             K   s   t f |}|j|  |jS )z
    Generates a list of PrettyTables from a string of HTML code. Each <table> in
    the HTML becomes one PrettyTable object.
    )r>  Zfeedr?  )	html_coder\   parserr   r   r   	from_html  s    

rS  c             K   sF   t | f|}yt|dkstW n tk
r<   tdY nX |d S )zf
    Generates a PrettyTables from a string of HTML code which contains only a
    single <table>
    r   zDMore than one <table> in provided HTML code!  Use from_html instead.r   )rS  r   r   rt   )rQ  r\   r?  r   r   r   from_html_one  s    rT  c              C   s   t ddddg} d| _d| _d| jd< d| _d| jd< | jd	d
ddg | jddddg | jddddg | jddddg | jddddg | jdddd g | jd!d"d#d$g t|  d S )%Nz	City nameZAreaZ
PopulationzAnnual RainfallTZ04dz6.1fre   ZAdelaidei  is g     Ă@ZBrisbanei  i:X g@ZDarwinp   iD gʚ@ZHobartiM  i" g     \@ZSydneyi
  i*B g33333@Z	Melbournei  i: g333337@ZPerthi
  iQ g33333+@)r   r#   r$   r(   r)   rh   rr   print)r&   r   r   r   main  s    

rW  __main__)N)2__version__r   r3  r   resysr  	itertoolsr)  version_infor"  rb   rc   ra   mapr.  r   Ziterzipchrr*  Zhtml.parserr   ZimapZizipZunichrZhtmlr   ZcgirH   rJ   r   r   r   r   r   r   compiler0  r   objectr   r,  r   r:  r=  r>  rS  rT  rW  r  r   r   r   r   <module>    sj   
         E!
	B

