ó
    �®žjÉ1  ã                  óÀ  • % S SK Jr  S SKrS SK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Jr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rS\ S'   Sr!S\ S'    S SK"r"SrSr%S\ S'   Sr&S\ S'    S SK'J(r)  Sr%\RT                  " \+5      r,Sr-Sr.Sr/Sr0Sr1Sr2 " S S\5      r3g! \# a  r$\$r! Sr$C$NNSr$C$ff = f! \# a  r$\$r& Sr$C$NLSr$C$ff = f) é    )ÚannotationsN)Údatetime)ÚEmailMessage)Úformat_datetimeÚ
formataddr)ÚBytesIO)ÚPath)ÚDocItemLabelÚDoclingDocumentÚDocumentOrigin)ÚDeclarativeDocumentBackend)ÚHTMLDocumentBackend)ÚEmailBackendOptionsÚHTMLBackendOptions)ÚInputFormat)ÚInputDocument)ÚDocumentLoadErrorFÚboolÚ_MAILPARSER_AVAILABLEzImportError | NoneÚ_MAILPARSER_IMPORT_ERRORTÚ_OXMSG_AVAILABLEÚ_OXMSG_IMPORT_ERROR)ÚMessages   ÐÏà¡±ái  é   é   zyThe 'mail-parser' package is required to process email files. Install it with `pip install 'docling-slim[format-email]'`.z�The 'python-oxmsg' package is required to process Outlook .msg files. Install it with `pip install 'docling-slim[format-email]'`.c                  óò   ^ • \ rS rSr S     SU 4S jjjrSS jr\SS j5       r\SS j5       rSS jr	\
SS j5       r\
SS j5       r      SS	 jrSS
 jrSS jrSS jrSS jrSS jrSS jrSrU =r$ )ÚEmailDocumentBackendéI   c                ó  >• [         (       d  [        [        5      [        eUc
  [	        5       n[
        TU ]  XU5        X0l        SU l        SU l	        S U l
         U R                  5       nUR                  [        5      U l	        U R                  (       a  U R                  U5      n[        R                   " U5      U l
        U R                  S LU l        g ! [         a    e ["         a  n[%        SU R&                   S35      UeS nAff = f)NFz6Could not initialize email backend for file with hash Ú.)r   ÚImportErrorÚ_INSTALL_HINTr   r   ÚsuperÚ__init__ÚoptionsÚvalidÚis_msgÚmailÚ_read_bytesÚ
startswithÚ
_MSG_MAGICÚ_msg_to_rfc822_bytesÚ
mailparserÚparse_from_bytesÚ	Exceptionr   Údocument_hash)ÚselfÚin_docÚpath_or_streamr%   ÚrawÚexcÚ	__class__s         €ÚZ/home/mande/repo/quber/.venv/lib/python3.13/site-packages/docling/backend/email_backend.pyr$   ÚEmailDocumentBackend.__init__J   sê   ø€ ÷ %Ò$ÜœmÓ,Ô2JÐJØ‰?Ü)Ó+ˆGÜ‰Ñ˜°Ô9à,3ŒØˆŒ
ØˆŒØ26ˆŒ	ð	Ø×"Ñ"Ó$ˆCØŸ.™.¬Ó4ˆDŒKØ�{�{Ø×/Ñ/°Ó4�Ü"×3Ò3°CÓ8ˆDŒIàŸ™¨$Ð.ˆD�JøÜó 	ØÜó 	Ü#ØHÈ×I[ÑI[ÐH\Ð\]Ð^óàðûð	ús   ÁA:C ÃDÃ)DÄDc                ó(  • [        U R                  [        5      (       a  U R                  R                  5       $ [        U R                  [        5      (       a  U R                  R                  5       $ [        S[        U R                  5       35      e)NzUnsupported input type: )Ú
isinstancer3   r   Úgetvaluer	   Ú
read_bytesÚ	TypeErrorÚtype©r1   s    r7   r)   Ú EmailDocumentBackend._read_bytesm   sq   € Ü�d×)Ñ)¬7×3Ñ3Ø×&Ñ&×/Ñ/Ó1Ð1Ü�d×)Ñ)¬4×0Ñ0Ø×&Ñ&×1Ñ1Ó3Ð3ÜÐ2´4¸×8KÑ8KÓ3LÐ2MÐNÓOÐOó    c                ób   • U R                  SS5      R                  SS5      R                  5       $ )NÚÚ Ú
)ÚreplaceÚstrip)Úvalues    r7   Ú_header_safeÚ!EmailDocumentBackend._header_safet   s+   € ð �}‰}˜T 3Ó'×/Ñ/°°cÓ:×@Ñ@ÓBÐBrA   c                ó¢  • [         (       d  [        [        5      [        e[        R
                  " U 5      n[        5       nUR                  (       a"  [        R                  UR                  5      US'   UR                  (       a"  [        R                  UR                  5      US'   0 nUR                   H›  n[        UR                  =(       d    SUR                  =(       d    S45      nU(       d  M?  UR                  R!                  ["        5      nU[$        :X  a  SnOU[&        :X  a  SnOSnUR)                  U/ 5      R+                  U5        M�     S HC  nUR-                  U5      (       d  M  [        R                  SR/                  X7   5      5      X''   ME     [1        UR2                  [4        5      (       a  [7        UR2                  5      US	'   UR8                  nUR:                  n	U(       a)  UR=                  U5        U	(       a  UR?                  U	S
S9  O)U	(       a  UR=                  U	S
S9  OUR=                  S5        UR@                   Hm  n
U
RB                  =(       d    SnURE                  S5      u  pÍnURG                  U
RH                  =(       d    SU=(       d    SU=(       d    SU
RJ                  S9  Mo     URM                  5       $ )a  Project an Outlook ``.msg`` (OLE2/CFB) onto RFC 822 bytes.

python-oxmsg reads the MAPI message; we assemble a standard
``email.message.EmailMessage`` from it so the ``.msg`` path shares the
exact body, HTML, address, and attachment handling used for ``.eml``
input.
ÚSubjectÚFromÚ ÚCcÚBccÚTo)rQ   rO   rP   ú, ÚDateÚhtml)Úsubtypezapplication/octet-streamÚ/rA   Úapplicationzoctet-stream)ÚmaintyperU   Úfilename)'r   r!   Ú_MSG_INSTALL_HINTr   ÚOxMsgMessageÚloadr   Úsubjectr   rI   ÚsenderÚ
recipientsr   ÚnameÚemail_addressÚ
propertiesÚint_prop_valueÚ_RECIPIENT_TYPE_PROP_IDÚ_RECIPIENT_TYPE_CCÚ_RECIPIENT_TYPE_BCCÚ
setdefaultÚappendÚgetÚjoinr:   Ú	sent_dater   r   ÚbodyÚ	html_bodyÚset_contentÚadd_alternativeÚattachmentsÚ	mime_typeÚ	partitionÚadd_attachmentÚ
file_bytesÚ	file_nameÚas_bytes)ÚdataÚmessageÚemail_messageÚgroupedÚ	recipientÚ	formattedÚrtypeÚheaderÚ
plain_bodyrm   Ú
attachmentrq   rX   Ú_rU   s                  r7   r,   Ú)EmailDocumentBackend._msg_to_rfc822_bytesz   sT  € ÷  ÒÜÔ/Ó0Ô6IÐIä×#Ò# DÓ)ˆÜ$›ˆà�?�?Ü';×'HÑ'HØ—‘ó(ˆM˜)Ñ$ð �>�>Ü$8×$EÑ$EÀgÇnÁnÓ$UˆM˜&Ñ!ð )+ˆØ ×+Ô+ˆIÜ"Ø—‘×% 2 y×'>Ñ'>×'DÀ"ÐEóˆIö ÙØ×(Ñ(×7Ñ7Ô8OÓPˆEØÔ*Ó*Ø‘ØÔ-Ó-Ø‘à�Ø×Ñ˜v rÓ*×1Ñ1°)Ö<ñ ,ó *ˆFØ�{‰{˜6×"Ó"Ü(<×(IÑ(IØ—I‘I˜g™oÓ.ó)�Ó%ñ *ô �g×'Ñ'¬×2Ñ2Ü$3°G×4EÑ4EÓ$FˆM˜&Ñ!à—\‘\ˆ
Ø×%Ñ%ˆ	ÞØ×%Ñ% jÔ1ÞØ×-Ñ-¨iÀÐ-ÑHøÞØ×%Ñ% i¸Ð%Ò@à×%Ñ% bÔ)à!×-Ô-ˆJØ"×,Ñ,×JÐ0JˆIØ#,×#6Ñ#6°sÓ#;Ñ ˆH˜Ø×(Ñ(Ø×%Ñ%×,¨Ø!×2 ]Ø×1 >Ø#×-Ñ-ð	 )ó ñ .ð ×%Ñ%Ó'Ð'rA   c                ó   • U R                   $ ©N)r&   r?   s    r7   Úis_validÚEmailDocumentBackend.is_validÁ   s   € Ø�z‰zÐrA   c                ó   • g)NF© ©Úclss    r7   Úsupports_paginationÚ(EmailDocumentBackend.supports_paginationÄ   s   € àrA   c                ó$   • [         R                  1$ r„   )r   ÚEMAILr‰   s    r7   Úsupported_formatsÚ&EmailDocumentBackend.supported_formatsÈ   s   € ä×!Ñ!Ð"Ð"rA   c                ó²   • U(       d  U$ / nU H6  u  pEU(       a  UR                  U SU S35        M%  UR                  U5        M8     SR                  U5      $ )Nz <Ú>rR   )rh   rj   )r1   Ú	addressesÚfallbackr|   r`   Úemails         r7   Ú_format_addressesÚ&EmailDocumentBackend._format_addressesÌ   sZ   € ö ØˆOàˆ	Û$‰KˆDÞØ× Ñ  D 6¨¨E¨7°!Ð!4Ö5à× Ñ  Ö'ñ	 %ð �y‰y˜Ó#Ð#rA   c                óÂ   • [         R                  " SUR                  5       5       Vs/ s H*  nUR                  5       (       d  M  UR                  5       PM,     sn$ s  snf )Nz\n\s*\n+)ÚreÚsplitrG   )r1   ÚtextÚ	paragraphs      r7   Ú_split_paragraphsÚ&EmailDocumentBackend._split_paragraphsÛ   sM   € ô  ŸXšX k°4·:±:³<Ô@ó
â@�	Ø�‰× ó ˆI�O‰OÖÙ@ñ
ð 	
ùò 
s   ¨AÁAc           	     óÚ   • [        UR                  S5      5      n[        U[        R                  S[
        S9nUR                  S5        [        UU[        SSS9S9nUR                  5       $ )Nzutf-8zemail-body.html)r3   ÚformatrY   Úbackendr   F)Ú	add_titleÚinfer_furniture)r2   r3   r%   )	r   Úencoder   r   ÚHTMLr   Úseekr   Úconvert)r1   rT   Úhtml_streamr2   r¡   s        r7   Ú_convert_html_partÚ'EmailDocumentBackend._convert_html_partâ   sj   € Ü˜dŸk™k¨'Ó2Ó3ˆÜØ&Ü×#Ñ#Ø&Ü'ñ	
ˆð 	×Ñ˜ÔÜ%ØØ&Ü&°ÈÑNñ
ˆð
 �‰Ó Ð rA   c                ó  • U R                   c   eU R                   R                  (       aA  / nU R                   R                   H#  nUR                  U R                  U5      5        M%     U$ U R                   R                  (       a`  / nU R                   R                   HB  nU R                  U5      nUR                  U R                  UR                  5       5      5        MD     U$ U R                  U R                   R                  5      $ r„   )r(   Ú
text_plainÚextendr�   Ú	text_htmlr©   Úexport_to_markdownrl   )r1   Ú
paragraphsÚpartÚhtml_docs       r7   Ú_get_body_paragraphsÚ)EmailDocumentBackend._get_body_paragraphsò   sÐ   € Ø�y‰yÑ$Ð$Ð$à�9‰9××Ø$&ˆJØŸ	™	×,Ô,�Ø×!Ñ! $×"8Ñ"8¸Ó">Ö?ñ -àÐà�9‰9××ØˆJØŸ	™	×+Ô+�Ø×2Ñ2°4Ó8�Ø×!Ñ! $×"8Ñ"8¸×9TÑ9TÓ9VÓ"WÖXñ ,ð Ðà×%Ñ% d§i¡i§n¡nÓ5Ð5rA   c                óâ   • U R                   c   eU R                   R                  n[        U[        5      (       a  UR	                  5       $ [        U[
        5      (       a  UR                  5       $ g)NrN   )r(   Údater:   r   Ú	isoformatÚstrrG   )r1   Ú	mail_dates     r7   Ú_get_date_textÚ#EmailDocumentBackend._get_date_text  sX   € Ø�y‰yÑ$Ð$Ð$à—I‘I—N‘Nˆ	Ü�i¤×*Ñ*Ø×&Ñ&Ó(Ð(Ü�i¤×%Ñ%Ø—?‘?Ó$Ð$ØrA   c                óˆ  • U R                   c   e/ n[        U R                   R                  =(       d    / 5       H„  u  p#UR                  S5      =(       d    SR	                  5       nU(       d  SUS-    3nUR                  S5      =(       d    SR	                  5       nUR                  U(       a  U SU S3OU5        M†     U$ )zËReturn one display label per attachment (name, optional content type).

Only attachment metadata is surfaced; the encoded payload is never
included, matching how ``.eml`` attachment content is excluded.
rY   rN   zattachment-é   Úmail_content_typez (Ú))r(   Ú	enumeraterp   ri   rG   rh   )r1   ÚlabelsÚindexr€   rY   Úcontent_types         r7   Ú_get_attachment_labelsÚ+EmailDocumentBackend._get_attachment_labels  s«   € ð �y‰yÑ$Ð$Ð$àˆÜ!*¨4¯9©9×+@Ñ+@×+FÀBÖ!GÑˆEØ"Ÿ™ zÓ2×8°b×?Ñ?ÓAˆHÞØ(¨°©¨Ð4�Ø&ŸN™NÐ+>Ó?×EÀ2×LÑLÓNˆLØ�M‰M¾L˜X˜J b¨¨°aÑ8ÈhÖWñ "Hð ˆrA   c                óþ  • U R                  5       (       a  U R                  c  [        SU R                   S35      e[	        U R
                  R                  =(       d    U R                  (       a  SOSSU R                  S9n[        U R
                  R                  =(       d    SUS9n[        U R                  R                  [        5      (       a$  U R                  R                  R                  5       OS	nU R                  U R                  R                  S	S
9nU R                  U R                  R                   S	S
9nU R#                  5       nU R%                  5       nU(       a  UR'                  US9  U(       a!  UR)                  [*        R,                  SU 3S9  U(       a!  UR)                  [*        R,                  SU 3S9  U(       a!  UR)                  [*        R,                  SU 3S9  U H!  nUR)                  [*        R,                  US9  M#     U R.                  R0                  (       aN  U R3                  5       n	U	(       a7  UR5                  SSS9  UR7                  SS9n
U	 H  nUR9                  XºS9  M     U$ )NzCannot convert doc with z$ because the backend failed to init.zfile.msgzfile.emlzmessage/rfc822)rY   ÚmimetypeÚbinary_hashÚfile)r`   ÚoriginrN   )r”   )r›   zFrom: )Úlabelr›   zTo: zDate: ÚAttachmentsr   )r›   Úlevelrp   )r`   )r›   Úparent)r…   r(   ÚRuntimeErrorr0   r   rÉ   r`   r'   r   Ústemr:   r]   r¸   rG   r–   Úfrom_Útorº   r³   r¢   Úadd_textr
   ÚTEXTr%   Úlist_attachmentsrÄ   Úadd_headingÚadd_list_groupÚadd_list_item)r1   rÊ   Údocr]   Ú	from_textÚto_textÚ	date_textÚbody_paragraphsÚbody_paragraphÚattachment_labelsÚattachments_grouprË   s               r7   r§   ÚEmailDocumentBackend.convert  s  € Ø�}‰}�‰ $§)¡)Ñ"3ÜØ*¨4×+=Ñ+=Ð*>Ð>bÐcóð ô  Ø—Y‘Y—^‘^×R°d·k·k©
ÀzØ%Ø×*Ñ*ñ
ˆô
  4§9¡9§>¡>×#;°VÀFÑKˆô *4°D·I±I×4EÑ4EÄs×)KÑ)KˆD�I‰I×Ñ×#Ñ#Ô%ÐQSð 	ð ×*Ñ*¨4¯9©9¯?©?ÀRÐ*ÐHˆ	Ø×(Ñ(¨¯©¯©ÀÐ(ÐCˆØ×'Ñ'Ó)ˆ	Ø×3Ñ3Ó5ˆæØ�M‰M˜wˆMÑ'ÞØ�L‰Lœ|×0Ñ0¸À	¸{Ð7KˆLÑLÞØ�L‰Lœ|×0Ñ0¸¸g¸YÐ7GˆLÑHÞØ�L‰Lœ|×0Ñ0¸À	¸{Ð7KˆLÑLÛ-ˆNØ�L‰Lœ|×0Ñ0°~ˆLÓFñ .ð �<‰<×(×(Ø $× ;Ñ ;Ó =ÐÞ Ø—‘ ]¸!�Ñ<Ø$'×$6Ñ$6¸MÐ$6Ð$JÐ!Û.�EØ×%Ñ%¨5Ð%ÓKñ /ð ˆ
rA   )r'   r(   r%   r&   r„   )r2   r   r3   zBytesIO | Pathr%   zEmailBackendOptions | None)ÚreturnÚbytes)rH   r¸   râ   r¸   )rw   rã   râ   rã   )râ   r   )râ   zset[InputFormat])r“   zlist[tuple[str, str]] | Noner”   r¸   râ   r¸   )r›   r¸   râ   ú	list[str])rT   r¸   râ   r   )râ   rä   )râ   r¸   )râ   r   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__r$   r)   ÚstaticmethodrI   r,   r…   Úclassmethodr‹   r�   r–   r�   r©   r³   rº   rÄ   r§   Ú__static_attributes__Ú__classcell__)r6   s   @r7   r   r   I   sÏ   ø† ð
 /3ð	!àð!ð 'ð!ð ,÷	!ð !ôFPð óCó ðCð
 óD(ó ðD(ôLð óó ðð ó#ó ð#ð$Ø5ð$ØADð$à	ô$ô
ô!ô 6ô$ô÷",ò ,rA   r   )4Ú
__future__r   Úloggingr™   r   Úemail.messager   Úemail.utilsr   r   Úior   Úpathlibr	   Údocling_core.types.docr
   r   r   Ú docling.backend.abstract_backendr   Údocling.backend.html_backendr   Ú!docling.datamodel.backend_optionsr   r   Údocling.datamodel.base_modelsr   Údocling.datamodel.documentr   Údocling.exceptionsr   r   Ú__annotations__r   r-   r!   Úer   r   Úoxmsgr   r[   Ú	getLoggerrå   Ú_logr+   rd   re   rf   r"   rZ   r   rˆ   rA   r7   Ú<module>rÿ      s  ðö #ã Û 	Ý Ý &ß 3Ý Ý ç PÑ På GÝ <ß UÝ 5Ý 4Ý 0ð $Ð �tÓ #Ø/3Ð Ð,Ó 3ð!Ûà Ðð Ð �$Ó Ø*.Ð Ð'Ó .ðÝ-àÐð ×Ò˜Ó"€ð 1€
ð !Ð ØÐ ØÐ ðBð ðBð ôBÐ5õ BøðM ó !Ø Õûð!ûð ó ØÕûðús0   Á/B6 ÂC Â6CÂ<CÃCÃCÃCÃC