blob: 51ec8732622d61767a84b4996c65f68a401227b1 [file] [log] [blame]
Guido van Rossum0229bf62000-03-10 23:17:24 +00001""" 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
Guido van Rossum9e896b32000-04-05 20:11:21 +00007 encoding names with hyphens mapped to underscores, e.g. 'utf-8' is
8 implemented by the module 'utf_8.py'.
Guido van Rossum0229bf62000-03-10 23:17:24 +00009
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
Marc-André Lemburg988ad2b2000-12-12 14:45:35 +000021 Alias names returned by getaliases() must be standard encoding
22 names as defined above (lower-case, hyphens converted to
23 underscores).
Guido van Rossum0229bf62000-03-10 23:17:24 +000024
25Written by Marc-Andre Lemburg (mal@lemburg.com).
26
27(c) Copyright CNRI, All Rights Reserved. NO WARRANTY.
28
29"""#"
30
Marc-André Lemburg7ebb92e2000-06-13 12:04:05 +000031import codecs,aliases
Guido van Rossum0229bf62000-03-10 23:17:24 +000032
33_cache = {}
Barry Warsaw51ac5802000-03-20 16:36:48 +000034_unknown = '--unknown--'
Guido van Rossum0229bf62000-03-10 23:17:24 +000035
36def search_function(encoding):
37
38 # Cache lookup
Barry Warsaw51ac5802000-03-20 16:36:48 +000039 entry = _cache.get(encoding,_unknown)
40 if entry is not _unknown:
Guido van Rossum0229bf62000-03-10 23:17:24 +000041 return entry
42
43 # Import the module
Marc-André Lemburg7ebb92e2000-06-13 12:04:05 +000044 modname = encoding.replace('-', '_')
Guido van Rossum0229bf62000-03-10 23:17:24 +000045 modname = aliases.aliases.get(modname,modname)
46 try:
47 mod = __import__(modname,globals(),locals(),'*')
48 except ImportError,why:
Marc-André Lemburg988ad2b2000-12-12 14:45:35 +000049 # cache misses
Guido van Rossum0229bf62000-03-10 23:17:24 +000050 _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
Marc-André Lemburg988ad2b2000-12-12 14:45:35 +000068 # Cache the codec registry entry
Guido van Rossum0229bf62000-03-10 23:17:24 +000069 _cache[encoding] = entry
Marc-André Lemburg988ad2b2000-12-12 14:45:35 +000070
71 # Register its aliases (without overwriting previously registered
72 # aliases)
Guido van Rossum0229bf62000-03-10 23:17:24 +000073 try:
74 codecaliases = mod.getaliases()
75 except AttributeError:
76 pass
77 else:
78 for alias in codecaliases:
Marc-André Lemburg988ad2b2000-12-12 14:45:35 +000079 if not aliases.aliases.has_key(alias):
80 aliases.aliases[alias] = modname
81
82 # Return the registry entry
Guido van Rossum0229bf62000-03-10 23:17:24 +000083 return entry
84
85# Register the search_function in the Python codec registry
86codecs.register(search_function)