Adding Jinja helpers

This commit is contained in:
László Károlyi 2023-06-27 20:49:11 +02:00
parent 4dd581abea
commit 7dd96889af
Signed by: karolyi
GPG Key ID: 2DCAF25E55735BFE
3 changed files with 104 additions and 1 deletions

View File

@ -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',

View File

@ -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

View File

@ -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 []