3
?W                 @   s:  d Z ddlmZmZ ddlmZ ddlmZmZ ddl	m
Z
mZmZ ddlmZmZmZ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lmZ ddlmZ ddl m!Z!m"Z" dd Z#dd Z$dd Z%edd Z&dd Z'edd Z(dd Z)d-dd Z*d!d" Z+d#d$ Z,d%d& Z-d'd( Z.d)d* Z/d+d, Z0dS ).a  
    weasyprint.layout.blocks
    ------------------------

    Page breaking and layout for block-level and block-container boxes.

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

    )divisionunicode_literals)floor   )absolute_layoutAbsolutePlaceholder)float_layoutget_clearanceavoid_collisions)iter_line_boxesreplaced_box_widthreplaced_box_heightmin_max_auto_replaced)list_marker_layout)handle_min_max_width)table_layouttable_wrapper_width)resolve_percentagesresolve_position_percentages)shrink_to_fit   )boxes)xrangeizipc
             C   sX  t |tjr$t| ||||||||	S t|| |jdkr>d|_|jdkrNd|_t|	|jg }
t| ||
|_	|j	dk	r|j
|
 |j	 }||j |_
g }	t |tjr|j}|jdks|jdkrt| ||||||||	S t| |||||||||	
S ndt |tjrBt|||}t| ||dd\|_|_
}d}d}g }	d}||||	|fS tdt|j dS )zLay out the block-level ``box``.

    :param max_position_y: the absolute vertical position (as in
                           ``some_box.position_y``) of the bottom of the
                           content box of the current page area.

    autor   NF)outeranyzLayout for %s not handled yet)
isinstancer   TableBoxr   r   
margin_topmargin_bottomcollapse_marginr	   	clearance
position_yBlockBoxstylecolumn_widthcolumn_countcolumns_layoutblock_box_layoutZBlockReplacedBoxblock_replaced_box_layoutr
   
position_x	TypeErrortype__name__)contextboxmax_position_y
skip_stackcontaining_blockdevice_sizepage_is_emptyabsolute_boxesfixed_boxesadjoining_marginscollapsed_marginZtop_border_edger%   _	resume_at	next_pagecollapsing_through r>   X/var/www/html/enquirykeeper_venv/lib/python3.6/site-packages/weasyprint/layout/blocks.pyblock_level_layout   sF    







r@   c
          
   C   s   |j rt| ||j|jf t|| t| ||||||||		\}
}}}	}|
r~|
j r~t| |
|dd\}}}|
j||
j ||
j	  t
| |
 |
|||	|fS )zLay out the block ``box``.F)r   )is_table_wrapperr   widthheightblock_level_widthblock_container_layoutr
   	translater+   r#   r   )r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   new_boxr;   r<   r=   r+   r#   r:   r>   r>   r?   r)   U   s    



r)   c	                s  d}	d j }
t   j}|dkrd|
jdkr<d}	 jn(|
jdkrT|
j}	|
jnt|  td}|	dkr&|
jdkr|
jdkr|
j}	td||	d |
j  |	 n|
jdkr|
jdkrtdt	||
j |
j|
j  }	||
j |	 |
j n6t
|
jt	||
j |
j|
j  }	||
j |	 |
j  fdd}fdd	|}|
jd
kr,| }t| |td|||||g 
\}}}}}t|}|j|	 }xd}g }|j }x^|D ]T}|j }|j| | }||kr||	d k r|j||  |d7 }|j}nP qW P |t
|7 }qW t
| j | }g }xt|	D ]|}||	d krP|}| }| j||
j  7  _t| |||||||g 
\}}}}}|dkrP |j| |dkr:P q:W | _ jrtdd  jD  _x  jD ]} j|_qW nd _ ||dgdfS )zLay out a multi-column ``box``.Nr   r   infr   c                 sB    j  dd  jD d} t|  | _ j | _ j | _| S )Nc             S   s   g | ]}|j  qS r>   )copy).0childr>   r>   r?   
<listcomp>   s    z=columns_layout.<locals>.create_column_box.<locals>.<listcomp>)children)Zanonymous_fromrM   r   rB   content_box_xr+   content_box_yr#   )
column_box)r0   r3   rB   r>   r?   create_column_box   s    


