B
    öÀ„\ª ã               @   sB  d Z ddlZddl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
 ddl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 ddlmZ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( ddl)m*Z*m+Z+ ddl,m-Z- ddl.m/Z/ ddl0m1Z1 ddl2m3Z3m4Z4 ddl5m6Z6 ddl7m8Z8m9Z9 ddl:m;Z; ddl<m=Z= ddl>m?Z?m@Z@mAZA ddlBmCZCmDZD ddlEmFZFmGZG ddlHmIZI ddlJmKZK ddlLmMZM dd lNmOZOmPZPmQZQ dd!lRmSZS dd"lTmUZUmVZVmWZWmXZXmYZYmZZZ dd#l[m\Z\ dd$l]m^Z^m_Z_ eFƒ r:dd%l`maZa d&Zbnd'Zbd(Zcd)Zde@ eef¡Zge hd*¡Zid+d,„ ZjG d-d.„ d.ekƒZlG d/d0„ d0eƒZmG d1d2„ d2ekƒZnG d3d4„ d4eƒZoG d5d6„ d6epƒZqG d7d8„ d8e&ƒZrG d9d:„ d:erƒZsG d;d<„ d<erƒZtG d=d>„ d>erƒZuG d?d@„ d@euƒZvevZwG dAdB„ dBeuƒZxdCdD„ ZydEdF„ ZzdGdH„ Z{dIdJ„ Z|dKdL„ Z}dS )MzÁ
    sphinx.builders.html
    ~~~~~~~~~~~~~~~~~~~~

    Several HTML builders.

    :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS.
    :license: BSD, see LICENSE for details.
é    N)Úmd5)Úpath)Únodes)Ú	Publisher)ÚOptionParser)ÚDocTreeInputÚStringOutput)ÚReader)Úrelative_path)Ú	iteritemsÚ	text_typeÚstring_types)ÚcPickle)Úpackage_dirÚ__display_version__)ÚENV_PICKLE_FILENAME)ÚBuilder)Ústring_classes)ÚRemovedInSphinx20WarningÚRemovedInSphinx30Warning)ÚImageAdapter)ÚIndexEntries)ÚTocTree)ÚConfigErrorÚ
ThemeError)ÚPygmentsBridge)Ú_Ú__)Újs_index)ÚHTMLThemeFactory)ÚjsonimplÚloggingÚstatus_iterator)ÚboldÚ	darkgreen)Úis_html5_writer_availableÚnew_document)Ú
copy_asset)Úformat_date)ÚInventoryFile)ÚpatmatchÚMatcherÚDOTFILES)Úinline_all_toctrees)ÚSEPÚos_pathÚrelative_uriÚ	ensuredirÚmovefileÚcopyfile)Ú
htmlescape)Ú
HTMLWriterÚHTMLTranslator)ÚHTML5TranslatorTFzobjects.invZ
last_buildz[
]+c             C   sP   t | tƒrtt|  ¡ ƒƒS t | ttfƒr:tdd„ | D ƒƒ} tt| ƒ 	d¡ƒ 
¡ S )zß
    Return a stable hash for a Python data structure.  We can't just use
    the md5 of str(obj) since for example dictionary items are enumerated
    in unpredictable order due to hash randomization in newer Pythons.
    c             s   s   | ]}t |ƒV  qd S )N)Úget_stable_hash)Ú.0Úo© r;   ú3lib/python3.7/site-packages/sphinx/builders/html.pyú	<genexpr>[   s    z"get_stable_hash.<locals>.<genexpr>Úutf8)Ú
isinstanceÚdictr8   ÚlistÚitemsÚtupleÚsortedr   r   ÚencodeZ	hexdigest)Úobjr;   r;   r<   r8   Q   s
    
r8   c                   sD   e Zd ZdZ‡ fdd„Z‡ fdd„Zdd„ Zdd	„ Zd
d„ Z‡  Z	S )ÚCSSContainerz—The container for stylesheets.

    To support the extensions which access the container directly, this wraps
    the entry with Stylesheet class.
    c                s4   t |tƒrtt| ƒ |¡ ntt| ƒ t|ƒ¡ d S )N)r?   Ú
StylesheetÚsuperrG   Úappend)ÚselfrF   )Ú	__class__r;   r<   rJ   e   s    
zCSSContainer.appendc                sH   t jdtdd t|tƒr.tt| ƒ ||¡ ntt| ƒ |t|ƒ¡ d S )NzIbuilder.css_files is deprecated. Please use app.add_stylesheet() instead.é   )Ú
stacklevel)ÚwarningsÚwarnr   r?   rH   rI   rG   Úinsert)rK   ÚindexrF   )rL   r;   r<   rQ   l   s
    

zCSSContainer.insertc             C   s,   t jdtdd x|D ]}|  |¡ qW d S )NzIbuilder.css_files is deprecated. Please use app.add_stylesheet() instead.rM   )rN   )rO   rP   r   rJ   )rK   ÚotherÚitemr;   r;   r<   Úextendv   s    

zCSSContainer.extendc             C   s,   t jdtdd x|D ]}|  |¡ qW | S )NzIbuilder.css_files is deprecated. Please use app.add_stylesheet() instead.rM   )rN   )rO   rP   r   rJ   )rK   rS   rT   r;   r;   r<   Ú__iadd__~   s
    

zCSSContainer.__iadd__c             C   s   t | ƒ}||7 }|S )N)rG   )rK   rS   Úretr;   r;   r<   Ú__add__‡   s    zCSSContainer.__add__)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__rJ   rQ   rU   rV   rX   Ú__classcell__r;   r;   )rL   r<   rG   _   s   
	rG   c               @   s    e Zd ZdZdZdZdd„ ZdS )rH   z‡A metadata of stylesheet.

    To keep compatibility with old themes, an instance of stylesheet behaves as
    its filename (str).
    Nc             O   sX   t  | |¡}||_||_|j dd¡ |j dd¡ |rT|d |jd< |d |jd< |S )NZrelÚ
stylesheetÚtypeztext/cssr   é   Útitle)r   Ú__new__ÚfilenameÚ
attributesÚ
setdefault)Úclsrc   Úargsrd   rK   r;   r;   r<   rb   ˜   s    zStylesheet.__new__)rY   rZ   r[   r\   rd   rc   rb   r;   r;   r;   r<   rH   Ž   s   rH   c                   s8   e Zd ZdZ‡ fdd„Zdd„ Zdd„ Zdd	„ Z‡  ZS )
ÚJSContainerz%The container for JavaScript scripts.c                s&   t jdtdd tt| ƒ ||¡ d S )NzIbuilder.script_files is deprecated. Please use app.add_js_file() instead.rM   )rN   )rO   rP   r   rI   rh   rQ   )rK   rR   rF   )rL   r;   r<   rQ   ¨   s    
zJSContainer.insertc             C   s,   t jdtdd x|D ]}|  |¡ qW d S )NzIbuilder.script_files is deprecated. Please use app.add_js_file() instead.rM   )rN   )rO   rP   r   rJ   )rK   rS   rT   r;   r;   r<   rU   ¯   s    

zJSContainer.extendc             C   s,   t jdtdd x|D ]}|  |¡ qW | S )NzIbuilder.script_files is deprecated. Please use app.add_js_file() instead.rM   )rN   )rO   rP   r   rJ   )rK   rS   rT   r;   r;   r<   rV   ·   s
    

zJSContainer.__iadd__c             C   s   t | ƒ}||7 }|S )N)rh   )rK   rS   rW   r;   r;   r<   rX   À   s    zJSContainer.__add__)	rY   rZ   r[   r\   rQ   rU   rV   rX   r]   r;   r;   )rL   r<   rh   ¦   s
   	rh   c               @   s    e Zd ZdZdZdZdd„ ZdS )Ú
