3
VÓmWO{  ã               @   sª   d Z ddlmZ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mZmZ dd
lmZmZ dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zde	jffdd„ZdS )zé
    weasyprint.layout.tables
    ------------------------

    Layout for tables and internal table boxes.

    :copyright: Copyright 2011-2016 Simon Sapin and contributors, see AUTHORS.
    :license: BSD, see LICENSE for details.

é    )ÚdivisionÚunicode_literalsé   )Úxrange)ÚLOGGER)Úboxes)Ú	Dimensioné   )Úresolve_percentagesÚresolve_one_percentage)Ú"table_and_columns_preferred_widthsÚmax_content_widthc	                s(  ddl m‰ ˆj‰ˆjjdkr,ˆjj\‰‰nd‰d‰g  ‰ˆ_ˆjƒ }	|	ˆ ‰x&ˆD ]}
|	ˆ7 }	ˆj|	ƒ |	|
7 }	qTW |	ˆ ‰ˆjjdkr
ˆrÒˆ\}}|r¦|\}}nd}x*ˆj	d|… D ]}|t
|j	ƒ7 }qºW nd}ˆj\}}|r
tdd„ || D ƒƒd	  ˆj_ˆ_‡ ‡‡‡‡‡‡‡‡	‡‡‡fd
d„‰
‡‡
‡fdd„‰ˆjƒ ˆ ‰ˆ}‡‡‡
‡‡‡‡‡fdd„}dd„ }|ƒ \}}}‰}ˆj|dk	r’|gng | |dk	r¨|gng  ˆdk|dkd‰ˆjjdkrÒ|ˆ_tˆjdkræˆjndˆˆjƒ  ƒˆ_ˆ| }ˆj	r|ˆ8 }xÐˆjD ]Æ}x‚|j	D ]x}t|ˆd |jt
ˆƒk rjˆ|j |_||_ˆ|j |_||_nd|_d|_d|_d|_t|ˆd |ˆ|ƒ|_q$W |j	d }|j	d }|j|_||_|j|j |j |_||_qW |rˆ rˆjjdks| rd‰d}d}g }d}ˆ||||fS )zLayout for a table box.r	   )Úblock_container_layoutÚseparater   ZcollapseNc             s   s   | ]\}\}}}|V  qd S )N© )Ú.0Ú_Úwidthr   r   úX/var/www/html/enquirykeeper_venv/lib/python3.6/site-packages/weasyprint/layout/tables.pyú	<genexpr>>   s    ztable_layout.<locals>.<genexpr>r   c                sâ  d }t | ˆd ˆ
| _|| _ˆ	| _g }dd„ | jD ƒ}|d k}|rHd}	n|\}	}| sZt‚xÜ| j|	ƒD ]Ì\}
}t |ˆd ˆ
|_||_ˆ	|_g }x:|jD ].}ˆ|jd … d |j… }t	|ƒ|_|jdkrþ|jj
|ƒ}|j|d … }tjdt	|ƒ|ƒ P t |ˆd ˆ|j |_|j|_d|_d|_d|_|jƒ }t|ƒˆ|jd   | |_|j|_d|_ˆˆ|tdƒd ˆd	ˆ ˆd
\}}}}}tdd„ |jD ƒƒ |_|j|_|jdkrÄt|j|jƒ|_|j|ƒ qžW |j|ƒ}g }xD|jD ]:}|jj}|dkr||_nd|_t|ƒ|_|j|ƒ qèW |rrtdd„ |D ƒƒ|_x6|D ]&}|j|jkrFt||j|j ƒ qFW nd |_x$|jD ]}||jd  j|ƒ q€W |j dƒ}|r|jdkrÚtdd„ |D ƒƒ}||j |_n(t|jtdd„ |D ƒƒƒ|_|j|j }n|j}d|_xæ|D ]Þ}|j|j!ƒ  }|| }|jdkrHt||ƒ n<|jdkrv|d }t||ƒ | j"|7  _"n| j"|7  _"|jdkrd}|jdkr²|j|j d }n|jdkrÊ|j|j }|dkrx|jD ]}|j#|d qÜW qW |j|j ˆ }||kr$| r$|
d f}P |}|j|ƒ d}qhW |rZ| jj$dksV| rZdS | j|||d kd} xH| jD ]>}|jd krv|jr¬tdd„ |jD ƒƒ|j |_nd|_qvW || j | _| jrÚ|  jˆ8  _| |fS )N)Úcontaining_blockc             S   s   g | ]}g ‘qS r   r   )r   Úrowr   r   r   ú
<listcomp>L   s    z6table_layout.<locals>.group_layout.<locals>.<listcomp>r   zDThis table row has more columns than the table, ignored %i cells: %rr	   ÚautoÚinfT)Úmax_position_yÚ
skip_stackÚdevice_sizeÚpage_is_emptyÚabsolute_boxesÚfixed_boxesc             s   s   | ]}|j ƒ p|jƒ V  qd S )N)Z
is_floatedÚis_in_normal_flow)r   Úchildr   r   r   r   ƒ   s   z5table_layout.<locals>.group_layout.<locals>.<genexpr>ÚtopÚmiddleÚbottomÚbaselinec             s   s   | ]}|j V  qd S )N)r&   )r   Úcellr   r   r   r   ›   s    c             s   s   | ]}|j |jƒ  V  qd S )N)Ú
position_yÚborder_height)r   r'   r   r   r   r   ©   s   c             s   s   | ]}|j V  qd S )N)Úheight)r   Zrow_cellr   r   r   r   ®   s    g       @r   )ÚdyFÚavoid)Úis_startÚis_endc             s   s   | ]}|j ƒ |j V  qd S )N)Úcontent_box_yr*   )r   r'   r   r   r   r   é   s   )r#   r$   r%   )NN)%r
   Ú
