""" 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)