import templates, pygments, cgi, db, datetime, hashlib, settings, os, mimetypes from pygments import highlight from pygments.lexers import get_all_lexers, get_lexer_by_name from pygments.formatters import HtmlFormatter class Paste(object): def __init__(self): lexers = dict([(x[0], x[1][0]) for x in get_all_lexers()]) self.lexers = [] removed = [] for cat, ls in settings.categories: for l in ls: removed.append(l) self.lexers.append((cat, [(x, lexers[x]) for x in ls])) for l in removed: try: del lexers[l] except KeyError: pass self.lexers.append(('Others' if settings.categories else 'Syntax', sorted(lexers.items(), cmp = lambda a, b: cmp(a[0], b[0])))) self.formatter = HtmlFormatter(linenos = 'table', lineanchors = 'line', anchorlinenos = True) def paste(self): if self.environ['REQUEST_METHOD'] == 'POST': mp = cgi.FieldStorage(fp = self.environ['wsgi.input'], environ = self.environ, keep_blank_values = True) if mp['type'].value == 'Preview': return self.preview(mp) elif mp['type'].value == 'Paste': return self.add_paste(mp) else: self.start_response('400 Bad Request', [('Content-Type', 'text/plain')]) return ['Invalid type "%s".' % mp['type'].value] self.start_response('200 OK', [('Content-Type', 'text/html')]) return [str(templates.paste(searchList = { 'title': settings.pastebin_name, 'header': settings.pastebin_name, 'lexers': self.lexers, }))] def preview(self, mp): lex = get_lexer_by_name(mp['syntax'].value) text = highlight(mp['text'].value, lex, self.formatter) self.start_response('200 OK', [('Content-Type', 'text/html')]) return [str(templates.view(searchList = { 'title': settings.pastebin_name, 'header': '%s – Preview' % settings.pastebin_name, 'hash': None, 'date': datetime.datetime.utcnow().ctime(), 'nick': mp['nick'].value or 'Anoynmous', 'syntax': lex.name, 'pastetitle': mp['title'].value or 'Untitled', 'text': text, }))] def add_paste(self, mp): nick = mp['nick'].value syntax = mp['syntax'].value title = mp['title'].value text = mp['text'].value hash = hashlib.md5(datetime.datetime.utcnow().ctime() + self.environ['REMOTE_ADDR']).hexdigest() try: session = db.Session() paste = db.Paste(hash, nick, datetime.datetime.utcnow(), syntax, title, text) session.add(paste) session.commit() finally: session.close() self.start_response('302 Found', [('Location', '/view/%s' % hash)]) return [] def view(self): hash = self.path[1] try: session = db.Session() paste = session.query(db.Paste).filter_by(hash = hash).one() finally: session.close() lex = get_lexer_by_name(paste.syntax) text = highlight(paste.text, lex, self.formatter) self.start_response('200 OK', [('Content-Type', 'text/html')]) return [str(templates.view(searchList = { 'title': '%s – View paste – %s' % (settings.pastebin_name, paste.title), 'header': '%s – View paste' % settings.pastebin_name, 'hash': hash, 'date': paste.date.ctime(), 'nick': paste.nick or 'Anonymous', 'syntax': lex.name, 'pastetitle': paste.title or 'Untitled', 'text': text, }))] def raw(self): hash = self.path[1] try: session = db.Session() paste = session.query(db.Paste).filter_by(hash = hash).one() finally: session.close() self.start_response('200 OK', [('Content-Type', 'text/plain')]) return [str(paste.text)] def highlight_stylesheet(self): self.start_response('200 OK', [('Content-Type', 'text/css')]) return [self.formatter.get_style_defs()] def static(self): filename = settings.static_root + os.path.sep + self.path[1] if not self.path[1] in ('paste.css', 'edit.js') or not os.path.exists(filename): self.start_response('404 Not Found', [('Content-Type', 'text/html'), ('Location', '/')]) return ['asdf'] self.start_response('200 OK', [('Content-Type', mimetypes.guess_type(filename)[0] or 'text/plain')]) return open(filename) def __call__(self, environ, start_response): self.environ = environ self.start_response = start_response path = self.environ['PATH_INFO'].split('/')[1:] module = path[0] or 'paste' if module in ('list', 'paste', 'view', 'raw', 'static', 'highlight_stylesheet'): self.path = path return getattr(self, module)() else: start_response('404 Not Found', [('Content-Type', 'text/html'), ('Location', '/')]) return ['/'] if __name__ == '__main__': from wsgiref.simple_server import make_server httpd = make_server('', 8000, Paste()) httpd.serve_forever()