
    ,g`                         d Z ddlZddlmZ ddlZddlmZmZmZ ddl	m
Z
mZm	Z	mZmZmZmZ ddlmZmZ d Z	 dd	Z G d
 d      Zd Z	 ddZd Zd Zd Zd Zd Zy)z!Decide where to break text lines.    N)inf   )
LST_TO_ISOPANGO_DIRECTIONPANGO_WRAP_MODE)
FROM_UNITSTO_UNITSffigobjectpangopangoft2unicode_to_char_p)font_featuresget_font_descriptionc                    t        j                  d      }t        j                  | t         j                  |       |j
                  t        z  }|j                  t        z  }t        j                  |       |d   dk7  r||d   z  }||fS )zsGet logical width and height of the given ``line``.

    ``style`` is used to add letter spacing (if needed).

    zPangoRectangle *letter_spacingnormal)	r
   newr   pango_layout_line_get_extentsNULLwidthr   heightrelease)linestylelogical_extentsr   r   s        r/home/viktor/gitlab-persoonlijk/factuur-applicatie/venv/lib/python3.12/site-packages/weasyprint/text/line_break.py	line_sizer      s}     gg01O	''chhH!!J.E##j0FKK (*'((&=    c                    | j                   }|r|t        |j                               z  }n|rt        j                  |j
                  d       |j                         d | j                         }	|r|	j                  d      }	|j                  |	       |j                         \  } }
| | j                   nd}t        | |      \  }}t        j                  |j
                        t        z  }|j                          ||||||fS )N r   )lengthlenencoder   pango_layout_set_widthlayoutdecoderstripset_textget_first_liner   pango_layout_get_baseliner   
deactivate)
first_linetextr'   	resume_atspace_collapser   
hyphenatedhyphenation_characterr#   first_line_text_r   r   baselines                 r   first_line_metricsr7      s    F#+22455	 	$$V]]B7 ++-0779 -44S9O(--/
A&0&<""!j%0ME6..v}}=
JH
69eVX==r   c                   B    e Zd ZdZ	 	 d
dZd Zd ZddZd Zd Z	d	 Z
y)Layoutz2Object holding PangoLayout-related cdata pointers.Nc                 D    || _         | j                  ||       || _        y N)justification_spacingsetup	max_width)selfcontextr   r<   r>   s        r   __init__zLayout.__init__;   s    %:"

7E""r   c                    || _         || _        d| _        |7t        j                  t        j                         t        j                        }n|j                  j                  }t        j                  t        j                  |      t        j                        }t        j                  |d       t        j                  |t        |d             |d   dk7  r7t!        t#        j$                  |d   j'                         |d               \  }}n2|d   rt!        |d         \  }}nd }t        j(                         | _        |r:t        j,                        | _        t        j.                  || j*                         t1        |d   t2              rJ d       t5        |      }t        j                  t        j6                  |      t        j                        | _        t        j:                  | j8                  d       t        j<                  | j8                  |       |d	   }|d
k7  rt        j                  t        j>                  ||| j*                        t        j@                        }	tB        t        jD                  |	      z  | _#        tB        t        jH                  |	      z  | _%        tB        t        jL                  |	      z  | _'        tB        t        jP                  |	      z  | _)        tB        t        jT                  |	      z  | _+        nd | _#        d | _%        d | _'        tY        |d   |d   |d   |d   |d   |d   |d   |d         }
|
r|rdj[                  d |
j]                         D              j_                         }
|jX                  ja                  |
t        jb                  |
            }t        jd                         }t        jf                  ||       t        jh                  | j8                  |       y y y )Nr   F	directionfont_language_overrider   langfont_familyzfont_family should be a listtext_decoration_linenonefont_kerningfont_variant_ligaturesfont_variant_positionfont_variant_capsfont_variant_numericfont_variant_alternatesfont_variant_east_asianfont_feature_settings,c              3   0   K   | ]  \  }}| d |   yw)r"   N ).0keyvalues      r   	<genexpr>zLayout.setup.<locals>.<genexpr>   s&       E%/S%3%q  Es   )5r@   r   first_line_directionr
   gcr   pango_ft2_font_map_newr   g_object_unreffont_configfont_mapr   pango_font_map_create_context'pango_context_set_round_glyph_positionspango_context_set_base_dirr   r   r   getlowerpango_language_get_defaultlanguagepango_language_from_stringpango_context_set_language
isinstancestrr   pango_layout_newr'   pango_layout_set_auto_dir!pango_layout_set_font_descriptionpango_context_get_metricspango_font_metrics_unrefr   pango_font_metrics_get_ascentascent)pango_font_metrics_get_underline_positionunderline_position-pango_font_metrics_get_strikethrough_positionstrikethrough_position*pango_font_metrics_get_underline_thicknessunderline_thickness.pango_font_metrics_get_strikethrough_thicknessstrikethrough_thicknessr   joinitemsr%   
setdefaultpango_attr_font_features_newpango_attr_list_newpango_attr_list_insertpango_layout_set_attributes)r?   r@   r   r]   pango_contextlang_prE   font_descriptiontext_decorationmetricsfeaturesattr	attr_lists                r   r=   zLayout.setupA   s   
$%!?vv//173I3IKH **33H//9""$ 	55mUK((?5+=>	@ )*h6,Z^^./557./.1 2LFD 6],U6];LFDD!<<>DM!<<VDDM,,]DMMJeM2C8 	,*	,8/6ff""=1""$ 	''U;//=MN 67f$ff//!#3T]]D..0G %33G<>DK&0??H'JD#*4CCGL+ND''1@@I(KD$+5DDWM,OD( DK&*D#*.D' .!5)A#B)*E2E,F()51J+K+,e4K.L	N
 xx  E3;>>3C E EEKVX  ((33%<<XFHD113I((D9--dkk9E  8r   c                     t        j                  | j                  d      }t        j                  | j                  d      }|t        j                  k(  rd n|j
                  }|j                  | _        ||fS )Nr   r   )r   pango_layout_get_line_readonlyr'   r
   r   start_indexresolved_dirrX   )r?   r.   second_lineindexs       r   r+   zLayout.get_first_line   s_    99$++qI
::4;;J#sxx/[5L5L$.$;$;!5  r   c                 &   |j                  d      }|dk7  r|d |dz    }|| _        t        |      \  }}t        j                  | j
                  |d       | j                  d   }|r|| j                  z  }| j                  d   }|dk(  rd}| j                  d   d	v }| j                  r|s|s|rt        j                  | j
                        t        j                  k(  r6t        j                  t        j                         t        j                        fd
}|r%t        |t        z        } |dt!        |      |       |r|dk(  r@d| _        t        | j                        \  }}t        j                  | j
                  |d       t        |t        z  |z         }	dt!        |      dz
  f}
t#        j$                  dj'                         |      D ]@  }d|j)                         |
v z   } ||j)                         |j+                         ||	z         B |rCt        j,                  d      }dt!        |      c|_        |_        t        j2                  |       t        j4                  | j
                         d|v r| j7                          y y )N
r!      word_spacingr   r   r   overflow_wrap)anywhere
break-wordc                 z    t        j                  |      }| |c|_        |_        t        j                  |       y r;   )r   pango_attr_letter_spacing_newr   	end_indexpango_attr_list_change)startendspacingr   r   s       r   add_attrz!Layout.set_text.<locals>.add_attr   s4    ::7C38#0 $.,,Y=r       u    ​r   u    | F   	)findr/   r   r   pango_layout_set_textr'   r   r<   pango_layout_get_attributesr
   r   rY   r|   pango_attr_list_unrefintr	   r$   refinditerr%   r   r   pango_attr_insert_hyphens_newr   r   r   r~   set_tabs)r?   r/   justifyr   
bytestringr   r   word_breakingr   space_spacingboundary_positionsmatchfactorr   r   s                 @r   r*   zLayout.set_text   sF   		$B;q>D	,T2j##DKKr:zz.1 D666L$45X%N JJ'+EE 	 99,.M99$++FICHH$FF--///1	>
 !$^h%>!?C
O^<% )DI'8'C$D*//T2F #L8$;n$L M&'Z1)<%="[[):):)<jI QE%++-3E"EFFU[[]EIIK-9OPQ ::5A34c*o0 $.,,Y=--dkk9E JMMO r   c           	      b   t        | j                  d   t              rt        | j                  | j                  | j
                        }|j                  d| j                  d   z         |j                         \  }}t        || j                        \  }}t        |      }n"t        | j                  d   j                        }t        j                  t        j                  ddt        j                  |xs d      t        j                         }t        j"                  | j$                  |       y )Ntab_sizer"   r   T)rg   r   r   r9   r@   r<   r*   r+   r   roundrV   r
   rY   r   "pango_tab_array_new_with_positionsPANGO_TAB_LEFTpango_tab_array_freepango_layout_set_tabsr'   )r?   r'   r   r5   r   arrays         r   r   zLayout.set_tabs   s    djj,c2djj$*D*DFFOOC$**Z"889++-GD! tzz2HE1%LE

:.445E444--uz;&&( 	##DKK7r   c                     | ` | `| `y r;   )r'   rd   r   )r?   s    r   r-   zLayout.deactivate   s    K
r   c                 v    | j                  | j                  |       | j                  | j                  d       y )NT)r   )r=   r@   r*   r/   )r?   r   s     r   
reactivatezLayout.reactivate   s(    

4<<'dii.r   )r   N)F)__name__
__module____qualname____doc__rA   r=   r+   r*   r   r-   r   rS   r   r   r9   r9   9   s2    <=>#IFV!=~8"3/r   r9   c           	          t        ||||      }|d   dv }|A|r?|dk  r:t        j                  |j                  t	        t        d|      t        z               |j                  |        |S )z=Return an opaque Pango layout with default Pango line-breaks.white_spacer   zpre-wrappre-linei    r   )r9   r   r&   r'   r   maxr	   r*   )r/   r   r@   r>   r<   r'   	text_wraps          r   create_layoutr      sj    GU$99EF m$(JJIy7/B$$V]]CAy8IH8T4UV
OODMr   c                    |d   dv }|d   dv }|}	|sd}d}
| }||t         k7  r|d   r|d   |
z  |kD  r| j                  d      }|dk7  r | d|d	z    }n| dt        ||d   z  |
z         }t        |||||      }|j	                         \  }}|,|| k7  r'| }|j                  |        |j	                         \  }}n|j                         d| j                         }||k7  rzt        |      d
z   t        |      }}t        j                  |j                  t        j                        || }t        |      %|} n"t        | |||	|      }|j	                         \  }}|t        || ||||      S t!        ||      \  }}|||k  rt        || ||||      S ||k  r7| j                         }|d| j                         }||d j                         }nd}| }||k(  rd}njt        j                  |j                  t        j                        }t        |      d
z   t        |      }}||| }t        |      }||t        |      d
z   z  }|d| j#                  d      }|r|r||xs d   dk(  r||z   }|j                  |       |j	                         \  }}|n|r,t        |j                               d
z   }t        || ||||      S |j$                  d
z   }|t        | j                               k\  rd}n|rt        || ||||      S |d   }|d   xr t'        j(                  |d         }|d   \  }} }!d}"d}#dx}$}%|dk7  r|#||z   v }%|dk(  ry|rwt+        ||      }&|&ri|&\  }'}(||'|( }|(|'z
  |k\  rWt!        ||      \  }}||z
  })|d   j,                  dk(  r||d   j.                  z  dz  }*n|d   j.                  }*|)|*kD  s|)dk  rd}$|%rn|j1                  |#      rd|}}t3        j4                  |#|      D +cg c]  }+|+j7                          },}+|,j9                          |,D -cg c]
  }-|d|-d
