Ë
    o]jê6  ã                   ó0  — d Z ddlZddlZddlmZ ddlmZ ddlmZm	Z	 ddl
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 ddlmZ ddlmZmZ ddlm Z  ddl!m"Z" ddl#m$Z$m%Z% ddl&m'Z' ddl(m)Z)  G d„ d«      Z* G d„ d«      Z+ G d„ d«      Z,y)zDocument generation management.é    N)Úmd5)ÚPathé   )ÚCSSÚDEFAULT_OPTIONS)Úgather_anchorsÚmake_page_bookmark_tree)Úget_all_computed_styles)ÚCounterStyle)ÚTargetCollector)Ú	draw_page)Úbuild_formatting_structure)Úget_html_metadata)Úget_image_from_uri)ÚLayoutContextÚlayout_document)ÚPROGRESS_LOGGER)ÚMatrix)ÚVARIANTSÚgenerate_pdf)ÚDocumentMetadata)ÚFontConfigurationc                   ó   — e Zd ZdZd„ Zdd„Zy)ÚPagezRepresents a single rendered page.

    Should be obtained from :attr:`Document.pages` but not
    instantiated directly.

    c                 óz  — |j                  «       | _        |j                  «       | _        dD �ci c]  }||j                  d|› �   j
                  “Œ! c}| _        g | _        g | _        i | _	        d g i| _
        t        || j                  | j                  | j                  | j                  «       || _        y c c}w )N)ÚtopÚrightÚbottomÚleftÚbleed_)Úmargin_widthÚwidthÚmargin_heightÚheightÚstyleÚvalueÚbleedÚ	bookmarksÚlinksÚanchorsÚformsr   Ú	_page_box)ÚselfÚpage_boxÚsides      úJ/var/www/zogu/zoguvenv/lib/python3.12/site-packages/weasyprint/document.pyÚ__init__zPage.__init__!   s¯   € à×*Ñ*Ó,ˆŒ
ð ×,Ñ,Ó.ˆŒð ;ö<àð �(—.‘. 6¨$¨ Ñ1×7Ñ7Ñ7ò<ˆŒ
ð ˆŒð ˆŒ
ð ˆŒð ˜B�ZˆŒ
ä�x §¡¨t¯z©z¸4¿>¹>È4Ï:É:ÔVØ!ˆ�ùòO<s   ¯$B8c                 ó    — |j                  «       5  |j                  ||¬«       t        | j                  |«       ddd«       y# 1 sw Y   yxY w)z!Paint the page into the PDF file.©ÚaÚdN)ÚstackedÚ	transformr   r,   )r-   ÚstreamÚscales      r0   Úpaintz
Page.paintS   sB   € à�^‰^Óñ 	.Ø×Ñ˜u¨ÐÔ.Ü�d—n‘n fÔ-÷	.÷ 	.ñ 	.ús   ‘*AÁAN)r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r1   r:   © ó    r0   r   r      s   „ ñò0"ôd.r@   r   c                   ó4   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	y)	Ú	DiskCachez¸Dict-like storing images content on disk.

    Bytestring values are stored on disk. Other lightweight Python objects
    (i.e. RasterImage instances) are still stored in memory.

    c                 óŠ   — t        |«      | _        | j                  j                  dd¬«       i | _        t	        «       | _        y )NT)ÚparentsÚexist_ok)r   Ú_pathÚmkdirÚ_memory_cacheÚsetÚ_disk_paths)r-   Úfolders     r0   r1   zDiskCache.__init__b   s6   € Ü˜&“\ˆŒ
