__init__.py revision 988ad2bdff836665f004c285fb09182c35775fd6
1""" Standard "encodings" Package
2
3    Standard Python encoding modules are stored in this package
4    directory.
5
6    Codec modules must have names corresponding to standard lower-case
7    encoding names with hyphens mapped to underscores, e.g. 'utf-8' is
8    implemented by the module 'utf_8.py'.
9
10    Each codec module must export the following interface:
11
12    * getregentry() -> (encoder, decoder, stream_reader, stream_writer)
13    The getregentry() API must return callable objects which adhere to
14    the Python Codec Interface Standard.
15
16    In addition, a module may optionally also define the following
17    APIs which are then used by the package's codec search function:
18
19    * getaliases() -> sequence of encoding name strings to use as aliases
20
21    Alias names returned by getaliases() must be standard encoding
22    names as defined above (lower-case, hyphens converted to
23    underscores).
24
25Written by Marc-Andre Lemburg (mal@lemburg.com).
26
27(c) Copyright CNRI, All Rights Reserved. NO WARRANTY.
28
29"""#"
30
31import codecs,aliases
32
33_cache = {}
34_unknown = '--unknown--'
35
36def search_function(encoding):
37
38    # Cache lookup
39    entry = _cache.get(encoding,_unknown)
40    if entry is not _unknown:
41        return entry
42
43    # Import the module
44    modname = encoding.replace('-', '_')
45    modname = aliases.aliases.get(modname,modname)
46    try:
47        mod = __import__(modname,globals(),locals(),'*')
48    except ImportError,why:
49        # cache misses
50        _cache[encoding] = None
51        return None
52
53    # Now ask the module for the registry entry
54    try:
55        entry = tuple(mod.getregentry())
56    except AttributeError:
57        entry = ()
58    if len(entry) != 4:
59        raise SystemError,\
60              'module "%s.%s" failed to register' % \
61              (__name__,modname)
62    for obj in entry:
63        if not callable(obj):
64            raise SystemError,\
65                  'incompatible codecs in module "%s.%s"' % \
66                  (__name__,modname)
67
68    # Cache the codec registry entry
69    _cache[encoding] = entry
70
71    # Register its aliases (without overwriting previously registered
72    # aliases)
73    try:
74        codecaliases = mod.getaliases()
75    except AttributeError:
76        pass
77    else:
78        for alias in codecaliases:
79            if not aliases.aliases.has_key(alias):
80                aliases.aliases[alias] = modname
81
82    # Return the registry entry
83    return entry
84
85# Register the search_function in the Python codec registry
86codecs.register(search_function)
87