z     }.}-d}'nr|$rn|| |!|f}/|j:                  j=                  |/      }0|0't'        j>                  || |!      }0|0|j:                  |/<   |0jA                  |      D cg c]  \  }}|	 }.}}ng }.|.r|.D ]  }1||d' z   |1z   }||d   z   }2t        |2||||      }3|3j	                         \  }4}5t!        |4|      \  }6}||6z
  }7|5du xr |7dk\  xs |1|.d   k(  }"|"sd|3}|4}t        |j                               } n |"s|sd}"|j                  2       t        jB                  |j                  d       |j	                         \  }}t        j                               }| t        |         |#k(  r|t        |#j                               z  }|"sx|j1                  |#      rgd}"||d   z   }2|j                  |2       t        jB                  |j                  d       |j	                         \  }}t        |j                               }|d   }8t!        ||      \  }}||z
  })|d   dk(  xs |xr |8dk(  xs
 |8dk(  xr | }9|)dk  r|9rd}"|j                  |        t        jB                  |j                  t        |tD        z               t        jF                  |j                  tH        d          |j	                         \  }}5|5xs |j$                  }|t        | j                               k\  rd}t        || |||||"|d         S c c}+w c c}-w c c}}w ) a  Fit as much as possible in the available width for one line of text.

    Return ``(layout, length, resume_index, width, height, baseline)``.

    ``layout``: a pango Layout with the first line
    ``length``: length in UTF-8 bytes of the first line
    ``resume_index``: The number of UTF-8 bytes to skip for the next line.
                      May be ``None`` if the whole text fits in one line.
                      This may be greater than ``length`` in case of preserved
                      newline characters.
    ``width``: width in pixels of the first line
    ``height``: height in pixels of the first line
    ``baseline``: baseline in pixels of the first line

    r   r   )r   nowrapr   N   	font_sizer"   r!   r   r    hyphensrE   hyphenate_limit_charsF   ­rH   autohyphenate_limit_zone%d   r   T)rE   leftrighthyphenate_characterr   