Ø�
‰
×Ñ °ÐÔ5ØˆÔÜ›5ˆÕr@   c                 ór   — t        |j                  «       d¬«      j                  «       }| j                  |z  S )NF)Úusedforsecurity)r   ÚencodeÚ	hexdigestrF   )r-   ÚkeyÚdigests      r0   Ú_path_from_keyzDiskCache._path_from_keyh   s,   € Ü�S—Z‘Z“\°5Ô9×CÑCÓEˆØ�z‰z˜FÑ"Ð"r@   c                 óz   — || j                   v r| j                   |   S | j                  |«      j                  «       S ©N)rH   rR   Ú
read_bytes©r-   rP   s     r0   Ú__getitem__zDiskCache.__getitem__l   s;   € Ø�$×$Ñ$Ñ$Ø×%Ñ% cÑ*Ð*à×&Ñ& sÓ+×6Ñ6Ó8Ð8r@   c                 ó¾   — t        |t        «      r>| j                  |«      }| j                  j	                  |«       |j                  |«       y || j                  |<   y rT   )Ú
isinstanceÚbytesrR   rJ   ÚaddÚwrite_bytesrH   )r-   rP   r&   Úpaths       r0   Ú__setitem__zDiskCache.__setitem__r   sN   € Ü�eœUÔ#Ø×&Ñ& sÓ+ˆDØ×Ñ× Ñ  Ô&Ø×Ñ˜UÕ#à&+ˆD×Ñ˜sÒ#r@   c                 ó`   — || j                   v xs | j                  |«      j                  «       S rT   )rH   rR   ÚexistsrV   s     r0   Ú__contains__zDiskCache.__contains__z   s1   € à�4×%Ñ%Ð%ò .Ø×Ñ Ó$×+Ñ+Ó-ð	/r@   c                 óž   — 	 | j                   D ]  }|j                  d¬«       Œ | j                  j                  «        y # t        $ r Y y w xY w)NT)Ú
missing_ok)rJ   ÚunlinkrF   ÚrmdirÚ	Exception)r-   r]   s     r0   Ú__del__zDiskCache.__del__   sL   € ð	Ø×(Ñ(ò -�Ø—‘ t�Õ,ð-à�J‰J×ÑÕøÜò 	áð	ús   ‚=A  Á 	AÁAN)
r;   r<   r=   r>   r1   rR   rW   r^   ra   rg   r?   r@   r0   rB   rB   Z   s%   „ ñò!ò#ò9ò,ò/ó
r@   rB   c                   óN   — e Zd ZdZed„ «       Zed„ «       Zd„ Zd	d„Zd
d„Z	dd„Z
y)ÚDocumenta“  A rendered document ready to be painted in a pydyf stream.

    Typically obtained from :meth:`HTML.render() <weasyprint.HTML.render>`, but
    can also be instantiated directly with a list of :class:`pages <Page>`, a
    set of :class:`metadata <DocumentMetadata>`, a :class:`url_fetcher
    <weasyprint.urls.URLFetcher>`, and a :class:`font_config
    <weasyprint.text.fonts.FontConfiguration>`.

    c                 óÐ  — t        «       }g }g }g }	|d   }
|
€i }
n!t        |
t        t        f«      st        |
«      }
|d   xs g D ]9  }t	        |d«      st        ||j                  |||¬«      }|	j                  |«       Œ; t        ||	|d   |||||||d   «
      }t        j                  t        |
|j                  |¬«      }t        j                  d«       t        |||||«      }|S )	NÚcacheÚstylesheetsÚmatcher)ÚguessÚ
media_typeÚfont_configÚcounter_styleÚcolor_profilesÚpresentational_hintsÚ	pdf_forms)rk   Úurl_fetcherÚoptionsz&Step 4 - Creating formatting structure)r   rY   ÚdictrB   Úhasattrr   ro   Úappendr
   Ú	functoolsÚpartialÚoriginal_get_image_from_uriru   r   Úinfor   )ÚclsÚhtmlrp   rq   rr   rv   Útarget_collectorÚ
page_rulesÚlayersÚuser_stylesheetsrk   ÚcssÚ	style_forr   Úcontexts                  r0   Ú_build_layout_contextzDocument._build_layout_context”   s  € ô +Ó,ÐØˆ
ØˆØÐØ˜Ñ ˆØˆ=Ø‰EÜ˜E¤D¬)Ð#4Ô5Ü˜eÓ$ˆEØ˜=Ñ)Ò/¨Rò 	)ˆCÜ˜3 	Ô*ÜØ¨$¯/©/Ø +¸=Ø#1ô3�ð ×#Ñ# CÕ(ð	)ô ,ØÐ" GÐ,BÑ$CÀ[Ø˜>¨:°vÐ?OØ�KÑ ó"ˆ	ô '×.Ñ.Ü'¨uØ×(Ñ(°'ô;Ðô 	×ÑÐEÔFÜØÐ)¨;¸Øóˆð ˆr@   c           
      óB  — |€
