diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2025-09-12 15:26:02 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2025-09-12 15:26:02 +0200 |
commit | c712dbebefb07f5020dcb9c8e39241a40eb55d52 (patch) | |
tree | c127c56ddebaf599c429cda03e9d833c7d453cc3 /ishtar_common/jinja_filters.py | |
parent | 72b5086225a96207b1590da33cdab35688e834f5 (diff) | |
download | Ishtar-c712dbebefb07f5020dcb9c8e39241a40eb55d52.tar.bz2 Ishtar-c712dbebefb07f5020dcb9c8e39241a40eb55d52.zip |
✨ Formula: add splitpart filter
Diffstat (limited to 'ishtar_common/jinja_filters.py')
-rw-r--r-- | ishtar_common/jinja_filters.py | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/ishtar_common/jinja_filters.py b/ishtar_common/jinja_filters.py index e1e53cd66..cf19ef6c7 100644 --- a/ishtar_common/jinja_filters.py +++ b/ishtar_common/jinja_filters.py @@ -18,6 +18,7 @@ from datetime import datetime +from jinja2.environment import Environment from jinja2.filters import environmentfilter import locale from num2words import num2words @@ -148,3 +149,53 @@ def short_date_filter(*args): return "" set_locale() return value.strftime(settings.SHORT_DATE_FORMAT) + + +@environmentfilter +def splitpart(*args): + """ + Split string. + First arg is index of first item to get + Second arg is last index of items to get not included (not mandatory - default is one item) - 0 to get just one + Third arg is character for split - default is "," + Last arg is character for join - default is "," + + {{"9,2,10"|splitpart(1)}} -> 2 + {{"chaise;bureau;papier;paragraphe"|splitpart(0,0,";")}} -> chaise + {{"182025_C001"|splitpart(1,0,"_")}} -> C001 + {{"chaise;bureau;papier;paragraphe"|splitpart(1,3,";")}} -> bureau;papier + {{"chaise;bureau;papier;paragraphe"|splitpart(1,4,";","|")}} -> bureau|papier|paragraphe + """ + # manage delta for environment filter + delta = 0 + if isinstance(args[0], Environment): + delta = 1 + value = args[0 + delta] + index = args[1 + delta] + index_end = args[2 + delta] if len(args) > (2 + delta) else None + char = args[3 + delta] if len(args) > (3 + delta) else "," + merge_character = args[4 + delta] if len(args) > (4 + delta) else None + if index_end: + try: + index_end = int(index_end) + if not merge_character: # merge is assumed + merge_character = char + except ValueError: + # old filter use - manage compatibility + merge_character = char + char = index_end + index_end = None + if not value or (not index and index != 0): + return "" + if merge_character is True: # old filter use + merge_character = char + splited = value.split(char) + if len(splited) <= index: + return "" + if not merge_character: + return splited[index] + if index_end: + splited = splited[index:index_end] + else: + splited = splited[index:] + return merge_character.join(splited) |