doc: add sphinx numref compatibility fallback
This change adds some simple handling for the :numref: directive for Sphinx versions prior to 1.3.1. This allows the Guides documentation to be built with older versions of Sphinx and still produce reasonable results. The patch replaces the :numref: reference with a link to the target (for all Sphinx doc types). It doesn't try to label figures/tables. Full numref support with automatic figure/table numbering and links can be obtained by upgrading to Sphinx 1.3.1 or later. Signed-off-by: John McNamara <john.mcnamara@intel.com> Acked-by: Thomas Monjalon <thomas.monjalon@6wind.com>
This commit is contained in:
parent
6d71d3b6ee
commit
536884d696
@ -29,6 +29,9 @@
|
|||||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
import subprocess
|
import subprocess
|
||||||
|
from docutils import nodes
|
||||||
|
from distutils.version import LooseVersion
|
||||||
|
from sphinx import __version__ as sphinx_version
|
||||||
from sphinx.highlighting import PygmentsBridge
|
from sphinx.highlighting import PygmentsBridge
|
||||||
from pygments.formatters.latex import LatexFormatter
|
from pygments.formatters.latex import LatexFormatter
|
||||||
|
|
||||||
@ -80,3 +83,66 @@ def __init__(self, **options):
|
|||||||
|
|
||||||
# Replace the default latex formatter.
|
# Replace the default latex formatter.
|
||||||
PygmentsBridge.latex_formatter = CustomLatexFormatter
|
PygmentsBridge.latex_formatter = CustomLatexFormatter
|
||||||
|
|
||||||
|
######## :numref: fallback ########
|
||||||
|
# The following hook functions add some simple handling for the :numref:
|
||||||
|
# directive for Sphinx versions prior to 1.3.1. The functions replace the
|
||||||
|
# :numref: reference with a link to the target (for all Sphinx doc types).
|
||||||
|
# It doesn't try to label figures/tables.
|
||||||
|
|
||||||
|
def numref_role(reftype, rawtext, text, lineno, inliner):
|
||||||
|
"""
|
||||||
|
Add a Sphinx role to handle numref references. Note, we can't convert
|
||||||
|
the link here because the doctree isn't build and the target information
|
||||||
|
isn't available.
|
||||||
|
"""
|
||||||
|
# Add an identifier to distinguish numref from other references.
|
||||||
|
newnode = nodes.reference('',
|
||||||
|
'',
|
||||||
|
refuri='_local_numref_#%s' % text,
|
||||||
|
internal=True)
|
||||||
|
return [newnode], []
|
||||||
|
|
||||||
|
def process_numref(app, doctree, from_docname):
|
||||||
|
"""
|
||||||
|
Process the numref nodes once the doctree has been built and prior to
|
||||||
|
writing the files. The processing involves replacing the numref with a
|
||||||
|
link plus text to indicate if it is a Figure or Table link.
|
||||||
|
"""
|
||||||
|
|
||||||
|
# Iterate over the reference nodes in the doctree.
|
||||||
|
for node in doctree.traverse(nodes.reference):
|
||||||
|
target = node.get('refuri', '')
|
||||||
|
|
||||||
|
# Look for numref nodes.
|
||||||
|
if target.startswith('_local_numref_#'):
|
||||||
|
target = target.replace('_local_numref_#', '')
|
||||||
|
|
||||||
|
# Get the target label and link information from the Sphinx env.
|
||||||
|
data = app.builder.env.domains['std'].data
|
||||||
|
docname, label, _ = data['labels'].get(target, ('', '', ''))
|
||||||
|
relative_url = app.builder.get_relative_uri(from_docname, docname)
|
||||||
|
|
||||||
|
# Add a text label to the link.
|
||||||
|
if target.startswith('figure'):
|
||||||
|
caption = 'Figure'
|
||||||
|
elif target.startswith('table'):
|
||||||
|
caption = 'Table'
|
||||||
|
else:
|
||||||
|
caption = 'Link'
|
||||||
|
|
||||||
|
# New reference node with the updated link information.
|
||||||
|
newnode = nodes.reference('',
|
||||||
|
caption,
|
||||||
|
refuri='%s#%s' % (relative_url, label),
|
||||||
|
internal=True)
|
||||||
|
node.replace_self(newnode)
|
||||||
|
|
||||||
|
def setup(app):
|
||||||
|
if LooseVersion(sphinx_version) < LooseVersion('1.3.1'):
|
||||||
|
print('Upgrade sphinx to version >= 1.3.1 for '
|
||||||
|
'improved Figure/Table number handling.')
|
||||||
|
# Add a role to handle :numref: references.
|
||||||
|
app.add_role('numref', numref_role)
|
||||||
|
# Process the numref references once the doctree has been created.
|
||||||
|
app.connect('doctree-resolved', process_numref)
|
||||||
|
Loading…
Reference in New Issue
Block a user