Ë
    o]jg:  ã                   ó<  — d Z ddlZddlmZ ddlmZ ddlmZmZm	Z	 ddl	m
Z
 ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ  e«       Z ee	«      dz  j-                  d«      Z ee	«      dz  j-                  d«      Z ee	«      dz  j-                  d«      Z eee¬«      Z eee¬«      Z ee¬«      ZdZ ej<                  de› d�«      Z ej<                  de› d�«      Z  ej<                  de› d�«      Z!d„ Z"d„ Z#d„ Z$d„ Z%d„ Z&d„ Z'd„ Z(d „ Z)d!„ Z*d"„ Z+d#„ Z,i Z-d$„ Z.d%„ Z/d&„ Z0 e/d'«      d(„ «       Z1 e/d)«      d*„ «       Z2 e/d+«      d,„ «       Z3 e/d-«      d.„ «       Z4 e/d/«      d0„ «       Z5 e/d1«      d2„ «       Z6d3„ Z7d4„ Z8 ej<                  d5ejr                  «      Z:d6„ Z;y)7aV  Specific handling for some HTML elements, especially replaced elements.

Replaced elements (eg. <img> elements) are rendered externally and behave as an
atomic opaque box in CSS. In general, they may or may not have intrinsic
dimensions. But the only replaced elements currently supported in WeasyPrint
are images with intrinsic dimensions.

é    N)Úfiles)Úparse_coloré   )ÚCSSÚ
AttachmentÚcss)Úget_child_text)ÚCounterStyle)Úboxes)ÚSVGImage)ÚLOGGER)Úget_url_attributezhtml5_ua.csszutf-8zhtml5_ua_form.csszhtml5_ph.css)ÚstringÚcounter_style©r   z 	
z[^z]+z^[z]*([+-]?)([0-9]+)z]*([0-9]+([.][0-9]*)?)(%)?c                 ó    — t         j                  | xs d«      x}r3|j                  d«      dk(  rdndt        |j                  d«      «      z  S y)zbParse an integer from an HTML attribute value.

    Return an integer, or ``None`` on error.

    Ú r   ú-éÿÿÿÿé   N)Ú
INTEGER_REÚmatchÚgroupÚint©r   r   s     úF/var/www/zogu/zoguvenv/lib/python3.12/site-packages/weasyprint/html.pyÚparse_integerr   (   sL   € ô × Ñ  ¢¨2Ó.Ð.€uÐ.Ø—k‘k !“n¨Ò+‘°´c¸%¿+¹+Àa».Ó6IÑIÐIð /ó    c                 ó.   — t        | «      }|�|dk\  r|S dS )znParse a non-negative integer from an HTML attribute value.

    Return an integer, or ``None`` on error.

    Nr   )r   )r   Úintegers     r   Úparse_non_negative_integerr!   3   s$   € ô ˜FÓ#€GØÐ)¨g¸ªlˆ7ÐDÀÐDr   c                 ó    — t         j                  | xs d«      x}r3t        |j                  d«      «      |j                  d«      dk(  rdfS dfS y)z‰Parse a dimension value from an HTML attribute value.

    Return an integer and a unit string ('%' or 'px'), or ``None`` on error.

    r   r   é   ú%ÚpxN)ÚDIMENSION_REr   Úfloatr   r   s     r   Úparse_dimension_valuer(   >   sR   € ô ×"Ñ" 6¢<¨RÓ0Ð0€uÐ0Ü�U—[‘[ “^Ó$¨U¯[©[¸«^¸sÒ-B cÐLÐLÈÐLÐLð 1r   c           	      óŽ  — | j                  t        «      } | j                  «       dv ryt        | «      }|€yt	        t        dt        d|j                  «      «      dz  «      }t	        t        dt        d|j                  «      «      dz  «      }t	        t        dt        d|j                  «      «      dz  «      }d|d›|d›|d›�S )z…Parse a legacy color from an HTML attribute value.

    Return a color string compatible with CSS colors, or ``None`` on error.

    )ÚtransparentÚcurrentcolorNr   r   éÿ   ú#Ú02x)
ÚstripÚ
WHITESPACEÚlowerr   ÚroundÚmaxÚminÚredÚgreenÚblue)r   Úcolorr5   r6   r7   s        r   Úparse_legacy_colorr9   I   s´   € ð �\‰\œ*Ó%€FØ‡|�|ƒ~Ð8Ñ8Øä˜Ó€EØ€}ØÜ
”�A”s˜1˜eŸi™iÓ(Ó)¨CÑ/Ó
0€CÜ”#�aœ˜Q §¡Ó,Ó-°Ñ3Ó4€EÜ”�Qœ˜A˜uŸz™zÓ*Ó+¨cÑ1Ó2€DØˆs�3ˆi˜˜c�{ 4¨ *Ð-Ð-r   c                 ó²   — | j                  dd«      j                  dd«      j                  dd«      j                  dd«      j                  d	d
«      } d| › d�S )zcParse a URL from an HTML attribute value.

    Return a CSS-escaped string, including quotes.

    ú\z\\ú"z\"ú