position_xr(   r   ÚchildrenÚAssertionErrorÚenumerate_skipÚgrid_xÚcolspanÚlenÚindexr   ÚwarningZ
margin_topÚmargin_leftÚborder_widthÚsumr*   Zcomputed_heightÚfloatÚanyÚemptyZcontent_heightÚmaxÚappendÚcopy_with_childrenÚstyleÚvertical_alignÚcell_baseliner&   Úadd_top_paddingZrowspanÚpopr)   Zpadding_bottomÚ	translateÚpage_break_inside)Úgroupr(   r   r   r   Ú	resume_atZnew_group_childrenZending_cells_by_rowZis_group_startÚskipZ	index_rowr   Znew_row_childrenr'   Zspanned_widthsZ
cell_indexZignored_cellsZborders_plus_paddingr   Zbaseline_cellsrC   Zending_cellsZrow_bottom_yZcell_bottom_yÚextraZvertical_align_shiftr"   Znext_position_y)r   r   Úborder_spacing_xÚborder_spacing_yÚcolumn_positionsÚcolumn_widthsÚcontextr   r    Ú
rows_widthÚrows_xÚtabler   r   Úgroup_layoutC   sü    












z"table_layout.<locals>.group_layoutc       
         s¢   | d krd}n| \}} g }d }xxˆj |ƒD ]j\}}|js*|jr@q*ˆ||||| ƒ\}	}d } |	d krj|d f}P |j|	ƒ ||	jˆ  7 }d}|r*||f}P q*W |||fS )Nr   F)r3   Ú	is_headerÚ	is_footerr@   r*   )
