U
    \Sh                      @  s  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ZddlZddl	Z	ddl
m
Z
mZ ddlmZ ddlmZmZmZmZmZmZ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' ddl%m(Z) ddl*m+Z+ ddl,m-Z- ddl.m/Z/m0Z0 ddl1m2Z2m3Z3m4Z4 ddl5m6Z6 ddl7m8Z8 ddl9m:Z: ddl;m<Z< ddl=m>Z>m?Z? ddl@mAZA ddlBmCZCmDZD ddlEmFZF ddlGmHZH ddlImJZJmKZKmLZL ddlMmNZNmOZO ddlPmQZQ dd lRmSZS dd!lTmUZU dd"lVmWZW dd#lXmYZYmZZZm[Z[ dd$l\m]Z]m^Z^m_Z_m`Z` dd%lambZb dd&lcmdZd dd'lemfZf d(ZgeKheiZjekd)Zleemee3 eeemee4 f  enf Zod*d+d,d-d.Zpd/d/d0d1d2ZqG d3d4 d4emZrG d5d6 d6emZsG d7d8 d8ZtG d9d: d:e-Zud;d<d=d>d?d@Zvd;d<d=d>dAdBZwd;d+d+dCdDd=dEdFdGZxd;d+d+dCdDd=dEdHdIZyd+d+d+dJdKdLZzd;d+d+dCdDd=dEdMdNZ{d;d=dOdPdQZ|d;d<d=d>dRdSZ}d;d<d=d>dTdUZ~d;d<d=d>dVdWZd;d<d=d>dXdYZd;d<d=dZd[d\Zd;d]dOd^d_ZdS )`zSeveral HTML builders.    )annotationsN)datetimetimezone)path)IOAnyIterableIteratorListTupleType)quote)nodes)	Publisher)OptionParser)DocTreeInputStringOutput)Node)relative_path)__display_version__package_dir)version_info)Sphinx)Builder)ENUMConfig)DomainIndex
IndexEntry)BuildEnvironment)ImageAdapter)IndexEntries)TocTree)ConfigError
ThemeError)PygmentsBridge)___)js_index)HTMLThemeFactory)isurlloggingmd5)progress_messagestatus_iterator)new_document)
copy_asset)format_date)InventoryFile)DOTFILESMatcherpatmatch)copyfile	ensurediros_pathrelative_uri)Tags)
HTMLWriter)HTML5Translatorzobjects.invz[
]+r   str)objreturnc                 C  sN   t | trtt|  S t | ttfr:tdd | D } tt| 	 
 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 rD   P/root/rtd-docs/venv/lib/python3.8/site-packages/sphinx/builders/html/__init__.py	<genexpr>O   s     z"get_stable_hash.<locals>.<genexpr>)
isinstancedictrA   listitemstuplesortedr,   r=   encode	hexdigest)r>   rD   rD   rE   rA   F   s
    
rA   
str | None)localer?   c                 C  s   | r|  ddS dS dS )zdConvert a locale string to a language tag (ex. en_US -> en-US).

    refs: BCP 47 (:rfc:`5646`)
    r&   -N)replace)rP   rD   rD   rE   convert_locale_to_language_tagS   s    rS   c                   @  sR   e Zd ZU dZdZded< dZded< dZded< d	d
ddddd dddZdS )
StylesheetzA metadata of stylesheet.

    To keep compatibility with old themes, an instance of stylesheet behaves as
    its filename (str).
    Ndict[str, str]
attributesr=   filenameintpriority  rY   r   )rW   argsrY   rV   r?   c                O  s^   t | |}||_||_||_|jdd |jdd |rZ|d |jd< |d |jd< |S )Nrel
stylesheettypeztext/cssr      title)r=   __new__rW   rY   rV   
setdefault)clsrW   rY   r\   rV   selfrD   rD   rE   rb   i   s    zStylesheet.__new__	__name__
__module____qualname____doc__rV   __annotations__rW   rY   rb   rD   rD   rD   rE   rT   ^   s
   
rT   c                   @  sL   e Zd ZU dZdZded< dZded< dZded< ddddd d
ddZdS )
JavaScriptzA metadata of javascript file.

    To keep compatibility with old themes, an instance of javascript behaves as
    its filename (str).
    NrU   rV   r=   rW   rX   rY   rZ   )rW   rY   rV   r?   c                 K  s"   t | |}||_||_||_|S r@   )r=   rb   rW   rY   rV   )rd   rW   rY   rV   re   rD   rD   rE   rb      s
    zJavaScript.__new__)rZ   rf   rD   rD   rD   rE   rl   x   s
   
rl   c                   @  s`   e Zd ZdZedd dddZddg fddd	d
dddZd ddddZdd
dddZdS )	BuildInfozbuildinfo file manipulator.

    HTMLBuilder and its family are storing their own envdata to ``.buildinfo``.
    This class is a manipulator for the file.
    r   fr?   c              
   C  s   zx|  }|d  dkst|d ds0t|d dsBtt }|d  d  |_|d  d  |_|W S  t	k
