a
    ¥Q•h‚š  ã                   @   s\  d Z ddl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 d	d
lmZm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 d	dlmZmZ edg d¢ƒZG dd„ dƒZG dd„ deƒZG dd„ deƒZ dd„ Z!dd„ Z"dd„ Z#dd„ Z$d d!„ Z%d"d#„ Z&ed$d%„ ƒZ'ed&d'„ ƒZ(d(d)„ Z)d*d+„ Z*d,d-„ Z+d.d/„ Z,d0d1„ Z-d2d3„ Z.dS )4z'Layout for pages and CSS3 margin boxes.é    N)Ú
namedtuple)Úinfé   )Úcomputed_from_cascaded)ÚboxesÚbuild)ÚPROGRESS_LOGGERé   )Úabsolute_box_layoutÚabsolute_layout)Úblock_container_layoutÚblock_level_layout)Úfloat_layout)Úhandle_min_max_heightÚhandle_min_max_width)Úresolve_percentages)Úmax_content_widthÚmin_content_widthÚPageType)ÚsideÚblankÚnameÚindexÚgroupsc                   @   sJ   e Zd Zedd„ ƒZedd„ ƒZejdd„ ƒZedd„ ƒZedd	„ ƒZd
S )ÚOrientedBoxc                 C   s   | j | j | j S ©N)Úpadding_plus_borderÚmargin_aÚmargin_b©Úself© r!   úO/var/www/sistema_ama/venv/lib/python3.9/site-packages/weasyprint/layout/page.pyÚsugar   s    zOrientedBox.sugarc                 C   s   | j | j S r   )r#   Úinnerr   r!   r!   r"   Úouter   s    zOrientedBox.outerc                 C   s    t t| j|| j ƒ| jƒ| _d S r   )ÚminÚmaxÚmin_content_sizer#   Úmax_content_sizer$   )r    Znew_outer_widthr!   r!   r"   r%      s    þc                 C   s   | j | jdkr| jn| j S ©NÚauto)r#   r$   r(   r   r!   r!   r"   Úouter_min_content_size#   s    ÿz"OrientedBox.outer_min_content_sizec                 C   s   | j | jdkr| jn| j S r*   )r#   r$   r)   r   r!   r!   r"   Úouter_max_content_size(   s    ÿz"OrientedBox.outer_max_content_sizeN)	Ú__name__Ú
__module__Ú__qualname__Úpropertyr#   r%   Úsetterr,   r-   r!   r!   r!   r"   r      s   



r   c                   @   s4   e Zd Zdd„ Zdd„ Zedd„ ƒZedd„ ƒZd	S )
ÚVerticalBoxc                 C   sB   || _ || _|j| _|j| _|j| _|j|j	 |j
 |j | _d S r   )ÚcontextÚboxÚheightr$   Ú
margin_topr   Úmargin_bottomr   Úpadding_topÚpadding_bottomÚborder_top_widthÚborder_bottom_widthr   ©r    r4   r5   r!   r!   r"   Ú__init__/   s    
ÿÿÿzVerticalBox.__init__c                 C   s"   | j }| j|_| j|_| j|_d S r   )r5   r$   r6   r   r7   r   r8   ©r    r5   r!   r!   r"   Úrestore_box_attributes;   s    z"VerticalBox.restore_box_attributesc                 C   s   dS )Nr   r!   r   r!   r!   r"   r(   B   s    zVerticalBox.min_content_sizec                 C   s   dS )Ng    €„.Ar!   r   r!   r!   r"   r)   F   s    zVerticalBox.max_content_sizeN©r.   r/   r0   r>   r@   r1   r(   r)   r!   r!   r!   r"   r3   .   s   
r3   c                   @   s4   e Zd Zdd„ Zdd„ Zedd„ ƒZedd„ ƒZd	S )
ÚHorizontalBoxc                 C   sN   || _ || _|j| _|j| _|j| _|j|j	 |j
 |j | _d | _d | _d S r   )r4   r5   Úwidthr$   Úmargin_leftr   Úmargin_rightr   Úpadding_leftÚpadding_rightÚborder_left_widthÚborder_right_widthr   Ú_min_content_sizeÚ_max_content_sizer=   r!   r!   r"   r>   L   s    
