summaryrefslogtreecommitdiff
path: root/pastepy.py
diff options
context:
space:
mode:
authorJon Bergli Heier <snakebite@jvnv.net>2010-01-25 01:00:18 +0100
committerJon Bergli Heier <snakebite@jvnv.net>2010-01-25 01:00:18 +0100
commit346b22ddf795f9a5a10ddc6b83bfa3bc15c8d30a (patch)
treef9d9251ea08bc8ad57e7234ca451bcc3eeccc7b5 /pastepy.py
Initial commit.
Diffstat (limited to 'pastepy.py')
-rw-r--r--pastepy.py137
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 &ndash; 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 &ndash; View paste &ndash; %s' % (settings.pastebin_name, paste.title),
+ 'header': '%s &ndash; 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()