r } zt
td| |W 5 d }~X Y nX d S )	Nr   z# Sphinx build info version 1   zconfig:    ztags: r`   zbuild info file is broken: %r)	readlinesrstripAssertionError
startswithrm   splitstripconfig_hash	tags_hash	Exception
ValueErrorr'   )rd   ro   lines
build_infoexcrD   rD   rE   load   s    zBuildInfo.loadNzConfig | NonezTags | None	list[str]None)configtagsconfig_categoriesr?   c                 C  sD   d| _ d| _|r.dd ||D }t|| _ |r@tt|| _d S )N c                 S  s   i | ]}|j |jqS rD   )namevalue)rB   crD   rD   rE   
<dictcomp>   s      z&BuildInfo.__init__.<locals>.<dictcomp>)rx   ry   filterrA   rL   )re   r   r   r   valuesrD   rD   rE   __init__   s    
zBuildInfo.__init__bool)otherr?   c                 C  s   | j |j ko| j|jkS r@   )rx   ry   )re   r   rD   rD   rE   __eq__   s    
zBuildInfo.__eq__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
)writerx   ry   re   ro   rD   rD   rE   dump   s    
zBuildInfo.dump)	rg   rh   ri   rj   classmethodr   r   r   r   rD   rD   rD   rE   rm      s   rm   c                      s  e Zd ZU dZdZdZedZeZ	dZ
dZdZdZeZded< 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ed< g Zded< ddddd fddZddddZ ddddZ!dddd Z"d!dd"d#Z#d$dd%d&Z$ddd'd(Z%ddd)d*Z&ddd+d,Z'dddd-d.d/Z(ddd0d1Z)dddd-d2d3Z*e+ddd4d5Z,d!dd6d7Z-d8dd9d:Z.d;d<d=d>d?Z/d@ddAdBdCZ0ddddDdEdFdGZ1dddHdIZ2ddJddKdLdMZ3ddJddKdNdOZ4dddPdQZ5e6edRdddSdTZ7dddUdVZ8e6edWdddXdYZ9dddZd[Z:ddd\d]Z;ddd^d_Z<ddd`daZ=dddbdcZ>dddddeZ?dddfdgZ@dDddhdidjZAdkddhdldmZBdddndoZCdddpdqZDdddrdsZEdddtduZFdddvdwZGdddxdyZHdzdd{ fd|d}ZId~ddAddZJddJdddddZKddddddddZLdddddZMddkddddZNdddddddZOdddkdddddddZPdddkdddddZQddddZRe6edddddZSddddZT  ZUS )StandaloneHTMLBuilderz&
    Builds standalone HTML docs.
    htmlz!The HTML pages are in %(outdir)s.Tz.htmlr   indexer_formatzimage/svg+xmlz	image/pngz	image/gifz
image/jpegzsearchindex.jsFNr=   imgpathzlist[DOMAIN_INDEX_TYPE]domain_indicesr   zBuildEnvironment | Noner   )appenvr?   c                   s   t  || g | _g | _tjjjdd}t||j	t
| ttddd}tjd d dkrj|jddd	 n|jddd	}| |_|| _d S )
Nrestructuredtext)parser_nameunicodeencoding)readerparserwriterZsource_classdestinationrp   )r      T)Zoutput_encoding	traceback)superr   	css_filesscript_filesdocutilsZreadersdoctreeReaderr   r   r;   r   r   __version_info__Zget_settingsZsetup_option_parserget_default_valuessettings
_publisher)re   r   r   r   Zpubop	__class__rD   rE   r      s     
zStandaloneHTMLBuilder.__init__)r?   c                 C  s   |   | _d| _i | _d | _|   |   |   |   | 	dd}|d k	rV|| _
| 	dd}|d k	rr|| _n| j
| _| 	dd| _d S )N_imagesfile_suffixr   link_suffix	use_index)create_build_infor}   imagedir
secnumberscurrent_docnameinit_templatesinit_highlighterinit_css_filesinit_js_filesget_builder_config
out_suffixr   r   )re   html_file_suffixhtml_link_suffixrD   rD   rE   init   s     
zStandaloneHTMLBuilder.initrm   c                 C  s   t | j| jdgS )Nr   )rm   r   r   re   rD   rD   rE   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 }|D ]}t|rF|  S qFd S )Nc                   s    g | ]}t | jjd dqS )LC_MESSAGES	sphinx.js)r   joinr   language)rB   dirr   rD   rE   
<listcomp>  s
    z>StandaloneHTMLBuilder._get_translations_js.<locals>.<listcomp>rP   r   r   zshare/sphinx/locale)	r   Zlocale_dirsr   r   r   r   sysprefixisfile)re   
candidatesjsfilerD   r   rE   _get_translations_js  s"    
 
 

z*StandaloneHTMLBuilder._get_translations_jszIterator[str]c                 c  sn   t | jjtr| jjV  nP| jjd k	r6| jjE d H  n4| jrd| jdd}ttj|dE d H  ndV  d S )Nthemer^   ,zdefault.css)	rG   r   
html_styler=   r   
get_configmaprw   rv   )re   r^   rD   rD   rE   _get_style_filenames#  s    z*StandaloneHTMLBuilder._get_style_filenamesztuple[str, dict]c                 C  s   | j j| j jfS r@   )r   
html_themehtml_theme_optionsr   rD   rD   rE   get_theme_config.  s    z&StandaloneHTMLBuilder.get_theme_configc                 C  sH   t | j}|  \}}||| _| | _|   | j	| | j d S r@   )
r)   r   r   creater   copytheme_optionsZcreate_template_bridge	templatesr   )re   Ztheme_factoryZ	themenameZthemeoptionsrD   rD   rE   r   1  s    

z$StandaloneHTMLBuilder.init_templatesc                 C  s   | j jd k	r| j j}n| jr.| jddd}nd}td|| _| jrV| jddd }nd }|d k	rtd|| _| jjddd	d
 nd | _d S )Nr   pygments_stylenonesphinxr   Zpygments_dark_stylepygments_dark.cssz(prefers-color-scheme: dark)Zpygments_dark_css)Zmediaid)	r   r   r   r   r%   highlighterdark_highlighterr   add_css_file)re   styleZ