JavaScriptzŒA metadata of javascript file.

    To keep compatibility with old themes, an instance of javascript behaves as
    its filename (str).
    Nc             K   s*   t  | |¡}||_||_|j dd¡ |S )Nr_   ztext/javascript)r   rb   rc   rd   re   )rf   rc   rd   rK   r;   r;   r<   rb   Ñ   s
    zJavaScript.__new__)rY   rZ   r[   r\   rd   rc   rb   r;   r;   r;   r<   ri   Ç   s   ri   c               @   sD   e Zd ZdZedd„ ƒZddg fdd„Zdd„ Zd	d
„ Zdd„ Z	dS )Ú	BuildInfozŸbuildinfo file manipulator.

    HTMLBuilder and its family are storing their own envdata to ``.buildinfo``.
    This class is a manipulator for the file.
    c          
   C   s®   yv|  ¡ }|d  ¡ dkst‚|d  d¡s0t‚|d  d¡sBt‚tƒ }|d  ¡ d  ¡ |_|d  ¡ d  ¡ |_|S  t	k
r¨ } zt
tdƒ| ƒ‚W d d }~X Y nX d S )	Nr   z# Sphinx build info version 1rM   zconfig: é   ztags: r`   zbuild info file is broken: %r)Ú	readlinesÚrstripÚAssertionErrorÚ
startswithrj   ÚsplitÚstripÚconfig_hashÚ	tags_hashÚ	ExceptionÚ
ValueErrorr   )rf   ÚfÚlinesÚ
build_infoÚexcr;   r;   r<   Úloadâ   s    zBuildInfo.loadNc             C   sH   d| _ d| _|r2tdd„ | |¡D ƒƒ}t|ƒ| _ |rDtt|ƒƒ| _d S )NÚ c             s   s   | ]}|j |jfV  qd S )N)ÚnameÚvalue)r9   Úcr;   r;   r<   r=   ø   s    z%BuildInfo.__init__.<locals>.<genexpr>)rr   rs   r@   Úfilterr8   rD   )rK   ÚconfigÚtagsZconfig_categoriesÚvaluesr;   r;   r<   Ú__init__ò   s    
zBuildInfo.__init__c             C   s   | j |j ko| j|jkS )N)rr   rs   )rK   rS   r;   r;   r<   Ú__eq__þ   s    zBuildInfo.__eq__c             C   s
   | |k S )Nr;   )rK   rS   r;   r;   r<   Ú__ne__  s    zBuildInfo.__ne__c             C   s   |  d| j| jf ¡ d S )Nzª# Sphinx build info version 1
# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done.
config: %s
tags: %s
)Úwriterr   rs   )rK   rv   r;   r;   r<   Údump  s    zBuildInfo.dump)
rY   rZ   r[   r\   Úclassmethodrz   rƒ   r„   r…   r‡   r;   r;   r;   r<   rj   Û   s   rj   c                   sê  e Zd ZdZdZdZedƒZdZdZ	dZ
dZeZdZdZdddd	gZdZdZd
ZdZdZdZdZdZdZdZdZg ZdZ‡ fdd„Zdd„ Zdd„ Z dd„ Z!dd„ Z"dd„ Z#dd„ Z$dd„ Z%dd„ Z&dd „ Z'd!d"„ Z(e)d#d$„ ƒZ*e)d%d&„ ƒZ+d'd(„ Z,d)d*„ Z-d+d,„ Z.d-d.„ Z/d/d0„ Z0d1d2„ Z1d3d4„ Z2d5d6„ Z3d7d8„ Z4d9d:„ Z5d;d<„ Z6d=d>„ Z7d?d@„ Z8dAdB„ Z9dCdD„ Z:dEdF„ Z;dGdH„ Z<dIdJ„ Z=dKdL„ Z>dMdN„ Z?dOdP„ Z@dddQdR„ZAdSdT„ ZBdUdV„ ZCdedWdX„ZDdfdZd[„ZEd\d]„ ZFd^d_„ ZGd`da„ ZHdbdc„ ZI‡  ZJS )gÚStandaloneHTMLBuilderz&
    Builds standalone HTML docs.
    Úhtmlz!The HTML pages are in %(outdir)s.Tz.htmlzimage/svg+xmlz	image/pngz	image/gifz
image/jpegzsearchindex.jsFNc                s$   t t| ƒ |¡ tƒ | _tƒ | _d S )N)rI   r‰   rƒ   rG   Ú	css_filesrh   Úscript_files)rK   Úapp)rL   r;   r<   rƒ   5  s    zStandaloneHTMLBuilder.__init__c             C   s¢   |   ¡ | _d| _i | _d | _|  ¡  |  ¡  |  ¡  |  ¡  | j	j
d k	rR| j	j
| _| j	jd k	rj| j	j| _n| j| _|  dd¡| _| j	jržtsž| j dtj ¡ d S )NÚ_imagesÚ	use_indexrŠ   zuhtml_experimental_html5_writer is set, but current version is old. Docutils' version should be 0.13 or newer, but %s.)Úcreate_build_inforx   ÚimagedirÚ
secnumbersÚcurrent_docnameÚinit_templatesÚinit_highlighterÚinit_css_filesÚinit_js_filesr€   Úhtml_file_suffixÚ
out_suffixÚhtml_link_suffixÚlink_suffixÚget_builder_configr   Úhtml_experimental_html5_writerÚhtml5_readyr   rP   ÚdocutilsÚ__version__)rK   r;   r;   r<   Úinit?  s"    

