a
    0aG                     @   s  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mZ ddlmZ ddlm	Z	m
Z
mZ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 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+m,Z, ddl-m.Z.m/Z/m0Z0 ddl1m2Z2 ddl3m4Z4 ddl5m6Z6 ddl7m8Z8m9Z9 ddl:m;Z; ddl<m=Z=m>Z> ddl?m@Z@ ddlAmBZB ddlCmDZDmEZEmFZFmGZGmHZH ddlImJZJmKZK ddlLmMZM ddlNmOZO ddlPmQZQ dd lRmSZSmTZTmUZU dd!lVmWZWmXZXmYZYmZZZ dd"l[m\Z\ dd#l]m^Z^m_Z_ eJ r:dd$l`maZa d%Zbnd&Zbd'ZceEdeeZfegd(Zhe
eid)d*d+ZjG d,d- d-eiZkG d.d/ d/eiZlG d0d1 d1ZmG d2d3 d3e)Zne'e,dd4d5d6Zoe'e,dd4d7d8Zpe'eieieedd9d:d;Zqe'eieieedd9d<d=Zre'eieieedd9d>d?Zse'dd@dAdBZte'e,dd4dCdDZue'e,dd4dEdFZve'e,dd4dGdHZwe'e,dd4dIdJZxG dKdL dLZyey Zze'e,dd4dMdNZ{ddl|Z}ddl~Z!ddlZ!e'eeie
f d@dOdPZdS )Qz
    sphinx.builders.html
    ~~~~~~~~~~~~~~~~~~~~

    Several HTML builders.

    :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS.
    :license: BSD, see LICENSE for details.
    N)datetime)path)	IOAnyDictIterableIteratorListSetTupleType)quote)nodes)publish_parts)OptionParser)DocTreeInputStringOutput)Node)relative_path)__display_version__package_dir)version_info)Sphinx)Builder)ENUMConfig)DomainIndex
IndexEntry)ImageAdapter)IndexEntries)TocTree)ConfigError
ThemeError)PygmentsBridge)___)js_index)HTMLThemeFactory)isurlloggingmd5progress_messagestatus_iterator)is_html5_writer_availablenew_document)
copy_asset)format_date)InventoryFile)DOTFILESMatcherpatmatch)copyfile	ensurediros_pathrelative_uri)Tags)HTMLTranslator
HTMLWriter)HTML5TranslatorTFzobjects.invz[
]+)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   <lib/python3.9/site-packages/sphinx/builders/html/__init__.py	<genexpr>K       z"get_stable_hash.<locals>.<genexpr>)
isinstancedictrA   listitemstuplesortedr+   strencodeZ	hexdigest)r>   rD   rD   rE   rA   B   s
    
