add API for different markup languages
This commit is contained in:
parent
9aeed1a47e
commit
487d76ba61
@ -31,11 +31,12 @@ from werkzeug.serving import run_simple
|
||||
from werkzeug.wrappers import Request, Response
|
||||
from werkzeug.exceptions import HTTPException, NotFound, InternalServerError
|
||||
|
||||
from isso import admin, comment, db, utils
|
||||
from isso import admin, comment, db
|
||||
from isso.utils import determine, import_object, RegexConverter, IssoEncoder
|
||||
|
||||
# override default json :func:`dumps`.
|
||||
_dumps = json.dumps
|
||||
setattr(json, 'dumps', lambda obj, **kw: _dumps(obj, cls=utils.IssoEncoder, **kw))
|
||||
setattr(json, 'dumps', lambda obj, **kw: _dumps(obj, cls=IssoEncoder, **kw))
|
||||
|
||||
# yep. lazy.
|
||||
url = lambda path, endpoint, methods: Rule(path, endpoint=endpoint, methods=methods)
|
||||
@ -50,7 +51,7 @@ url_map = Map([
|
||||
url('/comment/<re(".+"):path>/new', 'comment.create', ['POST']),
|
||||
url('/comment/<re(".+"):path>/<int:id>', 'comment.get', ['GET']),
|
||||
url('/comment/<re(".+"):path>/<int:id>', 'comment.modify', ['PUT', 'DELETE']),
|
||||
], converters={'re': utils.RegexConverter})
|
||||
], converters={'re': RegexConverter})
|
||||
|
||||
|
||||
class Isso:
|
||||
@ -67,11 +68,13 @@ class Isso:
|
||||
|
||||
self.__dict__.update(dict((k, v) for k, v in conf.iteritems() if k.isupper()))
|
||||
self.signer = URLSafeTimedSerializer(self.SECRET_KEY)
|
||||
self.HOST = utils.determine(self.HOST)
|
||||
self.HOST = determine(self.HOST)
|
||||
|
||||
if self.SQLITE:
|
||||
self.db = db.SQLite(self)
|
||||
|
||||
self.markup = import_object(conf.get('MARKUP', 'isso.markup.Markdown'))(conf)
|
||||
|
||||
def sign(self, obj):
|
||||
return self.signer.dumps(obj)
|
||||
|
||||
|
@ -21,7 +21,7 @@ def create(app, environ, request, path):
|
||||
except ValueError:
|
||||
return abort(400)
|
||||
|
||||
rv.text = utils.markdown(rv.text)
|
||||
rv.text = app.markup.convert(rv.text)
|
||||
response = Response(json.dumps(rv), 201, content_type='application/json')
|
||||
response.set_cookie('session', app.signer.dumps([path, rv.id]), max_age=app.MAX_AGE)
|
||||
return response
|
||||
@ -35,9 +35,9 @@ def get(app, environ, request, path, id=None):
|
||||
|
||||
if isinstance(rv, list):
|
||||
for item in rv:
|
||||
item.text = utils.markdown(item.text)
|
||||
item.text = app.markup.convert(item.text)
|
||||
else:
|
||||
rv.text = utils.markdown(rv.text)
|
||||
rv.text = app.markup.convert(rv.text)
|
||||
|
||||
return Response(json.dumps(rv), 200, content_type='application/json')
|
||||
|
||||
|
34
isso/markup.py
Normal file
34
isso/markup.py
Normal file
@ -0,0 +1,34 @@
|
||||
# XXX: BBCode -- http://pypi.python.org/pypi/bbcode
|
||||
|
||||
import abc
|
||||
|
||||
try:
|
||||
import misaka
|
||||
except ImportError:
|
||||
misaka = None # NOQA
|
||||
|
||||
|
||||
class Markup:
|
||||
|
||||
__metaclass__ = abc.ABCMeta
|
||||
|
||||
@abc.abstractmethod
|
||||
def __init__(self, conf):
|
||||
return
|
||||
|
||||
@abc.abstractmethod
|
||||
def convert(self, text):
|
||||
return text
|
||||
|
||||
|
||||
class Markdown(Markup):
|
||||
|
||||
def __init__(self, conf):
|
||||
if misaka is None:
|
||||
raise ImportError("Markdown requires 'misaka' lib!")
|
||||
return
|
||||
|
||||
def convert(self, text):
|
||||
return misaka.html(text, extensions = misaka.EXT_STRIKETHROUGH \
|
||||
| misaka.EXT_SUPERSCRIPT | misaka.EXT_AUTOLINK \
|
||||
| misaka.HTML_SKIP_HTML | misaka.HTML_SKIP_IMAGES | misaka.HTML_SAFELINK)
|
@ -9,7 +9,6 @@ import httplib
|
||||
import urlparse
|
||||
import contextlib
|
||||
|
||||
import misaka
|
||||
import werkzeug.routing
|
||||
|
||||
from isso.models import Comment
|
||||
@ -48,7 +47,10 @@ def determine(host):
|
||||
return (rv.netloc + ':443') if rv.scheme == 'https' else rv.netloc
|
||||
|
||||
|
||||
def markdown(text):
|
||||
return misaka.html(text,
|
||||
extensions = misaka.EXT_STRIKETHROUGH | misaka.EXT_SUPERSCRIPT | misaka.EXT_AUTOLINK \
|
||||
| misaka.HTML_SKIP_HTML | misaka.HTML_SKIP_IMAGES | misaka.HTML_SAFELINK)
|
||||
def import_object(name):
|
||||
if '.' not in name:
|
||||
return __import__(name)
|
||||
|
||||
parts = name.split('.')
|
||||
obj = __import__('.'.join(parts[:-1]), None, None, [parts[-1]], 0)
|
||||
return getattr(obj, parts[-1])
|
||||
|
Loading…
Reference in New Issue
Block a user