dark_stylerD   rD   rE   r   9  s     
z&StandaloneHTMLBuilder.init_highlighterc                 C  s   g | _ | jddd |  D ]}| j|dd q| jjj D ]\}}| j|f| q:| ddD ]"\}}|dd | j|f| q^d S )Npygments.css   r[   r   r   rY      )r   r   r   r   registryr   rc   re   rW   attrsrD   rD   rE   r   P  s    z$StandaloneHTMLBuilder.init_css_files)rW   kwargsr?   c                 K  s,   d|krt d|}| jt|f| d S N://_static)	posixpathr   r   appendrT   re   rW   r   rD   rD   rE   r   ^  s    z"StandaloneHTMLBuilder.add_css_filec                 C  s   g | _ | jddddd | jddd | jddd | jjjD ]\}}| j|f| q>| d	d
D ]"\}}|dd | j|f| qb|  r| d d S )Nzdocumentation_options.jsZdocumentation_optionsr   r   )r   data_url_rootrY   zdoctools.jsr[   zsphinx_highlight.jsjs_filesr   rY   r   translations.js)r   add_js_filer   r   r   r   rc   r   r   rD   rD   rE   r   d  s     z#StandaloneHTMLBuilder.init_js_filesc                 K  s0   |rd|krt d|}| jt|f| d S r   )r   r   r   r   rl   r   rD   rD   rE   r   u  s    z!StandaloneHTMLBuilder.add_js_filec                 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   rp   Zmathjax)r   rI   r   r   html_inline_math_rendererslenremove)re   r   Z	renderersrD   rD   rE   math_renderer_name{  s    
z(StandaloneHTMLBuilder.math_renderer_namec           	      c  s  zXt t| jddd}t|}W 5 Q R X | j|krVtd | j	j
E d H  W d S W nD tk
r } zttd| W 5 d }~X Y n tk
r   Y nX | jr| j }nd}| j	j
D ]}|| j	jkrtd| |V  q| |}zt|}W n tk
r   d}Y nX zrtt| j	||}||krtd|tj|tjd	tj|tjd	|tjt| j	|tjd	 |V  W q tk
r   Y qX qd S )
N
.buildinfoutf-8r   z)[build target] did not match: build_info z"Failed to read build info file: %rr   z![build target] did not in env: %rz>[build target] targetname %r(%s), template(%s), docname %r(%s))tz)openr   r   outdirrm   r   r}   loggerdebugr   Z
found_docsr{   warningr'   OSErrorr   Znewest_template_mtimeall_docsget_outfilenamegetmtimerz   maxdoc2pathr   fromtimestampr   utc)	re   fpZ	buildinfor~   Ztemplate_mtimedocnameZ
targetnameZtargetmtimeZsrcmtimerD   rD   rE   get_outdated_docs  sT    


 


	
z'StandaloneHTMLBuilder.get_outdated_docsr   c                 C  s   | j j| j j S r@   )r   html_extra_pathhtml_static_pathr   rD   rD   rE   get_asset_paths  s    z%StandaloneHTMLBuilder.get_asset_pathszNode | NonerU   )noder?   c                 C  sB   |dkrddiS t d}|| | j| | j  | jjjS )z$Utility: Render a lone doctree node.Nfragmentr   z<partial node>)r/   r   r   Z
set_sourcepublishr   parts)re   r  docrD   rD   rE   render_partial  s    

z$StandaloneHTMLBuilder.render_partialzset[str])docnamesr?   c              !   C  s$  d | _ | jrLddlm} | jjp&| jj}|| j|| jj| jj	| _ | 
| t| | _t 0 tjdtd t| jj| jfdd | _W 5 Q R X t| jj| j_g | _| jj}|r4t| jjD ]n}| jj| }|jD ]V}|j d|j }t|tr||krq||  \}	}
|	r| j!|||	|
f qq| jj"}|d k	rdt#|pTt$d| jjd	| _%nd | _%| jj&pvd
}| jj'pd
}t(|st)*|}t(|st)*|}| j+ | _,g }| j-r|!dt$ddt$df | jD ],\}}}}|j.r|!||j/d
|j.f qt| j0| _1t| j2| _3t| 4 }| j5| jj6t78d
| jj9| jj:| j%| jj;| jj<| jj<| jj=| jj>| jj?| jj@| jjA| jjB| jjC| jjD| jjE| jF| jG| j0tH| jj| j2tItJtKjLd d ||| jg ||dd | _M| jNr| jMOdd | jNP| jQR D  | jMO| jjS d S )Nr   )IndexBuilderignore)categoryT)defaults
componentsZread_config_filesrQ   z	%b %d, %Y)r   r   genindexzGeneral IndexIindex   ) embeddedprojectreleaseversionlast_updated	copyrightZ
master_docroot_docZuse_opensearchZ	docstitleZ
shorttitleZshow_copyrightZshow_search_summaryZshow_sphinxZ
has_sourceZshow_sourceZsourcelink_suffixr   r   r   r   r   sphinx_versionZsphinx_version_tupleZdocutils_version_infostylesrellinksbuilderparentslogo_urlfavicon_urlZhtml5_doctypec                 s  s   | ]\}}d | |fV  qdS )Ztheme_NrD   )rB   keyvalrD   rD   rE   rF   9  s    z8StandaloneHTMLBuilder.prepare_writing.<locals>.<genexpr>)Tindexersearchsphinx.searchr  r   html_search_languager   r   html_search_optionshtml_search_scorerload_indexerr;   	docwriterwarningscatch_warningsfilterwarningsDeprecationWarningr   r   r   docsettingsr   html_compact_listsZcompact_listsr   html_domain_indicesrL   domainsindicesr   rG   rI   generater   html_last_updated_fmtr1   r&   r&  	html_logohtml_faviconr*   r   basenameZcollect_relations	relationsr   	shortname	localnamer   _script_filesr   
_css_filesr   r"  r#  return_codes_resubr$  r%  r'  r(  html_use_opensearch
html_titlehtml_short_titlehtml_show_copyrighthtml_show_search_summaryhtml_show_sphinxhtml_copy_sourcehtml_show_sourcelinkhtml_sourcelink_suffixr   r   rS   r   r)  r   r   globalcontextr   updateZget_optionsr   rJ   html_context)re   r  r  langZindices_configZdomain_namedomainindexcls	indexnamecontentcollapseZlufmtZlogoZfaviconr+  _contentZ	_collapser*  rD   rD   rE   prepare_writing  s    












 

