ó
    �®žjÓD  ã                   ó  • S SK r S SKrS SKrS SKrS SKJr  S SKJr  S SKJ	r	  S SK
Jr  S SKJr  S SKJrJr  S SKJr  S SKJr  S S	KJr  S S
KJrJr  S SKJr  S SKJr  S SKJ r   \ RB                  " \"5      r# " S S\5      r$g)é    N)ÚBytesIO)ÚPath)ÚZipFile)ÚDefusedXmlException)ÚDoclingDocumentÚDocumentOrigin)Úoverride)ÚDeclarativeDocumentBackend)ÚHTMLDocumentBackend)ÚEpubBackendOptionsÚHTMLBackendOptions)ÚInputFormat)ÚInputDocument)ÚDocumentLoadErrorc                   ó  ^ • \ rS rSrSr SS\S\\-  S\S-  4U 4S jjjr	S r
S	\S
\4S jrS rS\S\S
\4S jrS\S
\4S jr\S
\4S j5       r\S 5       r\\S
\4S j5       5       r\\S
\\   4S j5       5       r\S
\4S j5       rSrU =r$ )ÚEpubDocumentBackendé   a„  Backend for converting EPUB files to DoclingDocument format.

EPUB files are essentially ZIP archives containing XHTML content files.
This backend extracts the content and delegates to HTMLDocumentBackend
for processing the XHTML structure.

Note:
    This module enforces limits when extracting EPUB archives for image processing.
        These limits prevent malicious EPUBs from exhausting disk space or memory
        through decompression bombs. Limits can be configured via
        EpubBackendOptions.

