Adding Jinja helpers
This commit is contained in:
parent
4dd581abea
commit
7dd96889af
3 changed files with 104 additions and 1 deletions
5
setup.py
5
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',
|
||||
|
|
88
src/ktools/django/jinja/extensions.py
Normal file
88
src/ktools/django/jinja/extensions.py
Normal 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
|
12
src/ktools/jinja/extensions.py
Normal file
12
src/ktools/jinja/extensions.py
Normal 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 []
|
Loading…
Reference in a new issue