summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJustin Mayer <entroP@gmail.com>2014-08-28 11:17:28 -0700
committerJustin Mayer <entroP@gmail.com>2014-08-28 11:17:28 -0700
commit1fae9534d50b973bb0428c4c773599b0e8b4cfaa (patch)
tree7989011125cce441135a0cdc29c48fcfa001a6fd
parent2b130fb4dd8f6c3cf7e1ad502ca941d8a74a20a4 (diff)
parent7c3cc8fc0d26ab8d6f3aa177c03108e0737bb4e0 (diff)
downloadpelican-1fae9534d50b973bb0428c4c773599b0e8b4cfaa.tar.gz
Merge pull request #1446 from avaris/enhanced_strftime
Fixes #1395: extends pelican.utils.strftime with `-` prefix to strip leading zeros
-rw-r--r--docs/settings.rst10
-rw-r--r--pelican/tests/test_utils.py7
-rw-r--r--pelican/utils.py21
3 files changed, 33 insertions, 5 deletions
diff --git a/docs/settings.rst b/docs/settings.rst
index 6115ba78..71d37464 100644
--- a/docs/settings.rst
+++ b/docs/settings.rst
@@ -345,8 +345,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::
@@ -385,7 +389,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 d77b367b..18740f21 100644
--- a/pelican/tests/test_utils.py
+++ b/pelican/tests/test_utils.py
@@ -283,6 +283,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 fcfa93e1..d458cdd9 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)