__copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)"
__license__ = "AGPL v3"
import json
from django.urls import reverse, NoReverseMatch
from django.forms import widgets, Media
from django.utils.safestring import mark_safe
[docs]class SummernoteEditor(widgets.Textarea):
def __init__(self, *args, **kwargs):
self.options = kwargs.pop('options', {})
self.include_jquery = False
self.csp_nonce = kwargs.pop('csp_nonce', {})
super().__init__(*args, **kwargs)
[docs] def get_options(self):
default_options = {
'inlineMode': False,
'toolbar': [
['style', ['bold', 'italic', 'underline', 'clear']],
['font', ['strikethrough', 'superscript', 'subscript']],
['fontsize', ['fontsize']],
['para', ['ul', 'ol', 'paragraph']],
['insert', ['link', 'hr']]
],
}
try:
file_upload_url = reverse('froala_editor_file_upload')
default_options['fileUploadURL'] = file_upload_url
default_options.update([
('fileUploadParams', {'csrfmiddlewaretoken': 'csrftokenplaceholder'})])
except NoReverseMatch:
default_options['fileUpload'] = False
options = dict(default_options.items()).copy()
options.update(self.options.items())
json_options = json.dumps(options)
json_options = json_options.replace('"csrftokenplaceholder"', 'getCookie("csrftoken")')
return json_options
[docs] def render(self, name, value, attrs=None, renderer=None):
html = super().render(name, value, attrs)
el_id = self.build_attrs(attrs).get('id')
html += self.trigger_summernote(el_id, self.get_options())
return mark_safe(html)
[docs] def trigger_summernote(self, el_id, options):
str = """
<script type='text/javascript' nonce="%s">
$(function() {
$('#%s').summernote(%s);
});
</script>""" % (self.csp_nonce, el_id, options)
return str
@property
def media(self):
css = {
'all': ('//cdnjs.cloudflare.com/ajax/libs/summernote/0.8.8/summernote-bs4.css',)
}
js = ('//cdnjs.cloudflare.com/ajax/libs/summernote/0.8.8/summernote-bs4.js',)
return Media(css=css, js=js)