# Cowbell images: http://commons.wikimedia.org/wiki/Image:Cowbell-1.jpg import os import re from paste.fileapp import FileApp from paste.response import header_value, remove_header SOUND = "http://www.c-eye.net/eyeon/WalkenWAVS/explorestudiospace.wav" class MoreCowbell(object): def __init__(self, app): self.app = app def __call__(self, environ, start_response): path_info = environ.get('PATH_INFO', '') script_name = environ.get('SCRIPT_NAME', '') for filename in ['bell-ascending.png', 'bell-descending.png']: if path_info == '/.cowbell/'+ filename: app = FileApp(os.path.join(os.path.dirname(__file__), filename)) return app(environ, start_response) type = [] body = [] def repl_start_response(status, headers, exc_info=None): ct = header_value(headers, 'content-type') if ct and ct.startswith('text/html'): type.append(ct) remove_header(headers, 'content-length') start_response(status, headers, exc_info) return body.append return start_response(status, headers, exc_info) app_iter = self.app(environ, repl_start_response) if type: # Got text/html body.extend(app_iter) body = ''.join(body) body = insert_head(body, self.javascript.replace('__SCRIPT_NAME__', script_name)) body = insert_body(body, self.resources.replace('__SCRIPT_NAME__', script_name)) return [body] else: return app_iter javascript = '''\ ''' resources = '''\ ''' def insert_head(body, text): end_head = re.search(r'', body, re.I) if end_head: return body[:end_head.start()] + text + body[end_head.end():] else: return text + body def insert_body(body, text): end_body = re.search(r'', body, re.I) if end_body: return body[:end_body.start()] + text + body[end_body.end():] else: return body + text def make_cowbell(global_conf, app): return MoreCowbell(app) if __name__ == '__main__': from paste.debug.debugapp import SimpleApplication app = MoreCowbell(SimpleApplication()) from paste.httpserver import serve serve(app)