rA   c                   @   sZ   e Zd ZU dZdZeeef ed< dZeed< dZ	e
ed< ddeee
e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
attributesfilenamepriority  rS   )rR   argsrS   rQ   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)rN   __new__rR   rS   rQ   
setdefault)clsrR   rS   rV   rQ   selfrD   rD   rE   r\   Z   s    zStylesheet.__new__)__name__
__module____qualname____doc__rQ   r   rN   __annotations__rR   rS   intr   r\   rD   rD   rD   rE   rP   O   s   
rP   c                   @   sT   e Zd ZU dZdZeeef ed< dZeed< dZ	e
ed< d
ee
e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).
    NrQ   rR   rS   rT   )rR   rS   rQ   r?   c                 K   s"   t | |}||_||_||_|S r@   )rN   r\   rR   rS   rQ   )r^   rR   rS   rQ   r_   rD   rD   rE   r\   t   s
    zJavaScript.__new__)rT   )r`   ra   rb   rc   rQ   r   rN   rd   rR   rS   re   r\   rD   rD   rD   rE   rf   i   s
   
rf   c                   @   sd   e Zd ZdZeed dddZddg feee	e
 ddddZd ed	d
dZe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.
    fr?   c              
   C   s   zx|  }|d  dksJ |d ds0J |d dsBJ t }|d  d  |_|d  d  |_|W S  ty } zt	t
d| |W Y d }~n
d }~0 0 d S )	Nr   z# Sphinx build info version 1   zconfig:    ztags: rZ   zbuild info file is broken: %r)	readlinesrstrip
startswithrg   splitstripconfig_hash	tags_hash	Exception
ValueErrorr&   )r^   ri   lines
build_infoexcrD   rD   rE   load   s    zBuildInfo.loadN)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>   rG   z&BuildInfo.__init__.<locals>.<dictcomp>)rq   rr   filterrA   rM   )r_   ry   rz   r{   valuesrD   rD   rE   __init__   s    
zBuildInfo.__init__)otherr?   c                 C   s   | j |j ko| j|jkS r@   )rq   rr   )r_   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
)writerq   rr   r_   ri   rD   rD   rE   dump   s    
zBuildInfo.dump)r`   ra   rb   rc   classmethodr   rx   r   r:   r	   rN   r   boolr   r   rD   rD   rD   rE   rg   }   s    rg   c                	       s@  e Zd ZU dZdZdZedZdZdZ	dZ
dZeZeed< dZdZg dZdZdZdZdZdZd	ZdZd	ZdZd
Zeed< g Zee ee!e" ee eee# f  e$f  ed< e%d
d fddZ&d
dddZ'e(dddZ)edddZ*edddZ+e ee,f dddZ-d
dddZ.d
dddZ/d
ddd Z0eed
d!d"d#Z1d
dd$d%Z2eed
d!d&d'Z3e4e!e5j6 dd(d)Z7e4edd*d+Z8e9e dd,d-Z:ee dd.d/Z;e<e,eef d0d1d2Z=e>e d
d3d4d5Z?eeee,eef d6d7d8Z@ee5jAd
d9d:d;ZBee5jAd
d9d<d=ZCd
dd>d?ZDeEed@d
ddAdBZFd
ddCdDZGeEedEd
ddFdGZHd
ddHdIZId
ddJdKZJd
ddLdMZKd
ddNdOZLd
ddPdQZMd
ddRdSZNd
ddTdUZOe,d
dVdWdXZPe,d
dVdYdZZQd
dd[d\ZRd
dd]d^ZSd
dd_d`ZTd
ddadbZUd
ddcddZVd
ddedfZWe<d
dgdhdiZXeYe d
d3djdkZZee5jAed
dldmdnZ[dee$eedodpdqZ\eedrdsdtZ]ee,d
dudvdwZ^deeedxdydzZ_dee,eeed
d|d}d~Z`eee,ed
dddZad
dddZbeEedd
dddZcd
dddZd  ZeS )StandaloneHTMLBuilderz&
    Builds standalone HTML docs.
    htmlz!The HTML pages are in %(outdir)s.Tz.htmlindexer_format)zimage/svg+xmlz	image/pngz	image/gifz
image/jpegzsearchindex.jsFNimgpathdomain_indicesappr?   c                    s   t  | g | _g | _d S r@   )superr   	css_filesscript_files)r_   r   	__class__rD   rE   r      s    zStandaloneHTMLBuilder.__init__)r?   c                 C   s   |   | _d| _i | _d | _|   |   |   |   | 	dd}|d urV|| _
| 	dd}|d urr|| _n| j
| _| 	dd| _d S )N_imagesfile_suffixr   link_suffix	use_index)create_build_inforv   imagedir
secnumberscurrent_docnameinit_templatesinit_highlighterinit_css_filesinit_js_filesget_builder_config
out_suffixr   r   )r_   html_file_suffixhtml_link_suffixrD   rD   rE   init   s     
zStandaloneHTMLBuilder.initc                 C   s   t | j| jdgS )Nr   )rg   ry   rz   r_   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   joinry   language)rB   dirr   rD   rE   
<listcomp>   s   z>StandaloneHTMLBuilder._get_translations_js.<locals>.<listcomp>localer   r   zshare/sphinx/locale)	ry   Zlocale_dirsr   r   r   r   sysprefixisfile)r_   Z
candidatesjsfilerD   r   rE   _get_translations_js   s    



z*StandaloneHTMLBuilder._get_translations_jsc                 C   s0   | j jd ur| j jS | jr(| jddS dS d S )NthemerX   zdefault.css)ry   
html_styler   
get_configr   rD   rD   rE   _get_style_filename   s
    z)StandaloneHTMLBuilder._get_style_filenamec                 C   s   | j j| j jfS r@   )ry   
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   Zcreater   copytheme_optionsZcreate_template_bridge	templatesr   )r_   Ztheme_factoryZ	themenameZthemeoptionsrD   rD   rE   r   	  s    

z$StandaloneHTMLBuilder.init_templatesc                 C   s   | j jd ur| j j}n| jr.| jddd}nd}td|| _| jrV| jddd }nd }|d urtd|| _| jjddd	d
 nd | _d S )Nr   pygments_styleZnonesphinxr   Zpygments_dark_stylepygments_dark.cssz(prefers-color-scheme: dark)Zpygments_dark_css)Zmediaid)	ry   r   r   r   r$   highlighterdark_highlighterr   add_css_file)r_   styleZ
