
    3vjm                         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 ddlmZmZ d Z	 dd	Z G d
 d      Zd Z	 ddZddZd Zd Z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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).

    PangoRectangle *letter_spacingnormal)	r
   newr   pango_layout_line_get_extentsNULLwidthr   heightrelease)linestylelogical_extentsr   r   s        M/root/.hermes/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                   >    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                 B    || _         | j                  |       || _        y N)justification_spacingsetup	max_width)selfr   r<   r>   s       r   __init__zLayout.__init__;   s    %:"

5"r   c                    || _         d| _        |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$                         t+        |d   t,              rJ d       t/        |      }t	        j
                  t        j0                  |      t        j                        | _        t        j4                  | j2                  d       t        j6                  | j2                  |       |d	   }|d
k7  rt	        j
                  t        j8                  ||| j$                        t        j:                        }t<        t        j>                  |      z  | _         t<        t        jB                  |      z  | _"        t<        t        jF                  |      z  | _$        t<        t        jJ                  |      z  | _&        t<        t        jN                  |      z  | _(        nd | _         d | _"        d | _$        tS        |d   |d   |d   |d   |d   |d   |d   |d         }	|	rdjU                  d |	jW                         D              jY                         }	|j                  jR                  j[                  |	t        j\                  |	            }
t        j^                         }t        j`                  ||
       t        jb                  | j2                  |       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   )2r   first_line_directionfont_configfont_mapr
   gcr   pango_font_map_create_contextr   g_object_unref'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   rY   pango_contextlang_prD   font_descriptiontext_decorationmetricsfeaturesattr	attr_lists               r   r=   zLayout.setup@   sb   
$%!$$--//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  $$22==%<<XFHD113I((D9--dkk9E r   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_dirrW   )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   rZ   rz   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           	      L   t        | j                  d   t              ryt        | 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)re   r   r   r9   r<   r*   r+   r   roundrU   r
   rZ   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(B(BCFOOC$**Z"889++-GD! tzz2HE1%LE

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

5dii.r   )r   NF)__name__
__module____qualname____doc__r@   r=   r+   r*   r   r-   r   rR   r   r   r9   r9   9   s,    <#
DFL!=~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   contextr>   r<   r'   	text_wraps          r   create_layoutr      sh    E0)<F m$(JJIy7/B$$V]]CAy8IH8T4UV
OODMr   c                    ddl m} |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(  r}|r{|}'t/        ||      x}(r|'d|( }'d})|'rbt1        |'|      }*|*rP|*\  }+},|'|+|, }|,|+z
  | k\  r3t%        ||      \  }}||z
  }- ||d   ||      }.|-|.kD  s|-dk  rd}%|)|+z  })n|'|,d }'|)|,z  })nn|'rb|&rl|j3                  |$      rd|}}t5        j6                  |$|      D /cg c]  }/|/j9                          }0}/|0j;                          |0D 1cg c]
  }1|d|1dz     }2}1nz|%rv||!|"| f}3|j<                  j?                  |3      }4|4't+        j@                  ||!|"      }4|4|j<                  |3<   |d) }5|4jC                  |      D cg c]
  \  }}|5|z    }2}}ng }2|2r|2D ]{  }6||6z   }||d   z   }7t        |7||||      }8|8j                         \  }9}:t%        |9|      \  };}||;z
  }<|:du xr |<dk\  xs |6|2d
   k(  }#|#s^|8}|9}t        |j                               } n |#s|sd}#|j                  7       t        jD                  |j                  d
       |j                         \  }}t        j                               }| t        |         |$k(  r|t        |$j                               z  }|#sx|j3                  |$      rgd}#||d   z   }7|j                  |7       t        jD                  |j                  d
       |j                         \  }}t        |j                               }|d   }=t%        ||      \  }}||z
  }-|d   dk(  xs |xr |=dk(  xs
 |=dk(  xr | }>|-dk  r|>rd}#|j                  |        t        jD                  |j                  t	        |tF        z               t        jH                  |j                  tJ        d          |j                         \  }}:|:xs |j(                  }|t        | j                               k\  rd}t#        || |||	||#|d         S c c}/w c c}1w 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   )
percentager   r   )r   nowrapr   N   	font_sizer"   r!   r    hyphensrD   hyphenate_limit_charsF   ­rG   autor   hyphenate_limit_zoneT)rD   leftrighthyphenate_characterr   
word_breakz	break-allr   r   	WRAP_CHAR)&layout.percentr   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_break_point_from_textget_next_word_boundariesendswithr   r   r   reversedictionariesr_   Pypheniterater&   r	   pango_layout_set_wrapr   )?r/   r   r   r>   r<   is_line_startminimumr   r   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   rD   totalr   r   r2   soft_hyphenauto_hyphenationmanual_hyphenation	next_textnext_break_pointnext_text_indexnext_word_boundaries
start_word	stop_wordspace
limit_zoner   soft_hyphen_indexesidictionary_iterationsdictionary_key
dictionaryprevious_words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$	 >?OQU VVV!"3#34I #;It#L #(<%
I%j;	z)U2*3J*F'$a%(88E!+45ui"IJz)UQY ,0(':5 &ij1	9,/ :  ##K002O-O'){{;@P'QS#EKKMS S##%AT UA!1$1Q3!7 U U	eU3))--n=
Dt5IJ3=G  0)*:?;5?5G5G	5R!T'1ucNU"!T !T !#4 	O"1O"C#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 2iS !V!Ts   <])] ]c                     t        | d   | d   | d   | d   | d   | d   | d   | d   | d	   | d
   | d   | d   | d   | d   f      }|r |t        | d         t        | d         z   z  }|S )NrE   
font_stylefont_stretchfont_weightrI   rJ   rK   rL   rM   rN   rO   font_variation_settingsrC   rD   r   line_height)rf   )r   include_sizerT   s      r   _font_style_cache_keyr    s    
mlnm&'%&!"$%'('(%&'(&'f C  s5%&U=-A)BBBJr   c                    | d   dk(  ryt        | d      }|| j                  j                  v r| j                  j                  |   S t        |       }|j	                  d       |j                         \  }}t        |d|dd	| 
      \  }}}}}}| d   dk(  r||f}|| j                  j                  |<   |S | d   \  }}	|dk(  r|	| d   z  }	|	||	|z
  dz  z   f}|| j                  j                  |<   |S )zReturn a tuple of the used value of ``line-height`` and the baseline.

    The baseline is given from the top edge of line height.

    r   r   )r   r   T)r  r"   r   NF)r0   r1   r   r  r   NUMBERr   )r  rX   strut_layoutsr9   r*   r+   r7   )
r   rT   r'   r   r5   text_heightr6   resulttype_r  s
             r   strutr    s#    [Q
D
9C
e---  ..s33E]F
OOC##%GD!(:b&De)M%Aq!QX]x'h&/5'',}-E;u[))(kK&?1%DDDF+1E##C(Mr   c                    dddddj                  |      }|sJ | j                  j                  |i       }t        |       }||v r||   S | j	                         } d| d<   d| d	<   d
| d<   t        |       }|j                  |       |j                         \  }}t        j                  d      }t        j                  d      }	t        j                  |||	       |dk(  r|j                   t        z  }
n,|dk(  r|	j                  t        z  }
n|	j                  t        z  }
t        j                   |       t        j                   |	       t#        |
| d   z  d      xs d||<   ||   S )z.Return the font size ratio used by given unit.xOu   水0)excapicchr   r   r   r   i  r   r   r  r     g      ?)r_   cacherx   r  copyr9   r*   r+   r
   r   r   r   yr   r   r   r   r   )r   unit	characterr#  	cache_keyr'   r   r5   ink_extentsr   measures              r   character_ratior+  3  s]   3e3?CCDII9KK""4,E%e,IEY JJLE&E
E.E+E]F
OOI##%GD!'',-Kgg01O	''k?Kt|==.:-	e	!((:5!''*4KKKK  Wu['991=DE)r   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   ra   rc   replacer$   r
   r   pango_get_log_attrs)	r/   rD   r~   rb   chartext_pr   r#   r   s	            r   get_log_attrsr1  Z  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   m  s(    Y' 4Hr   c                 z    | rt        |       dk  ry t        | |      }t        |       dz   }t        |d|dz
         S )Nr   r   )r$   r1  r   )r/   rD   r   r#   s       r   r   r   s  sA    3t9q=dD)IY]F	!F1H 566r   c                     t        | |      d uS r;   )r   )r/   rD   s     r   can_break_textr7  {  s    )$5TAAr   c                     | rt        |       dk  ry t        | |      }t        |      D ]'  \  }}|j                  r|} |fS |j                  s&|}) y )Nr   )r$   r1  r3  is_word_endis_word_boundary)r/   rD   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$   r1  r3  listr9  )r/   rD   r   r   r   s        r   get_last_word_endr?    s\    3t9q=dD)IT)_TrT23 !4!!t9q= !r   )FN)TFr   ) r   r   mathr   r   	constantsr   r   r   r
   r   r	   r   r   r   fontsr   r   r   r7   r9   r   r
  r  r  r+  r1  r   r   r7  r   r?  rR   r   r   <module>rC     s~    ' 	   C C M M 6" GK>8h/ h/V 27J2Z,<$N&7B !r   