ÿÿÿzHorizontalBox.__init__c                 C   s"   | j }| j|_| j|_| j|_d S r   )r5   r$   rC   r   rD   r   rE   r?   r!   r!   r"   r@   X   s    z$HorizontalBox.restore_box_attributesc                 C   s$   | j d u rt| j| jdd�| _ | j S ©NF)r%   )rJ   r   r4   r5   r   r!   r!   r"   r(   ^   s
    

ÿzHorizontalBox.min_content_sizec                 C   s$   | j d u rt| j| jdd�| _ | j S rL   )rK   r   r4   r5   r   r!   r!   r"   r)   e   s
    

ÿzHorizontalBox.max_content_sizeNrA   r!   r!   r!   r"   rB   K   s   
rB   c                 C   sÆ  |rt nt| |ƒ}|jtdd„ |j|j|jfD ƒƒ }||krn|jdkrNd|_|jdkr^d|_|jdkrnd|_d|j|j|jfvr”|rŽd|_nd|_|j|j|jg d¡dk�r|jdkrÔ||j |j |j |_nH|jdkrø||j |j |j |_n$|jdk�r||j |j |j |_|jdk�rd|jdk�r:d|_|jdk�rLd|_||j |j |j |_|j|j  k�r€dk�r n n||j |j d  |_|_d|j|j|jfv�sºJ ‚| ¡  dS )a¢  Compute and set a margin box fixed dimension on ``box``.

    Described in: https://drafts.csswg.org/css-page-3/#margin-constraints

    :param box:
        The margin box to work on
    :param outer:
        The target outer dimension (value of a page margin)
    :param vertical:
        True to set height, margin-top and margin-bottom; False for width,
        margin-left and margin-right
    :param top_or_left:
        True if the margin box in if the top half (for vertical==True) or
        left half (for vertical==False) of the page.
        This determines which margin should be 'auto' if the values are
        over-constrained. (Rule 3 of the algorithm.)
    c                 s   s   | ]}|d kr|V  qdS )r+   Nr!   )Ú.0Úvaluer!   r!   r"   Ú	<genexpr>‚   s   ÿz*compute_fixed_dimension.<locals>.<genexpr>r+   r   r	   r   N)	r3   rB   r   Úsumr   r   r$   Úcountr@   )r4   r5   r%   ÚverticalZtop_or_leftÚtotalr!   r!   r"   Úcompute_fixed_dimensionm   sb    ÿ




ÿÿ
ÿÿÿÿÿÿ ÿrT   c                    sŽ  |rt nt‰ ‡ ‡fdd„|D ƒ}|\}}}|D ]$}|jdkrBd|_|jdkr.d|_q.|jj�s|jdkslJ ‚|j|j  kr†dk�rÌn �n@||j|j krö||j |j }|j}	|j}
|	|
 }|dkrÌd}|j||	 |  |_	|j||
 |  |_	nÔ||j
|j
 k�rp||j
 |j
 }|j|j }	|j|j }
|	|
 }|dk�rFd}|j||	 |  |_	|j||
 |  |_	nZ||j
 |j
 }|j}	|j}
|	|
 }|dk�r¢d}|j||	 |  |_	|j||
 |  |_	n2|jdk�ræ||j	 |_	n|jdk�r^||j	 |_	�n\|jdk�r&dt|j|jƒ }||j| k�rt||j | }|j}|}|| }|dk�r^d}|j|| |  |_	n²dt|j
