mirror of https://github.com/python/cpython.git
79 lines
2.2 KiB
Python
79 lines
2.2 KiB
Python
|
""" 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)
|