1 """ Standard "encodings" Package
3 Standard Python encoding modules are stored in this package
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'.
10 Each codec module must export the following interface:
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.
16 In addition, a module may optionally also define the following
17 APIs which are then used by the package's codec search function:
19 * getaliases() -> sequence of encoding name strings to use as aliases
21 Alias names returned by getaliases() must be standard encoding
22 names as defined above (lower-case, hyphens converted to
25 Written by Marc-Andre Lemburg (mal@lemburg.com).
27 (c) Copyright CNRI, All Rights Reserved. NO WARRANTY.
31 import codecs
,aliases
,exceptions
34 _unknown
= '--unknown--'
36 class CodecRegistryError(exceptions
.LookupError,
37 exceptions
.SystemError):
40 def search_function(encoding
):
43 entry
= _cache
.get(encoding
,_unknown
)
44 if entry
is not _unknown
:
48 modname
= encoding
.replace('-', '_')
49 modname
= aliases
.aliases
.get(modname
,modname
)
51 mod
= __import__(modname
,globals(),locals(),'*')
52 except ImportError,why
:
54 _cache
[encoding
] = None
57 # Now ask the module for the registry entry
59 entry
= tuple(mod
.getregentry())
60 except AttributeError:
63 raise CodecRegistryError
,\
64 'module "%s" (%s) failed to register' % \
65 (mod
.__name
__, mod
.__file
__)
68 raise CodecRegistryError
,\
69 'incompatible codecs in module "%s" (%s)' % \
70 (mod
.__name
__, mod
.__file
__)
72 # Cache the codec registry entry
73 _cache
[encoding
] = entry
75 # Register its aliases (without overwriting previously registered
78 codecaliases
= mod
.getaliases()
79 except AttributeError:
82 for alias
in codecaliases
:
83 if not aliases
.aliases
.has_key(alias
):
84 aliases
.aliases
[alias
] = modname
86 # Return the registry entry
89 # Register the search_function in the Python codec registry
90 codecs
.register(search_function
)