t        «       }|€
t        «       }|€i }|d   x}r=t        |   \  }}t        |j	                  «       «      D ]  \  }	}
|
�Œ	|	|v sŒ||	   ||	<   Œ | j                  |||||«      }t        |j                  |j                  |j                  |j                  |j                  ||j                  «      }t        |||«      } | |D �cg c]  }t        |«      ‘Œ c}t        di t!        |«      ¤Ž|j"                  |||d   «      }||_        |S c c}w )NÚpdf_variantÚoutput_intentr?   )r   r   r   ÚtupleÚitemsr‡   r   Úetree_elementr…   r   Úbase_urlr€   Ú	footnotesr   r   r   r   ru   Ú_html)r~   r   rp   rq   rr   rv   ÚvariantÚ_Ú
propertiesrP   r&   r†   Úroot_boxÚ
page_boxesr.   Ú	renderings                   r0   Ú_renderzDocument._render´   sB  € àÐÜ+Ó-ˆKàÐ Ü(›NˆMàÐ!ØˆNð ˜mÑ,Ð,ˆ7Ð,Ü$ WÑ-‰MˆAˆzÜ# G§M¡M£OÓ4ò 3‘
��UØ‘= S¨JÒ%6Ø#-¨c¡?�G˜C’Lð3ð ×+Ñ+Ø�+˜}¨n¸góGˆô .Ø×Ñ × 1Ñ 1°7×3MÑ3MØ�M‰M˜7×3Ñ3°]Ø×Ñóˆô
 % T¨8°WÓ=ˆ
ÙØ,6Ö7 ŒT�(�^Ò7ÜÑ7Ô0°Ó6Ñ7Ø×Ñ˜k¨>¸7À?Ñ;SóUˆ	ð ˆ	ŒØÐùò	 8s   ÃDc                 óf   — || _         || _        || _        i | _        || _        || _        || _        y rT   )ÚpagesÚmetadataru   Úfontsrp   rr   rŠ   )r-   r™   rš   ru   rp   rr   rŠ   s          r0   r1   zDocument.__init__Ö   s?   € ð ˆŒ
ð !ˆŒà&ˆÔð ˆŒ
ð
 'ˆÔà,ˆÔà*ˆÕr@   c                 óì   — |dk(  r| j                   }nt        |t        «      st        |«      } t        | «      || j                  | j
                  | j                  | j                  | j                  «      S )aP  Take a subset of the pages.

        :type pages: :term:`iterable`
        :param pages:
            An iterable of :class:`Page` objects from :attr:`pages`.
        :return:
            A new :class:`Document` object.

        Examples:

        Write two PDF files for odd-numbered and even-numbered pages::

            # Python lists count from 0 but pages are numbered from 1.
            # [::2] is a slice of even list indexes but odd-numbered pages.
            document.copy(document.pages[::2]).write_pdf('odd_pages.pdf')
            document.copy(document.pages[1::2]).write_pdf('even_pages.pdf')

        Combine multiple documents into one PDF file,
        using metadata from the first::

            all_pages = [p for doc in documents for p in doc.pages]
            documents[0].copy(all_pages).write_pdf('combined.pdf')

        Úall)	r™   rY   ÚlistÚtyperš   ru   rp   rr   rŠ   )r-   r™   s     r0   ÚcopyzDocument.copyí   sd   € ð2 �EŠ>Ø—J‘J‰EÜ˜E¤4Ô(Ü˜“KˆEØŒt�D‹zØ�4—=‘= $×"2Ñ"2°D×4DÑ4DØ×Ñ ×!3Ñ!3ó5ð 	5r@   c           	      óÊ   — g }g }|g}d}t        | j                  «      D ]A  \  }}|rt        || |j                  |z  ¬«      }	nt        ||¬«      }	t	        ||||||	«      }ŒC |S )aE  Make a tree of all bookmarks in the document.

        :param float scale:
            Zoom scale.
        :param bool transform_pages:
            A boolean defining whether the default PDF page transformation
            matrix has to be applied to bookmark coordinates, setting the
            bottom-left corner as the origin.
        :return: A list of bookmark subtrees.
            A subtree is ``(label, target, children, state)``. ``label`` is
            a string, ``target`` is ``(page_number, x, y)``  and ``children``
            is a list of child subtrees.

        r   )r4   r5   Úfr3   )Ú	enumerater™   r   r$   r	   )
