Merge pull request #3816 from sphinx-doc/3781_restrict_nodes_with_smart_quotes

Fix #3781: instruct SmartQuotes of nodes to skip
This commit is contained in:
Takeshi KOMIYA 2017-05-28 22:19:08 +09:00 committed by GitHub
commit 3ba9e70420

View File

@ -9,10 +9,12 @@
:license: BSD, see LICENSE for details.
"""
import docutils
from docutils import nodes
from docutils.transforms import Transform, Transformer
from docutils.transforms.parts import ContentsFilter
from docutils.utils import new_document
from docutils.transforms.universal import SmartQuotes as DocutilsSmartQuotes
from sphinx import addnodes
from sphinx.locale import _
@ -327,3 +329,33 @@ class SphinxContentsFilter(ContentsFilter):
def visit_image(self, node):
# type: (nodes.Node) -> None
raise nodes.SkipNode
class SphinxSmartQuotes(DocutilsSmartQuotes): # NOQA
"""
Customized SmartQuotes to avoid transform for some extra node types.
"""
def get_tokens(self, txtnodes):
# A generator that yields ``(texttype, nodetext)`` tuples for a list
# of "Text" nodes (interface to ``smartquotes.educate_tokens()``).
texttype = {True: 'literal', # "literal" text is not changed:
False: 'plain'}
for txtnode in txtnodes:
nodetype = texttype[isinstance(txtnode.parent,
(nodes.literal,
nodes.literal_block,
addnodes.literal_emphasis,
addnodes.literal_strong,
addnodes.desc_signature,
addnodes.productionlist,
addnodes.desc_optional,
addnodes.desc_name,
nodes.math,
nodes.image,
nodes.raw,
nodes.problematic))]
yield (nodetype, txtnode.astext())
docutils.transforms.universal.SmartQuotes = SphinxSmartQuotes