|j
ƒ }||j
| k�rä||j
 | }|j|j }|| }|| }|dk�rÎd}|j|| |  |_	nB||j
 | }|j}|}|| }|dk�rd}|j|| |  |_	|jdk�rB||j	 d |_	|jdk�r^||j	 d |_	ddd„ |D ƒv�svJ ‚|D ]}| ¡  �qzdS )	ua  Compute and set a margin box fixed dimension on ``box``

    Described in: https://drafts.csswg.org/css-page-3/#margin-dimension

    :param side_boxes:
        Three boxes on a same side (as opposed to a corner).
        A list of:
        - A @*-left or @*-top margin box
        - A @*-center or @*-middle margin box
        - A @*-right or @*-bottom margin box
    :param vertical:
        ``True`` to set height, margin-top and margin-bottom;
        ``False`` for width, margin-left and margin-right.
    :param available_size:
        The distance between the page boxâ€™s left right border edges

    c                    s   g | ]}ˆ ˆ|ƒ‘qS r!   r!   ©rM   r5   ©Z	box_classr4   r!   r"   Ú
<listcomp>Ç   ó    z.compute_variable_dimension.<locals>.<listcomp>r+   r   r	   r   c                 S   s   g | ]
}|j ‘qS r!   )r$   rU   r!   r!   r"   rW   E  rX   N)r3   rB   r   r   r5   Úis_generatedr$   r-   r)   r%   r,   r(   r'   r@   )r4   Ú
side_boxesrR   Zavailable_sizeZbox_aZbox_bZbox_cr5   Z
flex_spaceZflex_factor_aZflex_factor_cÚflex_factor_sumZac_max_content_sizeZflex_factor_bZflex_factor_acZac_min_content_sizer!   rV   r"   Úcompute_variable_dimension´   s   



 ÿÿÿþÿ
ÿ
ÿÿÿÿþÿ
ÿ
ÿ

ÿ
ÿÿþÿ

ÿ
ÿÿÿÿþÿ

ÿÿÿÿþÿ
ÿ

ÿÿþÿ

ÿr\   c                 C   sˆ   d}dD ]^}| | dkr"d| |< qg }| | D ]*\}}|dkrBd}|dkr.|  ||f¡ q.t|ƒ| |< q|du r„|s„d	| d
  | d
< dS )zªDrop 'pages' counter from style in @page and @margin context.

    Ensure `counter-increment: page` for @page context if not otherwise
    manipulated by the style.

    F)Úcounter_setÚcounter_resetÚcounter_incrementr+   r!   ÚpageTÚpagesN))r`   r	   r_   )ÚappendÚtuple)ÚstyleÚpseudo_typeZpage_counter_touchedZpropnameZjustified_valuesr   rN   r!   r!   r"   Ú _standardize_page_based_countersK  s     ÿrf   c              	   #   sH  ‡‡‡fdd„‰ˆj }ˆj}ˆj}ˆj}ˆ ¡ }ˆ ¡ }|| }	|| }
g }dd||f|dfdd||f||
fdd||fd|fd	d||f|	|ffD ]ú\‰}‰ }}|r´g d
¢}ˆ \}}ng d¢}ˆ \}}‡ ‡‡fdd„|D ƒ}tdd„ |D ƒƒsîq�tˆ|||ƒ t|g d¢ƒD ]~\}}|j	�s�q
||_
||_|�rL| j||| ¡   7  _n| j
||| ¡   7  _
tˆ||| ˆdv ƒ | |¡ �q
q�d||ddfd|||	dfd||d|
fd|||	|
ffD ]h\}}}}}ˆ|||fƒ}|j	�sè�qÀ||_
||_tˆ||dd|v ƒ tˆ||dd|v ƒ | |¡ �qÀ|D ]}tˆˆ|ƒV  �q.dS )z›Yield laid-out margin boxes for this page.

    ``state`` is the actual, up-to-date page-state from
    ``context.page_maker[context.current_page]``.

    c           	         sô   ˆ   ˆj| ¡}|du r&tdi ˆjd�}t|| ƒ t | |¡}|d dv|_|jrÀt 	ˆ¡}|\}}}| 
tƒ ¡ t ||j¡ t |j|||ˆ jˆ jˆ jˆ ˆ¡	|_t |¡ t |¡ t |¡}t||ƒ |jsðd |_|_dD ]}| |¡ qà|S )aa  Return a margin box with resolved percentages.

        The margin box may still have 'auto' values.

        Return ``None`` if this margin box should not be generated.

        :param at_keyword:
            Which margin box to return, e.g. '@top-left'
        :param containing_block:
            As expected by :func:`resolve_percentages`.

        N)ÚelementÚcascadedÚparent_styleÚcontent)ÚnormalÚinhibitÚnoner   )ÚtopÚrightÚbottomÚleft)Ú	style_forÚ	page_typer   rd   rf   r   Ú	MarginBoxrY   ÚcopyÚdeepcopyrb   Úsetr   Úupdate_countersÚcontent_to_boxesÚget_image_from_uriÚtarget_collectorÚcounter_styleÚchildrenÚprocess_whitespaceÚprocess_text_transformÚcreate_anonymous_boxesr   rC   r6   Ú_reset_spacing)	Ú
at_keywordÚcontaining_blockrd   r5   Zmargin_stateÚquote_depthÚcounter_valuesÚcounter_scopesr   )r4   r`   Ústater!   r"   Úmake_boxl  s6    ÿ



