Warning: session_start(): Session cannot be started after headers have already been sent in /home/tvrreohg/public_html/manga.php on line 13
3 0øªj>øã @sdZddlZddlZddlZddlZddlmZddlm Z m Z ddl m Z ddlm Z dbe jdce jdde jdee jdfe jdge jdhe jdie jdje jdke jdle jdme jdne jdoe jdpe jdqe jiZdd„eddƒDƒZejdddœƒdd„Zd d!„Z d"d#„Z!drd$d%„Z"d&d'„Z#d(d)„Z$d*d+„Z%d,d-„Z&dsd.d/„Z'dtd0d1„Z(d2d3„Z)d4d5„Z*d6d7„Z+d8d9„Z,ej-d:ƒj.fd;d<„Z/dud=d>„Z0d?d@„Z1dAdB„Z2dCdD„Z3ej4j5dEƒZ6dFdG„Z7dHdI„Z8dJdK„Z9dvdMdN„Z:dOdP„Z;dQdR„ZdWdX„Z?dYdZ„Z@d[d\„ZAd]d^„ZBd_d`„ZCe@e@eBeCeAdaœZDdS)xa0 weasyprint.formatting_structure.build ------------------------------------- Turn an element tree with associated CSS style (computed values) into a "before layout" formatting structure / box tree. This includes creating anonymous boxes and processing whitespace as necessary. éNé)Úhtml)Úcomputed_valuesÚ properties)ÚLOGGERé)ÚboxesÚblockÚflowÚinlineú flow-rootÚtableÚflexú table-rowútable-row-groupútable-header-groupútable-footer-groupú table-columnútable-column-groupú table-cellú table-captioncCsi|]}t|dƒ|“qS)iàþ)Úchr)Ú.0Úi©rúK/tmp/pip-build-_d5lkt3n/weasyprint/weasyprint/formatting_structure/build.pyú 1sré!éu u−)é é-cCs$t|ƒ}t|ƒ}t|ƒ}t|ƒ}|S)zDCreate anonymous boxes in box descendants according to layout rules.)Úanonymous_table_boxesÚ flex_boxesÚinline_in_blockÚblock_in_inline)ÚboxrrrÚcreate_anonymous_boxes5s r&c shtˆˆ|||||ƒ}|r |\}n&d‡‡fdd„ } tˆ| |||||ƒ\}|jƒd|_t|ƒ}t|ƒ}|S)z=Build a formatting structure (box tree) from an element tree.Ncs0ˆ||ƒ}|dk r,|ˆkr$d|d<nd|d<|S)Nr r ÚdisplayÚnone)r r )r(r)ÚelementÚ pseudo_typeÚstyle)Ú element_treeÚ style_forrrÚroot_style_forIs   z2build_formatting_structure..root_style_forT)N)Úelement_to_boxZcheck_pending_targetsZis_for_root_elementr&Úset_viewport_overflow) r,r-Úget_image_from_uriÚbase_urlÚtarget_collectorÚ counter_styleÚ footnotesÚbox_listr%r.r)r,r-rÚbuild_formatting_structure>s  r7cCs"t|ddd…||||ƒ}|S)Nr'r)ÚBOX_TYPE_FROM_DISPLAY)Ú element_tagr+Úcontentr)r%rrrÚmake_box^s r;c Csht|jtƒsgS||ƒ}|d} | dkr,gS|ddkrV|ddkrNd|d<nd|d<t|j|g|ƒ} |d kr„d gdd gidhgf}|\} } } t||ƒg}| jtƒƒ||d ƒ| _||d ƒ| _g}d |dkròt t |||||||ƒƒ}|j |ƒ|j t |d|||||ƒƒ|d�r(|j |d| | ƒ|j}|�rH|jtjj| |ƒƒxø|D]ð}t||||||||ƒ}|�rà|d jddk�rà|d }d|jd<|j|ƒ||dƒ}t|j›d�|g|ƒ}t||| | |||ƒ|_||_|g}|j |ƒ|j}|�rNtjj| |ƒ}|�r2t|dtjƒ�r2|dj|j7_n |j|ƒ�qNW|j t |d|||||ƒƒx2| jƒD]&}| |jƒ| |�sf| j|ƒ�qfW|| _t| ƒt|| || ||ƒt| ƒ|�ròt| jƒdk�rò|ddk�rò| jjtjj| dƒƒ|ddk�rX| ddd7<||dƒ}t|j›d�|g|ƒ}t|| | | |||ƒ|_| jjd |ƒtj|| ||ƒS)a Convert an element and its children into a box with children. Return a list of boxes. Most of the time the list will have one item but may have zero or more than one. Eg.::

Some emphasised text.

gives (not actual syntax):: BlockBox[ TextBox['Some '], InlineBox[ TextBox['emphasised'], ], TextBox[' text.'], ] ``TextBox``es are anonymous inline boxes: See http://www.w3.org/TR/CSS21/visuren.html#anonymous r'r(ÚfloatÚfootnoteZfootnote_displayr r r Nrz first-letterz first-linez list-itemÚbeforeÚanchorz footnote-callz::footnote-callrÚafterÚlist_style_positionÚoutsideu​zfootnote-markerz::footnote-marker)r()r r )r r éÿÿÿÿrCrC) Ú isinstanceÚtagÚstrr;Úupdate_countersÚappendÚsetZfirst_letter_styleZfirst_line_styleÚlistÚ marker_to_boxÚextendÚbefore_after_to_boxZ store_targetÚtextrÚTextBoxÚanonymous_fromr/r+Úcontent_to_boxesÚchildrenr=ÚtailÚpopÚprocess_whitespaceÚset_content_listsÚprocess_text_transformÚlenÚinsertrZhandle_element)r)r-r1r2r3r4r5Ústater+r'r%Ú quote_depthÚcounter_valuesÚcounter_scopesrRÚ marker_boxesrNZ child_elementZ child_boxesr=Z call_styleZ footnote_callÚtext_boxÚnameZ marker_styleÚmarkerrrrr/ds¦                                r/c Csø|||ƒ}|r|dkrgS|d}|d kr.gS|d} | d krBgSt|j›d|›�|g|ƒ} |\} } } t||ƒg}d|kržtt|||||||ƒƒ}|j|ƒ|jt|| | | |||ƒƒ|| _|d dkrÒd | _n |\}} } t || |d | ||ƒ| gS) z8Return the boxes for ::before or ::after pseudo-element.Nr'r(r:ÚnormalÚinhibitz::z list-itemÚbookmark_labelÚ)r()rbrcr() r;rErGrJrKrLrQrRrdÚcompute_bookmark_label)r)r*rZr-r1r3r4r+r'r:r%r[r\Ú_counter_scopesrRr^Ú _quote_depthrrrrMs:            rMc csŒ||dƒ}g}|\} } } t|j›d�|||ƒ} |ddkr>dS|d\} }|ddkrr|jt|| | | |||ƒƒnŽ| d kr¤||d �}|dk r¤tjj| |ƒ} |j| ƒ| o´|d dk�r| jd dgƒd}|d }|j ||ƒ}tj j| |ƒ} d| j d<|j| ƒ|�s dS|ddk�rttj j| |ƒ}d|j d<|ddk�rLt jddƒ}n t jddƒ}tj}d||fff|j d<ntjj| |ƒ}|VdS) zyYield the box for ::marker pseudo-element if there is one. https://drafts.csswg.org/css-lists-3/#marker-pseudo raz::markerr'r(NZlist_style_imager:rbrcÚurl)riZlist_style_typez list-itemrrzpre-wrapÚ white_spacerArBZabsoluteÚpositionÚ directionZltrédú%Ú translateZ transform)r()rbrcrCiœÿÿÿ)r;rErLrQrÚInlineReplacedBoxrPrHÚgetZ render_markerrOr+ÚBlockBoxrZ DimensionrZ ZERO_PIXELSÚ InlineBox)r)rZZ parent_styler-r1r3r4r+rRr[r\rgr%Z image_typeÚimageÚ counter_valueÚ counter_typeZ marker_textZ marker_boxZ translate_xZ translate_yrrrrK5sH             rKcCs|t|ƒ|kr|j|ƒdS)zCollect missing counters.N)rJrH)Ú counter_namer\Úmissing_countersrrrÚ_collect_missing_counterwsrycCs*||kr&|j|gƒ}||kr&|j|ƒdS)z“Collect missing target counters. The corresponding TargetLookupItem caches the target's page based counter values during pagination. N)Ú setdefaultrH)rwZlookup_counter_valuesZ anchor_nameÚmissing_target_countersrxrrrÚ_collect_missing_target_counter}s r|c , s6g‰tƒ‰‡‡‡fdd„} g}i}| dk o0| dk }|jo<| }tˆdƒsTtj|ƒˆ_�x¸|D�]®\}}|dkrx| |ƒq\|dkrÂ|dk rÂ|\}}|dkršq\||d�}|dk rÀˆjtjj ˆ|ƒƒq\|d krät |ˆƒ}| |j ƒƒq\|d k�r6|\}‰|�rt |||ƒˆd k�r |j |d gƒd'}| ˆj|ˆƒƒq\|dk�r�|\}}‰|�r\t |||ƒˆd k�r | |j‡‡fdd„|j |d gƒDƒƒƒq\|dk�rÊ|�s´tjddj|ƒƒq\| | j| f|žŽƒq\|dk�rb|\}}‰|j|ˆ||ƒ}|jdk�r^|jj}|�rt|||j|ƒ|ƒ|jjƒ}|j|ƒˆd k�r`|j |d gƒd(}| ˆj|ˆƒƒnPq\|dk�r|\}}}‰|j|ˆ||ƒ}|jdk�r|d dk�r¤P|d }|jj}|�rÎt|||j|ƒ|ƒ|jjƒ}|j|ƒˆd k�r| |j‡‡fdd„|j |d gƒDƒƒƒnPq\|dk�rl|\}} |j|ˆ||ƒ}|jdk�rh|j}!t | |!ƒ}"| |"j ƒƒnPq\|dk�r |dk �r | dk �r d|k}#|jdƒ }$|#�sºtd |d d ƒ|d <|$�rô| \}%}&|#�rÒ|%n|&}'| |'t|d t|'ƒd ƒƒ|#�r |d d 7<q\|dk�r¾|�s0tjddj|ƒƒq\| j| f|žŽ}(|(dk�rLq\|(jƒ}(d|(jd<t |(tj!ƒ�r²xD|(j"ƒD]8})|)jd d)k�rŽ�qvt#|)j|)||||ˆ| | d"� |)_$�qvWˆj|(ƒq\|d#kr\tj%j ˆ|d ƒ}*tj&j ˆ|*fƒ}+d$|+jd%<d$|*jd%<d&|+_'ˆj|+ƒq\Wˆ�sˆ�r2|j(ˆ||||ƒˆSdS)*aeCompute and return the boxes corresponding to the ``content_list``. ``parse_again`` is called to compute the ``content_list`` again when ``target_collector.lookup_target()`` detected a pending target. ``build_formatting_structure`` calls ``target_collector.check_pending_targets()`` after the first pass to do required reparsing. csNˆjdƒ|rJˆr6tˆdtjƒr6ˆdj|7_nˆjtjjˆ|ƒƒdS)NTrrCrC)ÚaddrDrrOrNrHrP)rN)Ú content_boxesÚhas_textÚ parent_boxrrÚadd_text¢s  z&compute_content_list..add_textNÚcached_counter_valuesÚstringriZexternal)riz content()z counter()r(rrz counters()c3s|]}ˆj|ˆƒVqdS)N)Ú render_value)rru)r4rvrrú Úsz'compute_content_list..zstring()z,"string(%s)" is only allowed in page marginsú ztarget-counter()z up-to-dateztarget-counters()c3s|]}ˆj|ˆƒVqdS)N)r„)rru)r4rvrrr…sz target-text()ÚquoteÚopenzno-z element()z-"element(%s)" is only allowed in page marginsÚstaticrkr:rb)ÚcontextÚpagezleader()ÚprerjTrCrC)rbr())rIZ collectingÚhasattrÚcopyÚdeepcopyr‚rHrrprPÚTEXT_CONTENT_EXTRACTORSÚstripryrqr„ÚjoinrÚwarningZget_string_set_forÚ lookup_targetrZÚ target_boxr|Zanchor_name_from_tokenZcached_page_counter_valuesÚupdateÚ startswithÚmaxÚminrXZget_running_element_forr+rDÚ ParentBoxÚ descendantsrQrRrOrsZ is_leaderZcollect_missing_counters),Ú content_listr€r\Ú css_tokenÚ parse_againr3r4r1r[Z quote_stylerŠr‹r)r�rxr{Zin_page_contextZneed_collect_missingÚtype_ÚvalueÚoriginÚurirtZ added_textrwruÚ separatorZ anchor_tokenr”Z target_valuesÚlocal_countersZseparator_stringZ text_styler•rNZis_openrYZ open_quotesZ close_quotesÚquotesZnew_boxÚchildr_Z leader_boxr)r~r4rvrr€rÚcompute_content_list‹s                                                   r§c sfd‡‡‡‡‡‡fdd„ } ˆddkr(gS|dd…‰d} tˆdˆ|| | ˆˆˆ|ˆd||ƒ } | pdgS)z:Take the value of a ``content`` property and return boxes.Nc sx|dkri}n|jƒ}|jˆjƒg}|jtˆˆˆ|ˆˆˆƒƒtˆjƒdkrntˆjdtj ƒrn|ˆjd_n|ˆ_dS)z9Closure to parse the ``parent_boxes`` children all again.Nrr) rŽr–r‚rLrQrXrRrDrÚLineBox)Úmixin_pagebased_countersr¤Zlocal_children)r4r1Úorig_quote_depthr€r+r3rrrž\s  z%content_to_boxes..parse_againr:rcr¥)N)r§) r+r€r[r\r1r3r4rŠr‹ržr�r6r)r4r1rªr€r+r3rrQXs  rQc s”d ‡‡‡‡‡‡fdd„ }dˆ›�}tˆˆ|||ˆˆˆd�} | dk r�djdd„| Dƒƒ} x(ˆjD]} | d ˆkr^ˆjj| ƒPq^Wˆjjˆ| fƒdS) zCParse the content-list value of ``string_name`` for ``string-set``.Ncs:|dkri}n|jƒ}|jˆjƒtˆˆˆˆ|ˆˆƒdS)z7Closure to parse the string-set string value all again.N)rŽr–r‚Úcompute_string_set)r©r¤)r%rœr4r)Ú string_namer3rrrž…s  z'compute_string_set..parse_againz string-set::)r)recss |]}t|tjƒr|jVqdS)N)rDrrOrN)rr%rrrr…šsz%compute_string_set..r)N)r§r’Ú string_setÚremoverH) r)r%r¬rœr\r3r4ržr�r6rƒZstring_set_tupler)r%rœr4r)r¬r3rr«‚s      r«c sRif‡‡‡‡‡fdd„ }d}tˆˆ|||ˆˆˆd�}|rNdjdd„|Dƒƒˆ_dS) z5Parses the content-list value for ``bookmark-label``.cs@|dkri}n|jƒ}|jƒ}|jˆjƒtˆˆˆ|ˆˆƒdS)z.Closure to parse the bookmark-label all again.N)rŽr–r‚rf)r©r¤)r%rœr4r)r3rrrž§s  z+compute_bookmark_label..parse_againzbookmark-label)r)recss|]}t|ƒVqdS)N)Úbox_text)rr%rrrr…ºsz)compute_bookmark_label..N)r§r’rd) r)r%rœr\r3r4ržr�r6r)r%rœr4r)r3rrf¤s  rfc Csrg|_|ddkrDx0t|dƒD] \}\}}t|||||||ƒq W|ddkrXd|_nt|||d|||ƒdS)zˆSet the content-lists values. These content-lists are used in GCPM properties like ``string-set`` and ``bookmark-label``. r­r(rdreN)r­Ú enumerater«rdrf) r)r%r+r\r3r4rr¬Z string_valuesrrrrV½s     rVc Cs*|\}}}|d }xF|dD]:\}}||kr:||jƒn |j|ƒ|j|gƒj|ƒqWxL|dD]@\}}|j|gƒ}|sœ||ksˆt‚|j|ƒ|jdƒ||d <qdW|d} | dkrÐd|dkrÌd g} ng} xT| D]L\}}|j|gƒ}|�s||k�sþt‚|j|ƒ|jdƒ|d |7<qÖWd S)z$Handle the ``counter-*`` properties.rZ counter_resetZ counter_setrÚcounter_incrementÚautoú list-itemr'NrCrC)r³rrC)rTr}rzrHÚAssertionError) rZr+rhr\r]Zsibling_scopesr`r Úvaluesr±rrrrGÓs4           rGz\ScCst|tjƒo||jƒ S)z9Return True if ``box`` is a TextBox with only whitespace.)rDrrOrN)r%Z_has_non_whitespacerrrÚ is_whitespaceúsr¶c#s’|dkr‡fdd„}g}xV|D]N}||ƒrT|rLˆj|gd�}t||ƒVg}|Vqt|tjƒrbq|j|ƒqW|rŽˆj|gd�}t||ƒVdS)z´ Wrap consecutive children that do not pass ``test`` in a box of type ``wrapper_type``. ``test`` defaults to children being of the same type as ``wrapper_type``. Ncs t|ˆƒS)N)rD)r¦)Ú wrapper_typerrÚtestszwrap_improper..test)rR)rPÚtable_boxes_childrenrDrÚFlexContainerBoxrH)r%rRr·r¸Zimproperr¦Úwrapperr)r·rÚ wrap_improperÿs     r¼cCs4t|tjƒ s|jƒr|Sdd„|jDƒ}t||ƒS)zŸRemove and add boxes according to the table model. Take and return a ``Box`` object. See http://www.w3.org/TR/CSS21/tables.html#anonymous-boxes cSsg|] }t|ƒ‘qSr)r!)rr¦rrrú 1sz)anonymous_table_boxes..)rDrršÚ is_runningrRr¹)r%rRrrrr!%sr!csÆtˆtjƒrg}n6tˆtjƒrHdd„|Dƒ}|sH‡fdd„tˆjƒDƒ}ˆjr´t|ƒdkr´|dd…\}}|jr€t |ƒr€|j ƒt|ƒdkr´|dd…\}}|jr´t |ƒr´|j dƒdd„t dg|dd…||dd…dgƒDƒ}tˆtj ƒ�r t ˆ|tjd d „ƒ}ntˆtjƒ�r&t ˆ|tjƒ}tˆtjƒ�rDt ˆ|tjƒ}nt ˆ|tjd d „ƒ}tˆtjƒ�r|t ˆ|tjd d „ƒ}n tˆƒ‰t ˆ|tj ‡fd d „ƒ}tˆtj ƒ�r´tˆ|ƒSt|ƒˆ_ˆSdS)z3Internal implementation of anonymous_table_boxes().cSsg|]}t|tjƒr|‘qSr)rDrÚTableColumnBox)rr¦rrrr½=sz(table_boxes_children..csg|]}tjjˆgƒ‘qSr)rr¿rP)rZ_i)r%rrr½CsrNrcSs2g|]*\}}}|o(|jo(|o(|jo(t|ƒs|‘qSr)Úinternal_table_or_captionr¶)rZ prev_childr¦Z next_childrrrr½\s  rcSs|jS)N)Úproper_table_child)r¦rrrÚnsz&table_boxes_children..cSst|tjƒ S)N)rDrÚ TableCellBox)r¦rrrrÂzscSs|j S)N)rÁ)r¦rrrr€scs|j pˆ|jkS)N)rÁZproper_parents)r¦)Ú parent_typerrrÂ…séþÿÿÿrC)rDrr¿ÚTableColumnGroupBoxÚrangeÚspanZtabular_containerrXrÀr¶rTÚzipÚTableBoxr¼Ú TableRowBoxÚTableRowGroupBoxrÃrsÚInlineTableBoxÚtypeÚ wrap_tablerJrR)r%rRZinternalrNr)r%rÄrr¹5sV           r¹c! CsVg}g}g}tj|tj|tj|tj|tj|i}x|D]}|t|ƒj|ƒq4Wggdœ}x |D]}||jdj|ƒq^Wt t ||tjƒƒ} d} xN| D]F} | | _ | j rÒx| j D]} | | _ | d7} q®Wt | j ƒ| _q–| | j7} q–W| } t ||tjƒ}g}d}d}xb|D]Z} | jd}|dk�r2|dk�r2d| _| }n*|dk�rR|dk�rRd| _| }n |j| ƒ�qW|dk �rr|gng||dk �rˆ|gng}d}�x |D�]} d d „| j Dƒ}xÜ| j D]Ò}|jdƒ}d} x¼|j D]²}x| |k�rî| d7} �qØW| |_ | |j}|jdk�rtt |ƒd}|jdk�r0|}||_n t|j|ƒ|_|d|jd…}t| |ƒ}x|D]}|j|ƒ�q`W|} t| | ƒ} �qÒW�q¸W|t | j ƒ7}�qšW|j|ƒ}t| ƒ|_|jd d k�rÔt|| |ƒ|_t|tjƒ�rêtj}ntj }|j!||d|g|dƒ}|jj"ƒ|_d|_#x0t$j%D]&} |j| |j| <t$j&| |j| <�q(W|S)a“Take a table box and return it in its table wrapper box. Also re-order children and assign grid positions to each column and cell. Because of colspan/rowspan works, grid_y is implicitly the index of a row, but grid_x is an explicit attribute on cells, columns and column group. http://www.w3.org/TR/CSS21/tables.html#model http://www.w3.org/TR/CSS21/tables.html#table-layout )ÚtopÚbottomZ caption_siderrNr'útable-header-groupTútable-footer-groupcSsg|] }tƒ‘qSr)rI)rÚrowrrrr½Ýszwrap_table..Zborder_collapseZcollapserÐrÑ)rÒ)rÓ)'rr¿rÆrËrÌÚTableCaptionBoxrÎrHr+rJr¼Úgrid_xrRrXrÈZ is_headerZ is_footerrTÚcolspanÚrowspanr™rÇr–r˜Úcopy_with_childrenÚtupleÚ column_groupsÚcollapse_table_bordersZcollapsed_border_gridrDrÍÚInlineBlockBoxrrrPrŽZis_table_wrapperrZTABLE_WRAPPER_BOX_PROPERTIESZINITIAL_VALUES)!r%rRÚcolumnsZrowsZ all_captionsZby_typer¦ZcaptionsÚcaptionrÛrÖÚgroupÚcolumnÚ grid_widthZ row_groupsZbody_row_groupsÚheaderÚfooterr'Ú grid_heightZoccupied_cells_by_rowrÔZoccupied_cells_in_this_rowÚcellZ new_grid_xZ max_rowspanZ spanned_rowsZspanned_columnsZoccupied_cellsr r·r»r`rrrrÏ�s                          rÏÚ transparentcs2ˆo|sggfStdd„ttddddddd d d d g ƒƒDƒƒ‰dd d œ‰t‰ddˆd fd dˆff‰‡‡fdd„t|ƒDƒ‰‡‡fdd„t|dƒDƒ‰‡‡fdd„‰‡‡‡fdd„}ddˆdfddˆff}d}xæ|jD]Ü}xÖ|jD]Ì}x¾|jD]´}xJt|jd|j|jƒD].} x&t|||jƒD]} |ˆ| | <�q&W�qWxJt|j|j|jƒD]2} x*t|d||jƒD]} |ˆ| | <�qrW�qXW|||j||j|jd�qòW|d7}qæWqÚWd}x<|jD]2}x*|jD] }||d|ˆdd�|d7}�qÒW�qÆWd}x4|jD]*}t |jƒ} ||d|ˆ| d�|| 7}�qWx6|j D],} x$| jD]} || | jdd|d��qJW�q>Wx&|j D]} || | jd| j |d��qvW||ddˆ|d�‡fdd„‰‡fdd„}‡fdd„}‡fdd„}d}xÀ|jD]¶}||ƒx¦|jD]œ}||ƒx„|jD]z}ˆ|d ||j||jd!�ƒˆ|d"||j||j|jd!�ƒˆ|d#||j||jd$�ƒˆ|d%||j|j||jd$�ƒ�q W|d7}�qøW�qäWx2|j D](} || ƒx| jD]} || ƒ�qºW�q¦Wˆ|d |ddˆd!�ƒˆ|d"|d|ˆd!�ƒˆ|d#|dddd$�ƒˆ|d%|ˆddd$�ƒˆˆfS)&aResolve border conflicts for a table in the collapsing border model. Take a :class:`TableBox`; set appropriate border widths on the table, column group, column, row group, row, and cell boxes; and return a data structure for the resolved collapsed border grid. css|]\}}||fVqdS)Nr)rrÚvrrrr…!sz)collapse_table_borders..ÚhiddenÚdoubleÚsolidZdashedZdottedZridgeÚoutsetZgrooveÚinsetr()rírìrcs&g|]}‡fdd„tˆdƒDƒ‘qS)csg|]}ˆ‘qSrr)rÚx)Úweak_null_borderrrr½(sz5collapse_table_borders...r)rÇ)rÚy)rârïrrr½(sz*collapse_table_borders..cs"g|]}‡fdd„tˆƒDƒ‘qS)csg|]}ˆ‘qSrr)rrî)rïrrr½*sz5collapse_table_borders...)rÇ)rrð)rârïrrr½*src s–ddlm}|d|›d�}|d|›d�}||d|›d�ƒ}|dkrJdnd |ˆ|f} ˆj||ƒ}|||\} } | | kr’| |||ff|||<dS) Nr)Ú get_colorÚborder_Ú_styleÚ_widthÚ_colorrérr)Zdrawrñrq) Z border_gridZ box_styleÚsiderÖÚgrid_yrñr+ÚwidthÚcolorZscoreZprevious_scoreÚ_)Ú style_mapÚ style_scoresrrÚset_one_border-s  z.collapse_table_borders..set_one_bordercs‚|j}x:t|||ƒD](}ˆˆ|d||ƒˆˆ|d|||ƒqWx:t|||ƒD](}ˆˆ|d||ƒˆˆ|d|||ƒqRWdS)NÚleftÚrightrÐrÑ)r+rÇ)r%rîrðÚwÚhr+ÚyyÚxx)Úhorizontal_bordersrýÚvertical_bordersrrÚ set_borders=sz+collapse_table_borders..set_borders)rîrðrrcs>d|jd|›d�<|d|jd|›d�<ˆ|jd|›d�<dS)Nrëròrórrôrõ)r+)r%röZ twice_width)rçrrÚset_transparent_borderusz6collapse_table_borders..set_transparent_bordercs4ˆ|ddƒˆ|ddƒˆ|ddƒˆ|ddƒdS)NrÐrrÿrÑrþr)r%)rrrÚremove_borderszs   z.collapse_table_borders..remove_borderscs"t‡fdd„ˆ|||…DƒƒS)Nc3s,|]$}|ˆgD]\}\}}}|VqqdS)Nr)rZgrid_rowrúrø)rîrrr…‚szEcollapse_table_borders..max_vertical_width..)r˜)rîrðr)r)rîrÚmax_vertical_width€sz2collapse_table_borders..max_vertical_widthcs"tdd„ˆ||||…DƒƒS)Ncss|]\}\}}}|VqdS)Nr)rrúrørrrr…‡szGcollapse_table_borders..max_horizontal_width..)r˜)rîrðr)rrrÚmax_horizontal_width…sz4collapse_table_borders..max_horizontal_widthrÐ)rîrðrrÑrþ)rîrðrrÿ) Údictr°ÚreversedÚ TRANSPARENTrÇrRrÖr×rØrXrÛrÈ)r rârårZstrong_null_borderr÷Z row_grouprÔrærrrØZ column_grouprárr r r) rârrýrrûrürçrrïrrÜsš                            rÜcCs:t|tjƒ s|jƒr|Sdd„|jDƒ}t||ƒ|_|S)z–Remove and add boxes according to the flex model. Take and return a ``Box`` object. See http://www.w3.org/TR/css-flexbox-1/#flex-items cSsg|] }t|ƒ‘qSr)r")rr¦rrrr½ºszflex_boxes..)rDrršr¾rRÚ flex_children)r%rRrrrr"®s  r"cCsŒt|tjƒr„g}xn|D]f}|jƒs(d|_t|tjƒrD|jjdƒ rDqt|tjƒrrtj j ||gƒ}d|_|j |ƒq|j |ƒqW|S|SdS)NTr†) rDrrºÚis_absolutely_positionedZ is_flex_itemrOrNr‘ÚInlineLevelBoxrrrPrH)r%rRrr¦Ú anonymousrrrr¿s    rFcCs"t|tjƒrÂ|j}|s|Stjdd|ƒ}|jddk}|jddk}|rVtjdd|ƒ}|rf|jddƒ}|r´|jd dƒ}tjd d|ƒ}|}|r¨|jdƒr¨|d d …}d |_ |j dƒ}nd}||_|St|tj ƒoÖ|j ƒ �rxB|j D]8}t|tjtjfƒ�rt||ƒ}qât|ƒ|jƒrâd}qâW|S)z²First part of "The 'white-space' processing model". See http://www.w3.org/TR/CSS21/text.html#white-space-model http://dev.w3.org/csswg/css3-text/#white-space-rules z ?Ú rjrbÚnowrapúpre-linez [ ]* [ ]*r†ú z +rNTF)rbr)rbrr)rDrrOrNÚreÚsubr+Úreplacer—Úleading_collapsible_spaceÚendswithršr¾rRrsrUÚis_in_normal_flow)r%Zfollowing_collapsible_spacerNZnew_line_collapseZspace_collapseZ previous_textr¦rrrrUÕs@       rUcCsªt|tjƒrf|jd}|dkrHdd„dd„dd„dd„dœ||jƒ|_|jd dkrf|jjd d ƒ|_t|tjƒr¦|jƒ r¦x(|jD]}t|tjtj fƒr„t |ƒq„WdS) NÚtext_transformr(cSs|jƒS)N)Úupper)rNrrrrÂsz(process_text_transform..cSs|jƒS)N)Úlower)rNrrrrÂscSs|jƒS)N)Útitle)rNrrrrÂscSs |jtƒS)N)roÚ ASCII_TO_WIDE)rNrrrrÂs)Z uppercaseZ lowercaseÚ capitalizez full-widthZhyphensõ­re) rDrrOr+rNrršr¾rRrsrW)r%rr¦rrrrWs    rWc CsÖt|tjƒ s|jƒr|St|jƒ}|r>|jdkr>|dj|_g}d}xD|D]<}|rZd|_t|tjƒrv|j rv|j}qLd}|j t |ƒƒqLW|j dkrœ||_ t|tj ƒs²||_|Sg}g}xÐ|D]È}t|tj ƒ sÖt‚|rî|jƒrî|j |ƒqÀt|tjƒ�s|�rL|jƒ �rL|�s@t|tjƒ�o:|jdk�o:|jdd k �rˆ|j |ƒqÀ|�r~tj j||ƒ}tjj||gƒ} |j | ƒg}|j |ƒqÀW|�rÌtj j||ƒ}|�rÂtjj||gƒ} |j | ƒn |j |ƒ||_|S) a…Build the structure of lines inside blocks and return a new box tree. Consecutive inline-level boxes in a block container box are wrapped into a line box, itself wrapped into an anonymous block box. This line box will be broken into multiple lines later. This is the first case in http://www.w3.org/TR/CSS21/visuren.html#anonymous-block-level Eg.:: BlockBox[ TextBox['Some '], InlineBox[TextBox['text']], BlockBox[ TextBox['More text'], ] ] is turned into:: BlockBox[ AnonymousBlockBox[ LineBox[ TextBox['Some '], InlineBox[TextBox['text']], ] ] BlockBox[ LineBox[ TextBox['More text'], ] ] ] FrTr†rjrbrúpre-line)rbrr#)rDrršr¾rJrRrrOrNrHr#Útrailing_collapsible_spaceZBlockContainerBoxr¨r´rrrr+rPrr) r%Z box_childrenrRr$r¦Znew_line_childrenÚ new_childrenZ child_boxZline_boxrrrrr#"s^&              r#c Csðt|tjƒ s|jƒr|Sg}d}x¾|jD]´}t|tjƒrÀt|jƒdksVtd|jƒ‚d}xHt||d�\}}}|dkrxPtj j ||gƒ}|j |ƒ|j t |ƒƒq\W|rºtj j ||gƒ}qÈ|}nt |ƒ}||k rÔd}|j |ƒq*W|rì||_|S)a´Build the structure of blocks inside lines. Inline boxes containing block-level boxes will be broken in two boxes on each side on consecutive block-level boxes, each side wrapped in an anonymous block-level box. This is the second case in http://www.w3.org/TR/CSS21/visuren.html#anonymous-block-level Eg. if this is given:: BlockBox[ LineBox[ InlineBox[ TextBox['Hello.'], ], InlineBox[ TextBox['Some '], InlineBox[ TextBox['text'] BlockBox[LineBox[TextBox['More text']]], BlockBox[LineBox[TextBox['More text again']]], ], BlockBox[LineBox[TextBox['And again.']]], ] ] ] this is returned:: BlockBox[ AnonymousBlockBox[ LineBox[ InlineBox[ TextBox['Hello.'], ], InlineBox[ TextBox['Some '], InlineBox[TextBox['text']], ] ] ], BlockBox[LineBox[TextBox['More text']]], BlockBox[LineBox[TextBox['More text again']]], AnonymousBlockBox[ LineBox[ InlineBox[ ] ] ], BlockBox[LineBox[TextBox['And again.']]], AnonymousBlockBox[ LineBox[ InlineBox[ ] ] ], ] Frz9Line boxes should have no siblings at this stage, got %r.N)Ú skip_stackT) rDrršr¾rRr¨rXr´Ú_inner_block_in_inlinerrrPrHr$) r%r%Úchangedr¦ÚstackÚnew_liner ZanonÚ new_childrrrr$’s8=    r$c Csg}d}d}d}|dk}|r"d}n|jƒ\\}}xÔt|j|d…ƒD]ª\}} ||} t| tjƒr‚| jƒr‚|dkstt‚| }| d7} nPt| tjƒr¨t | |ƒ} d}| \} }}n|dks´t‚t | ƒ} | | k rÈd}|j | ƒ|dk rD| |i}|j |ƒ}PqDW|sü|�r|j |ƒ}|||fS)aÑFind a block-level box in an inline formatting context. If one is found, return ``(new_box, block_level_box, resume_at)``. ``new_box`` contains all of ``box`` content before the block-level box. ``resume_at`` can be passed as ``skip_stack`` in a new call to this function to resume the search just after the block-level box. If no block-level box is found after the position marked by ``skip_stack``, return ``(new_box, None, None)`` NFrrT) Úitemsr°rRrDrZ BlockLevelBoxrr´rsr'r$rHrÙ) r%r&r%Zblock_level_boxZ resume_atr(Zis_startÚskiprr¦ÚindexÚ recursionr+rrrr'øs>            r'cCs^|}|jjƒdkrD|jddkrDx"|jD]}|jjƒdkr(|}Pq(W|jd|_d|jd<|S)zé Set a ``viewport_overflow`` attribute on the box for the root element. Like backgrounds, ``overflow`` on the root element must be propagated to the viewport. See http://www.w3.org/TR/CSS21/visufx.html#overflow rZoverflowZvisibleÚbody)r9rr+rRZviewport_overflow)Zroot_boxZ chosen_boxr¦rrrr0-s    r0cCs>t|tjƒr|jSt|tjƒr6djdd„|jƒDƒƒSdSdS)NrecssJ|]B}|jjdƒ r|jjdƒ r|jjdƒ rt|tjƒr|jVqdS)z::beforez::afterz::markerN)r9rrDrrOrN)rr¦rrrr…Hs zbox_text..)rDrrOrNršr’r›)r%rrrr¯Cs   r¯cCsVd}d}t|ƒ}x@|rP|d}tj|ƒ}|d kr:|r6Pd }||7}|d d…}qW|S) NFrerÚPsÚPeÚPiÚPfÚPoTr)r1r2r3r4r5)r¯Ú unicodedataÚcategory)r%Zcharacter_foundZ first_letterrNZ next_letterr7rrrÚbox_text_first_letterQs r8cCs,t|tjƒr$djdd„|jƒDƒƒSdSdS)Nrecss0|](}|jjdƒrt|tjƒ rt|ƒVqdS)z::beforeN)r9rrDrršr¯)rr¦rrrr…es z"box_text_before..)rDrršr’r›)r%rrrÚbox_text_beforebs r9cCs,t|tjƒr$djdd„|jƒDƒƒSdSdS)Nrecss0|](}|jjdƒrt|tjƒ rt|ƒVqdS)z::afterN)r9rrDrršr¯)rr¦rrrr…os z!box_text_after..)rDrršr’r›)r%rrrÚbox_text_afterls r:)rNr:r>r@z first-letter)r r )r r )r r )r r )r r )r r )r r)r r)r)r)r)r)r)r)r)r)N)NNNNNN)NN)N)F)N)EÚ__doc__rŽrr6Ztinycss2.color3Ztinycss2rerÚcssrrÚloggerrrrrrsrÝrÊrÍZFlexBoxZ InlineFlexBoxrËrÌr¿rÆrÃrÕr8rÇr r–r&r7r;r/rMrKryr|r§rQr«rfrVrGÚcompileÚsearchr¶r¼r!r¹rÏZcolor3Z parse_colorr rÜr"rrUrWr#r$r'r0r¯r8r9r:r�rrrrÚ sŒ       !0B L ("' &Z  9pf 5