mirror of
https://github.com/DarrenOfficial/dpaste.git
synced 2024-11-23 11:56:36 +11:00
Bring back diff view.
This commit is contained in:
parent
dd0797dd98
commit
c65f225612
5 changed files with 65 additions and 86 deletions
|
@ -6,8 +6,6 @@ body {
|
||||||
font-weight: $baseFontRegular;
|
font-weight: $baseFontRegular;
|
||||||
}
|
}
|
||||||
|
|
||||||
body[data-code-snippet] { background-color: $codeBgColor; }
|
|
||||||
|
|
||||||
body[data-platform=win] .platform-mac { display: none; }
|
body[data-platform=win] .platform-mac { display: none; }
|
||||||
body[data-platform=mac] .platform-win { display: none; }
|
body[data-platform=mac] .platform-win { display: none; }
|
||||||
|
|
||||||
|
|
|
@ -1,15 +1,34 @@
|
||||||
|
.snippet-diff {
|
||||||
|
color: $codeTextColor;
|
||||||
|
background-color: $codeBgColor;
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
padding: 20px $boxPadding 10px $boxPadding;
|
||||||
|
color: $codeTextColor;
|
||||||
|
font-weight: $baseFontDemiBold;
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.snippet-code {
|
||||||
|
background-color: $codeDiffBgColor;
|
||||||
|
padding: 20px $boxPadding 20px $boxPadding;
|
||||||
|
white-space: pre;
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.snippet-code {
|
.snippet-code {
|
||||||
|
padding: 20px $boxPadding;
|
||||||
|
|
||||||
font-family: $codeFont;
|
font-family: $codeFont;
|
||||||
font-size: 13px;
|
font-size: 13px;
|
||||||
font-weight: 300;
|
font-weight: 300;
|
||||||
line-height: 20px;
|
line-height: 20px;
|
||||||
//overflow: auto;
|
//overflow: auto;
|
||||||
|
|
||||||
color: $codeTextColor;
|
color: $codeTextColor;
|
||||||
background-color: $codeBgColor;
|
background-color: $codeBgColor;
|
||||||
|
|
||||||
padding: 20px $boxPadding;
|
|
||||||
|
|
||||||
&.wordwrap {
|
&.wordwrap {
|
||||||
overflow: auto;
|
overflow: auto;
|
||||||
li { white-space: pre-wrap !important; }
|
li { white-space: pre-wrap !important; }
|
||||||
|
@ -43,9 +62,16 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@mixin diffline {
|
||||||
|
display: inline-block;
|
||||||
|
width: 100%;
|
||||||
|
margin: 0 -10px;
|
||||||
|
padding: 0 10px;
|
||||||
|
|
||||||
|
}
|
||||||
// Pygments
|
// Pygments
|
||||||
.gd { background-color: rgba(226, 12, 19, .3); color: #fff; display: block; }
|
.gd { background-color: #473335; color: #f8f8f2; @include diffline; }
|
||||||
.gi { background-color: rgba(23, 189, 10, .2); color: #fff; display: block; }
|
.gi { background-color: #2d4a39; color: #f8f8f2; @include diffline; }
|
||||||
|
|
||||||
.hll { background-color: #49483e }
|
.hll { background-color: #49483e }
|
||||||
.c { color: #75715e } /* Comment */
|
.c { color: #75715e } /* Comment */
|
||||||
|
|
|
@ -4,10 +4,6 @@
|
||||||
|
|
||||||
{% block title %}dpaste/{{ snippet.secret_id }} ({{ snippet.lexer }}){% endblock %}
|
{% block title %}dpaste/{{ snippet.secret_id }} ({{ snippet.lexer }}){% endblock %}
|
||||||
|
|
||||||
{% block body_type %}
|
|
||||||
{% if snippet.lexer == 'text' %}data-text-snippet{% else %}data-code-snippet{% endif %}
|
|
||||||
{% endblock %}
|
|
||||||
|
|
||||||
{% block headline %}
|
{% block headline %}
|
||||||
<a href="{{ request.build_absolute_uri }}">{{ request.build_absolute_uri }}</a>
|
<a href="{{ request.build_absolute_uri }}">{{ request.build_absolute_uri }}</a>
|
||||||
|
|
||||||
|
@ -71,6 +67,13 @@
|
||||||
</p>
|
</p>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
|
{% if diff %}
|
||||||
|
<div class="snippet-diff">
|
||||||
|
<h2>{% trans "Comparision with previous snippet " %}</h2>
|
||||||
|
<div class="snippet-code">{{ diff|safe }}</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
{% if snippet.lexer == '_text' %}
|
{% if snippet.lexer == '_text' %}
|
||||||
<div class="snippet-text">{% include "dpaste/highlight/text.html" %}</div>
|
<div class="snippet-text">{% include "dpaste/highlight/text.html" %}</div>
|
||||||
{% else %}
|
{% else %}
|
||||||
|
|
|
@ -4,8 +4,6 @@
|
||||||
|
|
||||||
{% block title %}{% trans "Snippet History" %}{% endblock %}
|
{% block title %}{% trans "Snippet History" %}{% endblock %}
|
||||||
|
|
||||||
{% block body_type %}data-code-snippet{% endblock %}
|
|
||||||
|
|
||||||
{% block options %}
|
{% block options %}
|
||||||
<ul id="snippetOptions">
|
<ul id="snippetOptions">
|
||||||
<li>{% trans "Snippet History" %}</li>
|
<li>{% trans "Snippet History" %}</li>
|
||||||
|
@ -41,7 +39,6 @@
|
||||||
<a href="{{ snippet.get_absolute_url }}">{% blocktrans with snippet.lexer_name as type %}{{ type }} Snippet{% endblocktrans %}</a>
|
<a href="{{ snippet.get_absolute_url }}">{% blocktrans with snippet.lexer_name as type %}{{ type }} Snippet{% endblocktrans %}</a>
|
||||||
<span class="sep"></span>
|
<span class="sep"></span>
|
||||||
{% blocktrans with snippet.published|timesince as since %}Created {{ since }} ago{% endblocktrans %}
|
{% blocktrans with snippet.published|timesince as since %}Created {{ since }} ago{% endblocktrans %}
|
||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
{% if snippet.lexer == '_text' %}
|
{% if snippet.lexer == '_text' %}
|
||||||
|
@ -54,7 +51,4 @@
|
||||||
<p class="history-empty">
|
<p class="history-empty">
|
||||||
{% trans "No snippets saved. Either all your snippets are expired or your cookie has changed." %}</p>
|
{% trans "No snippets saved. Either all your snippets are expired or your cookie has changed." %}</p>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
|
@ -5,14 +5,12 @@ import difflib
|
||||||
import json
|
import json
|
||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.core.exceptions import ObjectDoesNotExist
|
|
||||||
from django.db.models import Count
|
from django.db.models import Count
|
||||||
from django.http import (Http404, HttpResponse, HttpResponseBadRequest,
|
from django.http import (Http404, HttpResponse, HttpResponseBadRequest,
|
||||||
HttpResponseRedirect)
|
HttpResponseRedirect)
|
||||||
from django.shortcuts import get_object_or_404
|
from django.shortcuts import get_object_or_404
|
||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
from django.utils.encoding import force_text
|
from django.utils.translation import ugettext
|
||||||
from django.utils.translation import ugettext_lazy as _
|
|
||||||
from django.views.defaults import page_not_found as django_page_not_found, \
|
from django.views.defaults import page_not_found as django_page_not_found, \
|
||||||
server_error as django_server_error
|
server_error as django_server_error
|
||||||
from django.views.generic import FormView
|
from django.views.generic import FormView
|
||||||
|
@ -76,13 +74,12 @@ class SnippetDetailView(SnippetView, DetailView):
|
||||||
if 'delete' in self.request.POST:
|
if 'delete' in self.request.POST:
|
||||||
snippet = get_object_or_404(Snippet, secret_id=self.kwargs['snippet_id'])
|
snippet = get_object_or_404(Snippet, secret_id=self.kwargs['snippet_id'])
|
||||||
snippet.delete()
|
snippet.delete()
|
||||||
|
|
||||||
# Append `#` so #delete goes away in Firefox
|
# Append `#` so #delete goes away in Firefox
|
||||||
url = '{0}#'.format(reverse('snippet_new'))
|
url = '{0}#'.format(reverse('snippet_new'))
|
||||||
return HttpResponseRedirect(url)
|
return HttpResponseRedirect(url)
|
||||||
|
|
||||||
return super(SnippetDetailView, self).post(*args, **kwargs)
|
return super(SnippetDetailView, self).post(*args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
def get(self, *args, **kwargs):
|
def get(self, *args, **kwargs):
|
||||||
snippet = self.get_object()
|
snippet = self.get_object()
|
||||||
|
@ -110,12 +107,36 @@ class SnippetDetailView(SnippetView, DetailView):
|
||||||
snippet = form.save(parent=self.get_object())
|
snippet = form.save(parent=self.get_object())
|
||||||
return HttpResponseRedirect(snippet.get_absolute_url())
|
return HttpResponseRedirect(snippet.get_absolute_url())
|
||||||
|
|
||||||
|
def get_snippet_diff(self):
|
||||||
|
snippet = self.get_object()
|
||||||
|
|
||||||
|
if not snippet.parent_id:
|
||||||
|
return None
|
||||||
|
|
||||||
|
if snippet.content == snippet.parent.content:
|
||||||
|
return None
|
||||||
|
|
||||||
|
d = difflib.unified_diff(
|
||||||
|
snippet.parent.content.splitlines(),
|
||||||
|
snippet.content.splitlines(),
|
||||||
|
ugettext('Previous Snippet'),
|
||||||
|
ugettext('Current Snippet'),
|
||||||
|
n=1
|
||||||
|
)
|
||||||
|
diff_code = '\n'.join(d).strip()
|
||||||
|
highlighted = highlight.pygmentize(diff_code, lexer_name='diff')
|
||||||
|
|
||||||
|
# Remove blank lines
|
||||||
|
return highlighted.replace('\n\n', '\n')
|
||||||
|
|
||||||
|
|
||||||
def get_context_data(self, **kwargs):
|
def get_context_data(self, **kwargs):
|
||||||
self.object = snippet = self.get_object()
|
snippet = self.get_object()
|
||||||
|
|
||||||
ctx = super(SnippetDetailView, self).get_context_data(**kwargs)
|
ctx = super(SnippetDetailView, self).get_context_data(**kwargs)
|
||||||
ctx.update({
|
ctx.update({
|
||||||
'wordwrap': snippet.lexer in highlight.LEXER_WORDWRAP,
|
'wordwrap': snippet.lexer in highlight.LEXER_WORDWRAP,
|
||||||
|
'diff': self.get_snippet_diff(),
|
||||||
})
|
})
|
||||||
return ctx
|
return ctx
|
||||||
|
|
||||||
|
@ -164,69 +185,6 @@ class SnippetHistory(TemplateView):
|
||||||
return ctx
|
return ctx
|
||||||
|
|
||||||
|
|
||||||
# class SnippetDiffView(TemplateView):
|
|
||||||
# """
|
|
||||||
# Display a diff between two given snippet secret ids.
|
|
||||||
# """
|
|
||||||
# template_name = 'dpaste/includes/diff.html'
|
|
||||||
#
|
|
||||||
# def get(self, request, *args, **kwargs):
|
|
||||||
# """
|
|
||||||
# Some validation around input files we will compare later.
|
|
||||||
# """
|
|
||||||
# if request.GET.get('a') and request.GET.get('a').isdigit() \
|
|
||||||
# and request.GET.get('b') and request.GET.get('b').isdigit():
|
|
||||||
# try:
|
|
||||||
# self.fileA = Snippet.objects.get(pk=int(request.GET.get('a')))
|
|
||||||
# self.fileB = Snippet.objects.get(pk=int(request.GET.get('b')))
|
|
||||||
# except ObjectDoesNotExist:
|
|
||||||
# return HttpResponseBadRequest(u'Selected file(s) does not exist.')
|
|
||||||
# else:
|
|
||||||
# return HttpResponseBadRequest(u'You must select two snippets.')
|
|
||||||
#
|
|
||||||
# return super(SnippetDiffView, self).get(request, *args, **kwargs)
|
|
||||||
#
|
|
||||||
# def get_diff(self):
|
|
||||||
# class DiffText(object):
|
|
||||||
# pass
|
|
||||||
#
|
|
||||||
# diff = DiffText()
|
|
||||||
#
|
|
||||||
# if self.fileA.content != self.fileB.content:
|
|
||||||
# d = difflib.unified_diff(
|
|
||||||
# self.fileA.content.splitlines(),
|
|
||||||
# self.fileB.content.splitlines(),
|
|
||||||
# 'Original',
|
|
||||||
# 'Current',
|
|
||||||
# lineterm=''
|
|
||||||
# )
|
|
||||||
#
|
|
||||||
# diff.content = '\n'.join(d).strip()
|
|
||||||
# diff.lexer = 'diff'
|
|
||||||
# else:
|
|
||||||
# diff.content = force_text(_(u'No changes were made between this two files.'))
|
|
||||||
# diff.lexer = 'text'
|
|
||||||
#
|
|
||||||
# return diff
|
|
||||||
#
|
|
||||||
# def highlight_snippet(self, content):
|
|
||||||
# h = highlight.pygmentize(content, 'diff')
|
|
||||||
# h = h.replace(u'\t', ' ')
|
|
||||||
# return h
|
|
||||||
#
|
|
||||||
# def get_context_data(self, **kwargs):
|
|
||||||
# diff = self.get_diff()
|
|
||||||
# highlighted = self.highlight_snippet(diff.content)
|
|
||||||
# ctx = super(SnippetDiffView, self).get_context_data(**kwargs)
|
|
||||||
# ctx.update({
|
|
||||||
# 'snippet': diff,
|
|
||||||
# 'highlighted': highlighted.splitlines(),
|
|
||||||
# 'fileA': self.fileA,
|
|
||||||
# 'fileB': self.fileB,
|
|
||||||
# })
|
|
||||||
# return ctx
|
|
||||||
|
|
||||||
|
|
||||||
# -----------------------------------------------------------------------------
|
# -----------------------------------------------------------------------------
|
||||||
# Static pages
|
# Static pages
|
||||||
# -----------------------------------------------------------------------------
|
# -----------------------------------------------------------------------------
|
||||||
|
|
Loading…
Reference in a new issue