Sphinx Substitution Extensions
Extensions for Sphinx which allow substitutions within code blocks.
Installation
Sphinx Substitution Extensions is compatible with Sphinx 8.2.0+ using Python 3.11+.
$ pip install Sphinx-Substitution-Extensions
rST setup
Add the following to conf.py to enable the extension:
"""Configuration for Sphinx."""
extensions = ["sphinxcontrib.spelling"] # Example existing extensions
extensions += ["sphinx_substitution_extensions"]
Set the following variable in conf.py to define substitutions:
"""Configuration for Sphinx."""
rst_prolog = """
.. |release| replace:: 0.1
.. |author| replace:: Eleanor
"""
This will replace |release| in the new directives with 0.1, and |author| with Eleanor.
Using substitutions in rST documents
code-block
This adds a :substitutions: option to Sphinx’s built-in code-block directive.
.. code-block:: shell
:substitutions:
echo "|author| released version |release|"
Inline :substitution-code:
:substitution-code:`echo "|author| released version |release|"`
substitution-download
:substitution-download:`|author|'s manuscript <|author|_manuscript.txt>`
External hyperlinks
Enable substitutions in external hyperlink targets in conf.py:
"""Configuration for Sphinx."""
substitutions_hyperlink_targets_enabled = True
Then substitutions are applied to hyperlink targets:
Download version |release| from the tarball_.
.. _tarball: https://example.com/releases/v|release|.tar.gz
The setting enables hyperlink-target substitutions throughout the project, but only targets containing a defined substitution are changed. To limit a substitution to one page, define it in that page instead of in rst_prolog:
.. |tarball-release| replace:: 0.8.5
Download the tarball_.
.. _tarball: https://example.com/releases/v|tarball-release|.tar.gz
To limit the substitution to one link on that page, use a unique substitution name, such as tarball-release above, only in that link’s target. Other hyperlink targets are left unchanged.
literalinclude
This adds :content-substitutions: and :path-substitutions: options to Sphinx’s built-in literalinclude directive.
Replace substitutions in the content of the included file:
.. literalinclude:: path/to/file.txt
:content-substitutions:
Replace substitutions in the file path:
.. literalinclude:: path/to/|author|_file.txt
:path-substitutions:
include
This adds :content-substitutions: and :path-substitutions: options to docutils’ built-in include directive.
Replace substitutions in the included source content before it is parsed:
.. include:: path/to/file.rst
:content-substitutions:
Replace substitutions in the file path:
.. include:: path/to/|author|_file.txt
:path-substitutions:
image
This adds a :path-substitutions: option to Sphinx’s built-in image directive.
Replace substitutions in the image path:
.. image:: path/to/|author|_diagram.png
:path-substitutions:
:alt: Diagram
MyST Markdown setup
Add sphinx_substitution_extensions to extensions in conf.py to enable the extension:
"""Configuration for Sphinx."""
extensions = ["myst_parser"] # Example existing extensions
extensions += ["sphinx_substitution_extensions"]
Set the following variables in conf.py to define substitutions:
"""Configuration for Sphinx."""
myst_enable_extensions = ["substitution"]
myst_substitutions = {
"release": "0.1",
"author": "Eleanor",
}
This will replace |release| in the new directives with 0.1, and |author| with Eleanor.
Substitutions can also be defined or overridden for an individual Markdown document in its frontmatter:
---
myst:
substitutions:
release: "0.2"
author:
name: Talya
---
```{code-block} shell
:substitutions:
echo "|author.name| released version |release|"
```
Enabling substitutions by default
By default, you need to explicitly add the :substitutions: flag to code-block directives, :content-substitutions: or :path-substitutions: flags to literalinclude and include directives, and :path-substitutions: to image directives.
If you want substitutions to be applied by default without needing these flags, you can set the following in conf.py:
"""Configuration for Sphinx."""
substitutions_default_enabled = True
When this is enabled:
All code-block directives will have substitutions applied automatically
All literalinclude directives will have both content and path substitutions applied automatically
All include directives will have both content and path substitutions applied automatically
All image directives will have path substitutions applied automatically
You can disable substitutions for specific directives when the default is enabled:
.. code-block:: shell
:nosubstitutions:
echo "This |will| not be substituted"
.. literalinclude:: path/to/file.txt
:nocontent-substitutions:
.. literalinclude:: path/to/|literal|_file.txt
:nopath-substitutions:
.. include:: path/to/|literal|_file.txt
:nocontent-substitutions:
:nopath-substitutions:
.. image:: path/to/|literal|_diagram.png
:nopath-substitutions:
Using substitutions in MyST Markdown
code-block
This adds a :substitutions: option to Sphinx’s built-in code-block directive.
```{code-block} bash
:substitutions:
echo "|author| released version |release|"
```
As well as using |author|, you can also use {{author}}. This will respect the value of myst_sub_delimiters as set in conf.py.
Inline :substitution-code:
{substitution-code}`echo "|author| released version |release|"`
substitution-download
{substitution-download}`|author|'s manuscript <|author|_manuscript.txt>`
literalinclude
This adds :content-substitutions: and :path-substitutions: options to Sphinx’s built-in literalinclude directive.
Replace substitutions in the content of the included file:
```{literalinclude} path/to/file.txt
:content-substitutions:
```
Replace substitutions in the file path:
```{literalinclude} path/to/|author|_file.txt
:path-substitutions:
```
include
This adds a :path-substitutions: option to docutils’ built-in include directive.
Replace substitutions in the file path:
```{include} path/to/|author|_file.txt
:path-substitutions:
```
image
This adds a :path-substitutions: option to Sphinx’s built-in image directive.
Replace substitutions in the image path:
```{image} path/to/|author|_diagram.png
:path-substitutions:
:alt: Diagram
```
Nested substitutions
myst_substitutions supports nested dictionaries and lists, which are flattened using dot notation.
Important: Substitution keys cannot contain dots (.), as dots are reserved for nested access notation. For example, {"key.with.dots": "value"} raises an exception.
Nested dictionaries:
"""Configuration for Sphinx."""
myst_substitutions = {
"app": {
"name": "MyApp",
"version": "1.0.0",
},
}
Usage in Markdown:
```{code-block} bash
:substitutions:
echo "Application: |app.name| version |app.version|"
```
Lists with index access:
"""Configuration for Sphinx."""
myst_substitutions = {
"platforms": ["Linux", "Windows", "macOS"],
}
Usage:
```{code-block} bash
:substitutions:
echo "First platform: |platforms.0|"
echo "Second platform: |platforms.1|"
```
Nested lists of dictionaries:
"""Configuration for Sphinx."""
myst_substitutions = {
"releases": [
{"version": "1.0", "codename": "Alpha"},
{"version": "2.0", "codename": "Beta"},
],
}
Usage:
```{code-block} bash
:substitutions:
echo "First release: |releases.0.version| (|releases.0.codename|)"
echo "Second release: |releases.1.version| (|releases.1.codename|)"
```
Complex nested structures:
"""Configuration for Sphinx."""
myst_substitutions = {
"project": {
"name": "MyProject",
"contributors": [
{"name": "Alice", "role": "dev"},
{"name": "Bob", "role": "docs"},
],
},
}
Usage:
```{code-block} bash
:substitutions:
echo "Project: |project.name|"
echo "Developer: |project.contributors.0.name|"
echo "Documentation: |project.contributors.1.name|"
```
Credits
ClusterHQ Developers
This package is largely inspired by code written for Flocker by ClusterHQ. Developers of the relevant code include, at least, Jon Giddy and Tom Prince.
Contributing
See CONTRIBUTING.rst.
Metadata
Release files for sphinx-substitution-extensions 2026.10.9
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| sphinx_substitution_extensions-2026.10.9.tar.gz | 47.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| sphinx_substitution_extensions-2026.10.9-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 59.4 kB
Release files / sphinx_substitution_extensions-2026.10.9.tar.gz
| Download URL | sphinx_substitution_extensions-2026.10.9.tar.gz |
|---|---|
| Size | 47.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
8778fbb7816199238a3cd2df3acb01e9d99f792a9c9d9456f03704e79285d5ad
|
|
BLAKE2b-256 checksum How to use checksums |
d2e51572723fdaa9a721c55bc6bc0c19f26d806d050c5d71a07fa159ec648c6f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 9, 2026.
Transparency logRelease files / sphinx_substitution_extensions-2026.10.9-py3-none-any.whl
| Download URL | sphinx_substitution_extensions-2026.10.9-py3-none-any.whl |
|---|---|
| Size | 12.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
e1b9365f462eaaaca50dd80f21504255345a08ce980a8b10c35be5afd972e73d
|
|
BLAKE2b-256 checksum How to use checksums |
94b91187b721eadfee3819f310c6c5bd449b6244738f2988068a537b40a13173
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 9, 2026.
Transparency log