zStandaloneHTMLBuilder.initc             C   s   t | j| jdgƒS )NrŠ   )rj   r€   r   )rK   r;   r;   r<   r   \  s    z'StandaloneHTMLBuilder.create_build_infoc                sb   ‡ fdd„ˆ j jD ƒt tdˆ j jdd¡t tjdˆ j jd¡g }x|D ]}t |¡rH|S qHW d S )Nc                s    g | ]}t  |ˆ jjd d¡‘qS )ÚLC_MESSAGESz	sphinx.js)r   Újoinr€   Úlanguage)r9   Údir)rK   r;   r<   ú
<listcomp>b  s   z>StandaloneHTMLBuilder._get_translations_js.<locals>.<listcomp>Zlocaler¢   z	sphinx.jszshare/sphinx/locale)	r€   Zlocale_dirsr   r£   r   r¤   ÚsysÚprefixÚisfile)rK   Z
candidatesÚjsfiler;   )rK   r<   Ú_get_translations_js`  s    




z*StandaloneHTMLBuilder._get_translations_jsc             C   s   | j j| j jfS )N)r€   Ú
html_themeÚhtml_theme_options)rK   r;   r;   r<   Úget_theme_configo  s    z&StandaloneHTMLBuilder.get_theme_configc             C   sH   t | jƒ}|  ¡ \}}| |¡| _| ¡ | _|  ¡  | j 	| | j¡ d S )N)
r   r   r®   ZcreateÚthemeÚcopyÚtheme_optionsZcreate_template_bridgeÚ	templatesr¡   )rK   Ztheme_factoryZ	themenameZthemeoptionsr;   r;   r<   r”   s  s    

z$StandaloneHTMLBuilder.init_templatesc             C   sB   | j jd k	r| j j}n| jr.| j ddd¡}nd}td|ƒ| _d S )Nr¯   Úpygments_styleZnoneÚsphinxrŠ   )r€   r³   r¯   Ú
get_configr   Úhighlighter)rK   Ústyler;   r;   r<   r•   |  s    
z&StandaloneHTMLBuilder.init_highlighterc             C   sR   x$| j jjD ]\}}| j|f|Ž qW x&|  dd¡D ]\}}| j|f|Ž q4W d S )Nr‹   rŠ   )r   Úregistryr‹   Úadd_css_filerœ   )rK   rc   Úattrsr;   r;   r<   r–   ‡  s    z$StandaloneHTMLBuilder.init_css_filesc             K   s,   d|krt  d|¡}| j t|f|Ž¡ d S )Nz://Ú_static)Ú	posixpathr£   r‹   rJ   rH   )rK   rc   Úkwargsr;   r;   r<   r¹     s    z"StandaloneHTMLBuilder.add_css_filec             C   s”   |   d¡ |   d¡ |   d¡ |   d¡ x$| jjjD ]\}}| j |f|Ž q4W x&|  dd¡D ]\}}| j |f|Ž q\W | jjr|  ¡ r|   d¡ d S )Nz	jquery.jszunderscore.jszdoctools.jszlanguage_data.jsÚjs_filesrŠ   ztranslations.js)Úadd_js_filer   r¸   r¾   rœ   r€   r¤   r«   )rK   rc   rº   r;   r;   r<   r—   –  s    



z#StandaloneHTMLBuilder.init_js_filesc             K   s0   |rd|krt  d|¡}| j t|f|Ž¡ d S )Nz://r»   )r¼   r£   rŒ   rJ   ri   )rK   rc   r½   r;   r;   r<   r¿   ¦  s    z!StandaloneHTMLBuilder.add_js_filec             C   s*   | j j}|d kr| j}|r"tr"tS tS d S )N)r€   r   Údefault_html5_translatorrž   r7   r6   )rK   Zuse_html5_writerr;   r;   r<   Údefault_translator_class­  s    z.StandaloneHTMLBuilder.default_translator_classc             C   s`   |   dd¡}|d k	r|S t| jjjƒ}t|ƒdkr:|d S t|ƒdkrX| d¡ |d S d S d S )NZmath_rendererrŠ   r`   r   rM   Zmathjax)rœ   rA   r   r¸   Úhtml_inline_math_renderersÚlenÚremove)rK   r|   Z	renderersr;   r;   r<   Úmath_renderer_name¹  s    
z(StandaloneHTMLBuilder.math_renderer_namec       	   
   c   sP  yRt t | jd¡ƒ}t |¡}W d Q R X | j|krPx| jjD ]
}|V  q>W d S W nD t	k
r„ } zt
 tdƒ|¡ W d d }~X Y n tk
r–   Y nX | jrª| j ¡ }nd}xœ| jjD ]}|| jjkrÐ|V  q¸|  |¡}yt |¡}W n tk
r   d}Y nX y,tt | j |¡¡|ƒ}||kr.|V  W q¸ tk
rF   Y q¸X q¸W d S )Nz
.buildinfoz"Failed to read build info file: %rr   )Úopenr   r£   Úoutdirrj   rz   rx   ÚenvZ
found_docsru   ÚloggerÚwarningr   ÚIOErrorr²   Znewest_template_mtimeÚall_docsÚget_outfilenameÚgetmtimert   ÚmaxÚdoc2pathÚEnvironmentError)	rK   ÚfpZ	buildinfoÚdocnamery   Ztemplate_mtimeZ
targetnameZtargetmtimeZsrcmtimer;   r;   r<   Úget_outdated_docsÎ  s<    

 



z'StandaloneHTMLBuilder.get_outdated_docsc             C   s   | j j| j j S )N)r€   Úhtml_extra_pathÚhtml_static_path)rK   r;   r;   r<   Úget_asset_pathsô  s    z%StandaloneHTMLBuilder.get_asset_pathsc             C   sœ   |dkrddiS t dƒ}| |¡ | jdkrJtttd| _| j ddd¡ | j}tƒ |_t	| ƒ|_
| dd	d
id¡ | |d¡ | dd¡ | ¡  |j
jS )z$Utility: Render a lone doctree node.NÚfragmentr{   s   <partial node>)Zsource_classZdestination_classZ
standaloneZrestructuredtextZ	pseudoxmlZoutput_encodingZunicode)r&   rJ   Ú
_publisherr   r   r   Zset_componentsÚDoctreeReaderÚreaderr5   ÚwriterZprocess_programmatic_settingsZ
set_sourceZset_destinationZpublishÚparts)rK   ÚnodeÚdocZpubr;   r;   r<   Úrender_partialø  s&    



z$StandaloneHTMLBuilder.render_partialc             C   s$  d | _ | jrTddlm} | jjp&| jj}|s0d}|| j|| jj| jj	ƒ| _ |  
|¡ t| ƒ| _t| jj| jfdd ¡ | _t| jjƒ| j_g | _| jj}|r x€t| jjƒD ]p}d }| jj| }xZ|jD ]P}d|j|jf }t|tƒrð||krðqÈ||ƒ ¡ \}	}
|	rÈ| j |||	|
f¡ qÈW q¬W | jj}|d k	rPt|p@t dƒ| jjd| _!nd | _!| jj"rpt# $| jj"¡prd	}| jj%rŽt# $| jj%¡pd	}t| jj&t'ƒs°t( )t*d
ƒ¡ | j +¡ | _,g }| j-râ| dt dƒdt dƒf¡ x6| jD ],\}}}	}
|j.rê| ||j/d	|j.f¡ qêW | jj0d k	r2| jj0}n| j1rJ| j1 2dd¡}nd}t3| j4| jj5t6 7d	| jj8¡| jj9| j!| jj:| jj;| jj&| jj<| jj=| jj>| jj?| jj@| jjA| jjB| jC| jD| jj| jEtF||| jg ||| jjGoÜtHd| _I| j1r| jI Jdd„ tK| j1 L| jM¡ƒD ƒ¡ | jI J| jjN¡ d S )Nr   )ÚIndexBuilderZenT)ÚdefaultsZ
componentsZread_config_filesz%s-%sz	%b %d, %Y)r¤   r{   z5html_use_opensearch config value must now be a stringÚgenindexzGeneral IndexÚIrR   r¯   r^   zdefault.css)ÚembeddedÚprojectÚreleaseÚversionÚlast_updatedÚ	copyrightÚ
master_docZuse_opensearchÚ	docstitleZ
shorttitleZshow_copyrightZshow_sphinxZ
has_sourceZshow_sourceZsourcelink_suffixZfile_suffixrŒ   r¤   r‹   Zsphinx_versionr·   ÚrellinksÚbuilderÚparentsÚlogoÚfaviconZhtml5_doctypec             s   s   | ]\}}d | |fV  qdS )Ztheme_Nr;   )r9   ÚkeyÚvalr;   r;   r<   r=   |  s    z8StandaloneHTMLBuilder.prepare_writing.<locals>.<genexpr>)OÚindexerÚsearchÚsphinx.searchrá   r€   Úhtml_search_languager¤   rÈ   Úhtml_search_optionsÚhtml_search_scorerÚload_indexerr5   Ú	docwriterr   ÚsettingsZget_default_valuesÚdocsettingsÚboolÚhtml_compact_listsZcompact_listsÚdomain_indicesÚhtml_domain_indicesrD   ZdomainsÚindicesr|   r?   rA   ZgeneraterJ   Úhtml_last_updated_fmtr(   r   ré   Ú	html_logor   ÚbasenameÚhtml_faviconÚhtml_use_opensearchr   rÉ   rÊ   r   Zcollect_relationsÚ	relationsr   Z	shortnameÚ	localnameÚ
html_styler¯   rµ   r@   rå   ræ   Úreturn_codes_reÚsubrç   rè   rê   rë   Ú
html_titleÚhtml_short_titleÚhtml_show_copyrightÚhtml_show_sphinxÚhtml_copy_sourceÚhtml_show_sourcelinkÚhtml_sourcelink_suffixr™   rŒ   r‹   r   r   rž   ÚglobalcontextÚupdater   Zget_optionsr±   Úhtml_context)rK   Údocnamesrá   ZlangZindices_configZdomain_nameZdomainÚindexclsÚ	indexnameÚcontentÚcollapseZlufmtrð   rñ   rí   Z	stylenamer;   r;   r<   Úprepare_writing  s°    







z%StandaloneHTMLBuilder.prepare_writingc             C   sj  d }}g }| j d dd… }| j |¡}| jj}	|r¢|d r¢yJ|  ||d ¡|  |	|d  ¡d dœ}| |d |d dtdƒf¡ W n t	k
r    d}Y nX |r|d ryJ|  ||d ¡|  |	|d  ¡d dœ}| |d |d d	td
ƒf¡ W n t	k
r   d}Y nX xp|rˆ|d rˆy2| |  ||d ¡|  |	|d  ¡d dœ¡ W n t	k
rr   Y nX | j |d ¡}qW |r˜| 
¡  | ¡  | jj |¡}
|
rÄ|  |
¡d pÆd}
t | j |¡¡d }| jjr|| }|| jjkr|| jj7 }nd}| jj |¡}t| jƒ || ¡}|  |¡d }t||||
||||||| jj| dk|dS )z1Collect items for the template context of a page.Nrí   rM   ra   )Úlinkra   ÚNÚnextr`   ÚPZpreviousr   r{   rØ   )rï   Úprevr  ra   ÚmetaÚbodyÚmetatagsrí   Ú
sourcenameÚtocÚdisplay_tocZpage_source_suffix)r  r  ÚgetrÈ   ÚtitlesÚget_relative_urirà   rJ   r   ÚKeyErrorÚpopÚreverseÚ
longtitlesr   ÚsplitextrÐ   r€   r  r  Zmetadatar   Zget_toc_forr@   Ztoc_num_entries)rK   rÓ   r#  r$  r!  r  rï   rí   Zrelatedr)  ra   Zsource_suffixr%  r"  Zself_tocr&  r;   r;   r<   Úget_doc_context€  sl    "
"
 
