
    F j                        S r SSKrSSKrSSKrSSKJr  SSKJrJr  SSK	J
r
JrJrJrJr  SSKJr  SSKJrJrJrJrJr  SS	KJrJrJrJrJr  SS
KJr  SSKJ r J!r!  SSK"J#r#  SSK$J%r%J&r&  SSK'J(r(J)r)  \
(       a  SSK*J+r+  SSK,J-r-  \R\                  " \/5      r0Sr1Sr2Sr3Sr4Sr50 S\ " SSS9_S\ " SS9_S\ " SS9_S \ " S!S9_S"\ " S#S9_S$\ " 5       _S%\ " S#S9_S&\ " S!S9_S'\ " SS9_S(\ " SS9_S)\!" S*S+S+S,9_S-\!" S.\Rl                  S/9_S0\!" S1S29_S3\!" S4S.S59_S6\!" S7S8S9S:S;9_S<\!" S=S7S>S?S@9_SA\!" S=S7SBSCS@9_\!" S=S7SDSES@9\!" S=S7SFSGS@9\!" S=S7S1SHS@9\!" S=S7SISJS@9\!" SKSLSM9\!" 5       \!" S.SSN9\!" SLSO9\!" SLSO9SP.	Er7SQr8\5SR-   r9\:" \95      \:" \85      -  \:" \7Rw                  5       5      :X  d   eSSRy                  ST5      r=\R|                  " SU\= SV35      r?0 SWSX_SYSZ_S[S\_S]S^_S_S`_SaSb_ScSd_SeSf_SgSh_SiSj_SkSl_SmSn_SoSp_SqSr_SsSt_SuSt_SvSw_0 SxSy_SzS{_S|S}_S~S_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_E0 SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_E0 SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_E0 SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_E0 SS_SS_SS_SGS _GSGS_GSGS_GSGS_GSGS_GS	GS
_GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_GSGS_E0 GSGS_GSGS_GSGS _GS!GS"_GS#GS$_GS%GS&_GS'GS(_GS)GS*_GS+GS,_GS-GS._GS/GS0_GS1GS2_GS3GS4_GS5GS6_GS7GS8_GS9GS:_GS;GS<_E0 GS=GS<_GS>GS?_GS@GSA_GSBGSC_GSDGSE_GSFGSG_GSHGSI_GSJGSK_GSLGSM_GSNGSO_GSPGSQ_GSRGSS_GSTGSU_GSVGSW_GSXGSY_GSZGS[_GS\GS]_EGS^GS_GS`GSaGSbGScGSdGSeGSfGSgGShGSiGSj.Er@ GS~GSk\\A   GSl\\\-     4GSm jjrBGSn\AGSl\C\A\A4   4GSo jrD " GSp GSq\5      rEGSrGSsGSt\C\A\ \!-  4   GSl\C\A\ \!-  4   4GSu jrFGSv\AGSw\GGSl\A4GSx jrHGSy\AGSz\IGSl\I\A-  4GS{ jrJ " GS| GS}5      rKg(  a  
HTML renderer

The contents of this module are internal to fpdf2, and not part of the public API.
They may change at any time without prior warning or any deprecation period,
in non-backward-compatible ways.

Usage documentation at: <https://py-pdf.github.io/fpdf2/HTML.html>
    N)
HTMLParser)ascii_lowercaseascii_uppercase)TYPE_CHECKINGAnyCallableOptionalUnion   )get_stack_level)
ColorInput
DeviceGray	DeviceRGBcolor_from_hex_stringconvert_to_device_color)AlignCharVPosTextEmphasisXPosYPos)FPDFException)FontFace	TextStyle)OutlineSection)RowTable)get_scale_factor	int2roman)FPDF)	Paragraph   u   •   °u   ∘)titleh1h2h3h4h5h6az#00f	UNDERLINE)coloremphasisbBOLD)r-   codeCourierfamilydelSTRIKETHROUGHemITALICSfontisstrongu
blockquotez#64002d   )r,   t_marginb_margincenterg@)r?   l_margindd
   rB   dtB)
