diff options
author | Vanya Sergeev <vsergeev@gmail.com> | 2013-10-13 15:30:25 +0200 |
---|---|---|
committer | Alberto Bertogli <albertito@blitiri.com.ar> | 2013-11-02 20:07:59 +0100 |
commit | 21522f8a3a4a010ad717f5bdcbbc6584d9ba7527 (patch) | |
tree | fd2327266ab4fb524bb03b5ea933a621367c7f3e | |
parent | f62ca211ebf8badd17fef5d15d61eb8ff00875c1 (diff) | |
download | git-arr-fork-21522f8a3a4a010ad717f5bdcbbc6584d9ba7527.zip |
Add embed data URI image blob support
-rwxr-xr-x | git-arr | 2 | ||||
-rw-r--r-- | git.py | 6 | ||||
-rw-r--r-- | utils.py | 28 | ||||
-rw-r--r-- | views/blob.html | 4 |
4 files changed, 38 insertions, 2 deletions
@@ -176,6 +176,8 @@ def with_utils(f): 'colorize_blob': utils.colorize_blob, 'can_markdown': utils.can_markdown, 'markdown_blob': utils.markdown_blob, + 'can_embed_image': utils.can_embed_image, + 'embed_image_blob': utils.embed_image_blob, 'abort': bottle.abort, 'smstr': git.smstr, } @@ -325,7 +325,7 @@ class Repo: ref = self.branch 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.""" if not ref: ref = self.branch @@ -341,6 +341,10 @@ class Repo: if not head or head.strip().endswith('missing'): 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() @@ -17,6 +17,8 @@ try: except ImportError: markdown = None +import base64 + def shorten(s, width = 60): if len(s) < 60: return s @@ -52,6 +54,15 @@ def can_markdown(fname): 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): lexer = lexers.DiffLexer(encoding = 'utf-8') formatter = HtmlFormatter(encoding = 'utf-8', @@ -82,3 +93,20 @@ def colorize_blob(fname, s): def markdown_blob(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)) + diff --git a/views/blob.html b/views/blob.html index 6244fc7..320cc89 100644 --- a/views/blob.html +++ b/views/blob.html @@ -36,7 +36,9 @@ <a href="">{{!fname.html}}</a> </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)}} % elif can_colorize(blob): {{!colorize_blob(fname.unicode, blob)}} |