z%StandaloneHTMLBuilder.get_doc_contextc             C   s®   t dd}| j|_| jj |i ¡| _| jj |i ¡| _t	|  
|¡dƒ| _t	|  
|¡dƒ| _|| _| j ||¡ | j ¡  | jjd }| jj}|  |||¡}| j|||d d S )Nzutf-8)ÚencodingrŽ   Ú
_downloadsrØ   )Ú	event_arg)r   rý   rü   rÈ   Útoc_secnumbersr(  r’   Útoc_fignumbersZ
fignumbersr0   Úget_target_uriÚimgpathZdlpathr“   rû   r†   Zassemble_partsrÝ   Z
clean_metar0  Úhandle_page)rK   rÓ   ÚdoctreeZdestinationr#  r$  Úctxr;   r;   r<   Ú	write_docÑ  s    

zStandaloneHTMLBuilder.write_docc             C   sT   t |  |¡| jƒ| _|  |¡ | jj |¡}|r>|  |¡d p@d}|  	|||¡ d S )Nra   r{   )
r0   r6  r‘   r7  Úpost_process_imagesrÈ   r.  r(  rà   Ú
index_page)rK   rÓ   r9  ra   r;   r;   r<   Úwrite_doc_serializedã  s
    
z*StandaloneHTMLBuilder.write_doc_serializedc             C   sn   | j  | j¡ | j  | j¡ | j  | j¡ | j  | j¡ | j  | j¡ | j  | j¡ | j  | j¡ |  	¡  d S )N)
Úfinish_tasksÚadd_taskÚgen_indicesÚgen_additional_pagesÚcopy_image_filesÚcopy_download_filesÚcopy_static_filesÚcopy_extra_filesÚwrite_buildinfoÚhandle_finish)rK   r;   r;   r<   Úfinishë  s    zStandaloneHTMLBuilder.finishc             C   s:   t jttdƒƒdd | jr$|  ¡  |  ¡  t  d¡ d S )Nzgenerating indices...r`   )Únonlr{   )rÉ   Úinfor#   r   r   Úwrite_genindexÚwrite_domain_indices)rK   r;   r;   r<   rA  ø  s
    z!StandaloneHTMLBuilder.gen_indicesc             C   sö   x6| j  d¡D ]&}x |D ]\}}}|  |||¡ qW qW tjttdƒƒdd x8| jj 	¡ D ](\}}tjd| dd |  |i |¡ q\W | j
rªtjddd |  di d¡ | jjrè| j
rètjd	dd t | jd
d¡}| jdi d|d t d¡ d S )Nzhtml-collect-pageszwriting additional pages...r`   )rJ  ú z searchrõ   zsearch.htmlz opensearchr»   zopensearch.xmlÚ
opensearch)Úoutfilenamer{   )r   Úemitr8  rÉ   rK  r#   r   r€   Úhtml_additional_pagesrB   rõ   r  r   r£   rÇ   )rK   ZpagelistÚpagenameÚcontextÚtemplateÚfnr;   r;   r<   rB    s    z*StandaloneHTMLBuilder.gen_additional_pagesc       	      C   sÒ   t | jƒ | ¡}g }x(|D ] \}}| tdd„ |D ƒƒ¡ qW t||| jjd}tj	ddd | jjrÀ|  
d|d¡ |  
d	|d
¡ xJt||ƒD ],\\}}}||||dœ}|  
d| |d¡ qŽW n|  
d|d
¡ d S )Nc             s   s$   | ]\}\}}}d t |ƒ V  qdS )r`   N)rÃ   )r9   r   Zsubitemsr;   r;   r<   r=   '  s   z7StandaloneHTMLBuilder.write_genindex.<locals>.<genexpr>)ÚgenindexentriesZgenindexcountsZsplit_indexz	 genindexr`   )rJ  rã   zgenindex-split.htmlzgenindex-allzgenindex.html)rò   ÚentriesÚcountrW  z	genindex-zgenindex-single.html)r   rÈ   Zcreate_indexrJ   Úsumr@   r€   Úhtml_split_indexrÉ   rK  r8  Úzip)	rK   rã   ZindexcountsZ_krX  Zgenindexcontextrò   rY  r:  r;   r;   r<   rL     s*    z$StandaloneHTMLBuilder.write_genindexc             C   sL   xF| j D ]<\}}}}t|j||d}tjd| dd |  ||d¡ qW d S )N)Z
indextitler  Zcollapse_indexrN  r`   )rJ  zdomainindex.html)r   r@   r	  rÉ   rK  r8  )rK   r  r  r  r  Zindexcontextr;   r;   r<   rM  >  s    z*StandaloneHTMLBuilder.write_domain_indicesc             C   sÊ   | j rÆt| jjƒj}tt | j| j	¡ƒ xœt
| j tdƒdt| j ƒ| jj|dD ]t}| j | }y&tt | j|¡t | j| j	|¡ƒ W qN tk
rÀ } z t tdƒt | j|¡|¡ W d d }~X Y qNX qNW d S )Nzcopying images... Úbrown)Ústringify_funczcannot copy image file %r: %s)Úimagesr   r   rÈ   Zget_original_image_urir1   r   r£   rÇ   r‘   r"   r   rÃ   Ú	verbosityr3   Úsrcdirrt   rÉ   rÊ   )rK   r^  ÚsrcÚdestÚerrr;   r;   r<   rC  I  s    

z&StandaloneHTMLBuilder.copy_image_filesc                sÞ   ‡ fdd„}ˆ j jrÚtt ˆ jd¡ƒ x²tˆ j jtdƒdtˆ j jƒˆ j	j
|dD ]†}yBt ˆ jdˆ j j| d ¡}tt |¡ƒ tt ˆ j|¡|ƒ W qP tk
rÔ } z t tdƒt ˆ j|¡|¡ W d d }~X Y qPX qPW d S )	Nc                s   t ˆ j| ƒS )N)r
   ra  )rv   )rK   r;   r<   Ú
to_relpath[  s    z=StandaloneHTMLBuilder.copy_download_files.<locals>.to_relpathr2  zcopying downloadable files... r]  )r^  r`   z$cannot copy downloadable file %r: %s)rÈ   Zdlfilesr1   r   r£   rÇ   r"   r   rÃ   r   r`  Údirnamer3   ra  rÑ   rÉ   rÊ   )rK   re  rb  rc  rd  r;   )rK   r<   rD  Y  s    
z)StandaloneHTMLBuilder.copy_download_filesc          
   C   sÞ  y¢t jttdƒƒdd tt | jd¡ƒ tt | jdd¡dƒ}| 	| j
 ¡ ¡ W d Q R X | jjd k	rŒ|  ¡ }|rŒt|t | jdd¡ƒ | jd k	rº| j ¡ }|rºt|t | jdd¡ƒ | j ¡ }| jd k	rÞ| | j ¡ ¡ | jr.xF| j ¡ d d d	… D ].}t |d
