[3.13] GH-121970: Extract `implementation_detail` into a new extension (GH-129663) (#129739)

(cherry picked from commit 4d56c40440)
This commit is contained in:
Adam Turner 2025-02-06 17:30:03 +00:00 committed by GitHub
parent b5eed8c80e
commit aaf0581d2a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 57 additions and 32 deletions

View file

@ -27,6 +27,7 @@ extensions = [
'c_annotations', 'c_annotations',
'changes', 'changes',
'glossary_search', 'glossary_search',
'implementation_detail',
'lexers', 'lexers',
'misc_news', 'misc_news',
'pyspecific', 'pyspecific',

View file

@ -0,0 +1,47 @@
"""Support for marking up implementation details."""
from __future__ import annotations
from typing import TYPE_CHECKING
from docutils import nodes
from sphinx.locale import _ as sphinx_gettext
from sphinx.util.docutils import SphinxDirective
if TYPE_CHECKING:
from sphinx.application import Sphinx
from sphinx.util.typing import ExtensionMetadata
class ImplementationDetail(SphinxDirective):
has_content = True
final_argument_whitespace = True
# This text is copied to templates/dummy.html
label_text = sphinx_gettext("CPython implementation detail:")
def run(self):
self.assert_has_content()
content_nodes = self.parse_content_to_nodes()
# insert our prefix at the start of the first paragraph
first_node = content_nodes[0]
first_node[:0] = [
nodes.strong(self.label_text, self.label_text),
nodes.Text(" "),
]
# create a new compound container node
cnode = nodes.compound("", *content_nodes, classes=["impl-detail"])
self.set_source_info(cnode)
return [cnode]
def setup(app: Sphinx) -> ExtensionMetadata:
app.add_directive("impl-detail", ImplementationDetail)
return {
"version": "1.0",
"parallel_read_safe": True,
"parallel_write_safe": True,
}

View file

@ -71,31 +71,6 @@ def gh_issue_role(typ, rawtext, text, lineno, inliner, options={}, content=[]):
return [refnode], [] return [refnode], []
# Support for marking up implementation details
class ImplementationDetail(SphinxDirective):
has_content = True
final_argument_whitespace = True
# This text is copied to templates/dummy.html
label_text = sphinx_gettext('CPython implementation detail:')
def run(self):
self.assert_has_content()
pnode = nodes.compound(classes=['impl-detail'])
content = self.content
add_text = nodes.strong(self.label_text, self.label_text)
self.state.nested_parse(content, self.content_offset, pnode)
content = nodes.inline(pnode[0].rawsource, translatable=True)
content.source = pnode[0].source
content.line = pnode[0].line
content += pnode[0].children
pnode[0].replace_self(nodes.paragraph(
'', '', add_text, nodes.Text(' '), content, translatable=False))
return [pnode]
class PyCoroutineMixin(object): class PyCoroutineMixin(object):
def handle_signature(self, sig, signode): def handle_signature(self, sig, signode):
ret = super(PyCoroutineMixin, self).handle_signature(sig, signode) ret = super(PyCoroutineMixin, self).handle_signature(sig, signode)
@ -288,7 +263,6 @@ def patch_pairindextypes(app, _env) -> None:
def setup(app): def setup(app):
app.add_role('issue', issue_role) app.add_role('issue', issue_role)
app.add_role('gh', gh_issue_role) app.add_role('gh', gh_issue_role)
app.add_directive('impl-detail', ImplementationDetail)
app.add_builder(PydocTopicsBuilder) app.add_builder(PydocTopicsBuilder)
app.add_object_type('opcode', 'opcode', '%s (opcode)', parse_opcode_signature) app.add_object_type('opcode', 'opcode', '%s (opcode)', parse_opcode_signature)
app.add_object_type('pdbcommand', 'pdbcmd', '%s (pdb command)', parse_pdb_command) app.add_object_type('pdbcommand', 'pdbcmd', '%s (pdb command)', parse_pdb_command)

View file

@ -1,12 +1,6 @@
This file is not an actual template, but used to add some This file is not an actual template, but used to add some
texts in extensions to sphinx.pot file. texts in extensions to sphinx.pot file.
In extensions/pyspecific.py:
{% trans %}CPython implementation detail:{% endtrans %}
{% trans %}Deprecated since version {deprecated}, will be removed in version {removed}{% endtrans %}
{% trans %}Deprecated since version {deprecated}, removed in version {removed}{% endtrans %}
In extensions/availability.py: In extensions/availability.py:
{% trans %}Availability{% endtrans %} {% trans %}Availability{% endtrans %}
@ -27,6 +21,15 @@ In extensions/c_annotations.py:
{% trans %}Return value: New reference.{% endtrans %} {% trans %}Return value: New reference.{% endtrans %}
{% trans %}Return value: Borrowed reference.{% endtrans %} {% trans %}Return value: Borrowed reference.{% endtrans %}
In extensions/implementation_detail.py:
{% trans %}CPython implementation detail:{% endtrans %}
In extensions/changes.py:
{% trans %}Deprecated since version {deprecated}, will be removed in version {removed}{% endtrans %}
{% trans %}Deprecated since version {deprecated}, removed in version {removed}{% endtrans %}
In docsbuild-scripts, when rewriting indexsidebar.html with actual versions: In docsbuild-scripts, when rewriting indexsidebar.html with actual versions:
{% trans %}in development{% endtrans %} {% trans %}in development{% endtrans %}