Merge branch 'master' into 4976_location_for_logger.info

This commit is contained in:
Takeshi KOMIYA 2018-07-16 17:18:24 +09:00 committed by GitHub
commit d3cc565749
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
63 changed files with 631 additions and 183 deletions

View File

@ -30,7 +30,7 @@ matrix:
env: TOXENV=docs env: TOXENV=docs
- python: '3.6' - python: '3.6'
env: TOXENV=mypy env: TOXENV=mypy
- python: '2.7' - python: '3.6'
env: TOXENV=flake8 env: TOXENV=flake8
install: install:

22
CHANGES
View File

@ -4,6 +4,11 @@ Release 1.8.0 (in development)
Dependencies Dependencies
------------ ------------
* LaTeX: :confval:`latex_use_xindy`, if ``True`` (default for
``xelatex/lualatex``), instructs ``make latexpdf`` to use :program:`xindy`
for general index. Make sure your LaTeX distribution includes it.
(refs: #5134)
Incompatible changes Incompatible changes
-------------------- --------------------
@ -39,6 +44,10 @@ Incompatible changes
Please use ``app.add_js_file()`` instead. Please use ``app.add_js_file()`` instead.
* #5072: Save environment object also with only new documents * #5072: Save environment object also with only new documents
* #5035: qthelp builder allows dashes in :confval:`qthelp_namespace` * #5035: qthelp builder allows dashes in :confval:`qthelp_namespace`
* LaTeX: with lualatex or xelatex use by default :program:`xindy` as
UTF-8 able replacement of :program:`makeindex` (refs: #5134). After
upgrading Sphinx, please clean latex build repertory of existing project
before new build.
Deprecated Deprecated
---------- ----------
@ -143,6 +152,8 @@ Features added
for mathjax for mathjax
* #4362: latex: Don't overwrite .tex file if document not changed * #4362: latex: Don't overwrite .tex file if document not changed
* #1431: latex: Add alphanumeric enumerated list support * #1431: latex: Add alphanumeric enumerated list support
* Add :confval:`latex_use_xindy` for UTF-8 savvy indexing, defaults to ``True``
if :confval:`latex_engine` is ``'xelatex'`` or ``'lualatex'``.
* #4976: ``SphinxLoggerAdapter.info()`` now supports ``location`` parameter * #4976: ``SphinxLoggerAdapter.info()`` now supports ``location`` parameter
Bugs fixed Bugs fixed
@ -153,6 +164,8 @@ Bugs fixed
* #4945: i18n: fix lang_COUNTRY not fallback correctly for IndexBuilder. Thanks * #4945: i18n: fix lang_COUNTRY not fallback correctly for IndexBuilder. Thanks
to Shengjing Zhu. to Shengjing Zhu.
* #4983: productionlist directive generates invalid IDs for the tokens * #4983: productionlist directive generates invalid IDs for the tokens
* #5132: (lualatex) PDF build fails if indexed word starts with Unicode character
* #5133: latex: index headings "Symbols" and "Numbers" not internationalized
Testing Testing
-------- --------
@ -203,6 +216,15 @@ Bugs fixed
* #5091: latex: curly braces in index entries are not handled correctly * #5091: latex: curly braces in index entries are not handled correctly
* #5070: epub: Wrong internal href fragment links * #5070: epub: Wrong internal href fragment links
* #5104: apidoc: Interface of ``sphinx.apidoc:main()`` has changed * #5104: apidoc: Interface of ``sphinx.apidoc:main()`` has changed
* #5076: napoleon raises RuntimeError with python 3.7
* #5125: sphinx-build: Interface of ``sphinx:main()`` has changed
* sphinx-build: ``sphinx.cmd.build.main()`` refers ``sys.argv`` instead of given
argument
* #5146: autosummary: warning is emitted when the first line of docstring ends
with literal notation
* autosummary: warnings of autosummary indicates wrong location (refs: #5146)
* #5143: autodoc: crashed on inspecting dict like object which does not support
sorting
Testing Testing
-------- --------

View File

@ -1,4 +1,4 @@
PYTHON ?= python PYTHON ?= python3
.PHONY: all .PHONY: all
all: clean-pyc clean-backupfiles style-check type-check test all: clean-pyc clean-backupfiles style-check type-check test

View File

@ -1,6 +1,6 @@
# Makefile for Sphinx documentation # Makefile for Sphinx documentation
# #
PYTHON ?= python PYTHON ?= python3
# You can set these variables from the command line. # You can set these variables from the command line.
SPHINXOPTS = SPHINXOPTS =

View File

@ -72,6 +72,7 @@ latex_elements = {
''', ''',
} }
latex_show_urls = 'footnote' latex_show_urls = 'footnote'
latex_use_xindy = True
autodoc_member_order = 'groupwise' autodoc_member_order = 'groupwise'
todo_include_todos = True todo_include_todos = True

View File

@ -12,16 +12,16 @@ Sphinx documentation contents
usage/restructuredtext/index usage/restructuredtext/index
usage/markdown usage/markdown
usage/configuration usage/configuration
usage/builders/index
usage/extensions/index
intro intro
man/index man/index
builders
intl intl
theming theming
setuptools setuptools
templating templating
latex latex
extensions
extdev/index extdev/index
websupport websupport

View File

@ -1,25 +0,0 @@
Builtin Sphinx extensions
-------------------------
These extensions are built in and can be activated by respective entries in the
:confval:`extensions` configuration value:
.. toctree::
autodoc
autosectionlabel
autosummary
coverage
doctest
extlinks
githubpages
graphviz
ifconfig
imgconverter
inheritance
intersphinx
linkcode
math
napoleon
todo
viewcode

View File

@ -12,7 +12,7 @@ __ http://docutils.sourceforge.net/docs/dev/hacking.html#parsing-the-document
In Sphinx, the parser modules works as same as docutils. The parsers are In Sphinx, the parser modules works as same as docutils. The parsers are
registered to Sphinx by extensions using Application APIs; registered to Sphinx by extensions using Application APIs;
:meth:`Sphinx.add_source_suffix()` and :meth:`Sphinx.add_source_parsers()`. :meth:`.Sphinx.add_source_suffix()` and :meth:`.Sphinx.add_source_parsers()`.
The *source suffix* is a mapping from file suffix to file type. For example, The *source suffix* is a mapping from file suffix to file type. For example,
``.rst`` file is mapped to ``'restructuredtext'`` type. Sphinx uses the ``.rst`` file is mapped to ``'restructuredtext'`` type. Sphinx uses the

View File

@ -1,16 +0,0 @@
.. _extensions:
Sphinx Extensions
=================
Since many projects will need special features in their documentation, Sphinx
allows adding "extensions" to the build process, each of which can modify almost
any aspect of document processing.
This chapter describes the extensions bundled with Sphinx. For the API
documentation on writing your own extension, see :ref:`dev-extensions`.
.. toctree::
ext/builtins
ext/thirdparty

View File

@ -12,7 +12,8 @@ Glossary
use the builder builders that e.g. check for broken links in the use the builder builders that e.g. check for broken links in the
documentation, or build coverage information. documentation, or build coverage information.
See :ref:`builders` for an overview over Sphinx's built-in builders. See :doc:`/usage/builders/index` for an overview over Sphinx's built-in
builders.
configuration directory configuration directory
The directory containing :file:`conf.py`. By default, this is the same as The directory containing :file:`conf.py`. By default, this is the same as
@ -66,6 +67,12 @@ Glossary
parsing stage, so that successive runs only need to read and parse new and parsing stage, so that successive runs only need to read and parse new and
changed documents. changed documents.
extension
A custom :term:`role`, :term:`directive` or other aspect of Sphinx that
allows users to modify any aspect of the build process within Sphinx.
For more information, refer to :doc:`/usage/extensions/index`.
master document master document
The document that contains the root :rst:dir:`toctree` directive. The document that contains the root :rst:dir:`toctree` directive.

View File

@ -86,8 +86,8 @@ Options
Build compact pretty-printed "pseudo-XML" files displaying the Build compact pretty-printed "pseudo-XML" files displaying the
internal structure of the intermediate document trees. internal structure of the intermediate document trees.
See :ref:`builders` for a list of all builders shipped with Sphinx. See :doc:`/usage/builders/index` for a list of all builders shipped with
Extensions can add their own builders. Sphinx. Extensions can add their own builders.
.. _make_mode: .. _make_mode:
@ -96,7 +96,7 @@ Options
Alternative to :option:`-b`. Uses the Sphinx :program:`make_mode` module, Alternative to :option:`-b`. Uses the Sphinx :program:`make_mode` module,
which provides the same build functionality as a default :ref:`Makefile or which provides the same build functionality as a default :ref:`Makefile or
Make.bat <makefile_options>`. In addition to all Sphinx Make.bat <makefile_options>`. In addition to all Sphinx
:ref:`builders <builders>`, the following build pipelines are available: :doc:`/usage/builders/index`, the following build pipelines are available:
**latexpdf** **latexpdf**
Build LaTeX files and run them through :program:`pdflatex`, or as per Build LaTeX files and run them through :program:`pdflatex`, or as per

View File

@ -1,13 +1,14 @@
.. _builders: .. _builders:
Available builders ========
================== Builders
========
.. module:: sphinx.builders .. module:: sphinx.builders
:synopsis: Available built-in builder classes. :synopsis: Available built-in builder classes.
These are the built-in Sphinx builders. More builders can be added by These are the built-in Sphinx builders. More builders can be added by
:ref:`extensions <extensions>`. :doc:`extensions </usage/extensions/index>`.
The builder's "name" must be given to the **-b** command-line option of The builder's "name" must be given to the **-b** command-line option of
:program:`sphinx-build` to select a builder. :program:`sphinx-build` to select a builder.
@ -75,8 +76,8 @@ The builder's "name" must be given to the **-b** command-line option of
.. class:: QtHelpBuilder .. class:: QtHelpBuilder
This builder produces the same output as the standalone HTML builder, but This builder produces the same output as the standalone HTML builder, but
also generates `Qt help`_ collection support files that allow also generates `Qt help`_ collection support files that allow the Qt
the Qt collection generator to compile them. collection generator to compile them.
.. autoattribute:: name .. autoattribute:: name
@ -144,7 +145,8 @@ The builder's "name" must be given to the **-b** command-line option of
.. versionchanged:: 1.5 .. versionchanged:: 1.5
Since Sphinx-1.5, the epub3 builder is used for the default builder of epub. Since Sphinx-1.5, the epub3 builder is used for the default builder of
epub.
.. module:: sphinx.builders.latex .. module:: sphinx.builders.latex
.. class:: LaTeXBuilder .. class:: LaTeXBuilder
@ -159,12 +161,12 @@ The builder's "name" must be given to the **-b** command-line option of
in a "minimal" TeX distribution installation. For example, on Ubuntu, the in a "minimal" TeX distribution installation. For example, on Ubuntu, the
following packages need to be installed for successful PDF builds: following packages need to be installed for successful PDF builds:
* texlive-latex-recommended * ``texlive-latex-recommended``
* texlive-fonts-recommended * ``texlive-fonts-recommended``
* texlive-latex-extra * ``texlive-latex-extra``
* latexmk (for ``make latexpdf`` on GNU/Linux and MacOS X) * ``latexmk`` (for ``make latexpdf`` on GNU/Linux and MacOS X)
* latex-xcolor (old Ubuntu) * ``latex-xcolor`` (old Ubuntu)
* texlive-luatex, texlive-xetex (see :confval:`latex_engine`) * ``texlive-luatex``, ``texlive-xetex`` (see :confval:`latex_engine`)
The testing of Sphinx LaTeX is done on Ubuntu trusty with the above The testing of Sphinx LaTeX is done on Ubuntu trusty with the above
mentioned packages, which are from a TeXLive 2013 snapshot dated mentioned packages, which are from a TeXLive 2013 snapshot dated
@ -178,7 +180,7 @@ The builder's "name" must be given to the **-b** command-line option of
Since 1.6, ``make latexpdf`` uses ``latexmk`` (not on Windows). This Since 1.6, ``make latexpdf`` uses ``latexmk`` (not on Windows). This
makes sure the needed number of runs is automatically executed to get makes sure the needed number of runs is automatically executed to get
the cross-references, bookmarks, indices, and tables of contents right. the cross-references, bookmarks, indices, and tables of contents right.
One can pass to ``latexmk`` options via the ``LATEXMKOPTS`` One can pass to ``latexmk`` options via the ``LATEXMKOPTS``
Makefile variable. For example: Makefile variable. For example:
@ -311,7 +313,6 @@ name is ``rinoh``. Refer to the `rinohtype manual`_ for details.
The filename for the search index Sphinx generates. The filename for the search index Sphinx generates.
See :ref:`serialization-details` for details about the output format. See :ref:`serialization-details` for details about the output format.
.. versionadded:: 0.5 .. versionadded:: 0.5

View File

@ -65,8 +65,9 @@ General configuration
.. confval:: extensions .. confval:: extensions
A list of strings that are module names of :ref:`extensions`. These can be A list of strings that are module names of :doc:`extensions
extensions coming with Sphinx (named ``sphinx.ext.*``) or custom ones. <extensions/index>`. These can be extensions coming with Sphinx (named
``sphinx.ext.*``) or custom ones.
Note that you can extend :data:`sys.path` within the conf file if your Note that you can extend :data:`sys.path` within the conf file if your
extensions live in another directory -- but make sure you use absolute paths. extensions live in another directory -- but make sure you use absolute paths.
@ -142,7 +143,7 @@ General configuration
.. versionadded:: 1.3 .. versionadded:: 1.3
.. deprecated:: 1.8 .. deprecated:: 1.8
Now Sphinx provides an API :meth:`Sphinx.add_source_parser` to register Now Sphinx provides an API :meth:`.Sphinx.add_source_parser` to register
a source parser. Please use it instead. a source parser. Please use it instead.
.. confval:: master_doc .. confval:: master_doc
@ -1871,6 +1872,40 @@ information.
.. versionadded:: 1.6 .. versionadded:: 1.6
.. confval:: latex_use_xindy
If ``True``, the PDF build from the LaTeX files created by Sphinx
will use :program:`xindy` (doc__) rather than :program:`makeindex`
for preparing the index of general terms (from :rst:dir:`index`
usage). This means that words with UTF-8 characters will get
ordered correctly for the :confval:`language`.
__ http://xindy.sourceforge.net/
- This option is ignored if :confval:`latex_engine` is ``'platex'``
(Japanese documents) as :program:`mendex` is used in that case.
- The default is ``True`` for ``'xelatex'`` or ``'lualatex'`` as
:program:`makeindex`, if any indexed term starts with a non-ascii
character, creates ``.ind`` file containing invalid bytes for
UTF-8 encoding. With ``'lualatex'`` this then breaks the PDF
build. Notice that :program:`xindy` supports most but not
all European languages.
- The default is ``False`` for ``'pdflatex'`` but ``True`` is
recommended for non-English documents as soon as some indexed
terms use non-ascii characters from the language script.
Cyrillic scripts are (transparently) supported with
``'pdflatex'`` thanks to a specific Sphinx-contributed ``xindy``
style file :file:`cyrLICRutf8.xdy`.
As :program:`xindy` does not support the same range of languages
as ``LaTeX/babel`` does, the default :program:`makeindex` for
``'pdflatex'`` may be preferred in some circumstances, although
the index will be ill-formed probably.
.. versionadded:: 1.8
.. confval:: latex_elements .. confval:: latex_elements
.. versionadded:: 0.5 .. versionadded:: 0.5

View File

@ -405,6 +405,7 @@ There are also new config values that you can set:
.. versionadded:: 1.7 .. versionadded:: 1.7
Docstring preprocessing Docstring preprocessing
----------------------- -----------------------

View File

@ -27,6 +27,7 @@ default. The ``autosectionlabel_prefix_document`` configuration variable can be
used to make headings which appear multiple times but in different documents used to make headings which appear multiple times but in different documents
unique. unique.
Configuration Configuration
------------- -------------

View File

@ -25,7 +25,6 @@ The :mod:`sphinx.ext.autosummary` extension does this in two parts:
These files by default contain only the corresponding These files by default contain only the corresponding
:mod:`sphinx.ext.autodoc` directive, but can be customized with templates. :mod:`sphinx.ext.autodoc` directive, but can be customized with templates.
.. rst:directive:: autosummary .. rst:directive:: autosummary
Insert a table that contains links to documented items, and a short summary Insert a table that contains links to documented items, and a short summary
@ -59,7 +58,6 @@ The :mod:`sphinx.ext.autosummary` extension does this in two parts:
:event:`autodoc-process-docstring` and :event:`autodoc-process-signature` :event:`autodoc-process-docstring` and :event:`autodoc-process-signature`
hooks as :mod:`~sphinx.ext.autodoc`. hooks as :mod:`~sphinx.ext.autodoc`.
**Options** **Options**
* If you want the :rst:dir:`autosummary` table to also serve as a * If you want the :rst:dir:`autosummary` table to also serve as a

View File

@ -4,7 +4,6 @@
.. module:: sphinx.ext.coverage .. module:: sphinx.ext.coverage
:synopsis: Check Python modules and C API for coverage in the documentation. :synopsis: Check Python modules and C API for coverage in the documentation.
This extension features one additional builder, the :class:`CoverageBuilder`. This extension features one additional builder, the :class:`CoverageBuilder`.
.. class:: CoverageBuilder .. class:: CoverageBuilder
@ -14,7 +13,6 @@ This extension features one additional builder, the :class:`CoverageBuilder`.
.. todo:: Write this section. .. todo:: Write this section.
Several new configuration values can be used to specify what the builder Several new configuration values can be used to specify what the builder
should check: should check:

View File

@ -165,7 +165,6 @@ a comma-separated list of group names.
Output text. Output text.
The following is an example for the usage of the directives. The test via The following is an example for the usage of the directives. The test via
:rst:dir:`doctest` and the test via :rst:dir:`testcode` and :rst:dir:`doctest` and the test via :rst:dir:`testcode` and
:rst:dir:`testoutput` are equivalent. :: :rst:dir:`testoutput` are equivalent. ::

View File

@ -7,7 +7,6 @@
.. versionadded:: 1.0 .. versionadded:: 1.0
This extension is meant to help with the common pattern of having many external This extension is meant to help with the common pattern of having many external
links that point to URLs on one and the same site, e.g. links to bug trackers, links that point to URLs on one and the same site, e.g. links to bug trackers,
version control web interfaces, or simply subpages in other websites. It does version control web interfaces, or simply subpages in other websites. It does

View File

@ -1,5 +1,3 @@
.. highlight:: rest
:mod:`sphinx.ext.githubpages` -- Publish HTML docs in GitHub Pages :mod:`sphinx.ext.githubpages` -- Publish HTML docs in GitHub Pages
================================================================== ==================================================================

View File

@ -13,7 +13,6 @@ your documents.
It adds these directives: It adds these directives:
.. rst:directive:: graphviz .. rst:directive:: graphviz
Directive to embed graphviz code. The input code for ``dot`` is given as the Directive to embed graphviz code. The input code for ``dot`` is given as the

View File

@ -1,28 +1,30 @@
.. highlight:: rest
.. _sphinx.ext.imgconverter: .. _sphinx.ext.imgconverter:
:mod:`sphinx.ext.imgconverter` -- A reference implementation for image converter using Imagemagick :mod:`sphinx.ext.imgconverter` -- A reference image converter using Imagemagick
================================================================================================== ===============================================================================
.. module:: sphinx.ext.imgconverter .. module:: sphinx.ext.imgconverter
:synopsis: Convert images to appropriate format for builders :synopsis: Convert images to appropriate format for builders
.. versionadded:: 1.6 .. versionadded:: 1.6
This extension converts images in your document to appropriate format for builders. This extension converts images in your document to appropriate format for
For example, it allows you to use SVG images with LaTeX builder. builders. For example, it allows you to use SVG images with LaTeX builder.
As a result, you don't mind what image format the builder supports. As a result, you don't mind what image format the builder supports.
Internally, this extension uses Imagemagick_ to convert images. Internally, this extension uses Imagemagick_ to convert images.
.. _Imagemagick: https://www.imagemagick.org/script/index.php .. _Imagemagick: https://www.imagemagick.org/script/index.php
.. note:: Imagemagick rasterizes a SVG image on conversion. As a result, the image .. note::
becomes not scalable. To avoid that, please use other image converters
like sphinxcontrib-svg2pdfconverter_ (which uses Inkscape or rsvg-convert). Imagemagick rasterizes a SVG image on conversion. As a result, the image
becomes not scalable. To avoid that, please use other image converters like
`sphinxcontrib-svg2pdfconverter`__ (which uses Inkscape or
``rsvg-convert``).
.. __: https://github.com/missinglinkelectronics/sphinxcontrib-svg2pdfconverter
.. _sphinxcontrib-svg2pdfconverter: https://github.com/missinglinkelectronics/sphinxcontrib-svg2pdfconverter
Configuration Configuration
------------- -------------

View File

@ -1,9 +1,50 @@
==========
Extensions
==========
Since many projects will need special features in their documentation, Sphinx
allows adding "extensions" to the build process, each of which can modify
almost any aspect of document processing.
This chapter describes the extensions bundled with Sphinx. For the API
documentation on writing your own extension, refer to :ref:`dev-extensions`.
Built-in extensions
-------------------
These extensions are built in and can be activated by respective entries in the
:confval:`extensions` configuration value:
.. toctree::
autodoc
autosectionlabel
autosummary
coverage
doctest
extlinks
githubpages
graphviz
ifconfig
imgconverter
inheritance
intersphinx
linkcode
math
napoleon
todo
viewcode
Third-party extensions Third-party extensions
---------------------- ----------------------
.. todo:: This should reference the GitHub organization now
You can find several extensions contributed by users in the `Sphinx Contrib`_ You can find several extensions contributed by users in the `Sphinx Contrib`_
repository. It is open for anyone who wants to maintain an extension repository. It is open for anyone who wants to maintain an extension publicly;
publicly; just send a short message asking for write permissions. just send a short message asking for write permissions.
There are also several extensions hosted elsewhere. The `Sphinx extension There are also several extensions hosted elsewhere. The `Sphinx extension
survey <https://sphinxext-survey.readthedocs.io/>`__ and `awesome-sphinxdoc survey <https://sphinxext-survey.readthedocs.io/>`__ and `awesome-sphinxdoc
@ -16,15 +57,13 @@ list (`join here <https://groups.google.com/forum/#!forum/sphinx-dev>`_).
.. _Sphinx Contrib: https://bitbucket.org/birkenfeld/sphinx-contrib .. _Sphinx Contrib: https://bitbucket.org/birkenfeld/sphinx-contrib
Where to put your own extensions? Where to put your own extensions?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Extensions local to a project should be put within the project's directory Extensions local to a project should be put within the project's directory
structure. Set Python's module search path, ``sys.path``, accordingly so that structure. Set Python's module search path, ``sys.path``, accordingly so that
Sphinx can find them. Sphinx can find them. For example, if your extension ``foo.py`` lies in the
E.g., if your extension ``foo.py`` lies in the ``exts`` subdirectory of the ``exts`` subdirectory of the project root, put into :file:`conf.py`::
project root, put into :file:`conf.py`::
import sys, os import sys, os

View File

@ -91,7 +91,9 @@ It adds this directive:
.. versionchanged:: 1.7 .. versionchanged:: 1.7
Added ``top-classes`` option to limit the scope of inheritance graphs. Added ``top-classes`` option to limit the scope of inheritance graphs.
New config values are:
Configuration
-------------
.. confval:: inheritance_graph_attrs .. confval:: inheritance_graph_attrs

View File

@ -38,8 +38,9 @@ Behind the scenes, this works as follows:
specified individually, e.g. if the docs should be buildable without Internet specified individually, e.g. if the docs should be buildable without Internet
access. access.
Configuring Intersphinx
----------------------- Configuration
-------------
To use Intersphinx linking, add ``'sphinx.ext.intersphinx'`` to your To use Intersphinx linking, add ``'sphinx.ext.intersphinx'`` to your
:confval:`extensions` config value, and use these new config values to activate :confval:`extensions` config value, and use these new config values to activate
@ -136,12 +137,14 @@ linking:
exception is raised if the server has not issued a response for timeout exception is raised if the server has not issued a response for timeout
seconds. seconds.
Showing all links of an Intersphinx mapping file Showing all links of an Intersphinx mapping file
------------------------------------------------ ------------------------------------------------
To show all Intersphinx links and their targets of an Intersphinx mapping file, run To show all Intersphinx links and their targets of an Intersphinx mapping file,
``python -msphinx.ext.intersphinx url-or-path``. This is helpful when searching for the root cause of a broken run ``python -msphinx.ext.intersphinx url-or-path``. This is helpful when
Intersphinx link in a documentation project. The following example prints the Intersphinx mapping of the Python 3 searching for the root cause of a broken Intersphinx link in a documentation
project. The following example prints the Intersphinx mapping of the Python 3
documentation:: documentation::
$ python -msphinx.ext.intersphinx https://docs.python.org/3/objects.inv $ python -msphinx.ext.intersphinx https://docs.python.org/3/objects.inv

View File

@ -16,6 +16,10 @@ found somewhere on the Internet.
In your configuration, you need to specify a :confval:`linkcode_resolve` In your configuration, you need to specify a :confval:`linkcode_resolve`
function that returns an URL based on the object. function that returns an URL based on the object.
Configuration
-------------
.. confval:: linkcode_resolve .. confval:: linkcode_resolve
This is a function ``linkcode_resolve(domain, info)``, This is a function ``linkcode_resolve(domain, info)``,

View File

@ -1,5 +1,5 @@
:mod:`sphinx.ext.napoleon` -- Support for NumPy and Google style docstrings :mod:`sphinx.ext.napoleon` -- Support for NumPy and Google style docstrings
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ===========================================================================
.. module:: sphinx.ext.napoleon .. module:: sphinx.ext.napoleon
:synopsis: Support for NumPy and Google style docstrings :synopsis: Support for NumPy and Google style docstrings
@ -8,8 +8,8 @@
.. versionadded:: 1.3 .. versionadded:: 1.3
Napoleon - *Marching toward legible docstrings* Overview
=============================================== --------
.. highlight:: text .. highlight:: text
@ -25,7 +25,7 @@ Are you tired of writing docstrings that look like this::
:returns: A buffered writable file descriptor :returns: A buffered writable file descriptor
:rtype: BufferedFileStorage :rtype: BufferedFileStorage
`ReStructuredText`_ is great, but it creates visually dense, hard to read `reStructuredText`_ is great, but it creates visually dense, hard to read
`docstrings`_. Compare the jumble above to the same thing rewritten `docstrings`_. Compare the jumble above to the same thing rewritten
according to the `Google Python Style Guide`_:: according to the `Google Python Style Guide`_::
@ -40,8 +40,8 @@ according to the `Google Python Style Guide`_::
Much more legible, no? Much more legible, no?
Napoleon is a :doc:`../extensions` that enables Sphinx to parse both `NumPy`_ Napoleon is a :term:`extension` that enables Sphinx to parse both `NumPy`_ and
and `Google`_ style docstrings - the style recommended by `Khan Academy`_. `Google`_ style docstrings - the style recommended by `Khan Academy`_.
Napoleon is a pre-processor that parses `NumPy`_ and `Google`_ style Napoleon is a pre-processor that parses `NumPy`_ and `Google`_ style
docstrings and converts them to reStructuredText before Sphinx attempts to docstrings and converts them to reStructuredText before Sphinx attempts to
@ -61,7 +61,7 @@ source code files.
https://github.com/Khan/style-guides/blob/master/style/python.md#docstrings https://github.com/Khan/style-guides/blob/master/style/python.md#docstrings
Getting Started Getting Started
--------------- ~~~~~~~~~~~~~~~
1. After :doc:`setting up Sphinx </usage/quickstart>` to build your docs, 1. After :doc:`setting up Sphinx </usage/quickstart>` to build your docs,
enable napoleon in the Sphinx `conf.py` file:: enable napoleon in the Sphinx `conf.py` file::
@ -77,7 +77,7 @@ Getting Started
Docstrings Docstrings
---------- ~~~~~~~~~~
Napoleon interprets every docstring that :mod:`autodoc <sphinx.ext.autodoc>` Napoleon interprets every docstring that :mod:`autodoc <sphinx.ext.autodoc>`
can find, including docstrings on: ``modules``, ``classes``, ``attributes``, can find, including docstrings on: ``modules``, ``classes``, ``attributes``,
@ -91,7 +91,7 @@ All standard reStructuredText formatting still works as expected.
.. _Sections: .. _Sections:
Docstring Sections Docstring Sections
------------------ ~~~~~~~~~~~~~~~~~~
All of the following section headers are supported: All of the following section headers are supported:
@ -127,7 +127,7 @@ All of the following section headers are supported:
* ``Yields`` * ``Yields``
Google vs NumPy Google vs NumPy
--------------- ~~~~~~~~~~~~~~~
Napoleon supports two styles of docstrings: `Google`_ and `NumPy`_. The Napoleon supports two styles of docstrings: `Google`_ and `NumPy`_. The
main difference between the two styles is that Google uses indention to main difference between the two styles is that Google uses indention to
@ -195,7 +195,7 @@ not be mixed. Choose one style for your project and be consistent with it.
Type Annotations Type Annotations
---------------- ~~~~~~~~~~~~~~~~
`PEP 484`_ introduced a standard way to express types in Python code. `PEP 484`_ introduced a standard way to express types in Python code.
This is an alternative to expressing types directly in docstrings. This is an alternative to expressing types directly in docstrings.
@ -249,7 +249,7 @@ Google style with types in docstrings::
Configuration Configuration
============= -------------
Listed below are all the settings used by napoleon and their default Listed below are all the settings used by napoleon and their default
values. These settings can be changed in the Sphinx `conf.py` file. Make values. These settings can be changed in the Sphinx `conf.py` file. Make
@ -278,8 +278,6 @@ sure that "sphinx.ext.napoleon" is enabled in `conf.py`::
.. _NumPy style: .. _NumPy style:
https://github.com/numpy/numpy/blob/master/doc/HOWTO_DOCUMENT.rst.txt https://github.com/numpy/numpy/blob/master/doc/HOWTO_DOCUMENT.rst.txt
.. confval:: napoleon_google_docstring .. confval:: napoleon_google_docstring
True to parse `Google style`_ docstrings. False to disable support True to parse `Google style`_ docstrings. False to disable support

View File

@ -27,7 +27,10 @@ There are two additional directives when using this extension:
documentation, if :confval:`todo_include_todos` is ``True``. documentation, if :confval:`todo_include_todos` is ``True``.
There is also an additional config value: These can be configured as seen below.
Configuration
-------------
.. confval:: todo_include_todos .. confval:: todo_include_todos

View File

@ -7,9 +7,8 @@
.. versionadded:: 1.0 .. versionadded:: 1.0
This extension looks at your Python object descriptions (``.. class::``, ``..
This extension looks at your Python object descriptions (``.. class::``, function::`` etc.) and tries to find the source files where the objects are
``.. function::`` etc.) and tries to find the source files where the objects are
contained. When found, a separate HTML page will be output for each module with contained. When found, a separate HTML page will be output for each module with
a highlighted version of the source code, and a link will be added to all object a highlighted version of the source code, and a link will be added to all object
descriptions that leads to the source code of the described object. A link back descriptions that leads to the source code of the described object. A link back
@ -33,14 +32,15 @@ This extension works only on HTML related builders like ``html``,
``singlehtml``. By default ``epub`` builder doesn't ``singlehtml``. By default ``epub`` builder doesn't
support this extension (see :confval:`viewcode_enable_epub`). support this extension (see :confval:`viewcode_enable_epub`).
There is an additional config value: Configuration
-------------
.. confval:: viewcode_follow_imported_members .. confval:: viewcode_follow_imported_members
If this is ``True``, viewcode extension will follow alias objects that If this is ``True``, viewcode extension will follow alias objects that
imported from another module such as functions, classes and attributes. imported from another module such as functions, classes and attributes. As
As side effects, this option side effects, this option else they produce nothing. The default is
else they produce nothing. The default is ``True``. ``True``.
.. versionadded:: 1.3 .. versionadded:: 1.3

View File

@ -127,7 +127,7 @@ directory in which you want to place the built documentation.
The :option:`-b <sphinx-build -b>` option selects a builder; in this example The :option:`-b <sphinx-build -b>` option selects a builder; in this example
Sphinx will build HTML files. Sphinx will build HTML files.
|more| Refer to the :program:`sphinx-build man page <sphinx-build>` for all |more| Refer to the :doc:`sphinx-build man page </man/sphinx-build>` for all
options that :program:`sphinx-build` supports. options that :program:`sphinx-build` supports.
However, :program:`sphinx-quickstart` script creates a :file:`Makefile` and a However, :program:`sphinx-quickstart` script creates a :file:`Makefile` and a
@ -318,12 +318,7 @@ features of intersphinx.
More topics to be covered More topics to be covered
------------------------- -------------------------
- :doc:`Other extensions </extensions>`: - :doc:`Other extensions </usage/extensions/index>`:
* :doc:`/ext/math`,
* :doc:`/ext/viewcode`,
* :doc:`/ext/doctest`,
* ...
- Static files - Static files
- :doc:`Selecting a theme </theming>` - :doc:`Selecting a theme </theming>`
- :doc:`/setuptools` - :doc:`/setuptools`
@ -336,7 +331,7 @@ More topics to be covered
.. [#] This is the usual layout. However, :file:`conf.py` can also live in .. [#] This is the usual layout. However, :file:`conf.py` can also live in
another directory, the :term:`configuration directory`. Refer to the another directory, the :term:`configuration directory`. Refer to the
:program:`sphinx-build man page <sphinx-build>` for more information. :doc:`sphinx-build man page </man/sphinx-build>` for more information.
.. |more| image:: /_static/more.png .. |more| image:: /_static/more.png
:align: middle :align: middle

View File

@ -444,7 +444,7 @@ candidates. For instance, if the file name ``gnu.*`` was given and two files
:file:`gnu.pdf` and :file:`gnu.png` existed in the source tree, the LaTeX :file:`gnu.pdf` and :file:`gnu.png` existed in the source tree, the LaTeX
builder would choose the former, while the HTML builder would prefer the builder would choose the former, while the HTML builder would prefer the
latter. Supported image types and choosing priority are defined at latter. Supported image types and choosing priority are defined at
:ref:`builders`. :doc:`/usage/builders/index`.
Note that image file names should not contain spaces. Note that image file names should not contain spaces.

View File

@ -62,7 +62,7 @@ Cross-referencing anything
by :rst:role:`doc`, :rst:role:`ref` or :rst:role:`option`. by :rst:role:`doc`, :rst:role:`ref` or :rst:role:`option`.
Custom objects added to the standard domain by extensions (see Custom objects added to the standard domain by extensions (see
:meth:`Sphinx.add_object_type`) are also searched. :meth:`.Sphinx.add_object_type`) are also searched.
* Then, it looks for objects (targets) in all loaded domains. It is up to * Then, it looks for objects (targets) in all loaded domains. It is up to
the domains how specific a match must be. For example, in the Python the domains how specific a match must be. For example, in the Python

View File

@ -32,7 +32,7 @@ directory = sphinx/locale/
[flake8] [flake8]
max-line-length = 95 max-line-length = 95
ignore = E116,E241,E251,E741,I101 ignore = E116,E241,E251,E741,I101
exclude = .git,.tox,.venv,tests/*,build/*,doc/_build/*,sphinx/search/*,doc/ext/example*.py exclude = .git,.tox,.venv,tests/*,build/*,doc/_build/*,sphinx/search/*,doc/usage/extensions/example*.py
application-import-names = sphinx application-import-names = sphinx
import-order-style = smarkets import-order-style = smarkets

View File

@ -71,16 +71,16 @@ if __version__.endswith('+'):
pass pass
def main(*args, **kwargs): def main(argv=sys.argv): # type: ignore
# type: (Any, Any) -> int # type: (List[unicode]) -> int
from .cmd import build from .cmd import build
warnings.warn( warnings.warn(
'`sphinx.main()` has moved to `sphinx.cmd.build.main()`.', '`sphinx.main()` has moved to `sphinx.cmd.build.main()`.',
RemovedInSphinx20Warning, RemovedInSphinx20Warning,
stacklevel=2, stacklevel=2,
) )
args = args[1:] # skip first argument to adjust arguments (refs: #4615) argv = argv[1:] # skip first argument to adjust arguments (refs: #4615)
return build.main(*args, **kwargs) return build.main(argv)
def build_main(argv=sys.argv): def build_main(argv=sys.argv):

View File

@ -642,7 +642,7 @@ class Sphinx(object):
a title. a title.
Other keyword arguments are used for node visitor functions. See the Other keyword arguments are used for node visitor functions. See the
:meth:`Sphinx.add_node` for details. :meth:`.Sphinx.add_node` for details.
.. versionadded:: 1.4 .. versionadded:: 1.4
""" """
@ -850,8 +850,9 @@ class Sphinx(object):
object. It will automatically add index entries if *indextemplate* object. It will automatically add index entries if *indextemplate*
is nonempty; if given, it must contain exactly one instance of is nonempty; if given, it must contain exactly one instance of
``%s``. See the example below for how the template will be ``%s``. See the example below for how the template will be
interpreted. * Create a new role (called *rolename*) to interpreted.
cross-reference to these object descriptions. - Create a new role (called *rolename*) to cross-reference to these
object descriptions.
- If you provide *parse_node*, it must be a function that takes a - If you provide *parse_node*, it must be a function that takes a
string and a docutils node, and it must populate the node with string and a docutils node, and it must populate the node with
children parsed from the string. It must then return the name of the children parsed from the string. It must then return the name of the

View File

@ -44,6 +44,67 @@ if False:
from sphinx.config import Config # NOQA from sphinx.config import Config # NOQA
XINDY_LANG_OPTIONS = {
# language codes from docutils.writers.latex2e.Babel
# ! xindy language names may differ from those in use by LaTeX/babel
# ! xindy does not support all Latin scripts as recognized by LaTeX/babel
# ! not all xindy-supported languages appear in Babel.language_codes
# cd /usr/local/texlive/2018/texmf-dist/xindy/modules/lang
# find . -name '*utf8.xdy'
# LATIN
'sq': '-L albanian -C utf8 ',
'hr': '-L croatian -C utf8 ',
'cs': '-L czech -C utf8 ',
'da': '-L danish -C utf8 ',
'nl': '-L dutch -C ij-as-ij-utf8 ',
'en': '-L english -C utf8 ',
'eo': '-L esperanto -C utf8 ',
'et': '-L estonian -C utf8 ',
'fi': '-L finnish -C utf8 ',
'fr': '-L french -C utf8 ',
'de': '-L german -C din5007-utf8 ',
'is': '-L icelandic -C utf8 ',
'it': '-L italian -C utf8 ',
'la': '-L latin -C utf8 ',
'lv': '-L latvian -C utf8 ',
'lt': '-L lithuanian -C utf8 ',
'dsb': '-L lower-sorbian -C utf8 ',
'ds': '-L lower-sorbian -C utf8 ', # trick, no conflict
'nb': '-L norwegian -C utf8 ',
'no': '-L norwegian -C utf8 ', # and what about nynorsk?
'pl': '-L polish -C utf8 ',
'pt': '-L portuguese -C utf8 ',
'ro': '-L romanian -C utf8 ',
'sk': '-L slovak -C small-utf8 ', # there is also slovak-large
'sl': '-L slovenian -C utf8 ',
'es': '-L spanish -C modern-utf8 ', # there is also spanish-traditional
'sv': '-L swedish -C utf8 ',
'tr': '-L turkish -C utf8 ',
'hsb': '-L upper-sorbian -C utf8 ',
'hs': '-L upper-sorbian -C utf8 ', # trick, no conflict
'vi': '-L vietnamese -C utf8 ',
# CYRILLIC
# for usage with pdflatex, needs also cyrLICRutf8.xdy module
'be': '-L belarusian -C utf8 ',
'bg': '-L bulgarian -C utf8 ',
'mk': '-L macedonian -C utf8 ',
'mn': '-L mongolian -C cyrillic-utf8 ',
'ru': '-L russian -C utf8 ',
'sr': '-L serbian -C utf8 ',
'sh-cyrl': '-L serbian -C utf8 ',
'sh': '-L serbian -C utf8 ', # trick, no conflict
'uk': '-L ukrainian -C utf8 ',
# GREEK
# can work only with xelatex/lualatex, not supported by texindy+pdflatex
'el': '-L greek -C utf8 ',
# FIXME, not compatible with [:2] slice but does Sphinx support Greek ?
'el-polyton': '-L greek -C polytonic-utf8 ',
} # type: Dict[unicode, unicode]
XINDY_CYRILLIC_SCRIPTS = [
'be', 'bg', 'mk', 'mn', 'ru', 'sr', 'sh', 'uk',
] # type: List[unicode]
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -232,7 +293,23 @@ class LaTeXBuilder(Builder):
self.copy_image_files() self.copy_image_files()
# copy TeX support files from texinputs # copy TeX support files from texinputs
context = {'latex_engine': self.config.latex_engine} # configure usage of xindy (impacts Makefile and latexmkrc)
# FIXME: convert this rather to a confval with suitable default
# according to language ? but would require extra documentation
if self.config.language:
xindy_lang_option = \
XINDY_LANG_OPTIONS.get(self.config.language[:2],
'-L general -C utf8 ')
xindy_cyrillic = self.config.language[:2] in XINDY_CYRILLIC_SCRIPTS
else:
xindy_lang_option = '-L english -C utf8 '
xindy_cyrillic = False
context = {
'latex_engine': self.config.latex_engine,
'xindy_use': self.config.latex_use_xindy,
'xindy_lang_option': xindy_lang_option,
'xindy_cyrillic': xindy_cyrillic,
}
logger.info(bold(__('copying TeX support files...'))) logger.info(bold(__('copying TeX support files...')))
staticdirname = path.join(package_dir, 'texinputs') staticdirname = path.join(package_dir, 'texinputs')
for filename in os.listdir(staticdirname): for filename in os.listdir(staticdirname):
@ -317,6 +394,12 @@ def default_latex_docclass(config):
return {} return {}
def default_latex_use_xindy(config):
# type: (Config) -> bool
""" Better default latex_use_xindy settings for specific engines. """
return config.latex_engine in {'xelatex', 'lualatex'}
def setup(app): def setup(app):
# type: (Sphinx) -> Dict[unicode, Any] # type: (Sphinx) -> Dict[unicode, Any]
app.add_builder(LaTeXBuilder) app.add_builder(LaTeXBuilder)
@ -334,6 +417,7 @@ def setup(app):
app.add_config_value('latex_logo', None, None, string_classes) app.add_config_value('latex_logo', None, None, string_classes)
app.add_config_value('latex_appendices', [], None) app.add_config_value('latex_appendices', [], None)
app.add_config_value('latex_use_latex_multicolumn', False, None) app.add_config_value('latex_use_latex_multicolumn', False, None)
app.add_config_value('latex_use_xindy', default_latex_use_xindy, None)
app.add_config_value('latex_toplevel_sectioning', None, None, app.add_config_value('latex_toplevel_sectioning', None, None,
ENUM(None, 'part', 'chapter', 'section')) ENUM(None, 'part', 'chapter', 'section'))
app.add_config_value('latex_domain_indices', True, None, [list]) app.add_config_value('latex_domain_indices', True, None, [list])

View File

@ -140,7 +140,7 @@ class QtHelpBuilder(StandaloneHTMLBuilder):
else: else:
nspace = 'org.sphinx.%s.%s' % (outname, self.config.version) nspace = 'org.sphinx.%s.%s' % (outname, self.config.version)
nspace = re.sub('[^a-zA-Z0-9.\-]', '', nspace) nspace = re.sub(r'[^a-zA-Z0-9.\-]', '', nspace)
nspace = re.sub(r'\.+', '.', nspace).strip('.') nspace = re.sub(r'\.+', '.', nspace).strip('.')
nspace = nspace.lower() nspace = nspace.lower()

View File

@ -311,7 +311,7 @@ def main(argv=sys.argv[1:]): # type: ignore
locale.setlocale(locale.LC_ALL, '') locale.setlocale(locale.LC_ALL, '')
sphinx.locale.init_console(os.path.join(package_dir, 'locale'), 'sphinx') sphinx.locale.init_console(os.path.join(package_dir, 'locale'), 'sphinx')
if sys.argv[1:2] == ['-M']: if argv[:1] == ['-M']:
return make_main(argv) return make_main(argv)
else: else:
return build_main(argv) return build_main(argv)

View File

@ -129,7 +129,7 @@ class Config(object):
rst_epilog = (None, 'env', string_classes), rst_epilog = (None, 'env', string_classes),
rst_prolog = (None, 'env', string_classes), rst_prolog = (None, 'env', string_classes),
trim_doctest_flags = (True, 'env', []), trim_doctest_flags = (True, 'env', []),
primary_domain = ('py', 'env', [NoneType]), primary_domain = ('py', 'env', [NoneType]), # type: ignore
needs_sphinx = (None, None, string_classes), needs_sphinx = (None, None, string_classes),
needs_extensions = ({}, None, []), needs_extensions = ({}, None, []),
manpages_url = (None, 'env', []), manpages_url = (None, 'env', []),

View File

@ -45,7 +45,7 @@ locale.versionlabels = DeprecatedDict(
RemovedInSphinx30Warning RemovedInSphinx30Warning
) )
glob_re = re.compile('.*[*?\[].*') glob_re = re.compile(r'.*[*?\[].*')
def int_or_nothing(argument): def int_or_nothing(argument):

View File

@ -78,7 +78,9 @@ from sphinx.ext.autodoc.importer import import_module
from sphinx.locale import __ from sphinx.locale import __
from sphinx.pycode import ModuleAnalyzer, PycodeError from sphinx.pycode import ModuleAnalyzer, PycodeError
from sphinx.util import import_object, rst, logging from sphinx.util import import_object, rst, logging
from sphinx.util.docutils import NullReporter, SphinxDirective, new_document from sphinx.util.docutils import (
NullReporter, SphinxDirective, new_document, switch_source_input
)
if False: if False:
# For type annotation # For type annotation
@ -92,6 +94,7 @@ logger = logging.getLogger(__name__)
periods_re = re.compile(r'\.(?:\s+)') periods_re = re.compile(r'\.(?:\s+)')
literal_re = re.compile(r'::\s*$')
# -- autosummary_toc node ------------------------------------------------------ # -- autosummary_toc node ------------------------------------------------------
@ -373,17 +376,19 @@ class Autosummary(SphinxDirective):
def append_row(*column_texts): def append_row(*column_texts):
# type: (unicode) -> None # type: (unicode) -> None
row = nodes.row('') row = nodes.row('')
source, line = self.state_machine.get_source_and_line()
for text in column_texts: for text in column_texts:
node = nodes.paragraph('') node = nodes.paragraph('')
vl = ViewList() vl = ViewList()
vl.append(text, '<autosummary>') vl.append(text, '%s:%d:<autosummary>' % (source, line))
self.state.nested_parse(vl, 0, node) with switch_source_input(self.state, vl):
try: self.state.nested_parse(vl, 0, node)
if isinstance(node[0], nodes.paragraph): try:
node = node[0] if isinstance(node[0], nodes.paragraph):
except IndexError: node = node[0]
pass except IndexError:
row.append(nodes.entry('', node)) pass
row.append(nodes.entry('', node))
body.append(row) body.append(row)
for name, sig, summary, real_name in items: for name, sig, summary, real_name in items:
@ -484,6 +489,9 @@ def extract_summary(doc, document):
# considered as that splitting by period does not break inline markups # considered as that splitting by period does not break inline markups
break break
# strip literal notation mark ``::`` from tail of summary
summary = literal_re.sub('.', summary)
return summary return summary

View File

@ -124,7 +124,7 @@ def generate_autosummary_docs(sources, output_dir=None, suffix='.rst',
else: else:
if template_dir: if template_dir:
template_dirs.insert(0, template_dir) template_dirs.insert(0, template_dir)
template_loader = FileSystemLoader(template_dirs) # type: ignore template_loader = FileSystemLoader(template_dirs)
template_env = SandboxedEnvironment(loader=template_loader) template_env = SandboxedEnvironment(loader=template_loader)
template_env.filters['underline'] = _underline template_env.filters['underline'] = _underline

View File

@ -556,7 +556,14 @@ class GoogleDocstring(UnicodeMixin):
self._parsed_lines = self._consume_empty() self._parsed_lines = self._consume_empty()
if self._name and (self._what == 'attribute' or self._what == 'data'): if self._name and (self._what == 'attribute' or self._what == 'data'):
self._parsed_lines.extend(self._parse_attribute_docstring()) # Implicit stop using StopIteration no longer allowed in
# Python 3.7; see PEP 479
res = [] # type: List[unicode]
try:
res = self._parse_attribute_docstring()
except StopIteration:
pass
self._parsed_lines.extend(res)
return return
while self._line_iter.has_next(): while self._line_iter.has_next():

View File

@ -64,7 +64,7 @@ class _TranslationProxy(UserString, object):
# replace function from UserString; it instantiates a self.__class__ # replace function from UserString; it instantiates a self.__class__
# for the encoding result # for the encoding result
def encode(self, encoding=None, errors=None): def encode(self, encoding=None, errors=None): # type: ignore
# type: (unicode, unicode) -> str # type: (unicode, unicode) -> str
if encoding: if encoding:
if errors: if errors:
@ -88,7 +88,7 @@ class _TranslationProxy(UserString, object):
return dir(text_type) return dir(text_type)
def __iter__(self): def __iter__(self):
# type: () -> Iterator[unicode] # type: () -> Iterator
return iter(self.data) return iter(self.data)
def __len__(self): def __len__(self):
@ -103,15 +103,15 @@ class _TranslationProxy(UserString, object):
# type: () -> unicode # type: () -> unicode
return text_type(self.data) return text_type(self.data)
def __add__(self, other): def __add__(self, other): # type: ignore
# type: (unicode) -> unicode # type: (unicode) -> unicode
return self.data + other return self.data + other
def __radd__(self, other): def __radd__(self, other): # type: ignore
# type: (unicode) -> unicode # type: (unicode) -> unicode
return other + self.data return other + self.data
def __mod__(self, other): def __mod__(self, other): # type: ignore
# type: (unicode) -> unicode # type: (unicode) -> unicode
return self.data % other return self.data % other
@ -119,11 +119,11 @@ class _TranslationProxy(UserString, object):
# type: (unicode) -> unicode # type: (unicode) -> unicode
return other % self.data return other % self.data
def __mul__(self, other): def __mul__(self, other): # type: ignore
# type: (Any) -> unicode # type: (Any) -> unicode
return self.data * other return self.data * other
def __rmul__(self, other): def __rmul__(self, other): # type: ignore
# type: (Any) -> unicode # type: (Any) -> unicode
return other * self.data return other * self.data
@ -165,7 +165,7 @@ class _TranslationProxy(UserString, object):
# type: (Tuple[Callable, Tuple[unicode]]) -> None # type: (Tuple[Callable, Tuple[unicode]]) -> None
self._func, self._args = tup self._func, self._args = tup
def __getitem__(self, key): def __getitem__(self, key): # type: ignore
# type: (Any) -> unicode # type: (Any) -> unicode
return self.data[key] return self.data[key]

View File

@ -13,6 +13,11 @@
\ifdefined\pdfpxdimen \ifdefined\pdfpxdimen
\let\sphinxpxdimen\pdfpxdimen\else\newdimen\sphinxpxdimen \let\sphinxpxdimen\pdfpxdimen\else\newdimen\sphinxpxdimen
\fi \sphinxpxdimen=<%= pxunit %>\relax \fi \sphinxpxdimen=<%= pxunit %>\relax
<% if use_xindy -%>
%% turn off hyperref patch of \index as sphinx.xdy xindy module takes care of
%% suitable \hyperpage mark-up, working around hyperref-xindy incompatibility
\PassOptionsToPackage{hyperindex=false}{hyperref}
<% endif -%>
<%= passoptionstopackages %> <%= passoptionstopackages %>
\PassOptionsToPackage{warn}{textcomp} \PassOptionsToPackage{warn}{textcomp}
<%= inputenc %> <%= inputenc %>
@ -31,7 +36,7 @@
<%= hyperref %> <%= hyperref %>
<%= contentsname %> <%= contentsname %>
<%= numfig_format %> <%= numfig_format %>
<%= literalblockpto %> <%= translatablestrings %>
<%= pageautorefname %> <%= pageautorefname %>
<%= tocdepth %> <%= tocdepth %>
<%= secnumdepth %> <%= secnumdepth %>

View File

@ -223,7 +223,7 @@ class path(text_type):
""" """
Joins the path with the argument given and returns the result. Joins the path with the argument given and returns the result.
""" """
return self.__class__(os.path.join(self, *map(self.__class__, args))) # type: ignore # NOQA return self.__class__(os.path.join(self, *map(self.__class__, args)))
def listdir(self): def listdir(self):
# type: () -> List[unicode] # type: () -> List[unicode]

View File

@ -22,6 +22,15 @@ export LATEXOPTS =
# or on command line for faster builds. # or on command line for faster builds.
{% endif -%} {% endif -%}
LATEXMKOPTS = LATEXMKOPTS =
{% if xindy_use -%}
export XINDYOPTS = {{ xindy_lang_option }} -M sphinx.xdy
{% if latex_engine == 'pdflatex' and xindy_cyrillic -%}
XINDYOPTS += -M cyrLICRutf8.xdy
{% endif -%}
{% if latex_engine == 'xelatex' or latex_engine == 'lualatex' -%}
XINDYOPTS += -I xelatex
{% endif -%}
{% endif -%}
# format: pdf or dvi (used only by archive targets) # format: pdf or dvi (used only by archive targets)
FMT = pdf FMT = pdf

View File

@ -0,0 +1,103 @@
;; -*- coding: utf-8; mode: Lisp; -*-
;; style file for xindy
;; filename: cyrLICRutf8.xdy
;; description: style file for xindy which maps back LaTeX Internal
;; Character Representation of Cyrillic to utf-8
;; usage: for use with pdflatex produced .idx files.
;; This module must be loaded after the rule for suppressing space
;; characters has been executed, hence after module sphinx.xdy.
;; Contributed by the Sphinx team, July 2018.
(merge-rule "\IeC{\'\CYRG}" "Ѓ" :string)
(merge-rule "\IeC{\'\CYRK}" "Ќ" :string)
(merge-rule "\IeC{\'\cyrg}" "ѓ" :string)
(merge-rule "\IeC{\'\cyrk}" "ќ" :string)
(merge-rule "\IeC{\CYRA}" "А" :string)
(merge-rule "\IeC{\CYRB}" "Б" :string)
(merge-rule "\IeC{\CYRC}" "Ц" :string)
(merge-rule "\IeC{\CYRCH}" "Ч" :string)
(merge-rule "\IeC{\CYRD}" "Д" :string)
(merge-rule "\IeC{\CYRDJE}" "Ђ" :string)
(merge-rule "\IeC{\CYRDZE}" "Ѕ" :string)
(merge-rule "\IeC{\CYRDZHE}" "Џ" :string)
(merge-rule "\IeC{\CYRE}" "Е" :string)
(merge-rule "\IeC{\CYREREV}" "Э" :string)
(merge-rule "\IeC{\CYRERY}" "Ы" :string)
(merge-rule "\IeC{\CYRF}" "Ф" :string)
(merge-rule "\IeC{\CYRG}" "Г" :string)
(merge-rule "\IeC{\CYRGUP}" "Ґ" :string)
(merge-rule "\IeC{\CYRH}" "Х" :string)
(merge-rule "\IeC{\CYRHRDSN}" "Ъ" :string)
(merge-rule "\IeC{\CYRI}" "И" :string)
(merge-rule "\IeC{\CYRIE}" "Є" :string)
(merge-rule "\IeC{\CYRII}" "І" :string)
(merge-rule "\IeC{\CYRISHRT}" "Й" :string)
(merge-rule "\IeC{\CYRJE}" "Ј" :string)
(merge-rule "\IeC{\CYRK}" "К" :string)
(merge-rule "\IeC{\CYRL}" "Л" :string)
(merge-rule "\IeC{\CYRLJE}" "Љ" :string)
(merge-rule "\IeC{\CYRM}" "М" :string)
(merge-rule "\IeC{\CYRN}" "Н" :string)
(merge-rule "\IeC{\CYRNJE}" "Њ" :string)
(merge-rule "\IeC{\CYRO}" "О" :string)
(merge-rule "\IeC{\CYRP}" "П" :string)
(merge-rule "\IeC{\CYRR}" "Р" :string)
(merge-rule "\IeC{\CYRS}" "С" :string)
(merge-rule "\IeC{\CYRSFTSN}" "Ь" :string)
(merge-rule "\IeC{\CYRSH}" "Ш" :string)
(merge-rule "\IeC{\CYRSHCH}" "Щ" :string)
(merge-rule "\IeC{\CYRT}" "Т" :string)
(merge-rule "\IeC{\CYRTSHE}" "Ћ" :string)
(merge-rule "\IeC{\CYRU}" "У" :string)
(merge-rule "\IeC{\CYRUSHRT}" "Ў" :string)
(merge-rule "\IeC{\CYRV}" "В" :string)
(merge-rule "\IeC{\CYRYA}" "Я" :string)
(merge-rule "\IeC{\CYRYI}" "Ї" :string)
(merge-rule "\IeC{\CYRYO}" "Ё" :string)
(merge-rule "\IeC{\CYRYU}" "Ю" :string)
(merge-rule "\IeC{\CYRZ}" "З" :string)
(merge-rule "\IeC{\CYRZH}" "Ж" :string)
(merge-rule "\IeC{\cyra}" "а" :string)
(merge-rule "\IeC{\cyrb}" "б" :string)
(merge-rule "\IeC{\cyrc}" "ц" :string)
(merge-rule "\IeC{\cyrch}" "ч" :string)
(merge-rule "\IeC{\cyrd}" "д" :string)
(merge-rule "\IeC{\cyrdje}" "ђ" :string)
(merge-rule "\IeC{\cyrdze}" "ѕ" :string)
(merge-rule "\IeC{\cyrdzhe}" "џ" :string)
(merge-rule "\IeC{\cyre}" "е" :string)
(merge-rule "\IeC{\cyrerev}" "э" :string)
(merge-rule "\IeC{\cyrery}" "ы" :string)
(merge-rule "\IeC{\cyrf}" "ф" :string)
(merge-rule "\IeC{\cyrg}" "г" :string)
(merge-rule "\IeC{\cyrgup}" "ґ" :string)
(merge-rule "\IeC{\cyrh}" "х" :string)
(merge-rule "\IeC{\cyrhrdsn}" "ъ" :string)
(merge-rule "\IeC{\cyri}" "и" :string)
(merge-rule "\IeC{\cyrie}" "є" :string)
(merge-rule "\IeC{\cyrii}" "і" :string)
(merge-rule "\IeC{\cyrishrt}" "й" :string)
(merge-rule "\IeC{\cyrje}" "ј" :string)
(merge-rule "\IeC{\cyrk}" "к" :string)
(merge-rule "\IeC{\cyrl}" "л" :string)
(merge-rule "\IeC{\cyrlje}" "љ" :string)
(merge-rule "\IeC{\cyrm}" "м" :string)
(merge-rule "\IeC{\cyrn}" "н" :string)
(merge-rule "\IeC{\cyrnje}" "њ" :string)
(merge-rule "\IeC{\cyro}" "о" :string)
(merge-rule "\IeC{\cyrp}" "п" :string)
(merge-rule "\IeC{\cyrr}" "р" :string)
(merge-rule "\IeC{\cyrs}" "с" :string)
(merge-rule "\IeC{\cyrsftsn}" "ь" :string)
(merge-rule "\IeC{\cyrsh}" "ш" :string)
(merge-rule "\IeC{\cyrshch}" "щ" :string)
(merge-rule "\IeC{\cyrt}" "т" :string)
(merge-rule "\IeC{\cyrtshe}" "ћ" :string)
(merge-rule "\IeC{\cyru}" "у" :string)
(merge-rule "\IeC{\cyrushrt}" "ў" :string)
(merge-rule "\IeC{\cyrv}" "в" :string)
(merge-rule "\IeC{\cyrya}" "я" :string)
(merge-rule "\IeC{\cyryi}" "ї" :string)
(merge-rule "\IeC{\cyryo}" "ё" :string)
(merge-rule "\IeC{\cyryu}" "ю" :string)
(merge-rule "\IeC{\cyrz}" "з" :string)
(merge-rule "\IeC{\cyrzh}" "ж" :string)

View File

@ -10,7 +10,11 @@ $pdflatex = 'xelatex ' . $ENV{'LATEXOPTS'} . ' %O %S';
{% endif -%} {% endif -%}
$lualatex = 'lualatex ' . $ENV{'LATEXOPTS'} . ' %O %S'; $lualatex = 'lualatex ' . $ENV{'LATEXOPTS'} . ' %O %S';
$xelatex = 'xelatex --no-pdf ' . $ENV{'LATEXOPTS'} . ' %O %S'; $xelatex = 'xelatex --no-pdf ' . $ENV{'LATEXOPTS'} . ' %O %S';
{% if xindy_use -%}
$makeindex = 'xindy ' . $ENV{'XINDYOPTS'} . ' %O -o %D %S';
{% else -%}
$makeindex = 'makeindex -s python.ist %O -o %D %S'; $makeindex = 'makeindex -s python.ist %O -o %D %S';
{% endif -%}
add_cus_dep( "glo", "gls", 0, "makeglo" ); add_cus_dep( "glo", "gls", 0, "makeglo" );
sub makeglo { sub makeglo {
return system( "makeindex -s gglo.ist -o '$_[0].gls' '$_[0].glo'" ); return system( "makeindex -s gglo.ist -o '$_[0].gls' '$_[0].glo'" );

View File

@ -3,11 +3,11 @@ headings_flag 1
heading_prefix " \\bigletter " heading_prefix " \\bigletter "
preamble "\\begin{sphinxtheindex} preamble "\\begin{sphinxtheindex}
\\def\\bigletter#1{{\\Large\\sffamily#1}\\nopagebreak\\vspace{1mm}} \\let\\bigletter\\sphinxstyleindexlettergroup
" "
postamble "\n\n\\end{sphinxtheindex}\n" postamble "\n\n\\end{sphinxtheindex}\n"
symhead_positive "{Symbols}" symhead_positive "{\\sphinxsymbolsname}"
numhead_positive "{Numbers}" numhead_positive "{\\sphinxnumbersname}"

View File

@ -6,7 +6,7 @@
% %
\NeedsTeXFormat{LaTeX2e}[1995/12/01] \NeedsTeXFormat{LaTeX2e}[1995/12/01]
\ProvidesPackage{sphinx}[2018/03/28 v1.8 LaTeX package (Sphinx markup)] \ProvidesPackage{sphinx}[2018/06/30 v1.8 LaTeX package (Sphinx markup)]
% provides \ltx@ifundefined % provides \ltx@ifundefined
% (many packages load ltxcmds: graphicx does for pdftex and lualatex but % (many packages load ltxcmds: graphicx does for pdftex and lualatex but
@ -470,6 +470,11 @@
{\newenvironment{sphinxtheindex}{\begin{theindex}}{\end{theindex}}}% {\newenvironment{sphinxtheindex}{\begin{theindex}}{\end{theindex}}}%
{}% else clause of \ltx@ifundefined {}% else clause of \ltx@ifundefined
% for usage with xindy: this string gets internationalized in preamble
\newcommand*{\sphinxnonalphabeticalgroupname}{}
% redefined in preamble, headings for makeindex produced index
\newcommand*{\sphinxsymbolsname}{}
\newcommand*{\sphinxnumbersname}{}
%% COLOR (general) %% COLOR (general)
% %
@ -1591,10 +1596,13 @@
{\textnormal{\Large[}}{#1}\hspace{0.5mm}{\textnormal{\Large]}}} {\textnormal{\Large[}}{#1}\hspace{0.5mm}{\textnormal{\Large]}}}
% additional customizable styling % additional customizable styling
% FIXME: convert this to package options ? \def\sphinxstyleindexentry #1{\texttt{#1}}
\protected\def\sphinxstyleindexentry #1{\texttt{#1}} \def\sphinxstyleindexextra #1{ \emph{(#1)}}
\protected\def\sphinxstyleindexextra #1{ \emph{(#1)}} \def\sphinxstyleindexpageref #1{, \pageref{#1}}
\protected\def\sphinxstyleindexpageref #1{, \pageref{#1}} \def\sphinxstyleindexlettergroup #1%
{{\Large\sffamily#1}\nopagebreak\vspace{1mm}}
\def\sphinxstyleindexlettergroupDefault #1%
{{\Large\sffamily\sphinxnonalphabeticalgroupname}\nopagebreak\vspace{1mm}}
\protected\def\sphinxstyletopictitle #1{\textbf{#1}\par\medskip} \protected\def\sphinxstyletopictitle #1{\textbf{#1}\par\medskip}
\let\sphinxstylesidebartitle\sphinxstyletopictitle \let\sphinxstylesidebartitle\sphinxstyletopictitle
\protected\def\sphinxstyleothertitle #1{\textbf{#1}} \protected\def\sphinxstyleothertitle #1{\textbf{#1}}

133
sphinx/texinputs/sphinx.xdy Normal file
View File

@ -0,0 +1,133 @@
;;; -*- mode: lisp; coding: utf-8; -*-
;; Unfortunately xindy is out-of-the-box hyperref-incompatible. This
;; configuration is a workaround, which requires to pass option
;; hyperindex=false to hyperref.
;; textit and emph not currently used by Sphinx LaTeX writer.
(define-attributes (("textbf" "textit" "emph" "default")))
(markup-locref :open "\textbf{\hyperpage{" :close "}}" :attr "textbf")
(markup-locref :open "\textit{\hyperpage{" :close "}}" :attr "textit")
(markup-locref :open "\emph{\hyperpage{" :close "}}" :attr "emph")
(markup-locref :open "\hyperpage{" :close "}" :attr "default")
(require "numeric-sort.xdy")
;; xindy base module latex.xdy loads tex.xdy and the latter instructs
;; xindy to ignore **all** TeX macros in .idx entries, except those
;; explicitely described in merge rule. But when after applying all
;; merge rules an empty string results, xindy raises an error:
;; ERROR: CHAR: index 0 should be less than the length of the string
;; For example when using pdflatex with utf-8 characters the index
;; file will contain \IeC macros and they will get ignored except if
;; suitable merge rules are loaded early. The texindy script coming
;; with xindy provides this, but only for Latin scripts. The texindy
;; man page says to use rather xelatex or lualatex in case of Cyrillic
;; scripts.
;; Sphinx contributes cyrLICRutf8.xdy to provide support for Cyrillic
;; scripts for the pdflatex engine.
;; Another issue caused by xindy ignoring all TeX macros except those
;; explicitely declared reveals itself when attempting to index ">>>",
;; as the ">" is converted to "\textgreater{}" by Sphinx's LaTeX
;; escaping.
;; To fix this, Sphinx does **not** use texindy, and does not even
;; load the xindy latex.xdy base module.
;(require "latex.xdy")
;; Rather it incorporates some suitable extracts from latex.xdy and
;; tex.xdy with additional Sphinx contributed rules.
;;;;;;;; extracts from tex.xdy (discarding most original comments):
;;;
;;; TeX conventions
;;;
;; Discard leading and trailing white space. Collapse multiple white
;; space characters to blank.
(merge-rule "^ +" "" :eregexp)
(merge-rule " +$" "" :eregexp)
(merge-rule " +" " " :eregexp)
;; Handle TeX markup
(merge-rule "\\([{}$%&#])" "\1" :eregexp)
;;;;;;;; end of extracts from xindy's tex.xdy
;;;;;;;; extracts from latex.xdy:
;; Standard location classes: arabic and roman numbers, and alphabets.
(define-location-class "arabic-page-numbers" ("arabic-numbers"))
(define-location-class "roman-page-numbers" ("roman-numbers-lowercase"))
(define-location-class "Roman-page-numbers" ("roman-numbers-uppercase"))
(define-location-class "alpha-page-numbers" ("alpha"))
(define-location-class "Alpha-page-numbers" ("ALPHA"))
;; Output Markup
(markup-letter-group-list :sep "~n~n \indexspace~n")
(markup-indexentry :open "~n \item " :depth 0)
(markup-indexentry :open "~n \subitem " :depth 1)
(markup-indexentry :open "~n \subsubitem " :depth 2)
(markup-locclass-list :open ", " :sep ", ")
(markup-locref-list :sep ", ")
;;;;;;;; end of extracts from latex.xdy
;; Sphinx additions, cf sphinx.util.texescape for rationale
;;
;; blanks are already ignored from above merge-rules, so no space
;; character after TeX control words, despite the fact that they will
;; be present in .idx file.
(merge-rule "\\sphinxleftcurlybrace\{\}" "{")
(merge-rule "\\sphinxrightcurlybrace\{\}" "}")
(merge-rule "\\_" "_")
(merge-rule "\{\[\}" "[")
(merge-rule "\{\]\}" "]")
(merge-rule "\{\}`" "`")
(merge-rule "\\textbackslash\{\}" "\\")
(merge-rule "\\textasciitilde\{\}" "~~")
(merge-rule "\\textless\{\}" "<")
(merge-rule "\\textgreater\{\}" ">")
(merge-rule "\\textasciicircum\{\}" "^")
(merge-rule "\\P\{\}" "¶")
(merge-rule "\\S\{\}" "§")
(merge-rule "\\texteuro\{\}" "€")
(merge-rule "\\\(\\infty\\\)" "∞")
(merge-rule "\\\(\\pm\\\)" "±")
(merge-rule "\\\(\\rightarrow\\\)" "→")
(merge-rule "\\\(\\checkmark\\\)" "✓")
(merge-rule "\\textendash\{\}" "")
(merge-rule "\\textbar\{\}" "|")
;; This xindy module provides some basic support for "see"
(require "makeindex.xdy")
;; This creates one-letter headings and works fine with utf-8 letters.
;; For Cyrillic and pdflatex necessitates cyrLICRutf8.xdy to be loaded too.
(require "latin-lettergroups.xdy")
;; currently we don't (know how to easily) separate "Numbers" from
;; "Symbols" with xindy as is the case with makeindex.
(markup-index :open "\begin{sphinxtheindex}
\let\lettergroup\sphinxstyleindexlettergroup
\let\lettergroupDefault\sphinxstyleindexlettergroupDefault
"
:close "
\end{sphinxtheindex}
"
:tree)

View File

@ -241,7 +241,7 @@ def object_description(object):
if isinstance(object, dict): if isinstance(object, dict):
try: try:
sorted_keys = sorted(object) sorted_keys = sorted(object)
except TypeError: except Exception:
pass # Cannot sort dict keys, fall back to generic repr pass # Cannot sort dict keys, fall back to generic repr
else: else:
items = ("%s: %s" % items = ("%s: %s" %

View File

@ -130,7 +130,7 @@ DEFAULT_SETTINGS = {
'tocdepth': '', 'tocdepth': '',
'secnumdepth': '', 'secnumdepth': '',
'pageautorefname': '', 'pageautorefname': '',
'literalblockpto': '', 'translatablestrings': '',
} # type: Dict[unicode, unicode] } # type: Dict[unicode, unicode]
ADDITIONAL_SETTINGS = { ADDITIONAL_SETTINGS = {
@ -255,7 +255,7 @@ class ExtBabel(Babel):
def get_mainlanguage_options(self): def get_mainlanguage_options(self):
# type: () -> unicode # type: () -> unicode
"""Return options for polyglossia's ``\setmainlanguage``.""" """Return options for polyglossia's ``\\setmainlanguage``."""
if self.use_polyglossia is False: if self.use_polyglossia is False:
return None return None
elif self.language == 'german': elif self.language == 'german':
@ -497,6 +497,7 @@ class LaTeXTranslator(nodes.NodeVisitor):
'release': self.encode(builder.config.release), 'release': self.encode(builder.config.release),
'author': document.settings.author, # treat as a raw LaTeX code 'author': document.settings.author, # treat as a raw LaTeX code
'indexname': _('Index'), 'indexname': _('Index'),
'use_xindy': builder.config.latex_use_xindy,
}) })
if not self.elements['releasename'] and self.elements['release']: if not self.elements['releasename'] and self.elements['release']:
self.elements.update({ self.elements.update({
@ -667,12 +668,21 @@ class LaTeXTranslator(nodes.NodeVisitor):
if self.elements['extraclassoptions']: if self.elements['extraclassoptions']:
self.elements['classoptions'] += ',' + \ self.elements['classoptions'] += ',' + \
self.elements['extraclassoptions'] self.elements['extraclassoptions']
self.elements['literalblockpto'] = ( self.elements['translatablestrings'] = (
self.babel_renewcommand( self.babel_renewcommand(
'\\literalblockcontinuedname', self.encode(_('continued from previous page')) '\\literalblockcontinuedname', self.encode(_('continued from previous page'))
) + ) +
self.babel_renewcommand( self.babel_renewcommand(
'\\literalblockcontinuesname', self.encode(_('continues on next page')) '\\literalblockcontinuesname', self.encode(_('continues on next page'))
) +
self.babel_renewcommand(
'\\sphinxnonalphabeticalgroupname', self.encode(_('Non-alphabetical'))
) +
self.babel_renewcommand(
'\\sphinxsymbolsname', self.encode(_('Symbols'))
) +
self.babel_renewcommand(
'\\sphinxnumbersname', self.encode(_('Numbers'))
) )
) )
self.elements['pageautorefname'] = \ self.elements['pageautorefname'] = \
@ -856,8 +866,7 @@ class LaTeXTranslator(nodes.NodeVisitor):
def generate(content, collapsed): def generate(content, collapsed):
# type: (List[Tuple[unicode, List[Tuple[unicode, unicode, unicode, unicode, unicode]]]], bool) -> None # NOQA # type: (List[Tuple[unicode, List[Tuple[unicode, unicode, unicode, unicode, unicode]]]], bool) -> None # NOQA
ret.append('\\begin{sphinxtheindex}\n') ret.append('\\begin{sphinxtheindex}\n')
ret.append('\\def\\bigletter#1{{\\Large\\sffamily#1}' ret.append('\\let\\bigletter\\sphinxstyleindexlettergroup\n')
'\\nopagebreak\\vspace{1mm}}\n')
for i, (letter, entries) in enumerate(content): for i, (letter, entries) in enumerate(content):
if i > 0: if i > 0:
ret.append('\\indexspace\n') ret.append('\\indexspace\n')
@ -866,7 +875,8 @@ class LaTeXTranslator(nodes.NodeVisitor):
for entry in entries: for entry in entries:
if not entry[3]: if not entry[3]:
continue continue
ret.append('\\item {\\sphinxstyleindexentry{%s}}' % self.encode(entry[0])) ret.append('\\item\\relax\\sphinxstyleindexentry{%s}' %
self.encode(entry[0]))
if entry[4]: if entry[4]:
# add "extra" info # add "extra" info
ret.append('\\sphinxstyleindexextra{%s}' % self.encode(entry[4])) ret.append('\\sphinxstyleindexextra{%s}' % self.encode(entry[4]))
@ -1919,8 +1929,11 @@ class LaTeXTranslator(nodes.NodeVisitor):
# type: (nodes.Node, Pattern) -> None # type: (nodes.Node, Pattern) -> None
def escape(value): def escape(value):
value = self.encode(value) value = self.encode(value)
value = value.replace(r'\{', r'{\sphinxleftcurlybrace}') value = value.replace(r'\{', r'\sphinxleftcurlybrace{}')
value = value.replace(r'\}', r'{\sphinxrightcurlybrace}') value = value.replace(r'\}', r'\sphinxrightcurlybrace{}')
value = value.replace('"', '""')
value = value.replace('@', '"@')
value = value.replace('!', '"!')
return value return value
if not node.get('inline', True): if not node.get('inline', True):

View File

@ -1201,7 +1201,7 @@ def test_latex_index(app, status, warning):
result = (app.outdir / 'Python.tex').text(encoding='utf8') result = (app.outdir / 'Python.tex').text(encoding='utf8')
assert 'A \\index{famous}famous \\index{equation}equation:\n' in result assert 'A \\index{famous}famous \\index{equation}equation:\n' in result
assert '\n\\index{Einstein}\\index{relativity}\\ignorespaces \nand' in result assert '\n\\index{Einstein}\\index{relativity}\\ignorespaces \nand' in result
assert '\n\\index{main {\\sphinxleftcurlybrace}}\\ignorespaces ' in result assert '\n\\index{main \\sphinxleftcurlybrace{}}\\ignorespaces ' in result
@pytest.mark.sphinx('latex', testroot='latex-equations') @pytest.mark.sphinx('latex', testroot='latex-equations')

View File

@ -81,6 +81,10 @@ def test_extract_summary(capsys):
doc = ['Blabla, i.e. bla.'] doc = ['Blabla, i.e. bla.']
assert extract_summary(doc, document) == 'Blabla, i.e.' assert extract_summary(doc, document) == 'Blabla, i.e.'
# literal
doc = ['blah blah::']
assert extract_summary(doc, document) == 'blah blah.'
_, err = capsys.readouterr() _, err = capsys.readouterr()
assert err == '' assert err == ''

View File

@ -27,12 +27,14 @@ commands=
pytest -Wall --durations 25 {posargs} pytest -Wall --durations 25 {posargs}
[testenv:flake8] [testenv:flake8]
basepython = python3
description = description =
Run style checks. Run style checks.
commands = commands =
flake8 flake8
[testenv:pylint] [testenv:pylint]
basepython = python3
description = description =
Run source code analyzer. Run source code analyzer.
deps = deps =
@ -42,6 +44,7 @@ commands =
pylint --rcfile utils/pylintrc sphinx pylint --rcfile utils/pylintrc sphinx
[testenv:coverage] [testenv:coverage]
basepython = python3
description = description =
Run code coverage checks. Run code coverage checks.
setenv = setenv =
@ -51,6 +54,7 @@ commands =
coverage report coverage report
[testenv:mypy] [testenv:mypy]
basepython = python3
description = description =
Run type checks. Run type checks.
deps = deps =
@ -59,6 +63,7 @@ commands=
mypy sphinx/ mypy sphinx/
[testenv:docs] [testenv:docs]
basepython = python3
description = description =
Build documentation. Build documentation.
commands = commands =