Known Limitations:
    Internal anchor links (e.g., footnote references) are converted but
        the target anchor IDs are not preserved in the final Markdown output.
        This is a limitation of the HTML-to-DoclingDocument conversion process.
        Links like [1](#note-1) will be present, but the corresponding anchor
        targets may not be accessible in the exported Markdown.
NÚin_docÚpath_or_streamÚoptionsc                 óÎ  >• Uc
  [        5       n[        TU ]	  XU5        [        R	                  S5        X l        SU l        S U l        / U l        0 U l	        S U l
         [        U R
                  [        5      (       a  [        U R
                  S5      U l        OF[        U R
                  [        5      (       a  [        U R
                  S5      U l        O[        S5      eU R!                  5         SU l        [        R	                  S[#        U R                  5       S35        g ! [$         a7  n[        R'                  SU 35        [)        S	U R*                   S
35      UeS nAff = f)NzStarting EpubDocumentBackend...FÚrz&path_or_stream must be BytesIO or PathTzFound z content files in EPUBz#Failed to initialize EPUB backend: z5Could not initialize EPUB backend for file with hash Ú.)r   ÚsuperÚ__init__Ú_logÚdebugr   ÚvalidÚepub_zipÚcontent_filesÚmetadataÚtemp_dirÚ
isinstancer   r   r   Ú
ValueErrorÚ_parse_epub_structureÚlenÚ	ExceptionÚerrorr   Údocument_hash)Úselfr   r   r   ÚeÚ	__class__s        €ÚY/home/mande/repo/quber/.venv/lib/python3.13/site-packages/docling/backend/epub_backend.pyr   ÚEpubDocumentBackend.__init__0   s6  ø€ ð ‰?Ü(Ó*ˆGÜ‰Ñ˜°Ô9ä�
‰
Ð4Ô5à,ÔØˆŒ
Ø(,ˆŒØ(*ˆÔØ(*ˆŒØ%)ˆŒð	ä˜$×-Ñ-¬w×7Ñ7Ü '¨×(;Ñ(;¸SÓ A�•Ü˜D×/Ñ/´×6Ñ6Ü '¨×(;Ñ(;¸SÓ A�•ä Ð!IÓJÐJð ×&Ñ&Ô(ØˆDŒJä�J‰J˜¤ D×$6Ñ$6Ó 7Ð8Ð8NÐOÕPøÜó 	Ü�J‰JÐ<¸Q¸CÐ@ÔAÜ#ØGÈ×HZÑHZÐG[Ð[\Ð]óàðûð	ús   ÁCD# Ä#
E$Ä-2EÅE$c                 óÖ  • U R                   (       d  g U R                   R                  S5      n[        R                  " U5      nSS0nUR	                  SU5      nUc  [        S5      eUR                  S5      nU(       d  [        S5      eU R                   R                  U5      n[        R                  " U5      nU R                  U5        [        [        U5      R                  5      nUS	:X  a  S
nSS0n	UR	                  SU	5      n
UR	                  SU	5      nU
b  Uc  [        S5      e0 nUR                  SU	5       H;  nUR                  S5      nUR                  S5      nU(       d  M.  U(       d  M7  XüU'   M=     U
R                  SU	5       HV  nUR                  S5      nU(       d  M  UU;   d  M%  UU   nU(       a  U SU 3nOUnU R                  R                  U5        MX     [        R                  SU R                   35        g! [          a)  n[        R#                  SU 35        [%        S5      UeSnAf[&         a  n[        R#                  SU 35        e SnAff = f)z<Parse the EPUB structure to find content files and metadata.NzMETA-INF/container.xmlÚ	containerz/urn:oasis:names:tc:opendocument:xmlns:containerz.//container:rootfilez(Could not find rootfile in container.xmlz	full-pathz$Could not find full-path in rootfiler   Ú Úopfúhttp://www.idpf.org/2007/opfz.//opf:spinez.//opf:manifestz/Could not find spine or manifest in content.opfzopf:itemÚidÚhrefzopf:itemrefÚidrefÚ/z Content files in reading order: z0Security issue detected while parsing EPUB XML: z4EPUB file contains potentially malicious XML contentzError parsing EPUB structure: )r   ÚreadÚETÚ
fromstringÚfindr$   ÚgetÚ_extract_metadataÚstrr   ÚparentÚfindallr    Úappendr   r   r   r(   ÚRuntimeErrorr'   )r*   Úcontainer_dataÚcontainer_rootÚnsÚrootfileÚopf_pathÚopf_dataÚopf_rootÚopf_dirÚns_opfÚspineÚmanifestÚmanifest_mapÚitemÚitem_idr5   Úitemrefr6   Ú	full_pathr+   s                       r-   r%   Ú)EpubDocumentBackend._parse_epub_structureW   sF  € à�}�}Øð@	Ø!Ÿ]™]×/Ñ/Ð0HÓIˆNÜŸ]š]¨>Ó:ˆNð ÐPÐQˆBØ%×*Ñ*Ð+BÀBÓGˆHàÑÜ Ð!KÓLÐLà—|‘| KÓ0ˆHÞÜ Ð!GÓHÐHð —}‘}×)Ñ)¨(Ó3ˆHÜ—}’} XÓ.ˆHð ×"Ñ" 8Ô,ô œ$˜x›.×/Ñ/Ó0ˆGØ˜#‹~Ø�ð Ð;Ð<ˆFØ—M‘M .°&Ó9ˆEØ—}‘}Ð%6¸Ó?ˆHà‰} Ñ 0Ü Ð!RÓSÐSð ˆLØ ×(Ñ(¨°VÖ<�ØŸ(™( 4›.�Ø—x‘x Ó'�ß�7Ÿt˜tØ,0 Ó)ñ	 =ð !Ÿ=™=¨¸Ö?�ØŸ™ GÓ,�ß�5˜U lÕ2Ø'¨Ñ.�DæØ'. i¨q°°Ð$7™	à$(˜	Ø×&Ñ&×-Ñ-¨iÖ8ñ @ô �J‰JÐ9¸$×:LÑ:LÐ9MÐNÕOøä"ó 	Ü�J‰JÐIÈ!ÈÐMÔNÜØFóàðûô ó 	Ü�J‰JÐ7¸°sÐ;Ô<Øûð	ús=   ”EH Å/H Å83H Æ/H Æ7AH È
I(È$H=È=I(É
I#É#I(Ú
target_dirÚreturnc           
      ó  • U R                   (       d  gSnSnU R                  R                  nU R                  R                  nU R                  R                  n U R                   R                  5        H¶  nUS-  nX6:”  a  [        R                  SU S35          gUR                  U:”  a5  [        R                  SUR                   SUR                   SU S	35          gX'R                  -  nX$:”  a  [        R                  S
U S	35          gU R                   R                  Xq5        M¸     [        R                  SU SU S	35        g! [         a,  n[        R                  SU 35        [        SU 35      UeSnAff = f)z÷Safely extract EPUB contents with zip-bomb protection.

Args:
    target_dir: Directory to extract files to

Returns:
    True if extraction succeeded, False if limits were exceeded

Raises:
    RuntimeError: If extraction fails due to I/O errors
Fr   é   z)EPUB archive exceeds member count limit (Ú)zEPUB member z exceeds size limit (z > z bytes)z'EPUB archive exceeds total size limit (zSuccessfully extracted z
 members (TzError during EPUB extraction: z Failed to extract EPUB archive: N)r   r   Úmax_total_bytesÚmax_file_bytesÚmax_member_countÚinfolistr   ÚwarningÚ	file_sizeÚfilenameÚextractr   r'   r(   rB   )	r*   rT   Útotal_bytesÚmember_countrY   rZ   r[   Úmemberr+   s	            r-   Ú_safe_extract_epubÚ&EpubDocumentBackend._safe_extract_epubŸ   s‡  € ð �}�}ØàˆØˆØŸ,™,×6Ñ6ˆØŸ™×4Ñ4ˆØŸ<™<×8Ñ8Ðð"	NØŸ-™-×0Ñ0Ö2�Ø Ñ!�ØÓ2Ü—L‘LØCÐDTÐCUÐUVÐWôñ !ð ×#Ñ# nÓ4Ü—L‘LØ& v§¡Ð&7ð 8Ø"×,Ñ,Ð-¨S°Ð0@ÀðIôñ !à×/Ñ/Ñ/�ØÓ0Ü—L‘LØAÀ/ÐARÐRYÐZôñ !ð —‘×%Ñ% fÖ9ñ1 3ô4 �J‰JØ)¨,¨°zÀ+ÀÈgÐVôð øäó 	NÜ�J‰JÐ7¸°sÐ;Ô<ÜÐ!AÀ!ÀÐEÓFÈAÐMûð	Nús,   ÁAE ÂAE Ã!-E Ä;E Å
FÅ'E<Å<Fc                 ó"  • SS0nSS0nUR                  SU5      nUc  gS HI  nUR                  SU 3U5      nUc  M  UR                  (       d  M0  UR                  U R                  U'   MK     [        R	                  S	U R                   35        g)
z#Extract metadata from the OPF file.Údcz http://purl.org/dc/elements/1.1/r2   r3   z.//opf:metadataN)ÚtitleÚcreatorÚ	publisherÚdateÚlanguageÚ
identifierzdc:zExtracted metadata: )r;   Útextr!   r   r   )r*   rI   Úns_dcrK   r!   ÚfieldÚelements          r-   r=   Ú%EpubDocumentBackend._extract_metadataØ   s�   € àÐ9Ð:ˆØÐ7Ð8ˆà—=‘=Ð!2°FÓ;ˆØÑØó
ˆEð —m‘m c¨%¨ M°5Ó9ˆGØÓ" w§|§|¡|Ø'.§|¡|�—‘˜eÓ$ñ
ô 	�
‰
Ð)¨$¯-©-¨Ð9Õ:ó    Úhtml_contentÚcontent_file_pathc                 ó’   ^• U R                   (       d  U$ [        U5      R                  mU4S jnSn[        R                  " XCU5      $ )a
  Convert relative image paths to paths relative to temp directory root.

Args:
    html_content: HTML content with image references
    content_file_path: Path of the current XHTML file (for resolving relative paths)

Returns:
    HTML content with fixed image paths
c                 ó8  >• U R                  S5      nUR                  S5      (       a  U R                  S5      $ T(       a  TU-  nO[        U5      n SU S3$ ! [         a6  n[        R                  SU SU 35        U R                  S5      s S nA$ S nAff = f)NrW   )zdata:zhttp://zhttps://r7   r   zsrc="Ú"zFailed to resolve image path ú: )ÚgroupÚ
startswithr   r'   r   r]   )ÚmatchÚsrcÚ
image_pathr+   Úcontent_dirs       €r-   Úreplace_image_srcÚ?EpubDocumentBackend._fix_image_paths.<locals>.replace_image_src   s”   ø€ Ø—+‘+˜a“.ˆCð �~‰~ÐC×DÑDØ—{‘{ 1“~Ð%ö Ø(¨3Ñ.‘
ä! #›Y�
ð&à˜z˜l¨!Ð,Ð,øÜó &Ü—‘Ð<¸S¸EÀÀAÀ3ÐGÔHØ—{‘{ 1“~Õ%ûð&ús   ÁA Á
BÁ#+BÂBÂBzsrc="([^"]+)")r"   r   r?   ÚreÚsub)r*   rt   ru   r€   Úpatternr   s        @r-   Ú_fix_image_pathsÚ$EpubDocumentBackend._fix_image_pathsð   sB   ø€ ð �}�}ØÐô Ð,Ó-×4Ñ4ˆõ	&ð, #ˆÜ�vŠv�g°,Ó?Ð?rs   c                 ó:   • Sn[         R                  " USU5      nU$ )ad  Fix internal links that reference other XHTML files.

When combining multiple XHTML files into one HTML document, links like
'endnotes.xhtml#note-1' need to be converted to '#note-1' since all
content is now in a single file.

Args:
    html_content: HTML content with potentially broken internal links

Returns:
    HTML content with fixed internal links
zhref="([^"]*\.xhtml)(#[^"]*)"z	href="\2")r‚   rƒ   )r*   rt   r„   Úfixed_contents       r-   Ú_fix_internal_linksÚ'EpubDocumentBackend._fix_internal_links  s#   € ð 3ˆô Ÿš˜w¨°lÓCˆàÐrs   c                 ó   • U R                   $ ©N)r   )r*   s    r-   Úis_validÚEpubDocumentBackend.is_valid/  s   € à�z‰zÐrs   c                 óX  • U R                   (       a!  U R                   R                  5         SU l         [        U R                  [        5      (       a  U R                  R                  5         SU l        U R
                  (       ak  U R
                  R                  5       (       aK   [        R                  " U R
                  5        [        R                  SU R
                   35        SU l        ggg! [         a/  n[        R                  SU R
                   SU 35         SnAN>SnAff = f)zClean up resources.Nz Cleaned up temporary directory: z'Failed to clean up temporary directory ry   )r   Úcloser#   r   r   r"   ÚexistsÚshutilÚrmtreer   r   r'   r]   )r*   r+   s     r-   ÚunloadÚEpubDocumentBackend.unload3  sÞ   € ð �=�=Ø�M‰M×ÑÔ!Ø ˆDŒMÜ�d×)Ñ)¬7×3Ñ3Ø×Ñ×%Ñ%Ô'Ø"ˆÔð �=�=˜TŸ]™]×1Ñ1×3Ñ3ðÜ—’˜dŸm™mÔ,Ü—
‘
Ð=¸d¿m¹m¸_ÐMÔNð
 !ˆD�Mð 4ˆ=øô ó Ü—‘Ø=¸d¿m¹m¸_ÈBÈqÈcÐR÷ñ ûðús   Â$AC0 Ã0
D)Ã:%D$Ä$D)c                 ó   • g)NF© ©Úclss    r-   Úsupports_paginationÚ'EpubDocumentBackend.supports_paginationH  s   € ð rs   c                 ó$   • [         R                  1$ rŒ   )r   ÚEPUBr˜   s    r-   Úsupported_formatsÚ%EpubDocumentBackend.supported_formatsM  s   € ô × Ñ Ð!Ð!rs   c                 óš	  • [         R                  S5        U R                  5       (       a  U R                  (       d  [	        SU R
                   S35      e[        U R                  R                  =(       d    SSU R
                  S9n[        U R                  R                  =(       d    SUS9nU R                  R                  (       aì  U R                  R                  (       aÑ   [        [        R                   " SS	95      U l        [         R                  S
U R"                   35        U R%                  U R"                  5      (       dl  [         R'                  S5        U R"                  (       a?  U R"                  R)                  5       (       a   [*        R,                  " U R"                  5        SU l        S/nU R0                   HÞ  n [         R                  SU 35        U R                  R3                  U5      nUR5                  S5      n[6        R8                  " SU[6        R:                  [6        R<                  -  5      nU(       a  UR?                  S5      n	OUn	U RA                  U	5      n	U R"                  (       a  U RC                  X•5      n	URE                  U	5        Mà     URE                  S5        SRG                  U5      n
[I        U
RK                  S5      5      nU R                  n[M        UR                  URN                  UR                  SSS9nU R"                  (       aA  U R"                  S-  n[Q        U5      Ul)        [         R                  SURR                   35        [U        U[V        RX                  [Z        SUS9n[[        UUUS9nUR]                  5       n[        U R                  R                  =(       d    SSU R
                  S9Ul/        U R                  R                  =(       d    SUl        URa                  5         U$ ! [.         az  n[         R'                  SU 35        U R"                  (       a?  U R"                  R)                  5       (       a   [*        R,                  " U R"                  5        SU l         SnAGNÜSnAff = f! [.         a'  n[         R'                  SU SU 35         SnAGM  SnAff = f)z¡Convert the EPUB file to a DoclingDocument.

This method extracts all content files from the EPUB and processes
them sequentially using the HTMLDocumentBackend.
zConverting EPUB...zCannot convert EPUB with hash z$ because the backend failed to init.Úfilezapplication/epub+zip)r_   ÚmimetypeÚbinary_hash)ÚnameÚoriginÚdocling_epub_)Úprefixz(Extracting EPUB to temporary directory: zOEPUB extraction aborted due to size/count limits. Images will not be available.Nz*Failed to extract EPUB to temp directory: z?<!DOCTYPE html><html><head><meta charset="utf-8"/></head><body>zReading content file: zutf-8z<body[^>]*>(.*?)</body>rW   zFailed to read content file ry   z</body></html>Ú
F)Úenable_local_fetchÚenable_remote_fetchÚfetch_imagesÚinfer_furnitureÚ	add_titlezcombined.htmlz Set HTML backend source_uri to: )r   ÚformatÚbackendr_   Úbackend_options)r   r   r   )1r   r   r�   r   rB   r)   r   r¡   r¤   r   Ústemr   r«   r©   r   ÚtempfileÚmkdtempr"   rd   r]   r‘   r’   r“   r'   r    r8   Údecoder‚   ÚsearchÚDOTALLÚ
IGNORECASErz   r‰   r…   rA   Újoinr   Úencoder   rª   r>   Ú
source_urir   r   ÚHTMLr   Úconvertr¥   r�   )r*   r¥   Údocr+   Úcombined_html_partsÚcontent_fileÚ
xhtml_dataÚ
xhtml_textÚ
body_matchÚbody_contentÚcombined_htmlÚhtml_streamÚepub_optionsÚhtml_optionsÚ
dummy_filer   Úhtml_backends                    r-   r¼   ÚEpubDocumentBackend.convertR  sÌ  € ô 	�
‰
Ð'Ô(à�}‰}�‰ d§m§mÜØ0°×1CÑ1CÐ0DÐDhÐióð ô
  Ø—Y‘Y—^‘^×- vØ+Ø×*Ñ*ñ
ˆô  4§9¡9§>¡>×#;°VÀFÑKˆð �<‰<×$×$¨¯©×)H×)Hð%Ü $¤X×%5Ò%5¸_Ñ%MÓ N�”Ü—
‘
ÐEÀdÇmÁmÀ_ÐUÔVØ×.Ñ.¨t¯}©}×=Ñ=Ü—L‘Lð8ôð
 —}—}¨¯©×)=Ñ)=×)?Ñ)?ÜŸš d§m¡mÔ4Ø$(�D”Mð Nð
Ðð !×.Ô.ˆLðÜ—
‘
Ð3°L°>ÐBÔCð "Ÿ]™]×/Ñ/°Ó=�
Ø'×.Ñ.¨wÓ7�
ô  ŸYšYØ.°
¼B¿I¹IÌÏÉÑ<Uó�
ö Ø#-×#3Ñ#3°AÓ#6‘Lð $.�Lð  $×7Ñ7¸ÓE�ð —=—=Ø#'×#8Ñ#8¸Ó#T�Là#×*Ñ*¨<Ö8ñ9 /ðD 	×"Ñ"Ð#3Ô4ØŸ	™	Ð"5Ó6ˆô ˜m×2Ñ2°7Ó;Ó<ˆà—|‘|ˆÜ)Ø+×>Ñ>Ø ,× @Ñ @Ø%×2Ñ2Ø!Øñ
ˆð �=�=ØŸ™¨Ñ8ˆJÜ&)¨*£oˆLÔ#Ü�J‰JÐ9¸,×:QÑ:QÐ9RÐSÔTäØ&Ü×#Ñ#Ü'Ø$Ø(ñ
ˆô +ØØ&Ø ñ
ˆð ×"Ñ"Ó$ˆô $Ø—Y‘Y—^‘^×- vØ+Ø×*Ñ*ñ
ˆŒ
ð
 —9‘9—>‘>×+ VˆŒà×ÑÔàˆ
øô ó %Ü—‘ÐIÈ!ÈÐMÔNØ—=—= T§]¡]×%9Ñ%9×%;Ñ%;Ü—M’M $§-¡-Ô0Ø $�—’ûð	%ûôX ó Ü—‘Ð;¸L¸>ÈÈAÈ3ÐOÔPÞûðús3   Ã%CP ÇCRÐ
RÐA/RÒRÒ
S
Ò#SÓS
)r    r   r!   r   r"   r   rŒ   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   r   r   r   r   r%   Úboolrd   r=   r>   r…   r‰   r	   r�   r”   Úclassmethodrš   Úsetr   rž   r   r¼   Ú__static_attributes__Ú__classcell__)r,   s   @r-   r   r      s*  ø† ñð0 .2ñ	%àð%ð   $™ð%ð $ dÑ*÷	%ð %òNFðP7N¨Tð 7N°dô 7Nòr;ð0'@¨Sð '@ÀSð '@ÈSô '@ðR°ð ¸ô ð, ð˜$ó ó ðð ñ!ó ð!ð( Øð Dó ó ó ðð Øð" # kÑ"2ó "ó ó ð"ð ðE˜ó Eó öErs   r   )%Úloggingr‚   r’   r²   Úior   Úpathlibr   Úzipfiler   Údefusedxml.ElementTreeÚElementTreer9   Údefusedxml.commonr   Údocling_core.types.docr   r   Útyping_extensionsr	   Ú docling.backend.abstract_backendr
   Údocling.backend.html_backendr   Ú!docling.datamodel.backend_optionsr   r   Údocling.datamodel.base_modelsr   Údocling.datamodel.documentr   Údocling.exceptionsr   Ú	getLoggerrË   r   r   r—   rs   r-   Ú<module>rå      sY   ðó Û 	Û Û Ý Ý Ý å #Ý 1ß BÝ &å GÝ <ß TÝ 5Ý 4Ý 0à×Ò˜Ó"€ô}Ð4õ }rs   