diff --git a/VERSION b/VERSION index a9189776..0a55cae4 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -Version 1.99.4 (2012-02-19 22:47:06) stable +Version 1.99.4 (2012-02-21 00:06:19) stable diff --git a/gluon/contrib/markmin/markmin2html.py b/gluon/contrib/markmin/markmin2html.py index 975704e0..8a9f7c99 100755 --- a/gluon/contrib/markmin/markmin2html.py +++ b/gluon/contrib/markmin/markmin2html.py @@ -4,6 +4,22 @@ import re import cgi +""" +TODO: next version should use MathJax + + +""" + __all__ = ['render', 'markmin2html'] __doc__ = """ diff --git a/gluon/tools.py b/gluon/tools.py index 23ebfdf5..2ab7a37f 100644 --- a/gluon/tools.py +++ b/gluon/tools.py @@ -13,6 +13,7 @@ import datetime import thread import logging import sys +import glob import os import re import time @@ -4146,6 +4147,54 @@ class PluginManager(object): def __contains__(self,key): return key in self.__dict__ +class Expose(object): + def __init__(self,base=None): + current.session.forget() + base = base or os.path.join(current.request.folder,'static','work') + filename = os.path.join(base,'/'.join(current.request.args)) + if not os.path.isdir(filename): + current.response.headers['Content-Type'] = contenttype(filename) + raise HTTP(200,open(filename,'rb'),**current.response.headers) + self.path = path = os.path.join(filename,'*') + self.folders = [f[len(path)-1:] for f in sorted(glob.glob(path)) \ + if os.path.isdir(f) and not self.isprivate(f)] + self.filenames = [f[len(path)-1:] for f in sorted(glob.glob(path)) \ + if not os.path.isdir(f) and not self.isprivate(f)] + def breadcrumbs(self): + path = [] + span = SPAN() + span.append(A('base',_href=URL())) + span.append('/') + args = current.request.args + for arg in args: + path.append(arg) + span.append(A(arg,_href=URL(args='/'.join(path)))) + span.append('/') + return span + def table_folders(self): + args = current.request.args + return TABLE(*[TR(TD(A(folder,_href=URL(args=args+[folder])))) \ + for folder in self.folders]) + @staticmethod + def isprivate(f): + return 'private' in f or f.startswith('.') or f.endswith('~') + @staticmethod + def isimage(f): + return f.rsplit('.')[-1].lower() in ('png','jpg','jpeg','gif','tiff') + def table_files(self,width=160): + args = current.request.args + return TABLE(*[TR(TD(A(f,_href=URL(args=args+[f]))), + TD(IMG(_src=URL(args=args+[f]),_style='max-width:%spx' % width) \ + if width and self.isimage(f) else '')) \ + for f in self.filenames]) + def xml(self): + return DIV( + H2(self.breadcrumbs()), + H3('Folders'), + self.table_folders(), + H3('Files'), + self.table_files()).xml() + if __name__ == '__main__': import doctest doctest.testmod()