dark_stylerD   rD   rE   r     s     
z&StandaloneHTMLBuilder.init_highlighterc                 C   s   g | _ | jddd | j|  dd | jjj D ]\}}| j|fi | q0| ddD ]&\}}|dd | j|fi | qXd S )Npygments.css   rU   r   r   rS      )r   r   r   r   registryr   r]   r_   rR   attrsrD   rD   rE   r   (  s    z$StandaloneHTMLBuilder.init_css_files)rR   kwargsr?   c                 K   s0   d|vrt d|}| jt|fi | d S N://_static)	posixpathr   r   appendrP   r_   rR   r   rD   rD   rE   r   4  s    z"StandaloneHTMLBuilder.add_css_filec                 C   s   g | _ | jddddd | jddd | jddd | jd	dd | jjjD ]\}}| j|fi | qL| d
dD ]&\}}|dd | j|fi | qt| jjr| 	 r| d d S )Nzdocumentation_options.jsZdocumentation_optionsr|   r   )r   data_url_rootrS   z	jquery.jsrU   zunderscore.jszdoctools.jsjs_filesr   rS   r   translations.js)
r   add_js_filer   r   r   r   r]   ry   r   r   r   rD   rD   rE   r   :  s    z#StandaloneHTMLBuilder.init_js_filesc                 K   s4   |rd|vrt d|}| jt|fi | d S r   )r   r   r   r   rf   r   rD   rD   rE   r   L  s    z!StandaloneHTMLBuilder.add_js_filec                 C   s   t r| jjrtS tS d S r@   )html5_readyry   html4_writerr;   r=   r   rD   rD   rE   default_translator_classR  s    z.StandaloneHTMLBuilder.default_translator_classc                 C   s`   |  dd}|d u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   rZ   r   rj   Zmathjax)r   rJ   r   r   html_inline_math_rendererslenremove)r_   r}   Z	renderersrD   rD   rE   math_renderer_nameY  s    
z(StandaloneHTMLBuilder.math_renderer_namec           	      c   s  zht t| jd}t|}W d    n1 s40    Y  | j|krftd | j	j
E d H  W d S W nD ty } zttd| W Y d }~nd }~0  ty   Y n0 | jr| j }nd}| j	j
D ]}|| j	jvrtd| |V  q| |}zt|}W n ty    d}Y n0 z`tt| j	||}||krtd|t|t||tt| j	| |V  W q ty   Y q0 qd S )N
.buildinfoz)[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))openr   r   outdirrg   rx   rv   loggerdebugenvZ
found_docsrt   warningr&   OSErrorr   Znewest_template_mtimeall_docsget_outfilenamegetmtimers   maxdoc2pathr   Zutcfromtimestamp)	r_   fpZ	buildinforw   Ztemplate_mtimedocnameZ
targetnameZtargetmtimeZsrcmtimerD   rD   rE   get_outdated_docsm  sP    (


$



z'StandaloneHTMLBuilder.get_outdated_docsc                 C   s   | j j| j j S r@   )ry   html_extra_pathhtml_static_pathr   rD   rD   rE   get_asset_paths  s    z%StandaloneHTMLBuilder.get_asset_paths)noder?   c                 C   s@   |du rddiS t d}|| t| }td|tddi|dS )	z$Utility: Render a lone doctree node.Nfragmentr|   z<partial node>doctreeZoutput_encodingZunicode)Zreader_namewriterZsource_classZsettings_overridessource)r/   r   r<   r   r   )r_   r   docr   rD   rD   rE   render_partial  s    
z$StandaloneHTMLBuilder.render_partial)docnamesr?   c                 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t| jjD ]h}| jj| }|jD ]P}d|j|jf }t|tr||vrq|| \}	}
|	r| j|||	|
f qq| jj}|d urDt|p4t d| jjd| _!nd | _!| jj"pVd	}| jj#pdd	}t$|szt%&|}t$|st%&|}| j' | _(g }| j)r|d
t ddt df | jD ],\}}}}|j*r|||j+d	|j*f qt| j,| _-t| j.| _/| j0| jj1t23d	| jj4| jj5| j!| jj6| jj7| jj7| jj8| jj9| jj:| jj;| jj<| jj=| jj>| jj?| j@| jA| j,| jj| j.tBtC| D || jg ||tEo| jjF d| _G| jHr| jGIdd | jHJ| jKL D  | jGI| jjM d S )Nr   )IndexBuilderenT)defaults
componentsZread_config_filesz%s-%sz	%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_sphinxZ
has_sourceZshow_sourceZsourcelink_suffixr   r   r   r   r   sphinx_versionZsphinx_version_tupler   rellinksbuilderparentslogofaviconZhtml5_doctypec                 s   s   | ]\}}d | |fV  qdS )Ztheme_NrD   )rB   keyvalrD   rD   rE   rF     s   z8StandaloneHTMLBuilder.prepare_writing.<locals>.<genexpr>)Nindexersearchsphinx.searchr   ry   html_search_languager   r   html_search_optionshtml_search_scorerload_indexerr<   	docwriterr   settingsZget_default_valuesdocsettingsr   html_compact_listsZcompact_listsr   html_domain_indicesrM   Zdomainsindicesr}   rH   rJ   Zgenerater   html_last_updated_fmtr1   r%   r  	html_logohtml_faviconr)   r   basenameZcollect_relations	relationsr   Z	shortname	localnamer   _script_filesr   
_css_filesr  r  return_codes_resubr  r  r  r  html_use_opensearch
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   r   globalcontextr   updateZget_optionsr   rK   html_context)r_   r   r   langZindices_configZdomain_namedomainindexcls	indexnamecontentcollapseZlufmtr  r  r	  Z_contentZ	_collapserD   rD   rE   prepare_writing  s    












 z%StandaloneHTMLBuilder.prepare_writing)r   bodymetatagsr?   c                 C   s`  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	y   d}Y n0 |r|d rzJ| ||d | |	|d  d d}||d |d d	td
