U
    ±:vh=À  ã                •   @   s‚  d Z ddlmZ ddlmZmZ ddlZddlZddlZddl	m
Z
 ddlmZmZ ddlmZmZmZmZ dd	lmZ dd
lmZmZ ddlmZ ddlmZmZ e e¡ZdZ dZ!dZ"edddeddeddeddeddeƒ eddeddeddeddeddddeddedded dd!ed"d#d$d%d&ed'd"d(d)d*ed'd"d+d,d*ed'd"d-d.d*ed'd"d/d0d*ed'd"dd1d*ed'd"d2d3d*ed4d5d6eƒ eddd7ed5ded5dd8œZ#d9Z$e"d: Z%e&e%ƒe&e$ƒA e&e# '¡ ƒksìt(‚d; )d<¡Z*e +d=e*› d>¡Z,d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdMdNdOdPdQdRdSdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadadbdcdddddededfdgdhdidjdkdldmdmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d}d~dd€dd‚dƒd„d…d†d‡dˆd‰dŠd‹dŒddŽdŽddd‘d’d“d”d•d–d—d˜d™dšd›dœddždŸd d¡d¢d£d¤d¥d¦d§d¨d©dªd«d¬d­d­d®d¯d°d±d²d³d´dµd¶d·d¸d¹dºd»d¼d½d¾d¿dÀdÁdÂdÃdÄdÅdÆdÇdÈdÉdÊœ”Z-dÙdËdÌ„Z.dÍdÎ„ Z/G dÏdÐ„ dÐeƒZ0dÑdÒ„ Z1dÓdÔ„ Z2dÕdÖ„ Z3G d×dØ„ dØƒZ4dS )ÚzÑ
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.
é    )Ú
HTMLParser)Úascii_lowercaseÚascii_uppercaseNé   )Úget_stack_level)Úcolor_from_hex_stringÚconvert_to_device_color)ÚAlignÚTextEmphasisÚXPosÚYPos)ÚFPDFException)ÚFontFaceÚ	TextStyle)ÚTable)Úget_scale_factorÚ	int2romanõ   Â•õ   Â°)ÚtitleÚh1Úh2Úh3Úh4Úh5Úh6z#00fZ	UNDERLINE)ÚcolorÚemphasisZBOLD)r   ZCourier©ÚfamilyZSTRIKETHROUGHZITALICSz#64002dé   )r   Út_marginÚb_margingïîîîîî@)r!   é
   ©Úl_marginÚB)Ú