z)columns_layout.<locals>.create_column_boxc             3   sZ   t | tjtjtjfr| V  t| drV| j rVx&| jD ]}x |D ]
}|V  qDW q6W d S )NZdescendants)r   r   r   LineBoxZReplacedBoxhasattris_in_normal_flowrM   )r0   rK   Zgrand_child)column_descendantsr>   r?   rU      s    z*columns_layout.<locals>.column_descendantsZbalancec             s   s   | ]}|j V  qd S )N)rC   )rJ   rK   r>   r>   r?   	<genexpr>   s    z!columns_layout.<locals>.<genexpr>F)r%   rD   rB   r'   r&   r   floatmaxZ
column_gapr   minZcolumn_fillr)   listrC   rO   Zmargin_heightr#   appendranger+   rM   )r/   r0   r1   r2   r3   r4   r5   r6   r7   countr%   Zavailable_widthrQ   Zoriginal_max_position_yrP   	new_childr:   Zbox_column_descendantsrC   iZlost_spacesZ
column_toprK   Zchild_heightZchild_bottomrM   r<   r>   )r0   rU   r3   rB   r?   r(   m   s    




	






r(   c             C   s   t j| | tj| | d S )N)r   without_min_maxrD   )r0   r3   r4   r>   r>   r?   block_replaced_width   s    ra   c             C   sz   | j jdkr`| j jdkr`| j| jf}tj| || tj| | t|  |\| _| _t	j| | nt| || t| | | S )z5Lay out the block :class:`boxes.ReplacedBox` ``box``.r   )
r%   rB   rC   margin_leftmargin_rightra   r`   r   r   rD   )r0   r3   r4   Zcomputed_marginsr>   r>   r?   r*      s    

r*   c             C   s  |j }| j}| j}| j}| j}| j}| j}| j }	|| | | }
| j dkr|
|	 }|dkrb||7 }|dkrr||7 }||kr|dkrd }| _|dkrd }| _|	dkr|dkr|dkr|jjdkr|  j	||
 |	 | | 7  _	|	dkr&|dkrd }| _|dkrd }| _||
| |   }	| _ ||
 |	 }|dkr\|dkr\|d | _|d | _n>|dkr||dkr||| | _n|dkr|dkr|| | _dS )zSet the ``box`` width.r   r   Zrtlg       @N)
rB   rb   rc   Zpadding_leftZpadding_rightZborder_left_widthZborder_right_widthr%   	directionr+   )r0   r3   Zcb_widthZmargin_lZmargin_rZ	padding_lZ	padding_rZborder_lZborder_rrB   Zpaddings_plus_borderstotalZ
margin_sumr>   r>   r?   rD     sN    







rD   c             C   s   | j jdkrt| | | jdkrH| jdkrH| j jdkr>| j}qr| j }n*| jdkrZ| j}n| jdkrn| j }nd}| jdkr| j}n| j jdkr| j }nd}| j|| t	| t
jt
jfrx| jD ]}t|| qW dS )z5Translate the ``box`` if it is relatively positioned.relativer   Zltrr   N)r%   positionr   leftrightrd   topZbottomrF   r   r   Z	InlineBoxrR   rM   relative_positioning)r0   r3   Ztranslate_xZtranslate_yrK   r>   r>   r?   rk   F  s(    






rk   Nc	       .      C   s  t |tjstt |tjs$| j  |dk}	|	s@|j|jdd}|dkrLg }|j|j	 |}
|j
pt|jptt|pt|j }|r|j}n$| jt||j	 7  _g }|j }|j }|jjdkrg }g }d}d}|	rd}n|\}}x|j|D ]\}}||_||_|j s| jt|7  _|j rft|}||_|j| |jjdkrZ|j| n
|j| q|j rt| |||||}|r| s|j|j |k r||_|j| qx"t|D ]}|j r|}P qW |r
t||dkr
t|||}|r
|\}}P |df}P qt |tj rt!|jd	ks<td
|rR|t|7 }g }|}t"| |||||||}d}x2|D ](\}}||_#|j|j }||kr^|s| r^t!||jj$ }|dk r| rdddg dfS |jj%d	 }|rx"|D ]} |d	8 }|dkrP qW ||kr2| r2dddg dfS |rN||krN|| d= ||f}d}P n0|r||kr||j	8 }|j&d|j	  d|_	|j| |}|}qxW |r||d j#f}|rP qx&t|D ]}|j r|}P qW d}|dk	r*t||}!|!dkr.|!dkr|!}nd}|df}P nd}!|}|j'st(|| |j r|dkr|rt|}"|j	dkrxd}#n|j	}#t||#g }$|$|" }%x|D ]}&|&j&|%d qW t)| ||$}'|'dk	rx|D ]}&|&j&|% d qW t|}(| j|(|j	 7  _g }|j }|rBt |tj*rBt|}(| j|(7  _||(7 }g }t+| ||||||oZ| |||
\}}}})}*d}|dk	rT||_t |tjtj*fs|j|j	 t||j	 }+|j&d|+ g }|)}|j|j, |*s.|j- |j.  }||kr*|s| r*t |tj*pt |tjo|j r*d}n|}|dk	rT|j/dk	rT|j- |j.  }|dkr|!dkrt|||}|r|\}}P n|sdddg dfS |r|df}P ndddg dfS |j| |dk	r||f}P qW d}|dk	r|jj0dkr| rdddg dfS |r*| jt|
|j	 7  _x&t|D ]}|j r4|}P q4W d}d}*|dkrt|}(|jdkrt)| ||(dkrt1dd |j2|j
|j|j3|j4gD rd}*n||(7 }g }n|jdkrg }|j3s|j4st|s|jr|t|7 }g }|j||	|dkd},|,jdkr2||,j  |,_|,jjdkr^x|D ]}-t5| |-|,| qFW x"|,jD ]}t6||,j7|,jf qfW t |,tjs| j8|, t9t:|,j|,j;|,j2|,_|,||||*fS )zSet the ``box`` height.NF)is_startrf   r   r   absoluteavoidr   z$line box with siblings before layoutTalwaysrh   ri   r   )Zdyc             s   s   | ]}|d kV  qdS )r   Nr>   )rJ   vr>   r>   r?   rV     s    z)block_container_layout.<locals>.<genexpr>)rl   Zis_end)ro   rh   ri   )rh   ri   )r   r   )<r   r   BlockContainerBoxAssertionErrorr$   Zcreate_block_formatting_contextcopy_with_childrenrM   r[   r   Zborder_top_widthZpadding_topestablishes_formatting_contextZis_for_root_elementr#   r!   rO   rN   r%   rg   Zenumerate_skipr+   rT   is_absolutely_positionedr   index
is_floatedr   rC   reversedblock_level_page_breakfind_earlier_page_breakrR   lenr   r;   orphanswidowsrF   rA   r   r	   r   r@   r    Zborder_box_yZborder_heightr"   page_break_insideallZ
min_heightZborder_bottom_widthZpadding_bottomr   rk   rB   Zfinish_block_formatting_contextrX   rY   Z
max_height).r/   r0   r1   r2   r4   r5   r6   r7   r8   rl   Zthis_box_adjoining_marginsZcollapsing_with_childrenr#   r+   new_childrenr<   Zlast_in_flow_childskiprw   rK   placeholderr^   Zprevious_childresultr;   Znew_containing_blockZlines_iteratorZis_page_breaklineZnew_position_yZover_orphansneededr:   Z
page_breakZold_collapsed_marginZchild_margin_topZnew_collapsed_marginZcollapsed_margin_differenceZprevious_new_childr"   r9   Znext_adjoining_marginsr=   Zoffset_yrG   Zabsolute_boxr>   r>   r?   rE   e  s   







































rE   c             C   s<   dg}|j |  dd |D }dd |D }t|t| S )zKReturn the amount of collapsed margin for a list of adjoining margins.
    r   c             s   s   | ]}|d kr|V  qdS )r   Nr>   )rJ   mr>   r>   r?   rV     s    z"collapse_margin.<locals>.<genexpr>c             s   s   | ]}|d kr|V  qdS )r   Nr>   )rJ   r   r>   r>   r?   rV     s    )extendrX   rY   )r8   ZmarginsZ	positivesZ	negativesr>   r>   r?   r!     s
    
r!   c             C   sB   | j  p@| j p@t| tjr*t| tj p@t| tjo@| jjdkS )zReturn wether a box establishes a block formatting context.

    See http://www.w3.org/TR/CSS2/visuren.html#block-formatting

    Zvisible)rx   rv   r   r   rr   r$   r%   Zoverflow)r0   r>   r>   r?   ru     s    ru   c             C   s   g }| }x<t |tjrD|j|jj t |tjo4|js8P |jd }q
W |j  |}x<t |tjr|j|jj	 t |tjo~|jsP |jd }qTW d}x$|D ]}|d	ks||fdkr|}qW |S )aW  Return the value of ``page-break-before`` or ``page-break-after``
    that "wins" for boxes that meet at the margin between two sibling boxes.

    For boxes before the margin, the 'page-break-after' value is considered;
    for boxes after the margin the 'page-break-before' value is considered.

    * 'avoid' takes priority over 'auto'
    * 'always' takes priority over 'avoid' or 'auto'
    * 'left' or 'right' take priority over 'always', 'avoid' or 'auto'
    * Among 'left' and 'right', later values in the tree take priority.

    See http://dev.w3.org/csswg/css3-page/#allowed-pg-brk

    r   r   r   rh   ri   ro   rn   rq   )rh   ri   ro   r   ro   rn   rn   r   )r   r   r   )
r   r   ZBlockLevelBoxr[   r%   Zpage_break_after	ParentBoxrM   reverseZpage_break_before)Zsibling_beforeZsibling_aftervaluesr0   r   valuer>   r>   r?   rz     s,    
  rz   c             C   s  | rzt | d tjrz| d jj}| d jj}t| | }||k rDdS | d| }d|d jf}t| |d || ||fS d}xt	| D ]\}}	|	j
 o|	jjdkrt |	tjrt|	j||}
|
r|
\}}|	j|}t| d| |g }|j|f}|d7 }P nt |	tjr|	j
 r|dk	rZt|	|dkrZ|d7 }| d| }| | jdf}P |	}qW dS t| |d || ||fS )a8  Because of a `page-break-before: avoid` or a `page-break-after: avoid`
    we need to find an earlier page break opportunity inside `children`.

    Absolute or fixed placeholders removed from children should also be
    removed from `absolute_boxes` or `fixed_boxes`.

    Return (new_children, resume_at)

    r   Nr   rn   rq   )r   r   rR   r%   r}   r~   r|   r;   remove_placeholdersreversed_enumeraterT   r   r$   r{   rM   rt   rZ   rw   r   rz   )rM   r6   r7   r}   r~   rw   r   r;   Zprevious_in_flowrK   r   Znew_grand_childrenr^   r>   r>   r?   r{     sJ    



r{   c             C   s   t ttt| t| S )zBLike reversed(list(enumerate(seq))) without copying the whole seq.)r   ry   r   r|   )seqr>   r>   r?   r   R  s    r   c             C   sb   x\| D ]T}t |tjr$t|j|| |jjdkrD||krD|j| q|jjdkr|j| qW dS )zFor boxes that have been removed in find_earlier_page_break(),
    also remove the matching placeholders in absolute_boxes and fixed_boxes.

    rm   ZfixedN)r   r   r   r   rM   r%   rg   remove)Zbox_listr6   r7   r0   r>   r>   r?   r   W  s    
r   )N)1__doc__
__future__r   r   mathr   rm   r   r   rW   r   r	   r
   Zinlinesr   r   r   r   markersr   Zmin_maxr   Ztablesr   r   Zpercentagesr   r   Z	preferredr   Zformatting_structurer   compatr   r   r@   r)   r(   ra   r*   rD   rk   rE   r!   ru   rz   r{   r   r   r>   r>   r>   r?   <module>   s:   7 	9!
  r)9