Skip to content

Commit 492ab5e

Browse files
author
Neil Muller
committed
Merge branch 'master' into feature/support_django_3.0
2 parents 5ada7c5 + ad9b98e commit 492ab5e

File tree

9 files changed

+122
-98
lines changed

9 files changed

+122
-98
lines changed

README.rst

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,8 +144,7 @@ If you prefer to link CSS and Javascript from different locations, the
144144
``markitup_media`` tag can be replaced with two separate tags,
145145
``markitup_css`` and ``markitup_js``. ``markitup_js`` accepts a
146146
parameter to suppress jQuery inclusion, just like
147-
``markitup_media``. (Note that jQuery must be included in your
148-
template before the ``markitup_editor`` tag is used).
147+
``markitup_media``.
149148

150149
Last, use the ``markitup_editor`` template tag to apply the MarkItUp!
151150
editor to a textarea in your page. It accepts one argument, the HTML

markitup/static/markitup/ajax_csrf.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,4 @@
2929
}
3030
}
3131
});
32-
})(jQuery);
32+
})(jQuery || django.jQuery);
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
'use strict';
2+
(function($) {
3+
// Configure a MarkItUp editor on element
4+
// Config comes from data attributes on config
5+
function configure_markitup_editor(element, config) {
6+
var preview_url = config.attr('data-preview-url');
7+
var auto_preview = config.attr('data-auto-preview') == '1';
8+
if (!element.hasClass("markItUpEditor")) {
9+
if (preview_url) {
10+
mySettings["previewParserPath"] = preview_url;
11+
}
12+
element.markItUp(mySettings);
13+
}
14+
if (auto_preview) {
15+
$('a[title="Preview"]').trigger('mouseup');
16+
}
17+
};
18+
19+
$(function() {
20+
$('.django-markitup-widget').each(function(index) {
21+
var element = $(this);
22+
configure_markitup_editor(element, element);
23+
});
24+
25+
$('.django-markitup-editor-config').each(function(index) {
26+
var config = $(this);
27+
var element = $(config.attr('data-element'));
28+
configure_markitup_editor(element, config);
29+
});
30+
});
31+
})(jQuery || django.jQuery);

markitup/static/markitup/jquery.markitup.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -662,4 +662,4 @@
662662
$('textarea').trigger('insertion', [options]);
663663
}
664664
};
665-
})(jQuery);
665+
})(jQuery || django.jQuery);
Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,4 @@
1-
<script type="text/javascript">
2-
(function($) {
3-
$(document).ready(function() {
4-
var element = $("#{{ textarea_id }}");
5-
if(!element.hasClass("markItUpEditor")) {
6-
{% if preview_url %}mySettings["previewParserPath"] = "{{ preview_url }}";{% endif %}
7-
element.markItUp(mySettings);
8-
}
9-
{% if AUTO_PREVIEW %}$('a[title="Preview"]').trigger('mouseup');{% endif %}
10-
});
11-
})(jQuery);
12-
</script>
1+
<div class="django-markitup-editor-config" style="display: none"
2+
data-element="#{{ textarea_id }}"
3+
data-preview-url="{{ preview_url }}"
4+
data-auto-preview="{{ AUTO_PREVIEW|yesno:"1,0" }}"></div>

markitup/templates/markitup/include_js.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,4 @@
44
<script type="text/javascript" src="{{ AJAXCSRF_JS }}"></script>
55
<script type="text/javascript" src="{{ MARKITUP_JS }}"></script>
66
<script type="text/javascript" src="{{ MARKITUP_SET }}/set.js"></script>
7+
<script type="text/javascript" src="{{ DJANGO_MARKITUP_JS }}"></script>

markitup/templatetags/markitup_tags.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ def _get_markitup_context():
2727
'MARKITUP_SKIN': absolute_url(settings.MARKITUP_SKIN).rstrip('/'),
2828
'MARKITUP_JS': absolute_url('markitup/jquery.markitup.js'),
2929
'AJAXCSRF_JS': absolute_url('markitup/ajax_csrf.js'),
30+
'DJANGO_MARKITUP_JS': absolute_url('markitup/django-markitup.js'),
3031
}
3132
if settings.JQUERY_URL is not None:
3233
context['JQUERY_URL'] = absolute_url(settings.JQUERY_URL)

markitup/widgets.py