¡}t|t | jd¡t|| jd qüW t| jjdg ƒ}x^| jjD ]R}t | j|¡}t |¡s|t   tdƒ|¡ qJt|t | jd¡||| jd qJW | jj!rt "| jj!¡}t | jd|¡}	t #t | j| jj!¡¡søt   tdƒ| jj!¡ n$t #|	¡stt | j| jj!¡|	ƒ | jj$r˜t "| jj$¡}
t | jd|
¡}t #t | j| jj$¡¡stt   tdƒ| jj$¡ n$t #|¡s˜tt | j| jj$¡|ƒ t  d¡ W n4 t%k
rØ } zt   tdƒ|¡ W d d }~X Y nX d S )Nzcopying static files... T)rJ  r»   zpygments.cssÚwztranslations.jsz_stemmer.jséÿÿÿÿZstatic)ÚexcludedrT  Úrendererz**/.*z(html_static_path entry %r does not exist)rT  rj  zlogo file %r does not existzfavicon file %r does not existÚdonezcannot copy static file %r)&rÉ   rK  r#   r   r1   r   r£   rÇ   rÆ   r†   r¶   Zget_stylesheetr€   r¤   r«   r3   rô   Zget_js_stemmer_rawcoder  r°   r  Zcontext_for_searchtoolr¯   Zget_theme_dirsr'   r,   r²   r+   Úexclude_patternsrÖ   ÚconfdirÚexistsrÊ   r  r  r©   r  rÑ   )rK   rv   rª   r:  Z
theme_pathÚentryri  Zstatic_pathZlogobaseZ
logotargetZiconbaseZ
icontargetrd  r;   r;   r<   rE  l  sd    






z'StandaloneHTMLBuilder.copy_static_filesc          
   C   s¶   y~t jttdƒƒdd t| jjƒ}xH| jjD ]<}t 	| j
|¡}t |¡s\t  tdƒ|¡ q.t|| j|ƒ q.W t  tdƒ¡ W n2 tk
r° } zt  tdƒ|¡ W d d }~X Y nX d S )Nzcopying extra files... T)rJ  z'html_extra_path entry %r does not existrk  zcannot copy extra file %r)rÉ   rK  r#   r   r+   r€   rl  rÕ   r   r£   rm  rn  rÊ   r'   rÇ   rÑ   )rK   ri  Z
extra_pathro  rd  r;   r;   r<   rF  ¯  s    
z&StandaloneHTMLBuilder.copy_extra_filesc          
   C   sh   y0t t | jd¡dƒ}| j |¡ W d Q R X W n2 tk
rb } zt t	dƒ|¡ W d d }~X Y nX d S )Nz
.buildinforg  z#Failed to write build info file: %r)
rÆ   r   r£   rÇ   rx   r‡   rË   rÉ   rÊ   r   )rK   rÒ   ry   r;   r;   r<   rG  Á  s
    z%StandaloneHTMLBuilder.write_buildinfoc             C   s   | j r| j  ¡  d S )N)r¯   Úcleanup)rK   r;   r;   r<   rp  É  s    zStandaloneHTMLBuilder.cleanupc                s¶   t  | |¡ | jjr²| jr²x–| tj¡D ]†‰ d}t‡ fdd„|D ƒƒr(tˆ j	tj
ƒrVq(ˆ d }tj
dddd}|| jkr’t | j| j| ¡|d< n||d< ˆ  |¡ | ˆ ¡ q(W d	S )
zlPick the best candidate for an image and link down-scaled images to
        their high res version.
        )ZscaleÚwidthZheightc             3   s   | ]}|ˆ kV  qd S )Nr;   )r9   rò   )rÞ   r;   r<   r=   Ù  s    z<StandaloneHTMLBuilder.post_process_images.<locals>.<genexpr>Úurir{   T)ZinternalÚrefuriN)r   r<  r€   Úhtml_scaled_image_linkÚtraverser   ZimageÚanyr?   ÚparentÚ	referencer_  r¼   r£   r7  Zreplace_selfrJ   )rK   r9  Z
scale_keysrr  rx  r;   )rÞ   r<   r<  Ï  s    

z)StandaloneHTMLBuilder.post_process_imagesc          
   C   s¨   t | jjƒt |ƒ }yVt | j| j¡}| jr>tj	|ddd}n
t	|dƒ}| | j
 || j¡ W d Q R X W n, tttfk
r–   |r’t tdƒ¡ Y nX | j
 |¡ d S )NÚrzutf-8)r1  Úrbzcsearch index couldn't be loaded, but not all documents will be built: the index will be incomplete.)ÚsetrÈ   rÌ   r   r£   rÇ   Úsearchindex_filenameÚindexer_dumps_unicodeÚcodecsrÆ   rô   rz   Úindexer_formatrË   ÚOSErrorru   rÉ   rÊ   r   Úprune)rK   r  ZkeepÚsearchindexfnrv   r;   r;   r<   rú   é  s    
z"StandaloneHTMLBuilder.load_indexerc             C   s^   | j d k	rZ|rZ| jj|d d}y| j  ||||¡ W n$ tk
rX   | j  |||¡ Y nX d S )N)Úbase)rô   rÈ   rÐ   ZfeedÚ	TypeError)rK   rS  r9  ra   rc   r;   r;   r<   r=  ü  s    z StandaloneHTMLBuilder.index_pagec             K   s2   d|krd|d< |   t| jƒj|| |f|Ž¡d S )NÚincludehiddenFrØ   )rà   r   rÈ   Úget_toctree_for)rK   rÓ   r  Úkwdsr;   r;   r<   Ú_get_local_toctree  s    z(StandaloneHTMLBuilder._get_local_toctreec             C   s   t  | jt|ƒ| j ¡S )N)r   r£   rÇ   r/   r™   )rK   rS  r;   r;   r<   rÍ     s    z%StandaloneHTMLBuilder.get_outfilenamec             C   s<  dd„ }d }d }d }| j jdkrry,| j j dd¡}|rJdd„ | d¡D ƒ}W qš tk
rn   d	d
dddg}Y qšX n(| j  ddd ¡}|ršdd„ | d¡D ƒ}|  dd¡}xPt|ƒD ]D\}	}
t	||	ƒr°|rì||	ƒrì||ƒr°t
 tdƒ|||	¡ q°|	}|
}q°W |d krn$t|tƒr(|}d }tjdtdd ||d< ||d< d S )Nc                s   t ‡ fdd„dD ƒƒS )Nc             3   s   | ]}|ˆ kV  qd S )Nr;   )r9   Úchar)Úpatternr;   r<   r=     s    zKStandaloneHTMLBuilder.add_sidebars.<locals>.has_wildcard.<locals>.<genexpr>z*?[)rv  )rŠ  r;   )rŠ  r<   Úhas_wildcard  s    z8StandaloneHTMLBuilder.add_sidebars.<locals>.has_wildcardÚ	alabasterr¯   Úsidebarsc             S   s   g | ]}|  ¡ ‘qS r;   )rq   )r9   r|   r;   r;   r<   r¦   #  s    z6StandaloneHTMLBuilder.add_sidebars.<locals>.<listcomp>ú,z
about.htmlznavigation.htmlzrelations.htmlzsearchbox.htmlzdonate.htmlc             S   s   g | ]}|  ¡ ‘qS r;   )rq   )r9   r|   r;   r;   r<   r¦   +  s    rŠ   z8page %s matches two patterns in html_sidebars: %r and %rz}Now html_sidebars only allows list of sidebar templates as a value. Support for a string value will be removed at Sphinx-2.0.rM   )rN   Úcustomsidebar)r¯   r|   r€   r(  rp   rt   rµ   rœ   r   r*   rÉ   rÊ   r   r?   r   rO   rP   r   )rK   rS  r:  r‹  r  Zmatchedr  Ztheme_default_sidebarsÚhtml_sidebarsrŠ  Zpatsidebarsr;   r;   r<   Úadd_sidebars  sF    