word_breakz	break-allr   r   	WRAP_CHAR)%r   r   r   r   r+   r*   r%   r(   r$   r   #pango_layout_get_log_attrs_readonlyr'   r
   r   get_next_break_pointr7   r   r)   r#   pyphenlanguage_fallbackget_next_word_boundariesunitrV   endswithr   r   r   reversedictionariesra   Pypheniterater&   r	   pango_layout_set_wrapr   ):r/   r   r@   r>   r<   is_line_startminimumr   r1   original_max_widthratio
short_textspace_indexr'   r.   resume_indexr4   r   r   text_end_log_attrsfirst_line_widthr5   encoded_textsecond_line_textbreak_point	log_attrssecond_line_log_attrs	next_wordnew_first_line_textr   rE   totalr   r   r2   soft_hyphenauto_hyphenationmanual_hyphenationnext_word_boundaries
start_word	stop_wordspace
limit_zoner   soft_hyphen_indexesidictionary_iterationsdictionary_key
dictionaryfirst_word_parthyphenated_first_line_text
new_layoutnew_first_liner   new_first_line_width	new_spacer   	can_breaks:                                                             r   split_first_liner     s   $ m$(JJI=)-MMN"	 EJc!1eK6H %	1 ))C.Kb !.;q=1
 Js9u[/A#AE#IJKJw	3HJ#)#8#8#: 
LJ$$6 JOOD!'-'<'<'>$J )//1-<@GGIO*, 1A5s:s%*%N%NMM388&--23&8"'(:;G%D%"46KM#)#8#8#: 
L !flNEK 	K#J6a 0I =!flNEK 	K 9${{}&}5<<>'6==? *$ ==fmmSXXV	)A-s:s )% 4*+@A"3/!33K +.55c:I.{/@bASH #2I"=OO/0'-'<'<'>$J#"#&':'A'A'C#Dq#HL-"D&,PUW W $.#4#4q#8L#s4;;='99'+	 "flNEK 	K IG=DV55eFmDD67E4JK,11)&(O>N,NN&T78H$O$8!J	(I>I:%.&/
E&B# !!$44/055<!E*@$A$G$GG#M  "''=!>!D!DJ:% (,$  ##K002O-O'){{;@P'QS#EKKMS S##%AT UA!1$1Q3!7 U U
	eU3))--n=