"z%StandaloneHTMLBuilder.prepare_writingdict[str, Any])r  bodymetatagsr?   c                 C  sf  d }}g }| j d dd }| j|}| jj}	|r|d rzJ| ||d | |	|d  d d}||d |d dtdf W n t	k
r   d}Y nX |r|d rzJ| ||d | |	|d  d d}||d |d d	td
f W n t	k
r   d}Y nX |r|d rz2|| ||d | |	|d  d d W n t	k
rp   Y nX | j|d }q|r|
  |  | jj|}
|
r| |
d nd}| j|dt|d }| jjr
|| }|| jjkr|| jj7 }nd}| jj|}t| j|| }| |d }||||||||||| jj| dk|dS )z1Collect items for the template context of a page.Nr+  rp   ra   )linkra   Nnextr`   Ppreviousr   r   Fr  )r-  prevrh  ra   metard  re  r+  
sourcenametocZdisplay_tocZpage_source_suffix)rX  rH  getr   titlesZget_relative_urir  r   r&   KeyErrorpopreverse
longtitlesr	  r   r   rU  rW  metadatar"   Zget_toc_forZtoc_num_entries)re   r  rd  re  rk  rh  r-  r+  relatedrp  
title_nodera   Zsource_suffixrm  rl  Zself_tocrn  rD   rD   rE   get_doc_context>  st    "
"

z%StandaloneHTMLBuilder.get_doc_contextc                 C  s8   | j | j | j | j | j | j | j   d S r@   )finish_tasksadd_taskcopy_download_filescopy_static_filescopy_extra_filesr   r   rD   rD   rE   copy_assets  s    z!StandaloneHTMLBuilder.copy_assetsznodes.document)r  r   r?   c                 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 )Nr   r   r   
_downloadsr  )	event_arg)r   r>  r   r   Ztoc_secnumbersro  r   Ztoc_fignumbersZ
fignumbersr9   get_target_urir   Zdlpathr   r9  r   Zassemble_partsr  Z
clean_metarx  handle_page)re   r  r   r   rd  re  ctxrD   rD   rE   	write_doc  s    

zStandaloneHTMLBuilder.write_docc                 C  sT   t | || j| _| | | jj|}|r>| |d nd}| 	||| d S )Nra   r   )
r9   r  r   r   post_process_imagesr   rt  ro  r  
index_page)re   r  r   rw  ra   rD   rD   rE   write_doc_serialized  s
    
z*StandaloneHTMLBuilder.write_doc_serializedc                 C  sR   | j | j | j | j | j | j | j | j | j | j |   d S r@   )ry  rz  gen_indicesgen_pages_from_extensionsgen_additional_pagescopy_image_fileswrite_buildinfohandle_finishr   rD   rD   rE   finish  s    zStandaloneHTMLBuilder.finishzgenerating indicesc                 C  s   | j r|   |   d S r@   )r   write_genindexwrite_domain_indicesr   rD   rD   rE   r    s    z!StandaloneHTMLBuilder.gen_indicesc                 C  s4   | j dD ]"}|D ]\}}}| ||| qqd S )Nhtml-collect-pages)eventsemitr  )re   ZpagelistpagenamecontexttemplaterD   rD   rE   r    s    z/StandaloneHTMLBuilder.gen_pages_from_extensionszwriting additional pagesc                 C  s   | j j D ](\}}tj|d dd | |i | q| jrXtjddd | di d | j jr| jrtjddd t	| j
dd	}| jd
i d	|d d S )N TZnonlzsearch r3  zsearch.htmlzopensearch r   zopensearch.xmlZ
opensearch)outfilename)r   html_additional_pagesrJ   r  infor  r3  rO  r   r   r   )re   r  r  fnrD   rD   rE   r    s    z*StandaloneHTMLBuilder.gen_additional_pagesc           	      C  s   t | j| }g }|D ] \}}|tdd |D  q||| jjd}tjddd | jjr| 	d|d | 	d	|d
 t
||D ],\\}}}||||d}| 	d| |d qn| 	d|d
 d S )Nc                 s  s$   | ]\}\}}}d t | V  qdS )r`   N)r   )rB   r&   ZsubitemsrD   rD   rE   rF     s   z7StandaloneHTMLBuilder.write_genindex.<locals>.<genexpr>)genindexentriesZgenindexcountsZsplit_indexz	genindex Tr  r  zgenindex-split.htmlzgenindex-allzgenindex.html)r0  entriescountr  z	genindex-zgenindex-single.html)r!   r   Zcreate_indexr   sumr   html_split_indexr  r  r  zip)	re   r  ZindexcountsZ_kr  Zgenindexcontextr0  r  r  rD   rD   rE   r    s4    z$StandaloneHTMLBuilder.write_genindexc                 C  sF   | j D ]:\}}}}|j||d}tj|d dd | ||d qd S )N)Z