font_styler!   gš™™™™™Ù?é   é   ZCenter)r"   Úfont_size_ptr!   r%   z#960000é   gµNè´@)r   r"   r*   r!   é   g6Ði@é   g|ójâ@é   gR¸…ëQ@glÁlÁ@é   gÜd¨ì0@é   é   )r%   r!   )r!   Úfont_family)ÚaÚbÚcodeÚdelÚemÚfontÚiÚsÚstrongÚuÚ
blockquoteÚcenterÚddÚdtr   r   r   r   r   r   r   ÚliÚpÚpreÚolÚul)
r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   )	r=   r>   r?   r@   rA   rB   rC   rD   rE   Ú )z	-ú õ   Â…u   â€€-â€Šu   â€¨u   â€©u   âŸu   ã€€ú[z]+ú#000000z#000080z#00008bz#0000cdz#0000ffz#006400z#008000z#008080z#008b8bz#00bfffz#00ced1z#00fa9az#00ff00z#00ff7fz#00ffffz#191970z#1e90ffz#20b2aaz#228b22z#2e8b57z#2f4f4fz#32cd32z#3cb371z#40e0d0z#4169e1z#4682b4z#483d8bz#48d1ccz#4b0082z#556b2fz#5f9ea0z#6495edz#663399z#66cdaaz#696969z#6a5acdz#6b8e23z#708090z#778899z#7b68eez#7cfc00z#7fff00z#7fffd4z#800000z#800080z#808000z#808080z#87ceebz#87cefaz#8a2be2z#8b0000z#8b008bz#8b4513z#8fbc8fz#90ee90z#9370dbz#9400d3z#98fb98z#9932ccz#9acd32z#a0522dz#a52a2az#a9a9a9z#add8e6z#adff2fz#afeeeez#b0c4dez#b0e0e6z#b22222z#b8860bz#ba55d3z#bc8f8fz#bdb76bz#c0c0c0z#c71585z#cd5c5cz#cd853fz#d2691ez#d2b48cz#d3d3d3z#d8bfd8z#da70d6z#daa520z#db7093z#dc143cz#dcdcdcz#dda0ddz#deb887z#e0ffffz#e6e6faz#e9967az#ee82eez#eee8aaz#f08080z#f0e68cz#f0f8ffz#f0fff0z#f0ffffz#f4a460z#f5deb3z#f5f5dcz#f5f5f5z#f5fffaz#f8f8ffz#fa8072z#faebd7z#faf0e6z#fafad2z#fdf5e6z#ff0000z#ff00ffz#ff1493z#ff4500z#ff6347z#ff69b4z#ff7f50z#ff8c00z#ffa07az#ffa500z#ffb6c1z#ffc0cbz#ffd700z#ffdab9z#ffdeadz#ffe4b5z#ffe4c4z#ffe4e1z#ffebcdz#ffefd5z#fff0f5z#fff5eez#fff8dcz#fffacdz#fffaf0z#fffafaz#ffff00z#ffffe0z#fffff0z#ffffff)”ZblackZnavyZdarkblueZ
mediumblueZblueZ	darkgreenZgreenZtealZdarkcyanZdeepskyblueZdarkturquoiseZmediumspringgreenZlimeZspringgreenZaquaZcyanZmidnightblueZ
dodgerblueZlightseagreenZforestgreenZseagreenZdarkslategrayZdarkslategreyZ	limegreenZmediumseagreenZ	turquoiseZ	royalblueZ	steelblueZdarkslateblueZmediumturquoiseZindigoZdarkolivegreenZ	cadetblueZcornflowerblueZrebeccapurpleZmediumaquamarineZdimgrayZdimgreyZ	slateblueZ	olivedrabZ	slategrayZ	slategreyZlightslategrayZlightslategreyZmediumslateblueZ	lawngreenZ
chartreuseZ
aquamarineZmaroonZpurpleZoliveZgrayZgreyZskyblueZlightskyblueZ
bluevioletZdarkredZdarkmagentaZsaddlebrownZdarkseagreenZ
lightgreenZmediumpurpleZ
darkvioletZ	palegreenZ
darkorchidZyellowgreenZsiennaZbrownZdarkgrayZdarkgreyZ	lightblueZgreenyellowZpaleturquoiseZlightsteelblueZ
powderblueZ	firebrickZdarkgoldenrodZmediumorchidZ	rosybrownZ	darkkhakiZsilverZmediumvioletredZ	indianredZperuZ	chocolateÚtanZ	lightgrayZ	lightgreyZthistleZorchidZ	goldenrodZpalevioletredZcrimsonZ	gainsboroZplumZ	burlywoodZ	lightcyanZlavenderZ
darksalmonZvioletZpalegoldenrodZ
lightcoralZkhakiZ	aliceblueZhoneydewZazureZ
sandybrownZwheatZbeigeZ
whitesmokeZ	mintcreamZ
ghostwhiteZsalmonZantiquewhiteZlinenZlightgoldenrodyellowZoldlaceZredZfuchsiaZmagentaZdeeppinkZ	orangeredZtomatoZhotpinkZcoralZ
darkorangeZlightsalmonZorangeZ	lightpinkZpinkZgoldZ	peachpuffZnavajowhiteZmoccasinZbisqueZ	mistyroseZblanchedalmondZ
papayawhipZlavenderblushZseashellZcornsilkZlemonchiffonZfloralwhiteZsnowZyellowZlightyellowZivoryZwhitec                 C   s    | sdS t  |  ¡ | ¡}t|ƒS )z€
    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   Zhexcolor© rO   ú-/tmp/pip-unpacked-wheel-dvf6lv8i/fpdf/html.pyÚcolor_as_decimal  s    rQ   c                 C   s\   i }|   d¡D ]H}|sq|  d¡}t|ƒdkr|d r|d r|\}}| ¡ || ¡ < q|S )zCParse `style="..."` HTML attributes, and return a dict of key-valueú;ú:r1   r   r   )ÚsplitÚlenÚstrip)Z
