diff options
author | Jon Bergli Heier <snakebite@jvnv.net> | 2010-01-25 01:00:18 +0100 |
---|---|---|
committer | Jon Bergli Heier <snakebite@jvnv.net> | 2010-01-25 01:00:18 +0100 |
commit | 346b22ddf795f9a5a10ddc6b83bfa3bc15c8d30a (patch) | |
tree | f9d9251ea08bc8ad57e7234ca451bcc3eeccc7b5 /pastepy.py |
Initial commit.
Diffstat (limited to 'pastepy.py')
-rw-r--r-- | pastepy.py | 137 |
1 files changed, 137 insertions, 0 deletions
diff --git a/pastepy.py b/pastepy.py new file mode 100644 index 0000000..b3fc980 --- /dev/null +++ b/pastepy.py @@ -0,0 +1,137 @@ +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 ['<a href="/">asdf</a>'] + 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 ['<a href="/">/</a>'] + +if __name__ == '__main__': + from wsgiref.simple_server import make_server + httpd = make_server('', 8000, Paste()) + httpd.serve_forever() |