73 lines
2.2 KiB
Python
73 lines
2.2 KiB
Python
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")
|