diff --git a/CHANGES b/CHANGES
index 7a9ece74b..91da1dea2 100644
--- a/CHANGES
+++ b/CHANGES
@@ -21,6 +21,7 @@ Dependencies
* The sphinxcontrib-websupport package is no longer a dependency
* Some packages are separated to sub packages:
+ - sphinxcontrib.applehelp
- sphinxcontrib.devhelp
- sphinxcontrib.jsmath
- sphinxcontrib.qthelp
@@ -61,6 +62,9 @@ Incompatible changes
* websupport: unbundled from sphinx core. Please use sphinxcontrib-websupport
* C++, the visibility of base classes is now always rendered as present in the
input. That is, ``private`` is now shown, where it was ellided before.
+* LaTeX: graphics inclusion of oversized images rescales to not exceed
+ the text width and height, even if width and/or height option were used.
+ (refs: #5956)
Deprecated
----------
@@ -167,8 +171,13 @@ Features added
* #1341 the HTML search considers words that contain a search term of length
three or longer a match.
* #4611: epub: Show warning for duplicated ToC entries
+* #1851: Allow to omit an argument for :rst:dir:`code-block` directive. If
+ omitted, it follows :rst:dir:`highlight` or :confval:`highlight_language`
+* #6016: HTML search: A placeholder for the search summary prevents search
+ result links from changing their position when the search terminates. This
+ makes navigating search results easier.
* #5196: linkcheck also checks remote images exist
-
+
Bugs fixed
----------
@@ -216,6 +225,8 @@ Features added
Bugs fixed
----------
+* LaTeX: Remove extraneous space after author names on PDF title page (refs: #6004)
+
Testing
--------
diff --git a/EXAMPLES b/EXAMPLES
index 2426c46e2..86b153812 100644
--- a/EXAMPLES
+++ b/EXAMPLES
@@ -18,6 +18,7 @@ Documentation using the alabaster theme
* `Click `__ (customized)
* `coala `__ (customized)
* `CodePy `__
+* `Eve `__ (Python REST API framework)
* `Fabric `__
* `Fityk `__
* `Flask `__
@@ -110,6 +111,7 @@ Documentation using the classic theme
Documentation using the sphinxdoc theme
---------------------------------------
+* `ABRT `__
* `cartopy `__
* `Jython `__
* `Matplotlib `__
@@ -183,11 +185,14 @@ Documentation using sphinx_rtd_theme
* `Elemental `__
* `ESWP3 `__
* `Ethereum Homestead `__
+* `Faker `__
* `Fidimag `__
* `Flake8 `__
+* `Flatpak `__
* `FluidDyn `__
* `Fluidsim `__
* `GeoNode `__
+* `Glances `__
* `Godot `__
* `Graylog `__
* `GPAW `__ (customized)
@@ -225,6 +230,7 @@ Documentation using sphinx_rtd_theme
* `Phinx `__
* `phpMyAdmin `__
* `PROS `__ (customized)
+* `Pushkin `__
* `Pweave `__
* `PyPy `__
* `python-sqlparse `__
@@ -236,6 +242,7 @@ Documentation using sphinx_rtd_theme
* `Quex `__
* `Satchmo `__
* `Scapy `__
+* `SimGrid `__
* `SimPy `__
* `six `__
* `SlamData `__
@@ -249,12 +256,14 @@ Documentation using sphinx_rtd_theme
* `Sublime Text Unofficial Documentation `__
* `SunPy `__
* `Sylius `__
+* `Syncthing `__
* `Tango Controls `__ (customized)
* `Topshelf `__
* `Theano `__
* `ThreatConnect `__
* `Tuleap `__
* `TYPO3 `__ (customized)
+* `Veyon `__
* `uWSGI `__
* `virtualenv `__
* `Wagtail `__
@@ -262,6 +271,7 @@ Documentation using sphinx_rtd_theme
* `Weblate `__
* `x265 `__
* `ZeroNet `__
+* `Zulip `__
Documentation using sphinx_bootstrap_theme
------------------------------------------
@@ -301,6 +311,7 @@ Documentation using a custom theme or integrated in a website
* `GHC - Glasgow Haskell Compiler `__
* `Guzzle `__
* `H2O.ai `__
+* `Heka `__
* `Istihza (Turkish Python documentation project) `__
* `Kombu `__
* `Lasso `__
@@ -378,6 +389,7 @@ Books produced using Sphinx
* `"Mithril -- The fastest clientside MVC (Japanese)" `__
* `"Pioneers and Prominent Men of Utah" `__
* `"Pomodoro Technique Illustrated" (Japanese translation) `__
+* `"Professional Software Development" `__
* `"Python Professional Programming" (in Japanese) `__
* `"Python Professional Programming 2nd Edition" (in Japanese) `__
* `"Python Professional Programming 3rd Edition" (in Japanese) `__
diff --git a/doc/extdev/index.rst b/doc/extdev/index.rst
index 56f2e7cee..95564936c 100644
--- a/doc/extdev/index.rst
+++ b/doc/extdev/index.rst
@@ -275,6 +275,11 @@ The following is a list of deprecated interfaces.
- 4.0
- ``docutils.nodes.abbreviation``
+ * - ``sphinx.builders.applehelp``
+ - 2.0
+ - 4.0
+ - ``sphinxcontrib.applehelp``
+
* - ``sphinx.builders.devhelp``
- 2.0
- 4.0
diff --git a/doc/man/sphinx-quickstart.rst b/doc/man/sphinx-quickstart.rst
index 1d7a99add..7da16ed1e 100644
--- a/doc/man/sphinx-quickstart.rst
+++ b/doc/man/sphinx-quickstart.rst
@@ -70,10 +70,6 @@ Options
Master document name. (see :confval:`master_doc`).
-.. option:: --epub
-
- Use epub.
-
.. rubric:: Extension Options
.. option:: --ext-autodoc
diff --git a/doc/usage/builders/index.rst b/doc/usage/builders/index.rst
index 3d66604a3..5cc6df31c 100644
--- a/doc/usage/builders/index.rst
+++ b/doc/usage/builders/index.rst
@@ -91,7 +91,7 @@ The builder's "name" must be given to the **-b** command-line option of
.. _Qt help: https://doc.qt.io/qt-4.8/qthelp-framework.html
-.. module:: sphinx.builders.applehelp
+.. module:: sphinxcontrib.applehelp
.. class:: AppleHelpBuilder
This builder produces an Apple Help Book based on the same output as the
@@ -117,6 +117,10 @@ The builder's "name" must be given to the **-b** command-line option of
.. versionadded:: 1.3
+ .. versionchanged:: 2.0
+
+ Moved to sphinxcontrib.applehelp from sphinx.builders package.
+
.. module:: sphinxcontrib.devhelp
.. class:: DevhelpBuilder
diff --git a/doc/usage/restructuredtext/directives.rst b/doc/usage/restructuredtext/directives.rst
index 947146dd2..85ee22ae9 100644
--- a/doc/usage/restructuredtext/directives.rst
+++ b/doc/usage/restructuredtext/directives.rst
@@ -463,7 +463,7 @@ __ http://pygments.org/docs/lexers/
This will produce line numbers for all code blocks longer than five lines.
-.. rst:directive:: .. code-block:: language
+.. rst:directive:: .. code-block:: [language]
Example::
@@ -471,9 +471,11 @@ __ http://pygments.org/docs/lexers/
Some Ruby code.
- The directive's alias name :rst:dir:`sourcecode` works as well. As with
- :rst:dir:`highlight`\ 's ``language`` option, ``language`` can be any lexer
- alias supported by Pygments.
+ The directive's alias name :rst:dir:`sourcecode` works as well. This
+ directive takes a language name as an argument. It can be any lexer alias
+ supported by Pygments. If it is not given, the setting of
+ :rst:dir:`highlight` directive will be used. If not set,
+ :confval:`highlight_language` will be used.
**Additional options**
@@ -533,6 +535,9 @@ __ http://pygments.org/docs/lexers/
.. versionchanged:: 1.6.6
LaTeX supports the ``emphasize-lines`` option.
+ .. versionchanged:: 2.0
+ The ``language`` argument becomes optional.
+
.. rst:directive:: .. literalinclude:: filename
Longer displays of verbatim text may be included by storing the example text
diff --git a/setup.py b/setup.py
index 1eb1d6dd3..5b2c38e8c 100644
--- a/setup.py
+++ b/setup.py
@@ -15,6 +15,7 @@ if sys.version_info < (3, 5):
sys.exit(1)
install_requires = [
+ 'sphinxcontrib-applehelp',
'sphinxcontrib-devhelp',
'sphinxcontrib-jsmath',
'sphinxcontrib-qthelp',
diff --git a/sphinx/application.py b/sphinx/application.py
index 8565886e6..cce9926b5 100644
--- a/sphinx/application.py
+++ b/sphinx/application.py
@@ -62,9 +62,9 @@ if False:
builtin_extensions = (
'sphinx.addnodes',
- 'sphinx.builders.applehelp',
'sphinx.builders.changes',
'sphinx.builders.epub3',
+ 'sphinx.builders.dirhtml',
'sphinx.builders.dummy',
'sphinx.builders.gettext',
'sphinx.builders.html',
@@ -106,6 +106,7 @@ builtin_extensions = (
'sphinx.environment.collectors.toctree',
'sphinx.environment.collectors.indexentries',
# 1st party extensions
+ 'sphinxcontrib.applehelp',
'sphinxcontrib.devhelp',
'sphinxcontrib.qthelp',
# Strictly, alabaster theme is not a builtin extension,
diff --git a/sphinx/builders/applehelp.py b/sphinx/builders/applehelp.py
index 61535c49d..0ee50ff56 100644
--- a/sphinx/builders/applehelp.py
+++ b/sphinx/builders/applehelp.py
@@ -8,21 +8,15 @@
:license: BSD, see LICENSE for details.
"""
-import plistlib
-import shlex
-import subprocess
-from os import path, environ
-from subprocess import CalledProcessError, PIPE, STDOUT
+import warnings
-from sphinx import package_dir
-from sphinx.builders.html import StandaloneHTMLBuilder
-from sphinx.errors import SphinxError
-from sphinx.locale import __
-from sphinx.util import logging
-from sphinx.util import SkipProgressMessage, progress_message
-from sphinx.util.fileutil import copy_asset, copy_asset_file
-from sphinx.util.matching import Matcher
-from sphinx.util.osutil import ensuredir, make_filename
+from sphinxcontrib.applehelp import (
+ AppleHelpCodeSigningFailed,
+ AppleHelpIndexerFailed,
+ AppleHelpBuilder,
+)
+
+from sphinx.deprecation import RemovedInSphinx40Warning, deprecated_alias
if False:
# For type annotation
@@ -30,240 +24,20 @@ if False:
from sphinx.application import Sphinx # NOQA
-logger = logging.getLogger(__name__)
-template_dir = path.join(package_dir, 'templates', 'applehelp')
-
-
-class AppleHelpIndexerFailed(SphinxError):
- category = __('Help indexer failed')
-
-
-class AppleHelpCodeSigningFailed(SphinxError):
- category = __('Code signing failed')
-
-
-class AppleHelpBuilder(StandaloneHTMLBuilder):
- """
- Builder that outputs an Apple help book. Requires Mac OS X as it relies
- on the ``hiutil`` command line tool.
- """
- name = 'applehelp'
- epilog = __('The help book is in %(outdir)s.\n'
- 'Note that won\'t be able to view it unless you put it in '
- '~/Library/Documentation/Help or install it in your application '
- 'bundle.')
-
- # don't copy the reST source
- copysource = False
- supported_image_types = ['image/png', 'image/gif', 'image/jpeg',
- 'image/tiff', 'image/jp2', 'image/svg+xml']
-
- # don't add links
- add_permalinks = False
-
- # this is an embedded HTML format
- embedded = True
-
- # don't generate the search index or include the search page
- search = False
-
- def init(self):
- # type: () -> None
- super().init()
- # the output files for HTML help must be .html only
- self.out_suffix = '.html'
- self.link_suffix = '.html'
-
- if self.config.applehelp_bundle_id is None:
- raise SphinxError(__('You must set applehelp_bundle_id before '
- 'building Apple Help output'))
-
- self.bundle_path = path.join(self.outdir,
- self.config.applehelp_bundle_name + '.help')
- self.outdir = path.join(self.bundle_path,
- 'Contents',
- 'Resources',
- self.config.applehelp_locale + '.lproj')
-
- def handle_finish(self):
- # type: () -> None
- super().handle_finish()
-
- self.finish_tasks.add_task(self.copy_localized_files)
- self.finish_tasks.add_task(self.build_helpbook)
-
- @progress_message(__('copying localized files'))
- def copy_localized_files(self):
- # type: () -> None
- source_dir = path.join(self.confdir, self.config.applehelp_locale + '.lproj')
- target_dir = self.outdir
-
- if path.isdir(source_dir):
- excluded = Matcher(self.config.exclude_patterns + ['**/.*'])
- copy_asset(source_dir, target_dir, excluded,
- context=self.globalcontext, renderer=self.templates)
-
- def build_helpbook(self):
- # type: () -> None
- contents_dir = path.join(self.bundle_path, 'Contents')
- resources_dir = path.join(contents_dir, 'Resources')
- language_dir = path.join(resources_dir,
- self.config.applehelp_locale + '.lproj')
- ensuredir(language_dir)
-
- self.build_info_plist(contents_dir)
- self.copy_applehelp_icon(resources_dir)
- self.build_access_page(language_dir)
- self.build_helpindex(language_dir)
-
- if self.config.applehelp_codesign_identity:
- self.do_codesign()
-
- @progress_message(__('writing Info.plist'))
- def build_info_plist(self, contents_dir):
- # type: (str) -> None
- """Construct the Info.plist file."""
- info_plist = {
- 'CFBundleDevelopmentRegion': self.config.applehelp_dev_region,
- 'CFBundleIdentifier': self.config.applehelp_bundle_id,
- 'CFBundleInfoDictionaryVersion': '6.0',
- 'CFBundlePackageType': 'BNDL',
- 'CFBundleShortVersionString': self.config.release,
- 'CFBundleSignature': 'hbwr',
- 'CFBundleVersion': self.config.applehelp_bundle_version,
- 'HPDBookAccessPath': '_access.html',
- 'HPDBookIndexPath': 'search.helpindex',
- 'HPDBookTitle': self.config.applehelp_title,
- 'HPDBookType': '3',
- 'HPDBookUsesExternalViewer': False,
- }
-
- if self.config.applehelp_icon is not None:
- info_plist['HPDBookIconPath'] = path.basename(self.config.applehelp_icon)
-
- if self.config.applehelp_kb_url is not None:
- info_plist['HPDBookKBProduct'] = self.config.applehelp_kb_product
- info_plist['HPDBookKBURL'] = self.config.applehelp_kb_url
-
- if self.config.applehelp_remote_url is not None:
- info_plist['HPDBookRemoteURL'] = self.config.applehelp_remote_url
-
- with open(path.join(contents_dir, 'Info.plist'), 'wb') as f:
- plistlib.dump(info_plist, f)
-
- def copy_applehelp_icon(self, resources_dir):
- # type: (str) -> None
- """Copy the icon, if one is supplied."""
- if self.config.applehelp_icon:
-
- try:
- with progress_message(__('copying icon... ')):
- applehelp_icon = path.join(self.srcdir, self.config.applehelp_icon)
- copy_asset_file(applehelp_icon, resources_dir)
- except Exception as err:
- logger.warning(__('cannot copy icon file %r: %s'), applehelp_icon, err)
-
- @progress_message(__('building access page'))
- def build_access_page(self, language_dir):
- # type: (str) -> None
- """Build the access page."""
- context = {
- 'toc': self.config.master_doc + self.out_suffix,
- 'title': self.config.applehelp_title,
- }
- copy_asset_file(path.join(template_dir, '_access.html_t'), language_dir, context)
-
- @progress_message(__('generating help index'))
- def build_helpindex(self, language_dir):
- # type: (str) -> None
- """Generate the help index."""
- args = [
- self.config.applehelp_indexer_path,
- '-Cf',
- path.join(language_dir, 'search.helpindex'),
- language_dir
- ]
-
- if self.config.applehelp_index_anchors is not None:
- args.append('-a')
-
- if self.config.applehelp_min_term_length is not None:
- args += ['-m', '%s' % self.config.applehelp_min_term_length]
-
- if self.config.applehelp_stopwords is not None:
- args += ['-s', self.config.applehelp_stopwords]
-
- if self.config.applehelp_locale is not None:
- args += ['-l', self.config.applehelp_locale]
-
- if self.config.applehelp_disable_external_tools:
- raise SkipProgressMessage(__('you will need to index this help book with:\n %s'),
- ' '.join([shlex.quote(arg) for arg in args]))
- else:
- try:
- subprocess.run(args, stdout=PIPE, stderr=STDOUT, check=True)
- except OSError:
- raise AppleHelpIndexerFailed(__('Command not found: %s') % args[0])
- except CalledProcessError as exc:
- raise AppleHelpIndexerFailed(exc.stdout)
-
- @progress_message(__('signing help book'))
- def do_codesign(self):
- # type: () -> None
- """If we've been asked to, sign the bundle."""
- args = [
- self.config.applehelp_codesign_path,
- '-s', self.config.applehelp_codesign_identity,
- '-f'
- ]
-
- args += self.config.applehelp_codesign_flags
-
- args.append(self.bundle_path)
-
- if self.config.applehelp_disable_external_tools:
- raise SkipProgressMessage(__('you will need to sign this help book with:\n %s'),
- ' '.join([shlex.quote(arg) for arg in args]))
- else:
- try:
- subprocess.run(args, stdout=PIPE, stderr=STDOUT, check=True)
- except OSError:
- raise AppleHelpCodeSigningFailed(__('Command not found: %s') % args[0])
- except CalledProcessError as exc:
- raise AppleHelpCodeSigningFailed(exc.stdout)
+deprecated_alias('sphinx.builders.applehelp',
+ {
+ 'AppleHelpCodeSigningFailed': AppleHelpCodeSigningFailed,
+ 'AppleHelpIndexerFailed': AppleHelpIndexerFailed,
+ 'AppleHelpBuilder': AppleHelpBuilder,
+ },
+ RemovedInSphinx40Warning)
def setup(app):
# type: (Sphinx) -> Dict[str, Any]
- app.setup_extension('sphinx.builders.html')
- app.add_builder(AppleHelpBuilder)
-
- app.add_config_value('applehelp_bundle_name',
- lambda self: make_filename(self.project), 'applehelp')
- app.add_config_value('applehelp_bundle_id', None, 'applehelp', [str])
- app.add_config_value('applehelp_dev_region', 'en-us', 'applehelp')
- app.add_config_value('applehelp_bundle_version', '1', 'applehelp')
- app.add_config_value('applehelp_icon', None, 'applehelp', [str])
- app.add_config_value('applehelp_kb_product',
- lambda self: '%s-%s' % (make_filename(self.project), self.release),
- 'applehelp')
- app.add_config_value('applehelp_kb_url', None, 'applehelp', [str])
- app.add_config_value('applehelp_remote_url', None, 'applehelp', [str])
- app.add_config_value('applehelp_index_anchors', False, 'applehelp', [str])
- app.add_config_value('applehelp_min_term_length', None, 'applehelp', [str])
- app.add_config_value('applehelp_stopwords',
- lambda self: self.language or 'en', 'applehelp')
- app.add_config_value('applehelp_locale', lambda self: self.language or 'en', 'applehelp')
- app.add_config_value('applehelp_title', lambda self: self.project + ' Help', 'applehelp')
- app.add_config_value('applehelp_codesign_identity',
- lambda self: environ.get('CODE_SIGN_IDENTITY', None),
- 'applehelp')
- app.add_config_value('applehelp_codesign_flags',
- lambda self: shlex.split(environ.get('OTHER_CODE_SIGN_FLAGS', '')),
- 'applehelp')
- app.add_config_value('applehelp_indexer_path', '/usr/bin/hiutil', 'applehelp')
- app.add_config_value('applehelp_codesign_path', '/usr/bin/codesign', 'applehelp')
- app.add_config_value('applehelp_disable_external_tools', False, None)
+ warnings.warn('sphinx.builders.applehelp has been moved to sphinxcontrib-applehelp.',
+ RemovedInSphinx40Warning)
+ app.setup_extension('sphinxcontrib.applehelp')
return {
'version': 'builtin',
diff --git a/sphinx/builders/dirhtml.py b/sphinx/builders/dirhtml.py
new file mode 100644
index 000000000..7ab6fad98
--- /dev/null
+++ b/sphinx/builders/dirhtml.py
@@ -0,0 +1,68 @@
+"""
+ sphinx.builders.dirhtml
+ ~~~~~~~~~~~~~~~~~~~~~~~
+
+ Directory HTML builders.
+
+ :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS.
+ :license: BSD, see LICENSE for details.
+"""
+
+from os import path
+
+from sphinx.builders.html import StandaloneHTMLBuilder
+from sphinx.util import logging
+from sphinx.util.osutil import SEP, os_path
+
+if False:
+ # For type annotation
+ from typing import Any, Dict, Set # NOQA
+ from sphinx.application import Sphinx # NOQA
+
+logger = logging.getLogger(__name__)
+
+
+class DirectoryHTMLBuilder(StandaloneHTMLBuilder):
+ """
+ A StandaloneHTMLBuilder that creates all HTML pages as "index.html" in
+ a directory given by their pagename, so that generated URLs don't have
+ ``.html`` in them.
+ """
+ name = 'dirhtml'
+
+ def get_target_uri(self, docname, typ=None):
+ # type: (str, str) -> str
+ if docname == 'index':
+ return ''
+ if docname.endswith(SEP + 'index'):
+ return docname[:-5] # up to sep
+ return docname + SEP
+
+ def get_outfilename(self, pagename):
+ # type: (str) -> str
+ if pagename == 'index' or pagename.endswith(SEP + 'index'):
+ outfilename = path.join(self.outdir, os_path(pagename) +
+ self.out_suffix)
+ else:
+ outfilename = path.join(self.outdir, os_path(pagename),
+ 'index' + self.out_suffix)
+
+ return outfilename
+
+ def prepare_writing(self, docnames):
+ # type: (Set[str]) -> None
+ super().prepare_writing(docnames)
+ self.globalcontext['no_search_suffix'] = True
+
+
+def setup(app):
+ # type: (Sphinx) -> Dict[str, Any]
+ app.setup_extension('sphinx.builders.html')
+
+ app.add_builder(DirectoryHTMLBuilder)
+
+ return {
+ 'version': 'builtin',
+ 'parallel_read_safe': True,
+ 'parallel_write_safe': True,
+ }
diff --git a/sphinx/builders/html.py b/sphinx/builders/html.py
index 87b3ccac8..09ba8d677 100644
--- a/sphinx/builders/html.py
+++ b/sphinx/builders/html.py
@@ -1169,39 +1169,6 @@ class StandaloneHTMLBuilder(Builder):
logger.info(__('done'))
-class DirectoryHTMLBuilder(StandaloneHTMLBuilder):
- """
- A StandaloneHTMLBuilder that creates all HTML pages as "index.html" in
- a directory given by their pagename, so that generated URLs don't have
- ``.html`` in them.
- """
- name = 'dirhtml'
-
- def get_target_uri(self, docname, typ=None):
- # type: (str, str) -> str
- if docname == 'index':
- return ''
- if docname.endswith(SEP + 'index'):
- return docname[:-5] # up to sep
- return docname + SEP
-
- def get_outfilename(self, pagename):
- # type: (str) -> str
- if pagename == 'index' or pagename.endswith(SEP + 'index'):
- outfilename = path.join(self.outdir, os_path(pagename) +
- self.out_suffix)
- else:
- outfilename = path.join(self.outdir, os_path(pagename),
- 'index' + self.out_suffix)
-
- return outfilename
-
- def prepare_writing(self, docnames):
- # type: (Set[str]) -> None
- super().prepare_writing(docnames)
- self.globalcontext['no_search_suffix'] = True
-
-
class SerializingHTMLBuilder(StandaloneHTMLBuilder):
"""
An abstract builder that serializes the generated HTML.
@@ -1417,10 +1384,12 @@ def validate_math_renderer(app):
# for compatibility
+from sphinx.builders.dirhtml import DirectoryHTMLBuilder # NOQA
from sphinx.builders.singlehtml import SingleFileHTMLBuilder # NOQA
deprecated_alias('sphinx.builders.html',
{
+ 'DirectoryHTMLBuilder': DirectoryHTMLBuilder,
'SingleFileHTMLBuilder': SingleFileHTMLBuilder,
},
RemovedInSphinx40Warning)
@@ -1430,7 +1399,6 @@ def setup(app):
# type: (Sphinx) -> Dict[str, Any]
# builders
app.add_builder(StandaloneHTMLBuilder)
- app.add_builder(DirectoryHTMLBuilder)
app.add_builder(PickleHTMLBuilder)
app.add_builder(JSONHTMLBuilder)
diff --git a/sphinx/directives/code.py b/sphinx/directives/code.py
index 106d400b9..9ac704c55 100644
--- a/sphinx/directives/code.py
+++ b/sphinx/directives/code.py
@@ -47,9 +47,11 @@ class Highlight(SphinxDirective):
def run(self):
# type: () -> List[nodes.Node]
+ language = self.arguments[0].strip()
linenothreshold = self.options.get('linenothreshold', sys.maxsize)
- return [addnodes.highlightlang(lang=self.arguments[0].strip(),
- linenothreshold=linenothreshold)]
+
+ self.env.temp_data['highlight_language'] = language
+ return [addnodes.highlightlang(lang=language, linenothreshold=linenothreshold)]
class HighlightLang(Highlight):
@@ -110,8 +112,8 @@ class CodeBlock(SphinxDirective):
"""
has_content = True
- required_arguments = 1
- optional_arguments = 0
+ required_arguments = 0
+ optional_arguments = 1
final_argument_whitespace = False
option_spec = {
'linenos': directives.flag,
@@ -152,10 +154,20 @@ class CodeBlock(SphinxDirective):
code = '\n'.join(lines)
literal = nodes.literal_block(code, code) # type: nodes.Element
- literal['language'] = self.arguments[0]
literal['linenos'] = 'linenos' in self.options or \
'lineno-start' in self.options
literal['classes'] += self.options.get('class', [])
+ if self.arguments:
+ # highlight language specified
+ literal['language'] = self.arguments[0]
+ literal['force_highlighting'] = True
+ else:
+ # no highlight language specified. Then this directive refers the current
+ # highlight setting via ``highlight`` directive or ``highlight_language``
+ # configuration.
+ literal['language'] = self.env.temp_data.get('highlight_language',
+ self.config.highlight_language)
+ literal['force_highlighting'] = False
extra_args = literal['highlight_args'] = {}
if hl_lines is not None:
extra_args['hl_lines'] = hl_lines
diff --git a/sphinx/locale/__init__.py b/sphinx/locale/__init__.py
index e955e34f5..166b473a6 100644
--- a/sphinx/locale/__init__.py
+++ b/sphinx/locale/__init__.py
@@ -266,7 +266,9 @@ def get_translation(catalog, namespace='general'):
With this code, sphinx searches a message catalog from
``${package_dir}/locales/${language}/LC_MESSAGES/${__name__}.mo``
- The :confval:`language` is used for the searching.
+ (ex. ``sphinxcontrib.applehelp.mo``). Of course, you can use
+ arbitrary catalog name instead of ``__name__``. The
+ :confval:`language` is used for the searching.
.. versionadded:: 1.8
"""
diff --git a/sphinx/templates/applehelp/_access.html_t b/sphinx/templates/applehelp/_access.html_t
deleted file mode 100644
index aa6b2dcc4..000000000
--- a/sphinx/templates/applehelp/_access.html_t
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
- {{ title|e }}
-
-
-
-
-
-
-
diff --git a/sphinx/texinputs/sphinx.sty b/sphinx/texinputs/sphinx.sty
index 3af7d3e1f..6ace6a9ce 100644
--- a/sphinx/texinputs/sphinx.sty
+++ b/sphinx/texinputs/sphinx.sty
@@ -707,53 +707,79 @@
%% GRAPHICS
%
-% \sphinxincludegraphics defined to resize images larger than the line width,
-% except if height or width option present.
+% \sphinxincludegraphics resizes images larger than the TeX \linewidth (which
+% is adjusted in indented environments), or taller than a certain maximal
+% height (usually \textheight and this is reduced in the environments which use
+% framed.sty to avoid infinite loop if image too tall).
%
-% If scale is present, rescale before fitting to line width. (since 1.5)
-\newbox\spx@image@box
-\newcommand*{\sphinxincludegraphics}[2][]{%
- \in@{height}{#1}\ifin@\else\in@{width}{#1}\fi
- \ifin@ % height or width present
- \includegraphics[#1]{#2}%
- \else % no height nor width (but #1 may be "scale=...")
+% In case height or width options are present the rescaling is done
+% (since 2.0), in a way keeping the width:height ratio either native from
+% image or from the width and height options if both were present.
+%
+\newdimen\spx@image@maxheight
+\AtBeginDocument{\spx@image@maxheight\textheight}
+
+% box scratch register
+\newdimen\spx@image@box
+\newcommand*{\sphinxsafeincludegraphics}[2][]{%
+ % #1 contains possibly width=, height=, but no scale= since 1.8.4
\setbox\spx@image@box\hbox{\includegraphics[#1,draft]{#2}}%
+ \in@false % use some handy boolean flag
\ifdim \wd\spx@image@box>\linewidth
- \setbox\spx@image@box\box\voidb@x % clear memory
- \includegraphics[#1,width=\linewidth]{#2}%
+ \in@true % flag to remember to adjust options and set box dimensions
+ % compute height which results from rescaling width to \linewidth
+ % and keep current aspect ratio. multiply-divide in \numexpr uses
+ % temporarily doubled precision, hence no overflow. (of course we
+ % assume \ht is not a few sp's below \maxdimen...(about 16384pt).
+ \edef\spx@image@rescaledheight % with sp units
+ {\the\numexpr\ht\spx@image@box
+ *\linewidth/\wd\spx@image@box sp}%
+ \ifdim\spx@image@rescaledheight>\spx@image@maxheight
+ % the rescaled height will be too big, so it is height which decides
+ % the rescaling factor
+ \def\spx@image@requiredheight{\spx@image@maxheight}% dimen register
+ \edef\spx@image@requiredwidth % with sp units
+ {\the\numexpr\wd\spx@image@box
+ *\spx@image@maxheight/\ht\spx@image@box sp}%
+ % TODO: decide if this commented-out block could be needed due to
+ % rounding in numexpr operations going up
+ % \ifdim\spx@image@requiredwidth>\linewidth
+ % \def\spx@image@requiredwidth{\linewidth}% dimen register
+ % \fi
+ \else
+ \def\spx@image@requiredwidth{\linewidth}% dimen register
+ \let\spx@image@requiredheight\spx@image@rescaledheight% sp units
+ \fi
\else
+ % width is ok, let's check height
+ \ifdim\ht\spx@image@box>\spx@image@maxheight
+ \in@true
+ \edef\spx@image@requiredwidth % with sp units
+ {\the\numexpr\wd\spx@image@box
+ *\spx@image@maxheight/\ht\spx@image@box sp}%
+ \def\spx@image@requiredheight{\spx@image@maxheight}% dimen register
+ \fi
+ \fi % end of check of width and height
+ \ifin@
+ \setbox\spx@image@box
+ \hbox{\includegraphics
+ [%#1,% contained only width and/or height and overruled anyhow
+ width=\spx@image@requiredwidth,height=\spx@image@requiredheight]%
+ {#2}}%
+ % \includegraphics does not set box dimensions to the exactly
+ % requested ones, see https://github.com/latex3/latex2e/issues/112
+ \wd\spx@image@box\spx@image@requiredwidth
+ \ht\spx@image@box\spx@image@requiredheight
+ \leavevmode\box\spx@image@box
+ \else
+ % here we do not modify the options, no need to adjust width and height
+ % on output, they will be computed exactly as with "draft" option
\setbox\spx@image@box\box\voidb@x % clear memory
\includegraphics[#1]{#2}%
\fi
- \fi
-}
-% \sphinxsafeincludegraphics resizes images larger than the line width,
-% or taller than about the text height (whether or not height/width options
-% were used). This is requested to avoid a crash with \MakeFramed as used by
-% sphinxShadowBox (topic/contents) and sphinxheavybox (admonitions), and also
-% by sphinxVerbatim (but a priori no image inclusion there).
-\newdimen\spx@image@maxheight
-% default maximal setting will get reduced by sphinxShadowBox/sphinxheavybox
-\AtBeginDocument{\spx@image@maxheight\textheight}
-\newcommand*{\sphinxsafeincludegraphics}[2][]{%
- \gdef\spx@includegraphics@options{#1}%
- \setbox\spx@image@box\hbox{\includegraphics[#1,draft]{#2}}%
- \in@false
- \ifdim \wd\spx@image@box>\linewidth
- \g@addto@macro\spx@includegraphics@options{,width=\linewidth}%
- \in@true
- \fi
- % no rotation, no need to worry about depth
- \ifdim \ht\spx@image@box>\spx@image@maxheight
- \g@addto@macro\spx@includegraphics@options{,height=\spx@image@maxheight}%
- \in@true
- \fi
- \ifin@
- \g@addto@macro\spx@includegraphics@options{,keepaspectratio}%
- \fi
- \setbox\spx@image@box\box\voidb@x % clear memory
- \expandafter\includegraphics\expandafter[\spx@includegraphics@options]{#2}%
}%
+% Use the "safe" one by default (2.0)
+\def\sphinxincludegraphics{\sphinxsafeincludegraphics}
%% FIGURE IN TABLE
@@ -1374,7 +1400,6 @@
+2\sphinxshadowsep
+\sphinxshadowsize
+\baselineskip\relax
- \let\sphinxincludegraphics\sphinxsafeincludegraphics
% configure framed.sty not to add extra vertical spacing
\ltx@ifundefined{OuterFrameSep}{}{\OuterFrameSep\z@skip}%
% the \trivlist will add the vertical spacing on top and bottom which is
@@ -1461,7 +1486,6 @@
-\dimexpr2\FrameRule
+2\FrameSep
+\baselineskip\relax % will happen again if nested, needed indeed!
- \let\sphinxincludegraphics\sphinxsafeincludegraphics
% configure framed.sty's parameters to obtain same vertical spacing
% as for "light" boxes. We need for this to manually insert parskip glue and
% revert a skip done by framed before the frame.
diff --git a/sphinx/texinputs/sphinxhowto.cls b/sphinx/texinputs/sphinxhowto.cls
index f2572b3b4..ba5e0031c 100644
--- a/sphinx/texinputs/sphinxhowto.cls
+++ b/sphinx/texinputs/sphinxhowto.cls
@@ -46,7 +46,7 @@
{\Large
\begin{tabular}[t]{c}
\@author
- \end{tabular}}\par
+ \end{tabular}\kern-\tabcolsep}\par
\vspace{25pt}
\@date \par
\py@authoraddress \par
diff --git a/sphinx/texinputs/sphinxmanual.cls b/sphinx/texinputs/sphinxmanual.cls
index eabc1af7b..e7c8f41ef 100644
--- a/sphinx/texinputs/sphinxmanual.cls
+++ b/sphinx/texinputs/sphinxmanual.cls
@@ -55,7 +55,7 @@
{\LARGE
\begin{tabular}[t]{c}
\@author
- \end{tabular}
+ \end{tabular}\kern-\tabcolsep
\par}
\vfill\vfill
{\large
diff --git a/sphinx/themes/basic/static/searchtools.js b/sphinx/themes/basic/static/searchtools.js
index e15d80036..bdc270655 100644
--- a/sphinx/themes/basic/static/searchtools.js
+++ b/sphinx/themes/basic/static/searchtools.js
@@ -130,7 +130,7 @@ var Search = {
this.out = $('#search-results');
this.title = $('' + _('Searching') + '
').appendTo(this.out);
this.dots = $('').appendTo(this.title);
- this.status = $('').appendTo(this.out);
+ this.status = $('
').appendTo(this.out);
this.output = $('').appendTo(this.out);
$('#search-progress').text(_('Preparing search...'));
diff --git a/sphinx/transforms/post_transforms/code.py b/sphinx/transforms/post_transforms/code.py
index c873dd5bc..fb8533e9c 100644
--- a/sphinx/transforms/post_transforms/code.py
+++ b/sphinx/transforms/post_transforms/code.py
@@ -89,7 +89,7 @@ class HighlightLanguageVisitor(nodes.NodeVisitor):
if 'language' not in node:
node['language'] = setting.language
node['force_highlighting'] = False
- else:
+ elif 'force_highlighting' not in node:
node['force_highlighting'] = True
if 'linenos' not in node:
lines = node.astext().count('\n')
diff --git a/tests/conftest.py b/tests/conftest.py
index a8392a6c0..6342e7e8e 100644
--- a/tests/conftest.py
+++ b/tests/conftest.py
@@ -7,6 +7,7 @@
"""
import os
+import shutil
import docutils
import pytest
@@ -23,13 +24,32 @@ collect_ignore = ['roots']
@pytest.fixture(scope='session')
def rootdir():
- return path(os.path.dirname(__file__)).abspath() / 'roots'
+ return path(__file__).parent.abspath() / 'roots'
def pytest_report_header(config):
- return ("libraries: Sphinx-%s, docutils-%s" %
- (sphinx.__display_version__, docutils.__version__))
+ header = ("libraries: Sphinx-%s, docutils-%s" %
+ (sphinx.__display_version__, docutils.__version__))
+ if hasattr(config, '_tmp_path_factory'):
+ header += "\nbase tempdir: %s" % config._tmp_path_factory.getbasetemp()
+
+ return header
def pytest_assertrepr_compare(op, left, right):
comparer.pytest_assertrepr_compare(op, left, right)
+
+
+def _initialize_test_directory(session):
+ if 'SPHINX_TEST_TEMPDIR' in os.environ:
+ tempdir = os.path.abspath(os.getenv('SPHINX_TEST_TEMPDIR'))
+ print('Temporary files will be placed in %s.' % tempdir)
+
+ if os.path.exists(tempdir):
+ shutil.rmtree(tempdir)
+
+ os.makedirs(tempdir)
+
+
+def pytest_sessionstart(session):
+ _initialize_test_directory(session)
diff --git a/tests/roots/test-directive-code/highlight.rst b/tests/roots/test-directive-code/highlight.rst
new file mode 100644
index 000000000..4191b58c4
--- /dev/null
+++ b/tests/roots/test-directive-code/highlight.rst
@@ -0,0 +1,20 @@
+highlight
+---------
+
+.. code-block::
+
+ "A code-block without no language"
+
+.. code-block:: python2
+
+ "A code-block with language argument"
+
+.. highlight:: python3
+
+.. code-block::
+
+ "A code-block without no language after highlight directive"
+
+.. code-block:: python2
+
+ "A code-block without language argument after highlight directive"
diff --git a/tests/roots/test-ext-imgconverter/svgimg.svg b/tests/roots/test-ext-imgconverter/svgimg.svg
index 533a9fa65..2bae0b9b9 100644
--- a/tests/roots/test-ext-imgconverter/svgimg.svg
+++ b/tests/roots/test-ext-imgconverter/svgimg.svg
@@ -1,4 +1,4 @@
-