font_styler?   r#   g?      Center)r@   font_size_ptr?   rB   r$   z#960000   gN@)r,   r@   rL   r?   r%      g6i@   g|j@   gRQ@gll@   gd0@      )rB   r?   )r?   font_family)r?   )	r&   r'   r(   r)   lippreolul)
r*   r.   r0   r4   r6   r8   r9   r:   r;   r<   )	r=   rA   rC   rF   rU   rV   rW   rX   rY    )z	-    u    - u    u    u    u   　[z]+black#000000navyz#000080darkbluez#00008b
mediumbluez#0000cdbluez#0000ff	darkgreenz#006400greenz#008000tealz#008080darkcyanz#008b8bdeepskybluez#00bfffdarkturquoisez#00ced1mediumspringgreenz#00fa9alimez#00ff00springgreenz#00ff7faquaz#00ffffcyanmidnightbluez#191970
dodgerbluez#1e90fflightseagreenz#20b2aaforestgreenz#228b22seagreenz#2e8b57darkslategrayz#2f4f4fdarkslategrey	limegreenz#32cd32mediumseagreenz#3cb371	turquoisez#40e0d0	royalbluez#4169e1	steelbluez#4682b4darkslatebluez#483d8bmediumturquoisez#48d1ccindigoz#4b0082darkolivegreenz#556b2f	cadetbluez#5f9ea0cornflowerbluez#6495edrebeccapurplez#663399mediumaquamarinez#66cdaadimgrayz#696969dimgrey	slatebluez#6a5acd	olivedrabz#6b8e23	slategrayz#708090	slategreylightslategrayz#778899lightslategreymediumslatebluez#7b68ee	lawngreenz#7cfc00
chartreusez#7fff00
aquamarinez#7fffd4maroonz#800000purplez#800080olivez#808000grayz#808080greyskybluez#87ceeblightskybluez#87cefa
bluevioletz#8a2be2darkredz#8b0000darkmagentaz#8b008bsaddlebrownz#8b4513darkseagreenz#8fbc8f
lightgreenz#90ee90mediumpurplez#9370db
darkvioletz#9400d3	palegreenz#98fb98
darkorchidz#9932ccyellowgreenz#9acd32siennaz#a0522dbrownz#a52a2adarkgrayz#a9a9a9darkgrey	lightbluez#add8e6greenyellowz#adff2fpaleturquoisez#afeeeelightsteelbluez#b0c4de
powderbluez#b0e0e6	firebrickz#b22222darkgoldenrodz#b8860bmediumorchidz#ba55d3	rosybrownz#bc8f8f	darkkhakiz#bdb76bsilverz#c0c0c0mediumvioletredz#c71585	indianredz#cd5c5cperuz#cd853f	chocolatez#d2691etanz#d2b48c	lightgrayz#d3d3d3	lightgreythistlez#d8bfd8orchidz#da70d6	goldenrodz#daa520palevioletredz#db7093crimsonz#dc143c	gainsboroz#dcdcdcplumz#dda0dd	burlywoodz#deb887	lightcyanz#e0fffflavenderz#e6e6fa
darksalmonz#e9967avioletz#ee82eepalegoldenrodz#eee8aa
lightcoralz#f08080khakiz#f0e68c	alicebluez#f0f8ffhoneydewz#f0fff0azurez#f0ffff
sandybrownz#f4a460wheatz#f5deb3beigez#f5f5dc
whitesmokez#f5f5f5	mintcreamz#f5fffa
ghostwhitez#f8f8ffsalmonz#fa8072antiquewhitez#faebd7linenz#faf0e6lightgoldenrodyellowz#fafad2oldlacez#fdf5e6redz#ff0000fuchsiaz#ff00ffmagentadeeppinkz#ff1493	orangeredz#ff4500tomatoz#ff6347hotpinkz#ff69b4coralz#ff7f50
darkorangez#ff8c00lightsalmonz#ffa07aorangez#ffa500	lightpinkz#ffb6c1pinkz#ffc0cbgoldz#ffd700	peachpuffz#ffdab9navajowhitez#ffdeadmoccasinz#ffe4b5bisquez#ffe4c4	mistyrosez#ffe4e1z#ffebcdz#ffefd5z#fff0f5z#fff5eez#fff8dcz#fffacdz#fffaf0z#fffafaz#ffff00z#ffffe0z#fffff0z#ffffff)blanchedalmond
papayawhiplavenderblushseashellcornsilklemonchiffonfloralwhitesnowyellowlightyellowivorywhiter,   returnc                 p    U (       d  g[         R                  U R                  5       U 5      n[        U5      $ )zt
Convert a web color name to a (R, G, B) color tuple.
cf. https://en.wikipedia.org/wiki/Web_colors#HTML_color_names
N)
COLOR_DICTgetlowerr   )r,   hexcolors     Z/root/GenerationalWealth/GenerationalWealth/venv/lib/python3.13/site-packages/fpdf/html.pycolor_as_decimalr   -  s+     ~~ekkmU3H **    
style_attrc                    0 nU R                  S5       Hj  nU(       d  M  UR                  S5      n[        U5      S:X  d  M.  US   (       d  M:  US   (       d  MF  Uu  pEUR                  5       XR                  5       '   Ml     U$ )zCParse `style="..."` HTML attributes, and return a dict of key-value;:rS   r   r   )splitlenstrip)r   styleelementpairattrvalues         r   parse_css_styler  ;  sm    E##C(}}S!t9>d1gg$q''KD"'++-E**, ) Lr   c                   d  ^  \ rS rSrSrSrSrS SSSSS	SSS
SSSS4SSS\\/\4   S\	\
   S\	\
   S\S\S\S\	\\\
4      S\	\   S\S\	\\\
4      S\	\\\4      S\S\SS4U 4S jjjr\S\S\\
\4   4S j5       r      S:S\	\\
\4      S \	\
   S!\
S"\
S#\\
\4   S$\SS4S% jjrS;S& jrS<S'\S(\	\\-     SS4S) jjrS<S*\	\
   SS4S+ jjrS,\SS4S- jrS,\SS4S. jrS/\S0\\\\S-  4      SS4S1 jrS/\SS4S2 jrS,\SS4U 4S3 jjr S'\SS4S4 jr!SSS5\\"   SS4S6 jr#S7\SS4S8 jr$S9r%U =r&$ )=	HTML2FPDFiH  zRender basic HTML to FPDF)brrC   rF   hrimgrU   tdtrg?c                     U $ N )srcs    r   <lambda>HTML2FPDF.<lambda>Q  s    cr   NFdisc)   r   r   Ttimespdfr   	image_mapli_tag_indentdd_tag_indenttable_line_separatorsul_bullet_charli_prefix_colorheading_sizespre_code_fontwarn_on_tags_not_matchingtag_indents
tag_stylesrT   render_title_tagr   c                 
  > [         TU ]  5         Xl        X`l        X l        [        U[        5      (       a  [        U5      O
[        U5      U l	        Xl
        UR                  =(       d    UU l        UR                  U l        [        R                  U l        UR                   U l        U R                  R%                  U R                  U R                  U R                  R&                  S9  / U l        SU l        SU l        SU l        SU l        SU l        / U l        U R                  R7                  SS9U l        U R8                  R;                  5       U l        SU l        SU l         SU l!        SU l"        / U l#        0 U l$        / U l%        Xl&        SU l'        XPl(        SU l)        SU l*        SU l+        SU l,        [[        U[\        5      U l/        U=(       d    0 Ra                  5        GH  u  nnU[\        ;  a  [c        SU S	35      e[        U[d        5      (       d  [g        S
U 35      eU[h        ;   a  [        U[j        5      (       d  [k        URl                  URn                  (       d  SOURn                  R&                  URp                  URr                  URt                  U R^                  U   Rv                  U R^                  U   Rx                  U R^                  U   Rz                  S9nUU R^                  U'   GM     Ube  [|        R~                  " S[        [        5       S9  URa                  5        H/  u  nnU R^                  U   R                  US9U R^                  U'   M1     U	b  [|        R~                  " S[        [        5       S9  U R^                  S   nU R^                  S   n[        U[j        5      (       a  UR                  U	S9nOUR                  U	S9n[        U[j        5      (       a  UR                  U	S9nOUR                  U	S9nUU R^                  S'   UU R^                  S'   UbK  [|        R~                  " S[        [        5       S9  U R^                  S   R                  US9U R^                  S'   UbK  [|        R~                  " S[        [        5       S9  U R^                  S   R                  US9U R^                  S'   U(       a  [|        R~                  " S[        [        5       S9  URa                  5        HM  u  nnXR^                  ;  a  [c        SU S	35      eU R^                  U   R                  US9U R^                  U'   MO     gg)a1  
Args:
    pdf (fpdf.fpdf.FPDF): an instance of `FPDF`
    image_map (function): an optional one-argument function that map `<img>` "src" to new image URLs
    li_tag_indent (int): [**DEPRECATED since v2.7.9**]
        numeric indentation of `<li>` elements - Set `tag_styles` instead
    dd_tag_indent (int): [**DEPRECATED since v2.7.9**]
        numeric indentation of `<dd>` elements - Set `tag_styles` instead
    table_line_separators (bool): enable horizontal line separators in `<table>`. Defaults to `False`.
    ul_bullet_char (str): bullet character preceding `<li>` items in `<ul>` lists.
        You can also specify special bullet names like `"circle"` or `"disc"` (the default).
        Can also be configured using the HTML `type` attribute of `<ul>` tags.
    li_prefix_color (tuple, str, fpdf.drawing.DeviceCMYK, fpdf.drawing.DeviceGray, fpdf.drawing.DeviceRGB): color for bullets
        or numbers preceding `<li>` tags. This applies to both `<ul>` & `<ol>` lists.
    heading_sizes (dict): [**DEPRECATED since v2.7.9**]
        font size per heading level names ("h1", "h2"...) - Set `tag_styles` instead
    pre_code_font (str): [**DEPRECATED since v2.7.9**]
        font to use for `<pre>` & `<code>` blocks - Set `tag_styles` instead
    warn_on_tags_not_matching (bool): control warnings production for unmatched HTML tags. Defaults to `True`.
    tag_indents (dict): [**DEPRECATED since v2.8.0**]
        mapping of HTML tag names to numeric values representing their horizontal left indentation. - Set `tag_styles` instead
    tag_styles (dict[str, fpdf.fonts.TextStyle]): mapping of HTML tag names to `fpdf.TextStyle` or `fpdf.FontFace` instances
    font_family (str): optional font family. Default to Times.
    render_title_tag (bool): Render the document <title> at the beginning of the PDF. Default to False.
r3   sizer  FNT)skip_leading_spacesrZ   r   zCannot set style for HTML tag <z5> (contributions are welcome to add support for this)zItag_styles values must be instances of FontFace or TextStyle - received: )rT   rH   rL   r,   
fill_colorr?   rB   r@   zThe heading_sizes parameter is deprecated since v2.7.9 and will be removed in a future release. Set the `tag_styles` parameter instead.
stacklevel)rL   zThe pre_code_font parameter is deprecated since v2.7.9 and will be removed in a future release. Set the `tag_styles` parameter instead.r0   rW   )rT   r2   zThe dd_tag_indent parameter is deprecated since v2.7.9 and will be removed in a future release. Set the `tag_styles` parameter instead.rC   rE   zThe li_tag_indent parameter is deprecated since v2.7.9 and will be removed in a future release. Set the `tag_styles` parameter instead.rU   zThe tag_indents parameter is deprecated since v2.8.0 and will be removed in a future release. Set the `tag_styles` parameter instead.)Csuper__init__r  r  r  
isinstancestrr   r   r  r"  rT   rL   r   NONEfont_emphasis
text_color
font_colorset_fontr  style_stack_page_break_after_paragraphfollows_trailing_spacefollows_headingalignheading_level_tags_stacktext_columns_column	paragraph
_paragraph_pre_formatted_pre_startedhrefindentline_height_stackol_typebulletr%  	_in_titler  table	table_rowr  td_th_scale_unitsDEFAULT_TAG_STYLESr$  itemsNotImplementedErrorr   
ValueError
BLOCK_TAGSr   r3   r-   size_ptr,   r*  r?   rB   r@   warningswarnDeprecationWarningr   replace)selfr  r  r  r  r  r  r  r   r!  r"  r#  r$  rT   r%  tag	tag_styler(  
code_style	pre_stylerD  	__class__s                        r   r.  HTML2FPDF.__init__N  s   T 	," /3// _-(9 	
 *C& !$ >;#&#3#3).... 	##""$$** 	 	

 ,.+0(&+#$48
,0&(xx,,,F151G1G1I#!!	57 	 (* 0%:" 	
  	  	  	

 's,>?)/R668NC,,)5cU:op  i22 _`i_jk  j Iy)I)I% ) 0 0"+"4"4):L:L:R:R!*!2!2#//(33!__h!__h!__h#	& $-DOOC ? 9@ $MM> #*, +002	T'+s';'C'CQU'C'V$ 3$MM> #*, 0J.I*i00'//M/J
