import templates, pygments, cgi, db, datetime, hashlib, settings, os, mimetypes, Cookie
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()])
lexers['Plain text'] = ''
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):
c = Cookie.SimpleCookie(self.environ['HTTP_COOKIE'] if 'HTTP_COOKIE' in self.environ else None)
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,
'default': settings.default,
'nick': c['nick'].value if 'nick' in c else 'Anonymous',
'remembered': 'nick' in c,
}))]
def preview(self, mp):
try:
lex = get_lexer_by_name(mp['syntax'].value)
lexername = lex.name
text = highlight(mp['text'].value, lex, self.formatter)
except:
lexername = 'Plain text'
text = mp['text'].value
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': lexername,
'pastetitle': mp['title'].value or 'Untitled',
'text': text,
}))]
def add_paste(self, mp):
nick = mp['nick'].value
syntax = mp['syntax'].value or None
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.decode('utf8'), datetime.datetime.utcnow(), syntax.decode('utf8') if syntax else None, title.decode('utf8'), text.decode('utf8'))
session.add(paste)
session.commit()
finally:
session.close()
headers = [('Location', '/view/%s' % hash)]
c = Cookie.SimpleCookie()
c['nick'] = nick
dt = (datetime.datetime.utcnow() + datetime.timedelta(days = 30)) if 'remember_me' in mp else datetime.datetime.utcfromtimestamp(0)
c['nick']['expires'] = dt.strftime('%a, %d-%b-%y %H:%M:%S GMT')
headers.append(('Set-Cookie', c['nick'].OutputString()))
self.start_response('302 Found', headers)
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()
try:
lex = get_lexer_by_name(paste.syntax)
lexername = lex.name
text = highlight(paste.text, lex, self.formatter)
except:
lexername = 'Plain text'
text = paste.text
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': lexername,
'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()