f W n t	y   d}Y n0 |r|d rz2|| ||d | |	|d  d d W n t	yj   Y n0 | 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	  rj   r[   )linkr[   NnextrZ   PZpreviousr   r|   Fr   )r  prevr=  r[   metar9  r:  r	  
sourcenametocZdisplay_tocZpage_source_suffix)r/  r!  getr   titlesZget_relative_urir   r   r%   KeyErrorpopreverse
longtitlesr   r   ry   r,  r.  metadatar!   Zget_toc_forZtoc_num_entries)r_   r   r9  r:  r?  r=  r  r	  ZrelatedrD  
title_noder[   Zsource_suffixrA  r@  Zself_tocrB  rD   rD   rE   get_doc_context  st    "
"

z%StandaloneHTMLBuilder.get_doc_context)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 )Nutf-8encodingr   
_downloadsr   )	event_arg)r   r  r  r   Ztoc_secnumbersrC  r   Ztoc_fignumbersZ
fignumbersr9   get_target_urir   Zdlpathr   r  r   Zassemble_partspartsZ
clean_metarK  handle_page)r_   r   r   Zdestinationr9  r:  ctxrD   rD   rE   	write_doci  s    

zStandaloneHTMLBuilder.write_docc                 C   sT   t | || j| _| | | jj|}|r>| |d nd}| 	||| d S )Nr[   r|   )
r9   rQ  r   r   post_process_imagesr   rH  rC  r   
index_page)r_   r   r   rJ  r[   rD   rD   rE   write_doc_serializedz  s
    
z*StandaloneHTMLBuilder.write_doc_serializedc                 C   s|   | j | j | j | j | j | j | j | j | j | j | j | j | j | j | j | j	 | 
  d S r@   )finish_tasksadd_taskgen_indicesgen_pages_from_extensionsgen_additional_pagescopy_image_filescopy_download_filescopy_static_filescopy_extra_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)ZeventsemitrS  )r_   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 r  zsearch.htmlzopensearch r   zopensearch.xmlZ
opensearch)outfilename)ry   html_additional_pagesrK   r   inforS  r  r'  r   r   r   )r_   ri  rk  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 )rZ   N)r   )rB   r%   ZsubitemsrD   rD   rE   rF     s   z7StandaloneHTMLBuilder.write_genindex.<locals>.<genexpr>)genindexentriesZgenindexcountsZsplit_indexz	genindex Trm  r   zgenindex-split.htmlzgenindex-allzgenindex.html)r  entriescountrr  z	genindex-zgenindex-single.html)r    r   Zcreate_indexr   sumry   html_split_indexr   rp  rS  zip)	r_   r   ZindexcountsZ_krs  Zgenindexcontextr  rt  rT  rD   rD   rE   re    s4    z$StandaloneHTMLBuilder.write_genindexc                 C   sF   | j D ]:\}}}}|j||d}tj|d dd | ||d qd S )N)Z
indextitler6  Zcollapse_indexrl  Trm  zdomainindex.html)r   r"  r   rp  rS  )r_   r5  r4  r6  r7  ZindexcontextrD   rD   rE   rf    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 ]v}| j | }z&tt| j|t| j| j	| W qL ty } z(ttdt| j|| W Y d }~qLd }~0 0 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   srcdirrs   r   r   )r_   rz  srcdesterrrD   rD   rE   r^    s     