'//}/E
)Y//%----H	%--]-C	&0DOOF#%.DOOE"$MM> #*, %)OOD$9$A$A& %B %DOOD! $MM> #*, %)OOD$9$A$A& %B %DOOD! MM> #*,  +002Voo--9#>st  (,s';'C'CV'C'T$  3 r   rB   c                 ~    [        U [        5      (       a  U $ [        U [        [        45      (       a  [        U 5      $ g)N        )r/  r   intfloatrE   s    r   _normalize_l_marginHTML2FPDF._normalize_l_margin)  s2    h&&Ohe--?"r   r:  line_height
top_marginbottom_marginrD  rG  c           
         U R                  5         Xl        [        U[        5      (       a  U R                  (       d  XPl        SnU(       d4  U R                  (       d#  U R
                  U R                  R                  -  nU R                  R                  [        U R                  [        5      (       a  U R                  OS USUUUUS9U l
        SU l        SU l        g )Nr   T)
text_alignrd  r)  re  rf  rD  bullet_stringF)_end_paragraphr:  r/  r   r9  rL   r  kr>  r?  r@  r8  )rW  r:  rd  re  rf  rD  rG  s          r   _new_paragraphHTML2FPDF._new_paragraph1  s     	
fe$$::#
F$"6"6**TXXZZ7J,,00%/

E%B%Btzz# $!'  1 
 '+#$r   c                     S U l         U R                  (       d  g U R                  R                  5         U R                  R	                  5         S U l        SU l        U R                  (       a"  U R                  R                  5         SU l        g g )NTF)	r:  r@  r>  end_paragraphrenderr8  r7  r  _perform_page_break)rW  s    r   rj  HTML2FPDF._end_paragraphQ  sh    
""$&*#++HH((*/4D, ,r   textlinkc                    U(       d  g U R                   (       d  U R                  5         U R                  R                  5         U R                  R                  nSU R                  l        U R                  R                  U R                  U R                  U R                  R                  S9  U R                  U R                  R                  :w  a2  U R                  b%  U R                  R                  U R                  5        U R                   c   eU R                   R                  XS9  X0R                  l        U R                  R                  5         g )Nr   r'  rt  )r@  rl  r  _push_local_stackpager5  rT   rL   r2  r  r4  r3  set_text_colorwrite_pop_local_stack)rW  rs  rt  	prev_pages       r   _write_paragraphHTML2FPDF._write_paragraph^  s    ! 	""$HHMM	##""$$** 	 	

 ??dhh111doo6QHH##DOO4***d.!!!#r   hc                     U R                   (       a  U R                   R                  US9  OU R                  R                  US9  SU l        g )N)r  T)r@  lnr>  r8  )rW  r  s     r   _lnHTML2FPDF._lnx  s8    ??OO#LLOOaO &*#r   datac                    U R                   (       a_  U R                  R                  (       a  [        R	                  SU5        OU R                  R                  U5        U R                  (       d  g U R                  Gb  UR                  5       nU(       d  g SU R                  ;   a.  U R                  S   n[        SU SU R                  S    S35      eU R                  R                  S5      nUc(  U R                  b  U R                  R                  S5      nU(       a  UR                  5       nU R                  R                  S	5      nUc(  U R                  b  U R                  R                  S	5      n[        U5      n[        U R                  R                  S
5      =(       d    S5      n[        U R                  R                  S5      =(       d    S5      nSnU R                  R                  S5      (       a  U[         R"                  -  nU R                  R                  S5      (       a  U[         R$                  -  nU R                  R                  S5      (       a  U[         R&                  -  nU R(                  U R                  R(                  :w  a  U R(                  OS n	U R*                  U R                  R*                  :w  a  U R*                  OS n
S nU	(       d  U(       d  U
(       d  U(       a!  [-        U	UU
U R                  R.                  US9nU R0                  c   eU R0                  R3                  UUUUUS9  SU R                  S'   OU R4                  b  OU R6                  (       aa  UR9                  S5      (       a2  U R:                  (       a!  UR=                  S5      (       a  USS nOUSS  nSU l        U R?                  U5        Oc[@        RC                  SU5      nU RD                  (       a  US   S:X  a  U R?                  USS  5        OU R?                  U5        US   S:H  U l"        U RF                  (       a  U RI                  5         g g )NzIgnoring repeated <title> "%s"insertedrX  z%Unsupported nested HTML tags inside <z> element: <>r:  bgcolorcolspan1rowspanr   r.   r9   U)r3   r-   rR  r,   r*  )rs  r:  r  r  r  T
r   Fr[   )%rH  r  r#   LOGGERwarning	set_titler%  rK  r  rO  r<  r   r  upperr   r`  r   rG   Ir  rT   rL   r   r3  rJ  cellrI  rA  
startswithrB  endswith_write_data_WS_SUB_PATsubr8  r7  rj  )rW  r  	td_th_tagr:  bgcolor_strr  r  r  r-   rT   rL   rH   s               r   handle_dataHTML2FPDF.handle_data  sl   >>xx~~?F""4(((::!::<DTZZ' JJu-	);I;lSWScScdfSgRhhij  JJNN7+E}!4G,**..3K"tww':"ggkk)4&{3G$**..3:s;G$**..3:s;GHzz~~c""LNN*zz~~c""LNN*zz~~c""LNN*$($4$48L8L$L  RV 
 $$(=(== !! 
 Jh,'%&%(((--&
 >>---NN     &*DJJz"ZZ#   t$$):):==&&":D8D %DT"??3-D**tAw#~  ab*  &*.r(c/D'++! ,r   c                 (   U R                   (       a  U R                  U5        g U R                  (       aM  U R                  R                  (       a  [        S5      eU R                  R                  XR                  S-
  SS9  U R                  U5        g )NzCombining write_html() & section styles is currently not supported. You can open up an issue on github.com/py-pdf/fpdf2 if this is something you would like to see implemented.r   F)strict)rC  put_linkr;  r  section_title_stylesrO  start_sectionr}  )rW  r  s     r   r  HTML2FPDF._write_data  sp    99MM$!!8800-G  &&t-?-?!-CE&R!!$'r   rX  attrsc                 .,   SU l         [        U5      nA[        UR                  S5      =(       d    S5      nU R                  R                  U5        UR                  S5      S:X  a*  U R                  5         U R                  R                  5         US;   a  U R                  b  SU R                  U'   US:X  aG  US	   =(       d    SU l
         [        U R                  5      nU R                  R                  US
9U l
        US:X  a  U R                  S5        US:X  Ga-  U R                  5         UR                  SUR                  S5      5      nU(       aU  US   S:X  a)  U R                  R                  [!        US S 5      -  S-  nO9[!        U5      U R                  R"                  -  nOU R                  R                  nU R                  R$                  U R                  R                  U-
  S-  -   nU R                  R'                  UU R                  R(                  X-   U R                  R(                  S9  U R                  S5        US:X  Ga  U R*                  R                  [-        U R.                  U R0                  U R2                  U R4                  S95        S n	SU;   a-   UR                  S5      n
U
b  [6        R8                  " U
5      OS n	UR                  SUR                  S5      5      nS nU(       a   [!        U5      nU R:                  U   nUR<                  b+  UR<                  U R4                  :w  a  UR<                  U l        UR>                  b+  UR>                  U R.                  :w  a  UR>                  U l        UR@                  b+  UR@                  U R2                  :w  a  UR@                  U l        URB                  (       a  U =R0                  URB                  -  sl        [E        U[F        5      (       a%  URH                  nURJ                  nUR$                  nOS=n=nnU RM                  U5      nU RO                  U	U=(       d    SUUUS9  U[P        ;   GaT  U R*                  R                  [-        U R.                  U R0                  U R2                  U R4                  S95        US:X  a  SO[        USS  5      U l)        U R:                  U   nUR@                  =(       d    U R2                  U R                  R"                  -  nS n	SU;   a-   UR                  S5      n
U
b  [6        R8                  " U
5      OS n	[E        U[F        5      (       a%  URH                  nURJ                  nUR$                  nOS=n=nnU RM                  U5      nU RO                  U	UUU-  US9  SU;   a  [U        US   5      U l        ORSU;   a  [U        US   5      U l        O8UR<                  b+  UR<                  U R4                  :w  a  UR<                  U l        UR>                  b+  UR>                  U R.                  :w  a  UR>                  U l        UR@                  b+  UR@                  U R2                  :w  a  UR@                  U l        URB                  (       a  U =R0                  URB                  -  sl        US ;   Ga  U[V        ;   a  U R                  5         U R*                  R                  [-        U R.                  U R0                  U R2                  U R4                  S95        U R:                  U   nUR<                  (       a  UR<                  U l        UR>                  =(       d    U R.                  U l        UR@                  =(       d    U R2                  U l        URB                  (       a  U =R0                  URB                  -  sl        US!:X  a  SU l,        SU l         U[V        ;   a  US":X  a  SU l-        [E        U[F        5      (       a%  URH                  nURJ                  nUR$                  nOS=n=nnU RM                  U5      nU RO                  U R\                  (       a  U R\                  S   OS UUUS#9  US$:X  Ga]  U =R^                  S-  sl/        UR                  S%U R`                  5      nUc   eU Rb                  R                  U5        UR                  SUR                  S5      5      nU(       a&   U R\                  R                  [!        U5      5        OU R\                  R                  S 5        U R^                  S:X  a  U R:                  U   n[E        U[F        5      (       a%  URH                  nURJ                  nUR$                  nOS=n=nnU RM                  U5      nU RO                  SUUUS#9  U R                  S&5        U R                  5         US':X  Ga  U =R^                  S-  sl/        SnS(U;   a  US(   =(       d    S)n [        U5      nU Rb                  R                  US-
  5        UR                  S%5      =(       d    S)U Rd                  U R^                  '   UR                  S5      =(       d    UR                  S5      nU(       a&   U R\                  R                  [!        U5      5        OU R\                  R                  S 5        U R^                  S:X  a  U R:                  U   n[E        U[F        5      (       a%  URH                  nURJ                  nUR$                  nOS=n=nnU RM                  U5      nU RO                  SUUUS#9  U R                  S&5        U R                  5         US*:X  Ga  U R                  Rf                  nU Rh                  U R                  l3        U Rb                  (       a  U Rb                  U R^                  S-
     nOU R`                  n[E        U[        5      (       d   [k        UU R                  Rl                  5      n[E        U[n        5      (       dI  US-  nUU Rb                  U R^                  S-
  '   U Rd                  U R^                     n[q        UU5       S+3nU R:                  U   n[E        U[F        5      (       a%  URJ                  nUR$                  nURH                  nOS=n=nnU RM                  U5      nU Rs                  U5        [E        U[6        5      (       a  SOUnU RO                  U R\                  (       a  U R\                  S   OS UU R^                  -  UUS,9  UU R                  l3        US-:X  a  U R*                  R                  [-        U R.                  U R0                  U R2                  U R4                  S95        SU;   a  [U        US   5      U l        S.U;   a,  UR                  S.5      =(       d    Sn [!        U5      U l        O1S/U;   a+  UR                  S/5      =(       d    Sn [!        U5      U l        S0U;   a/  UR                  S05      =(       d    SnURu                  5       U l        US1:X  Ga  U R                  5         S nUR                  S5      =(       d    UR                  S5      nU(       aT  US   S:X  a)  U R                  R                  [!        US S 5      -  S-  nO"[!        U5      U R                  R"                  -  nS2U;  a  U Rv                  (       a  S3OS4nO7US2   =(       d    Sn [        U5      S:  a  U Rv                  (       a  S5OS6nOS7n [6        R8                  " UR                  S5      =(       d    S85      n	S9U;   a  [!        US9   =(       d    S5      OS n[!        UR                  S:5      =(       d    S5      n[y        U R                  U	UU R2                  U R                  R"                  -  U Rz                  -  UUUUS;9U l>        U Rs                  5         US<:X  au  U R|                  (       d  [        S=5      eUR                  5        V V!s0 s H  u  n n!U Ru                  5       U!_M     sn!n U lA        U R|                  R                  5       U lC        US>;   Ga  U R|                  (       a  U R                  (       d  [        S?U S@35      eUR                  5        V V!s0 s H  u  n n!U Ru                  5       U!_M     sn!n U l	        XR                  SA'   USB:X  a/  SU R                  ;  a  S8U R                  S'   SU R                  SC'   O`[        U R|                  R                  5      S:X  a=  U R                  R                  (       d"  SU R|                  lG        SU R|                  lH        SDU;   a  [        R                  SEUSD   U5        SU;   a  US   =(       d    SFn[        U R|                  R                  5      S:X  a  US   S:X  a  [!        US S 5      nO[!        U5      nU R|                  R                  (       d  / U R|                  lK        [E        U R|                  R                  [        5      (       d   eU R|                  R                  R                  U5        O[        R                  SGUU5        USH:X  Ga  SIU;   Ga  [!        UR                  S5      =(       d    S5      U R                  R"                  -  n[!        UR                  SD5      =(       d    S5      U R                  R"                  -  n"U R                  (       a  U(       d  U"(       a  [        R                  SJ5        U R                  (       a  [        R                  SK5        U R                  R                  USI   SSL9  U R                  c   eSU R                  SM'   g U R                  R                  5       n#U R                  (       a  U R                  n#U R                  R                  U R                  USI   =(       d    S5      U#UU"U R                  SN9  USO:X  aU  U R                  5         U R                  R                  U R                  [        UR                  SP5      =(       d    S)5      SQ9  USR:X  a  [        R                  U R                  lV        USS:X  a  [        R                  U R                  lV        US:X  a  SU lX        UR                  ST5      S:X  a9  USU;   a+  U R                  5         U R                  R                  5         g SU lY        g g ! [         a     GNdf = f! [         a    S n	 GNf = f! [         a    S n GNf = f! [         a    S n	 GNRf = f! [         a     GNkf = f! [         a    Sn GNf = f! [         a     G
Nf = f! [         a     GNf = f! [         a     GNf = f! [         a    S7n GNf = fs  sn!n f s  sn!n f )VNFr  rZ   zbreak-beforerx  )r.   r9   r<   Tr*   rC  rx  r  r  r  widthr  %d   rS   )x1y1x2y2rV   r3   r-   rR  r,   r:  zline-heightr_        ?)r:  rd  re  rf  rD  r#   r   r   )r:  re  rf  rD  r,   )r.   r=   rA   r0   r4   r6   r9   rC   rF   rW   r:   r;   r<   rW   rC   )rd  re  rf  rD  rY   type    rX   startr  rU   .)rd  rD  rf  rG  r8   z	font-sizer(  facerI  borderHORIZONTAL_LINESSINGLE_TOP_LINEALLNO_HORIZONTAL_LINESr1  CENTERcellpaddingcellspacing)r:  borders_layoutrd  r  paddinggutter_widthgutter_heightr  z+Invalid HTML: <tr> used outside any <table>r  thzInvalid HTML: <z> used outside any <tr>rX  r  r.   heightz4Ignoring unsupported height="%s" specified on a <%s>0zEIgnoring width="%s" specified on a <%s> that is not in the first <tr>r  r  z<Ignoring unsupported "width" / "height" set on <img> elementz$Ignoring unsupported <img> alignment)r  img_fill_widthr  )xwr  rt  tocpages)r  supr  zbreak-after)r  r  r  )ZrB  dictr  r   r<  appendrj  r  rq  rK  rC  r`  add_linkrP  r}  epwra  rk  rB   lineyr6  r   rT   r2  rL   r4  r   coercer$  r,   r3   rR  r-   r/  r   r?   r@   rb  rl  HEADING_TAGSr;  r   rQ  rA  r9  rE  rD  r  rG  rF  r3  r  	ul_prefixis_ttf_fontr0  	ol_prefixr  r   r  r   TABLE_LINE_HEIGHTrI  r   rN  r  rowrJ  r  rowscells_first_row_as_headings_num_heading_rowsr  r  _col_widthslistr:  r  get_ximager  insert_toc_placeholder
render_tocr   SUP	char_vposSUBrH  r7  )$rW  rX  r  
attrs_dict	css_stylerx  	width_strhr_widthx_startr:  	align_strline_height_strrd  rY  r?   r@   rB   hsizebullet_charr  	start_strprev_text_colorrG  rF  numeric_indentfont_size_strrT   r  r  borders_strr  spacingrk  vr  r  s$                                       r   handle_starttagHTML2FPDF.handle_starttag  s   !,0K
#JNN7$;$ArB	$==(F2!HH((*/!djj&<"DJJsO#:"6*0bDI499~ HH--4-8	 $;!!$'$;!!gz~~g/FGIR=C'#xx||eIcrN.CCcIH$Y/$((**<H88<<hh''488<<(+Ba*GGGHHMM88::%88::	   !!$'#:##++!// --//	 &*E*$! *w 7I7@7LELL3RVE (mmz~~m<O ,0K'"'"8K ,I*y$///Q"+//+	0@0@DDTDT0T#,#3#3   ,1B1BdFWFW1W$-$5$5!!!""i&8&88")Y//$--$--$--14448h//9H'.3#&    ,##++!// --//	 '*Wn#c!"g,D,I&&;$*;*;txxzzIEE*$! *w 7I7@7LELL3RVE )Y//$--$--$--14448h//9H#&.	    )#"29W3E"FJ& #3:g3F"G,DOO1S"+//+	0@0@DDTDT0T#,#3#3   ,1B1BdFWFW1W$-$5$5!!!""i&8&88" 
 
 j ##%##++!// --//	 ,I"+//(//C43C3CD ) 1 1 FT5F5FD!!""i&8&88"e|&*#$(!j $; ,0D(i33(11H(11H(11H588H8x(33H=##6:6L6L..r2RV'"*# $  $;KK1K$..1D1DEK***KK{+'mmz~~m<O **11%2HI &&--d3{{a OOC0	i33(11H(11H(11H588H8x(33H=## !'"*#	 $  %%h/!$;KK1KE*$&w/63		NE KKuqy)(2v(>(E#DLL%'mmM: jnn?O **11%2HI &&--d3{{a OOC0	i33(11H(11H(11H588H8x(33H=## !'"*#	 $  %%h/!$;"hh11O"&"6"6DHH{{T[[1_5 ,,fc**"6488+?+?@fc**!/5DKK!O,,,t{{3%gv67q9,I)Y//$--$--$--14448h//9HHHX$.x$?$?SXN262H2HD**2.d%3&    #2DHH&=##++!// --//	 *$"2:g3F"Gi' )k : @b(-m(<D% :% *v 6 <"(-m(<D% #(nnV4:#.#4#4#6 '>!%)E!g.I*..2IIR=C' HHLL53B+@@3FE!),txxzz9Ez) 11 '*  )28b
,;'!+  $99 "!6 ' *0 LL!8!DHEE !J. j/415 
 JNN=9>Q?G- --

:T=S=SS$%	DJ HHJ$;::#$QRR0:0@0@0BC0B1qwwy!|0BCDG!ZZ^^-DN,::T^^#ocU:Q$RSS3=3C3C3EF3E41a!'')Q,3EFDJ #JJud{$**,*2DJJw'"&

3TZZ__%*4>>3G3G
  

1 01

,:%Jx(
 *$&w/63	tzz'1, }+ %in 5 %i 0::1113

.%djj&<&<dCCCCJJ**11%8NN_!
 %<EZ/*..16Q7$((**DE:>>(38q9DHHJJFF~~FNNV ::NN#IJ##
5(9$#Ozz---)-

:&#xx~~/AzzJJHHNNz%06B7YY   %<!HH++s:>>'+B+Ic'J ,  %<!)DHH%<!)DHH'>!DN=='61))##%,,.370 2s  J " ! E! " '"&K'T " ! E!F " 8 " E " L "  " > " ,%+N,. D
 Gs   3AU (,AU( ?AU; ,AV $AV! AV2 $$AW 3AW %AW' 2$AW8 AW8 AAXC-AXU
AU%U$AU%U(AU8U7AU8U;AVV
AVVAVVAVV!
AV/V.AV/V2AWWAWW
AWWAWW
AW$W#AW$W'
AW5W4AW5W8AXXAXc                 j   U R                   (       a  XR                   S   :w  ay  U R                   S   U R                  ;   a\  U R                   R                  5         U R                   (       a1  XR                   S   :w  a  U R                   S   U R                  ;   a  M\  U R                   (       d(  U R                  (       a  [        R                  SU5        ObXR                   S   :X  a  U R                   R                  5         O5U R                  (       a$  [        R                  SUU R                   S   5        US:X  a  SU l        US:X  a  U R                  (       a  U R                  R                  5       nUR                  =(       d    U R                  U l	        UR                  =(       d    U R                  U l        UR                  =(       d    [        R                  U l        UR                   U l        U R%                  5         S U l        U[(        ;   a  S U l        U R                  (       a  U R                  R                  5       nUR                  =(       d    U R                  U l	        UR                  =(       d    U R                  U l        UR                  =(       d    [        R                  U l        UR                   U l        U R%                  5         SU l        US;   a  U R                  (       a  U R                  R                  5       nUR                  =(       d    U R                  U l	        UR                  =(       d    U R                  U l        UR                  =(       d    [        R                  U l        UR                   U l        US	:X  a  S
U l        S
U l        U[2        ;   a  U R%                  5         US;   a  U R%                  5         US:X  a%  U R4                  R                  U R6                  5        U =R6                  S-  sl        U R8                  R                  5         U R:                  R                  5         US:X  a@  U R<                  c   eU R<                  R?                  5         S U l        U RA                  5         US:X  a  S U l!        S U l"        US;   a  U RF                  b  U RB                  b  U RD                  c   eSU RF                  ;  a  [I        U RF                  RK                  S5      =(       d    U RB                  RK                  SS 5      5      nU(       a	  [M        US9OS n[O        U RF                  RK                  SS5      5      n[O        U RF                  RK                  SS5      5      nU RD                  RQ                  SXEUS9  S U l#        US:X  a  U R                  (       a  U R                  R                  5       nUR                  =(       d    U R                  U l	        UR                  =(       d    U R                  U l        UR                  =(       d    [        R                  U l        UR                   U l        US:X  a  [R        RT                  U RV                  l,        US:X  a  [R        RT                  U RV                  l,        US:X  a  S
U l-        g g )Nr  z8Unexpected HTML end tag </%s>, start tag may be missing?z1Unexpected HTML end tag </%s>, start tag was <%s>r*   rZ   rV   T)r.   r=   rA   r0   r6   r9   rC   rF   rW   r:   r;   r<   rW   F)rY   rX   rX   r   rI  r  r  r  r  )r*  r  r  r  )rs  r  r  r  r8   r  r  r#   ).r<  HTML_UNCLOSED_TAGSpopr"  r  r  rC  r6  r3   rT   rR  rL   r-   r   r1  r2  r,   r4  rj  r:  r  r;  r9  rA  rB  rQ  rF  rD  rE  rG  rI  rp  r  r  rJ  rK  r   r   r   r`  r  r   LINEr  r  rH  )rW  rX  	font_facer  r  r  r  s          r   handle_endtagHTML2FPDF.handle_endtag  s   ''++  $(?(??  "	 ''++  $(?(?? --NPS $$R((  "++NNC  $
 #:DI#: ,,002	#,#3#3#Gt7G7G $-$5$5$J9J9J!%.%7%7%L<;L;L""+//!DJ,!%D ,,002	#,#3#3#Gt7G7G $-$5$5$J9J9J!%.%7%7%L<;L;L""+//!#'D  
 
  ,,002	#,#3#3#Gt7G7G $-$5$5$J9J9J!%.%7%7%L<;L;L""+//e|&+#$)!j ##%,!d{  -KK1K""&&(KKOO'>::)))JJDJHHJ$;DG!DN,

&GG'NN./ +*JJNN9-MY1M 9@G4TdjjnnY<=djjnnY<=##57 $  DJ&= ,,002	#,#3#3#Gt7G7G $-$5$5$J9J9J!%.%7%7%L<;L;L""+//%<!)DHH%<!)DHH'>"DN r   c                   > [         TU ]  U5        U R                  (       ag  U R                  S   U R                  ;   aJ  U R                  R	                  5         U R                  (       a  U R                  S   U R                  ;   a  MJ  U R                  5         U R                  (       a6  U R                  (       a$  [        R                  SU R                  S   5        g g g )Nr  zMissing HTML end tag for <%s>)	r-  feedr<  r  r  rj  r"  r  r  )rW  r  r\  s     r   r  HTML2FPDF.feed)  s    T4#3#3B#74;R;R#R  " 4#3#3B#74;R;R#R > >NN:D<L<LR<PQ !?r   c                    [        U R                  U R                  U R                  U R                  S9nU R
                  S   nUR                  (       a  UR                  U l        UR                  =(       d    U R                  U l        UR                  =(       d    U R                  U l        UR                  (       a  U =R                  UR                  -  sl        U R                  XR                  S9  UR                  =(       d    U R                  U l        UR                  =(       d    U R                  U l        UR                  =(       d    [        R                  U l        UR                  U l        g)zInsert a hyperlinkr  r*   rv  N)r   rT   r2  rL   r4  r$  r,   r3   rR  r-   r}  rC  r   r1  )rW  rs  
prev_stylerY  s       r   r  HTML2FPDF.put_link1  s   ##''%%//	

 OOC(	??'ooDO$++?t/?/?%--B1B1B)"4"44d3%,,@0@0@&..C$2C2C'00EL4E4E$**r   outlinec           
         UR                  5         U H  nUR                  UR                  S9nSUR                  -  S-   SUR                   3nUSSSUR                  S-  -
  [        UR                  5      -
  -   SUR                   3-  nUR                  UR                  UR                  U[        R                  [        R                  US9  M     g)zUThis method can be overridden by subclasses to customize the Table of Contents style.r  r[   rS   r  <   )r  r  rs  new_xnew_yrt  N)r  r  page_numberlevelnamer  
multi_cellr  	font_sizer   LMARGINr   NEXT)rW  r  r  sectionrt  rs  s         r   r  HTML2FPDF.render_tocH  s    G<<W%8%8<9DGMM)A-.a~>DarGMM!O3c',,6GGHI7K^K^J_``DNN''--llii  	 r   messagec                     [        U5      er  )RuntimeError)rW  r  s     r   errorHTML2FPDF.errorY  s    7##r   )!r>  rH  r7  r@  rA  rB  r<  r:  rG  r9  r8  r4  r2  rT   rL   r;  rC  r  rD  r  rE  rF  r  r%  r6  rI  r  rJ  r$  rK  r  r  r"  )Nr  r   r   r   rZ   )r   Nr  )'__name__
__module____qualname____firstlineno____doc__r  r  r   r0  r	   ra  boolr   r  r   r.  staticmethodr   r
   r   rb  rl  rj  r`  r}  r  r  r  r  tupler  r  r  r  r   r  r  __static_attributes____classcell__r\  s   @r   r
  r
  H  s   J
 +:)-)-&+$&148'+*.2659"!&YUYU SE3J'YU  	YU
  YU  $YU YU $YU  S%Z 01YU  }YU $(YU d3:./YU T#y.12YU YU YU  
!YU YUv c eE5L.A   04'* &'%eUl+,% e_% 	%
 % eUl#% % 
%@5$S $s0C $t $4+Xe_ + +X" X" X"t( ( (P83 P8tE#sTz/4J/K P8PT P8do# o# o#bR R R+S +T +.f tN/C  "$S $T $ $r   r
  r  r   in_tag_stylesc           	      x   [        S5      U R                  -  n0 nUR                  5        H  u  pE[        U[        5      (       am  UR                  UR                  U-  [        UR                  [        [        45      (       a  UR                  U-  OUR                  UR                  U-  S9X4'   M  XSU'   M     U$ )Nmm)r?   rB   r@   )r   rk  rN  r/  r   rV  r?   rB   r`  ra  r@   )r  r"  conversion_factorout_tag_stylestag_namerY  s         r   rL  rL  ]  s     ).668N,224i++'0'8'8"++.?? ")"4"4sElCC &&)::"++"++.?? (9 (N$ (18$  5 r   ul_typer  c                     U S:X  a  U(       a  [         $ [        $ U S:X  a  U(       a  [        $ [        $ [	        U 5      S:X  a  U $ [        SU  35      e)Nr  circler   Unsupported type: )BULLET_UNICODEMESSAGE_WAITING_WIN1252RING_OPERATOR_UNICODEDEGREE_SIGN_WIN1252r  rO  )r(  r  s     r   r  r  r  sS    &!,~I2II((3$L9LL
7|q
 27)<
==r   rF  indexc                     U S:X  a  U$ U S:X  a  [         US-
     $ U S:X  a  [        US-
     $ U S:X  a  [        U5      $ U S:X  a  [        U5      R                  5       $ [	        SU  35      e)Nr  r*   r   Ar  r9   r+  )r   r   r   r   rO  )rF  r0  s     r   r  r  |  sz    #~#~uqy))#~uqy))#~#~%%''
 27)<
==r   c                   <   ^  \ rS rSrSrS\S\SS4U 4S jjrSrU =r$ )		HTMLMixini  zW
[**DEPRECATED since v2.6.0**]
You can now directly use the `FPDF.write_html()` method
argskwargsr   Nc                 j   > [         TU ]  " U0 UD6  [        R                  " S[        [        5       S9  g )Nz[The HTMLMixin class is deprecated since v2.6.0. Simply use the FPDF class as a replacement.r+  )r-  r.  rS  rT  rU  r   )rW  r5  r6  r\  s      r   r.  HTMLMixin.__init__  s1    $)&)> &(	
r   r  )	r  r  r  r  r  r   r.  r  r   r!  s   @r   r4  r4    s'    
	
c 	
S 	
T 	
 	
r   r4  )r_   )Lr  loggingrerS  html.parserr   stringr   r   typingr   r   r   r	   r
   deprecationr   drawing_primitivesr   r   r   r   r   enumsr   r   r   r   r   errorsr   fontsr   r   r  r   rI  r   r   utilr   r   fpdfr   text_regionr    	getLoggerr  r  r-  r,  r/  r.  r  CrM  INLINE_TAGSrQ  setkeysjoin	_WS_CHARScompiler  r   r0  r   r  r  r
  rL  r  r  r`  r  r4  r  r   r   <module>rN     sv    	  " 3 @ @ (  = < ! & #  -&			8	$    <
.	5. 6	". HI&	.
 
8_-. 	(I
&. HJ. 9	%. ?	+. h'. ;	'. ))a!D. iegg>. 	)R
 .  	)sZ
8!." Y	#.. 	)#B/.4 	)#B5.: #B #B #B #A Q
+	ji@
Q

Q
[. ^ O 
 

 	J#k**s3E3J3J3L/MM MM GG	> jj1YKr*+UYU
IU 	U )	U
 IU U YU IU 	U 9U YU U IU 9U IU  I!U" I#U$ )%U& Y'U( 9)U* 	+U, Y-U. Y/U0 1U2 i3U4 5U6 7U8 9U: Y;U< y=U> i?U@ iAUB CUD iEUF YGUH 	IUJ yKUL yMUN OUP QUR SUT UUV iWUX iYUZ y[U\ ]U^ )_U` )aUb icUd ieUf YgUh IiUj IkUl ymUn IoUp )qUr ysUt 9uUv 9wUx IyUz ){U| I}U~ )U@ AUB )CUD 9EUF iGUH YIUJ 	KUL 	MUN OUP 9QUR YSUT iUUV )WUX YUZ Y[U\ I]U^ _U` aUb icUd yeUf gUh IiUj kUl 
9mUn oUp qUr ysUt iuUv wUx YyUz y{U| }U~ IU@ AUB CUD 	EUF )GUH iIUJ YKUL )MUN YOUP QUR 	SUT YUUV )WUX YYUZ Y[U\ )]U^ _U` )aUb icUd IeUf YgUh IiUj ykUl 
9mUn yoUp yqUr 	sUt uUv iwUx yyUz Y{U| )}U~ 9U@ iAUB CUD IEUF IGUH IUJ 9KUL 	MUN iOUP QUR  iU
r %+C=+i*$%+
 
S#X 
R$
 R$j 	 $S(Y*>%> ?	#x)#
#$*>s > ># >>s >3 >39 >
 
r   