def do_format(value, *args, **kwargs): """ Apply python string formatting on an object: .. sourcecode:: jinja {{ "%s - %s"|format("Hello?", "Foo!") }} -> Hello? - Foo! """ if args and kwargs: raise FilterArgumentError('can\'t handle positional and keyword ' 'arguments at the same time') try: ret = soft_unicode(value) % (kwargs or args) if ret != value: return ret except TypeError: pass try: return soft_unicode(value).format(**kwargs) except Exception: return soft_unicode(value).format(*args) raise FilterArgumentError('Your format filter is badly formed')
def do_replace(eval_ctx, s, old, new, count=None): """Return a copy of the value with all occurrences of a substring replaced with a new one. The first argument is the substring that should be replaced, the second is the replacement string. If the optional third argument ``count`` is given, only the first ``count`` occurrences are replaced: .. sourcecode:: jinja {{ "Hello World"|replace("Hello", "Goodbye") }} -> Goodbye World {{ "aaaaargh"|replace("a", "d'oh, ", 2) }} -> d'oh, d'oh, aaargh """ if count is None: count = -1 if not eval_ctx.autoescape: return text_type(s).replace(text_type(old), text_type(new), count) if hasattr(old, '__html__') or hasattr(new, '__html__') and \ not hasattr(s, '__html__'): s = escape(s) else: s = soft_unicode(s) return s.replace(soft_unicode(old), soft_unicode(new), count)
def do_replace(eval_ctx, s, old, new, count = None): if count is None: count = -1 if not eval_ctx.autoescape: return unicode(s).replace(unicode(old), unicode(new), count) if hasattr(old, '__html__') or hasattr(new, '__html__') and not hasattr(s, '__html__'): s = escape(s) else: s = soft_unicode(s) return s.replace(soft_unicode(old), soft_unicode(new), count)
def figo_format(value, *args, **kwargs): """ Apply python string formatting on an object: .. sourcecode:: jinja {{ "%s - %s"|format("Hello?", "Foo!") }} -> Hello? - Foo! """ if args and kwargs: raise FilterArgumentError('can\'t handle positional and keyword arguments at the same time') if args: return soft_unicode(value.format(*args)) else: return soft_unicode(value.format(**kwargs))
def do_join(eval_ctx, value, d=u""): """Return a string which is the concatenation of the strings in the sequence. The separator between elements is an empty string per default, you can define it with the optional parameter: .. sourcecode:: jinja {{ [1, 2, 3]|join('|') }} -> 1|2|3 {{ [1, 2, 3]|join }} -> 123 """ # no automatic escaping? joining is a lot eaiser then if not eval_ctx.autoescape: return unicode(d).join(imap(unicode, value)) # if the delimiter doesn't have an html representation we check # if any of the items has. If yes we do a coercion to Markup if not hasattr(d, "__html__"): value = list(value) do_escape = False for idx, item in enumerate(value): if hasattr(item, "__html__"): do_escape = True else: value[idx] = unicode(item) if do_escape: d = escape(d) else: d = unicode(d) return d.join(value) # no html involved, to normal joining return soft_unicode(d).join(imap(soft_unicode, value))
def do_title(s): """Return a titlecased version of the value. I.e. words will start with uppercase letters, all remaining characters are lowercase. """ return ''.join( [item[0].upper() + item[1:].lower() for item in _word_beginning_split_re.split(soft_unicode(s)) if item])
def map_format(value, pattern): """ Apply python string formatting on an object: .. sourcecode:: jinja {{ "%s - %s"|format("Hello?", "Foo!") }} -> Hello? - Foo! """ return soft_unicode(pattern) % (value)
def escape(self, value): """Escape given value.""" value = soft_unicode(value) if self._engine._escape is None: # pylint: disable=protected-access return value return self._engine._escape(value) # pylint: disable=protected-access
def paren_title(s): """ Fix jinja2 title filter to capitalize words inside parens see https://github.com/mitsuhiko/jinja2/pull/439 """ return ''.join( [item[0].upper() + item[1:].lower() for item in _word_beginning_split_re.split(soft_unicode(s)) if item])
def do_title(s): """Return a titlecased version of the value. I.e. words will start with uppercase letters, all remaining characters are lowercase. """ rv = [] for item in re.compile(r'([-\s]+)(?u)').split(soft_unicode(s)): if not item: continue rv.append(item[0].upper() + item[1:].lower()) return ''.join(rv)
def do_format(value, *args, **kwargs): """ Apply python string formatting on an object: .. sourcecode:: jinja {{ "%s - %s"|format("Hello?", "Foo!") }} -> Hello? - Foo! """ if args and kwargs: raise FilterArgumentError("can't handle positional and keyword " "arguments at the same time") return soft_unicode(value) % (kwargs or args)
def do_urlize(environment, value, trim_url_limit=None, nofollow=False): """Converts URLs in plain text into clickable links. If you pass the filter an additional integer it will shorten the urls to that number. Also a third argument exists that makes the urls "nofollow": .. sourcecode:: jinja {{ mytext|urlize(40, true) }} links are shortened to 40 chars and defined with rel="nofollow" """ rv = urlize(soft_unicode(value), trim_url_limit, nofollow) if environment.autoescape: rv = Markup(rv) return rv
def do_join(eval_ctx, value, d=u'', attribute=None): """Return a string which is the concatenation of the strings in the sequence. The separator between elements is an empty string per default, you can define it with the optional parameter: .. sourcecode:: jinja {{ [1, 2, 3]|join('|') }} -> 1|2|3 {{ [1, 2, 3]|join }} -> 123 It is also possible to join certain attributes of an object: .. sourcecode:: jinja {{ users|join(', ', attribute='username') }} .. versionadded:: 2.6 The `attribute` parameter was added. """ if attribute is not None: value = imap(make_attrgetter(eval_ctx.environment, attribute), value) # no automatic escaping? joining is a lot eaiser then if not eval_ctx.autoescape: return text_type(d).join(imap(text_type, value)) # if the delimiter doesn't have an html representation we check # if any of the items has. If yes we do a coercion to Markup if not hasattr(d, '__html__'): value = list(value) do_escape = False for idx, item in enumerate(value): if hasattr(item, '__html__'): do_escape = True else: value[idx] = text_type(item) if do_escape: d = escape(d) else: d = text_type(d) return d.join(value) # no html involved, to normal joining return soft_unicode(d).join(imap(soft_unicode, value))
def inc_filter(env, key, value=1, result='value', reset=False): """ Count ocurrences of key. Stores the counter on Jinja's environment. >>> class Env: pass >>> env = Env() >>> inc_filter(env, 'x') 1 >>> inc_filter(env, 'x') 2 >>> inc_filter(env, 'y') 1 >>> inc_filter(env, 'x') 3 >>> inc_filter(env, 'x', reset=True) 1 >>> inc_filter(env, 'x') 2 >>> inc_filter(env, 'x', value=0, reset=True) 0 >>> inc_filter(env, 'x', result=None) >>> inc_filter(env, 'x', result=False) u'' >>> inc_filter(env, 'x', result='key') 'x' >>> inc_filter(env, 'x') 4 """ if not hasattr(env, 'counters'): env.counters = defaultdict(int) if reset: env.counters[key] = 0 env.counters[key] += value if result == 'key': return key elif result == 'value': return env.counters[key] elif result == None: return None else: return soft_unicode('')
def do_join(eval_ctx, value, d = u'', attribute = None): if attribute is not None: value = imap(make_attrgetter(eval_ctx.environment, attribute), value) if not eval_ctx.autoescape: return unicode(d).join(imap(unicode, value)) if not hasattr(d, '__html__'): value = list(value) do_escape = False for idx, item in enumerate(value): if hasattr(item, '__html__'): do_escape = True else: value[idx] = unicode(item) if do_escape: d = escape(d) else: d = unicode(d) return d.join(value) return soft_unicode(d).join(imap(soft_unicode, value))
def do_trim(value): return soft_unicode(value).strip()
def format_string(string, pattern): """ formats the string with the value passed to it basicaly the reverse order of standard "format()" """ return soft_unicode(pattern) % (string)
def do_capitalize(s): """Capitalize a value. The first character will be uppercase, all others lowercase. """ return soft_unicode(s).capitalize()
def do_lower(s): return soft_unicode(s).lower()
def do_format(value, *args, **kwargs): if args and kwargs: raise FilterArgumentError( "can't handle positional and keyword arguments at the same time") return soft_unicode(value) % (kwargs or args)
def do_upper(s): """Convert a value to uppercase.""" return soft_unicode(s).upper()
def do_upper(s): return soft_unicode(s).upper()
def do_title(s): return soft_unicode(s).title()
def do_capitalize(s): return soft_unicode(s).capitalize()
def do_format(value, *args, **kwargs): if args and kwargs: raise FilterArgumentError("can't handle positional and keyword arguments at the same time") return soft_unicode(value) % (kwargs or args)
def do_trim(value, chars=None): """Strip leading and trailing characters, by default whitespace.""" return soft_unicode(value).strip(chars)
def do_title(s): """Return a titlecased version of the value. I.e. words will start with uppercase letters, all remaining characters are lowercase. """ return soft_unicode(s).title()
def do_lower(s): """Convert a value to lowercase.""" return soft_unicode(s).lower()
def trim_filter(value, what=None): """Strip leading and trailing whitespace or other specified character. Adapted from Jinja2's builtin ``trim`` filter. """ return soft_unicode(value).strip(what)
def map_format(value, pattern): """ e.g. "{{ groups['metad']|map('map_format', '%s:9559')|join(',') }}" """ return soft_unicode(pattern) % (value)
def do_trim(value): """Strip leading and trailing whitespace.""" return soft_unicode(value).strip()