Lines changed: 17 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55
from django.contrib.admin.widgets import AdminTextareaWidget
66
from django.template.loader import render_to_string
77
try:
8-
from django.urls import NoReverseMatch, reverse
8+
from django.urls import NoReverseMatch, reverse_lazy
99
except ImportError:
10-
from django.core.urlresolvers import reverse, NoReverseMatch
10+
from django.core.urlresolvers import NoReverseMatch, reverse_lazy
1111
from django.utils.safestring import mark_safe
1212
from markitup import settings
1313
from markitup.util import absolute_url
@@ -59,39 +59,33 @@ def __init__(self, attrs=None,
5959
if auto_preview is None:
6060
auto_preview = settings.MARKITUP_AUTO_PREVIEW
6161
self.auto_preview = auto_preview
62+
63+
try:
64+
preview_url = reverse_lazy('markitup_preview')
65+
except NoReverseMatch:
66+
preview_url = ""
67+
68+
attrs = attrs or {}
69+
classes = attrs.get('class', '').split()
70+
attrs['class'] = ' '.join(classes + ['django-markitup-widget'])
71+
attrs['data-preview-url'] = preview_url
72+
if auto_preview:
73+
attrs['data-auto-preview'] = '1'
74+
6275
super(MarkItUpWidget, self).__init__(attrs)
6376

6477
def _media(self):
6578
js_media = [absolute_url(settings.JQUERY_URL)] if settings.JQUERY_URL is not None else []
6679
js_media = js_media + [absolute_url('markitup/ajax_csrf.js'),
6780
absolute_url('markitup/jquery.markitup.js'),
68-
posixpath.join(self.miu_set, 'set.js')]
81+
posixpath.join(self.miu_set, 'set.js'),
82+
absolute_url('markitup/django-markitup.js')]
6983
return forms.Media(
7084
css={'screen': (posixpath.join(self.miu_skin, 'style.css'),
7185
posixpath.join(self.miu_set, 'style.css'))},
7286
js=js_media)
7387
media = property(_media)
7488

75-
def render(self, name, value, attrs=None, renderer=None):
76-
html = super(MarkItUpWidget, self).render(name, value, attrs)
77-
78-
# Passing base_attrs as a kwarg for compatibility with Django < 1.11
79-
# (where it will be treated as an innocuous attr named base_attrs)
80-
final_attrs = self.build_attrs(
81-
base_attrs=self.attrs, extra_attrs=attrs)
82-
83-
try:
84-
preview_url = reverse('markitup_preview')
85-
except NoReverseMatch:
86-
preview_url = ""
87-
88-
html += render_to_string('markitup/editor.html',
89-
{'textarea_id': final_attrs['id'],
90-
'AUTO_PREVIEW': self.auto_preview,
91-
'preview_url': preview_url})
92-
93-
return mark_safe(html)
94-
9589

