B
    öÀ„\n-  ã               @   sö   d Z ddlmZ ddlmZ ddl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mZ dd
lmZ ddlmZ ddlmZ e e¡ZeddddgƒZdddœZdddœZdddœZdZ dZ!G dd„ de
j"ƒZ#dd„ Z$dd „ Z%d!S )"zä
    sphinx.builders.epub3
    ~~~~~~~~~~~~~~~~~~~~~

    Build epub3 files.
    Originally derived from epub.py.

    :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS.
    :license: BSD, see LICENSE for details.
é    )Ú
namedtuple)Úpath)Ústring_types)Úpackage_dir)Ú
_epub_base)Ústring_classesÚENUM)Ú__)ÚloggingÚxmlname_checker)Úcopy_asset_file)Úformat_date)Úmake_filenameÚNavPointÚtextÚrefuriÚchildrenZltrZ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">c                   s~   e Zd ZdZdZedƒZdZe 	e
dd¡ZeZeZdZdd	„ Zd
d„ Z‡ fdd„Z‡ fdd„Zdd„ Zdd„ Zdd„ Z‡  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.FZ	templatesZepub3Tc             C   sp   |   ¡  |  ¡  |  | jd¡ |  | jd¡ |  | jd¡ |  | jd¡ |  | jd¡ |  | j| j	j
d ¡ dS )z/Create the metainfo files and finally the epub.ZmimetypezMETA-INF/container.xmlzcontent.opfz	nav.xhtmlztoc.ncxz.epubN)Úvalidate_config_valueZget_tocZbuild_mimetypeÚoutdirZbuild_containerZbuild_contentÚbuild_navigation_docZ	build_tocZ
build_epubÚconfigÚepub_basename)Úself© r   ú4lib/python3.7/site-packages/sphinx/builders/epub3.pyÚhandle_finishO   s    zEpub3Builder.handle_finishc             C   sü   | j jjst tdƒ¡ tƒ  | j jj¡s8t tdƒ¡ | j jj	sPt tdƒ¡ | j jj
sht tdƒ¡ | j jjs€t tdƒ¡ | j jjs˜t tdƒ¡ | j jjs°t tdƒ¡ | j jjsÈt tdƒ¡ | j jjsàt td	ƒ¡ | j jjsøt td
ƒ¡ d S )NzHconf 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)Úappr   Úepub_languageÚloggerÚwarningr	   r   ÚmatchÚepub_uidÚ
epub_titleÚepub_authorÚepub_contributorÚepub_descriptionÚepub_publisherÚepub_copyrightÚepub_identifierÚversion)r   r   r   r   r   [   s(    








z"Epub3Builder.validate_config_valuec                sŠ   | j j}tt| ƒ ¡ }|  | j j¡|d< |  | j j¡|d< t 	|¡|d< t
 	|¡|d< |  tdƒ¡|d< |  | j j¡|d< | j j|d< |S )	zaCreate a dictionary with all metadata for the content.opf
        file properly escaped.
        ZdescriptionZcontributorZpage_progression_directionZibook_scroll_axisz%Y-%m-%dT%H:%M:%SZZdater-   Úepub_version)r   Úepub_writing_modeÚsuperr   Úcontent_metadataÚescr)   r(   ÚPAGE_PROGRESSION_DIRECTIONSÚgetÚIBOOK_SCROLL_AXISr   r-   r.   )r   Úwriting_modeÚmetadata)Ú	__class__r   r   r1      s    zEpub3Builder.content_metadatac                sN   t t| ƒ |¡ | jj}t |¡| jd< | j| jd< | j	| jd< d| jd< d S )NZtheme_writing_modeÚhtml_tagÚuse_meta_charsetTZskip_ua_compatible)
r0   r   Úprepare_writingr   r/   ÚTHEME_WRITING_MODESr4   Zglobalcontextr9   r:   )r   Zdocnamesr6   )r8   r   r   r;      s    zEpub3Builder.prepare_writingc             C   sB  g }|  tddg ƒ¡ d}x|D ]}|d s2q"|d  d¡d }|| jkrPq"|d | jjkrbq"t|d |d g ƒ}|d |kr¦| ¡  |d j  |¡ |  |¡ q"|d |d krÚ|d7 }|d j  |¡ |  |¡ q"|d |k r,x|d t|ƒk r| ¡  qêW |d }|d j  |¡ |  |¡ q"t	d	ƒ‚q"W |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   ÚsplitZignored_filesr   Úepub_tocdepthÚpopr   ÚlenÚRuntimeError)r   ZnavnodesZnavstackr?   ZnodeÚfileZnavpointr   r   r   Úbuild_navlistš   s8    
zEpub3Builder.build_navlistc             C   s6   i }|   | jj¡|d< |   | jd ¡|d< ||d< |S )z_Create a dictionary with all metadata for the nav.xhtml file
        properly escaped.
        ZlangZtocZ