z"StandaloneHTMLBuilder.add_sidebarsc             C   s
   || j  S )N)r›   )rK   rÓ   Útypr;   r;   r<   r6  O  s    z$StandaloneHTMLBuilder.get_target_uriú	page.htmlc          
      s`  ˆj  ¡ }ˆ  |d< |d< ˆjj|d< ˆ ˆ ¡}| dd¡d }ˆjjrdt ˆjjˆ ˆj	 ¡|d< nd |d< d|f‡fd	d
„	‰ˆ|d< ‡fdd„}||d< ‡fdd„}	|	|d< ‡fdd„}
|
|d< ‡ ‡fdd„|d< ˆ 
ˆ |¡ | |¡ ˆ ˆ |||¡ ˆj dˆ |||¡}|r|}yˆj ||¡}W n\ tk
rP   t tdƒˆ ¡ d S  tk
r† } zttdƒˆ |f ƒ‚W d d }~X Y nX |s˜ˆ ˆ ¡}tt |¡ƒ y.t |d|d d¡}| |¡ W d Q R X W n: ttfk
r } zt tdƒ||¡ W d d }~X Y nX ˆj r\| !d¡r\t ˆj"dt#|d ƒ¡}tt |¡ƒ t$ˆj% &ˆ ¡|ƒ d S ) NrS  Úcurrent_page_namer1  ú#r`   r   ZpageurlFc                sB   |rd| kr| S |sˆ   | ¡} t|| ƒp*d}|dkr>ˆ js>|}|S )Nz://r•  )r6  r0   Úallow_sharp_as_current_path)ZotheruriÚresourceZbaseurirr  )rK   r;   r<   Úpathtoe  s    
z1StandaloneHTMLBuilder.handle_page.<locals>.pathtor˜  c                sh   g }x<t | jƒD ].}| j| }|d k	r| d|t|dƒf ¡ qW | dˆ | jdd ¡ dd |¡ S )Nz%s="%s"Tz	href="%s")r—  z<link %s />rN  )rD   rd   rJ   r4   rc   r£   )Zcssrº   rò   r}   )r˜  r;   r<   Úcss_tagr  s    
z2StandaloneHTMLBuilder.handle_page.<locals>.css_tagr™  c                s>   | ˆ j jkrdS | dkr"ˆ jr"dS | dkr:ˆ  dd¡r:dS dS )NTrõ   rã   r   rŠ   F)rÈ   rÌ   rõ   rœ   )r|   )rK   r;   r<   Úhasdoc}  s    z1StandaloneHTMLBuilder.handle_page.<locals>.hasdocrš  c                 s    t jdtdd ˆ j| |Ž dS )z!Simple warn() wrapper for themes.zCThe template function warn() was deprecated. Use warning() instead.rM   )rN   r{   )rO   rP   r   )rg   r½   )rK   r;   r<   rP   ˆ  s    
z/StandaloneHTMLBuilder.handle_page.<locals>.warnrP   c                 s   ˆj ˆ f| ŽS )N)rˆ  )Úkw)rS  rK   r;   r<   Ú<lambda>’  s    z3StandaloneHTMLBuilder.handle_page.<locals>.<lambda>Útoctreezhtml-page-contextz‹a Unicode error occurred when rendering the page %s. Please make sure all config values that contain non-ASCII content are Unicode strings.z6An error happened in rendering the page %s.
Reason: %rrg  Úxmlcharrefreplacezerror writing file %s: %sr%  Ú_sources)'r  r°   r€   Úhtml_output_encodingr6  ÚrsplitÚhtml_baseurlr¼   r£   r™   r‘  r  Úupdate_page_contextr   Zemit_firstresultr²   ZrenderÚUnicodeErrorrÉ   rÊ   r   rt   r   rÍ   r1   r   rf  r~  rÆ   r†   rË   r€  Ú
copysourcer(  rÇ   r/   r3   rÈ   rÐ   )rK   rS  ZaddctxÚtemplatenamerP  r3  r:  Zdefault_baseurir™  rš  rP   ZnewtmplÚoutputry   rv   rd  Úsource_namer;   )rS  r˜  rK   r<   r8  S  s^    


		




$
z!StandaloneHTMLBuilder.handle_pagec             C   s   d S )Nr;   )rK   rS  r¦  r:  r3  r;   r;   r<   r£  ·  s    z)StandaloneHTMLBuilder.update_page_contextc             C   s&   | j r| j | j¡ | j | j¡ d S )N)rô   r?  r@  Údump_search_indexÚdump_inventory)rK   r;   r;   r<   rH  »  s    z#StandaloneHTMLBuilder.handle_finishc             C   sB   t jttdƒƒdd t t | jt	¡| j
| ¡ t  tdƒ¡ d S )Nzdumping object inventory... T)rJ  rk  )rÉ   rK  r#   r   r)   r‡   r   r£   rÇ   ÚINVENTORY_FILENAMErÈ   )rK   r;   r;   r<   rª  Á  s    z$StandaloneHTMLBuilder.dump_inventoryc          	   C   sª   t jttdƒ| j ¡  ƒdd | j | jj¡ t	 
| j| j¡}| jr\tj|d ddd}nt|d dƒ}| | j || j¡ W d Q R X t|d |ƒ t  td	ƒ¡ d S )
Nzdumping search index in %s ... T)rJ  z.tmprg  zutf-8)r1  Úwbrk  )rÉ   rK  r#   r   rô   Zlabelr  rÈ   rÌ   r   r£   rÇ   r|  r}  r~  rÆ   r‡   r  r2   )rK   r‚  rv   r;   r;   r<   r©  Ç  s    z'StandaloneHTMLBuilder.dump_search_index)T)N)r“  NN)KrY   rZ   r[   r\   r|   Úformatr   Úepilogr¥  Zallow_parallelr™   r›   r   r  r}  rt  Úsupported_image_typesZsupported_remote_imagesZsupported_data_uri_imagesr|  Zadd_permalinksr–  rå   rõ   r   Zdownload_supportrÀ   r7  r   rÙ   rƒ   r¡   r   r«   r®   r”   r•   r–   r¹   r—   r¿   ÚpropertyrÁ   rÅ   rÔ   r×   rà   r  r0  r;  r>  rI  rA  rB  rL  rM  rC  rD  rE  rF  rG  rp  r<  rú   r=  rˆ  rÍ   r‘  r6  r8  r£  rH  rª  r©  r]   r;   r;   )rL   r<   r‰     sŒ   
	&nQC
=
 
