
    Fe,                       d Z ddlmZ ddlZddlZddlZddlZddlmZ ddlm	Z	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 ddlmZ ddlmZ e	rddlmZ  ej:                  e      Z G d de      Z dddZ!dddZ"dddZ#dZ$dZ%dZ&e&dz   Z' ejP                  de& de' d      Z) G d d ejT                        Z+d$d!Z,d%d"Z-d&d#Z.y)'z5Build epub3 files.

Originally derived from epub.py.
    )annotationsN)path)TYPE_CHECKINGAny
NamedTuple)package_dir)
_epub_base)ENUMConfig)__)logging)copy_asset_file)make_filename)Sphinxc                  ,    e Zd ZU ded<   ded<   ded<   y)NavPointstrtextrefurilist[NavPoint]childrenN)__name__
__module____qualname____annotations__     7/usr/lib/python3/dist-packages/sphinx/builders/epub3.pyr   r      s    
IKr   r   ltrrtl)
horizontalverticalr"   r!   zvertical-rlzhorizontal-tb)r"   r!   z<!DOCTYPE html>zU<html xmlns="http://www.w3.org/1999/xhtml" xmlns:epub="http://www.idpf.org/2007/ops">u   :|[A-Z]|_|[a-z]|[À-Ö]|[Ø-ö]|[ø-˿]|[Ͱ-ͽ]|[Ϳ-῿]|[‌-‍]|[⁰-↏]|[Ⰰ-⿯]|[、-퟿]|[豈-﷏]|[ﷰ-�]|[𐀀-󯿿]u    \-|\.|[0-9]|·|[̀-ͯ]|[‿-⁀](z)(z)*c                       e Zd ZdZdZ ed      ZdZ ej                  e
dd      ZeZeZdZddZd fd	Zd fd
ZddZddZddZ xZS )Epub3Builderz
    Builder that outputs epub3 files.

    It creates the metainfo files content.opf, nav.xhtml, toc.ncx, mimetype,
    and META-INF/container.xml. Afterwards, all necessary files are zipped to
    an epub file.
    epubzThe ePub file is in %(outdir)s.F	templatesepub3Tc                    | j                          | j                          | j                          | j                          | j	                          | j                          | j                          y)z/Create the metainfo files and finally the epub.N)get_tocbuild_mimetypebuild_containerbuild_contentbuild_navigation_doc	build_toc
build_epubselfs    r   handle_finishzEpub3Builder.handle_finishX   sO    !!#r   c                   | j                   j                  }t        j                  d      x}t	        j
                  t        |            }nt	        j
                         }t        | !         }t        j                  | j                   j                        |d<   t        j                  | j                   j                        |d<   t        j                  |      |d<   t        j                  |      |d<   t        j                  t	        j                   d|            |d<   t        j                  | j                   j"                        |d<   | j                   j$                  |d	<   |S )
zaCreate a dictionary with all metadata for the content.opf
        file properly escaped.
        SOURCE_DATE_EPOCHdescriptioncontributorpage_progression_directionibook_scroll_axisz%Y-%m-%dT%H:%M:%SZdateversionepub_version)configepub_writing_modeosgetenvtimegmtimeintsupercontent_metadatahtmlescapeepub_descriptionepub_contributorPAGE_PROGRESSION_DIRECTIONSgetIBOOK_SCROLL_AXISstrftimer;   r<   )r2   writing_modesource_date_epoch
time_tuplemetadata	__class__s        r   rE   zEpub3Builder.content_metadatab   s    {{44!#+>!??LS):%;<JJ7+-"&++dkk.J.J"K"&++dkk.J.J"K1L1P1PQ]1^-.(9(=(=l(K$%;;t}}5I:'VW"kk$++*=*=>#';;#;#; r   c                   t         |   |       | j                  j                  }t        j                  |      | j                  d<   | j                  | j                  d<   | j                  | j                  d<   d| j                  d<   y )Ntheme_writing_modehtml_taguse_meta_charsetTskip_ua_compatible)	rD   prepare_writingr=   r>   THEME_WRITING_MODESrK   globalcontextrU   rV   )r2   docnamesrN   rR   s      r   rX   zEpub3Builder.prepare_writingw   sw    ){{443F3J3J<3X/0)-:&151F1F-.37/0r   c                2   g }|j                  t        ddg              d}|D ]c  }|d   s
|d   j                  d      d   }|| j                  v r0|d   | j                  j
                  kD  rMt        |d   |d   g       }|d   |k(  r@|j                          |d   j                  j                  |       |j                  |       |d   |dz   k(  r5|dz  }|d   j                  j                  |       |j                  |       |d   |k  ri|d   t        |      k  r"|j                          |d   t        |      k  r"|d   }|d   j                  j                  |       |j                  |       Yd	}t        |       |d   j                  S )