r-   r9   Útransform_pagesÚrootÚskipped_levelsÚlast_by_depthÚprevious_levelÚpage_numberÚpageÚmatrixs
             r0   Úmake_bookmark_treezDocument.make_bookmark_tree  s€   € ð ˆð
 ˆØ˜ˆØˆÜ!*¨4¯:©:Ó!6ò 	%ÑˆK˜ÙÜ %¨E¨6°T·[±[À5Ñ5HÔI‘ä %¨5Ô1�Ü4Ø�n m°^Ø˜Vó%‰Nð	%ð ˆr@   Nc                 óL  — t        j                  «       }|j                  |«       |}|d   x}r=t        |   \  }}t	        |j                  «       «      D ]  \  }	}
|
�Œ	|	|v sŒ||	   ||	<   Œ t        | ||fi |¤Ž}|r	 || |«       |d   }|d    }|d   }|€8t        j                  «       }|j                  ||||«       |j                  «       S t        |d«      r|j                  ||||«       yt        |d«      5 }|j                  ||||«       ddd«       y# 1 sw Y   yxY w)a¤  Paint the pages in a PDF file, with metadata.

        :type target:
            :class:`str`, :class:`pathlib.Path` or :term:`file object`
        :param target:
            A filename where the PDF file is generated, a file object, or
            :obj:`None`.
        :param float zoom:
            The zoom factor in PDF units per CSS units.  **Warning**:
            All CSS units are affected, including physical units like
            ``cm`` and named sizes like ``A4``.  For values other than
            1, the physical CSS units will thus be "wrong".
        :type finisher: :term:`callable`
        :param finisher:
            A finisher function or callable that accepts the document and a
            :class:`pydyf.PDF` object as parameters. Can be passed to perform
            post-processing on the PDF right before the trailer is written.
        :param options:
            The ``options`` parameter includes by default the
            :data:`weasyprint.DEFAULT_OPTIONS` values.
        :returns:
            The PDF as :obj:`bytes` if ``target`` is not provided or
            :obj:`None`, otherwise :obj:`None` (the PDF is written to
            ``target``).

        r‰   NÚpdf_identifierÚuncompressed_pdfÚpdf_versionÚwriteÚwb)r   r    Úupdater   r‹   rŒ   r   ÚioÚBytesIOr±   Úgetvaluerx   Úopen)r-   ÚtargetÚzoomÚfinisherrv   Únew_optionsr‘   r’   r“   rP   r&   ÚpdfÚ
identifierÚcompressÚversionÚoutputÚfds                    r0   Ú	write_pdfzDocument.write_pdf/  s?  € ô6 &×*Ñ*Ó,ˆØ×Ñ˜7Ô#Øˆð ˜mÑ,Ð,ˆ7Ð,Ü$ WÑ-‰MˆAˆzÜ# G§M¡M£OÓ4ò 3‘
��UØ‘= S¨JÒ%6Ø#-¨c¡?�G˜C’Lð3ô ˜4 ¨Ñ9°Ñ9ˆáÙ�T˜3ÔàÐ-Ñ.ˆ
ØÐ1Ñ2Ð2ˆØ˜-Ñ(ˆàˆ>Ü—Z‘Z“\ˆFØ�I‰I�f˜g z°8Ô<Ø—?‘?Ó$Ð$ä�6˜7Ô#Ø�I‰I�f˜g z°8Õ<ä�f˜dÓ#ð = rØ—	‘	˜"˜g z°8Ô<÷=÷ =ñ =ús   Ã<DÄD#)r�   )r   F)Nr   N)r;   r<   r=   r>   Úclassmethodr‡   r—   r1   r    r¬   rÂ   r?   r@   r0   ri   ri   ‰   sF   „ ñð ñó ðð> ñó ðòB+ó.5óBôB8=r@   ri   )-r>   rz   r´   Úhashlibr   Úpathlibr   Ú r   r   r*   r   r	   r„   r
   Úcss.countersr   Úcss.targetsr   Údrawr   Úformatting_structure.buildr   r   r   Úimagesr   r|   Úlayoutr   r   Úloggerr   r«   r   r¼   r   r   Úpdf.metadatar   Ú
text.fontsr   r   rB   ri   r?   r@   r0   ú<module>rÐ      sc   ðÙ %ã Û 	Ý Ý ç "ß <Ý (Ý &Ý (Ý Ý BÝ #Ý Eß 2Ý #Ý ß 'Ý *Ý )÷>.ñ >.÷B,ñ ,÷^^=ò ^=r@   