NDOJ/django_ace/widgets.py
2023-05-20 08:53:43 +09:00

76 lines
2.1 KiB
Python

"""
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 = "<div%s><div></div></div>%s" % (flatatt(ace_attrs), textarea)
if self.toolbar:
toolbar = (
'<div style="width: {}" class="django-ace-toolbar">'
'<a href="./" class="django-ace-max_min"></a>'
"</div>"
).format(self.width)
html = toolbar + html
html = '<div class="django-ace-editor">{}</div>'.format(html)
return mark_safe(html)