John Snow <js...@redhat.com> writes:

> Create a compat module that handles sphinx cross-version compatibility
> issues. For the inaugural function, add a nested_parse() helper that
> handles differences in line number tracking for nested directive body
> parsing.
>
> Spoilers: there are more cross-version hacks to come throughout the
> series.
>
> Signed-off-by: John Snow <js...@redhat.com>
> ---
>  docs/sphinx/compat.py | 33 +++++++++++++++++++++++++++++++++
>  1 file changed, 33 insertions(+)
>  create mode 100644 docs/sphinx/compat.py
>
> diff --git a/docs/sphinx/compat.py b/docs/sphinx/compat.py
> new file mode 100644
> index 00000000000..792aca10e39
> --- /dev/null
> +++ b/docs/sphinx/compat.py
> @@ -0,0 +1,33 @@
> +"""
> +Sphinx cross-version compatibility goop
> +"""
> +
> +from docutils.nodes import Element
> +
> +from sphinx.util.docutils import SphinxDirective, switch_source_input
> +from sphinx.util.nodes import nested_parse_with_titles
> +
> +
> +def nested_parse(directive: SphinxDirective, content_node: Element) -> None:
> +    """
> +    This helper preserves error parsing context across sphinx versions.
> +    """
> +
> +    # necessary so that the child nodes get the right source/line set
> +    content_node.document = directive.state.document
> +
> +    try:
> +        # Modern sphinx (6.2.0+) supports proper offsetting for
> +        # nested parse error context management
> +        nested_parse_with_titles(
> +            directive.state,
> +            directive.content,
> +            content_node,
> +            content_offset=directive.content_offset,
> +        )
> +    except TypeError:
> +        # No content_offset argument. Fall back to SSI method.
> +        with switch_source_input(directive.state, directive.content):
> +            nested_parse_with_titles(
> +                directive.state, directive.content, content_node
> +            )

The function wraps around sphinx.util.nodes.nested_parse_with_titles().
Would calling it nested_parse_with_titles() reduce readers' cognitive
load at call sites?

Please do not misinterpret my question as a demand.  It's really just a
question :)


Reply via email to