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',
|
version='1.0.0',
|
||||||
# packages=['ktools'],
|
# packages=['ktools'],
|
||||||
install_requires=[
|
install_requires=[
|
||||||
|
'Django~=4.2',
|
||||||
'typing_extensions~=4.4',
|
'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='László Károlyi',
|
||||||
author_email='laszlo@karolyi.hu',
|
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