style_attrÚstyleÚelementÚpairÚattrÚvaluerO   rO   rP   Úparse_css_style%  s    
r\   c                       s®   e Zd ZdZdZdZddddeddddddddf‡ fd	d
„	Zd&dd„Zdd„ Z	d'dd„Z
d(dd„Zdd„ Zdd„ Zdd„ Zdd„ Z‡ fdd„Zd d!„ Zd"d#„ Zd$d%„ Z‡  ZS ))Ú	HTML2FPDFzRender basic HTML to FPDF)Úbrr?   r@   ÚhrÚimgrA   ÚtdÚtrgÍÌÌÌÌÌô?NF)é¾   r   r   TÚtimesc                    sN  t ƒ  ¡  || _|pdd„ | _|| _t|tƒr6t|ƒnt|ƒ| _	|
| _
|jpN|| _|j| _tj| _|j| _| jj| j| j| jjd g | _|j|j | _d| _d| _d| _d| _d| _d| _d| _d| _g | _g | _ g | _!d| _"g | _#| jj$dd	| _%| j% &¡ | _'|| _(d| _)|| _*d| _+d| _,d| _-d| _.t/|t0ƒ| _1|p@i  2¡ D ]¦\}}|t0krht3d
|› dƒ‚t|t4ƒs‚t5d|› ƒ‚|t6kràt|t7ƒsàt7|j8|j9sªdn|j9j|j:|j;|j<| j1| j=| j1| j>| j1| j?d}|| j1|< qF|dk	r6t@jAdtBtCƒ d | 2¡ D ]"\}}| j1| jD|d| j1|< q|	dk	r‚t@jAdtBtCƒ d | j1d jD|	d| j1d< | j1d jD|	d| j1d< |dk	r¶t@jAdtBtCƒ d | j1d jD|d| j1d< |dk	rêt@jAdtBtCƒ d | j1d jD|d| j1d< |rJt@jAdtBtCƒ d | 2¡ D ]>\}}|| j1kr.t3d
|› dƒ‚| j1| jD|d| j1|< q
dS )a‡  
        Args:
            pdf (FPDF): an instance of `fpdf.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.
                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.
        c                 S   s   | S ©NrO   )ÚsrcrO   rO   rP   Ú<lambda>c  ó    z$HTML2FPDF.__init__.<locals>.<lambda>©r   ÚsizerW   FrF   r   NT)Úskip_leading_spacesz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: )r2   r'   r*   r   Ú
fill_colorr!   r%   r"   z‡The heading_sizes parameter is deprecated since v2.7.9 and will be removed in a future release. Set the `tag_styles` parameter instead.©Ú
stacklevel)r*   z‡The pre_code_font parameter is deprecated since v2.7.9 and will be removed in a future release. Set the `tag_styles` parameter instead.r5   r   rC   )r2   z‡The dd_tag_indent parameter is deprecated since v2.7.9 and will be removed in a future release. Set the `tag_styles` parameter instead.r?   r$   z‡The li_tag_indent parameter is deprecated since v2.7.9 and will be removed in a future release. Set the `tag_styles` parameter instead.rA   z…The tag_indents parameter is deprecated since v2.8.0 and will be removed in a future release. Set the `tag_styles` parameter instead.)EÚsuperÚ__init__ÚpdfÚ	image_mapÚul_bullet_charÚ
isinstanceÚstrrQ   r   Úli_prefix_colorÚwarn_on_tags_not_matchingr2   r*   r
   ÚNONEÚfont_emphasisÚ
text_colorÚ
font_colorÚset_fontrW   Ústyle_stackÚkÚhÚ_page_break_after_paragraphÚ_pre_formattedÚ_pre_startedÚfollows_trailing_spaceÚfollows_headingÚhrefÚalignÚindentÚline_height_stackÚol_typeÚbulletÚheading_levelÚ_tags_stackZtext_columnsÚ_columnÚ	paragraphÚ
_paragraphÚrender_title_tagÚ	_in_titleÚtable_line_separatorsÚtableÚ	table_rowrb   Útd_thÚ_scale_unitsÚDEFAULT_TAG_STYLESÚ
tag_stylesÚitemsÚNotImplementedErrorr   Ú
ValueErrorÚ
BLOCK_TAGSr   r   r   Úsize_ptr   rl   r!   r%   r"   ÚwarningsÚwarnÚDeprecationWarningr   Úreplace)Úselfrq   rr   Zli_tag_indentZdd_tag_indentr’   rs   rv   Zheading_sizesZpre_code_fontrw   Ztag_indentsr˜   r2   r   ÚtagÚ	tag_stylerj   r‡   ©Ú	__class__rO   rP   rp   8  sä    )
ÿ
ýý

ÿÿ


õ
ù	
ù	
ÿ
ÿ
ù	
ÿ
ù	
ÿù	
ÿzHTML2FPDF.__init__ç      ð?r   rF   c              	   C   sr   |   ¡  |pd| _t|tƒr,| js(|| _d}|sD| jsD| j| jj }| jj	| j|d||||d| _
d| _d| _d S )NrF   r   T)Z
text_alignÚline_heightrk   Ú
top_marginÚbottom_marginr‡   Zbullet_stringF)Ú_end_paragraphr†   rt   r	   r„   r*   rq   r~   r   rŽ   r   rƒ   )r¢   r†   r¨   r©   rª   r‡   rŠ   rO   rO   rP   Ú_new_paragraphú  s&    


ù	zHTML2FPDF._new_paragraphc                 C   sJ   d| _ | jsd S | j ¡  | j ¡  d | _d| _| jrF| j ¡  d| _d S )NrF   TF)	r†   r   r   Zend_paragraphÚrenderrƒ   r€   rq   Ú_perform_page_break)r¢   rO   rO   rP   r«     s    


zHTML2FPDF._end_paragraphc                 C   sŒ   |sd S | j s|  ¡  | j ¡  | jj}d| j_| jj| j| j| jj	d | j
| jjkrf| j | j
¡ | j j||d || j_| j ¡  d S )Nr   ri   ©Úlink)r   r¬   rq   Z_push_local_stackÚpager|   r2   r*   ry   rW   r{   rz   Zset_text_colorÚwriteZ_pop_local_stack)r¢   Útextr°   Z	prev_pagerO   rO   rP   Ú_write_paragraph'  s"    
ýzHTML2FPDF._write_paragraphc                 C   s.   | j r| j j|d n| jj|d d| _d S )N)r   T)r   Úlnr   rƒ   )r¢   r   rO   rO   rP   Ú_ln@  s    zHTML2FPDF._lnc           	      C   s2  | j r2| jjrt d|¡ n| j |¡ | js2d S | jd k	rn| ¡ }|sNd S d| jkr~| jd }t	d|› d| j
d › dƒ‚| j d| j d¡¡}|r | ¡ }t| j d	| j d	d ¡¡ƒ}t| j d
d¡ƒ}t| j dd¡ƒ}d}| j d¡rú|tjO }| j d¡r|tjO }| j d¡r*|tjO }d }|s:|rLt||| jjd}| jj|||||d d| jd< n°| jd k	r|n¢| jrÐ| d¡r¾| jr¾| d¡r²|dd… }n|dd … }d| _|  |¡ nNt d|¡}| j r|d dkr|  |dd … ¡ n
|  |¡ |d dk| _ | j!r.|  "¡  d S )NzIgnoring repeated <title> "%s"Úinsertedr£   z%Unsupported nested HTML tags inside <z> element: <éÿÿÿÿú>r†   ÚbgcolorÚcolspanÚ1Úrowspanr   r4   r9   ÚU)r   rl   r   )r³   r†   rW   r»   r½   TÚ
r   FrG   )#r‘   rq   r   ÚLOGGERÚwarningÚ	set_titler   r•   rV   rš   rŒ   rM   rb   ÚupperrQ   Úintr
   r&   ÚIr¾   r   rz   r”   Úcellr“   r   Ú
startswithr‚   ÚendswithÚ_write_dataÚ_WS_SUB_PATÚsubrƒ   r€   r«   )	r¢   ÚdataZ	td_th_tagr†   rº   r»   r½   r   r'   rO   rO   rP   Úhandle_dataG  sz    

ÿ	ÿ


  ÿû
zHTML2FPDF.handle_datac                 C   sN   | j r|  |¡ n8| jr@| jjr(tdƒ‚| jj|| jd dd |  |¡ d S )Nz¯Combining 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)r…   Úput_linkr‹   rq   Zsection_title_stylesrš   Ústart_sectionr´   ©r¢   rÌ   rO   rO   rP   rÉ   ‘  s    ÿzHTML2FPDF._write_datac              
   C   sF  d| _ t|ƒ}t| dd¡ƒ}| j |¡ | d¡dkrJ|  ¡  | j ¡  |dkrf| j	d k	rfd| j	|< |dkr¬|d	 | _
zt| j
ƒ}| jj|d
| _
W n tk
rª   Y nX |dkr¾|  d¡ |dkrp|  ¡  | d| d¡¡}|r&|d dkr| jjt|d d… ƒ d }nt|ƒ| jj }n| jj}| jj| jj| d  }| jj|| jj|| | jjd |  d¡ |dkr,| j t| j| j| j| jd¡ d }d|krÈ| d¡d  ¡ }|dkrÈd }| d| d¡¡}|rzt|ƒ}W n tk
r   d }Y nX | j| }	| j|||	j|	j|	jd |t krR| j t| j| j| j| jd¡ |dkrddnt|dd … ƒ| _!| j| }	|	j"pŒ| j| jj }
|r¶| d¡}|dkrºd }nd }| j||	j|	j|
 |	jd d|krðt#|d ƒ| _n*d|kr
t#|d ƒ| _n|	j$r|	j$| _|	j%p&| j| _|	j"p6| j| _|	j&rR|  j|	j&O  _|dkrJ|t'krn|  ¡  | j t| j| j| j| jd¡ | j| }	|	j$r¨|	j$| _|	j%p´| j| _|	j"pÄ| j| _|	j&rà|  j|	j&O  _|d kröd| _(d| _ |t'krJ|d!krd| _)| j|d"kr"d#nd | j*r6| j*d nd |	j|	j|	jd |d$kr|  j+d7  _+d%|krxt,|d% ƒn| j-}| j. |¡ | d| d¡¡}|rÐz| j* t|ƒ¡ W n tk
rÌ   Y nX n| j* d ¡ | j+dkr| j| }	| jd|	j|	j|	jd& |  d'¡ |  ¡  |d(kr|  j+d7  _+d)|krJt|d) ƒnd}| j. |d ¡ | j/ | d%d*¡¡ | d| d¡¡}|r¸z| j* t|ƒ¡ W n tk
r´   Y nX n| j* d ¡ | j+dkrü| j| }	| jd|	j|	j|	jd& |  d'¡ |  ¡  |d+krÐ| jj0}| j1| j_0| j.r:| j.| j+d  }n| j-}t2|t3ƒs„|d7 }|| j.| j+d < | j/| j+d  }t4||ƒ› d,}| j| }	|  5|	j¡ | j| j*r°| j*d nd |	j| j+ |	j|d- || j_0|d.krb| j t| j| j| j| jd¡ d|krt#|d ƒ| _d/|kr.t| d/¡ƒ| _nd0|krHt| d0¡ƒ| _d1|krb| d1¡ 6¡ | _|d2krf| d| d¡¡}|rÀ|d dkr°| jjt|d d… ƒ d }nt|ƒ| jj }d3|krÜ| j7rÖd4nd5}n$t|d3 ƒrü| j7röd6nd7}nd8}| dd"¡ ¡ }d9|kr&t|d9 ƒnd }t| d:d¡ƒ}t8| j||| j9| j: ||||d;| _;|  5¡  |d<kr | j;s€t<d=ƒ‚d>d?„ | =¡ D ƒ| _>| j; ?¡ | _@|d@k	rÆ| j@sÂt<dA|› dBƒ‚dCd?„ | =¡ D ƒ| _	|| j	dD< |dEk	rd| j	k	r dF| j	d< d| j	dG< n,tA| j;jBƒdk	r8| j@jC	s8d| j;_Dd| j;_EdH|k	rTtF GdI|dH |¡ d|k	rÆ|d }tA| j;jBƒdk	r¸|d dk	r’|d d… }| j;jH	s¤g | j;_H| j;jH t|ƒ¡ ntF GdJ||¡ |dKk
rªdL|k
rªt| dd¡ƒ| jj }t| dHd¡ƒ| jj }| j@
r\|
s|
r(tF GdM¡ | jI
r:tF GdN¡ | j@jJ|dL ddO d| j	dP< d S | j K¡ }| jI
rˆ| jId  ¡ d#k
rˆtLjM}| jjN|  O|dL ¡|||| j
dQ |dRk
rÚ|  ¡  | jjP| jQt| dSd¡ƒdT |dUk
rìdV| j_R|dWk
rþdX| j_R|dkrd| _S| dY¡dkrB|dZkr<|  ¡  | j ¡  nd| _Td S )[NFrW   rF   zbreak-beforer±   )r4   r9   r<   Tr3   r…   ©r±   r^   r¿   r_   Úwidthr¸   ú%éd   r1   )Úx1Úy1Úx2Úy2rB   ©r   r   r   r   r†   r   )ÚLÚRÚJÚCzline-height)r†   r¨   r©   rª   r‡   r   r   )r†   r©   rª   r‡   r   )r4   r=   r>   r5   r6   r7   r9   r?   r@   rC   r:   r;   r<   rC   r?   r>   rÞ   rE   Útype)r¨   r©   rª   r‡   õ   Â rD   Ústartr¼   rA   Ú.)r¨   r‡   rª   rŠ   r8   z	font-sizerj   Úfacer“   ZborderZHORIZONTAL_LINESZSINGLE_TOP_LINEÚALLZNO_HORIZONTAL_LINESrx   ZcellpaddingZcellspacing)r†   Úborders_layoutr¨   rÓ   ÚpaddingZgutter_widthZgutter_heightrb   z+Invalid HTML: <tr> used outside any <table>c                 S   s   i | ]\}}|  ¡ |“qS rO   ©rN   ©Ú.0r~   ÚvrO   rO   rP   Ú
<dictcomp>¾  s      z-HTML2FPDF.handle_starttag.<locals>.<dictcomp>©ra   ÚthzInvalid HTML: <z> used outside any <tr>c                 S   s   i | ]\}}|  ¡ |“qS rO   rç   rè   rO   rO   rP   rë   Ã  s      r£   rí   ZCENTERr4   Úheightz4Ignoring unsupported height="%s" specified on a <%s>zEIgnoring width="%s" specified on a <%s> that is not in the first <tr>r`   rf   z<Ignoring unsupported "width" / "height" set on <img> elementz$Ignoring unsupported <img> alignment)r`   Zimg_fill_widthr·   )ÚxÚwr   r°   ZtocÚpages)rñ   ÚsupZSUPrË   ZSUBzbreak-after)r^   r_   r`   )Ur‚   Údictr\   rM   rŒ   Úappendr«   rq   r®   r•   r…   rÄ   Úadd_linkr›   r´   Úepwr~   r%   ÚlineÚyr}   r   r2   ry   r*   r{   rÃ   Úfloatr˜   r¬   r!   r"   ÚHEADING_TAGSr‹   r   rQ   r   r   r   rœ   r   r„   rˆ   r‡   Ú	ul_prefixrs   rŠ   r‰   rz   rv   rt   ru   Ú	ol_prefixr¶   rN   r’   r   r   ÚTABLE_LINE_HEIGHTr“   r   r™   rb   Úrowr”   rU   ZrowsÚcellsZ_first_row_as_headingsZ_num_heading_rowsrÀ   rÁ   Z_col_widthsr†   rÆ   Zget_xr	   rÞ   Úimagerr   Zinsert_toc_placeholderÚ
render_tocÚ	char_vposr‘   r€   )r¢   r£   ÚattrsZ	css_styler±   rÓ   Zx_startr†   r¨   r¤   ZhsizeZbullet_charrá   Zprev_text_colorrŠ   r‰   rå   ræ   Úspacingrî   rï   rO   rO   rP   Úhandle_starttagž  sp   





