From 6807cf014cb0fde611f63c64bc352038206176cc Mon Sep 17 00:00:00 2001 From: tom christie tom@tomchristie.com Date: Wed, 26 Jan 2011 08:58:09 +0000 Subject: Added pygments_api example --- examples/pygments_api/views.py | 64 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 examples/pygments_api/views.py (limited to 'examples/pygments_api/views.py') diff --git a/examples/pygments_api/views.py b/examples/pygments_api/views.py new file mode 100644 index 00000000..01f1b4b6 --- /dev/null +++ b/examples/pygments_api/views.py @@ -0,0 +1,64 @@ +from django.conf import settings + +from flywheel.resource import Resource +from flywheel.response import Response, status +from flywheel.emitters import BaseEmitter + +from pygments.formatters import HtmlFormatter +from pygments.lexers import get_lexer_by_name +from pygments import highlight + +from forms import PygmentsForm + +import os +import hashlib + +# We need somewhere to store the code that we highlight +HIGHLIGHTED_CODE_DIR = os.path.join(settings.MEDIA_ROOT, 'pygments') + + +class HTMLEmitter(BaseEmitter): + """Basic emitter which just returns the content without any further serialization.""" + media_type = 'text/html' + + +class PygmentsRoot(Resource): + """This example demonstrates a simple RESTful Web API aound the awesome pygments library. + This top level resource is used to create """ + form = PygmentsForm + allowed_methods = anon_allowed_methods = ('POST',) + + def post(self, request, auth, content): + # Generate a unique id by hashing the input + input_str = ''.join(['%s%s' % (key, content[key]) for key in sorted(content.keys())]) + hash = hashlib.md5() + hash.update(input_str) + unique_id = hash.hexdigest() + pathname = os.path.join(HIGHLIGHTED_CODE_DIR, unique_id) + + if not os.path.exists(pathname): + # We only need to generate the file if it doesn't already exist. + title = content['title'] if content['title'] else None + linenos = 'table' if content['linenos'] else False + lexer = get_lexer_by_name(content['lexer']) + formatter = HtmlFormatter(style=content['style'], linenos=linenos, full=True, title=title) + + with open(pathname, 'w') as outfile: + highlight(content['code'], lexer, formatter, outfile) + + return Response(status.HTTP_303_SEE_OTHER, headers={'Location': self.reverse(PygmentsInstance, unique_id)}) + + +class PygmentsInstance(Resource): + """Simply return the stored highlighted HTML file with the correct mime type. + This Resource only emits HTML and uses a standard HTML emitter rather than FlyWheel's DocumentingHTMLEmitter class.""" + allowed_methods = anon_allowed_methods = ('GET',) + emitters = (HTMLEmitter,) + + def get(self, request, auth, unique_id): + pathname = os.path.join(HIGHLIGHTED_CODE_DIR, unique_id) + if not os.path.exists(pathname): + return Resource(status.HTTP_404_NOT_FOUND) + return open(pathname, 'r').read() + + -- cgit v1.2.3