From cb45b6032364b499d9dd64604723efcac5f48ade Mon Sep 17 00:00:00 2001 From: milde Date: Sun, 22 Jul 2012 21:20:28 +0000 Subject: [PATCH] Fix [ 3546533 ] unicode error with date directive. git-svn-id: http://svn.code.sf.net/p/docutils/code/trunk/docutils@7487 929543f6-e4f2-0310-98a6-ba3bd3dd1d04 --- HISTORY.txt | 4 ++++ docutils/parsers/rst/directives/misc.py | 19 +++++++++++++++++-- .../test_rst/test_directives/test_date.py | 15 ++++++++++++++- 3 files changed, 35 insertions(+), 3 deletions(-) diff --git a/HISTORY.txt b/HISTORY.txt index f43c44fc0..cf104919b 100644 --- a/HISTORY.txt +++ b/HISTORY.txt @@ -28,6 +28,10 @@ Changes Since 0.9.1 - FileInput/FileOutput: no system-exit on IOError. The `handle_io_errors` option is ignored and will be removed in a future release. +* docutils/parsers/rst/directives/misc.py + + - Fix [ 3546533 ] unicode error with date directive. + * docutils/writers/manpage.py - Apply [3527401] addmonition's don't preserve indentation diff --git a/docutils/parsers/rst/directives/misc.py b/docutils/parsers/rst/directives/misc.py index 6edaf6fa9..09b7fcdec 100644 --- a/docutils/parsers/rst/directives/misc.py +++ b/docutils/parsers/rst/directives/misc.py @@ -12,6 +12,7 @@ import re import time from docutils import io, nodes, statemachine, utils from docutils.utils.error_reporting import SafeString, ErrorString +from docutils.utils.error_reporting import locale_encoding from docutils.parsers.rst import Directive, convert_directive_function from docutils.parsers.rst import directives, roles, states from docutils.parsers.rst.directives.body import CodeBlock, NumberLines @@ -469,8 +470,22 @@ class Date(Directive): raise self.error( 'Invalid context: the "%s" directive can only be used within ' 'a substitution definition.' % self.name) - format = '\n'.join(self.content) or '%Y-%m-%d' - text = time.strftime(format) + format_str = '\n'.join(self.content) or '%Y-%m-%d' + if sys.version_info< (3, 0): + try: + format_str = format_str.encode(locale_encoding or 'utf-8') + except UnicodeEncodeError: + raise self.warning(u'Cannot encode date format string ' + u'with locale encoding "%s".' % locale_encoding) + text = time.strftime(format_str) + if sys.version_info< (3, 0): + # `text` is a byte string that may contain non-ASCII characters: + try: + text = text.decode(locale_encoding or 'utf-8') + except UnicodeDecodeError: + text = text.decode(locale_encoding or 'utf-8', 'replace') + raise self.warning(u'Error decoding "%s"' + u'with locale encoding "%s".' % (text, locale_encoding)) return [nodes.Text(text)] diff --git a/test/test_parsers/test_rst/test_directives/test_date.py b/test/test_parsers/test_rst/test_directives/test_date.py index 1142f415b..64ad4d429 100755 --- a/test/test_parsers/test_rst/test_directives/test_date.py +++ b/test/test_parsers/test_rst/test_directives/test_date.py @@ -11,6 +11,7 @@ Tests for the misc.py "date" directive. from __init__ import DocutilsTestSupport import time +from docutils.utils.error_reporting import locale_encoding def suite(): s = DocutilsTestSupport.ParserTestSuite() @@ -56,7 +57,19 @@ Today's date is |date|. """], ] - +# some locales return non-ASCII characters for names of days or months +if locale_encoding in ['utf8', 'utf-8', 'latin-1']: + totest['decode date'] = [ + [u"""\ + .. |date| date:: t\xc3glich + """, + u"""\ + + + t\xc3glich + """], + ] + if __name__ == '__main__': import unittest unittest.main(defaultTest='suite') -- 2.11.4.GIT