ý



z#make_margin_boxes.<locals>.make_boxrn   Fr   rp   rq   Tro   )rn   Úmiddlerp   )rq   Úcenterro   c                    s"   g | ]}ˆd ˆ› d|› �ˆ ƒ‘qS )ú@ú-r!   )rM   Úsuffix)rƒ   rˆ   Úprefixr!   r"   rW   º  s   ÿz%make_margin_boxes.<locals>.<listcomp>c                 s   s   | ]}|j V  qd S r   )rY   rU   r!   r!   r"   rO   ½  rX   z$make_margin_boxes.<locals>.<genexpr>)r   g      à?r	   )rn   rq   z@top-left-cornerz@top-right-cornerz@bottom-left-cornerz@bottom-right-cornerN)r7   r8   rD   rE   Úborder_widthÚborder_heightÚanyr\   ÚziprY   Ú
position_xÚ
position_yÚmargin_heightÚmargin_widthrT   rb   Úmargin_box_content_layout)r4   r`   r‡   r7   r8   rD   rE   Zmax_box_widthZmax_box_heightZ
page_end_xZ
page_end_yZgenerated_boxesrR   r“   r”   ÚsuffixesZfixed_outerZvariable_outerrZ   r5   Úoffsetr‚   Úcb_widthÚ	cb_heightr!   )rƒ   r4   rˆ   r`   rŽ   r‡   r"   Úmake_margin_boxesd  s”    /
ÿ
ÿ
ÿ
ÿù

þÿ
ÿ

ÿ
þÿüÿÿrœ   c                 C   sÖ   g }t | |t dd||dddd�
\}}}}}}|du s:J ‚|D ]}t| |||ddd� q>|jd }|dv rÒ|jrÒ|jd }	|jd	 }
|	j}|
j|
 ¡  }|| }|j| }|d
krº|d }|jD ]}| d|¡ qÀ|S )u<   Layout a margin boxâ€™s content once the box has dimensions.NTF)Úbottom_spaceÚ
skip_stackÚpage_is_emptyÚabsolute_boxesÚfixed_boxesÚadjoining_marginsÚdiscardÚ	max_linesr   ©r�   rž   Úvertical_align)r‰   rp   éÿÿÿÿr‰   r   )	r   r   r   rd   r}   r”   r•   r6   Ú	translate)r4   r`   r5   Úpositioned_boxesÚ	resume_atÚ	next_pageÚ_Úabsolute_boxr¦   Zfirst_childÚ
last_childrn   rp   Úcontent_heightr™   Úchildr!   r!   r"   r—   ê  s2    ý
þ




r—   c                 C   sÂ   || j  }| jdkrH| jdkr$d| _| jdkr4d| _|| j | j | _nn| j| j  kr`dkr|n n|| j d  | _| _n:| jdkrš|| j | j | _n| jdkr¶|| j | j | _|  ¡  dS )a¾  Take a :class:`OrientedBox` object and set either width, margin-left
    and margin-right; or height, margin-top and margin-bottom.

    "The width and horizontal margins of the page box are then calculated
     exactly as for a non-replaced block element in normal flow. The height
     and vertical margins of the page box are calculated analogously (instead
     of using the block height formulas). In both cases if the values are
     over-constrained, instead of ignoring any margins, the containing block
     is resized to coincide with the margin edges of the page box."

    https://drafts.csswg.org/css-page-3/#page-box-page-rule
    https://www.w3.org/TR/CSS21/visudet.html#blockwidth

    r+   r   r   N)r   r$   r   r   r@   )r5   Zcontaining_block_sizeÚ	remainingr!   r!   r"   Úpage_width_or_height	  s    