indextitler_  Zcollapse_indexr  Tr  zdomainindex.html)r   rJ  r  r  r  )re   r^  r]  r_  r`  ZindexcontextrD   rD   rE   r    s    z*StandaloneHTMLBuilder.write_domain_indicesc                 C  s   | j rt| jjj}tt| j| j	 t
| j tddt| j | jj|dD ]t}| j | }z&tt| j|t| j| j	| W qL tk
r } z ttdt| j|| W 5 d }~X Y qLX qLd S )Nzcopying images... brownstringify_funczcannot copy image file %r: %s)imagesr    r   r   Zget_original_image_urir7   r   r   r   r   r.   r'   r   	verbosityr6   srcdirrz   r  r  )re   r  srcdesterrrD   rD   rE   r    s$     


 z&StandaloneHTMLBuilder.copy_image_filesc                   s   ddd fdd} j jrtt jd t j jtddt j j j	j
|dD ]}zBt jd j j| d	 }tt| tt j|| W qV tk
r } z ttd
t j|| W 5 d }~X Y qVX qVd S )Nr=   rn   c                   s   t  j| S r@   )r   r  )ro   r   rD   rE   
to_relpath  s    z=StandaloneHTMLBuilder.copy_download_files.<locals>.to_relpathr  zcopying downloadable files... r  r  r`   z$cannot copy downloadable file %r: %s)r   Zdlfilesr7   r   r   r   r.   r'   r   r   r  dirnamer6   r  r  r  r  )re   r  r  r  r  rD   r   rE   r{    s$     
 

 z)StandaloneHTMLBuilder.copy_download_filesc              	   C  sv   t t| jddddd}|| j  W 5 Q R X | jrrt t| jddddd}|| j  W 5 Q R X dS )z!create a style file for pygments.r   r   wr   r   r   N)r   r   r   r   r   r   Zget_stylesheetr   r   rD   rD   rE   create_pygments_style_file  s    z0StandaloneHTMLBuilder.create_pygments_style_filec                 C  s&   |   }|r"t|t| jdd dS )z(Copy a JavaScript file for translations.r   r   N)r   r6   r   r   r   re   r   rD   rD   rE   copy_translation_js*  s    z)StandaloneHTMLBuilder.copy_translation_jsc              
   C  sl   | j dk	rht| j drD| j  D ] }t|t| jdt| q n$| j  }|rht|t| jdd dS )z#Copy a JavaScript file for stemmer.Nget_js_stemmer_rawcodesr   z_stemmer.js)	r2  hasattrr  r6   r   r   r   rG  Zget_js_stemmer_rawcoder  rD   rD   rE   copy_stemmer_js0  s    
 
z%StandaloneHTMLBuilder.copy_stemmer_js)r  r?   c              	   C  s^   dddddd}| j rZ| j  d d d D ],}tt|dt| jd	t|| j|d
 q,d S )Nr=   rz   r   rW   errorr?   c                 S  s   t td| | d S Nz1Failed to copy a file in html_static_file: %s: %rr  r  r'   rW   r  rD   rD   rE   onerror<  s    
 z>StandaloneHTMLBuilder.copy_theme_static_files.<locals>.onerrorZstaticr   )excludedr  rendererr  )r   Zget_theme_dirsr0   r   r   r   r3   r   )re   r  r  entryrD   rD   rE   copy_theme_static_files;  s      z-StandaloneHTMLBuilder.copy_theme_static_filesrH   c              	   C  s`   dddddd}t | jjdg }| jjD ].}tt| j|t| jd||| j	|d	 q,d S )
Nr=   rz   r   r  c                 S  s   t td| | d S r  r  r  rD   rD   rE   r  H  s    
 z=StandaloneHTMLBuilder.copy_html_static_files.<locals>.onerrorz**/.*r   )r  r  r  )
r4   r   exclude_patternsr  r0   r   r   confdirr   r   )re   r  r  r  r  rD   rD   rE   copy_html_static_filesG  s       z,StandaloneHTMLBuilder.copy_html_static_filesc                 C  s:   | j jr6t| j js6tt| j| j jt| jd d S Nr   )r   rE  r*   r0   r   r   r  r   r   rD   rD   rE   copy_html_logoR  s    z$StandaloneHTMLBuilder.copy_html_logoc                 C  s:   | j jr6t| j js6tt| j| j jt| jd d S r  )r   rF  r*   r0   r   r   r  r   r   rD   rD   rE   copy_html_faviconW  s    z'StandaloneHTMLBuilder.copy_html_faviconc              
   C  s   zt tdx tt| jd | j }| jd k	rF|	| j
  |   |   |   | | | | |   |   W 5 Q R X W n2 tk
r } zttd| W 5 d }~X Y nX d S )Nzcopying static filesr   zcannot copy static file %r)r-   r'   r7   r   r   r   rX  r   r2  rY  Zcontext_for_searchtoolr  r  r  r  r  r  r  r  r  r  )re   r  r  rD   rD   rE   r|  \  s    



z'StandaloneHTMLBuilder.copy_static_filesc              
   C  s   zRt td< t| jj}| jjD ] }t| j|}t	|| j
| q$W 5 Q R X W n2 tk
r } zttd| W 5 d}~X Y nX dS )zcopy html_extra_path files.zcopying extra fileszcannot copy extra file %rN)r-   r'   r4   r   r  r  r   r   r  r0   r   r  r  r  )re   r  
extra_pathr  r  rD   rD   rE   r}  p  s    z&StandaloneHTMLBuilder.copy_extra_filesc              
   C  sl   z4t t| jdddd}| j| W 5 Q R X W n2 tk
rf } ztt	d| W 5 d }~X Y nX d S )Nr   r  r   r   z#Failed to write build info file: %r)
r   r   r   r   r}   r   r  r  r  r'   )re   r  r~   rD   rD   rE   r  {  s
    z%StandaloneHTMLBuilder.write_buildinfoc                 C  s   | j r| j   d S r@   )r   cleanupr   rD   rD   rE   r    s    zStandaloneHTMLBuilder.cleanupr   )r   r?   c                   s   t  | | jjr| jr|tjD ] t fdddD sBq&t j	tj
rRq&d d kr`q& d }tj
dddd	}|| jkrt| j| j| |d
< n||d
<  | |  q&dS )zlPick the best candidate for an image and link down-scaled images to
        their high res version.
        c                 3  s   | ]}| kV  qd S r@   rD   )rB   r0  r  rD   rE   rF     s     z<StandaloneHTMLBuilder.post_process_images.<locals>.<genexpr>)scalewidthheightzno-scaled-linkclassesurir   T)ZinternalZrefuriN)r   r  r   html_scaled_image_linkfindallr   imageanyrG   parent	referencer  r   r   r   Zreplace_selfr   )re   r   r  r  r   r  rE   r    s$    