z&StandaloneHTMLBuilder.copy_image_filesc                    s   t t 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y } z(ttd	t j|| W Y d }~qVd }~0 0 qVd S )
Nrh   c                    s   t  j| S r@   )r   r}  )ri   r   rD   rE   
to_relpath  s    z=StandaloneHTMLBuilder.copy_download_files.<locals>.to_relpathrO  zcopying downloadable files... rx  ry  rZ   z$cannot copy downloadable file %r: %s)rN   r   Zdlfilesr7   r   r   r   r-   r&   r   r   r|  dirnamer6   r}  r   r   r   )r_   r  r~  r  r  rD   r   rE   r_    s    

z)StandaloneHTMLBuilder.copy_download_filesc                 C   s   t t| jddd }|| j  W d   n1 s<0    Y  | jrt t| jddd }|| j  W d   n1 s0    Y  dS )z!create a style file for pygments.r   r   wNr   )r   r   r   r   r   r   Zget_stylesheetr   r   rD   rD   rE   create_pygments_style_file  s
    .z0StandaloneHTMLBuilder.create_pygments_style_filec                 C   s2   | j jdur.|  }|r.t|t| jdd dS )z(Copy a JavaScript file for translations.Nr   r   )ry   r   r   r6   r   r   r   r_   r   rD   rD   rE   copy_translation_js   s    z)StandaloneHTMLBuilder.copy_translation_jsc              
   C   sl   | j du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)	r  hasattrr  r6   r   r   r   r   Zget_js_stemmer_rawcoder  rD   rD   rE   copy_stemmer_js  s    
 
z%StandaloneHTMLBuilder.copy_stemmer_js)rj  r?   c              	   C   s^   t td ddd}| jrZ| j d d d D ],}tt|dt| jdt|| j	|d q,d S )NrR   errorr?   c                 S   s   t td| | d S Nz1Failed to copy a file in html_static_file: %s: %rr   r   r&   rR   r  rD   rD   rE   onerror  s    
z>StandaloneHTMLBuilder.copy_theme_static_files.<locals>.onerrorZstaticr   )excludedrj  rendererr  )
rN   rs   r   Zget_theme_dirsr0   r   r   r   r3   r   )r_   rj  r  entryrD   rD   rE   copy_theme_static_files  s    z-StandaloneHTMLBuilder.copy_theme_static_filesc              	   C   s`   t td ddd}t| jjdg }| jjD ].}tt| j	|t| j
d||| j|d q,d S )Nr  c                 S   s   t td| | d S r  r  r  rD   rD   rE   r    s    
z=StandaloneHTMLBuilder.copy_html_static_files.<locals>.onerrorz**/.*r   )rj  r  r  )rN   rs   r4   ry   exclude_patternsr   r0   r   r   confdirr   r   )r_   rj  r  r  r  rD   rD   rE   copy_html_static_files  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   )ry   r  r)   r0   r   r   r  r   r   rD   rD   rE   copy_html_logo)  s    z$StandaloneHTMLBuilder.copy_html_logoc                 C   s:   | j jr6t| j js6tt| j| j jt| jd d S r  )ry   r  r)   r0   r   r   r  r   r   rD   rD   rE   copy_html_favicon.  s    z'StandaloneHTMLBuilder.copy_html_faviconc              
   C   s   zt td tt| jd | j }| jd urF|	| j
  |   |   |   | | | | |   |   W d    n1 s0    Y  W n4 ty } zttd| W Y d }~n
d }~0 0 d S )Nzcopying static filesr   zcannot copy static file %r)r,   r&   r7   r   r   r   r/  r   r  r0  Zcontext_for_searchtoolr  r  r  r  r  r  r  r   r   r   )r_   rj  r  rD   rD   rE   r`  3  s    



*z'StandaloneHTMLBuilder.copy_static_filesc              
   C   s   zft tdF t| jj}| jjD ] }t| j|}t	|| j
| q$W d   n1 sZ0    Y  W n4 ty } zttd| W Y d}~n
d}~0 0 dS )zcopy html_extra_path files.zcopying extra filesNzcannot copy extra file %r)r,   r&   r4   ry   r  r   r   r   r  r0   r   r   r   r   )r_   r  
extra_pathr  r  rD   rD   rE   ra  G  s    2z&StandaloneHTMLBuilder.copy_extra_filesc              
   C   s~   zDt t| jdd}| j| W d    n1 s80    Y  W n4 tyx } ztt	d| W Y d }~n