ü

üÿ



û
üÿ 


ü



üÿ



ù	
ÿ
ü


ü




ú
üÿ





ÿýÿ
ø






ý

ýÿ


    ÿ
 ÿ



zHTML2FPDF.handle_starttagc                 C   s>  | j r0|| j d kr0| j d | jkr0| j  ¡  q | j sJ| jr~t d|¡ n4|| j d krd| j  ¡  n| jr~t d|| j d ¡ |dkrŒd| _|dkrÞ| jrÐ| j ¡ }|jp®| j	| _	|j
p¼| j| _|j| _|j| _|  ¡  d| _|tkr>d | _| jr0| j ¡ }|jp| j	| _	|j
p| j| _|j| _|j| _|  ¡  d| _|dkr²| jrŠ| j ¡ }|jpf| j	| _	|j
pv| j| _|j| _|j| _|d	kr d
| _d
| _|tkr²|  ¡  |dkrú|  ¡  |  jd8  _|dkræ| j ¡  | j ¡  | j ¡  |dkr | j ¡  d | _|  | j¡ |dkr6d | _ d | _!|dkrºd| j"kr´t#| j" $d| j  $dd ¡¡ƒ}|rxt%|dnd }t&| j" $dd¡ƒ}t&| j" $dd¡ƒ}| j!j'd|||d d | _"|dkr| jr| j ¡ }|jpâ| j	| _	|j
pò| j| _|j| _|j| _|dkrd| j(_)|dkr*d| j(_)|dkr:d
| _*d S )Nr¸   z8Unexpected HTML end tag </%s>, start tag may be missing?z1Unexpected HTML end tag </%s>, start tag was <%s>r3   rF   rB   T)r4   r=   r>   r5   r7   r9   r?   r@   rC   r:   r;   r<   rC   F)rE   rD   r   rD   r“   rb   rì   r·   rº   )rl   r»   r¼   r½   )r³   rW   r»   r½   r8   rò   ZLINErË   r   )+rŒ   ÚHTML_UNCLOSED_TAGSÚpoprw   rÀ   rÁ   r…   r}   r   r2   r   r*   r   ry   r   r{   r«   r†   rú   r‹   r„   r   r‚   rœ   r‡   r‰   rˆ   rŠ   r“   r­   r¶   r   rb   r”   r•   rQ   rM   r   rÄ   rÆ   rq   r  r‘   )r¢   r£   Z	font_facerº   rW   r»   r½   rO   rO   rP   Úhandle_endtag
  sÀ    ÿþý ÿý