ac  Create the toc navigation structure.

        This method is almost same as build_navpoints method in epub.py.
        This is because the logical navigation structure of epub3 is not
        different from one of epub2.

        The difference from build_navpoints method is templates which are used
        when generating navigation documents.
         r   r   r   #level   z+Should never reach here. It might be a bug.)
appendr   splitignored_filesr=   epub_tocdepthpopr   lenRuntimeError)r2   navnodesnavstackr_   nodefilenavpointunreachables           r   build_navlistzEpub3Builder.build_navlist   s    $&R,- 	0D<>'',Q/Dt)))G}t{{888Vd8nbAHG}%%%,,X6)g%!)+
%%,,X6)g&7mc(m3LLN 7mc(m3W%%,,X6)K";//5	08 {###r   c                    t        j                  | j                  j                        t        j                  | j                  d         |dS )z_Create a dictionary with all metadata for the nav.xhtml file
        properly escaped.
        toc)lang
toc_localenavlist)rF   rG   r=   epub_languageguide_titles)r2   rt   s     r   navigation_doc_metadataz$Epub3Builder.navigation_doc_metadata   s>    
 KK 9 9:++d&7&7&>?
 	
r   c                6   t         j                  t        d             | j                  j                  dk(  rW| j
                  j                  | j                  j                  | dd      }| j                  |g       }| j                  |       n| j                  }| j                  |      }t        t        j                  | j                  d      | j                   | j#                  |             d| j$                  vr| j$                  j'                  d       yy)z"Write the metainfo file nav.xhtml.zwriting nav.xhtml file...defaultF)prune_toctreesincludehiddenznav.xhtml_tz	nav.xhtmlN)loggerinfor   r=   epub_tocscopeenvget_and_resolve_doctreeroot_docget_refnodestoc_add_filesrefnodesro   r   r   jointemplate_diroutdirrw   filesrb   )r2   doctreer   rt   s       r   r.   z!Epub3Builder.build_navigation_doc   s    B234;;$$	1hh66$$d$E 7 ;G (("5Hx( }}H$$X.		$"3"3]CT[[44W=	? djj(JJk* )r   )returnNone)r   dict[str, Any])r[   zset[str]r   r   )ri   zlist[dict[str, Any]]r   r   )rt   r   r   r   )r   r   r   __doc__namer   epilogsupported_remote_imagesr   r   r   r   DOCTYPEdoctypeHTML_TAGrU   rV   r3   rE   rX   ro   rw   r.   __classcell__)rR   s   @r   r%   r%   F   sc     D12F#499[+w?LGH*8)$V
+r   r%   c                p   | j                   j                  dk7  ry | j                  j                  st        j                  t        d             t        j                  | j                  j                        st        j                  t        d             | j                  j                  st        j                  t        d             | j                  j                  st        j                  t        d             | j                  j                  st        j                  t        d             | j                  j                  st        j                  t        d             | j                  j                  st        j                  t        d             | j                  j                  st        j                  t        d	             | j                  j                   st        j                  t        d
             | j                  j"                  st        j                  t        d             y y )Nr&   zHconf value "epub_language" (or "language") should not be empty for EPUB3z2conf value "epub_uid" should be XML NAME for EPUB3zGconf value "epub_title" (or "html_title") should not be empty for EPUB3z6conf value "epub_author" should not be empty for EPUB3z;conf value "epub_contributor" should not be empty for EPUB3z;conf value "epub_description" should not be empty for EPUB3z9conf value "epub_publisher" should not be empty for EPUB3zIconf value "epub_copyright" (or "copyright")should not be empty for EPUB3z:conf value "epub_identifier" should not be empty for EPUB3z2conf value "version" should not be empty for EPUB3)builderr   r=   ru   r|   warningr   _XML_NAME_PATTERNmatchepub_uid
