Skip to content

Commit b0571a3

Browse files
authored
feat: Add customer code block (#131)
1 parent ae1a4d3 commit b0571a3

File tree

5 files changed

+104
-1
lines changed

5 files changed

+104
-1
lines changed

cms_theme/apps.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,11 @@
44
class CmsThemeConfig(AppConfig):
55
default_auto_field = "django.db.models.BigAutoField"
66
name = "cms_theme"
7+
8+
def ready(self) -> None:
9+
from cms.plugin_pool import plugin_pool
10+
11+
code_plugin = plugin_pool.get_plugin("CodeBlockPlugin")
12+
if code_plugin:
13+
code_plugin.change_form_template = "code_block/admin/code_block.html"
14+

cms_theme/cms_components.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -948,3 +948,41 @@ def clean(self):
948948
),
949949
}
950950
)
951+
952+
953+
@components.register
954+
class CodeBlock(CMSFrontendComponent):
955+
"""Code card component to render code snippets with syntax highlighting"""
956+
class Media:
957+
js = (
958+
"admin/vendor/ace/ace.js"
959+
if "djangocms_static_ace" in settings.INSTALLED_APPS
960+
else "https://cdnjs.cloudflare.com/ajax/libs/ace/1.43.3/ace.js",
961+
)
962+
963+
class Meta:
964+
name = _("Code Block")
965+
render_template = "code_block/code_block.html"
966+
change_form_template = "code_block/admin/code_block.html"
967+
allow_children = True
968+
child_classes = []
969+
mixins = ["Background", "Spacing", "Attributes"]
970+
frontend_editable_fields = ("heading",)
971+
972+
heading = forms.CharField(
973+
label=_("Heading"),
974+
required=False,
975+
help_text=_("Heading for the code block."),
976+
)
977+
dark_mode = forms.BooleanField(
978+
label=_("Dark mode"),
979+
required=False,
980+
initial=False,
981+
help_text=_("Enable dark mode for code block."),
982+
)
983+
code_content = forms.CharField(
984+
label=_("Code"),
985+
initial="",
986+
required=True,
987+
widget=forms.widgets.Textarea(attrs={"class": "js-ckeditor-use-selected-text"}),
988+
)

cms_theme/templates/cms_theme/base.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@
5858
<script src="{% static 'js/logo_carousel.js' %}"></script>
5959
<script src="{% static 'js/mobile_slider.js' %}"></script>
6060
<script src="{% static 'js/quote_slider.js' %}"></script>
61-
<script>hljs.highlightAll();</script>
61+
<script>document.addEventListener('DOMContentLoaded', function() { hljs.highlightAll(); });</script>
6262
{% endblock end_js %}
6363
</body>
6464
</html>
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
{% extends "djangocms_frontend/admin/base.html" %}
2+
3+
{% block object-tools %}
4+
{{ block.super }}{% spaceless %}
5+
<script>
6+
django.jQuery(function () {
7+
// ace editor cannot be attached directly to a textarea
8+
var textarea = django.jQuery('textarea').css('display', 'none');
9+
var settings = textarea.data();
10+
var div = django.jQuery('<div>', {
11+
position: 'absolute',
12+
width: '100%',
13+
style: 'font-size: 14px',
14+
height: textarea.height() * 4,
15+
'class': textarea.attr('class'),
16+
}).insertBefore(textarea);
17+
18+
// init editor with settings
19+
var editor = ace.edit(div[0]);
20+
var darkMode;
21+
darkMode = window.parent.CMS.API.Helpers.getColorScheme() === 'dark';
22+
if (darkMode) {
23+
editor.setTheme('ace/theme/tomorrow_night');
24+
} else {
25+
editor.setTheme('ace/theme/xcode');
26+
}
27+
editor.getSession().setValue(textarea.val());
28+
editor.getSession().setMode('ace/mode/python');
29+
editor.setOptions({
30+
fontSize: '14px',
31+
cursorStyle: 'smooth'
32+
});
33+
editor.renderer.setScrollMargin(5, 5);
34+
35+
// send data back to textarea when submitting
36+
textarea.closest('form').submit(function () {
37+
textarea.val(editor.getSession().getValue());
38+
});
39+
40+
// immediate update while typing inside CKEditor
41+
editor.getSession().on('change', function () {
42+
textarea.val(editor.getSession().getValue());
43+
});
44+
});
45+
</script>{% endspaceless %}
46+
{% endblock %}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
{% load i18n cms_tags frontend %}
2+
<div class="mb-5 card {% if instance.dark_mode %}bg-dark{% else %}bg-light{% endif %}">
3+
{% if instance.heading %}
4+
<div class="card-header bg-primary">
5+
<p><span class="overline">{% inline_field instance "heading" %}</span></p>
6+
</div>
7+
{% endif %}
8+
<div class="card-body{% if instance.dark_mode %} text-light{% endif %}">
9+
<pre{{ instance.get_attributes }}><code>{{ instance.code_content }}</code></pre>
10+
</div>
11+
</div>

0 commit comments

Comments
 (0)