B
    .ÛKc=*  ã               @   s<  d Z ddlZddlmZ ddlmZmZmZmZm	Z	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!G dd„ deƒZ"dddœZ#dddœZ$dddœZ%dZ&dZ'G dd„ dej(ƒZ)eddœdd„Z*eeddœd d!„Z+eee,ef dœd"d#„Z-dS )$z5Build epub3 files.

Originally derived from epub.py.
é    N)Úpath)ÚAnyÚDictÚListÚ
NamedTupleÚSetÚTuple)Úpackage_dir)ÚSphinx)Ú
_epub_base)ÚENUMÚConfig)Ú__)ÚloggingÚxmlname_checker)Úcopy_asset_file)Úformat_date)Úmake_filenamec               @   s*   e Zd ZU eed< eed< ee ed< dS )ÚNavPointÚtextÚrefuriÚchildrenN)Ú__name__Ú
__module__Ú__qualname__ÚstrÚ__annotations__r   r   © r   r   ú4lib/python3.7/site-packages/sphinx/builders/epub3.pyr      s   
r   Z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	œd
d„Zeeef d	œ‡ fdd„Zee ddœ‡ fdd„Zeeeef  ee dœdd„Zee eeef dœdd„Zdd	œ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epub3TN)Úreturnc             C   s<   |   ¡  |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  dS )z/Create the metainfo files and finally the epub.N)Zget_tocZbuild_mimetypeZbuild_containerZbuild_contentÚbuild_navigation_docZ	build_tocZ
build_epub)Úselfr   r   r   Úhandle_finishF   s    zEpub3Builder.handle_finishc                sŠ   | j j}tƒ  ¡ }t | j j¡|d< t | j j¡|d< t 	|¡|d< t
 	|¡|d< t tddd¡|d< t | j j¡|d	< | j j|d
< |S )zaCreate a dictionary with all metadata for the content.opf
        file properly escaped.
        ÚdescriptionZcontributorZpage_progression_directionZibook_scroll_axisz%Y-%m-%dT%H:%M:%SZÚen)ÚlanguageZdateÚversionÚepub_version)ÚconfigÚepub_writing_modeÚsuperÚcontent_metadataÚhtmlÚescapeÚepub_descriptionÚepub_contributorÚPAGE_PROGRESSION_DIRECTIONSÚgetÚIBOOK_SCROLL_AXISr   r*   r+   )r%   Úwriting_modeÚmetadata)Ú	__class__r   r   r/   P   s    
zEpub3Builder.content_metadata)Údocnamesr#   c                sJ   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)	r.   Úprepare_writingr,   r-   ÚTHEME_WRITING_MODESr5   Zglobalcontextr;   r<   )r%   r:   r7   )r9   r   r   r=   `   s    zEpub3Builder.prepare_writing)Únavnodesr#   c             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%   r?   ZnavstackrB   ZnodeÚfileZnavpointr   r   r   Úbuild_navlisti   s8    

zEpub3Builder.build_navlist)Únavlistr#   c             C   s6   i }t  | jj¡|d< t  | jd ¡|d< ||d< |S )z_Create a dictionary with all metadata for the nav.xhtml file
        properly escaped.
        ÚlangZtocZ
toc_localerM   )r0   r1   r,   Úepub_languageZguide_titles)r%   rM   r8   r   r   r   Únavigation_doc_metadata“   s
    z$Epub3Builder.navigation_doc_metadatac             C   s’   t  tdƒ¡ | jjdkrJ| jj| jj| ddd}|  |g ¡}|  	|¡ n| j
}|  |¡}tt | jd¡| j|  |¡ƒ d| jkrŽ| j d¡ dS )z"Write the metainfo file nav.xhtml.zwriting nav.xhtml file...ÚdefaultF)Zprune_toctreesZincludehiddenznav.xhtml_tz	nav.xhtmlN)ÚloggerÚinfor   r,   Úepub_tocscopeÚenvZget_and_resolve_doctreeZroot_docZget_refnodesZtoc_add_filesÚrefnodesrL   r   r   ÚjoinÚtemplate_dirZoutdirrP   ÚfilesrE   )r%   ZdoctreerV   rM   r   r   r   r$      s    


z!Epub3Builder.build_navigation_doc)r   r   r   Ú__doc__Únamer   ÚepilogZsupported_remote_imagesr   rW   r	   rX   ÚDOCTYPEZdoctypeÚHTML_TAGr;   r<   r&   r   r   r   r/   r   r=   r   r   rL   rP   r$   Ú__classcell__r   r   )r9   r   r!   4   s   
	 *
r!   )Úappr#   c             C   sø   | j jdkrd S | jjs&t tdƒ¡ tƒ  | jj	¡sDt tdƒ¡ | jj
sZt tdƒ¡ | jjspt tdƒ¡ | jjs†t tdƒ¡ | jjsœt tdƒ¡ | jjs²t tdƒ¡ | jjsÈt td	ƒ¡ | jjsÞt td
ƒ¡ | jjsôt tdƒ¡ d S )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)Zbuilderr[   r,   rO   rR   Úwarningr   r   ÚmatchÚepub_uidÚ
epub_titleÚepub_authorr3   r2   Úepub_publisherÚepub_copyrightÚepub_identifierr*   )r`   r   r   r   Úvalidate_config_values³   s,    ri   )r`   r,   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   rE   Ú	ExceptionrR   ra   r   )r`   r,   rj   ÚentryÚfilenameZattrsr   r   r   Úconvert_epub_css_filesÚ   s    
ro   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¡ |  d/dd¡ |  d0d1dtd1d2ƒ¡ | jd3td4d5 |  d6t¡ d7d$d$d8œS )9NZepub_basenamec             S   s
   t | jƒS )N)r   Úproject)r%   r   r   r   Ú<lambda>ï   ó    zsetup.<locals>.<lambda>Fr+   g      @r"   Z
epub_themeZepub_theme_optionsrd   c             S   s   | j S )N)rp   )r%   r   r   r   rq   ó   rr   re   c             S   s   | j S )N)Úauthor)r%   r   r   r   rq   ô   rr   rO   c             S   s
   | j pdS )Nr(   )r)   )r%   r   r   r   rq   õ   rr   rf   c             S   s   | j S )N)rs   )r%   r   r   r   rq   ö   rr   rg   c             S   s   | j S )N)Ú	copyright)r%   r   r   r   rq   ÷   rr   rh   ÚunknownZepub_schemerc   rU   Z
epub_coverr   Z
epub_guideZepub_pre_filesZepub_post_filesrj   c             S   s   | j S )N)Zhtml_css_files)r,   r   r   r   rq   ÿ   rr   Zepub_exclude_filesrG   é   Zepub_tocdupTrT   rQ   Zepub_fix_imagesZ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   rq     rr   r2   r3   r-   r   r    zconfig-initedi   )Úpriorityzbuilder-initedZbuiltin)r*   Zparallel_read_safeZparallel_write_safe)Zadd_builderr!   Zadd_config_valuer   Zconnectro   ri   )r`   r   r   r   Úsetupë   sF    

rx   ).rZ   r0   Úosr   Útypingr   r   r   r   r   r   Zsphinxr	   Zsphinx.applicationr
   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	getLoggerr   rR   r   r4   r6   r>   r]   r^   ZEpubBuilderr!   ri   ro   r   rx   r   r   r   r   Ú<module>   s4    
	'