r²   c                 C   s   t t|| ƒ|ƒ d S r   )r²   rB   )r5   r4   Zcontaining_block_widthr!   r!   r"   Ú
page_width(  s    r³   c                 C   s   t t|| ƒ|ƒ d S r   )r²   r3   )r5   r4   Zcontaining_block_heightr!   r!   r"   Úpage_height-  s    r´   c           6   
   C   s8  |   |¡}|j|d< t ||¡}|jd }t||ƒ d|_d|_|\}	}
t|| |	ƒ t	|| |
ƒ | 
¡ |_| ¡ |_|j|j | _|}|   |d¡}t ||¡}t||ƒ | 
¡ |_| j|_|jrÎ|}| g ¡}t|tjƒsÞJ ‚|  ¡  || _g | _|| _| j}g | _t|ƒD ]N\}}| j |¡ |  |¡}|�r|dk�r|  |¡ ||d… | _ �q\�qd}g }g }g }i }| j ¡ }|| _|D ]|\}}}| ¡ |_| ¡ �r¼t | ||||d|ƒ\}}n$| !¡ �sÊJ ‚t"| |||d|ƒ\}}| |¡ |�r„|||f||< �q„t#| |d||||||ƒ	\}}}}}}|�s0J ‚||j$ |_$t% &| '¡ ¡}t#| |t( d|j)d||ƒd }|j*| +¡  d� dd	„ |D ƒ|_,|D ]} t-| | ||ddd
� �qŽ|  .|¡ ||g|_$t/|dƒ t% 0||¡ |d }!| j1}"| j2}#|#|d  d }$g }%g }&|#d|d … D ]4\}}}}}'|% 3|' 4dg ¡¡ |& 3|' 4dg ¡¡ �q|j5dd�D �]¼}(|(jd })|)�rž|)|%v�rž|$d  |)¡ |% |)¡ |" 6|)|!|d |#¡ |(j7�rº|"j8 4|(j7df¡}*nd}*|*du�rRd}+t9|*ƒ},|,|&v}-|-�r|$d  |,¡ |& |,¡ |d |*_:|*j;�r.|!|*j<k�r$t= '|!¡|*_<d|*_;d}+|*j>}.|.�r–d|.v �rLd|$d< |-�r–|!|*j<k�r–t= '|!¡|*_<|.D ]&}/|! 4|/d¡}0|0du�rnd}+ �q–�qn|*j?}1|1 @¡ D ]P\}2}3d|3v�rº�q¤|"jA 4|2d¡}4|4j:}5|5dk�r¤|2|%v �r¤d|#|5 d d< �q¤|+�rRd|$d< |* B|!¡ �qR|j�r.|}|#|d  d }|||fS )aÕ  Take just enough content from the beginning to fill one page.

    Return ``(page, finished)``. ``page`` is a laid out PageBox object
    and ``resume_at`` indicates where in the document to start the next page,
    or is ``None`` if this was the last page.

    :param int page_number:
        Page number, starts at 1 for the first page.
    :param resume_at:
        As returned by ``make_page()`` for the previous page, or ``None`` for
        the first page.

    ÚoverflowÚsizer   z	@footnoteNT)Údyc                 S   s"   g | ]}|j jd  dkr|j ‘qS )ÚpositionÚfixed)Ú_boxrd   )rM   Úplaceholderr!   r!   r"   rW   “  s   ÿzmake_page.<locals>.<listcomp>r¥   r	   r§   ÚanchorsÚcontent_lookups)ÚplaceholdersÚanchorrj   Fra   Úpages_wantedÚcontent_changed)Crr   Úviewport_overflowr   ÚPageBoxrd   r   r“   r”   r³   r´   Úcontent_box_xÚcontent_box_yr6   Úpage_bottomÚFootnoteAreaBoxr   Úcopy_with_childrenÚ
