""" Django-ace originally from https://github.com/bradleyayers/django-ace. """ from urllib.parse import urljoin from django import forms from django.conf import settings from django.forms.utils import flatatt from django.utils.safestring import mark_safe class AceWidget(forms.Textarea): def __init__( self, mode=None, theme=None, wordwrap=False, width="100%", height="300px", no_ace_media=False, toolbar=True, *args, **kwargs ): self.mode = mode self.theme = theme self.wordwrap = wordwrap self.width = width self.height = height self.ace_media = not no_ace_media self.toolbar = toolbar super(AceWidget, self).__init__(*args, **kwargs) @property def media(self): js = [urljoin(settings.ACE_URL, "ace.js")] if self.ace_media else [] js.append("django_ace/widget.js") css = { "screen": ["django_ace/widget.css"], } return forms.Media(js=js, css=css) def render(self, name, value, attrs=None, renderer=None): attrs = attrs or {} ace_attrs = { "class": "django-ace-widget loading", "style": "width:%s; height:%s" % (self.width, self.height), "id": "ace_%s" % name, } if self.mode: ace_attrs["data-mode"] = self.mode if self.theme: ace_attrs["data-theme"] = self.theme if self.wordwrap: ace_attrs["data-wordwrap"] = "true" attrs.update( style="width: 100%; min-width: 100%; max-width: 100%; resize: none" ) textarea = super(AceWidget, self).render(name, value, attrs) html = "
%s" % (flatatt(ace_attrs), textarea) if self.toolbar: toolbar = ( '
' '' "
" ).format(self.width) html = toolbar + html html = '
{}
'.format(html) return mark_safe(html)