
    Z'i	,                         d dl Zd dlZd dlZd dlmZ d dlmZ d dlm	Z	  G d d      Z
 G d de
      Z G d	 d
      Z G d de      Z G d de      Zy)    N)BookFile)Mimetype)strip_symbolsc                   H    e Zd Zd Zd Zg fdZd Zd Zd ZddZ	d Z
d	 Zy
)fb2tagc                     || _         g | _        g | _        d| _        t	        | j                         | _        g | _        d| _        d| _        y NF )	tagsattrsattrssindexlensizevaluesprocess_valuecurrent_valueselfr   s     &/opt/sopds/book_tools/format/fb2sax.py__init__zfb2tag.__init__
   sD    tytzt{tzTYYtyt{tt    c                 X    d| _         g | _        g | _        g | _        d| _        d| _        y r	   )r   r   r   r   r   r   r   s    r   resetzfb2tag.reset   s.    tzt{tzt{ttr   c                 *   d}| j                   dz   | j                  k  r4| j                  | j                   dz      |k(  r| xj                   dz  c_         | j                   dz   | j                  k(  r$|| _        | j                  j                  |       d}|S )NF   T)r   r   r   r   r   append)r   tagr   results       r   tagopenzfb2tag.tagopen   sx    v::a<
"YYtzz!|$c)ZZ]Z::a<$))
#$*
++

U
#&}r   c                     | j                   dk\  rk| j                  | j                      |k(  rN| xj                   dz  c_         | j                  r%| j                  j	                  | j
                         d| _        y y y )Nr   r   F)r   r   r   r   r   r   r   r    s     r   tagclosezfb2tag.tagclose)   sb    