d }~0 0 d S )Nr   r  z#Failed to write build info file: %r)
r   r   r   r   rv   r   r   r   r   r&   )r_   r   rw   rD   rD   rE   rb  R  s
    .z%StandaloneHTMLBuilder.write_buildinfoc                 C   s   | j r| j   d S r@   )r   cleanupr   rD   rD   rE   r  Y  s    zStandaloneHTMLBuilder.cleanup)r   r?   c                    s   t | | | jjr| jr|tjD ] t fdddD sDq&n t j	tj
rVq&nd d v rdq& d }tj
dddd	}|| jv 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   | ]}| v V  qd S r@   rD   )rB   r  r   rD   rE   rF   f  rG   z<StandaloneHTMLBuilder.post_process_images.<locals>.<genexpr>)ZscalewidthZheightzno-scaled-linkclassesurir|   T)ZinternalZrefuriN)r   rV  ry   html_scaled_image_linkfindallr   ZimageanyrH   parent	referencer{  r   r   r   Zreplace_selfr   )r_   r   r  r  rD   r  rE   rV  ^  s$    


z)StandaloneHTMLBuilder.post_process_imagesc              	   C   s   t | jjt | }zt| j| j}| jrjt|dd }| j	
|| j W d    q1 s^0    Y  n:t|d }| j	
|| j W d    n1 s0    Y  W n( ttfy   |rttd Y n0 | j	| d S )NrL  rM  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   r  rx   r   r   rt   r   r   r&   prune)r_   r   ZkeepsearchindexfnftfbrD   rD   rE   r  {  s    02z"StandaloneHTMLBuilder.load_indexer)ri  r   r[   r?   c                 C   sd   | j d ur`|r`| jj|d d}| jj|i }d|v rN| j ||dtd n| j |||| d S )N)baseZnosearchr|   )r  r   r   rI  rC  Zfeedr/   )r_   ri  r   r[   rR   rI  rD   rD   rE   rW    s    z StandaloneHTMLBuilder.index_page)r   r7  r   r?   c                 K   sN   d|vrd|d< | ddkr(|d | t| jj|| |fi |d S )NZincludehiddenFZmaxdepthr|   r   )rC  rF  r   r!   r   Zget_toctree_for)r_   r   r7  r   rD   rD   rE   _get_local_toctree  s    
z(StandaloneHTMLBuilder._get_local_toctree)ri  r?   c                 C   s   t | jt|| j S r@   )r   r   r   r8   r   )r_   ri  rD   rD   rE   r     s    z%StandaloneHTMLBuilder.get_outfilename)ri  rT  r?   c                 C   s  t tddd}d }d }d }| jjdkrrz,| jjdd}|rRdd |d	D }W q tyn   g d
}Y q0 n(| jddd }|rdd |d	D }| 	dd}|
 D ]D\}	}
t||	r|r||	r||rttd|||	 q|	}|
}q|d u r||d< ||d< d S )N)patternr?   c                    s   t  fdddD S )Nc                 3   s   | ]}| v V  qd S r@   rD   )rB   charr  rD   rE   rF     rG   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   rp   rB   r}   rD   rD   rE   r     rG   z6StandaloneHTMLBuilder.add_sidebars.<locals>.<listcomp>,)z
about.htmlznavigation.htmlzrelations.htmlzsearchbox.htmlzdonate.htmlc                 S   s   g | ]}|  qS rD   r  r  rD   rD   rE   r     rG   r   z8page %s matches two patterns in html_sidebars: %r and %rcustomsidebar)rN   r   r   r}   ry   rC  ro   rs   r   r   rK   r5   r   r   r&   )r_   ri  rT  r  r  Zmatchedr  Ztheme_default_sidebarshtml_sidebarsr  ZpatsidebarsrD   rD   rE   add_sidebars  s:    

z"StandaloneHTMLBuilder.add_sidebars)r   typr?   c                 C   s   t || j S r@   )r   r   )r_   r   r  rD   rD   rE   rQ    s    z$StandaloneHTMLBuilder.get_target_uri	page.html)ri  addctxtemplatenamern  rP  r?   c              
      s  j  }  |d< |d< jj|d<  }|ddd }jjrdtjj j	 |d< nd |d< d|ft
