From: <mi...@us...> - 2012-07-22 21:20:34
|
Revision: 7487 http://docutils.svn.sourceforge.net/docutils/?rev=7487&view=rev Author: milde Date: 2012-07-22 21:20:28 +0000 (Sun, 22 Jul 2012) Log Message: ----------- Fix [ 3546533 ] unicode error with date directive. Modified Paths: -------------- trunk/docutils/HISTORY.txt trunk/docutils/docutils/parsers/rst/directives/misc.py trunk/docutils/test/test_parsers/test_rst/test_directives/test_date.py Modified: trunk/docutils/HISTORY.txt =================================================================== --- trunk/docutils/HISTORY.txt 2012-07-11 12:25:14 UTC (rev 7486) +++ trunk/docutils/HISTORY.txt 2012-07-22 21:20:28 UTC (rev 7487) @@ -28,6 +28,10 @@ - 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 Modified: trunk/docutils/docutils/parsers/rst/directives/misc.py =================================================================== --- trunk/docutils/docutils/parsers/rst/directives/misc.py 2012-07-11 12:25:14 UTC (rev 7486) +++ trunk/docutils/docutils/parsers/rst/directives/misc.py 2012-07-22 21:20:28 UTC (rev 7487) @@ -12,6 +12,7 @@ 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 @@ 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)] Modified: trunk/docutils/test/test_parsers/test_rst/test_directives/test_date.py =================================================================== --- trunk/docutils/test/test_parsers/test_rst/test_directives/test_date.py 2012-07-11 12:25:14 UTC (rev 7486) +++ trunk/docutils/test/test_parsers/test_rst/test_directives/test_date.py 2012-07-22 21:20:28 UTC (rev 7487) @@ -11,6 +11,7 @@ from __init__ import DocutilsTestSupport import time +from docutils.utils.error_reporting import locale_encoding def suite(): s = DocutilsTestSupport.ParserTestSuite() @@ -56,7 +57,19 @@ """], ] - +# 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"""\ + <document source="test data"> + <substitution_definition names="date"> + t\xc3glich + """], + ] + if __name__ == '__main__': import unittest unittest.main(defaultTest='suite') This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |