diff --git a/setup.py b/setup.py index 5a20c71..8adbaf3 100644 --- a/setup.py +++ b/setup.py @@ -7,8 +7,11 @@ setup( version='1.0.0', # packages=['ktools'], install_requires=[ + 'Django~=4.2', 'typing_extensions~=4.4', - 'Unidecode~=1.3.6' + 'Unidecode~=1.3.6', + 'rjsmin~=1.2.1', + 'Jinja2==3.1.2', ], author='László Károlyi', author_email='laszlo@karolyi.hu', diff --git a/src/ktools/django/jinja/extensions.py b/src/ktools/django/jinja/extensions.py new file mode 100644 index 0000000..0e6dea0 --- /dev/null +++ b/src/ktools/django/jinja/extensions.py @@ -0,0 +1,88 @@ +from django.conf import settings +from django.utils.html import strip_spaces_between_tags +from django.utils.translation import ( + get_language_from_request, get_language_info) +from jinja2.ext import Extension +from jinja2.nodes import Assign, CallBlock, ContextReference, Name, Output +from rjsmin import jsmin + + +class LanguageInfoExtension(Extension): + """ + An assigment tag for Jinja, setting a language info dictionary. + + Samples hacked together from: + http://stackoverflow.com/a/23170408/1067833 + https://github.com/coffin/coffin/blob/master/coffin/static.py + """ + + tags = set(['get_my_language_info']) + + def parse(self, parser): + stream = parser.stream + lineno = next(stream).lineno + + ctx_ref = ContextReference() + call_node = self.call_method( + '_get_current_language_info', [ctx_ref], lineno=lineno) + + if stream.next_if('name:as'): + var = Name(stream.expect('name').value, 'store') + return Assign(var, call_node).set_lineno(lineno) + else: + return Output([call_node]).set_lineno(lineno) + + def _get_current_language_info(self, context): + lang_code = \ + get_language_from_request(request=context['request']) \ + or settings.LANGUAGE_CODE + lang_info = get_language_info(lang_code=lang_code) + lang_info['locale_code'] = lang_code + return lang_info + + +class SpacelessExtension(Extension): + """ + Removes whitespace between HTML tags, including tab and + newline characters. + + Works exactly like Django's own tag. + """ + + tags = set(['spaceless']) + + def parse(self, parser): + lineno = next(parser.stream).lineno + body = parser.parse_statements(['name:endspaceless'], drop_needle=True) + return CallBlock( + self.call_method('_strip_spaces', [], [], None, None), + [], [], body, + ).set_lineno(lineno) + + def _strip_spaces(self, caller=None): + return strip_spaces_between_tags(caller().strip()) + + +class JsMinExtension(Extension): + """ + Removes whitespace between JavaScript tags, including tab and + newline characters. + """ + + tags = {'jsmin'} + + def parse(self, parser): + lineno = parser.stream.__next__().lineno + body = parser.parse_statements(['name:endjsmin'], drop_needle=True) + return CallBlock( + self.call_method('_strip_whitespace_js', [], [], None, None), + [], [], body, + ).set_lineno(lineno) + + def _strip_whitespace_js(self, caller=None): + if settings.DEBUG: + # Debug mode, no minification + return caller().strip() + return jsmin(caller().strip()) + +# https://github.com/coffin/coffin/blob/master/coffin/common.py diff --git a/src/ktools/jinja/extensions.py b/src/ktools/jinja/extensions.py new file mode 100644 index 0000000..34ee6d3 --- /dev/null +++ b/src/ktools/jinja/extensions.py @@ -0,0 +1,12 @@ +from jinja2.ext import Extension + + +class CommentExtension(Extension): + 'Skips the content within the comment/endcomment tag.' + + tags = set(['comment']) + + def parse(self, parser): + next(parser.stream) + parser.parse_statements(['name:endcomment'], drop_needle=True) + return []