z\Aúz\Dúz\C)Úreplacer   s    r   Úparse_stringrA   ]   sX   € ð 	ß	‰��vÓ	ß	‰��eÓ	ß	‰��uÓ	ß	‰��uÓ	ß	‰��uÓ	ð ð ˆvˆh�aˆ=Ðr   c                 ó    — dt        | «      › d�S )zKParse a URL from an HTML attribute value.

    Return a url() string.

    zurl(ú))rA   r   s    r   Ú	parse_urlrD   m   s   € ð ”,˜vÓ&Ð' qÐ)Ð)r   c                 ó(   — t        | «      }|�|› d�S y)zxMap an HTML attribute value to a pixel length.

    Return a string with the value and 'px', or ``None`` on error.

    Nr%   )r!   )r   Úvalues     r   Úmap_to_pixel_lengthrG   v   s%   € ô ' vÓ.€EØÐØ�˜ˆ|Ðð r   c                 ó4   — t        | «      }|�|\  }}|› |› �S y)z~Map an HTML attribute value to a dimension.

    Return a string with the value and the dimension, or ``None`` on error.

    N©r(   ©r   Ú	dimensionrF   Úunits       r   Úmap_to_dimension_propertyrM   �   s1   € ô & fÓ-€IØÐØ‰ˆˆtØ�˜˜ÐÐð r   c                 ó@   — t        | «      }|�|\  }}|dk7  r|› |› �S yy)z”Map an HTML attribute value to a dimension, ignoring zero values.

    Return a string with the value and the dimension, or ``None`` on error.

    Nr   rI   rJ   s       r   Ú'map_to_dimension_property_ignoring_zerorO   �   s=   € ô & fÓ-€IØÐØ‰ˆˆtØ�AŠ:Ø�W˜T˜FÐ#Ð#ð ð r   c                 óZ   — | j                  «       j                  «       j                  «       S )a4  Transform (only) ASCII letters to lower case: A-Z is mapped to a-z.

    This is used for `ASCII case-insensitive
    <https://whatwg.org/C#ascii-case-insensitive>`_ matching.

    This is different from the :meth:`str.lower` method of Unicode strings
    which also affect non-ASCII characters,
    sometimes mapping them into the ASCII range:

    >>> keyword = 'Bac\N{KELVIN SIGN}ground'
    >>> assert keyword.lower() == 'background'
    >>> assert ascii_lower(keyword) != keyword.lower()
    >>> assert ascii_lower(keyword) == 'bac\N{KELVIN SIGN}ground'

    )Úencoder1   Údecoder   s    r   Úascii_lowerrS   š   s"   € ð" �=‰=‹?× Ñ Ó"×)Ñ)Ó+Ð+r   c                 óv   ‡— t         j                  | j                  dd«      «      }t        ˆfd„|D «       «      S )zDReturn whether element has a ``rel`` attribute with given link type.Úrelr   c              3   ó:   •K  — | ]  }t        |«      ‰k(  –— Œ y ­w)N)rS   )Ú.0ÚtokenÚ	link_types     €r   ú	<genexpr>z(element_has_link_type.<locals>.<genexpr>±   s   øè ø€ ÒC°5Œ{˜5Ó! YÕ.ÑCùs   ƒ)ÚSPACE_SEPARATED_TOKENS_REÚfindallÚgetÚany)ÚelementrY   Útokenss    ` r   Úelement_has_link_typera   ®   s/   ø€ ä&×.Ñ.¨w¯{©{¸5À"Ó/EÓF€FÜÓC¸FÔCÓCÐCr   c                 ób   — |j                   t        v rt        | j                     | |||«      S |gS )zbHandle HTML elements that need special care.

    :returns: a (possibly empty) list of boxes.
    )Úelement_tagÚHTML_HANDLERSÚtag)r_   ÚboxÚget_image_from_uriÚbase_urls       r   Úhandle_elementri   ¸   s9   € ð
 ‡�œ-Ñ'Ü˜WŸ[™[Ñ)Ø�SÐ,¨hó8ð 	8ð ˆuˆr   c                 ó   ‡ — ˆ fd„}|S )zDReturn a decorator registering a function handling ``tag`` elements.c                 ó   •— | t         ‰<   | S )z;Decorator registering a function handling ``tag`` elements.)rd   )Úfunctionre   s    €r   Ú	decoratorzhandler.<locals>.decoratorÆ   s   ø€ à%Œ�cÑØˆr   © )re   rm   s   ` r   Úhandlerro   Ä   s   ø€ ôð Ðr   c                 óê   — d|j                   d   v rt        j                  nt        j                  } || j                  |j                   | |«      }|j
                  |_        |j                  |_        |S )zˆWrap an image in a replaced box.

    That box is either block-level or inline-level, depending on what the
    element should be.

    ÚblockÚdisplay)Ústyler   ÚBlockReplacedBoxÚInlineReplacedBoxre   Ú