**a-YYtzz"C'ZZ]Z""""4#5#56 %T	 ( r   c                     | j                   dz   | j                  k(  r4| j                  dk(  r|| _        d| _        y | xj                  |z  c_        y y )Nr   FT)r   r   r   r   r   values     r   setvaluezfb2tag.setvalue1   sJ    ::a<$))
#& %T $T& $r   c                     | j                   S N)r   r   s    r   getvaluezfb2tag.getvalue9   s    kkr   c                 p    d}t        | j                        dkD  r|j                  | j                        }|S Nr   r   )r   r   join)r   dividerr!   s      r   gettextzfb2tag.gettext<   s/    v
dkk
1
dkk*&}r   c                 t    t        | j                        dkD  r| j                  j                  |      }|S d }|S Nr   )r   r   get)r   attrvals      r   getattrzfb2tag.getattrB   s7    
djj/!
jjnnT"# z #zr   c                     t        | j                        dkD  r/| j                  D cg c]  }||v s|j                  |       }}|S g }|S c c}w r3   )r   r   r4   )r   r5   ar6   s       r   getattrszfb2tag.getattrsI   sP    	T[[	!	#';;<a$!)aeeDk<< j j =s
   	AAN)
)__name__
__module____qualname__r   r   r"   r%   r)   r,   r1   r7   r:    r   r   r   r   	   s4     ! 
&'r   r   c                   h    e Zd Zd Zd Zg fdZd Zd Zd Ze	d        Z
e
j                  d        Z
y	)
fb2coverc                 h    d| _         d| _        g | _        d| _        t        j                  | |       y NFr   )iscover
cover_name_cover_dataisfindr   r   r   s     r   r   zfb2cover.__init__Q   s-    t|ttt{tD!r   c                 f    d| _         d| _        g | _        d| _        t        j                  |        y rC   )rD   rE   rF   rG   r   r   r   s    r   r   zfb2cover.resetX   s+    t|ttt{||Dr   c                     t         j                  | ||      }|r<| j                  d      }|d k7  r&|j                         }|| j                  k(  rd| _        |S )NidT)r   r"   r7   lowerrE   rD   )r   r    r   r!   idvalues        r   r"   zfb2cover.tagopen_   sO    nnT#e,v
,,t$'d]]]_W(!}r   c                 d    | j                   rd| _        d| _         t        j                  | |       y )NTF)rD   rG   r   r%   r$   s     r   r%   zfb2cover.tagclosei   s%    
,,$+$,tC r   c                 *    |d k7  r|dk7  r|| _         y y y Nr   )rE   )r   rE   s     r   setcovernamezfb2cover.setcovernameo   s    
d
z2~$$/  .
r   c                 `    | j                   r"|dk7  r| j                  j                  |       y y y )Nz\n)rD   rF   r   r   datas     r   add_datazfb2cover.add_datat   s.    
,,5[$$T*  r   c                 8    dj                  | j                        S rO   )r/   rF   r   s    r   
cover_datazfb2cover.cover_datay   s    ggd&&''r   c                     |g| _         y r+   )rF   r'   s     r   rV   zfb2cover.cover_data}   s     'tr   N)r<   r=   r>   r   r   r"   r%   rP   rT   propertyrV   setterr?   r   r   rA   rA   P   sS    " ! !%
+
 ( ( " "r   rA   c                   4    e Zd ZddZd Zd Zd Zd ZddZy)		fb2parserc                    || _         t        d      | _        t        d      | _        t        d      | _        t        d      | _        t        d      | _        t        d      | _        t        d      | _        t        d      | _	        | j                   d	k7  r t        d
      | _
        t        d      | _        d| _        d| _        d	| _        d| _        y )N)description
title-infoauthorz
first-name)r]   r^   r_   z	last-name)r]   r^   genre)r]   r^   lang)r]   r^   z
book-title)r]   r^   
annotationp)r]   zdocument-infodate)r]   r^   sequencer   )r]   	coverpageimage)fictionbookbinaryr]   Tr   )rcr   author_firstauthor_lastr`   ra   
book_titlerb   docdateseriesrE   rA   cover_imagestoptagprocess_descriptionparse_errorparse_errormsg)r   	readcovers     r   r   zfb2parser.__init__   s    tw RStPQt=>tz;<tyGHtKLtABt|ABt{
''1*"$GH$/%'?@$
!t| $tttr   c                 H   d| _         d| _        | j                  j                          | j                  j                          | j
                  j                          | j                  j                          | j                  j                          | j                  j                          | j                  j                          | j                  j                          | j                  dk7  r5| j                  j                          | j                  j                          y y )NTr   )rr   rs   rk   r   rl   r`   ra   rm   rb   ro   rn   rj   rE   rp   r   s    r   r   zfb2parser.reset   s     $tt zzyy{{||
''1*
//


!



 
 
" r   c                    |j                         }| j                  r| j                  j                  |       | j                  j                  |       | j
                  j                  |       | j                  j                  |       | j                  j                  |       | j                  j                  |       | j                  j                  ||       | j                  j                  ||       | j                  dk7  r| j                  j                  ||      r| j                  j                  d      }|dk(  s|d k(  r| j                  j                  d      }t        |      dkD  r|d   dk(  r|j                  d      }nd }| j                   j#                  |       | j                  dk7  r| j                   j                  ||       y y )Nr   zl:hrefr   z
xlink:href#)rK   rr   rk   r"   rl   r`   ra   rm   rb   rn   ro   rj   rE   r7   r   striprp   rP   )r   namer   rE   s       r   start_elementzfb2parser.start_element   si   JJLt

"
"



#
#D
)



"
"4
(
**

T
"
))

D
!
//
!
!$
'
//
!
!$
'
,,

tE
*
++

d5
)WWaZ''U3??228<
r>Z%5"oo55lC:z?1$A);(..s3:":  --j9
''1*



"
"4
. r   c                     |j                         }| j                  r| j                  j                  |       | j                  j                  |       | j
                  j                  |       | j                  j                  |       | j                  j                  |       | j                  j                  |       | j                  j                  |       | j                  j                  |       | j                  dk7  r| j                  j                  |       | j                  dk7  r7| j                  j                  |       | j                  j                  rt        |dk(  rt!        | j                  j#                               t!        | j                  j#                               kD  r&| j                  j$                  j'                  d       nlt!        | j                  j#                               t!        | j                  j#                               k  r%| j                  j$                  j'                  d       || j(                  k(  r<| j                  dk7  r'| j                  j                  dk(  rt        d| _        y t        y )Nr   r_    r   F)rK   rr   rk   r%   rl   r`   ra   rm   rb   rn   ro   rj   rE   rp   rG   StopIterationr   r,   r   r   rq   )r   rz   s     r   end_elementzfb2parser.end_element   s   JJLt

"
"



$
$T
*



#
#D
)
**

d
#
))

T
"
//
"
"4
(
//
"
"4
(
,,


%
++

t
$WWaZ__%%d+
''1*



#
#D
)$$   .!!**,-c$2C2C2L2L2N.OO%%,,S14##,,./D4E4E4N4N4P0QQ$$++C0

WWaZ  ++r1##).(   r   c                    | j                   r| j                  j                  |       | j                  j                  |       | j                  j                  |       | j
                  j                  |       | j                  j                  |       | j                  j                  |       | j                  j                  |       | j                  dk7  r| j                  j                  |       y y r3   )rr   rk   r)   rl   r`   ra   rm   rb   rn   rj   rp   rT   rR   s     r   	char_datazfb2parser.char_data   s    

"
"



$
$T
*



#
#D
)
**

d
#
))

T
"
//
"
"4
(
//
"
"4
(
,,


%
''1*



#
#D
) r   c                    | j                          t        j                  j                  j	                         }| j
                  |_        | j                  |_        | j                  |_
        	 |dk(  r!|j                  |j                         d       y |j                  |j                  |      d       y # t        $ r Y y t        $ r}|| _        d| _        Y d }~y d }~ww xY w)Nr   Tr   )r   xmlparsersexpatParserCreater{   StartElementHandlerr   EndElementHandlerr   CharacterDataHandlerParsereadr~   	Exceptionrt   rs   )r   fhsizeparsererrs        r   parsezfb2parser.parse   s    

""//1%)%7%7"#'#3#3 &*nn#		axQVVXt,QVVE]D1 	 	 #DD	s$   -%B5 !B5 5	C  C CC N)r   )	r<   r=   r>   r   r   r{   r   r   r   r?   r   r   r[   r[      s!    $#/2 !D
*r   r[   c                       e Zd Zd Zy)FB2StructureExceptionc                     t         j                  | d|z         t        |t               rt        t	        j
                                y y )Nzfb2 verification failed: %s)r   r   
isinstanceprint	traceback	print_exc)r   errors     r   r   zFB2StructureException.__init__   s8    4!>!FGeY')%%'( (r   N)r<   r=   r>   r   r?   r   r   r   r      s    )r   r   c                   H    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zy)FB2saxc                 R   t        j                  | ||t        j                         t	        d      | _        | j
                  j                  dd       | j                  j                  | j
                         | j                  j                  dk7  r"t        d| j                  j                  z        | j                          | j                          | j                          | j                          | j                          | j!                          | j#                         | _        y )Nr   zFB2sax parse error (%s))r   r   r   FB2r[   fileseekr   rs   r   rt   _FB2sax__detect_title_FB2sax__detect_authors_FB2sax__detect_tags_FB2sax__detect_series_info_FB2sax__detect_language_FB2sax__detect_docdate_FB2sax__detect_descriptionr]   )r   r   original_filenames      r   r   zFB2sax.__init__  s    $&7F"1		q!TYY'>>%%*'(A$..B_B_(_``!!# 446r   c                 6   t        d      }| j                  j                  dd       |j                  | j                         t	        |j
                  j                        dkD  r.	 |j
                  j                  }t        j                  |      }|S y #  Y y xY w)Nr   r   )	r[   r   r   r   r   rp   rV   base64	b64decode)r   imgfb2parserscontents       r   extract_cover_memoryzFB2sax.extract_cover_memory  s     |		q!499%|''223A5**55((+ s   &,B Bc                    d}t        | j                  j                  j                               dkD  r:| j                  j                  j                         d   j	                  t
              }t        |      dkD  r| j                  |       y r.   )r   r[   rm   r,   ry   r   __set_title__r   ress     r   __detect_titlezFB2sax.__detect_title  sk    t~~((1134q8..++446q9??NCs8a<s#r   c                 z   | j                   j                  j                  d      xs d}t        |      dk(  ret        | j                   j                  j	                               dkD  r5| j                   j                  j	                         d   j                         }t        |      dkD  r| j                  |       y )Nr(   r   r   )r[   rn   r7   r   r,   ry   __set_docdate__r   s     r   __detect_docdatezFB2sax.__detect_docdate&  s    nn$$,,W5;s8Q;3t~~55>>@AAE..((113A6<<>Cs8a<  %r   c                 R   t        | j                  j                  j                               D ]w  \  }}|j	                  t
              }| j                  j                  j                         |   j	                  t
              }| j                  dj                  ||g      |       y y )Nr}   )		enumerater[   rl   r,   ry   r   rk   __add_author__r/   )r   idxr_   	last_name
first_names        r   __detect_authorszFB2sax.__detect_authors.  s    $T^^%?%?%H%H%JK 	NKC]3I44==?DJJ=YJ*i)@ A9M	N r   c                    d}t        | j                  j                  j                               dkD  r:| j                  j                  j                         d   j	                  t
              }t        |      dkD  r|| _        y r.   )r   r[   ra   r,   ry   r   language_coder   s     r   __detect_languagezFB2sax.__detect_language5  se    t~~""++-.2..%%..0399-HCs8a<!$Dr   c                     | j                   j                  j                         D ]4  }| j                  |j	                         j                  t                     6 y r+   )r[   r`   r,   __add_tag__rK   ry   r   )r   r`   s     r   __detect_tagszFB2sax.__detect_tags=  sE    ^^))224 	AEU[[]00?@	Ar   c                 T   t        | j                  j                  j                        dkD  r|| j                  j                  j                  d   }|j	                  d      }|rE|j                  t              }|j	                  dd      j                  t              }||d| _        y y y )Nr   rz   number0)titler   )r   r[   ro   r   r4   ry   r   series_info)r   r   ser_namer   r   s        r   __detect_series_infozFB2sax.__detect_series_infoA  s    t~~$$++,Q.%%,,Q/AuuV}H }5h,22=A #"$ 	  /r   c                     d}t        | j                  j                  j                               dkD  r3dj	                  | j                  j                  j                               }t        |      dkD  r|S y )Nr   r   r;   )r   r[   rb   r,   r/   r   s     r   __detect_descriptionzFB2sax.__detect_descriptionN  s[    t~~((1134q899T^^66??ABCs8a<Jr   c                      y r+   r?   )r   kindr(   r   s       r   __exit__zFB2sax.__exit__V  s    r   N)r<   r=   r>   r   r   r   r   r   r   r   r   r   r   r?   r   r   r   r     s5    7Ar   r   )xml.parsers.expatr   r   r   book_tools.format.bookfiler   book_tools.format.mimetyper   book_tools.format.utilr   r   rA   r[   r   r   r   r?   r   r   <module>r      sX       / / 0E EN/"v /"bx xt)I )VX Vr   