3

T'íc:5ã@s$dZddlZddlZddlZddlmZddlmZmZm	Z	m
Z
mZmZm
Z
mZddlmZddlmZmZddlZddlmZddlmZdd	lmZdd
lmZddlmZddlmZdd
l m!Z!m"Z"ddl#m$Z$ddl%m&Z&ddl'm(Z(m)Z)m*Z*ddl+m,Z,e)j-e.ƒZ/dZ0Gdd„deƒZ1ee2e2ee2dœdd„Z3ee4dœdd„Z5eeddœdd„Z6eee
e2eddœdd „Z7eee2dd!œd"d#„Z8Gd$d%„d%e&ƒZ9eeeeeed&œd'd(„Z:ee2ee2d)œd*d+„Z;ee2e4d)œd,d-„Z<ee	e
e2ee2efe2fddfd.œd/d0„Z=eee2efd.œd1d2„Z>dS)3z7Add links to module code in Python object descriptions.éN)Úpath)ÚAnyÚDictÚ	GeneratorÚIterableÚOptionalÚSetÚTupleÚcast)Únodes)ÚElementÚNode)Úaddnodes)ÚSphinx)ÚBuilder)ÚStandaloneHTMLBuilder)ÚRemovedInSphinx50Warning)ÚBuildEnvironment)Ú_Ú__)ÚModuleAnalyzer)ÚSphinxPostTransform)Úget_full_modnameÚloggingÚstatus_iterator)Úmake_refnodeZ_modulesc@seZdZdZdS)Úviewcode_anchorzÞNode for viewcode anchors.

    This node will be processed in the resolving phase.
    For viewcode supported builders, they will be all converted to the anchors.
    For not supported builders, they will be removed.
    N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__©r!r!ú5/tmp/pip-build-gk9425m9/sphinx/sphinx/ext/viewcode.pyrsr)ÚappÚmodnameÚ	attributeÚreturncCspy
t||ƒStk
r,tjd||ƒdStk
rj}z$tjtjƒjƒƒtjd||ƒdSd}~XnXdS)NzDidn't find %s in %sz0viewcode can't import %s, failed with error "%s")rÚAttributeErrorÚloggerÚverboseÚ	ExceptionÚ	tracebackÚ
format_excÚrstrip)r#r$r%Úer!r!r"Ú_get_full_modname(s
r/)Úbuilderr&cCs>|jdkrdS|jdkrdS|jjdƒr6|jjr6dSdSdS)NÚhtmlFZ
singlehtmlZepubT)ÚformatÚnameÚ
startswithÚconfigÚviewcode_enable_epub)r0r!r!r"Úis_supported_builder:s

r7)r#Údoctreer&cs$ˆjj‰tˆdƒsiˆ_tttttdœ‡‡fdd„}xêt|jtj	ƒƒD]Ö}|j
dƒdkrZqFtƒ}xº|D]²}t|tj
ƒsxqf|j
dƒ}|j
dƒ}|}ˆjjrºˆjd	||ƒ}	|	s¶tˆ||ƒ}	|	}|sÀqf|j
dƒ}|||ˆj|ƒsÜqf||kræqf|j|ƒtjt|jd
dƒƒ}
|t|
|ˆjd7}qfWqFWdS)
NÚ_viewcode_modules)r$ÚfullnameÚdocnameÚrefnamer&csȈjj|dƒ}|dkrdSˆjd|ƒ}|dkrrytj|ƒ}|jƒWntk
rbdˆj|<dSX|j}|j}n|\}}|dksŽ|d|kr¤||i|f}|ˆj|<|\}	}}
}	||krÄ||
|<dSdS)NFzviewcode-find-sourcerT)	r9ÚgetÚemit_firstresultrZ
for_moduleZ	find_tagsr*ÚcodeÚtags)r$r:r;r<ÚentryZ	code_tagsZanalyzerr?r@rÚused)r#Úenvr!r"Úhas_tagJs,


zdoctree_read.<locals>.has_tagÚdomainÚpyÚmoduler:zviewcode-follow-importedÚ.ú/)Ú	reftargetÚrefidÚrefdoc)r0rCÚhasattrr9ÚstrÚboolÚlistÚfindallrÚdescr=ÚsetÚ
isinstanceZdesc_signaturer5Ú viewcode_follow_imported_membersr>r/r;ÚaddÚ	posixpathÚjoinÚOUTPUT_DIRNAMEÚreplacer)r#r8rDZobjnodeÚnamesZsignoder$r:r<Znew_modnameÚpagenamer!)r#rCr"Údoctree_readEs<






r])r#rCÚdocnamesÚotherr&c	Cs’t|dƒsdSt|dƒsi|_xn|jjƒD]`\}}||jkrH||j|<q*|j|r*|j|d}x(|djƒD]\}}||krn|||<qnWq*WdS)Nr9é)rMr9Úitems)	r#rCr^r_r$rArBr:r;r!r!r"Úenv_merge_info…s



