Transform

sphinx.application.Sphinx

    def add_transform(self, transform: Type[Transform]) -> None:
        """Register a Docutils transform to be applied after parsing.

        Add the standard docutils :class:`Transform` subclass *transform* to
        the list of transforms that are applied after Sphinx parses a reST
        document.

        :param transform: A transform class

        .. list-table:: priority range categories for Sphinx transforms
           :widths: 20,80

           * - Priority
             - Main purpose in Sphinx
           * - 0-99
             - Fix invalid nodes by docutils. Translate a doctree.
           * - 100-299
             - Preparation
           * - 300-399
             - early
           * - 400-699
             - main
           * - 700-799
             - Post processing. Deadline to modify text and referencing.
           * - 800-899
             - Collect referencing and referenced nodes. Domain processing.
           * - 900-999
             - Finalize and clean up.

        refs: `Transform Priority Range Categories`__

        __ https://docutils.sourceforge.io/docs/ref/transforms.html#transform-priority-range-categories
        """  # NOQA
        self.registry.add_transform(transform)

app.registry.transforms

default_priority

transform

010

sphinx.transforms.ApplySourceWorkaround

010

sphinx.transforms.ExtraTranslatableNodes

010

sphinx.transforms.i18n.PreserveTranslatableMessages

020

sphinx.transforms.i18n.Locale

100

sphinx.transforms.compact_bullet_list.RefOnlyBulletListTransform

200

sphinx.transforms.UnreferencedFootnotesDetector

210

sphinx.transforms.DefaultSubstitutions

210

sphinx.transforms.MoveModuleTargets

210

sphinx.transforms.HandleCodeBlocks

210

sphinx.transforms.AutoNumbering

210

sphinx.transforms.AutoIndexUpgrader

261

sphinx.transforms.SortIds

500

sphinx.transforms.DoctestTransform

619

sphinx.domains.citation.CitationDefinitionTransform

619

sphinx.domains.citation.CitationReferenceTransform

700

sphinx.builders.latex.transforms.FootnoteDocnameUpdater

750

sphinx.transforms.SphinxSmartQuotes

850

sphinx.transforms.references.SphinxDanglingReferences

850

sphinx.transforms.references.SphinxDomains

880

sphinx.transforms.DoctreeReadEvent

880

sphinx.versioning.UIDTransform

999

sphinx.transforms.FilterSystemMessages

999

sphinx.transforms.ManpageLink

999

sphinx.transforms.i18n.RemoveTranslatableInline

reading

sphinx.io

def read_doc(app: "Sphinx", env: BuildEnvironment, filename: str) -> nodes.document:
    """Parse a document and convert to doctree."""
    # set up error_handler for the target document
    error_handler = UnicodeDecodeErrorHandler(env.docname)
    codecs.register_error('sphinx', error_handler)  # type: ignore

    reader = SphinxStandaloneReader()
    reader.setup(app) # 👈 setup transforms
    filetype = get_filetype(app.config.source_suffix, filename)
    parser = app.registry.create_source_parser(app, filetype)
    if parser.__class__.__name__ == 'CommonMarkParser' and parser.settings_spec == ():
        # a workaround for recommonmark
        #   If recommonmark.AutoStrictify is enabled, the parser invokes reST parser
        #   internally.  But recommonmark-0.4.0 does not provide settings_spec for reST
        #   parser.  As a workaround, this copies settings_spec for RSTParser to the
        #   CommonMarkParser.
        parser.settings_spec = RSTParser.settings_spec

    pub = Publisher(reader=reader,
                    parser=parser,
                    writer=SphinxDummyWriter(),
                    source_class=SphinxFileInput,
                    destination=NullOutput())
    pub.process_programmatic_settings(None, env.settings, None)
    pub.set_source(source_path=filename)
    pub.publish() # 👈 apply transforms
    return pub.document
class SphinxStandaloneReader(SphinxBaseReader):
    """
    A basic document reader for Sphinx.
    """

    def setup(self, app: "Sphinx") -> None:
        self.transforms = self.transforms + app.registry.get_transforms() # 👈 app.registry.transforms
        super().setup(app)