mirror of
https://github.com/sphinx-doc/sphinx.git
synced 2025-02-25 18:55:22 -06:00
merge with stable
This commit is contained in:
commit
55368daa91
33
doc/make.bat
Normal file
33
doc/make.bat
Normal file
@ -0,0 +1,33 @@
|
||||
@ECHO OFF
|
||||
|
||||
REM Command file for Sphinx documentation
|
||||
|
||||
if "%SPHINXBUILD%" == "" (
|
||||
set SPHINXBUILD=python ../sphinx-build.py
|
||||
)
|
||||
set SOURCEDIR=.
|
||||
set BUILDDIR=_build
|
||||
set SPHINXPROJ=sphinx-doc
|
||||
|
||||
if "%1" == "" goto help
|
||||
|
||||
%SPHINXBUILD% 2> nul
|
||||
if errorlevel 9009 (
|
||||
echo.
|
||||
echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
|
||||
echo.installed, then set the SPHINXBUILD environment variable to point
|
||||
echo.to the full path of the 'sphinx-build' executable. Alternatively you
|
||||
echo.may add the Sphinx directory to PATH.
|
||||
echo.
|
||||
echo.If you don't have Sphinx installed, grab it from
|
||||
echo.http://sphinx-doc.org/
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS%
|
||||
goto end
|
||||
|
||||
:help
|
||||
%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS%
|
||||
|
||||
:end
|
@ -238,7 +238,7 @@ def recurse_tree(rootpath, excludes, opts):
|
||||
|
||||
def normalize_excludes(rootpath, excludes):
|
||||
"""Normalize the excluded directory list."""
|
||||
return [path.normpath(path.abspath(exclude)) for exclude in excludes]
|
||||
return [path.abspath(exclude) for exclude in excludes]
|
||||
|
||||
|
||||
def is_excluded(root, excludes):
|
||||
@ -247,7 +247,6 @@ def is_excluded(root, excludes):
|
||||
Note: by having trailing slashes, we avoid common prefix issues, like
|
||||
e.g. an exlude "foo" also accidentally excluding "foobar".
|
||||
"""
|
||||
root = path.normpath(root)
|
||||
for exclude in excludes:
|
||||
if root == exclude:
|
||||
return True
|
||||
@ -328,7 +327,7 @@ Note: By default this script will not overwrite already created files.""")
|
||||
if not opts.destdir:
|
||||
parser.error('An output directory is required.')
|
||||
if opts.header is None:
|
||||
opts.header = path.normpath(rootpath).split(path.sep)[-1]
|
||||
opts.header = path.abspath(rootpath).split(path.sep)[-1]
|
||||
if opts.suffix.startswith('.'):
|
||||
opts.suffix = opts.suffix[1:]
|
||||
if not path.isdir(rootpath):
|
||||
@ -337,7 +336,7 @@ Note: By default this script will not overwrite already created files.""")
|
||||
if not path.isdir(opts.destdir):
|
||||
if not opts.dryrun:
|
||||
os.makedirs(opts.destdir)
|
||||
rootpath = path.normpath(path.abspath(rootpath))
|
||||
rootpath = path.abspath(rootpath)
|
||||
excludes = normalize_excludes(rootpath, excludes)
|
||||
modules = recurse_tree(rootpath, excludes, opts)
|
||||
if opts.full:
|
||||
|
@ -446,8 +446,11 @@ class Sphinx(object):
|
||||
'version.' % (extension, err))
|
||||
if ext_meta is None:
|
||||
ext_meta = {}
|
||||
if not ext_meta.get('version'):
|
||||
ext_meta['version'] = 'unknown version'
|
||||
try:
|
||||
if not ext_meta.get('version'):
|
||||
ext_meta['version'] = 'unknown version'
|
||||
except:
|
||||
ext_meta = {'version': 'unknown version'}
|
||||
self._extensions[extension] = mod
|
||||
self._extension_metadata[extension] = ext_meta
|
||||
|
||||
|
@ -141,8 +141,6 @@ class SphinxFileInput(FileInput):
|
||||
def __init__(self, app, env, *args, **kwds):
|
||||
self.app = app
|
||||
self.env = env
|
||||
# don't call sys.exit() on IOErrors
|
||||
kwds['handle_io_errors'] = False
|
||||
kwds['error_handler'] = 'sphinx' # py3: handle error on open.
|
||||
FileInput.__init__(self, *args, **kwds)
|
||||
|
||||
|
@ -71,28 +71,28 @@ class Theme(object):
|
||||
|
||||
@classmethod
|
||||
def load_extra_theme(cls, name):
|
||||
if name == 'alabaster':
|
||||
cls.themes[name] = (os.path.join(alabaster.get_path(), name), None)
|
||||
# alabaster theme also requires 'alabaster' extension, it will be loaded at
|
||||
# sphinx.******* module.
|
||||
return
|
||||
if name in ('alabaster', 'sphinx_rtd_theme'):
|
||||
if name == 'alabaster':
|
||||
themedir = alabaster.get_path()
|
||||
# alabaster theme also requires 'alabaster' extension, it will be loaded
|
||||
# at sphinx.application module.
|
||||
elif name == 'sphinx_rtd_theme':
|
||||
themedir = sphinx_rtd_theme.get_html_theme_path()
|
||||
else:
|
||||
raise NotImplementedError('Programming Error')
|
||||
|
||||
if name == 'sphinx_rtd_theme':
|
||||
cls.themes[name] = (
|
||||
os.path.join(sphinx_rtd_theme.get_html_theme_path(), name), None)
|
||||
return
|
||||
|
||||
for themedir in load_theme_plugins():
|
||||
if not path.isdir(themedir):
|
||||
continue
|
||||
for theme in os.listdir(themedir):
|
||||
if theme != name:
|
||||
continue
|
||||
if not path.isfile(path.join(themedir, theme, THEMECONF)):
|
||||
continue
|
||||
cls.themes[theme] = (path.join(themedir, theme), None)
|
||||
else:
|
||||
for themedir in load_theme_plugins():
|
||||
if path.isfile(path.join(themedir, name, THEMECONF)):
|
||||
break
|
||||
else:
|
||||
# specified theme is not found
|
||||
return
|
||||
|
||||
cls.themepath.append(themedir)
|
||||
cls.themes[name] = (path.join(themedir, name), None)
|
||||
return
|
||||
|
||||
def __init__(self, name, warn=None):
|
||||
if name not in self.themes:
|
||||
self.load_extra_theme(name)
|
||||
@ -101,11 +101,13 @@ class Theme(object):
|
||||
'(missing theme.conf?)' % name)
|
||||
self.name = name
|
||||
|
||||
if name == 'default' and warn:
|
||||
warn("'default' html theme has been renamed to 'classic'. "
|
||||
"Please change your html_theme setting either to "
|
||||
"the new 'alabaster' default theme, or to 'classic' "
|
||||
"to keep using the old default.")
|
||||
# Do not warn yet -- to be compatible with old Sphinxes, people *have*
|
||||
# to use "default".
|
||||
# if name == 'default' and warn:
|
||||
# warn("'default' html theme has been renamed to 'classic'. "
|
||||
# "Please change your html_theme setting either to "
|
||||
# "the new 'alabaster' default theme, or to 'classic' "
|
||||
# "to keep using the old default.")
|
||||
|
||||
tdir, tinfo = self.themes[name]
|
||||
if tinfo is None:
|
||||
@ -133,6 +135,11 @@ class Theme(object):
|
||||
inherit = self.themeconf.get('theme', 'inherit')
|
||||
except configparser.NoOptionError:
|
||||
raise ThemeError('theme %r doesn\'t have "inherit" setting' % name)
|
||||
|
||||
if inherit in ['alabaster', 'sphinx_rtd_theme']:
|
||||
# include 'alabaster' or 'sphinx_themes' automatically #1794
|
||||
self.load_extra_theme(inherit)
|
||||
|
||||
if inherit == 'none':
|
||||
self.base = None
|
||||
elif inherit not in self.themes:
|
||||
|
@ -349,8 +349,9 @@ class HTMLTranslator(BaseTranslator):
|
||||
if isinstance(node.parent, nodes.container) and node.parent.get('literal_block'):
|
||||
self.add_permalink_ref(node.parent, _('Permalink to this code'))
|
||||
elif isinstance(node.parent, nodes.figure):
|
||||
self.add_permalink_ref(
|
||||
node.parent.traverse(nodes.image)[0], _('Permalink to this image'))
|
||||
image_nodes = node.parent.traverse(nodes.image)
|
||||
target_node = image_nodes and image_nodes[0] or node.parent
|
||||
self.add_permalink_ref(target_node, _('Permalink to this image'))
|
||||
elif node.parent.get('toctree'):
|
||||
self.add_permalink_ref(node.parent.parent, _('Permalink to this toctree'))
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user