z)StandaloneHTMLBuilder.post_process_imageszIterable[str]c              	   C  s   t | jjt | }zjt| j| j}| jrVt|dd}| j	
|| j W 5 Q R X n&t|d}| j	
|| j W 5 Q R X W n* ttfk
r   |rttd Y nX | j	| d S )Nr   r   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_unicoder   r2  r   r   r  r{   r  r  r'   prune)re   r  ZkeepsearchindexfnftfbrD   rD   rE   r8    s    z"StandaloneHTMLBuilder.load_indexer)r  r   ra   r?   c                 C  sd   | j d k	r`|r`| jj|d d}| jj|i }d|krN| j ||dtd n| j |||| d S )N)baseZnosearchr   )r2  r   r	  ru  ro  feedr/   )re   r  r   ra   rW   ru  rD   rD   rE   r    s    z StandaloneHTMLBuilder.index_pager   )r  r`  r   r?   c                 K  sJ   d|krd|d< | ddkr(|d | t| jj|| |f|d S )NZincludehiddenFZmaxdepthr   r  )ro  rr  r  r"   r   Zget_toctree_for)re   r  r`  r   rD   rD   rE   _get_local_toctree  s    
  z(StandaloneHTMLBuilder._get_local_toctree)r  r?   c                 C  s   t | jt|| j S r@   )r   r   r   r8   r   )re   r  rD   rD   rE   r    s    z%StandaloneHTMLBuilder.get_outfilename)r  r  r?   c                 C  s  ddddd}d }d }d }| j jdkrzz,| j jdd}|rRd	d
 |dD }W q tk
rv   dddddg}Y qX n(| j ddd }|rdd
 |dD }| dd}| D ]D\}	}
t	||	r|r||	r||rt
td|||	 q|	}|
}q|d kr||d< ||d< d S )Nr=   r   )patternr?   c                   s   t  fdddD S )Nc                 3  s   | ]}| kV  qd S r@   rD   )rB   charr  rD   rE   rF     s     zKStandaloneHTMLBuilder.add_sidebars.<locals>.has_wildcard.<locals>.<genexpr>z*?[)r  r  rD   r  rE   has_wildcard  s    z8StandaloneHTMLBuilder.add_sidebars.<locals>.has_wildcard	alabasterr   sidebarsc                 S  s   g | ]}|  qS rD   rw   rB   r   rD   rD   rE   r     s     z6StandaloneHTMLBuilder.add_sidebars.<locals>.<listcomp>r   z
about.htmlznavigation.htmlzrelations.htmlzsearchbox.htmlzdonate.htmlc                 S  s   g | ]}|  qS rD   r  r  rD   rD   rE   r     s     r   z8page %s matches two patterns in html_sidebars: %r and %rcustomsidebar)r   r   r   ro  rv   rz   r   r   rJ   r5   r  r  r'   )re   r  r  r  r  Zmatchedr  Ztheme_default_sidebarshtml_sidebarsr  ZpatsidebarsrD   rD   rE   add_sidebars  sD     

  
z"StandaloneHTMLBuilder.add_sidebarsrO   )r  typr?   c                 C  s   t || j S r@   )r   r   )re   r  r  rD   rD   rE   r    s    z$StandaloneHTMLBuilder.get_target_uri	page.html)r  addctxtemplatenamer  r  r?   c              
     s  j  }  |d< |d< jj|d<  }|ddd }jjrdtjj j	 |d< nd |d< d|fd	d
d	d	dfdd}||d< d	d
dfdd}	|	|d<  fdd|d< 
 | || jjd d < jjd d <  ||| jd |||}
