From 87c6335b469e938a322cb349811f92ccc88b06e7 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Sat, 30 Mar 2019 19:47:58 +0900 Subject: [PATCH] Move transforms for citations to sphinx.domains.citation --- CHANGES | 2 ++ doc/extdev/deprecated.rst | 10 ++++++ sphinx/application.py | 1 + sphinx/domains/citation.py | 66 +++++++++++++++++++++++++++++++++++ sphinx/transforms/__init__.py | 53 ++++++++-------------------- 5 files changed, 93 insertions(+), 39 deletions(-) create mode 100644 sphinx/domains/citation.py diff --git a/CHANGES b/CHANGES index 1acf3ba1c..d9d5afd0e 100644 --- a/CHANGES +++ b/CHANGES @@ -36,6 +36,8 @@ Deprecated * ``sphinx.ext.autodoc.importer.MockLoader`` * ``sphinx.ext.autodoc.importer.mock()`` * ``sphinx.ext.autosummary.autolink_role()`` +* ``sphinx.transforms.CitationReferences`` +* ``sphinx.transforms.SmartQuotesSkipper`` * ``sphinx.util.docfields.DocFieldTransformer.preprocess_fieldtypes()`` * ``sphinx.util.node.find_source_node()`` * ``sphinx.util.i18n.find_catalog()`` diff --git a/doc/extdev/deprecated.rst b/doc/extdev/deprecated.rst index 99abc56eb..9c759f507 100644 --- a/doc/extdev/deprecated.rst +++ b/doc/extdev/deprecated.rst @@ -141,6 +141,16 @@ The following is a list of deprecated interfaces. - 4.0 - ``sphinx.ext.autosummary.AutoLink`` + * - ``sphinx.transforms.CitationReferences`` + - 2.1 + - 4.0 + - ``sphinx.domains.citation.CitationReferenceTransform`` + + * - ``sphinx.transforms.SmartQuotesSkipper`` + - 2.1 + - 4.0 + - ``sphinx.domains.citation.CitationDefinitionTransform`` + * - ``sphinx.util.docfields.DocFieldTransformer.preprocess_fieldtypes()`` - 2.1 - 4.0 diff --git a/sphinx/application.py b/sphinx/application.py index aee9f4410..651563052 100644 --- a/sphinx/application.py +++ b/sphinx/application.py @@ -77,6 +77,7 @@ builtin_extensions = ( 'sphinx.config', 'sphinx.domains.c', 'sphinx.domains.changeset', + 'sphinx.domains.citation', 'sphinx.domains.cpp', 'sphinx.domains.javascript', 'sphinx.domains.math', diff --git a/sphinx/domains/citation.py b/sphinx/domains/citation.py new file mode 100644 index 000000000..7ac2944dd --- /dev/null +++ b/sphinx/domains/citation.py @@ -0,0 +1,66 @@ +""" + sphinx.domains.citation + ~~~~~~~~~~~~~~~~~~~~~~~ + + The citation domain. + + :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +from typing import cast + +from docutils import nodes + +from sphinx import addnodes +from sphinx.transforms import SphinxTransform +from sphinx.util.nodes import copy_source_info + +if False: + # For type annotation + from typing import Any, Dict # NOQA + from sphinx.application import Sphinx # NOQA + + +class CitationDefinitionTransform(SphinxTransform): + """Mark citation definition labels as not smartquoted.""" + default_priority = 619 + + def apply(self, **kwargs): + # type: (Any) -> None + for node in self.document.traverse(nodes.citation): + label = cast(nodes.label, node[0]) + label['support_smartquotes'] = False + + +class CitationReferenceTransform(SphinxTransform): + """ + Replace citation references by pending_xref nodes before the default + docutils transform tries to resolve them. + """ + default_priority = 619 + + def apply(self, **kwargs): + # type: (Any) -> None + for node in self.document.traverse(nodes.citation_reference): + target = node.astext() + ref = addnodes.pending_xref(target, refdomain='std', reftype='citation', + reftarget=target, refwarn=True, + support_smartquotes=False, + ids=node["ids"], + classes=node.get('classes', [])) + ref += nodes.inline(target, '[%s]' % target) + copy_source_info(node, ref) + node.replace_self(ref) + + +def setup(app): + # type: (Sphinx) -> Dict[str, Any] + app.add_transform(CitationDefinitionTransform) + app.add_transform(CitationReferenceTransform) + + return { + 'version': 'builtin', + 'parallel_read_safe': True, + 'parallel_write_safe': True, + } diff --git a/sphinx/transforms/__init__.py b/sphinx/transforms/__init__.py index 2fc1b6e72..16849c46c 100644 --- a/sphinx/transforms/__init__.py +++ b/sphinx/transforms/__init__.py @@ -9,7 +9,6 @@ """ import re -from typing import cast from docutils import nodes from docutils.transforms import Transform, Transformer @@ -19,13 +18,12 @@ from docutils.utils import normalize_language_tag from docutils.utils.smartquotes import smartchars from sphinx import addnodes +from sphinx.deprecation import RemovedInSphinx40Warning, deprecated_alias from sphinx.locale import _, __ from sphinx.util import logging from sphinx.util.docutils import new_document from sphinx.util.i18n import format_date -from sphinx.util.nodes import ( - NodeMatcher, apply_source_workaround, copy_source_info, is_smartquotable -) +from sphinx.util.nodes import NodeMatcher, apply_source_workaround, is_smartquotable if False: # For type annotation @@ -200,39 +198,6 @@ class SortIds(SphinxTransform): node['ids'] = node['ids'][1:] + [node['ids'][0]] -class SmartQuotesSkipper(SphinxTransform): - """Mark specific nodes as not smartquoted.""" - default_priority = 619 - - def apply(self, **kwargs): - # type: (Any) -> None - # citation labels - for node in self.document.traverse(nodes.citation): - label = cast(nodes.label, node[0]) - label['support_smartquotes'] = False - - -class CitationReferences(SphinxTransform): - """ - Replace citation references by pending_xref nodes before the default - docutils transform tries to resolve them. - """ - default_priority = 619 - - def apply(self, **kwargs): - # type: (Any) -> None - for node in self.document.traverse(nodes.citation_reference): - target = node.astext() - ref = addnodes.pending_xref(target, refdomain='std', reftype='citation', - reftarget=target, refwarn=True, - support_smartquotes=False, - ids=node["ids"], - classes=node.get('classes', [])) - ref += nodes.inline(target, '[%s]' % target) - copy_source_info(node, ref) - node.replace_self(ref) - - TRANSLATABLE_NODES = { 'literal-block': nodes.literal_block, 'doctest-block': nodes.doctest_block, @@ -440,12 +405,22 @@ class ManpageLink(SphinxTransform): node.attributes.update(info) +from sphinx.domains.citation import ( # NOQA + CitationDefinitionTransform, CitationReferenceTransform +) + +deprecated_alias('sphinx.transforms', + { + 'CitationReferences': CitationReferenceTransform, + 'SmartQuotesSkipper': CitationDefinitionTransform, + }, + RemovedInSphinx40Warning) + + def setup(app): # type: (Sphinx) -> Dict[str, Any] app.add_transform(ApplySourceWorkaround) app.add_transform(ExtraTranslatableNodes) - app.add_transform(SmartQuotesSkipper) - app.add_transform(CitationReferences) app.add_transform(DefaultSubstitutions) app.add_transform(MoveModuleTargets) app.add_transform(HandleCodeBlocks)