try: from mod_python import apache, util except ImportError: from dummy import apache, util import py from base import handler_decorator class treetostring(handler_decorator): """Convert a templess.node instance to a string""" def handler(self, orghandler, request): from templess.templess import node ret = orghandler(request) if isinstance(ret, node): ret = ret.unicode() return ret class treetodict(handler_decorator): """convert an etree.Element to a dict of each named argument to the constructor, the name is used as key in the return dict, the value as the name of the elements to find """ def __init__(self, **kwargs): self.kwargs = kwargs def handler(self, orghandler, request): from templess.templess import node ret = {} tree = orghandler(request) if not isinstance(tree, node): return tree for k, v in self.kwargs.iteritems(): ret[k] = list(list(tree.find(v))[0]) return ret class htmltotree(handler_decorator): """convert an HTML document (string) to an etree.Element node""" def __init__(self, condition=lambda r: True, charset='UTF-8'): self.condition = condition self.charset = charset def handler(self, orghandler, request): from templess.templess import treebuilderhandler from templess.nanosax import nsparser html = orghandler(request) if (not type(html) in [str, unicode] or not request.content_type.startswith('text/html') or not self.condition(request)): return html # etree doesn't know about nbsps, we expect html doesn't have a # namespace html = html.replace(' ', ' ') handler = treebuilderhandler(self.charset) parser = nsparser(handler) parser.parse(html) return handler.root class resttohtml(handler_decorator): def __init__(self, ignorefiles=None): self.ignorefiles = ignorefiles or [] def handler(self, orghandler, request): import rest data = orghandler(request) if (not type(data) in [str, unicode] or not request.content_type.startswith('text/plain') or py.path.local(request.filename).basename in self.ignorefiles): return data request.content_type = 'text/html; charset=UTF-8' return rest.rest2html(data) class sidebar(handler_decorator): """adds 'sidebar' key to a dict containing a sidebar dict in, dict out, sidebar value is an etree node """ def __init__(self, siteroot, template, reserved, condition=lambda r: True): self.siteroot = siteroot self.template = template self.reserved = reserved self.condition = condition def handler(self, orghandler, request): from _sidebar import sidebar as _sidebar ret = orghandler(request) if not isinstance(ret, dict) or not self.condition(request): return ret ret['sidebar'] = _sidebar.render(request, self.siteroot, self.template, self.reserved) return ret