From: Michael Birtwell Date: Thu, 1 Oct 2015 13:38:58 +0000 (+0100) Subject: Add format_list function X-Git-Tag: dev-2a51c9b95d06~5^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=be6e23d1bd14d74ded228fab6f640fab51970fce;p=thirdparty%2Fbabel.git Add format_list function --- diff --git a/babel/lists.py b/babel/lists.py new file mode 100644 index 00000000..6e6fbd19 --- /dev/null +++ b/babel/lists.py @@ -0,0 +1,48 @@ +# -*- coding: utf-8 -*- +""" + babel.lists + ~~~~~~~~~~~ + + Locale dependent formatting of lists. + + The default locale for the functions in this module is determined by the + following environment variables, in that order: + + * ``LC_ALL``, and + * ``LANG`` + + :copyright: (c) 2015 by the Babel Team. + :license: BSD, see LICENSE for more details. +""" + +from babel.core import Locale, default_locale + +DEFAULT_LOCALE = default_locale() + + +def format_list(lst, locale=DEFAULT_LOCALE): + """ Formats `lst` as a list + + e.g. + >>> format_list(['apples', 'oranges', 'pears'], 'en') + u'apples, oranges, and pears' + >>> format_list(['apples', 'oranges', 'pears'], 'zh') + u'apples\u3001oranges\u548cpears' + + :param lst: a sequence of items to format in to a list + :param locale: the locale + """ + locale = Locale.parse(locale) + if not lst: + return '' + if len(lst) == 1: + return lst[0] + if len(lst) == 2: + return locale.list_patterns['2'].format(*lst) + + result = locale.list_patterns['start'].format(lst[0], lst[1]) + for elem in lst[2:-1]: + result = locale.list_patterns['middle'].format(result, elem) + result = locale.list_patterns['end'].format(result, lst[-1]) + + return result diff --git a/tests/test_lists.py b/tests/test_lists.py new file mode 100644 index 00000000..f5021ea5 --- /dev/null +++ b/tests/test_lists.py @@ -0,0 +1,14 @@ +# coding=utf-8 +from babel import lists + + +def test_format_list(): + for list, locale, expected in [ + ([], 'en', ''), + ([u'string'], 'en', u'string'), + (['string1', 'string2'], 'en', u'string1 and string2'), + (['string1', 'string2', 'string3'], 'en', u'string1, string2, and string3'), + (['string1', 'string2', 'string3'], 'zh', u'string1、string2和string3'), + (['string1', 'string2', 'string3', 'string4'], 'ne', u'string1 र string2, string3 र string4'), + ]: + assert lists.format_list(list, locale=locale) == expected