tt
t
d	fd
d}||d< t
tdfdd}	|	|d<  fdd|d<  | || jjd d < jjd d <  ||| jd |||}
|
r$|
}z tt|d dd d|d< W n tyX   Y n0 z tt|d dd d|d< W n ty   Y n0 zj||}W n` ty   ttd  Y d S  ty } z"ttd |f |W Y d }~n
d }~0 0 |s  }t!t"#| zDt$|d|d dd}|%| W d    n1 sZ0    Y  W n8 t&y } zttd|| W Y d }~n
d }~0 0 j'r|(d rt"j)d!t*|d  }t!t"#| t+j,- | d S )"Nri  Zcurrent_page_namerN  #rZ   r   ZpageurlF)otheruriresourcebaseurir?   c                    sB   |rd| v r| S |s  | } t|| p*d}|dkr> js>|}|S )Nr   r  )rQ  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v 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}   r   rD   rE   hasdoc  s    z1StandaloneHTMLBuilder.handle_page.<locals>.hasdocr  c                     s   j  fi | S r@   )r  )r   ri  r_   rD   rE   <lambda>   rG   z3StandaloneHTMLBuilder.handle_page.<locals>.<lambda>Ztoctreehtml-page-contextr   c                 S   s   | j S r@   rU   )jsrD   rD   rE   r    rG   )r  r   c                 S   s   | j S r@   rU   )cssrD   rD   rE   r    rG   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)rN  errorszerror writing file %s: %srA  Z_sources).r/  r   ry   html_output_encodingrQ  rsplithtml_baseurlr   r   r   rN   r   r  r0  r#  r   r$  r   update_page_contextr   Zemit_firstresultrM   rJ   AttributeErrorr   ZrenderUnicodeErrorr   r   r&   rs   r#   r   r7   r   r  r   r   r   
copysourcerC  r   r8   r6   r   r   )r_   ri  r  r  rn  rP  rT  Zdefault_baseurir  r  Znewtmploutputrw   ri   r  Zsource_namerD   r  rE   rS    s~    






  

.(

z!StandaloneHTMLBuilder.handle_page)ri  r  rT  rP  r?   c                 C   s   d S r@   rD   )r_   ri  r  rT  rP  rD   rD   rE   r  :  s    z)StandaloneHTMLBuilder.update_page_contextc                 C   s&   | j r| j| j | j| j d S r@   )r  rY  rZ  dump_search_indexdump_inventoryr   rD   rD   rE   rc  >  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  C  s    z$StandaloneHTMLBuilder.dump_inventoryc              	   C   s   t td| j   | j| jj t| j	| j
}| jrt|d ddd }| j|| j W d    q1 sv0    Y  n>t|d d }| j|| j W d    n1 s0    Y  t|d | W d    n1 s0    Y  d S )Nzdumping search index in %sz.tmpr  rL  rM  wb)r,   r&   r  Zlabelr  r   r   r   r   r   r  r  r   r   r   osreplace)r_   r  r  r  rD   rD   rE   r  G  s    0.z'StandaloneHTMLBuilder.dump_search_index)T)N)r  NN)fr`   ra   rb   rc   r}   formatr&   epilogr  Zallow_parallelr   r   r'   r   r   rd   r  r  Zsupported_image_typesZsupported_remote_imagesZsupported_data_uri_imagesr  Zadd_permalinksr  r  r  r   Zdownload_supportr   rN   r   r	   r   r   r   r   r   r   r   r   rg   r   r   r   r   r   r   r   r   r   r   r   propertyr   ZNodeVisitorr   r   r   r   r   r   r   r
   r8  rK  ZdocumentrU  rX  rd  r,   r[  r\  r]  re  rf  r^  r_  r  r  r  r  r  r  r  r`  ra  rb  r  rV  r   r  rW  r  r   r  rQ  rS  r  rc  r  r  __classcell__rD   rD   r   rE   r      s   
0	.mP


	
4  a
r   )r   ry   r?   c              	   C   sv   g }|j D ]`}t|tr(||i f q
z|\}}|||f W q
 tyh   ttd| Y q
Y q
0 q
||_ dS )z?This converts string styled html_css_files to tuple styled one.zinvalid css_file: %r, ignoredN)html_css_filesrH   rN   r   rs   r   r   r&   )r   ry   r  r  rR   r   rD   rD   rE   convert_html_css_filesV  s    