epub_titleepub_authorrI   rH   epub_publisherepub_copyrightepub_identifierr;   apps    r   validate_config_valuesr      sw   
{{6! ::##r : ; 	< ""3::#6#67rNOP::  r : ; 	< ::!!rRST::&&rWXY::&&rWXY::$$rUVW::$$r : ; 	< ::%%rVWX::rNOP r   c                   g }|j                   D ]?  }t        |t              r|j                  |i f       '	 |\  }}|j                  ||f       A ||_         y# t        $ r" t
        j                  t        d      |       Y tw xY w)z?This converts string styled epub_css_files to tuple styled one.zinvalid css_file: %r, ignoredN)epub_css_files
isinstancer   rb   	Exceptionr|   r   r   )r   r=   r   entryfilenameattrss         r   convert_epub_css_filesr      s    79N&& 	eS!!!5"+."'%%%x&78	 +F	  r"ABEJs   A(BBc           	        | j                  t               | j                  dd d       | j                  ddd       | j                  ddd       | j                  di d       | j                  d	d
 d       | j                  dd d       | j                  dd d       | j                  dd d       | j                  dd d       | j                  ddd       | j                  ddd       | j                  ddd       | j                  ddd       | j                  ddd       | j                  dg d       | j                  dg d       | j                  dd d       | j                  dg d       | j                  d d!d       | j                  d"d#d       | j                  d$d%d       | j                  d&dd       | j                  d'd(d       | j                  d)d*d       | j                  d+d, d       | j                  d-dd       | j                  d.dd       | j                  d/d0dt        d0d1             | j	                  d2t
        d34       | j	                  d5t               d6d#d#d7S )8Nepub_basenamec                ,    t        | j                        S N)r   projectr1   s    r   <lambda>zsetup.<locals>.<lambda>  s    }T\\7R r   Fr<   g      @r&   
epub_themeepub_theme_optionsr   c                    | j                   S r   )r   r1   s    r   r   zsetup.<locals>.<lambda>  s
    DLL r   r   c                    | j                   S r   authorr1   s    r   r   zsetup.<locals>.<lambda>  s
    T[[ r   ru   c                "    | j                   xs dS )Nen)languager1   s    r   r   zsetup.<locals>.<lambda>  s    t}}7L r   r   c                    | j                   S r   r   r1   s    r   r   zsetup.<locals>.<lambda>  s
     r   r   c                    | j                   S r   )	copyrightr1   s    r   r   zsetup.<locals>.<lambda>  s
     r   r   unknownepub_schemer   r   
epub_coverr   
epub_guideepub_pre_filesepub_post_filesr   c                    | j                   S r   )html_css_files)r=   s    r   r   zsetup.<locals>.<lambda>  s    &:O:O r   epub_exclude_filesre      epub_tocdupTr~   ry   epub_fix_imagesepub_max_image_widthr   epub_show_urlsinlineepub_use_indexc                    | j                   S r   )html_use_indexr1   s    r   r   zsetup.<locals>.<lambda>  s    8K8K r   rH   rI   r>   r!   r"   zconfig-initedi   )priorityzbuilder-initedbuiltin)r;   parallel_read_safeparallel_write_safe)add_builderr%   add_config_valuer
   connectr   r   r   s    r   setupr     sg   OOL! *RTYZf5vv6-r6:'@&I(@&I*LfU)+CVL)+FO*Iv>	6:Y6r51r51)2u5*B6)+OQWX-r59!U3e4)U;*E59/E:)8V<)+KVT+Y?+Y?,lFlJ79 KK!7#KFKK "89 "# r   )r   r   r   r   )r   r   r=   r   r   r   )r   r   r   r   )/r   
__future__r   rF   r?   rerA   r   typingr   r   r   sphinxr   sphinx.buildersr	   sphinx.configr
   r   sphinx.localer   sphinx.utilr   sphinx.util.fileutilr   sphinx.util.osutilr   sphinx.applicationr   	getLoggerr   r|   r   rJ   rL   rY   r   r   _xml_name_start_char_xml_name_charcompiler   EpubBuilderr%   r   r   r   r   r   r   <module>r      s  
 #  	 	   1 1  & &   0 ,)			8	$z   
  
 ! 
  1 	/  SS  BJJ#7"8>:J"MN B+:)) B+J$QN+"*r   