|
r$|
}zt|d dd d|d< W n tk
rV   Y nX zt|d dd d|d< W n tk
r   Y nX zj||}W n` tk
r   ttd  Y d S  tk
r } zttd |f |W 5 d }~X Y nX |s }tt | z.t!|d|d dd }|"| W 5 Q R X W n6 t#k
r } zttd!|| W 5 d }~X Y nX j$r|%d"rtj&d#t'|d" }tt | t(j)* | d S )$Nr  Zcurrent_page_namer   #r`   r   ZpageurlFr=   r   )otheruriresourcebaseurir?   c                   sB   |rd| kr| S |s  | } t|| p*d}|dkr> js>|}|S )Nr   r  )r  r9   allow_sharp_as_current_path)r  r  r  r  r   rD   rE   pathto  s    
z1StandaloneHTMLBuilder.handle_page.<locals>.pathtor  )r   r?   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 )NTr3  r  r   r   F)r   r  r3  r   )r   r   rD   rE   hasdoc!  s    z1StandaloneHTMLBuilder.handle_page.<locals>.hasdocr  c                    s   j  f| S r@   )r  )r   r  re   rD   rE   <lambda>+      z3StandaloneHTMLBuilder.handle_page.<locals>.<lambda>Ztoctreehtml-page-contextr   c                 S  s   | j S r@   r[   )jsrD   rD   rE   r  <  r  )r0  r   c                 S  s   | j S r@   r[   )cssrD   rD   rE   r  E  r  za 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: %rr  xmlcharrefreplace)r   errorszerror writing file %s: %srm  Z_sources)+rX  r   r   html_output_encodingr  rsplithtml_baseurlr   r   r   r  rY  rK  r   rL  r   update_page_contextr   Zemit_firstresultrL   AttributeErrorr   renderUnicodeErrorr  r  r'   rz   r$   r  r7   r   r  r   r   r  
copysourcero  r   r8   r6   r   r	  )re   r  r  r  r  r  r  Zdefault_baseurir  r  Znewtmploutputr~   ro   r  Zsource_namerD   r  rE   r    s    



 

  

$

z!StandaloneHTMLBuilder.handle_page)r  r  r  r  r?   c                 C  s   d S r@   rD   )re   r  r  r  r  rD   rD   rE   r   e  s    z)StandaloneHTMLBuilder.update_page_contextc                 C  s&   | j r| j| j | j| j d S r@   )r2  ry  rz  dump_search_indexdump_inventoryr   rD   rD   rE   r  i  s    z#StandaloneHTMLBuilder.handle_finishzdumping object inventoryc                 C  s   t t| jt| j|  d S r@   )r2   r   r   r   r   INVENTORY_FILENAMEr   r   rD   rD   rE   r  n  s    z$StandaloneHTMLBuilder.dump_inventoryc              
   C  s   t td| j   | j| jj t| j	| j
}| jrnt|d ddd}| j|| j W 5 Q R X n*t|d d}| j|| j W 5 Q R X t|d | W 5 Q R X d S )Nzdumping search index in %sz.tmpr  r   r   wb)r-   r'   r2  labelr  r   r  r   r   r   r  r  r   r   r   osrR   )re   r  r  r  rD   rD   rE   r  r  s    z'StandaloneHTMLBuilder.dump_search_index)N)T)N)r  NN)Vrg   rh   ri   rj   r   formatr'   epilogr<   Zdefault_translator_classr  Zallow_parallelr   r   r(   r   rk   r  r  Zsupported_image_typesZsupported_remote_imagesZsupported_data_uri_imagesr  Zadd_permalinksr  r"  r3  r   Zdownload_supportr   r   r   r   r   r   r   r   r   r   r   r   r   r   propertyr   r  r  r  rb  rx  r~  r  r  r  r-   r  r  r  r  r  r  r{  r  r  r  r  r  r  r  r|  r}  r  r  r  r8  r  r  r  r  r  r  r   r  r  r  __classcell__rD   rD   r   rE   r      s   
 /rP




4    c
r   r   r   r   )r   r   r?   c              	   C  sx   g }|j D ]b}t|tr(||i f q
z|\}}|||f W q
 tk
rj   ttd| Y q
Y q
X q
||_ dS )z?This converts string styled html_css_files to tuple styled one.zinvalid css_file: %r, ignoredN)html_css_filesrG   r=   r   rz   r  r  r'   )r   r   r  r  rW   r   rD   rD   rE   convert_html_css_files  s    

r  c              	   C  sx   g }|j D ]b}t|tr(||i f q
z|\}}|||f W q
 tk
rj   ttd| Y q
Y q
X q
||_ dS )z>This converts string styled html_js_files to tuple styled one.zinvalid js_file: %r, ignoredN)html_js_filesrG   r=   r   rz   r  r  r'   )r   r   r  r  rW   r   rD   rD   rE   convert_html_js_files  s    

r  rH   r   )r   r  r  r  r   r?   c                   s,   | dddd fdd}||d< dS )	zySet up css_tag() template helper.

    .. note:: This set up function is added to keep compatibility with webhelper.
    r  rT   r=   )r  r?   c              	     s   g }t | jD ]4}| j| }|d k	r|| dt|d d q| jdd}t j| j }rr|d| 7 }|d| d dd| d	S )
N="T"r  ?v=zhref="z<link r  z />)	rL   rV   r   r   escaperW   _file_checksumr   r   )r  r   r0  r   r  checksumr   r  rD   rE   css_tag  s    
 z%setup_css_tag_helper.<locals>.css_tagr  Nro  )r   r  r  r  r   r  rD   r  rE   setup_css_tag_helper  s    