r   r(   r   r   rK   Únew_table_childrenrJ   Zindex_grouprI   Z	new_group)rN   rU   rT   r   r   Úbody_groups_layoutô   s*    
z(table_layout.<locals>.body_groups_layoutc                 sâ  ˆj rNˆj d jrNˆj d } ˆ| ˆˆd dd\} }| rH| rH| jˆ }qRd } nd } ˆj r ˆj d jr ˆj d }ˆ|ˆˆd dd\}}|rš| rš|jˆ }q¤d }nd }| oª|rˆ ˆˆ| ˆ| dd\}}}|sØˆ r |j||j d ||7 }| ||||fS d }| rL| rLˆ ˆˆ| ˆdd\}}}|s:ˆ rH| ||||fS d } |r®|  r®ˆ ˆˆˆ| dd\}}}|s‚ˆ rª|j||j d ||7 }| ||||fS d }| p¶| sÀt‚ˆ ˆˆˆˆƒ\}}}| ||||fS )	Nr   F)r   r   r	   )r(   r   r   )r+   éÿÿÿÿrZ   )r1   rV   r*   rW   rG   r(   r2   )ÚheaderrJ   Zheader_heightÚfooterZfooter_heightrX   Zend_position_y)rY   rN   rU   r   r   r(   r   rT   r   r   Úall_groups_layout  sp    




z'table_layout.<locals>.all_groups_layoutc                s   ‡ ‡fdd„S )z!Closure getting the column cells.c                  s   ‡ fdd„ˆj D ƒS )Nc                s4   g | ],}|j D ] }|j D ]}|jˆ jkr|‘qqqS r   )r1   r4   )r   Z	row_groupr   r'   )Úcolumnr   r   r   c  s   

zLtable_layout.<locals>.get_column_cells.<locals>.<lambda>.<locals>.<listcomp>)r1   r   )r^   rT   r   r   Ú<lambda>b  s    
z8table_layout.<locals>.get_column_cells.<locals>.<lambda>r   )rT   r^   r   )r^   rT   r   Úget_column_cells`  s    z&table_layout.<locals>.get_column_cells)r-   r.   r   )r   r,   r=   FrZ   )Zblocksr   rP   rB   Úborder_collapseÚborder_spacingrO   Zcontent_box_xr@   r1   r6   Zcollapsed_border_gridr?   Úborder_top_widthr/   rA   Úskipped_rowsr*   Úcolumn_groupsr
   r4   r0   r(   r   Z	get_cellsrH   )rQ   rT   r   r   r   r   r   r   r    r0   r   Zskipped_groupsZgroup_skip_stackrd   r   rI   Zhorizontal_bordersZinitial_position_yr]   r`   r[   rX   r\   rJ   Zcolumns_heightr^   ÚfirstÚlastZ	next_pageZadjoining_marginsZcollapsing_throughr   )r   r   rY   rM   rN   rO   rP   rQ   r   r    rU   r   r   r(   rR   rS   r   rT   r   Útable_layout   sš    




" 2L


rh   c             C   s.   |  j |7  _ x| jD ]}|j|d qW dS )zJIncrease the top padding of a box. This also translates the children.
    )r+   N)Úpadding_topr1   rG   )ÚboxZextra_paddingr"   r   r   r   rE      s    rE   c                st  | j ƒ }|jdkst‚dd„ |jD ƒ}|jrP|jd jrP|jd }|jd j}ng }tt|ƒtdd„ |D ƒƒƒ}dg| }x6t|ƒD ]*\}}t	|d|jƒ |jdkr„|j||< q„W |j
