aboutsummaryrefslogtreecommitdiffstats
path: root/examples/pygments_api/views.py
diff options
context:
space:
mode:
Diffstat (limited to 'examples/pygments_api/views.py')
-rw-r--r--examples/pygments_api/views.py64
1 files changed, 64 insertions, 0 deletions
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()
+
+