toc_localeÚnavlist)r2   r   r!   Zguide_titles)r   rJ   r7   r   r   r   Únavigation_doc_metadataÅ   s
    z$Epub3Builder.navigation_doc_metadatac             C   sš   t  tdƒ|¡ | jjdkrL| jj| jj| ddd}|  |g ¡}|  	|¡ n| j
}|  |¡}tt | jd¡t ||¡|  |¡ƒ || jkr–| j |¡ dS )z"Write the metainfo file nav.xhtml.zwriting %s file...ÚdefaultF)Zprune_toctreesZincludehiddenznav.xhtml_tN)r"   Úinfor	   r   Úepub_tocscopeÚenvZget_and_resolve_doctreeZ
master_docZget_refnodesZtoc_add_filesÚrefnodesrI   r   r   ÚjoinÚtemplate_dirrK   ÚfilesrB   )r   r   ZoutnameZdoctreerP   rJ   r   r   r   r   Ð   s    



z!Epub3Builder.build_navigation_doc)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Únamer	   ZepilogZsupported_remote_imagesr   rQ   r   rR   ÚDOCTYPEZdoctypeÚHTML_TAGr9   r:   r   r   r1   r;   rI   rK   r   Ú__classcell__r   r   )r8   r   r   =   s   $
+r   c          	   C   sz   g }xj|j D ]`}t|tƒr*| |i f¡ qy|\}}| ||f¡ W q tk
rj   t tdƒ|¡ wY qX qW ||_ dS )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ÚfilenameZattrsr   r   r   Úconvert_epub_css_filesè   s    
ra   c             C   sÖ  |   t¡ |  ddd„ d ¡ |  ddd¡ |  ddd¡ |  di d¡ |  d	d
d„ d¡ |  ddd„ d¡ |  ddd„ d¡ |  ddd„ d¡ |  ddd„ d¡ |  ddd¡ |  ddd¡ |  ddd¡ |  ddd¡ |  ddd¡ |  dg d¡ |  dg d¡ |  ddd„ d¡ |  dg d¡ |  d d!d¡ |  d"d#d¡ |  d$d%d¡ |  d&d'd¡ |  d(d)d¡ |  d*d+d¡ |  d,d-d„ d¡ |  d.ddt¡ |  d/ddt¡ |  d0d1dtd1d2ƒ¡ |  d3t¡ d4d#d#d5œS )6Nr   c             S   s
   t | jƒS )N)r   Zproject)r   r   r   r   Ú<lambda>ÿ   s    zsetup.<locals>.<lambda>r.   g      @r   Z
epub_themeZepub_theme_optionsr&   c             S   s   | j S )N)Z
html_title)r   r   r   r   rb     s    r'   c             S   s   | j S )N)Úauthor)r   r   r   r   rb     s    r!   c             S   s
   | j pdS )NZen)Zlanguage)r   r   r   r   rb     s    r*   c             S   s   | j S )N)rc   )r   r   r   r   rb     s    r+   c             S   s   | j S )N)Ú	copyright)r   r   r   r   rb     s    r,   ÚunknownZepub_schemer%   rO   Z
epub_coverr   Z
epub_guideZepub_pre_filesZepub_post_filesr\   c             S   s   | j S )N)Zhtml_css_files)r   r   r   r   rb     s    Zepub_exclude_filesrD   é   Zepub_tocdupTrN   rL   Zepub_fix_imagesFZepub_max_image_widthr   Zepub_show_urlsZinlineZepub_use_indexc             S   s   | j S )N)Zhtml_use_index)r   r   r   r   rb     s    r)   r(   r/   r   r   zconfig-initedZbuiltin)r-   Zparallel_read_safeZparallel_write_safe)Zadd_builderr   Zadd_config_valuer   r   Zconnectra   )r    r   r   r   Úsetupú   sD    

rg   N)&rW   Úcollectionsr   Úosr   Zsixr   Zsphinxr   Zsphinx.buildersr   Zsphinx.configr   r   Zsphinx.localer	   Zsphinx.utilr
   r   Zsphinx.util.fileutilr   Zsphinx.util.i18nr   Zsphinx.util.osutilr   Z	getLoggerrT   r"   r   r3   r5   r<   rY   rZ   ZEpubBuilderr   ra   rg   r   r   r   r   Ú<module>   s2   	
 ,