9690
class AdminMarkItUpWidget(MarkItUpWidget, AdminTextareaWidget):
9791
"""

tests/tests.py

Lines changed: 65 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -239,68 +239,81 @@ def test_render_markup(self):
239239
'replace this text'}))
240240

241241

242-
class RenderTests(MIUTestCase):
243-
look_for = 'var element = $("#my_id");'
244-
auto_preview_override = True
245-
246-
def test_widget_render(self):
247-
widget = MarkItUpWidget()
248-
self.assertIn(self.look_for,
249-
widget.render('name', 'value', {'id': 'my_id'}))
250-
251-
def test_widget_render_with_custom_id(self):
252-
widget = MarkItUpWidget(attrs={'id': 'my_id'})
253-
self.assertIn(self.look_for,
254-
widget.render('name', 'value'))
255-
256-
def test_widget_render_preview_parser_path(self):
257-
widget = MarkItUpWidget()
258-
self.assertIn('mySettings["previewParserPath"] = "/markitup/preview/";',
259-
widget.render('name', 'value', {'id': 'my_id'}))
260-
261-
def test_templatetag_render(self):
262-
template = """{% load markitup_tags %}{% markitup_editor "my_id" %}"""
263-
self.assertIn(self.look_for,
264-
self.render(template))
265-
266-
def test_templatetag_render_preview_parser_path(self):
267-
template = """{% load markitup_tags %}{% markitup_editor "my_id" %}"""
268-
self.assertIn('mySettings["previewParserPath"] = "/markitup/preview/";',
269-
self.render(template))
270-
271-
def test_per_widget_auto_preview_override(self):
272-
widget = MarkItUpWidget(auto_preview=self.auto_preview_override)
273-
self.assertIn(AutoPreviewSettingTests.look_for,
274-
widget.render('name', 'value', {'id': 'my_id'}),
275-
reverse=not self.auto_preview_override)
276-
277-
def test_per_ttag_auto_preview_override(self):
278-
if self.auto_preview_override:
279-
arg = "auto_preview"
280-
else:
281-
arg = "no_auto_preview"
282-
template = """{%% load markitup_tags %%}{%% markitup_editor "my_id" "%s" %%}""" % (arg,)
283-
self.assertIn(AutoPreviewSettingTests.look_for,
284-
self.render(template),
285-
reverse=not self.auto_preview_override)
286-
287-
288-
class AutoPreviewSettingTests(RenderTests):
289-
look_for = "$('a[title=\"Preview\"]').trigger('mouseup');"
290-
auto_preview_override = False
242+
class RenderTestMixin(object):
243+
look_for = 'OVERRIDE ME'
244+
look_for_auto_preview = 'data-auto-preview="1"'
291245

292246
def setUp(self):
293247
self._old_auto = settings.MARKITUP_AUTO_PREVIEW
294-
settings.MARKITUP_AUTO_PREVIEW = True
295248

296249
def tearDown(self):
297250
settings.MARKITUP_AUTO_PREVIEW = self._old_auto
298251

252+
def render_subject(self, auto_preview=None):
253+
raise NotImplemented('OVERRIDE ME')
254+
255+
def test_render(self):
256+
self.assertIn(self.look_for, self.render_subject())
257+
258+
def test_render_preview_parser_path(self):
259+
self.assertIn('data-preview-url="/markitup/preview/"',
260+
self.render_subject())
261+
262+
def test_auto_preview_setting(self):
263+
settings.MARKITUP_AUTO_PREVIEW = True
264+
self.assertIn(self.look_for_auto_preview, self.render_subject())
265+
266+
def test_auto_preview_override(self):
267+
self.assertIn(self.look_for_auto_preview,
268+
self.render_subject(True))
269+
270+
def test_auto_preview_override_setting(self):
271+
settings.MARKITUP_AUTO_PREVIEW = True
272+
self.assertIn(self.look_for_auto_preview,
273+
self.render_subject(False),
274+
reverse=True)
275+
276+
277+
class RenderTemplateTagTests(RenderTestMixin, MIUTestCase):
278+
look_for = 'data-element="#my_id"'
279+
280+
def render_subject(self, auto_preview=None):
281+
if auto_preview is True:
282+
params = '"auto_preview"'
283+
elif auto_preview is False:
284+
params = '"no_auto_preview"'
285+
else:
286+
params = ''
287+
template = ('{% load markitup_tags %}{% markitup_editor "my_id" '
288+
+ params + ' %}')
289+
return self.render(template)
290+
291+
292+
class RenderWidgetTests(RenderTestMixin, MIUTestCase):
293+
look_for = 'class="django-markitup-widget"'
294+
295+
def render_subject(self, auto_preview=None):
296+
widget = MarkItUpWidget(auto_preview=auto_preview)
297+
return widget.render('name', 'value')
298+
299299

300300
class TemplatetagMediaUrlTests(MIUTestCase):
301301
maxDiff = None
302302
prefix = '/static'
303303

304+
@property
305+
def script_tags(self):
306+
return (
307+
'<script type="text/javascript" '
308+
'src="%(prefix)s/markitup/ajax_csrf.js"></script>\n'
309+
'<script type="text/javascript" '
310+
'src="%(prefix)s/markitup/jquery.markitup.js"></script>\n'
311+
'<script type="text/javascript" '
312+
'src="%(prefix)s/markitup/sets/default/set.js"></script>\n'
313+
'<script type="text/javascript" '
314+
'src="%(prefix)s/markitup/django-markitup.js"></script>'
315+
) % {'prefix': self.prefix}
316+
304317
def setUp(self):
305318
self._reset_storage()
306319

@@ -339,9 +352,7 @@ def _get_expected_media(self):
339352
out = """<link href="%(prefix)s/markitup/skins/simple/style.css" type="text/css" media="screen" rel="stylesheet" />
340353
<link href="%(prefix)s/markitup/sets/default/style.css" type="text/css" media="screen" rel="stylesheet" />
341354
<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script>
342-
<script type="text/javascript" src="%(prefix)s/markitup/ajax_csrf.js"></script>
343-
<script type="text/javascript" src="%(prefix)s/markitup/jquery.markitup.js"></script>
344-
<script type="text/javascript" src="%(prefix)s/markitup/sets/default/set.js"></script>""" % {'prefix': self.prefix}
355+
""" % {'prefix': self.prefix} + self.script_tags
345356
return out
346357

347358
# JQUERY_URL settings and resulting link
@@ -382,12 +393,7 @@ def test_jquery_url(self):
382393
else:
383394
self.assertHTMLEqual(
384395
self._get_js(),
385-
(
386-
'<script type="text/javascript" src="%(prefix)s/markitup/ajax_csrf.js"></script>\n'
387-
'<script type="text/javascript" src="%(prefix)s/markitup/jquery.markitup.js"></script>\n'
388-
'<script type="text/javascript" src="%(prefix)s/markitup/sets/default/set.js"></script>'
389-
% {'prefix': self.prefix}
390-
))
396+
self.script_tags)
391397
finally:
392398
settings.JQUERY_URL = _old_jquery_url
393399

0 commit comments

Comments
 (0)