diff --git a/CHANGES b/CHANGES index 6d2b5e832..b83565eb4 100644 --- a/CHANGES +++ b/CHANGES @@ -35,9 +35,12 @@ Release 1.0 (in development) * Added simplified Chinese locale. -Release 0.6.2 (in development) +Release 0.6.3 (in development) ============================== +Release 0.6.2 (Jun 16, 2009) +============================ + * #130: Fix obscure IndexError in doctest extension. * #167: Make glossary sorting case-independent. diff --git a/sphinx/application.py b/sphinx/application.py index b9c56d9f3..412a55863 100644 --- a/sphinx/application.py +++ b/sphinx/application.py @@ -26,6 +26,7 @@ from sphinx.errors import SphinxError, SphinxWarning, ExtensionError from sphinx.builders import BUILTIN_BUILDERS from sphinx.directives import GenericDesc, Target, additional_xref_types from sphinx.environment import SphinxStandaloneReader +from sphinx.util import pycompat from sphinx.util.tags import Tags from sphinx.util.compat import Directive, directive_dwim from sphinx.util.console import bold diff --git a/sphinx/util/pycompat.py b/sphinx/util/pycompat.py new file mode 100644 index 000000000..137c35c87 --- /dev/null +++ b/sphinx/util/pycompat.py @@ -0,0 +1,74 @@ +# -*- coding: utf-8 -*- +""" + sphinx.util.pycompat + ~~~~~~~~~~~~~~~~~~~~ + + Stuff for Python version compatibility. + + :copyright: Copyright 2007-2009 by the Sphinx team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +import sys +import codecs +import encodings + +if sys.version_info < (2, 5): + # Python 2.4 doesn't know the utf-8-sig encoding, so deliver it here + + def my_search_function(encoding): + norm_encoding = encodings.normalize_encoding(encoding) + if norm_encoding != 'utf_8_sig': + return None + return (encode, decode, StreamReader, StreamWriter) + + codecs.register(my_search_function) + + # begin code copied from utf_8_sig.py in Python 2.6 + + def encode(input, errors='strict'): + return (codecs.BOM_UTF8 + codecs.utf_8_encode(input, errors)[0], len(input)) + + def decode(input, errors='strict'): + prefix = 0 + if input[:3] == codecs.BOM_UTF8: + input = input[3:] + prefix = 3 + (output, consumed) = codecs.utf_8_decode(input, errors, True) + return (output, consumed+prefix) + + class StreamWriter(codecs.StreamWriter): + def reset(self): + codecs.StreamWriter.reset(self) + try: + del self.encode + except AttributeError: + pass + + def encode(self, input, errors='strict'): + self.encode = codecs.utf_8_encode + return encode(input, errors) + + class StreamReader(codecs.StreamReader): + def reset(self): + codecs.StreamReader.reset(self) + try: + del self.decode + except AttributeError: + pass + + def decode(self, input, errors='strict'): + if len(input) < 3: + if codecs.BOM_UTF8.startswith(input): + # not enough data to decide if this is a BOM + # => try again on the next call + return (u"", 0) + elif input[:3] == codecs.BOM_UTF8: + self.decode = codecs.utf_8_decode + (output, consumed) = codecs.utf_8_decode(input[3:],errors) + return (output, consumed+3) + # (else) no BOM present + self.decode = codecs.utf_8_decode + return codecs.utf_8_decode(input, errors) + + # end code copied from utf_8_sig.py