ÿ   ÿ




zHTML2FPDF.handle_endtagc                    sX   t ƒ  |¡ | jr.| jd | jkr.| j ¡  q|  ¡  | jrT| jrTt d| jd ¡ d S )Nr¸   zMissing HTML end tag for <%s>)	ro   ÚfeedrŒ   r  r  r«   rw   rÀ   rÁ   rÑ   r¥   rO   rP   r	  u  s    zHTML2FPDF.feedc                 C   s¢   t | j| j| j| jd}| jd }|jr0|j| _|jp:| j| _|jpH| j| _|j	rb|  j|j	O  _| j
|| jd |jp|| j| _|jpŠ| j| _|j	| _|j| _dS )zInsert a hyperlinkrÚ   r3   r¯   N)r   r2   ry   r*   r{   r˜   r   r   r   r   r´   r…   )r¢   r³   Z
prev_styler¤   rO   rO   rP   rÏ   }  s$    ü
zHTML2FPDF.put_linkc              	   C   sŠ   |  ¡  |D ]x}|j|jd}d|j d › d|j› }|ddd|jd  t|jƒ  › d|j› 7 }|j|j|j|t	j
tj|d qdS )zUThis method can be overridden by subclasses to customize the Table of Contents style.rÒ   rG   r1   râ   é<   )rð   r   r³   Znew_xZnew_yr°   N)rµ   rõ   Zpage_numberÚlevelÚnamerU   Z
multi_cellrö   Z	font_sizer   ZLMARGINr   ZNEXT)r¢   rq   ÚoutlineÚsectionr°   r³   rO   rO   rP   r  ”  s    .úzHTML2FPDF.render_tocc                 C   s   t |ƒ‚d S re   )ÚRuntimeError)r¢   ÚmessagerO   rO   rP   Úerror¥  s    zHTML2FPDF.error)Nr§   r   r   r   rF   )N)N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r  rý   ÚBULLET_WIN1252rp   r¬   r«   r´   r¶   rÍ   rÉ   r  r  r	  rÏ   r  r  Ú__classcell__rO   rO   r¥   rP   r]   2  sL   ñ E      ù
 