string_setÚbookmark_label)r_   rf   ÚimageÚtype_Únew_boxs        r   Úmake_replaced_boxr{   Í   sf   € ð #*¨S¯Y©Y°yÑ-AÑ"AŒ×ÒÜ×$Ñ$ð 
ñ �G—K‘K §¡¨G°UÓ;€Gð Ÿ™€GÔØ ×/Ñ/€GÔØ€Nr   Úimgc                 óZ  — t        | d|«      }| j                  d«      }|r_ |||j                  d   ¬«      }|�t        | ||«      gS |r)t        j
                  j                  ||«      g|_        |gS |dk(  rg S |�J ‚g S |r)t        j
                  j                  ||«      g|_        |gS g S )z›Handle ``<img>`` elements.

    Return either an image or the alt-text.

    See: https://www.w3.org/TR/html5/embedded-content-1.html#the-img-element

    ÚsrcÚaltÚimage_orientation)ÚurlÚorientationr   )r   r]   rs   r{   r   ÚTextBoxÚanonymous_fromÚchildren)r_   rf   rg   rh   r~   r   rx   s          r   Ú
handle_imgr†   ß   sÃ   € ô ˜G U¨HÓ
5€CØ
�+‰+�eÓ
€CÙ
Ù"Ø §¡Ð+>Ñ!?ôAˆàÐÜ% g¨s°EÓ:Ð;Ð;ñ Ü %§¡× <Ñ <¸SÀ#Ó FÐG�”Ø�u�Ø˜’à�	à�{Ð"�{ð �	áÜ!ŸM™M×8Ñ8¸¸cÓBÐCˆCŒLØ�5ˆLàˆIr   Úembedc                 ó´   — t        | d|«      }| j                  dd«      j                  «       }|r( ||||j                  d   ¬«      }|�t	        | ||«      gS g S )z•Handle ``<embed>`` elements, return either an image or nothing.

    See: https://www.w3.org/TR/html5/embedded-content-0.html#the-embed-element

    r~   Útyper   r€   ©r�   Úforced_mime_typer‚   ©r   r]   r/   rs   r{   )r_   rf   rg   rh   r~   ry   rx   s          r   Úhandle_embedr�     si   € ô ˜G U¨HÓ
5€CØ�K‰K˜ Ó#×)Ñ)Ó+€EÙ
Ù"Ø eØŸ	™	Ð"5Ñ6ô8ˆð ÐÜ% g¨s°EÓ:Ð;Ð;à€Ir   Úobjectc                 ó¶   — t        | d|«      }| j                  dd«      j                  «       }|r( ||||j                  d   ¬«      }|�t	        | ||«      gS |gS )zœHandle ``<object>`` elements, return either an image or the fallback.

    See: https://www.w3.org/TR/html5/embedded-content-0.html#the-object-element

    Údatar‰   r   r€   rŠ   rŒ   )r_   rf   rg   rh   r�   ry   rx   s          r   Úhandle_objectr‘     sk   € ô ˜W f¨hÓ7€DØ�K‰K˜ Ó#×)Ñ)Ó+€EÙÙ"Ø uØŸ	™	Ð"5Ñ6ô8ˆð ÐÜ% g¨s°EÓ:Ð;Ð;àˆ5€Lr   Úcolgroupc                 óö   — t        |t        j                  «      rXt        d„ | D «       «      sFt	        |j
                  «      D �cg c]"  }t        j                  j                  |g «      ‘Œ$ c}|_        |gS c c}w )úHandle the ``span`` attribute.c              3   ó:   K  — | ]  }|j                   d k(  –— Œ y­w)ÚcolN)re   )rW   Úchilds     r   rZ   z"handle_colgroup.<locals>.<genexpr>.  s   è ø€ Ò;¨%�5—9‘9 Õ%Ñ;ùs   ‚)	Ú