isinstanceÚBlockLevelBoxÚcreate_block_formatting_contextÚcurrent_pageÚcurrent_page_footnotesÚcurrent_footnote_areaÚreported_footnotesÚ	enumerateÚ	footnotesrb   Úlayout_footnoteÚreport_footnoteÚbroken_out_of_flowÚvaluesÚ
is_floatedr   Úis_absolutely_positionedr
   r   r}   r   r€   rv   r   r`   r¨   r•   r¡   r   Úfinish_block_formatting_contextrf   rx   r{   Ú
page_makerÚextendÚgetÚdescendantsÚcache_target_page_countersÚmissing_linkÚcounter_lookup_itemsÚidÚpage_maker_indexÚpendingÚcached_page_counter_valuesru   Úmissing_countersÚmissing_target_countersÚitemsÚtarget_lookup_itemsÚparse_again)6r4   Úroot_boxrs   rª   Úpage_numberÚ
page_staterd   r`   Zdevice_sizerš   r›   Zinitial_containing_blockZfootnote_area_styleÚfootnote_areaÚprevious_resume_atrÏ   ÚiZreported_footnoterµ   rŸ   r¢   r©   Zout_of_flow_boxesrÔ   Zcontext_out_of_flowr5   rƒ   rž   Zout_of_flow_boxÚout_of_flow_resume_atr«   r¬   r­   Úpage_counter_valuesr{   rÙ   Úremake_stateZcached_anchorsZcached_lookupsZx_remake_stater°   r¿   Zcounter_lookupZcall_parse_againZcounter_lookup_idZrefresh_missing_countersrä   Úcounter_nameÚcounter_valueZtarget_missingÚanchor_nameZmissed_countersÚitemrá   r!   r!   r"   Ú	make_page2  s:   














þ

þ
ÿ
þ
þþÿ
þ





ÿÿ


ÿÿ
ÿÿÿ


ÿrö   c                 C   s\   |  | ¡ |j| |j|j|jd� | ¡ D ],\}}|r*|| kr*|j|||j||jd� q*dS )zASet style for page types and pseudo-types matching ``page_type``.)ÚrootÚparentÚbase_url)re   r÷   rø   rù   N)Úadd_page_declarationsÚset_computed_stylesÚetree_elementrù   Úget_cascaded_styles)rs   Úhtmlrr   rg   re   r!   r!   r"   Úset_page_type_computed_styles  s    
ûürÿ   c                 C   s<   |  ¡ \\}}| d u s|| vr"dS |d u r.dS t| | |ƒS )NFT)ræ   Ú_includes_resume_at)rª   Úpage_group_resume_atZpage_child_indexZpage_child_resume_atr!   r!   r"   r   !  s    r   c                 C   sL  t | ƒ}t| d d … ƒD ]6\}}t||d ƒr@|d  d7  < q|  || ¡ q|d dksd|d shd S | r„| d d |d kr„d S t |¡}|}|}	t| ¡ ƒd \}
}|	j|
 }	|d u r¾qÄ|}q–|	j	d |d krî|  
|d d|g¡ d S t|	tjƒsþd S t|	jƒD ]8\}}| ¡ �s�q|d i||
< ||
 }|}
