def process_doc(self, app: Sphinx, doctree: nodes.document) -> None: """Process and rewrite image URIs.""" docname = app.env.docname for node in doctree.findall(nodes.image): # Map the mimetype to the corresponding image. The writer may # choose the best image from these candidates. The special key * is # set if there is only single candidate to be used by a writer. # The special key ? is set for nonlocal URIs. candidates: Dict[str, str] = {} node['candidates'] = candidates imguri = node['uri'] if imguri.startswith('data:'): candidates['?'] = imguri continue elif imguri.find('://') != -1: candidates['?'] = imguri continue if imguri.endswith(os.extsep + '*'): # Update `node['uri']` to a relative path from srcdir # from a relative path from current document. rel_imgpath, full_imgpath = app.env.relfn2path(imguri, docname) node['uri'] = rel_imgpath if app.config.language: # Search language-specific figures at first i18n_imguri = get_image_filename_for_language( imguri, app.env) _, full_i18n_imgpath = app.env.relfn2path( i18n_imguri, docname) self.collect_candidates(app.env, full_i18n_imgpath, candidates, node) self.collect_candidates(app.env, full_imgpath, candidates, node) else: if app.config.language: # substitute imguri by figure_language_filename # (ex. foo.png -> foo.en.png) imguri = search_image_for_language(imguri, app.env) # Update `node['uri']` to a relative path from srcdir # from a relative path from current document. node['uri'], _ = app.env.relfn2path(imguri, docname) candidates['*'] = node['uri'] # map image paths to unique image names (so that they can be put # into a single directory) for imgpath in candidates.values(): app.env.dependencies[docname].add(imgpath) if not os.access(path.join(app.srcdir, imgpath), os.R_OK): logger.warning(__('image file not readable: %s') % imgpath, location=node, type='image', subtype='not_readable') continue app.env.images.add_file(docname, imgpath)
def process_doc(self, app, doctree): # type: (Sphinx, nodes.Node) -> None """Process and rewrite image URIs.""" docname = app.env.docname for node in doctree.traverse(nodes.image): # Map the mimetype to the corresponding image. The writer may # choose the best image from these candidates. The special key * is # set if there is only single candidate to be used by a writer. # The special key ? is set for nonlocal URIs. candidates = {} # type: Dict[unicode, unicode] node['candidates'] = candidates imguri = node['uri'] if imguri.startswith('data:'): candidates['?'] = imguri continue elif imguri.find('://') != -1: candidates['?'] = imguri continue rel_imgpath, full_imgpath = app.env.relfn2path(imguri, docname) if app.config.language: # substitute figures (ex. foo.png -> foo.en.png) i18n_full_imgpath = search_image_for_language( full_imgpath, app.env) if i18n_full_imgpath != full_imgpath: full_imgpath = i18n_full_imgpath rel_imgpath = relative_path(path.join(app.srcdir, 'dummy'), i18n_full_imgpath) # set imgpath as default URI node['uri'] = rel_imgpath if rel_imgpath.endswith(os.extsep + '*'): if app.config.language: # Search language-specific figures at first i18n_imguri = get_image_filename_for_language( imguri, app.env) _, full_i18n_imgpath = app.env.relfn2path( i18n_imguri, docname) self.collect_candidates(app.env, full_i18n_imgpath, candidates, node) self.collect_candidates(app.env, full_imgpath, candidates, node) else: candidates['*'] = rel_imgpath # map image paths to unique image names (so that they can be put # into a single directory) for imgpath in candidates.values(): app.env.dependencies[docname].add(imgpath) if not os.access(path.join(app.srcdir, imgpath), os.R_OK): logger.warning(__('image file not readable: %s') % imgpath, location=node, type='image', subtype='not_readable') continue app.env.images.add_file(docname, imgpath)
def process_doc(self, app, doctree): # type: (Sphinx, nodes.Node) -> None """Process and rewrite image URIs.""" docname = app.env.docname for node in doctree.traverse(nodes.image): # Map the mimetype to the corresponding image. The writer may # choose the best image from these candidates. The special key * is # set if there is only single candidate to be used by a writer. # The special key ? is set for nonlocal URIs. candidates = {} # type: Dict[unicode, unicode] node['candidates'] = candidates imguri = node['uri'] if imguri.startswith('data:'): logger.warning('image data URI found. some builders might not support', location=node, type='image', subtype='data_uri') candidates['?'] = imguri continue elif imguri.find('://') != -1: logger.warning('nonlocal image URI found: %s' % imguri, location=node, type='image', subtype='nonlocal_uri') candidates['?'] = imguri continue rel_imgpath, full_imgpath = app.env.relfn2path(imguri, docname) if app.config.language: # substitute figures (ex. foo.png -> foo.en.png) i18n_full_imgpath = search_image_for_language(full_imgpath, app.env) if i18n_full_imgpath != full_imgpath: full_imgpath = i18n_full_imgpath rel_imgpath = relative_path(path.join(app.srcdir, 'dummy'), i18n_full_imgpath) # set imgpath as default URI node['uri'] = rel_imgpath if rel_imgpath.endswith(os.extsep + '*'): if app.config.language: # Search language-specific figures at first i18n_imguri = get_image_filename_for_language(imguri, app.env) _, full_i18n_imgpath = app.env.relfn2path(i18n_imguri, docname) self.collect_candidates(app.env, full_i18n_imgpath, candidates, node) self.collect_candidates(app.env, full_imgpath, candidates, node) else: candidates['*'] = rel_imgpath # map image paths to unique image names (so that they can be put # into a single directory) for imgpath in itervalues(candidates): app.env.dependencies[docname].add(imgpath) if not os.access(path.join(app.srcdir, imgpath), os.R_OK): logger.warning('image file not readable: %s' % imgpath, location=node, type='image', subtype='not_readable') continue app.env.images.add_file(docname, imgpath)
def test_get_filename_for_language(): app = TestApp() # language is None app.env.config.language = None assert app.env.config.language is None assert i18n.get_image_filename_for_language('foo.png', app.env) == 'foo.png' assert i18n.get_image_filename_for_language('foo.bar.png', app.env) == 'foo.bar.png' assert i18n.get_image_filename_for_language('subdir/foo.png', app.env) == 'subdir/foo.png' assert i18n.get_image_filename_for_language('../foo.png', app.env) == '../foo.png' assert i18n.get_image_filename_for_language('foo', app.env) == 'foo' # language is en app.env.config.language = 'en' assert i18n.get_image_filename_for_language('foo.png', app.env) == 'foo.en.png' assert i18n.get_image_filename_for_language('foo.bar.png', app.env) == 'foo.bar.en.png' assert i18n.get_image_filename_for_language('dir/foo.png', app.env) == 'dir/foo.en.png' assert i18n.get_image_filename_for_language('../foo.png', app.env) == '../foo.en.png' assert i18n.get_image_filename_for_language('foo', app.env) == 'foo.en' # modify figure_language_filename and language is None app.env.config.language = None app.env.config.figure_language_filename = 'images/{language}/{root}{ext}' assert i18n.get_image_filename_for_language('foo.png', app.env) == 'foo.png' assert i18n.get_image_filename_for_language('foo.bar.png', app.env) == 'foo.bar.png' assert i18n.get_image_filename_for_language('subdir/foo.png', app.env) == 'subdir/foo.png' assert i18n.get_image_filename_for_language('../foo.png', app.env) == '../foo.png' assert i18n.get_image_filename_for_language('foo', app.env) == 'foo' # modify figure_language_filename and language is 'en' app.env.config.language = 'en' app.env.config.figure_language_filename = 'images/{language}/{root}{ext}' assert i18n.get_image_filename_for_language('foo.png', app.env) == 'images/en/foo.png' assert i18n.get_image_filename_for_language('foo.bar.png', app.env) == 'images/en/foo.bar.png' assert i18n.get_image_filename_for_language('subdir/foo.png', app.env) == 'images/en/subdir/foo.png' assert i18n.get_image_filename_for_language('../foo.png', app.env) == 'images/en/../foo.png' assert i18n.get_image_filename_for_language('foo', app.env) == 'images/en/foo' # invalid figure_language_filename app.env.config.figure_language_filename = '{root}.{invalid}{ext}' raises(SphinxError, i18n.get_image_filename_for_language, 'foo.png', app.env)
def test_get_filename_for_language(app): # language is None app.env.config.language = None assert app.env.config.language is None assert i18n.get_image_filename_for_language('foo.png', app.env) == 'foo.png' assert i18n.get_image_filename_for_language('foo.bar.png', app.env) == 'foo.bar.png' assert i18n.get_image_filename_for_language('subdir/foo.png', app.env) == 'subdir/foo.png' assert i18n.get_image_filename_for_language('../foo.png', app.env) == '../foo.png' assert i18n.get_image_filename_for_language('foo', app.env) == 'foo' # language is en app.env.config.language = 'en' assert i18n.get_image_filename_for_language('foo.png', app.env) == 'foo.en.png' assert i18n.get_image_filename_for_language('foo.bar.png', app.env) == 'foo.bar.en.png' assert i18n.get_image_filename_for_language('dir/foo.png', app.env) == 'dir/foo.en.png' assert i18n.get_image_filename_for_language('../foo.png', app.env) == '../foo.en.png' assert i18n.get_image_filename_for_language('foo', app.env) == 'foo.en' # modify figure_language_filename and language is None app.env.config.language = None app.env.config.figure_language_filename = 'images/{language}/{root}{ext}' assert i18n.get_image_filename_for_language('foo.png', app.env) == 'foo.png' assert i18n.get_image_filename_for_language('foo.bar.png', app.env) == 'foo.bar.png' assert i18n.get_image_filename_for_language('subdir/foo.png', app.env) == 'subdir/foo.png' assert i18n.get_image_filename_for_language('../foo.png', app.env) == '../foo.png' assert i18n.get_image_filename_for_language('foo', app.env) == 'foo' # modify figure_language_filename and language is 'en' app.env.config.language = 'en' app.env.config.figure_language_filename = 'images/{language}/{root}{ext}' assert i18n.get_image_filename_for_language('foo.png', app.env) == 'images/en/foo.png' assert i18n.get_image_filename_for_language( 'foo.bar.png', app.env) == 'images/en/foo.bar.png' assert i18n.get_image_filename_for_language( 'subdir/foo.png', app.env) == 'images/en/subdir/foo.png' assert i18n.get_image_filename_for_language( '../foo.png', app.env) == 'images/en/../foo.png' assert i18n.get_image_filename_for_language('foo', app.env) == 'images/en/foo' # new path and basename tokens app.env.config.language = 'en' app.env.config.figure_language_filename = '{path}{language}/{basename}{ext}' assert i18n.get_image_filename_for_language('foo.png', app.env) == 'en/foo.png' assert i18n.get_image_filename_for_language('foo.bar.png', app.env) == 'en/foo.bar.png' assert i18n.get_image_filename_for_language('subdir/foo.png', app.env) == 'subdir/en/foo.png' assert i18n.get_image_filename_for_language('../foo.png', app.env) == '../en/foo.png' assert i18n.get_image_filename_for_language('foo', app.env) == 'en/foo' # invalid figure_language_filename app.env.config.figure_language_filename = '{root}.{invalid}{ext}' with pytest.raises(SphinxError): i18n.get_image_filename_for_language('foo.png', app.env)
def test_get_filename_for_language(app): # language is None app.env.config.language = None assert app.env.config.language is None assert i18n.get_image_filename_for_language('foo.png', app.env) == 'foo.png' assert i18n.get_image_filename_for_language('foo.bar.png', app.env) == 'foo.bar.png' assert i18n.get_image_filename_for_language('subdir/foo.png', app.env) == 'subdir/foo.png' assert i18n.get_image_filename_for_language('../foo.png', app.env) == '../foo.png' assert i18n.get_image_filename_for_language('foo', app.env) == 'foo' # language is en app.env.config.language = 'en' assert i18n.get_image_filename_for_language('foo.png', app.env) == 'foo.en.png' assert i18n.get_image_filename_for_language('foo.bar.png', app.env) == 'foo.bar.en.png' assert i18n.get_image_filename_for_language('dir/foo.png', app.env) == 'dir/foo.en.png' assert i18n.get_image_filename_for_language('../foo.png', app.env) == '../foo.en.png' assert i18n.get_image_filename_for_language('foo', app.env) == 'foo.en' # modify figure_language_filename and language is None app.env.config.language = None app.env.config.figure_language_filename = 'images/{language}/{root}{ext}' assert i18n.get_image_filename_for_language('foo.png', app.env) == 'foo.png' assert i18n.get_image_filename_for_language('foo.bar.png', app.env) == 'foo.bar.png' assert i18n.get_image_filename_for_language('subdir/foo.png', app.env) == 'subdir/foo.png' assert i18n.get_image_filename_for_language('../foo.png', app.env) == '../foo.png' assert i18n.get_image_filename_for_language('foo', app.env) == 'foo' # modify figure_language_filename and language is 'en' app.env.config.language = 'en' app.env.config.figure_language_filename = 'images/{language}/{root}{ext}' assert i18n.get_image_filename_for_language('foo.png', app.env) == 'images/en/foo.png' assert i18n.get_image_filename_for_language( 'foo.bar.png', app.env) == 'images/en/foo.bar.png' assert i18n.get_image_filename_for_language( 'subdir/foo.png', app.env) == 'images/en/subdir/foo.png' assert i18n.get_image_filename_for_language( '../foo.png', app.env) == 'images/en/../foo.png' assert i18n.get_image_filename_for_language('foo', app.env) == 'images/en/foo' # new path and basename tokens app.env.config.language = 'en' app.env.config.figure_language_filename = '{path}{language}/{basename}{ext}' assert i18n.get_image_filename_for_language('foo.png', app.env) == 'en/foo.png' assert i18n.get_image_filename_for_language( 'foo.bar.png', app.env) == 'en/foo.bar.png' assert i18n.get_image_filename_for_language( 'subdir/foo.png', app.env) == 'subdir/en/foo.png' assert i18n.get_image_filename_for_language( '../foo.png', app.env) == '../en/foo.png' assert i18n.get_image_filename_for_language('foo', app.env) == 'en/foo' # invalid figure_language_filename app.env.config.figure_language_filename = '{root}.{invalid}{ext}' with pytest.raises(SphinxError): i18n.get_image_filename_for_language('foo.png', app.env)
def test_get_filename_for_language(): app = TestApp() # language is None app.env.config.language = None assert app.env.config.language is None assert i18n.get_image_filename_for_language('foo.png', app.env) == 'foo.png' assert i18n.get_image_filename_for_language('foo.bar.png', app.env) == 'foo.bar.png' assert i18n.get_image_filename_for_language('subdir/foo.png', app.env) == 'subdir/foo.png' assert i18n.get_image_filename_for_language('../foo.png', app.env) == '../foo.png' assert i18n.get_image_filename_for_language('foo', app.env) == 'foo' # language is en app.env.config.language = 'en' assert i18n.get_image_filename_for_language('foo.png', app.env) == 'foo.en.png' assert i18n.get_image_filename_for_language('foo.bar.png', app.env) == 'foo.bar.en.png' assert i18n.get_image_filename_for_language('dir/foo.png', app.env) == 'dir/foo.en.png' assert i18n.get_image_filename_for_language('../foo.png', app.env) == '../foo.en.png' assert i18n.get_image_filename_for_language('foo', app.env) == 'foo.en' # modify figure_language_filename and language is None app.env.config.language = None app.env.config.figure_language_filename = 'images/{language}/{root}{ext}' assert i18n.get_image_filename_for_language('foo.png', app.env) == 'foo.png' assert i18n.get_image_filename_for_language('foo.bar.png', app.env) == 'foo.bar.png' assert i18n.get_image_filename_for_language('subdir/foo.png', app.env) == 'subdir/foo.png' assert i18n.get_image_filename_for_language('../foo.png', app.env) == '../foo.png' assert i18n.get_image_filename_for_language('foo', app.env) == 'foo' # modify figure_language_filename and language is 'en' app.env.config.language = 'en' app.env.config.figure_language_filename = 'images/{language}/{root}{ext}' assert i18n.get_image_filename_for_language('foo.png', app.env) == 'images/en/foo.png' assert i18n.get_image_filename_for_language( 'foo.bar.png', app.env) == 'images/en/foo.bar.png' assert i18n.get_image_filename_for_language( 'subdir/foo.png', app.env) == 'images/en/subdir/foo.png' assert i18n.get_image_filename_for_language( '../foo.png', app.env) == 'images/en/../foo.png' assert i18n.get_image_filename_for_language('foo', app.env) == 'images/en/foo' # invalid figure_language_filename app.env.config.figure_language_filename = '{root}.{invalid}{ext}' raises(SphinxError, i18n.get_image_filename_for_language, 'foo.png', app.env)
def test_get_filename_for_language(app): app.env.temp_data['docname'] = 'index' # language is None app.env.config.language = None assert app.env.config.language is None assert i18n.get_image_filename_for_language('foo.png', app.env) == 'foo.png' assert i18n.get_image_filename_for_language('foo.bar.png', app.env) == 'foo.bar.png' assert i18n.get_image_filename_for_language('subdir/foo.png', app.env) == 'subdir/foo.png' assert i18n.get_image_filename_for_language('../foo.png', app.env) == '../foo.png' assert i18n.get_image_filename_for_language('foo', app.env) == 'foo' # language is en app.env.config.language = 'en' assert i18n.get_image_filename_for_language('foo.png', app.env) == 'foo.en.png' assert i18n.get_image_filename_for_language('foo.bar.png', app.env) == 'foo.bar.en.png' assert i18n.get_image_filename_for_language('dir/foo.png', app.env) == 'dir/foo.en.png' assert i18n.get_image_filename_for_language('../foo.png', app.env) == '../foo.en.png' assert i18n.get_image_filename_for_language('foo', app.env) == 'foo.en' # modify figure_language_filename and language is None app.env.config.language = None app.env.config.figure_language_filename = 'images/{language}/{root}{ext}' assert i18n.get_image_filename_for_language('foo.png', app.env) == 'foo.png' assert i18n.get_image_filename_for_language('foo.bar.png', app.env) == 'foo.bar.png' assert i18n.get_image_filename_for_language('subdir/foo.png', app.env) == 'subdir/foo.png' assert i18n.get_image_filename_for_language('../foo.png', app.env) == '../foo.png' assert i18n.get_image_filename_for_language('foo', app.env) == 'foo' # modify figure_language_filename and language is 'en' app.env.config.language = 'en' app.env.config.figure_language_filename = 'images/{language}/{root}{ext}' assert i18n.get_image_filename_for_language('foo.png', app.env) == 'images/en/foo.png' assert i18n.get_image_filename_for_language( 'foo.bar.png', app.env) == 'images/en/foo.bar.png' assert i18n.get_image_filename_for_language( 'subdir/foo.png', app.env) == 'images/en/subdir/foo.png' assert i18n.get_image_filename_for_language( '../foo.png', app.env) == 'images/en/../foo.png' assert i18n.get_image_filename_for_language('foo', app.env) == 'images/en/foo' # new path and basename tokens app.env.config.language = 'en' app.env.config.figure_language_filename = '{path}{language}/{basename}{ext}' assert i18n.get_image_filename_for_language('foo.png', app.env) == 'en/foo.png' assert i18n.get_image_filename_for_language('foo.bar.png', app.env) == 'en/foo.bar.png' assert i18n.get_image_filename_for_language('subdir/foo.png', app.env) == 'subdir/en/foo.png' assert i18n.get_image_filename_for_language('../foo.png', app.env) == '../en/foo.png' assert i18n.get_image_filename_for_language('foo', app.env) == 'en/foo' # invalid figure_language_filename app.env.config.figure_language_filename = '{root}.{invalid}{ext}' with pytest.raises(SphinxError): i18n.get_image_filename_for_language('foo.png', app.env) # docpath (for a document in the top of source directory) app.env.config.language = 'en' app.env.config.figure_language_filename = '/{docpath}{language}/{basename}{ext}' assert (i18n.get_image_filename_for_language('foo.png', app.env) == '/en/foo.png') # docpath (for a document in the sub directory) app.env.temp_data['docname'] = 'subdir/index' assert (i18n.get_image_filename_for_language( 'foo.png', app.env) == '/subdir/en/foo.png')
def process_images(self, docname, doctree): """Process and rewrite image URIs.""" def collect_candidates(imgpath, candidates): globbed = {} for filename in glob(imgpath): new_imgpath = relative_path(path.join(self.srcdir, 'dummy'), filename) try: mimetype = guess_mimetype(filename) if mimetype not in candidates: globbed.setdefault(mimetype, []).append(new_imgpath) except (OSError, IOError) as err: self.warn_node('image file %s not readable: %s' % (filename, err), node) for key, files in iteritems(globbed): candidates[key] = sorted(files, key=len)[0] # select by similarity for node in doctree.traverse(nodes.image): # Map the mimetype to the corresponding image. The writer may # choose the best image from these candidates. The special key * is # set if there is only single candidate to be used by a writer. # The special key ? is set for nonlocal URIs. node['candidates'] = candidates = {} imguri = node['uri'] if imguri.startswith('data:'): self.warn_node('image data URI found. some builders might not support', node, type='image', subtype='data_uri') candidates['?'] = imguri continue elif imguri.find('://') != -1: self.warn_node('nonlocal image URI found: %s' % imguri, node, type='image', subtype='nonlocal_uri') candidates['?'] = imguri continue rel_imgpath, full_imgpath = self.relfn2path(imguri, docname) if self.config.language: # substitute figures (ex. foo.png -> foo.en.png) i18n_full_imgpath = search_image_for_language(full_imgpath, self) if i18n_full_imgpath != full_imgpath: full_imgpath = i18n_full_imgpath rel_imgpath = relative_path(path.join(self.srcdir, 'dummy'), i18n_full_imgpath) # set imgpath as default URI node['uri'] = rel_imgpath if rel_imgpath.endswith(os.extsep + '*'): if self.config.language: # Search language-specific figures at first i18n_imguri = get_image_filename_for_language(imguri, self) _, full_i18n_imgpath = self.relfn2path(i18n_imguri, docname) collect_candidates(full_i18n_imgpath, candidates) collect_candidates(full_imgpath, candidates) else: candidates['*'] = rel_imgpath # map image paths to unique image names (so that they can be put # into a single directory) for imgpath in itervalues(candidates): self.dependencies.setdefault(docname, set()).add(imgpath) if not os.access(path.join(self.srcdir, imgpath), os.R_OK): self.warn_node('image file not readable: %s' % imgpath, node) continue self.images.add_file(docname, imgpath)