r  c                   s,   | ddd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  rl   r=   )r  r?   c              	     s  g }d}t | trt| jD ]f}| j| }|d k	r|dkr@|}q|dkrd|dddd d q|| dt|d d q| jr| jdd}t j	| j }r|d	| 7 }|d
| d n|d
| dd d |rdd
| d| dS d| dS d S )Nr   rd  r   zdata-url_root="Tr  r  r  r  zsrc="z<script r  >z	</script>z<script>)rG   rl   rL   rV   r   r   r  rW   r  r   r   )r  r   rd  r0  r   r  r  r  rD   rE   js_tag  s(    

 z#setup_js_tag_helper.<locals>.js_tagr   Nr  )r   r  r  r  r   r   rD   r  rE   setup_js_tag_helper  s    
r!  )r   rW   r?   c              	   C  sn   d|krdS z4t t| |dd}| jdd}W 5 Q R X W n tk
rV   Y dS X |s`dS t|dS )Nr   r   r   r   08x)r   r   r   readrM   FileNotFoundErrorzlibcrc32)r   rW   ro   r_  rD   rD   rE   r    s    r  c                 C  sb   | d}| d}|r4t|s4|d| dd|d< | d}|r^t|s^|d| dd|d< dS )zSet up relative resource paths.r  r/  z_static/Tr  r.  N)ro  r*   )r   r  r  r  r   r  r/  r.  rD   rD   rE   setup_resource_paths  s    


r'  )r   r?   c                 C  sL   | j jdkrd S | j j}|d kr,ttd|| jjkrHt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   rD   rD   rE   validate_math_renderer  s    r(  c                 C  s   |j dd D ]}tt| j|}t|sNttd| |j 	| qt
| jd t
|d krt| j|g| jkrttd| |j 	| qdS )zCheck html_extra_paths setting.Nz'html_extra_path entry %r does not existr   z0html_extra_path entry %r is placed inside outdir)r  r   normpathr   r  existsr  r  r'   r   
splitdriver   
commonpath)r   r   r  r  rD   rD   rE   validate_html_extra_path  s    
r-  c                 C  s   |j dd D ]}tt| j|}t|sNttd| |j 	| qt
| jd t
|d krt| j|g| jkrttd| |j 	| qdS )z Check html_static_paths setting.Nz(html_static_path entry %r does not existr   z1html_static_path entry %r is placed inside outdir)r  r   r)  r   r  r*  r  r  r'   r   r+  r   r,  )r   r   r  Zstatic_pathrD   rD   rE   validate_html_static_path  s    
r.  c                 C  sB   |j r>tt| j|j s>t|j s>ttd|j  d|_ dS )zCheck html_logo setting.zlogo file %r does not existN)	rE  r   r   r   r  r*   r  r  r'   r   r   rD   rD   rE   validate_html_logo%  s    r0  c                 C  sB   |j r>tt| j|j s>t|j s>ttd|j  d|_ dS )zCheck html_favicon setting.zfavicon file %r does not existN)	rF  r   r   r   r  r*   r  r  r'   r/  rD   rD   rE   validate_html_favicon.  s    r1  )_appr   r?   c                 C  s   |j rttddS )zError on HTML 4.z`HTML 4 is no longer supported by Sphinx. ("html4_writer=True" detected in configuration options)N)html4_writerr#   r&   )r2  r   rD   rD   rE   error_on_html_47  s    r4  rc  c                 C  sR  |  t | ddd | dg d | di d | ddd dtg | d	d
d d | dd dttg | dd dtg | dd dtg | dg d | dg d | dg d | dg d | dd dtg | 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 | d#d dtg | d$d dtg | d%dd | d&dd | d'dd | d(i d | d)d*d | d+dd | d,d-d | d.d dtg | d/i d | d0d"d  | d1dd | d2d"d | d3d4dtd5d4 | d6d d7 | d8dd | d9 | d: | jd;td<d= | jd;t	d<d= | jd;t
d<d= | jd;td<d= | jd;td<d= | jd;td<d= | jd;td<d= | d>t | d:t | d:t | d:t | d? | d@ dAdddBS )CNr   r  r   Zhtml_theme_pathr   rP  c                 S  s   t d| j| jf S )Nz%s %s documentation)r&   r#  r$  r   rD   rD   rE   r  I  r  zsetup.<locals>.<lambda>rQ  c                 S  s   | j S r@   )rP  r   rD   rD   rE   r  K  r  r   rE  rF  r  r  r  r  rD  r  r  r@  TZhtml_permalinksZhtml_permalinks_icon   ¶Zhtml_use_indexr  FrU  rV  rW  z.txtrO  r   r   r   rR  rS  rT  rZ  r  r   r?  Zhtml_secnumber_suffixz. r5  r6  r7  r  r  Zhtml_codeblock_linenos_styleinlinetableZhtml_math_rendererr   r3  r  r  zconfig-initedr   r[   zbuilder-initedzsphinx.ext.mathjaxzsphinx.builders.html.transformsbuiltin)r%  Zparallel_read_safeZparallel_write_safe)Zadd_builderr   Zadd_config_valuer=   rI   r   Z	add_eventconnectr  r  r-  r.  r0  r1  r4  r(  r  r!  r'  Zsetup_extension)r   rD   rD   rE   setup@  s    
 




r:  )rj   
__future__r   r   r  r   rer   r:  r%  r   r   r   typingr   r   r   r	   r
   r   r   urllib.parser   Zdocutils.readers.doctreer   r   Zdocutils.corer   Zdocutils.frontendr   Zdocutils.ior   r   Zdocutils.nodesr   Zdocutils.utilsr   r   r   r   r   r)  Zsphinx.applicationr   Zsphinx.buildersr   Zsphinx.configr   r   Zsphinx.domainsr   r   r   Zsphinx.environmentr   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'   r4  r(   Zsphinx.themingr)   Zsphinx.utilr*   r+   r,   Zsphinx.util.displayr-   r.   Zsphinx.util.docutilsr/   Zsphinx.util.fileutilr0   Zsphinx.util.i18nr1   Zsphinx.util.inventoryr2   Zsphinx.util.matchingr3   r4   r5   Zsphinx.util.osutilr6   r7   r8   r9   Zsphinx.util.tagsr:   Zsphinx.writers.htmlr;   Zsphinx.writers.html5r<   r  	getLoggerrg   r  compilerM  r=   r   ZDOMAIN_INDEX_TYPErA   rS   rT   rl   rm   r   r  r  r  r!  r  r'  r(  r-  r.  r0  r1  r4  r:  rD   rD   rD   rE   <module>   s   $

3       I&			