J  nkr]   c                 C   sx   t dƒ| j }i }| ¡ D ]X\}}t|tƒrj|j|j| t|jtt	fƒrR|j| n|j|j
| d||< q|||< q|S )NÚmm)r!   r%   r"   )r   r~   r™   rt   r   r¡   r!   r%   rÄ   rù   r"   )rq   Zin_tag_stylesZconversion_factorZout_tag_stylesZtag_namer¤   rO   rO   rP   r–   ©  s    
ÿù

r–   c                 C   s:   | dkrt S | dkrtS t| ƒdkr(| S td| › ƒ‚d S )NZcircleZdiscr   úUnsupported type: )ÚDEGREE_WIN1252r  rU   rš   )Zul_typerO   rO   rP   rû   ¼  s    rû   c                 C   sj   | dkr|S | dkr t |d  S | dkr4t|d  S | dkrDt|ƒS | dkrXt|ƒ ¡ S td| › ƒ‚d S )Nr¼   r3   r   ÚArÅ   r9   r  )r   r   r   rN   rš   )r‰   ÚindexrO   rO   rP   rü   Æ  s    rü   c                       s    e Zd ZdZ‡ fdd„Z‡  ZS )Ú	HTMLMixinzc
    [**DEPRECATED since v2.6.0**]
    You can now directly use the `FPDF.write_html()` method
    c                    s$   t ƒ j||Ž tjdttƒ d d S )Nz[The HTMLMixin class is deprecated since v2.6.0. Simply use the FPDF class as a replacement.rm   )ro   rp   rž   rŸ   r    r   )r¢   ÚargsÚkwargsr¥   rO   rP   rp   Ú  s    úzHTMLMixin.__init__)r  r  r  r  rp   r  rO   rO   r¥   rP   r  Ô  s   r  )rJ   )5r  Úhtml.parserr   Ústringr   r   ÚloggingÚrerž   Údeprecationr   Zdrawingr   r   Úenumsr	   r
   r   r   Úerrorsr   Zfontsr   r   r“   r   Úutilr   r   Ú	getLoggerr  rÀ   r  r  rú   r—   ZINLINE_TAGSrœ   ÚsetÚkeysÚAssertionErrorÚjoinZ	_WS_CHARSÚcompilerÊ   rL   rQ   r\   r]   r–   rû   rü   r  rO   rO   rO   rP   Ú<module>   sî  


ü   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ

Ó/"ÿ€ ì 
      }