isinstancer   ÚTableColumnGroupBoxr^   ÚrangeÚspanÚTableColumnBoxr„   r…   )r_   rf   Ú_get_image_from_uriÚ	_base_urlÚ_s        r   Úhandle_colgroupr    *  sg   € ô �#”u×0Ñ0Ô1ÜÑ;°7Ô;Ô;ô ˜sŸx™x›ö*àô ×$Ñ$×3Ñ3°C¸Õ<ò*ˆCŒLð ˆ5€Lùò*s   Á'A6r–   c                 óÆ   — t        |t        j                  «      r@|j                  dkD  r1t	        |j                  «      D �cg c]  }|j                  «       ‘Œ c}S |gS c c}w )r”   r   )r˜   r   rœ   r›   rš   Úcopy)r_   rf   r�   rž   Ú_is        r   Ú
handle_colr¤   5  sK   € ô �#”u×+Ñ+Ô,°·±¸A²ô &+¨3¯8©8£_Ö5˜r�—‘•
Ò5Ð5Øˆ5€Lùò 6s   ÁAz{http://www.w3.org/2000/svg}svgc                 ó  — |j                   d   }|j                   d   }	 t        | |||«      }t        | ||«      gS # t        $ r9}t	        j
                  d|«       t	        j                  d|¬«       g cY d}~S d}~ww xY w)zUHandle ``<svg>`` elements.

    Return either an image or the fallback content.

    Úurl_fetcherÚcontextzFailed to load inline SVG: %szError while loading inline SVG:)Úexc_infoN)Úkeywordsr   r{   Ú	Exceptionr   ÚerrorÚdebug)r_   rf   rg   rh   r¦   r§   rx   Ú	exceptions           r   Ú
handle_svgr®   ?  s‚   € ð %×-Ñ-¨mÑ<€KØ ×)Ñ)¨)Ñ4€Gð8Ü˜ (¨K¸ÓAˆô " '¨3°Ó6Ð7Ð7øô ò Ü�‰Ð4°iÔ@Ü�‰Ð6ÀÕKØ�	ûðús    < ¼	A>Á.A9Á3A>Á9A>c                 ó  — d}d}d}g }g }d}d}g }i }	| j                   j                  j                  dd«      }
| j                  j	                  ddd«      D �]›  }|j                   }|j
                  dk(  r|€t        |«      }Œ-|j
                  dk(  rÖt        |j                  dd«      «      }|j                  dd«      }|d	k(  r;t        t        |j                  d
«      «      D ]  }||vsŒ|j                  |«       Œ Œ©|dk(  r|j                  |«       ŒÀ|dk(  r|�ŒÈ|}ŒË|dk(  r|�ŒÓ|}ŒÖ|dk(  r|�ŒÞt        ||«      }Œë|dk(  r|�Œót        ||«      }�Œ|s�Œ||	vs�Œ||	|<   �Œ|j
                  dk(  s�Œ#t        |d«      s�Œ1t        |d| j                  «      }|j                  dd«      }|€t!        j"                  d«       �Œst%        ||| j&                  ¬«      }|j                  |«       �Œž |||||||||
|	dœ
S )a2  Get metadata dictionary out of HTML object.

    Relevant specs:

    https://www.whatwg.org/html#the-title-element
    https://www.whatwg.org/html#standard-metadata-names
    https://wiki.whatwg.org/wiki/MetaExtensions
    https://microformats.org/wiki/existing-rel-values#HTML5_link_type_extensions

    NÚlangÚtitleÚmetaÚlinkÚnamer   Úcontentr©   ú,ÚauthorÚdescriptionÚ	generatorzdcterms.createdzdcterms.modifiedÚ
attachmentÚhrefz'Missing href in <link rel="attachment">)r�   r¸   r¦   )
r±   r¸   r¹   r©   ÚauthorsÚcreatedÚmodifiedÚattachmentsr°   Úcustom)Úetree_elementÚattribr]   Úwrapper_elementÚ	query_allre   r	   rS   ÚmapÚstrip_whitespaceÚsplitÚappendÚparse_w3c_datera   r   rh   r   r«   r   r¦   )Úhtmlr±   r¸   r¹   r©   r¼   r½   r¾   r¿   rÀ   r°   r_   r´   rµ   Úkeywordr�   Úattachment_titlerº   s                     r   Úget_html_metadatarÍ   S  s,  € ð €EØ€KØ€IØ€HØ€GØ€GØ€HØ€KØ€FØ×Ñ×$Ñ$×(Ñ(¨°Ó6€DØ×'Ñ'×1Ñ1°'¸6À6ÓJó %/ˆØ×'Ñ'ˆØ�;‰;˜'Ò! e mÜ" 7Ó+‰EØ�[‰[˜FÒ"Ü˜wŸ{™{¨6°2Ó6Ó7ˆDØ—k‘k )¨RÓ0ˆGØ�zÒ!Ü"Ô#3°W·]±]À3Ó5GÓHò 1�GØ hÒ.Ø Ÿ™¨Õ0ñ1ð ˜Ò!Ø—‘˜wÕ'Ø˜Ò&ØÑ&Ø")‘KØ˜Ò$ØÑ$Ø '‘IØÐ*Ò*Ø‘?Ü,¨T°7Ó;‘GØÐ+Ò+ØÑ#Ü-¨d°GÓ<’HÛ˜$ fÓ,Ø&��t“Ø�[‰[˜FÔ"Ô'<Ø˜ö('ä# G¨V°T·]±]ÓCˆCØ&Ÿ{™{¨7°DÓ9ÐØˆ{Ü—‘ÐFÖGä'ØÐ)9Ø $× 0Ñ 0ô2�
ð ×"Ñ" :Ö.ðK%/ðN Ø"ØØØØØØ"ØØñð r   c                 ó,   — | j                  t        «      S )zÊUse the HTML definition of "space character",
    not all Unicode Whitespace.

    https://www.whatwg.org/html#strip-leading-and-trailing-whitespace
    https://www.whatwg.org/html#space-character

    )r/   r0   r   s    r   rÆ   rÆ   œ  s   € ð �<‰<œ
