| 
									
										
										
										
											2000-03-10 23:17:24 +00:00
										 |  |  | """ 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 = {} | 
					
						
							| 
									
										
										
										
											2000-03-20 16:36:48 +00:00
										 |  |  | _unknown = '--unknown--' | 
					
						
							| 
									
										
										
										
											2000-03-10 23:17:24 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | def search_function(encoding): | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     # Cache lookup | 
					
						
							| 
									
										
										
										
											2000-03-20 16:36:48 +00:00
										 |  |  |     entry = _cache.get(encoding,_unknown) | 
					
						
							|  |  |  |     if entry is not _unknown: | 
					
						
							| 
									
										
										
										
											2000-03-10 23:17:24 +00:00
										 |  |  |         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) |