rb)r#rCr;r&cCs~t|diƒ}xlt|jƒƒD]\\}}|dkr,q|\}}}}	x&t|ƒD]}
||
|krB|j|
ƒqBWt|ƒdkr|j|ƒqWdS)Nr9Fr)ÚgetattrrPraÚpopÚlen)r#rCr;Úmodulesr$rAr?r@rBr<r:r!r!r"Ú
env_purge_doc˜srgc@s@eZdZdZdZeddœdd„Zddœdd	„Zddœd
d„ZdS)ÚViewcodeAnchorTransformz;Convert or remove viewcode_anchor nodes depends on builder.édN)Úkwargsr&cKs"t|jjƒr|jƒn|jƒdS)N)r7r#r0Úconvert_viewcode_anchorsÚremove_viewcode_anchors)Úselfrjr!r!r"Úrun¬s
zViewcodeAnchorTransform.run)r&cCsZxT|jjtƒD]D}tjdtdƒdgd}t|jj|d|d|d|ƒ}|j	|ƒqWdS)NÚz[source]z
viewcode-link)ÚclassesrLrJrK)
ÚdocumentrQrrÚinlinerrr#r0Zreplace_self)rmÚnodeÚanchorZrefnoder!r!r"rk²s
z0ViewcodeAnchorTransform.convert_viewcode_anchorscCs*x$t|jjtƒƒD]}|jj|ƒqWdS)N)rPrqrQrÚparentÚremove)rmrsr!r!r"rl¹sz/ViewcodeAnchorTransform.remove_viewcode_anchors)	rrrr Zdefault_priorityrrnrkrlr!r!r!r"rh¨s
rh)r#rCrsÚcontnoder&cCs:|ddkr6tjdtƒt|j|d|d|d|ƒSdS)NZreftypeZviewcodezTviewcode extension is no longer use pending_xref node. Please update your extension.rLrJrK)ÚwarningsÚwarnrrr0)r#rCrsrwr!r!r"Úmissing_reference¾srz)r#r$r&cCs@|jd|ƒ}|rdSytj|ƒ\}}|Stk
r:dSXdS)z"Get module filename for *modname*.zviewcode-find-sourceN)r>rZget_module_sourcer*)r#r$Zsource_infoÚfilenameÚsourcer!r!r"Úget_module_filenameÊsr}cCszt||ƒ}|dkrdStt|jƒ}|jddƒ|j}tj|jd|ƒ}ytj	|ƒtj	|ƒkr^dSWnt
k
rtYnXdS)z*Check generation of module page is needed.NTrHrIz	_modules/F)r}r
rr0rZZ
out_suffixrrXZoutdirÚgetmtimeÚIOError)r#r$Zmodule_filenamer0ÚbasenameZ
page_filenamer!r!r"Úshould_generate_module_page×s
r)r#r&c
csB|jj}t|dƒsdSt|jƒs$dS|jj}|jj}t|jƒ}xòtt	|jj
ƒƒtdƒdt|jƒ|j
dd„ƒD]À\}}|s~qnt||ƒsŠqn|\}}}	}
tjt|jddƒƒ}|jjd#krÀ|jj}nd}|j||dd
}
|
jƒ}|djdƒ\}}|d|g|dd…<t|ƒd}xr|	j
ƒD]f\}}||\}}}|||ƒd|
d|}d||tdƒf||||<|t||ƒd7<qWg}|}xPd|krÚ|jddƒd}||krŒ|j||tjt|jddƒƒƒ|dœƒqŒW|j||tjtdƒƒtdƒdœƒ|jƒ||tdƒ|dj|ƒdœ}||dfVqnW|s>dSdg}dg}x¬t	|ƒD] }|j|d$ƒr‚|j|dƒ|jdƒn@|jƒx(|j|d%ƒs²|jƒ|jdƒqŒW|j|dƒ|jd|tjtdƒtjt|jddƒƒƒ|fƒqTW|jdt|ƒdƒtd ƒtd!ƒdj|ƒd"œ}tjtdƒ|dfVdS)&Nr9zhighlighting module code... ZbluecSs|dS)Nrr!)Úxr!r!r"Ú<lambda>ûszcollect_pages.<locals>.<lambda>rHrIÚpython3ÚdefaultÚnoneÚpythonF)Zlinenosrz<pre>éú#zM<div class="viewcode-block" id="%s"><a class="viewcode-back" href="%s">%s</a>z[docs]z</div>)ÚlinkÚtitleÚindexzModule codez<h1>Source code for %s</h1>Ú
)Úparentsr‹Úbodyz	page.htmlroz<ul>z</ul>z<li><a href="%s">%s</a></li>
zOverview: module codez0<h1>All modules for which code is available</h1>)r‹r)r„r…r†éÿÿÿÿr)r0rCrMr7ÚhighlighterZget_relative_urirSr9rÚsortedrarreÚ	verbosityrrWrXrYrZr5Zhighlight_languageZhighlight_blockÚ
splitlinesÚsplitrÚminÚrsplitÚappendÚreverser4rd)r#rCr‘ZuritoÚmodnamesr$rAr?r@rBr<r\ÚlexerZhighlightedÚlinesZbeforeÚafterZmaxindexr3r;ÚtypeÚstartÚendZbacklinkrŽruÚcontextr1Ústackr!r!r"Ú
collect_pagesìs’






r£cCs’|jdddƒ|jdddƒ|jdddƒ|jdtƒ|jdtƒ|jdtƒ|jd	tƒ|jd
tƒ|jdƒ|jdƒ|jt	ƒt
jd
ddœS)NZviewcode_importFr6rUTzdoctree-readzenv-merge-infoz
env-purge-doczhtml-collect-pageszmissing-referencezviewcode-find-sourcezviewcode-follow-importedrˆ)ÚversionZenv_versionZparallel_read_safe)Zadd_config_valueÚconnectr]rbrgr£rzZ	add_eventZadd_post_transformrhÚsphinxZ__display_version__)r#r!r!r"ÚsetupPs


r§)?r rWr+rxÚosrÚtypingrrrrrrr	r
ZdocutilsrZdocutils.nodesrr
r¦rZsphinx.applicationrZsphinx.buildersrZsphinx.builders.htmlrZsphinx.deprecationrZsphinx.environmentrZ
sphinx.localerrZ
sphinx.pycoderZ!sphinx.transforms.post_transformsrZsphinx.utilrrrZsphinx.util.nodesrÚ	getLoggerrr(rYrrNr/rOr7r]rbrgrhrzr}rr£r§r!r!r!r"Ú<module>sF(
	@

,d