import json from django.http import HttpResponse, HttpResponseRedirect from django.shortcuts import get_object_or_404, render from django.template import RequestContext, loader from django.urls import reverse from django.views.decorators.csrf import csrf_exempt from pygments import highlight from pygments.formatters import HtmlFormatter from pygments.lexers import get_lexer_by_name from webtools import settings from paste.forms import PasteForm from paste.models import Language, Paste @csrf_exempt def index(request): """Displays form.""" if request.method == "GET": return render(request, "paste/index.html") paste = Paste() paste.choose_slug() if request.FILES: (language_name, the_file), *_ = request.FILES.items() language = Language.by_name(language_name) form = PasteForm( { "language": language.id, "content": the_file.read().decode(), }, instance=paste, ) if not form.is_valid(): return HttpResponse(json.dumps(form.errors, indent=4)) form.save() location = request.build_absolute_uri( reverse("short_paste", kwargs={"slug": paste.slug}) ) return HttpResponseRedirect( location, content=location + "\n", content_type="text/plain" ) def show(request, slug): """Display paste.""" paste = get_object_or_404(Paste, slug=slug) paste.incr_viewcount() if "html" in request.headers["accept"]: render_method = render_pygments else: render_method = render_raw return render_method(request, paste, {"slug": slug}) def render_pygments(request, paste, data): """Renders Pygments template.""" lexer = get_lexer_by_name(paste.language.slug) formatter = HtmlFormatter(style="emacs") highlighted_content = highlight(paste.content, lexer, formatter) data["paste"] = paste data["highlighted"] = highlighted_content rendered = loader.render_to_string("paste/show-pygments.html", data, request) return HttpResponse(rendered) def render_raw(request, paste, data): """Renders RAW content.""" return HttpResponse(paste.content, content_type="text/plain")