diff --git a/paste/forms.py b/paste/forms.py index 795fc38..035376d 100644 --- a/paste/forms.py +++ b/paste/forms.py @@ -1,6 +1,8 @@ -from webtools import settings from django import forms -from django.forms import ModelForm, CharField +from django.forms import CharField, ModelForm + +from webtools import settings + from .models import Paste diff --git a/paste/models.py b/paste/models.py index 8cb079e..fa5a5cd 100644 --- a/paste/models.py +++ b/paste/models.py @@ -1,10 +1,12 @@ -from django.db import models -from django.core.validators import MaxLengthValidator -from django.utils import timezone from datetime import datetime, timedelta -from webtools import settings -from django.utils.translation import gettext_lazy as _ + import shortuuid +from django.core.validators import MaxLengthValidator +from django.db import models +from django.utils import timezone +from django.utils.translation import gettext_lazy as _ + +from webtools import settings class Paste(models.Model): diff --git a/paste/urls.py b/paste/urls.py index 109d940..6983e94 100644 --- a/paste/urls.py +++ b/paste/urls.py @@ -1,9 +1,9 @@ from django.urls import path from django.views.static import serve + from paste import views from webtools import settings - urlpatterns = [ path("", views.index, name="index"), path("static/", serve, {"document_root": settings.STATIC_ROOT}), diff --git a/paste/views.py b/paste/views.py index 9884283..82b3585 100644 --- a/paste/views.py +++ b/paste/views.py @@ -1,19 +1,18 @@ import json -from pathlib import Path +from functools import lru_cache +import pygments 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 -import pygments 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 Paste +from webtools import settings @csrf_exempt @@ -51,26 +50,19 @@ def show(request, slug): paste.incr_viewcount() if "html" in request.headers["accept"]: - render_method = render_pygments + return HttpResponse(pygmentize(paste.filename, paste.content)) else: - render_method = render_raw - return render_method(request, paste, {"slug": slug}) + return HttpResponse(paste.content, content_type="text/plain") -def render_pygments(request, paste, data): - """Renders Pygments template.""" +@lru_cache(1024) +def pygmentize(filename, filecontents): try: - lexer = get_lexer_by_name(Path(paste.filename).suffix.strip(".")) + lexer = get_lexer_by_name(filename.split(".")[-1]) except pygments.util.ClassNotFound: lexer = get_lexer_by_name(settings.PASTE["default_language"]) formatter = HtmlFormatter(style="emacs") - data["paste"] = paste - data["filename"] = paste.filename - data["highlighted"] = pygments.highlight(paste.content, lexer, formatter) - 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") + data = {} + data["filename"] = filename + data["highlighted"] = pygments.highlight(filecontents, lexer, formatter) + return loader.render_to_string("paste/show-pygments.html", data)