def handle(self, node: nodes.image) -> None: try: basename = os.path.basename(node['uri']) if '?' in basename: basename = basename.split('?')[0] if basename == '' or len(basename) > MAX_FILENAME_LEN: filename, ext = os.path.splitext(node['uri']) basename = sha1(filename.encode()).hexdigest() + ext basename = re.sub(CRITICAL_PATH_CHAR_RE, "_", basename) dirname = node['uri'].replace('://', '/').translate({ ord("?"): "/", ord("&"): "/" }) if len(dirname) > MAX_FILENAME_LEN: dirname = sha1(dirname.encode()).hexdigest() 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) # type: float headers['If-Modified-Since'] = epoch_to_rfc1123(timestamp) r = requests.get(node['uri'], headers=headers) if r.status_code >= 400: logger.warning( __('Could not fetch remote image: %s [%d]') % (node['uri'], r.status_code)) else: self.app.env.original_image_uri[path] = node['uri'] if r.status_code == 200: with open(path, 'wb') as f: f.write(r.content) last_modified = r.headers.get('last-modified') if last_modified: timestamp = rfc1123_to_epoch(last_modified) os.utime(path, (timestamp, timestamp)) mimetype = guess_mimetype(path, default='*') if mimetype != '*' and os.path.splitext(basename)[1] == '': # append a suffix if URI does not contain suffix ext = get_image_extension(mimetype) newpath = os.path.join(self.imagedir, dirname, basename + ext) os.replace(path, newpath) self.app.env.original_image_uri.pop(path) self.app.env.original_image_uri[newpath] = node['uri'] path = newpath node['candidates'].pop('?') node['candidates'][mimetype] = path node['uri'] = path self.app.env.images.add_file(self.env.docname, path) except Exception as exc: logger.warning( __('Could not fetch remote image: %s [%s]') % (node['uri'], exc))
def handle(self, node): # type: (nodes.Node) -> None try: basename = os.path.basename(node['uri']) if '?' in basename: basename = basename.split('?')[0] 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) headers = {} if os.path.exists(path): timestamp = ceil(os.stat(path).st_mtime) # type: float headers['If-Modified-Since'] = epoch_to_rfc1123(timestamp) r = requests.get(node['uri'], headers=headers) if r.status_code >= 400: logger.warning(__('Could not fetch remote image: %s [%d]') % (node['uri'], r.status_code)) else: self.app.env.original_image_uri[path] = node['uri'] if r.status_code == 200: with open(path, 'wb') as f: f.write(r.content) last_modified = r.headers.get('last-modified') if last_modified: timestamp = rfc1123_to_epoch(last_modified) os.utime(path, (timestamp, timestamp)) mimetype = guess_mimetype(path, default='*') if mimetype != '*' and os.path.splitext(basename)[1] == '': # append a suffix if URI does not contain suffix ext = get_image_extension(mimetype) newpath = os.path.join(self.imagedir, dirname, basename + ext) movefile(path, newpath) self.app.env.original_image_uri.pop(path) self.app.env.original_image_uri[newpath] = node['uri'] path = newpath node['candidates'].pop('?') node['candidates'][mimetype] = path node['uri'] = path self.app.env.images.add_file(self.env.docname, path) except Exception as exc: logger.warning(__('Could not fetch remote image: %s [%s]') % (node['uri'], text_type(exc)))
def trim_image(content: bytes, mimetype: str) -> bytes: if mimetype in ('image/png', 'image/jpeg'): image = PIL.Image.open(BytesIO(content)) box = image.getbbox() if box[0] != 0 or box[1] != 0 or box[2:] != image.size: output = BytesIO() fileext = get_image_extension(mimetype) image.crop(box).save(output, format=fileext[1:]) content = output.getvalue() return content
def handle(self, node: nodes.image) -> None: image = parse_data_uri(node['uri']) ext = get_image_extension(image.mimetype) if ext is None: logger.warning(__('Unknown image format: %s...'), node['uri'][:32], location=node) return ensuredir(os.path.join(self.imagedir, 'embeded')) digest = sha1(image.data).hexdigest() path = os.path.join(self.imagedir, 'embeded', digest + ext) self.app.env.original_image_uri[path] = node['uri'] with open(path, 'wb') as f: f.write(image.data) node['candidates'].pop('?') node['candidates'][image.mimetype] = path node['uri'] = path self.app.env.images.add_file(self.env.docname, path)
def handle(self, node): # type: (nodes.Node) -> None image = parse_data_uri(node['uri']) ext = get_image_extension(image.mimetype) if ext is None: logger.warning(__('Unknown image format: %s...'), node['uri'][:32], location=node) return ensuredir(os.path.join(self.imagedir, 'embeded')) digest = sha1(image.data).hexdigest() path = os.path.join(self.imagedir, 'embeded', digest + ext) self.app.env.original_image_uri[path] = node['uri'] with open(path, 'wb') as f: f.write(image.data) node['candidates'].pop('?') node['candidates'][image.mimetype] = path node['uri'] = path self.app.env.images.add_file(self.env.docname, path)
def get_filename_for(filename, mimetype): # type: (unicode, unicode) -> unicode basename = os.path.basename(filename) return os.path.splitext(basename)[0] + get_image_extension(mimetype)
def get_filename_for(filename, mimetype): # type: (unicode, unicode) -> unicode basename = os.path.basename(filename) return os.path.splitext(basename)[0] + get_image_extension(mimetype)
def test_get_image_extension(): assert get_image_extension('image/png') == '.png' assert get_image_extension('image/jpeg') == '.jpg' assert get_image_extension('image/svg+xml') == '.svg' assert get_image_extension('text/plain') is None
def test_get_image_extension(): assert get_image_extension('image/png') == '.png' assert get_image_extension('image/jpeg') == '.jpg' assert get_image_extension('image/svg+xml') == '.svg' assert get_image_extension('text/plain') is None
def get_filename_for(filename: str, mimetype: str) -> str: basename = os.path.basename(filename) basename = re.sub(CRITICAL_PATH_CHAR_RE, "_", basename) return os.path.splitext(basename)[0] + get_image_extension(mimetype)
def get_filename_for(filename, mimetype): # type: (str, str) -> str basename = os.path.basename(filename) return os.path.splitext(basename)[0] + get_image_extension(mimetype)
def extension(self) -> str: return get_image_extension(self.mimetype)
def get_filename_for(filename: str, mimetype: str) -> str: basename = os.path.basename(filename) return os.path.splitext(basename)[0] + get_image_extension(mimetype)