From 27abce6306645ce14a4f8affa8f43a665559c9b0 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Sat, 17 Mar 2018 13:38:34 +0900 Subject: [PATCH 1/4] Show warning on creating directory for remote image (refs: #4688) --- sphinx/transforms/post_transforms/images.py | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/sphinx/transforms/post_transforms/images.py b/sphinx/transforms/post_transforms/images.py index b8f4b9a5d..8c75b6aa0 100644 --- a/sphinx/transforms/post_transforms/images.py +++ b/sphinx/transforms/post_transforms/images.py @@ -66,16 +66,17 @@ class ImageDownloader(BaseImageConverter): def handle(self, node): # type: (nodes.Node) -> None - basename = os.path.basename(node['uri']) - if '?' in basename: - basename = basename.split('?')[0] - if basename == '': - basename = sha1(node['uri'].encode("utf-8")).hexdigest() - dirname = node['uri'].replace('://', '/').translate({ord("?"): u"/", - ord("&"): u"/"}) - ensuredir(os.path.join(self.imagedir, dirname)) - path = os.path.join(self.imagedir, dirname, basename) try: + basename = os.path.basename(node['uri']) + if '?' in basename: + basename = basename.split('?')[0] + if basename == '': + basename = sha1(node['uri'].encode("utf-8")).hexdigest() + dirname = node['uri'].replace('://', '/').translate({ord("?"): u"/", + ord("&"): u"/"}) + ensuredir(os.path.join(self.imagedir, dirname)) + path = os.path.join(self.imagedir, dirname, basename) + headers = {} if os.path.exists(path): timestamp = ceil(os.stat(path).st_mtime) From 0eb5e0865ac7b5bba131311e4d108174c32a3398 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Sat, 17 Mar 2018 13:43:42 +0900 Subject: [PATCH 2/4] Fix #4688: Error to download remote images having long URL --- CHANGES | 1 + sphinx/transforms/post_transforms/images.py | 10 ++++++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index fb9c429a8..e9ee71765 100644 --- a/CHANGES +++ b/CHANGES @@ -27,6 +27,7 @@ Bugs fixed * #4725: Sphinx does not work with python 3.5.0 and 3.5.1 * #4716: Generation PDF file with TexLive on Windows, file not found error * #4574: vertical space before equation in latex +* #4688: Error to download remote images having long URL Testing -------- diff --git a/sphinx/transforms/post_transforms/images.py b/sphinx/transforms/post_transforms/images.py index 8c75b6aa0..6dd135e1e 100644 --- a/sphinx/transforms/post_transforms/images.py +++ b/sphinx/transforms/post_transforms/images.py @@ -30,6 +30,8 @@ if False: logger = logging.getLogger(__name__) +MAX_FILENAME_LEN = 32 + class BaseImageConverter(SphinxTransform): def apply(self): @@ -70,10 +72,14 @@ class ImageDownloader(BaseImageConverter): basename = os.path.basename(node['uri']) if '?' in basename: basename = basename.split('?')[0] - if basename == '': - basename = sha1(node['uri'].encode("utf-8")).hexdigest() + if basename == '' or len(basename) > MAX_FILENAME_LEN: + filename, ext = os.path.splitext(node['uri']) + basename = sha1(filename.encode("utf-8")).hexdigest() + ext + dirname = node['uri'].replace('://', '/').translate({ord("?"): u"/", ord("&"): u"/"}) + if len(dirname) > MAX_FILENAME_LEN: + dirname = sha1(dirname.encode('utf-8')).hexdigest() ensuredir(os.path.join(self.imagedir, dirname)) path = os.path.join(self.imagedir, dirname, basename) From c3afffe54feca4787b4aaee119c223efaa8bc807 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Sun, 18 Mar 2018 21:55:21 +0900 Subject: [PATCH 3/4] Fix #2286: Sphinx crashes when error is happens in rendering HTML pages --- CHANGES | 1 + sphinx/builders/html.py | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index 029b9efcb..a9702cae5 100644 --- a/CHANGES +++ b/CHANGES @@ -29,6 +29,7 @@ Bugs fixed * #4574: vertical space before equation in latex * #4720: message when an image is mismatched for builder is not clear * #4655, #4684: Incomplete localization strings in Polish and Chinese +* #2286: Sphinx crashes when error is happens in rendering HTML pages Testing -------- diff --git a/sphinx/builders/html.py b/sphinx/builders/html.py index 183ffc017..fad49486b 100644 --- a/sphinx/builders/html.py +++ b/sphinx/builders/html.py @@ -35,8 +35,9 @@ from sphinx.deprecation import RemovedInSphinx20Warning from sphinx.environment.adapters.asset import ImageAdapter from sphinx.environment.adapters.indexentries import IndexEntries from sphinx.environment.adapters.toctree import TocTree +from sphinx.errors import ThemeError from sphinx.highlighting import PygmentsBridge -from sphinx.locale import _, l_ +from sphinx.locale import _, __, l_ from sphinx.search import js_index from sphinx.theming import HTMLThemeFactory from sphinx.util import jsonimpl, logging, status_iterator @@ -1016,6 +1017,9 @@ class StandaloneHTMLBuilder(Builder): "Please make sure all config values that contain " "non-ASCII content are Unicode strings.", pagename) return + except Exception as exc: + raise ThemeError(__("An error happened in rendering the page %s.\nReason: %r") % + (pagename, exc)) if not outfilename: outfilename = self.get_outfilename(pagename) From 0ad232696a688bb80b7393c124812dedb3e7a24d Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Sun, 18 Mar 2018 21:06:22 +0900 Subject: [PATCH 4/4] Update docs (refs: #2307) --- doc/markup/code.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/markup/code.rst b/doc/markup/code.rst index 3b14bd6e2..19ec0cc4c 100644 --- a/doc/markup/code.rst +++ b/doc/markup/code.rst @@ -96,7 +96,7 @@ switch on line numbers for the individual block:: Some more Ruby code. The first line number can be selected with the ``lineno-start`` option. If -present, ``linenos`` is automatically activated as well:: +present, ``linenos`` flag is automatically activated:: .. code-block:: ruby :lineno-start: 10