jd	krÌ|j
j\}	}
nd}	d}x¸|D ]°}t||ƒ |jdkr€|jƒ }||	|jd
  8 }g }x@t|||j ƒD ],}|| dkrB|j|ƒ n||| 8 }q$W |r~|t|ƒ }x|D ]}|||< qlW ~||j7 }qÚW ~|	|d
  }tdd„ |D ƒƒ| }dd„ t|ƒD ƒ}|r|j|kr|j| }|t|ƒ }x0|D ]}|||< qòW nx|D ]}d||< qW |jt|ƒ | }|dkrJ| j|8  _n |rj|| ‰ ‡ fdd„|D ƒ}||_dS )z‚Run the fixed table layout and return a list of column widths

    http://www.w3.org/TR/CSS21/tables.html#fixed-table-layout

    r   c             S   s   g | ]}|j D ]}|‘qqS r   )r1   )r   Zcolumn_groupr^   r   r   r   r   ±  s    z&fixed_table_layout.<locals>.<listcomp>r   c             s   s   | ]}|j V  qd S )N)r5   )r   r'   r   r   r   r   º  s    z%fixed_table_layout.<locals>.<genexpr>Nr   r   r	   c             s   s   | ]}|d k	r|V  qd S )Nr   )r   Úwr   r   r   r   å  s    c             S   s   g | ]\}}|d kr|‘qS )Nr   )r   Úirk   r   r   r   r   ç  s    c                s   g | ]}|ˆ  ‘qS r   r   )r   rk   )Úextra_per_columnr   r   r   û  s    )Úget_wrapped_tabler   r2   re   r1   r?   r6   r;   Ú	enumerater   rB   ra   rb   r
   r:   r5   r   r@   rP   )rj   rT   Zall_columnsZfirst_rowgroupZfirst_row_cellsZnum_columnsrP   rl   r^   rM   r   r'   r   Zcolumns_without_widthÚjZwidth_per_columnZall_border_spacingZmin_table_widthZremaining_widthZextra_widthr   )rm   r   Úfixed_table_layout¨  sl    









rq   c                s  |j ƒ ‰
tˆ|dd\}}}}‰‰}}d}	|jdkr>|	|j7 }	|jdkrR|	|j7 }	ˆ
jˆ
j }
|\}}||	 |
 }ˆ
jdkr¤||krŒ|ˆ
_q´||k rœ|ˆ
_q´|ˆ
_nˆ
j|k r´|ˆ
_|sÂg ˆ
_dS ˆ
j| }|dd… }|dd… }|dd… }|dd… }||||f}xntt	|ƒƒD ]^}ˆ| r\t
ˆ| | d || ƒ||< || ||< || ||< nˆ| r|| ||< qW |t|ƒkrTx$|D ]}t|ƒ|kr¤|‰nP qŒW x.|ddd!… D ]}t|ƒ|krÔ|‰nP q¼W ˆˆkr |tˆƒksøt‚ˆˆ
_nP‡‡fdd	„tt	|ƒƒD ƒ‰ |tˆƒ tˆ ƒ ‰‡ ‡‡fd
d	„tt	|ƒƒD ƒˆ
_n¾|ˆ
_|t|ƒ ‰‡‡‡fdd	„t|ƒD ƒ‰ˆr‡fdd	„ˆD ƒ}‡
fdd	„ˆD ƒ}dd	„ t||ƒD ƒ‰tˆƒˆkrà‡‡fdd	„ˆD ƒ‰ˆtˆƒ8 ‰x0tˆƒD ]$\}}ˆ
jˆ| d   |7  < qöW ˆdkr,dS ‡‡fdd	„t|ƒD ƒ‰ˆrxx(ˆD ] }ˆ
j|  ˆt	ˆƒ 7  < qPW dS ‡‡‡fdd	„t|ƒD ƒ‰ˆr0‡fdd	„ˆD ƒ}‡
fdd	„ˆD ƒ}dd	„ t||ƒD ƒ‰tˆƒˆkrò‡‡fdd	„ˆD ƒ‰ˆtˆƒ8 ‰x0tˆƒD ]$\}}ˆ
jˆ| d   |7  < qW ˆdkr>dS ‡fdd	„t|ƒD ƒ‰ˆr\t‡‡
fdd„tt	|ƒƒD ƒƒ}t‡fdd„ˆD ƒƒ}|r¦|dkr¦ˆ‰	n|dkr¶ˆ‰	n|d|  ‰	‡‡	fdd	„ˆD ƒ}‡
fdd	„ˆD ƒ}dd	„ t||ƒD ƒ‰tˆƒˆkr‡‡fdd	„ˆD ƒ‰ˆtˆƒ8 ‰x0tˆƒD ]$\}}ˆ
jˆ| d   |7  < q4W ˆdkrjdS ‡‡fdd	„t|ƒD ƒ‰ˆr¶x(ˆD ] }ˆ
j|  ˆt	ˆƒ 7  < qŽW dS |ˆ
jˆ k rÖˆ
 jˆ8  _n<d d	„ t|ƒD ƒ‰x(ˆD ] }ˆ
