diff options
author | Deniz Turgut <dturgut@gmail.com> | 2014-07-15 18:15:03 -0400 |
---|---|---|
committer | Deniz Turgut <dturgut@gmail.com> | 2014-07-16 03:40:53 -0400 |
commit | 7c3cc8fc0d26ab8d6f3aa177c03108e0737bb4e0 (patch) | |
tree | 4938d9953061b929d57da4cb24e418e21c6c568b | |
parent | a3c8fca1dbba18a4ae8b9fcdf4aa8bb56c0c578b (diff) | |
download | pelican-7c3cc8fc0d26ab8d6f3aa177c03108e0737bb4e0.tar.gz |
Fixes #1395: extends pelican.utils.strftime with `-` prefix to strip leading zeros
Adds the ability to use `-` prefix with C89 format codes to strip any
leading zeros.
-rw-r--r-- | docs/settings.rst | 10 | ||||
-rw-r--r-- | pelican/tests/test_utils.py | 7 | ||||
-rw-r--r-- | pelican/utils.py | 21 |
3 files changed, 33 insertions, 5 deletions
diff --git a/docs/settings.rst b/docs/settings.rst index df2fa722..71d23ab2 100644 --- a/docs/settings.rst +++ b/docs/settings.rst @@ -342,8 +342,12 @@ Date format and locale If no ``DATE_FORMATS`` are set, Pelican will fall back to ``DEFAULT_DATE_FORMAT``. If you need to maintain multiple languages with different date formats, you can set the ``DATE_FORMATS`` dictionary using the -language name (``lang`` metadata in your post content) as the key. Regarding -available format codes, see `strftime document of python`_ : +language name (``lang`` metadata in your post content) as the key. + +In addition to the standard C89 strftime format codes that are listed in +`Python strftime documentation`_, you can use ``-`` character between ``%`` and +the format character to remove any leading zeros. For example, ``%d/%m/%Y`` will +output ``01/01/2014`` whereas ``%-d/%-m/%Y`` will result in ``1/1/2014``. .. parsed-literal:: @@ -382,7 +386,7 @@ can get a list of available locales via the ``locale -a`` command; see manpage `locale(1)`_ for more information. -.. _strftime document of python: http://docs.python.org/library/datetime.html#strftime-strptime-behavior +.. _Python strftime documentation: http://docs.python.org/library/datetime.html#strftime-strptime-behavior .. _locales on Windows: http://msdn.microsoft.com/en-us/library/cdax410z%28VS.71%29.aspx diff --git a/pelican/tests/test_utils.py b/pelican/tests/test_utils.py index df1918b5..7e770e65 100644 --- a/pelican/tests/test_utils.py +++ b/pelican/tests/test_utils.py @@ -280,6 +280,13 @@ class TestUtils(LoggedTestCase): self.assertEqual(utils.strftime(d, '%d/%m/%Y Øl trinken beim Besäufnis'), '29/08/2012 Øl trinken beim Besäufnis') + # alternative formatting options + self.assertEqual(utils.strftime(d, '%-d/%-m/%y'), '29/8/12') + self.assertEqual(utils.strftime(d, '%-H:%-M:%-S'), '0:0:0') + + d = utils.SafeDatetime(2012, 8, 9) + self.assertEqual(utils.strftime(d, '%-d/%-m/%y'), '9/8/12') + # test the output of utils.strftime in a different locale # Turkish locale diff --git a/pelican/utils.py b/pelican/utils.py index 5e4822ba..96a0ab93 100644 --- a/pelican/utils.py +++ b/pelican/utils.py @@ -42,8 +42,11 @@ def strftime(date, date_format): replacing formatted output back. ''' + c89_directives = 'aAbBcdfHIjmMpSUwWxXyYzZ%' + strip_zeros = lambda x: x.lstrip('0') or '0' + # grab candidate format options - format_options = '%.' + format_options = '%[-]?.' candidates = re.findall(format_options, date_format) # replace candidates with placeholders for later % formatting @@ -56,14 +59,28 @@ def strftime(date, date_format): formatted_candidates = [] for candidate in candidates: # test for valid C89 directives only - if candidate[1] in 'aAbBcdfHIjmMpSUwWxXyYzZ%': + if candidate[-1] in c89_directives: + # check for '-' prefix + if len(candidate) == 3: + # '-' prefix + candidate = '%{}'.format(candidate[-1]) + conversion = strip_zeros + else: + conversion = None + + # format date if isinstance(date, SafeDatetime): formatted = date.strftime(candidate, safe=False) else: formatted = date.strftime(candidate) + # convert Py2 result to unicode if not six.PY3 and enc is not None: formatted = formatted.decode(enc) + + # strip zeros if '-' prefix is used + if conversion: + formatted = conversion(formatted) else: formatted = candidate formatted_candidates.append(formatted) |