|}	 qÄ�qd S qÄd S )Nr   r	   Úbreakr‘   r`   r§   r   )ÚlenrÐ   r   Úpopru   rv   rc   ræ   r}   rd   rb   rÉ   r   Ú	ParentBoxÚis_in_normal_flow)Úpage_groupsrª   r«   ré   Zpage_groups_lengthrî   Z
page_groupr  Zcurrent_resume_atZcurrent_elementÚchild_indexÚchild_resume_atr°   r!   r!   r"   Ú_update_page_groups*  s>    


r
  c                 C   sü  |j }||  \}}}}	}
t |	¡}	|d dv r8|d }n<|d dv rp|jd dk}|d dk}||A rjdnd}nd	}t|dkr‚|pœ|dkr�| pœ|joœ|d	u ƒ}|r¨d
n|d }|r¸dnd}t||||ƒ tdd„ |D ƒƒ}t|||| |ƒ}t	|||j
ƒ |d dk�p|d |_d|_| d }t||||||	ƒ\}}}|�sBJ ‚| }| d t|ƒk�r`d}n<|| d  \}}}}}
||k�pš||k�pš||k�pš||	k}|�rôddg g dœ}|d	u|d< ||||	|f}| d t|ƒk�rè| |¡ n||| d < ||fS )a¨  Return one laid out page without margin boxes.

    Start with the initial values from ``context.page_maker[index]``.
    The resulting values / initial values for the next page are stored in
    the ``page_maker``.

    As the function's name suggests: the plan is not to make all pages
    repeatedly when a missing counter was resolved, but rather re-make the
    single page where the ``content_changed`` happened.

    r  )rq   ro   )ÚrectoÚversoÚ	directionÚltrr  ro   rq   NÚ r`   c                 s   s   | ]\}}}||fV  qd S r   r!   )rM   r   r   r¬   r!   r!   r"   rO   �  rX   zremake_page.<locals>.<genexpr>r‘   Fr	   T)rÁ   rÀ   r¼   r½   rÁ   )rÙ   ru   rv   rd   ÚboolrÏ   r
  rc   r   rÿ   rr   Úforced_breakZmargin_clearancerö   r  rb   )r   r  r4   ré   rþ   rÙ   rª   r«   Ú
right_pagerë   r¬   Znext_page_sideZdirection_ltrZbreak_versor   r   r   r   rs   rê   r`   Zpage_maker_next_changedZnext_resume_atZnext_next_pageZnext_right_pageZnext_page_staterñ   rõ   r!   r!   r"   Úremake_page`  sj    

ÿýÿ


ÿ
ÿþüü	r  c           
      c   sþ   d}d}g }| j | d }t|ƒdks6|d s6|d rˆt d|d ¡ d|d< d|d< g |d	< g |d
< t||| ||ƒ\}}	| j}|V  n0t d|d ¡ | j |d  d }	d}|| V  |d7 }|	du r|s| j d|d … | _ | j ¡  | j ¡  dS qdS )zaReturn a list of laid out pages without margin boxes.

    Re-make pages only if necessary.

    r   Nr§   rÁ   rÀ   z"Step 5 - Creating layout - Page %dr	   Fr¼   r½   z/Step 5 - Creating layout - Page %d (up-to-date))rÙ   r  r   Úinfor  rÏ   rÔ   Úclear)
r4   ré   rþ   ra   rî   rÏ   r  rñ   r`   rª   r!   r!   r"   Úmake_all_pages²  s:    ÿþÿ


r  )/Ú__doc__ru   Úcollectionsr   Úmathr   Úcssr   Úformatting_structurer   r   Úloggerr   Úabsoluter
   r   Úblockr   r   Úfloatr   Úmin_maxr   r   Úpercentr   Ú	preferredr   r   r   r   r3   rB   rT   r\   rf   rœ   r—   r²   r³   r´   rö   rÿ   r   r
  r  r  r!   r!   r!   r"   Ú<module>   sF   "G  

 Z	6R