cr‰   c               @   s.   e Zd ZdZdZd
dd„Zdd„ Zdd	„ ZdS )ÚDirectoryHTMLBuilderz²
    A StandaloneHTMLBuilder that creates all HTML pages as "index.html" in
    a directory given by their pagename, so that generated URLs don't have
    ``.html`` in them.
    ZdirhtmlNc             C   s.   |dkrdS |  td ¡r&|d d… S |t S )NrR   r{   éûÿÿÿ)Úendswithr.   )rK   rÓ   r’  r;   r;   r<   r6  â  s
    z#DirectoryHTMLBuilder.get_target_uric             C   sN   |dks|  td ¡r0t | jt|ƒ| j ¡}nt | jt|ƒd| j ¡}|S )NrR   )r³  r.   r   r£   rÇ   r/   r™   )rK   rS  rP  r;   r;   r<   rÍ   ê  s    z$DirectoryHTMLBuilder.get_outfilenamec             C   s   t  | |¡ d| jd< d S )NTZno_search_suffix)r‰   r  r  )rK   r  r;   r;   r<   r  õ  s    z$DirectoryHTMLBuilder.prepare_writing)N)rY   rZ   r[   r\   r|   r6  rÍ   r  r;   r;   r;   r<   r±  Ú  s
   
r±  c               @   s~   e Zd ZdZdZedƒZdZdd„ Zddd	„Z	dd
d„Z
dd„ Zddd„Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS ) ÚSingleFileHTMLBuilderzb
    A StandaloneHTMLBuilder subclass that puts the whole document tree on one
    HTML page.
    Z
singlehtmlzThe HTML page is in %(outdir)s.Fc             C   s   dS )Nzall documentsr;   )rK   r;   r;   r<   rÔ     s    z'SingleFileHTMLBuilder.get_outdated_docsNc             C   s0   || j jkr"| jj| j d | S || j S d S )Nz
#document-)rÈ   rÌ   r€   rë   r™   )rK   rÓ   r’  r;   r;   r<   r6  	  s    z$SingleFileHTMLBuilder.get_target_uric             C   s   |   ||¡S )N)r6  )rK   Zfrom_Útor’  r;   r;   r<   r*    s    z&SingleFileHTMLBuilder.get_relative_uric             C   sz   | j j| j }xf| tj¡D ]V}d|kr*q|d }| d¡}|dk rFq| d|d ¡}|dkr|||d …  |d< qW d S )Nrs  r•  r   r`   )r€   rë   r™   ru  r   rx  Úfind)rK   ÚtreeÚfnameZrefnoders  Z	hashindexr;   r;   r<   Úfix_refuris  s    
z!SingleFileHTMLBuilder.fix_refurisTc             K   sH   d|krd|d< t | jƒj|| |f|Ž}|d k	r:|  |¡ |  |¡d S )Nr…  FrØ   )r   rÈ   r†  r¹  rà   )rK   rÓ   r  r‡  r  r;   r;   r<   rˆ  '  s    
z(SingleFileHTMLBuilder._get_local_toctreec             C   sP   | j j}| j |¡}t| tƒ ||t|gƒ}||d< | j ||| ¡ |  |¡ |S )NrÓ   )	r€   rë   rÈ   Zget_doctreer-   r{  r$   Zresolve_referencesr¹  )rK   Zmasterr·  r;   r;   r<   Úassemble_doctree0  s    
z&SingleFileHTMLBuilder.assemble_doctreec             C   sT   i }xBt | jjƒD ]2\}}x(t |ƒD ]\}}d||f }|||< q$W qW | jj|iS )Nz%s/%s)r   rÈ   r4  r€   rë   )rK   Znew_secnumbersrÓ   ZsecnumsÚidZsecnumÚaliasr;   r;   r<   Úassemble_toc_secnumbers:  s    z-SingleFileHTMLBuilder.assemble_toc_secnumbersc       	      C   sz   i }xht | jjƒD ]X\}}xNt |ƒD ]B\}}d||f }| |i ¡ x t |ƒD ]\}}||| |< qNW q$W qW | jj|iS )Nz%s/%s)r   rÈ   r5  re   r€   rë   )	rK   Znew_fignumbersrÓ   Z
fignumlistZfigtypeZfignumsr¼  r»  Zfignumr;   r;   r<   Úassemble_toc_fignumbersM  s    z-SingleFileHTMLBuilder.assemble_toc_fignumbersc             C   sf   t | jƒ | jj| d¡}|r:|  |¡ |  |¡d }d}nd}d}tg d d d | jjd ||g d||dS )NFrØ   Tr{   )rï   r!  r  rì   ra   r"  r#  r$  rí   r%  r&  r'  )	r   rÈ   r†  r€   rë   r¹  rà   r@   r  )rK   rÓ   r#  r$  r&  r'  r;   r;   r<   r0  c  s*    
z%SingleFileHTMLBuilder.get_doc_contextc             G   s¾   | j j}tjttdƒƒdd |  |¡ t tdƒ¡ tjttdƒƒdd |  ¡ }|  ¡ | j _	|  
¡ | j _t d¡ tjttdƒƒdd |  | jj|¡ |  | jj|¡ t tdƒ¡ d S )Nzpreparing documents... T)rJ  rk  zassembling single document... r{   zwriting... )rÈ   rÌ   rÉ   rK  r#   r   r  rº  r½  r4  r¾  r5  r>  r€   rë   r;  )rK   Zignoredr  r9  r;   r;   r<   r†     s    