Ó#Ð#r   aG  
    ^
    [ 	
]*
    (?P<year>\d\d\d\d)
    (?:
        -(?P<month>0\d|1[012])
        (?:
            -(?P<day>[012]\d|3[01])
            (?:
                T(?P<hour>[01]\d|2[0-3])
                :(?P<minute>[0-5]\d)
                (?:
                    :(?P<second>[0-5]\d)
                    (?:\.\d+)?  # Second fraction, ignored
                )?
                (?:
                    Z |  # UTC
                    (?P<tz_hour>[+-](?:[01]\d|2[0-3]))
                    :(?P<tz_minute>[0-5]\d)
                )
            )?
        )?
    )?
    [ 	
]*
    $
c                 ó`   — t         j                  |«      r|S t        j                  d| |«       y)zYParse datetimes as defined by the W3C.

    See https://www.w3.org/TR/NOTE-datetime

    z#Invalid date in <meta name="%s"> %rN)ÚW3C_DATE_REr   r   Úwarning)Ú	meta_namer   s     r   rÉ   rÉ   Ê  s+   € ô ×Ñ˜Ô Øˆä�‰Ø1°9¸fõ	Fr   )<Ú__doc__ÚreÚimportlib.resourcesr   Útinycss2.color3r   r   r   r   r   r	   Úcss.countersr
   Úformatting_structurer   Úimagesr   Úloggerr   Úurlsr   ÚHTML5_UA_COUNTER_STYLEÚ	read_textÚHTML5_UAÚHTML5_UA_FORMÚHTML5_PHÚHTML5_UA_STYLESHEETÚHTML5_UA_FORM_STYLESHEETÚHTML5_PH_STYLESHEETr0   Úcompiler[   r   r&   r   r!   r(   r9   rA   rD   rG   rM   rO   rS   ra   rd   ri   ro   r{   r†   r�   r‘   r    r¤   r®   rÍ   rÆ   ÚVERBOSErÐ   rÉ   rn   r   r   ú<module>ræ      s  ðñó 
Ý %å 'ç "Ñ "Ý Ý &Ý 'Ý Ý Ý #á%›Ð Ù�#‹J˜Ñ'×2Ñ2°7Ó;€Ù�s“Ð1Ñ1×<Ñ<¸WÓE€Ù�#‹J˜Ñ'×2Ñ2°7Ó;€ÙØÐ#9ô;Ð áØÐ(>ô@Ð á Ô*Ð ð €
Ø&˜BŸJ™J¨¨J¨<°rÐ':Ó;Ð ØˆR�Z‰Z˜"˜Z˜LÐ(9Ð:Ó;€
Øˆr�z‰z˜B˜z˜lÐ*DÐEÓF€òJòEòMò.ò(ò *òò	 ò
$ò,ò(Dð €ò	òòñ$ 	ˆƒñ!ó ð!ñH 	ˆÓñó ðñ$ 	ˆÓñó ðñ$ 	ˆÓñó ðñ 	ˆƒñó ðñ 	Ð	*Ó+ñ8ó ,ð8ò&FòR$ð$ ˆb�j‰jð ð2 ‡Z�Zó3€ó8
Fr   