Dt5IJ3=G  0$.$6$6y$A!C eSE!C !C !#4 	O *-.   
 $e,A&BB '&*E7I%'J %/$=$=$?!NE&/&F# !!$88I$ PQN/5J25N"N #+
"#6#=#=#?@'	* / JOO67((;"113MJ299;<LC()[8K$6$6$8 99/22;? 
e$9:: 	#23$$V]]B7--/
A?1134 /*M#J6a((E 	l{* 	B A+ @,.>w;	 
 qyY
 	$$V]]C	H8L4MN##FMM?;3OP"113
E1
 1 13t{{}--LD&,E/02 2oS !V!Cs   2\7\<]c                 ^   |rt        |      \  }}nd }t        j                         }|rt        j                        }dD ]  }| j	                  |d      }  t        |       \  }}t        |       dz   }t        j                  d|      }t        j                  |t        |      d||       |S )N)u   ‪u   ‫u   ‬u   ‭u   ‮u   ​r   zPangoLogAttr[]r!   )	r   r   rc   re   replacer$   r
   r   pango_get_log_attrs)	r/   rE   r   rd   chartext_pr   r#   r   s	            r   get_log_attrsr    s    (.33533F;B ,||D(+,*40FJY]F(&1I	JXy&Br   c                 J    t        |       D ]  \  }}|j                  s|c S  y r;   )	enumerateis_line_break)r   r   r   s      r   r   r     s(    Y' 4Hr   c                 ~    | rt        |       dk  ry t        | |      }t        |       dz   }t        |d|dz
         d uS )Nr   r   )r$   r  r   )r/   rE   r   r#   s       r   can_break_textr    sF    3t9q=dD)IY]F	!F1H 56dBBr   c                     | rt        |       dk  ry t        | |      }t        |      D ]'  \  }}|j                  r|} |fS |j                  s&|}) y )Nr   )r$   r  r  is_word_endis_word_boundary)r/   rE   r   r   r   word_end
word_starts          r   r   r     si    3t9q=dD)IY' 4H
 x	   J r   c                     | rt        |       dk  ry t        | |      }t        t        |      d d d         D ]$  \  }}|s	|j                  st        |       |z
  c S  y )Nr   r!   )r$   r  r  listr  )r/   rE   r   r   r   s        r   get_last_word_endr  (  s\    3t9q=dD)IT)_TrT23 !4!!t9q= !r   )FN)TF)r   r   mathr   r   	constantsr   r   r   r
   r   r	   r   r   r   r   fontsr   r   r   r7   r9   r   r  r  r   r  r   r  rS   r   r   <module>r     sl    ' 	   C C W W W 6" GK>8o/ o/d 27|2~&C !r   