diff options
Diffstat (limited to 'Lib/encodings/__init__.py')
-rw-r--r-- | Lib/encodings/__init__.py | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/Lib/encodings/__init__.py b/Lib/encodings/__init__.py new file mode 100644 index 0000000..c33b822 --- /dev/null +++ b/Lib/encodings/__init__.py @@ -0,0 +1,78 @@ +""" Standard "encodings" Package + + Standard Python encoding modules are stored in this package + directory. + + Codec modules must have names corresponding to standard lower-case + encoding names. Hyphens are automatically converted to + underscores, e.g. 'utf-8' is looked up as module utf_8. + + Each codec module must export the following interface: + + * getregentry() -> (encoder, decoder, stream_reader, stream_writer) + The getregentry() API must return callable objects which adhere to + the Python Codec Interface Standard. + + In addition, a module may optionally also define the following + APIs which are then used by the package's codec search function: + + * getaliases() -> sequence of encoding name strings to use as aliases + + Alias names returned by getaliases() must be lower-case. + + +Written by Marc-Andre Lemburg (mal@lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. + +"""#" + +import string,codecs,aliases + +_cache = {} +_unkown = '--unkown--' + +def search_function(encoding): + + # Cache lookup + entry = _cache.get(encoding,_unkown) + if entry is not _unkown: + return entry + + # Import the module + modname = string.replace(encoding,'-','_') + modname = aliases.aliases.get(modname,modname) + try: + mod = __import__(modname,globals(),locals(),'*') + except ImportError,why: + _cache[encoding] = None + return None + + # Now ask the module for the registry entry + try: + entry = tuple(mod.getregentry()) + except AttributeError: + entry = () + if len(entry) != 4: + raise SystemError,\ + 'module "%s.%s" failed to register' % \ + (__name__,modname) + for obj in entry: + if not callable(obj): + raise SystemError,\ + 'incompatible codecs in module "%s.%s"' % \ + (__name__,modname) + + # Cache the encoding and its aliases + _cache[encoding] = entry + try: + codecaliases = mod.getaliases() + except AttributeError: + pass + else: + for alias in codecaliases: + _cache[alias] = entry + return entry + +# Register the search_function in the Python codec registry +codecs.register(search_function) |