Enable automatic formatting for `sphinx/ext/viewcode.py`

This commit is contained in:
Adam Turner 2024-12-28 19:16:40 +00:00
parent e66c81b01d
commit 22562d40ee
2 changed files with 48 additions and 31 deletions

View File

@ -415,5 +415,4 @@ exclude = [
"sphinx/domains/python/_object.py", "sphinx/domains/python/_object.py",
"sphinx/domains/rst.py", "sphinx/domains/rst.py",
"sphinx/domains/std/__init__.py", "sphinx/domains/std/__init__.py",
"sphinx/ext/viewcode.py",
] ]

View File

@ -23,7 +23,7 @@ from sphinx.util.nodes import make_refnode
from sphinx.util.osutil import _last_modified_time from sphinx.util.osutil import _last_modified_time
if TYPE_CHECKING: if TYPE_CHECKING:
from collections.abc import Iterable, Iterator from collections.abc import Iterator, Set
from sphinx.application import Sphinx from sphinx.application import Sphinx
from sphinx.builders import Builder from sphinx.builders import Builder
@ -79,11 +79,11 @@ def _get_full_modname(modname: str, attribute: str) -> str | None:
def is_supported_builder(builder: Builder) -> bool: def is_supported_builder(builder: Builder) -> bool:
if builder.format != 'html': return (
return False builder.format == 'html'
if builder.name == 'singlehtml': and builder.name != 'singlehtml'
return False and (not builder.name.startswith('epub') or builder.config.viewcode_enable_epub)
return not (builder.name.startswith('epub') and not builder.config.viewcode_enable_epub) )
def doctree_read(app: Sphinx, doctree: Node) -> None: def doctree_read(app: Sphinx, doctree: Node) -> None:
@ -132,7 +132,7 @@ def doctree_read(app: Sphinx, doctree: Node) -> None:
refname = modname refname = modname
if env.config.viewcode_follow_imported_members: if env.config.viewcode_follow_imported_members:
new_modname = app.emit_firstresult( new_modname = app.emit_firstresult(
'viewcode-follow-imported', modname, fullname, 'viewcode-follow-imported', modname, fullname
) )
if not new_modname: if not new_modname:
new_modname = _get_full_modname(modname, fullname) new_modname = _get_full_modname(modname, fullname)
@ -147,11 +147,14 @@ def doctree_read(app: Sphinx, doctree: Node) -> None:
continue continue
names.add(fullname) names.add(fullname)
pagename = posixpath.join(OUTPUT_DIRNAME, modname.replace('.', '/')) pagename = posixpath.join(OUTPUT_DIRNAME, modname.replace('.', '/'))
signode += viewcode_anchor(reftarget=pagename, refid=fullname, refdoc=env.docname) signode += viewcode_anchor(
reftarget=pagename, refid=fullname, refdoc=env.docname
)
def env_merge_info(app: Sphinx, env: BuildEnvironment, docnames: Iterable[str], def env_merge_info(
other: BuildEnvironment) -> None: app: Sphinx, env: BuildEnvironment, docnames: Set[str], other: BuildEnvironment
) -> None:
if not hasattr(other, '_viewcode_modules'): if not hasattr(other, '_viewcode_modules'):
return return
# create a _viewcode_modules dict on the main environment # create a _viewcode_modules dict on the main environment
@ -199,8 +202,13 @@ class ViewcodeAnchorTransform(SphinxPostTransform):
def convert_viewcode_anchors(self) -> None: def convert_viewcode_anchors(self) -> None:
for node in self.document.findall(viewcode_anchor): for node in self.document.findall(viewcode_anchor):
anchor = nodes.inline('', _('[source]'), classes=['viewcode-link']) anchor = nodes.inline('', _('[source]'), classes=['viewcode-link'])
refnode = make_refnode(self.app.builder, node['refdoc'], node['reftarget'], refnode = make_refnode(
node['refid'], anchor) self.app.builder,
node['refdoc'],
node['reftarget'],
node['refid'],
anchor,
)
node.replace_self(refnode) node.replace_self(refnode)
def remove_viewcode_anchors(self) -> None: def remove_viewcode_anchors(self) -> None:
@ -254,10 +262,13 @@ def collect_pages(app: Sphinx) -> Iterator[tuple[str, dict[str, Any], str]]:
modnames = set(env._viewcode_modules) modnames = set(env._viewcode_modules)
for modname, entry in status_iterator( for modname, entry in status_iterator(
sorted(env._viewcode_modules.items()), sorted(env._viewcode_modules.items()),
__('highlighting module code... '), "blue", __('highlighting module code... '),
len(env._viewcode_modules), 'blue',
app.verbosity, operator.itemgetter(0)): len(env._viewcode_modules),
app.verbosity,
operator.itemgetter(0),
):
if not entry: if not entry:
continue continue
if not should_generate_module_page(app, modname): if not should_generate_module_page(app, modname):
@ -287,9 +298,11 @@ def collect_pages(app: Sphinx) -> Iterator[tuple[str, dict[str, Any], str]]:
for name, docname in used.items(): for name, docname in used.items():
type, start, end = tags[name] type, start, end = tags[name]
backlink = urito(pagename, docname) + '#' + refname + '.' + name backlink = urito(pagename, docname) + '#' + refname + '.' + name
lines[start] = (f'<div class="viewcode-block" id="{name}">\n' lines[start] = (
f'<a class="viewcode-back" href="{backlink}">{link_text}</a>\n' f'<div class="viewcode-block" id="{name}">\n'
+ lines[start]) f'<a class="viewcode-back" href="{backlink}">{link_text}</a>\n'
+ lines[start]
)
lines[min(end, max_index)] += '</div>\n' lines[min(end, max_index)] += '</div>\n'
# try to find parents (for submodules) # try to find parents (for submodules)
@ -299,18 +312,22 @@ def collect_pages(app: Sphinx) -> Iterator[tuple[str, dict[str, Any], str]]:
parent = parent.rsplit('.', 1)[0] parent = parent.rsplit('.', 1)[0]
if parent in modnames: if parent in modnames:
parents.append({ parents.append({
'link': urito(pagename, 'link': urito(
posixpath.join(OUTPUT_DIRNAME, parent.replace('.', '/'))), pagename,
'title': parent}) posixpath.join(OUTPUT_DIRNAME, parent.replace('.', '/')),
parents.append({'link': urito(pagename, posixpath.join(OUTPUT_DIRNAME, 'index')), ),
'title': _('Module code')}) 'title': parent,
})
parents.append({
'link': urito(pagename, posixpath.join(OUTPUT_DIRNAME, 'index')),
'title': _('Module code'),
})
parents.reverse() parents.reverse()
# putting it all together # putting it all together
context = { context = {
'parents': parents, 'parents': parents,
'title': modname, 'title': modname,
'body': (_('<h1>Source code for %s</h1>') % modname + 'body': (_('<h1>Source code for %s</h1>') % modname + '\n'.join(lines)),
'\n'.join(lines)),
} }
yield pagename, context, 'page.html' yield pagename, context, 'page.html'
@ -330,14 +347,15 @@ def collect_pages(app: Sphinx) -> Iterator[tuple[str, dict[str, Any], str]]:
stack.pop() stack.pop()
html.append('</ul>') html.append('</ul>')
stack.append(modname + '.') stack.append(modname + '.')
relative_uri = urito(posixpath.join(OUTPUT_DIRNAME, 'index'), relative_uri = urito(
posixpath.join(OUTPUT_DIRNAME, modname.replace('.', '/'))) posixpath.join(OUTPUT_DIRNAME, 'index'),
posixpath.join(OUTPUT_DIRNAME, modname.replace('.', '/')),
)
html.append(f'<li><a href="{relative_uri}">{modname}</a></li>\n') html.append(f'<li><a href="{relative_uri}">{modname}</a></li>\n')
html.append('</ul>' * (len(stack) - 1)) html.append('</ul>' * (len(stack) - 1))
context = { context = {
'title': _('Overview: module code'), 'title': _('Overview: module code'),
'body': (_('<h1>All modules for which code is available</h1>') + 'body': (_('<h1>All modules for which code is available</h1>') + ''.join(html)),
''.join(html)),
} }
yield posixpath.join(OUTPUT_DIRNAME, 'index'), context, 'page.html' yield posixpath.join(OUTPUT_DIRNAME, 'index'), context, 'page.html'