
    j                         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m	Z	m
Z
 ddlmZ ddlmZ dd	lmZ g d
ZdgZdddZ G d de      Zy)    N)minidom)Document)BinaryIOAnyDictList   )HtmlConverter   )DocumentConverterResult)
StreamInfo)zapplication/epubzapplication/epub+zipzapplication/x-epub+zipz.epubz	text/htmlzapplication/xhtml+xml)z.htmlz.xhtmlc                        e Zd ZdZ fdZdedededefdZ	dededede
fdZd	ed
ededz  fdZd	ed
edee   fdZ xZS )EpubConverterzv
    Converts EPUB files to Markdown. Style information (e.g.m headings) and tables are preserved where possible.
    c                 @    t         |           t               | _        y )N)super__init__r
   _html_converter)self	__class__s    f/root/aria/tools/markitdown-venv/lib/python3.12/site-packages/markitdown/converters/_epub_converter.pyr   zEpubConverter.__init__   s    ,    file_streamstream_infokwargsreturnc                     |j                   xs dj                         }|j                  xs dj                         }|t        v ryt        D ]  }|j                  |      s y y)N TF)mimetypelower	extensionACCEPTED_FILE_EXTENSIONSACCEPTED_MIME_TYPE_PREFIXES
startswith)r   r   r   r   r   r    prefixs          r   acceptszEpubConverter.accepts#   sg      ((.B557 **0b779	001 	F""6*	 r   c                    t        j                  |d      5 }t        j                  |j	                  d            }|j                  d      d   j                  d      }t        j                  |j	                  |            }| j                  |d      | j                  |d      | j                  |d      | j                  |d	      | j                  |d
      | j                  |d      | j                  |d      d}|j                  d      D 	ci c]#  }	|	j                  d      |	j                  d      % }
}	|j                  d      }|D 	cg c]  }	|	j                  d       }}	dj                  |j                  d      d d       }|D cg c]  }||
v r|r
| d|
|    n|
|    }}g }|D ]  }||j                         v s|j	                  |      5 }t        j                  j                  |      }t        j                  j                  |      d   j!                         }t"        j%                  |      }| j&                  j)                  |t+        |||            }|j-                  |j.                  j1                                d d d         g }|j3                         D ]N  \  }}t5        |t6              rdj                  |      }|s*|j-                  d|j9                          d|        P |j;                  ddj                  |             t=        dj                  |      |d         cd d d        S c c}	w c c}	w c c}w # 1 sw Y   xY w# 1 sw Y   y xY w)NrzMETA-INF/container.xmlrootfiler   z	full-pathzdc:titlez
dc:creatorzdc:languagezdc:publisherzdc:datezdc:descriptionzdc:identifier)titleauthorslanguage	publisherdatedescription
identifieritemidhrefitemrefidref/r	   )r   r    filenamez, z**z:** 
z

r)   )markdownr)   )zipfileZipFiler   parseopengetElementsByTagNamegetAttribute_get_text_from_node_get_all_texts_from_nodesjoinsplitnamelistospathbasenamesplitextr   MIME_TYPE_MAPPINGgetr   convertr   appendr9   stripitems
isinstancelist
capitalizeinsertr   )r   r   r   r   zcontainer_domopf_pathopf_dommetadatar0   manifestspine_itemsspine_order	base_pathitem_idspinemarkdown_contentfilefr7   r    r   converted_contentmetadata_markdownkeyvalues                             r   rK   zEpubConverter.convert5   sn    __[#. G	! $MM!&&1I*JKM$99*EaHUUH
 mmAFF8$45G11':F99'<P 44WmL!55g~N00)D#77AQR"66wP(H $88@ !!$'):):6)BBH  "66yAKBMN$4,,W5NKN s#CR(I
  +h& 7@9+Qx012XgEVVE  +- T1::<' T#%77#3#3D#9$&GG$4$4X$>q$A$G$G$I	#4#8#8#C,0,@,@,H,H&)1*3)1-) )//0A0J0J0P0P0RST TT" !#&nn. Q
UeT* IIe,E%,,r#..2B1C4w-OP	Q ##Atyy1B'CD*%56hw>OKG	 G	, OT T[G	 G	s]   C9M!(M8M!M
')M!M,M!M!B6MAM!A&M!M!MM!!M*domtag_nameNc                 N    | j                  ||      }t        |      dkD  r|d   S y)zKConvenience function to extract a single occurrence of a tag (e.g., title).r   N)rA   len)r   re   rf   textss       r   r@   z!EpubConverter._get_text_from_node   s+    ..sH=u:>8Or   c                     g }|j                  |      D ]Y  }|j                  st        |j                  d      s'|j                  |j                  j                  j                                [ |S )zMHelper function to extract all occurrences of a tag (e.g., multiple authors).	nodeValue)r>   
firstChildhasattrrL   rk   rM   )r   re   rf   ri   nodes        r   rA   z'EpubConverter._get_all_texts_from_nodes   s]    ,,X6 	@D74??K#HT__66<<>?	@ r   )__name__
__module____qualname____doc__r   r   r   r   boolr%   r   rK   r   strr@   r   rA   __classcell__)r   s   @r   r   r      s    /   	
 
$MM  M 	M
 
!M^x 3 3: X  c r   r   )rE   r:   
defusedxmlr   xml.dom.minidomr   typingr   r   r   r   r   r
   _base_converterr   _stream_infor   r"   r!   rI   r    r   r   <module>r|      sP    	   $ , , * 5 %  $9  % xM xr   