zSingleFileHTMLBuilder.writec             C   sÆ   t jttdƒƒdd x8| jj ¡ D ](\}}t jd| dd |  |i |¡ q$W | jjrˆt jddd t	 
| jdd¡}| jdi d|d	 t  d
¡ |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  d S )Nzwriting additional files...r`   )rJ  rN  z opensearchr»   zopensearch.xmlrO  )rP  r{   )rÉ   rK  r#   r   r€   rR  rB   r8  r  r   r£   rÇ   rC  rD  rE  rF  rG  rª  )rK   rS  rU  rV  r;   r;   r<   rI  ‘  s    
zSingleFileHTMLBuilder.finish)N)N)T)rY   rZ   r[   r\   r|   r   r®  r¥  rÔ   r6  r*  r¹  rˆ  rº  r½  r¾  r0  r†   rI  r;   r;   r;   r<   r´  û  s   



	
r´  c               @   sX   e Zd ZdZdZdZdZdZddddgZd	d
„ Z	ddd„Z
dd„ Zddd„Zdd„ ZdS )ÚSerializingHTMLBuilderzA
    An abstract builder that serializes the generated HTML.
    NFr;   zimage/svg+xmlz	image/pngz	image/gifz
image/jpegc             C   sZ   t | j| jƒ| _d| _d | _d | _d | _|  ¡  |  	¡  |  
¡  |  ¡  |  dd¡| _d S )NrŽ   r   rŠ   )rj   r€   r   rx   r‘   r“   r¯   r²   r”   r•   r–   r—   rœ   r   )rK   r;   r;   r<   r¡   ¼  s    zSerializingHTMLBuilder.initc             C   s.   |dkrdS |  td ¡r&|d d… S |t S )NrR   r{   r²  )r³  r.   )rK   rÓ   r’  r;   r;   r<   r6  É  s
    z%SerializingHTMLBuilder.get_target_uric          	   C   sL   | j rtj|ddd}n
t|dƒ}| | jj||f| jžŽ  W d Q R X d S )Nrg  zutf-8)r1  r¬  )Úimplementation_dumps_unicoder~  rÆ   Úimplementationr‡   Úadditional_dump_args)rK   rT  rc   rv   r;   r;   r<   Údump_contextÑ  s
    
z#SerializingHTMLBuilder.dump_contextú	page.htmlc             C   sÌ   ||d< |   ||¡ |s0t | jt|ƒ| j ¡}| j d||||¡ x&t|ƒD ]}t	|| t
jƒrN||= qNW tt |¡ƒ |  ||¡ | d¡rÈt | jdt|d ƒ¡}tt |¡ƒ t| j |¡|ƒ d S )Nr”  zhtml-page-contextr%  rŸ  )r‘  r   r£   rÇ   r/   r™   r   rQ  rA   r?   ÚtypesÚFunctionTyper1   rf  rÃ  r(  r3   rÈ   rÐ   )rK   rS  r:  r¦  rP  r3  rò   r¨  r;   r;   r<   r8  Ú  s     


z"SerializingHTMLBuilder.handle_pagec             C   sb   t  | j| j¡}|  | j|¡ t | ¡ tt  | j	t
¡t  | jt
¡ƒ tt  | jt¡dƒ ¡  d S )Nrg  )r   r£   rÇ   Úglobalcontext_filenamerÃ  r  r‰   rH  r3   Z
doctreedirr   rÆ   ÚLAST_BUILD_FILENAMEÚclose)rK   rP  r;   r;   r<   rH  ø  s    
z$SerializingHTMLBuilder.handle_finish)N)rÄ  NN)rY   rZ   r[   r\   rÁ  rÀ  rÂ  rÇ  r¯  r¡   r6  rÃ  r8  rH  r;   r;   r;   r<   r¿  ª  s   
	 
r¿  c               @   s@   e Zd ZdZdZedƒZeZdZ	ej
fZeZdZdZdZdZdS )	ÚPickleHTMLBuilderzD
    A Builder that dumps the generated HTML into pickle files.
    Úpicklez3You can now process the pickle files in %(outdir)s.Fz.fpicklezglobalcontext.picklezsearchindex.pickleN)rY   rZ   r[   r\   r|   r   r®  rË  rÁ  rÀ  ZHIGHEST_PROTOCOLrÂ  r  r}  r™   rÇ  r|  r;   r;   r;   r<   rÊ    s   rÊ  c               @   s@   e Zd ZdZdZedƒZeZdZ	eZ
dZdZdZdZdd	„ Zd
S )ÚJSONHTMLBuilderzB
    A builder that dumps the generated HTML into JSON files.
    Zjsonz1You can now process the JSON files in %(outdir)s.Tz.fjsonzglobalcontext.jsonzsearchindex.jsonc             C   s   t  | ¡ d S )N)r¿  r¡   )rK   r;   r;   r<   r¡   /  s    zJSONHTMLBuilder.initN)rY   rZ   r[   r\   r|   r   r®  r    rÁ  rÀ  r  r}  r™   rÇ  r|  r¡   r;   r;   r;   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 html_css_files to tuple styled one.zinvalid css_file: %r, ignoredN)Úhtml_css_filesr?   r   rJ   rt   rÉ   rÊ   r   )r   r€   rÍ  ro  rc   rº   r;   r;   r<   Úconvert_html_css_files4  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 html_js_files to tuple styled one.zinvalid js_file: %r, ignoredN)Úhtml_js_filesr?   r   rJ   rt   rÉ   rÊ   r   )r   r€   rÏ  ro  rc   rº   r;   r;   r<   Úconvert_html_js_filesF  s    
rÐ  c                s"   |  d¡‰ ‡ fdd„}||d< dS )zxSet up js_tag() template helper.

    .. note:: This set up function is added to keep compatibility with webhelper.
    r˜  c                s°   g }d}t | tƒr~xJt| jƒD ]<}| j| }|d k	r|dkrB|}q| d|t|dƒf ¡ qW | jrž| dˆ | jdd ¡ n | d¡ | dˆ | dd ¡ dd	 |¡|f S )
Nr{   r#  z%s="%s"Tzsrc="%s")r—  ztype="text/javascript"z<script %s>%s</script>rN  )r?   ri   rD   rd   rJ   r4   rc   r£   )Zjsrº   r#  rò   r}   )r˜  r;   r<   Újs_tag`  s    


z#setup_js_tag_helper.<locals>.js_tagrÑ  N)r(  )r   rS  ZtemplatexnamerT  r9  rÑ  r;   )r˜  r<   Úsetup_js_tag_helperX  s    
rÒ  c             C   sN   | j jdkrd S | j j}|d kr.ttdƒƒ‚n|| jjkrJttdƒ| ƒ‚d S )NrŠ   zEMany math_renderers are registered. But no math_renderer is selected.z"Unknown math_renderer %r is given.)rî   r­  rÅ   r   r   r¸   rÂ   )r   r|   r;   r;   r<   Úvalidate_math_rendererw  s    rÓ  c             C   sº  |   t¡ |   t¡ |   t¡ |   t¡ |   t¡ |  ddd¡ |  dg d¡ |  di d¡ |  ddd„ dt¡ |  d	d
d„ d¡ |  dd dt¡ |  dd dt¡ |  dd dt¡ |  dg d¡ |  dg d¡ |  dg d¡ |  dg d¡ |  dd dt¡ |  di d¡ |  di d¡ |  dddt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t¡ |  d#d dt¡ |  d$dd¡ |  d%dd¡ |  d&i d¡ |  d'd(d¡ |  d)dd¡ |  d*d+d¡ |  d,d dt¡ |  d-i d¡ |  d.d!d ¡ |  d/dd¡ |  d0d d¡ |  d1d!d¡ |  d2d d3¡ |  d4d5d„ d¡ |  	d6t
¡ |  	d6t¡ |  	d7t¡ |  	d8t¡ |  d9¡ d:ddd;œS )<Nr¬   rŒ  rŠ   Zhtml_theme_pathr­   r  c             S   s   t dƒ| j| jf S )Nz%s %s documentation)r   ræ   rç   )rK   r;   r;   r<   rœ  ’  s    zsetup.<locals>.<lambda>r  c             S   s   | j S )N)r  )rK   r;   r;   r<   rœ  ”  s    r
  r  r  rÍ  rÏ  rÖ   rÕ   r  r  rR  r  TZhtml_add_permalinksõ   Â¶Zhtml_use_indexr[  Fr  r  r  z.txtr  r{   r˜   rš   r  r  r  r   zutf-8rÿ   Zhtml_secnumber_suffixz. r÷   rø   rù   rt  r   r¢  Zhtml_math_rendererrÈ   Zsinglehtml_sidebarsc             S   s   | j S )N)r  )rK   r;   r;   r<   rœ  ·  s    zconfig-initedzbuilder-initedzhtml-page-contextzsphinx.ext.mathjaxZbuiltin)rè   Zparallel_read_safeZparallel_write_safe)Zadd_builderr‰   r±  r´  rÊ  rÌ  Zadd_config_valuer   rA   ZconnectrÎ  rÐ  rÓ  rÒ  Zsetup_extension)r   r;   r;   r<   Úsetup„  sl    





rÕ  )~r\   r~  r¼   Úrer§   rÅ  rO   Zhashlibr   Úosr   rŸ   r   Zdocutils.corer   Zdocutils.frontendr   Zdocutils.ior   r   Zdocutils.readers.doctreer	   rÚ   Zdocutils.utilsr
   Zsixr   r   r   Z	six.movesr   rË  r´   r   r   Zsphinx.applicationr   Zsphinx.buildersr   Zsphinx.configr   Zsphinx.deprecationr   r   Z!sphinx.environment.adapters.assetr   Z(sphinx.environment.adapters.indexentriesr   Z#sphinx.environment.adapters.toctreer   Zsphinx.errorsr   r   Zsphinx.highlightingr   Zsphinx.localer   r   rö   r   Zsphinx.themingr   Zsphinx.utilr    r!   r"   Zsphinx.util.consoler#   r$   Zsphinx.util.docutilsr%   r&   Zsphinx.util.fileutilr'   Zsphinx.util.i18nr(   Zsphinx.util.inventoryr)   Zsphinx.util.matchingr*   r+   r,   Zsphinx.util.nodesr-   Zsphinx.util.osutilr.   r/   r0   r1   r2   r3   Zsphinx.util.pycompatr4   Zsphinx.writers.htmlr5   r6   Zsphinx.writers.html5r7   rž   r«  rÈ  Z	getLoggerrY   rÉ   Úcompiler  r8   rA   rG   rH   rh   ri   Úobjectrj   r‰   r±  r´  r¿  rÊ  ZWebHTMLBuilderrÌ  rÎ  rÐ  rÒ  rÓ  rÕ  r;   r;   r;   r<   Ú<module>
   s–    

/!6       P! 0a