From: Josh Mize Date: Tue, 7 Apr 2015 20:09:21 +0000 (-0500) Subject: Make title filter capitalize words in (),{},[],<> X-Git-Tag: 2.9~27^2~12^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=62e7e7083423dee258257a3a2b59a88e177e2db0;p=thirdparty%2Fjinja.git Make title filter capitalize words in (),{},[],<> --- diff --git a/jinja2/filters.py b/jinja2/filters.py index 0fb5a5aa..ba21a06d 100644 --- a/jinja2/filters.py +++ b/jinja2/filters.py @@ -22,6 +22,7 @@ from jinja2._compat import imap, string_types, text_type, iteritems _word_re = re.compile(r'\w+(?u)') +_word_beginning_split_re = re.compile(r'([-\s\(\{\[\<]+)(?u)') def contextfilter(f): @@ -182,12 +183,10 @@ 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) + return ''.join( + [item[0].upper() + item[1:].lower() + for item in _word_beginning_split_re.split(soft_unicode(s)) + if item]) def do_dictsort(value, case_sensitive=False, by='key'): diff --git a/tests/test_filters.py b/tests/test_filters.py index 42c55583..00ff2b5d 100644 --- a/tests/test_filters.py +++ b/tests/test_filters.py @@ -207,6 +207,14 @@ class TestFilter(): assert tmpl.render() == "Foo\tBar" tmpl = env.from_string('''{{ "FOO\tBAR"|title }}''') assert tmpl.render() == "Foo\tBar" + tmpl = env.from_string('''{{ "foo (bar)"|title }}''') + assert tmpl.render() == "Foo (Bar)" + tmpl = env.from_string('''{{ "foo {bar}"|title }}''') + assert tmpl.render() == "Foo {Bar}" + tmpl = env.from_string('''{{ "foo [bar]"|title }}''') + assert tmpl.render() == "Foo [Bar]" + tmpl = env.from_string('''{{ "foo "|title }}''') + assert tmpl.render() == "Foo " class Foo: def __str__(self):