diff options
| -rw-r--r-- | .gitignore | 3 | ||||
| -rw-r--r-- | db.py | 56 | ||||
| -rw-r--r-- | pastepy.py | 292 | ||||
| -rw-r--r-- | pastepy/__init__.py | 8 | ||||
| -rw-r--r-- | pastepy/db.py | 68 | ||||
| -rw-r--r-- | pastepy/pastepy.py | 169 | ||||
| -rw-r--r-- | pastepy/static/edit.js (renamed from static/edit.js) | 0 | ||||
| -rw-r--r-- | pastepy/static/paste.css (renamed from static/paste.css) | 0 | ||||
| -rw-r--r-- | pastepy/static/view.js | 26 | ||||
| -rw-r--r-- | pastepy/templates/base.html (renamed from templates/base.html) | 6 | ||||
| -rw-r--r-- | pastepy/templates/full.html | 18 | ||||
| -rw-r--r-- | pastepy/templates/paste.html (renamed from templates/paste.html) | 12 | ||||
| -rw-r--r-- | pastepy/templates/view.html (renamed from templates/view.html) | 6 | ||||
| -rw-r--r-- | static/view.js | 5 | ||||
| -rw-r--r-- | templates/full.html | 18 | ||||
| -rw-r--r-- | templates/message.html | 5 | 
16 files changed, 303 insertions, 389 deletions
| @@ -1,5 +1,6 @@  .*.swp  *.pyc +__pycache__  /settings.py  /db -templates/*.py +*.cfg @@ -1,56 +0,0 @@ -import settings - -from sqlalchemy import create_engine, Column, Integer, String, DateTime, Text, Index, ForeignKey -from sqlalchemy.ext.declarative import declarative_base -from sqlalchemy.orm import sessionmaker, relation, backref -from sqlalchemy.orm.exc import NoResultFound - -engine = create_engine(settings.db_path) - -Base = declarative_base(bind = engine) - -class Paste(Base): -	__tablename__ = 'paste' - -	id = Column(Integer, primary_key = True) -	hash = Column(String, unique = True, index = True) -	nick = Column(String) -	date = Column(DateTime, nullable = False) -	syntax = Column(String) -	title = Column(String) -	text = Column(Text, nullable = False) -	ip = Column(String) - -	def __init__(self, hash, nick, date, syntax, title, text, ip=None): -		self.nick = nick -		self.hash = hash -		self.date = date -		self.syntax = syntax -		self.title = title -		self.text = text -		self.ip = ip - -	def __repr__(self): -		return '<Paste(%d, "%s", "%s", "%s", "%s")>' % (self.id, self.hash, self.nick, self.date.ctime(), self.title) - -class Cache(Base): -	__tablename__ = 'cache' - -	id = Column(Integer, primary_key = True) -	paste_hash = Column(String, ForeignKey('paste.hash'), index = True) -	paste = relation(Paste, primaryjoin = paste_hash == Paste.hash, lazy = False) -	syntax_name = Column(String) -	text = Column(Text, nullable = False) - -	def __init__(self, hash, syntax_name, text): -		self.paste_hash = hash -		self.syntax_name = syntax_name -		self.text = text - -	def __repr__(self): -		return '<Cache(%d, "%s")>' % (self.id, self.paste_hash) - -Base.metadata.create_all() -Session = sessionmaker(bind = engine, autoflush = True, autocommit = False) - -# vim: noet ts=4 diff --git a/pastepy.py b/pastepy.py deleted file mode 100644 index 96d3f40..0000000 --- a/pastepy.py +++ /dev/null @@ -1,292 +0,0 @@ -import cgi -try: -	from http.cookies import SimpleCookie -except ImportError: -	from Cookie import SimpleCookie -import datetime -import db -import mimetypes -import os -import random - -import settings - -import jinja2 -try: -	import markdown -	has_markdown = True -except ImportError: -	has_markdown = False -import pygments -from pygments import highlight -from pygments.lexers import get_all_lexers, get_lexer_by_name -from pygments.formatters import HtmlFormatter -import six - -base62_alphabet = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' - -def b2t(s): -	'''Convert binary types to text types.''' -	if isinstance(s, six.binary_type): -		return s.decode('utf-8') -	return s - -def t2b(s): -	'''Convert text types to binary types.''' -	if isinstance(s, six.text_type): -		return s.encode('utf-8') -	return s - -class PasteError(Exception): pass -class UnknownSyntaxError(PasteError): pass - -class CustomHtmlFormatter(HtmlFormatter): -	def wrap(self, source, outfile): -		yield 0, '<pre>' -		line = 1 -		for i, t in source: -			yield i, '<span id="codeline-%d">%s</span>' % (line, t) -			line += 1 -		yield 0, '</pre>' - -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 -		rendered = [] -		if has_markdown: -			rendered.append(('Rendered markdown', 'md-render')) -		if len(rendered): -			self.lexers.append(('Rendered', rendered)) -		self.lexers.append(('Others' if settings.categories else 'Syntax', sorted(lexers.items(), key = lambda l: l[0].lower()))) -		self.formatter = CustomHtmlFormatter(linenos = 'table', lineanchors = 'line', anchorlinenos = True) - -		random.seed() - -		self.template_env = jinja2.Environment(loader = jinja2.FileSystemLoader('templates')) - -	def render_template(self, name, args): -		template = self.template_env.get_template(name) -		data = template.render(**args).encode('utf-8') -		self.start_response('200 OK', [('Content-Type', 'text/html; charset=UTF-8'), ('Content-Length', str(len(data)))]) -		return [data] - -	def message(self, msg, title = 'Message'): -		return self.render_template('message.html', { -			'title': '%s – %s' % (settings.pastebin_name, title), -			'header': title, -			'text': msg, -			}) - -	def paste(self): -		c = 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: -				return self.message('Invalid type "%s".' % mp['type'].value, 'Error') -		return self.render_template('paste.html', { -			'title': settings.pastebin_name, -			'header': settings.pastebin_name, -			'lexers': self.lexers, -			'nick': b2t(c['nick'].value if 'nick' in c else 'Anonymous'), -			'syntax': c['syntax'].value if 'syntax' in c else settings.default, -			'remember_me': 'nick' in c, -			'remember_syntax': 'syntax' in c, -			}) - -	def preview(self, mp): -		try: -			lexername, text = self.get_formatted(mp['syntax'].value, mp['text'].value) -		except UnknownSyntaxError: -			return self.message('Could not find lexer "%s".' % mp['syntax'].value, 'Error') - -		# These values to be unicode in py2; in py3 they will be str which is OK. -		nick = b2t(mp['nick'].value or 'Anonymous') -		title = b2t(mp['title'].value or 'Untitled') -		return self.render_template('view.html', { -			'title': settings.pastebin_name, -			'header': '%s – Preview' % settings.pastebin_name, -			'hash': None, -			'nick': nick, -			'date': '%s UTC' % datetime.datetime.utcnow().ctime(), -			'syntax': lexername, -			'pastetitle': title, -			'text': text, -			'rendered': (lexername or '').startswith('Rendered '), -			}) - -	def add_paste(self, mp): -		nick = b2t(mp['nick'].value or None) -		syntax = b2t(mp['syntax'].value or None) -		title = b2t(mp['title'].value or None) -		text = b2t(mp['text'].value.replace('\r', '') or None) - -		hash = ''.join(random.choice(base62_alphabet) for x in range(5)) - -		try: -			session = db.Session() -			paste = db.Paste(hash, nick, datetime.datetime.utcnow(), syntax, title, text, self.environ['REMOTE_ADDR']) -			session.add(paste) -			session.commit() -		finally: -			session.close() - -		headers = [('Location', '/view/%s' % hash)] -		c = SimpleCookie() -		if six.PY2: -			# In py2 we need nick to be a str, or non-ascii characters will fail with UnicodeDecodeError. -			# In py3 it must be a str or we will get garbage in the cookie value. -			nick = t2b(nick) -		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') -		c['syntax'] = syntax -		dt = (datetime.datetime.utcnow() + datetime.timedelta(days = 30)) if 'remember_syntax' in mp else datetime.datetime.utcfromtimestamp(0) -		c['syntax']['expires'] = dt.strftime('%a, %d-%b-%y %H:%M:%S GMT') -		headers.append(('Set-Cookie', c['nick'].OutputString())) -		headers.append(('Set-Cookie', c['syntax'].OutputString())) -		self.start_response('302 Found', headers) -		return [] - -	def get_formatted(self, syntax, text): -		if syntax == 'md-render' and has_markdown: -			text = markdown.markdown(text, extensions = settings.markdown_extensions) -			lexername = 'Rendered markdown' -		else: -			try: -				lex = get_lexer_by_name(syntax or 'text') -			except pygments.util.ClassNotFound: -				raise UnknownSyntaxError(syntax) -			lexername = lex.name -			text = highlight(text, lex, self.formatter) -		return (lexername, text) - -	def view(self): -		hash = self.path[1] - -		try: -			session = db.Session() -			try: -				cache = session.query(db.Cache).filter_by(paste_hash = hash).one() -				paste = cache.paste -			except db.NoResultFound: # No cache found, generate it. -				try: -					paste = session.query(db.Paste).filter_by(hash = hash).one() -				except db.NoResultFound: -					self.start_response('404 Not Found', []) -					return [] -				try: -					lexername, text = self.get_formatted(paste.syntax, paste.text) -				except UnknownSyntaxError: -					return self.message('Could not find the lexer "%s".' % paste.syntax, 'Error') -				cache = db.Cache(hash, lexername, text) -				session.add(cache) -				session.commit() -				# Workaround for attribute refresh. -				paste = cache.paste -		finally: -			session.close() - -		return self.render_template('view.html', { -			'title': '%s – View paste – %s' % (settings.pastebin_name, paste.title or 'Untitled'), -			'header': '%s – View paste' % settings.pastebin_name, -			'hash': hash, -			'date': '%s UTC' % paste.date.ctime(), -			'nick': b2t(paste.nick or 'Anonymous'), -			'syntax': cache.syntax_name, -			'pastetitle': b2t(paste.title or 'Untitled'), -			'text': b2t(cache.text), -			'rendered': (cache.syntax_name or '').startswith('Rendered '), -			}) - -	def raw(self): -		hash = self.path[1] - -		try: -			session = db.Session() -			paste = session.query(db.Paste).filter_by(hash = hash).one() -		except db.NoResultFound: -			self.start_response('404 Not Found', []) -			return [] -		finally: -			session.close() - -		self.start_response('200 OK', [('Content-Type', 'text/plain; charset=UTF-8')]) -		return [t2b(paste.text)] - -	def full(self): -		hash = self.path[1] - -		try: -			session = db.Session() -			try: -				cache = session.query(db.Cache).filter_by(paste_hash = hash).one() -				paste = cache.paste -			except db.NoResultFound: -				try: -					paste = session.query(db.Paste).filter_by(hash = hash).one() -				except db.NoResultFound: -					self.start_response('404 Not Found', []) -					return [] -				try: -					lexername, text = self.get_formatted(paste.syntax, paste.text) -				except UnknownSyntaxError: -					return self.message('Could not find the lexer "%s".' % paste.syntax, 'Error') -				cache = db.Cache(hash, lexername, text) -				session.add(cache) -				session.commit() -				# Workaround for attribute refresh. -				paste = cache.paste -		finally: -			session.close() - -		return self.render_template('full.html', { -			'title': '%s – %s' % (settings.pastebin_name, paste.title or 'Untitled'), -			'text': b2t(cache.text), -			'rendered': (cache.syntax_name or '').startswith('Rendered '), -		}) - -	def highlight_stylesheet(self): -		self.start_response('200 OK', [('Content-Type', 'text/css')]) -		return [t2b(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', 'view.js') or not os.path.exists(filename): -			self.start_response('404 Not Found', [('Content-Type', 'text/html; charset=UTF-8'), ('Location', '/')]) -			return ['<a href="/">asdf</a>'] -		self.start_response('200 OK', [('Content-Type', mimetypes.guess_type(filename)[0] or 'text/plain; charset=UTF-8')]) -		return open(filename, 'rb') - -	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', 'full', 'static', 'highlight_stylesheet'): -			self.path = path -			return getattr(self, module)() -		else: -			return self.message('Invalid module requested.', 'Error') - -if __name__ == '__main__': -	from wsgiref.simple_server import make_server -	httpd = make_server('', 8000, Paste()) -	httpd.serve_forever() - -# vim: noet ts=4 diff --git a/pastepy/__init__.py b/pastepy/__init__.py new file mode 100644 index 0000000..0cc4db6 --- /dev/null +++ b/pastepy/__init__.py @@ -0,0 +1,8 @@ +from flask import Flask + +app = Flask(__name__) +app.config.from_pyfile('pastepy.cfg') + +with app.app_context(): +    from .pastepy import app as pastepy +    app.register_blueprint(pastepy) diff --git a/pastepy/db.py b/pastepy/db.py new file mode 100644 index 0000000..0aa04a1 --- /dev/null +++ b/pastepy/db.py @@ -0,0 +1,68 @@ +from contextlib import contextmanager + +from flask import current_app +from sqlalchemy import create_engine, Column, Integer, String, DateTime, Text, Index, ForeignKey +from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.orm import sessionmaker, relation, backref +from sqlalchemy.orm.exc import NoResultFound + +engine = create_engine(current_app.config['DB_PATH']) + +Base = declarative_base(bind = engine) + +class Paste(Base): +    __tablename__ = 'paste' + +    id = Column(Integer, primary_key = True) +    hash = Column(String, unique = True, index = True) +    nick = Column(String) +    date = Column(DateTime, nullable = False) +    syntax = Column(String) +    title = Column(String) +    text = Column(Text, nullable = False) +    ip = Column(String) + +    def __init__(self, hash, nick, date, syntax, title, text, ip=None): +        self.nick = nick +        self.hash = hash +        self.date = date +        self.syntax = syntax +        self.title = title +        self.text = text +        self.ip = ip + +    def __repr__(self): +        return '<Paste(%d, "%s", "%s", "%s", "%s")>' % (self.id, self.hash, self.nick, self.date.ctime(), self.title) + +class Cache(Base): +    __tablename__ = 'cache' + +    id = Column(Integer, primary_key = True) +    paste_hash = Column(String, ForeignKey('paste.hash'), index = True) +    paste = relation(Paste, primaryjoin = paste_hash == Paste.hash, lazy = False) +    syntax_name = Column(String) +    text = Column(Text, nullable = False) + +    def __init__(self, hash, syntax_name, text): +        self.paste_hash = hash +        self.syntax_name = syntax_name +        self.text = text + +    def __repr__(self): +        return '<Cache(%d, "%s")>' % (self.id, self.paste_hash) + +Base.metadata.create_all() +Session = sessionmaker(bind = engine, autoflush = True, autocommit = False) + +@contextmanager +def session_scope(): +    session = Session() +    try: +        session.expire_on_commit = False +        yield session +        session.commit() +    except: +        session.rollback() +        raise +    finally: +        session.close() diff --git a/pastepy/pastepy.py b/pastepy/pastepy.py new file mode 100644 index 0000000..750d8fe --- /dev/null +++ b/pastepy/pastepy.py @@ -0,0 +1,169 @@ +import datetime +import random + +from flask import Blueprint, current_app, render_template, request, session, redirect, url_for +try: +    import markdown +    has_markdown = True +except ImportError: +    has_markdown = False +import pygments +from pygments import highlight +from pygments.lexers import get_all_lexers, get_lexer_by_name +from pygments.formatters import HtmlFormatter + +from . import db + +app = Blueprint(__name__, 'pastepy') + +base62_alphabet = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' + +class PasteError(Exception): pass +class UnknownSyntaxError(PasteError): pass + +class CustomHtmlFormatter(HtmlFormatter): +    def wrap(self, source, outfile): +        yield 0, '<pre>' +        line = 1 +        for i, t in source: +            yield i, '<span id="codeline-{}">{}</span>'.format(i, t) +            line += 1 +        yield 0, '</pre>' + +def init_lexers(): +    all_lexers = dict([(x[0], x[1][0]) for x in get_all_lexers()]) +    lexers = [] +    removed = [] +    for cat, ls in current_app.config['CATEGORIES']: +        for l in ls: +            removed.append(l) +        lexers.append((cat, [(x, all_lexers[x]) for x in ls if x in all_lexers])) +    for l in removed: +        try: +            del all_lexers[l] +        except KeyError: +            pass +    rendered = [] +    if has_markdown: +        rendered.append(('Rendered markdown', 'md-render')) +    if len(rendered): +        lexers.append(('Rendered', rendered)) +    lexers.append(('Others' if current_app.config['CATEGORIES'] else 'Syntax', sorted(all_lexers.items(), key = lambda l: l[0].lower()))) + +    current_app.config['LEXERS'] = lexers +    current_app.config['FORMATTER'] = CustomHtmlFormatter(linenos='table', lineanchors='line', anchorlinenos=True) + +init_lexers() + +@app.route('/') +@app.route('/paste') +def paste(): +    context = { +        'title': current_app.config['PASTEBIN_NAME'], +        'header': current_app.config['PASTEBIN_NAME'], +    } +    return render_template('paste.html', **context) + +def get_formatted(syntax, text): +    if syntax == 'md-render' and has_markdown: +        text = markdown.markdown(text, extensions=current_app.config['MARKDOWN_EXTENSIONS']) +        lexername = 'Rendered markdown' +    else: +        try: +            lex = get_lexer_by_name(syntax or 'text') +        except pygments.util.ClassNotFound: +            raise UnknownSyntaxError(syntax) +        lexername = lex.name +        text = highlight(text, lex, current_app.config['FORMATTER']) +    return (lexername, text) + +def add_paste(): +    nick = request.form.get('nick') +    syntax = request.form.get('syntax') +    title = request.form.get('title') +    text = request.form.get('text').replace('\r', '') + +    with db.session_scope() as db_session: +        paste_hash = ''.join(random.choice(base62_alphabet) for x in range(5)) +        paste = db.Paste(paste_hash, nick, datetime.datetime.utcnow(), syntax, title, text, request.remote_addr) +        db_session.add(paste) + +    if 'remember_me' in request.form: +        session['nick'] = nick +    else: +        session.pop('nick', None) +    if 'remember_syntax' in request.form: +        session['syntax'] = syntax +    else: +        session.pop('syntax', None) +    return redirect(url_for('.view_paste', paste_hash=paste_hash)) + +def render_preview(): +    try: +        lexername, text = get_formatted(request.form['syntax'], request.form['text']) +    except UnknownSyntaxError: +        abort(500, 'Could not find lexer "{}".'.format(request.form['syntax'])) + +    nick = request.form['nick'] or 'Anonymous' +    title = request.form['title'] or 'Untitled' +    return render_template('view.html', +        title='Preview', +        hash=None, +        nick=nick, +        date='{} UTC'.format(datetime.datetime.utcnow().ctime()), +        syntax=lexername, +        pastetitle=title, +        text=text, +        rendered=(lexername or '').startswith('Rendered '), +    ) + +@app.route('/paste', methods=['POST']) +def post_paste(): +    if request.form['type'] == 'Preview': +        return render_preview() +    if request.form['type'] == 'Paste': +        return add_paste() +    abort(404) + +@app.route('/view/<paste_hash>') +@app.route('/full/<paste_hash>', endpoint='view_full') +def view_paste(paste_hash): +    with db.session_scope() as db_session: +        try: +            cache = db_session.query(db.Cache).filter_by(paste_hash=paste_hash).one() +            paste = cache.paste +        except db.NoResultFound: +            try: +                paste = db_session.query(db.Paste).filter_by(hash=paste_hash).one() +            except db.NoResultFound: +                abort(404) +            try: +                lexername, text = get_formatted(paste.syntax, paste.text) +            except UnknownSyntaxError: +                abort(500, 'Could not find the lexer "{}"'.format(paste.syntax)) +            cache = db.Cache(paste_hash, lexername, text) +            db_session.add(cache) +    template = 'full.html' if request.endpoint.endswith('.view_full') else 'view.html' +    return render_template(template, +        title='View paste \u2013 {}'.format(current_app.config['PASTEBIN_NAME'], paste.title or 'Untitled'), +        hash=paste_hash, +        date='{} UTC'.format(paste.date.ctime()), +        nick=paste.nick or 'Anonymous', +        syntax=cache.syntax_name, +        pastetitle=paste.title or 'Untitled', +        text=cache.text, +        rendered=(cache.syntax_name or '').startswith('Rendered '), +    ) + +@app.route('/highlight_stylesheet') +def highlight_stylesheet(): +    return current_app.config['FORMATTER'].get_style_defs(), 200, {'Content-Type': 'text/css'} + +@app.route('/raw/<paste_hash>') +def raw(paste_hash): +    with db.session_scope() as db_session: +        try: +            paste = db_session.query(db.Paste).filter_by(hash=paste_hash).one() +        except db.NoResultFound: +            abort(404) +    return paste.text, 200, {'Content-Type': 'text/plain'} diff --git a/static/edit.js b/pastepy/static/edit.js index 8e754d8..8e754d8 100644 --- a/static/edit.js +++ b/pastepy/static/edit.js diff --git a/static/paste.css b/pastepy/static/paste.css index 5e59d4d..5e59d4d 100644 --- a/static/paste.css +++ b/pastepy/static/paste.css diff --git a/pastepy/static/view.js b/pastepy/static/view.js new file mode 100644 index 0000000..fd6db03 --- /dev/null +++ b/pastepy/static/view.js @@ -0,0 +1,26 @@ +function set_highlight(line) { +	var line = 'codeline-' + line +	var codeline = document.getElementById(line); +	if (codeline) { +		codeline.className = 'selected'; +	} +} +function cleanup() { +	var elements = document.getElementsByClassName('selected'); +	for (var i = 0; i < elements.length; i++) { +		elements[i].className = ''; +	} +} +window.onload = function(event) { +	var line = document.location.hash.substr(6); +	if (line) { +		set_highlight(line); +	} +	var as = document.getElementsByClassName('linenodiv')[0].getElementsByTagName('a'); +	for (var i = 0; i < as.length; i++) { +		as[i].onclick = function(event) { +			cleanup(); +			set_highlight(event.target.text.trim()); +		} +	} +} diff --git a/templates/base.html b/pastepy/templates/base.html index 196a03e..e208b6b 100644 --- a/templates/base.html +++ b/pastepy/templates/base.html @@ -1,15 +1,15 @@  <!DOCTYPE html>  <html lang="en">  	<head> -		<title>{{ title }}</title> -		<link rel="StyleSheet" href="/static/paste.css" type="text/css"> +		<title>{{ config.PASTEBIN_NAME }}{% if title %} – {{ title }}{% endif %}</title> +		<link rel="StyleSheet" href="{{ url_for('static', filename='paste.css') }}" type="text/css">  {% block head %}  {% endblock %}  	</head>  	<body>  		<div id="page">  			<div id="page-header"> -				<h1><a href="/">{{ header }}</a></h1> +				<h1><a href="/">{{ title }}</a></h1>  			</div>  			<div id="page-content">  {% block content %} diff --git a/pastepy/templates/full.html b/pastepy/templates/full.html new file mode 100644 index 0000000..c60126e --- /dev/null +++ b/pastepy/templates/full.html @@ -0,0 +1,18 @@ +<!DOCTYPE html> +<html lang="en"> +<head> +	<title>{{ title }}</title> +	<link rel="StyleSheet" href="{{ url_for('.highlight_stylesheet') }}" type="text/css"> +	<link rel="StyleSheet" href="{{ url_for('static', filename='paste.css') }}" type="text/css"> +	<script type="text/javascript" src="{{ url_for('static', filename='view.js') }}"></script> +</head> +<body> +{% if rendered %} +<div class="paste-rendered"> +{% endif %} +{{ text|safe }} +{% if rendered %} +</div> +{% endif %} +</body> +</html> diff --git a/templates/paste.html b/pastepy/templates/paste.html index e22f76d..9a22e76 100644 --- a/templates/paste.html +++ b/pastepy/templates/paste.html @@ -1,26 +1,26 @@  {% extends "base.html" %}  {% block head %} -		<script src="/static/edit.js" type="text/javascript"></script> +		<script src="{{ url_for('static', filename='edit.js') }}" type="text/javascript"></script>  {% endblock %}  {% block content %}  		<form action="/paste" method="post" id="pasteform">  			<ul>  				<li id="syntaxli">  					<select name="syntax" id="syntax"> -						{% for cat, ls in lexers %} +						{% for cat, ls in config.LEXERS %}  						<optgroup label="{{ cat }}">  							{% for k, v in ls %} -							<option value="{{ v }}"{% if v == syntax %} selected="selected"{% endif %}>{{ k }}</option> +							<option value="{{ v }}"{% if v == (session.syntax or config.DEFAULT_SYNTAX) %} selected="selected"{% endif %}>{{ k }}</option>  							{% endfor %}  						</optgroup>  						{% endfor %}  					</select> -					<input type="checkbox" name="remember_syntax" id="remember_syntax"{% if remember_syntax %} checked{% endif %}> +					<input type="checkbox" name="remember_syntax" id="remember_syntax"{% if session.syntax %} checked{% endif %}>  					<label for="remember_syntax">Remember syntax</label>  				</li>  				<li> -					<input type="text" name="nick" id="nick" value="{{ nick }}"> -					<input type="checkbox" name="remember_me" id="remember_me"{% if remember_me %} checked{% endif %}> +					<input type="text" name="nick" id="nick" value="{{ session.nick }}"> +					<input type="checkbox" name="remember_me" id="remember_me"{% if session.nick %} checked{% endif %}>  					<label for="remember_me">Remember me</label>  				</li>  				<li><input type="text" name="title" id="title" value="Untitled"></li> diff --git a/templates/view.html b/pastepy/templates/view.html index a1d00a7..b0b114c 100644 --- a/templates/view.html +++ b/pastepy/templates/view.html @@ -1,7 +1,7 @@  {% extends "base.html" %}  {% block head %} -		<link rel="StyleSheet" href="/highlight_stylesheet" type="text/css"> -		<script type="text/javascript" src="/static/view.js"></script> +		<link rel="StyleSheet" href="{{ url_for('.highlight_stylesheet') }}" type="text/css"> +		<script type="text/javascript" src="{{ url_for('static', filename='view.js') }}"></script>  {% endblock %}  {% block content %}  		<p><a href="/">New paste</a></p> @@ -20,7 +20,7 @@  			{% if rendered %}  			<div class="paste-rendered">  			{% endif %} -			{{ text }} +			{{ text|safe }}  			{% if rendered %}  			</div>  			{% endif %} diff --git a/static/view.js b/static/view.js deleted file mode 100644 index c855609..0000000 --- a/static/view.js +++ /dev/null @@ -1,5 +0,0 @@ -window.onload = function() { -	var line = 'code' + document.location.hash.substr(1); -	var codeline = document.getElementById(line); -	codeline.className = 'selected'; -} diff --git a/templates/full.html b/templates/full.html deleted file mode 100644 index dfa0606..0000000 --- a/templates/full.html +++ /dev/null @@ -1,18 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> -<head> -	<title>{{ title }}</title> -	<link rel="StyleSheet" href="/highlight_stylesheet" type="text/css"> -	<link rel="StyleSheet" href="/static/paste.css" type="text/css"> -	<script type="text/javascript" src="/static/view.js"></script> -</head> -<body> -{% if rendered %} -<div class="paste-rendered"> -{% endif %} -{{ text }} -{% if rendered %} -</div> -{% endif %} -</body> -</html> diff --git a/templates/message.html b/templates/message.html deleted file mode 100644 index 540b64a..0000000 --- a/templates/message.html +++ /dev/null @@ -1,5 +0,0 @@ -{% extends "base.html" %} -{% block content %} -		<p><a href="/">New paste</a></p> -		{{ text }} -{% endblock %} | 