j|  ˆt	ˆƒ 7  < qîW dS )"zRun the auto table layout and return a list of column widths.

    http://www.w3.org/TR/CSS21/tables.html#auto-table-layout

    F)Zouterr   r   Ng      Y@r	   c                s   g | ]}ˆ| ˆ |  ‘qS r   r   )r   rl   )Úlower_guessÚupper_guessr   r   r   K  s    z%auto_table_layout.<locals>.<listcomp>c                s    g | ]}ˆ| ˆ | ˆ  ‘qS r   r   )r   rl   )Úadded_widthsÚavailable_ratiorr   r   r   r   O  s   c                sD   g | ]<\}}ˆ|  rˆ | d krt ‡fdd„|D ƒƒr||f‘qS )r   c             3   s   | ]}|rt ˆ |ƒV  qd S )N)r   )r   r'   )rQ   r   r   r   \  s    z/auto_table_layout.<locals>.<listcomp>.<genexpr>)r=   )r   rl   r^   )Úcolumn_intrinsic_percentagesÚconstrainednessrQ   r   r   r   Y  s    
c                s&   g | ]\}}t ‡ fd d„|D ƒƒ‘qS )c             3   s   | ]}|rt ˆ |ƒV  qd S )N)r   )r   r'   )rQ   r   r   r   _  s   z/auto_table_layout.<locals>.<listcomp>.<genexpr>)r?   )r   rl   r^   )rQ   r   r   r   _  s   c                s   g | ]\}}ˆ j | ‘qS r   )rP   )r   rl   r^   )rT   r   r   r   c  s    c             S   s"   g | ]}t d |d  |d  ƒ‘qS )r   r	   )r?   )r   r   r   r   r   r   e  s   c                s   g | ]}|t ˆ ƒ ˆ ‘qS r   )r;   )r   Ú
difference)ÚdifferencesÚexcess_widthr   r   r   i  s   c                s*   g | ]"\}}ˆ|  rˆ | d kr|‘qS )r   r   )r   rl   r^   )rv   rw   r   r   r   s  s    
c                sB   g | ]:\}}ˆ| rˆ | d krt ‡fdd„|D ƒƒr||f‘qS )r   c             3   s   | ]}|rt ˆ |ƒV  qd S )N)r   )r   r'   )rQ   r   r   r   €  s    z/auto_table_layout.<locals>.<listcomp>.<genexpr>)r=   )r   rl   r^   )rv   rw   rQ   r   r   r   }  s    c                s&   g | ]\}}t ‡ fd d„|D ƒƒ‘qS )c             3   s   | ]}|rt ˆ |ƒV  qd S )N)r   )r   r'   )rQ   r   r   r   ƒ  s   z/auto_table_layout.<locals>.<listcomp>.<genexpr>)r?   )r   rl   r^   )rQ   r   r   r   ƒ  s   c                s   g | ]\}}ˆ j | ‘qS r   )rP   )r   rl   r^   )rT   r   r   r   ‡  s    c             S   s"   g | ]}t d |d  |d  ƒ‘qS )r   r	   )r?   )r   r   r   r   r   r   ‰  s   c                s   g | ]}|t ˆ ƒ ˆ ‘qS r   )r;   )r   rx   )ry   rz   r   r   r     s   c                s$   g | ]\}}ˆ | d kr||f‘qS )r   r   )r   rl   r^   )rv   r   r   r   —  s    c             3   s*   | ]"}|d d„ ˆ D ƒkrˆj | V  qdS )c             S   s   g | ]\}}|‘qS r   r   )r   rl   r^   r   r   r   r   œ  s    z/auto_table_layout.<locals>.<genexpr>.<listcomp>N)rP   )r   rp   )ÚcolumnsrT   r   r   r   ›  s    z$auto_table_layout.<locals>.<genexpr>c             3   s   | ]\}}ˆ | V  qd S )Nr   )r   rl   r^   )rv   r   r   r   ž  s   éd   c                s   g | ]\}}ˆ | ˆ ‘qS r   r   )r   rl   r^   )rv   Úratior   r   r   ª  s   c                s   g | ]\}}ˆ j | ‘qS r   )rP   )r   rl   r^   )rT   r   r   r   ­  s    c             S   s   g | ]}|d  |d  ‘qS )r   r	   r   )r   r   r   r   r   r   °  s   c                s   g | ]}|t ˆ ƒ ˆ ‘qS r   )r;   )r   rx   )ry   rz   r   r   r   ´  s   c                s@   g | ]8\}}t |ƒrˆ | d krt ‡fdd„|D ƒƒ r|‘qS )r   c             3   s   | ]}|rt ˆ |ƒV  qd S )N)r   )r   r'   )rQ   r   r   r   È  s   z/auto_table_layout.<locals>.<listcomp>.<genexpr>)r=   )r   rl   r^   )rv   rQ   r   r   r   Ä  s    
c             S   s   g | ]\}}t |ƒr|‘qS r   )r=   )r   rl   r^   r   r   r   r   Õ  s    rZ   )rn   r   r9   Zmargin_rightZpadding_leftZpadding_rightr   rP   Úranger6   r?   r;   r2   ro   Úzip)rQ   rj   r   Ztable_min_content_widthZtable_max_content_widthZcolumn_min_content_widthsZcolumn_max_content_widthsZtotal_horizontal_border_spacingZgridZmarginsZpaddingsZcb_widthr   Zavailable_widthZassignable_widthZmin_content_guessZmin_content_percentage_guessZmin_content_specified_guessZmax_content_guessZguessesrl   ZguessZwidthsZcurrent_widthsrx   Zfixed_widthZpercentage_widthr   )rt   ru   rv   r{   rw   rQ   ry   rz   rr   r}   rT   rs   r   Úauto_table_layout  sú    











 

 
 



 


 
r€   c             C   s\   |j ƒ }t||ƒ |jjdkr2|jdkr2t|ƒ nt| ||ƒ |jƒ |_t|jdƒ|j_dS )z;Find the width of each column and derive the wrapper width.Zfixedr   ZpxN)	rn   r
   rB   rh   r   rq   r€   r:   r   )rQ   Úwrapperr   rT   r   r   r   Útable_wrapper_widthÚ  s    