r  c              	   C   sv   g }|j D ]`}t|tr(||i f q
z|\}}|||f W q
 tyh   ttd| Y q
Y q
0 q
||_ dS )z>This converts string styled html_js_files to tuple styled one.zinvalid js_file: %r, ignoredN)html_js_filesrH   rN   r   rs   r   r   r&   )r   ry   r  r  rR   r   rD   rD   rE   convert_html_js_filesg  s    

r  )r   ri  r  rj  r   r?   c                    s*   | d tt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  )r  r?   c              	      sf   g }t | jD ]0}| j| }|d ur|d|t|df  q|d | jdd  dd| S )N%s="%s"Tz	href="%s"r  z<link %s />rl  )rM   rQ   r   r   escaperR   r   )r  r   r  r~   r  rD   rE   css_tag  s    
z%setup_css_tag_helper.<locals>.css_tagr  N)rC  rP   rN   )r   ri  r  rj  r   r  rD   r  rE   setup_css_tag_helperx  s    
	r  c                    s*   | d tt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  )r  r?   c              	      s   g }d}t | trt| jD ]^}| j| }|d ur|dkr@|}q|dkr`|d ddd  q|d|t|df  q| jr|d | jdd  n|d | dd  |rd	d
||f S d| S d S )Nr|   r9  r   zdata-url_root="%s"Tr  r  zsrc="%s"z<script %s>%s</script>rl  z<script>%s</script>)	rH   rf   rM   rQ   r   r   r  rR   r   )r  r   r9  r  r~   r  rD   rE   js_tag  s"    

z#setup_js_tag_helper.<locals>.js_tagr  N)rC  rf   rN   )r   ri  r  rj  r   r  rD   r  rE   setup_js_tag_helper  s    
r  c                 C   sv   | d}| d}|r6t|s6|d| dd|d< n||d< | d}|rjt|sj|d| dd|d< n||d< d	S )
zSet up relative resource paths.r  r  z_static/Tr  Zfavicon_urlr  Zlogo_urlN)rC  r)   )r   ri  r  rj  r   r  r  r  rD   rD   rE   setup_resource_paths  s    


r  r   c                 C   sN   | j jdkrd S | j j}|d u r.ttdn|| jjv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}   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   ry   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   ry   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)	r  r   r   r   r  r)   r   r   r&   r   ry   rD   rD   rE   validate_html_logo  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_favicon setting.zfavicon file %r does not existN)	r  r   r   r   r  r)   r   r   r&   r  rD   rD   rE   validate_html_favicon  s    r  c                   @   s   e Zd Zdd ZdS )_stable_repr_objectc                 C   s   dS )Nz<object>rD   r   rD   rD   rE   __repr__  s    z_stable_repr_object.__repr__N)r`   ra   rb   r  rD   rD   rD   rE   r    s   r  c                 C   s>   |j }|tu rdS ttd |s.d|_dS t||_dS )z0Migrate html_add_permalinks to html_permalinks*.Nzrhtml_add_permalinks has been deprecated since v3.5.0. Please use html_permalinks and html_permalinks_icon instead.F)	html_add_permalinksUNSETr   r   r&   html_permalinksr   r  html_permalinks_icon)r   ry   r  rD   rD   rE   migrate_html_add_permalinks  s    r  c                 C   sP  |  t | ddd | dg d | di d | ddd dtg | d	d
d d | dd d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t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tg | d%d dtg | 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   r(  c                 S   s   t d| j| jf S )Nz%s %s documentation)r%   r  r  r   rD   rD   rE   r  %  rG   zsetup.<locals>.<lambda>r)  c                 S   s   | j S r@   )r(  r   rD   rD   rE   r  '  rG   r   r  r  r  r  r   r   r  r  ro  r  Tr  r  r     ¶Zhtml_use_indexrv  Fr,  r-  r.  z.txtr'  r|   r   r   r*  r+  r1  r  rL  r  Zhtml_secnumber_suffixz. r  r  r  r  r  Zhtml_codeblock_linenos_styleZinlinetableZhtml_math_rendererr   r   rg  r  zconfig-initedr   rU   zbuilder-initedzsphinx.ext.mathjaxzsphinx.builders.html.transformsZbuiltin)r  Zparallel_read_safeZparallel_write_safe)Zadd_builderr   Zadd_config_valuerN   rJ   r  r   Z	add_eventZconnectr  r  r  r  r  r  r  r  r  r  r  Zsetup_extension)r   rD   rD   rE   setup  s    





r   )rc   r   r  r   rer   r   r   typingr   r   r   r   r   r	   r
   r   r   urllib.parser   Zdocutilsr   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.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+   r,   r-   Zsphinx.util.docutilsr.   r/   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;   r<   Zsphinx.writers.html5r=   r   r  Z	getLoggerr`   r   compiler%  rN   rA   rP   rf   rg   r   r  r  r  r  r  r  r  r  r  r  r  r  r  Zsphinxcontrib.serializinghtmlsphinxcontribZsphinx.builders.dirhtmlZsphinx.builders.singlehtmlr   rD   rD   rD   rE   <module>   s   
,

.       2#		