Add embed data URI image blob support

This commit is contained in:
Vanya Sergeev 2013-10-13 06:30:25 -07:00 committed by Alberto Bertogli
parent f62ca211eb
commit 21522f8a3a
4 changed files with 38 additions and 2 deletions

@ -176,6 +176,8 @@ def with_utils(f):
'colorize_blob': utils.colorize_blob, 'colorize_blob': utils.colorize_blob,
'can_markdown': utils.can_markdown, 'can_markdown': utils.can_markdown,
'markdown_blob': utils.markdown_blob, 'markdown_blob': utils.markdown_blob,
'can_embed_image': utils.can_embed_image,
'embed_image_blob': utils.embed_image_blob,
'abort': bottle.abort, 'abort': bottle.abort,
'smstr': git.smstr, 'smstr': git.smstr,
} }

6
git.py

@ -325,7 +325,7 @@ class Repo:
ref = self.branch ref = self.branch
return Tree(self, ref) return Tree(self, ref)
def blob(self, path, ref = None): def blob(self, path, ref = None, raw = False):
"""Returns the contents of the given path.""" """Returns the contents of the given path."""
if not ref: if not ref:
ref = self.branch ref = self.branch
@ -341,6 +341,10 @@ class Repo:
if not head or head.strip().endswith('missing'): if not head or head.strip().endswith('missing'):
return None return None
# Raw option in case we need a binary blob and not a utf-8 encoded one.
if raw:
return out.fd.read()
return out.read() return out.read()

@ -17,6 +17,8 @@ try:
except ImportError: except ImportError:
markdown = None markdown = None
import base64
def shorten(s, width = 60): def shorten(s, width = 60):
if len(s) < 60: if len(s) < 60:
return s return s
@ -52,6 +54,15 @@ def can_markdown(fname):
return fname.endswith(".md") return fname.endswith(".md")
def can_embed_image(fname):
"""True if we can embed image file in HTML, False otherwise."""
exts = [ 'jpg', 'jpeg', 'png', 'gif', 'svg' ]
if '.' in fname and fname.split('.')[-1] in exts:
return True
return False
def colorize_diff(s): def colorize_diff(s):
lexer = lexers.DiffLexer(encoding = 'utf-8') lexer = lexers.DiffLexer(encoding = 'utf-8')
formatter = HtmlFormatter(encoding = 'utf-8', formatter = HtmlFormatter(encoding = 'utf-8',
@ -82,3 +93,20 @@ def colorize_blob(fname, s):
def markdown_blob(s): def markdown_blob(s):
return markdown.markdown(s) return markdown.markdown(s)
def embed_image_blob(repo, dirname, fname):
ext_to_mimetype = {'jpg': 'image/jpeg',
'jpeg': 'image/jpeg',
'png': 'image/png',
'gif': 'image/gif',
'svg': 'image/svg+xml',}
mimetype = ext_to_mimetype[fname.split('.')[-1]]
# Unfortunately, bottle seems to require utf-8 encoded data.
# We have to refetch the blob with raw=True, because the utf-8 encoded
# version of the blob available in the bottle template discards binary data.
raw_blob = repo.blob(dirname + fname, raw = True)
return '<img style="max-width:100%;" src="data:{0};base64,{1}" />'.format( \
mimetype, base64.b64encode(raw_blob))

@ -36,7 +36,9 @@
<a href="">{{!fname.html}}</a> <a href="">{{!fname.html}}</a>
</h3> </h3>
% if can_markdown(fname.unicode): % if can_embed_image(fname.unicode):
{{!embed_image_blob(repo, dirname.raw, fname.raw)}}
% elif can_markdown(fname.unicode):
{{!markdown_blob(blob)}} {{!markdown_blob(blob)}}
% elif can_colorize(blob): % elif can_colorize(blob):
{{!colorize_blob(fname.unicode, blob)}} {{!colorize_blob(fname.unicode, blob)}}