r‚   c             C   s<   t | tjtjfd}|dk	r&|| j S | j| j | j S dS )u•   
    Return the y position of a cellâ€™s baseline from the top of its border box.

    See http://www.w3.org/TR/CSS21/tables.html#height-layout

    )Úbaseline_typesN)Úfind_in_flow_baseliner   ÚLineBoxZTableRowBoxr(   rc   ri   r*   )r'   Úresultr   r   r   rD   è  s
    
rD   Fc             C   sv   t | |ƒr| j| j S t | tjƒrrt | tjƒ rr|r>t| jƒn| j}x,|D ]$}|jƒ rJt	|||ƒ}|dk	rJ|S qJW dS )zf
    Return the absolute Y position for the first (or last) in-flow baseline
    if any, or None.
    N)
Ú
isinstancer(   r&   r   Z	ParentBoxZTableCaptionBoxÚreversedr1   r!   r„   )rj   rg   rƒ   r1   r"   r†   r   r   r   r„   ø  s    

r„   N)Ú__doc__Ú
__future__r   r   Úcompatr   Úloggerr   Zformatting_structurer   Zcss.propertiesr   Zpercentagesr
   r   Z	preferredr   r   rh   rE   rq   r€   r‚   rD   r…   r„   r   r   r   r   Ú<module>   s$      [ X