<s> """<STR_LIT>""" <EOL> import os <EOL> import sys <EOL> import posixpath <EOL> import urllib <EOL> try : <EOL> import _winreg <EOL> except ImportError : <EOL> _winreg = None <EOL> __all__ = [ <EOL> "<STR_LIT>" , "<STR_LIT>" , "<STR_LIT>" , <EOL> "<STR_LIT>" , "<STR_LIT>" , "<STR_LIT>" <EOL> ] <EOL> knownfiles = [ <EOL> "<STR_LIT>" , <EOL> "<STR_LIT>" , <EOL> "<STR_LIT>" , <EOL> "<STR_LIT>" , <EOL> "<STR_LIT>" , <EOL> "<STR_LIT>" , <EOL> "<STR_LIT>" , <EOL> "<STR_LIT>" , <EOL> "<STR_LIT>" , <EOL> ] <EOL> inited = False <EOL> _db = None <EOL> class MimeTypes : <EOL> """<STR_LIT>""" <EOL> def __init__ ( self , filenames = ( ) , strict = True ) : <EOL> if not inited : <EOL> init ( ) <EOL> self . encodings_map = encodings_map . copy ( ) <EOL> self . suffix_map = suffix_map . copy ( ) <EOL> self . types_map = ( { } , { } ) <EOL> self . types_map_inv = ( { } , { } ) <EOL> for ( ext , type ) in types_map . items ( ) : <EOL> self . add_type ( type , ext , True ) <EOL> for ( ext , type ) in common_types . items ( ) : <EOL> self . add_type ( type , ext , False ) <EOL> for name in filenames : <EOL> self . read ( name , strict ) <EOL> def add_type ( self , type , ext , strict = True ) : <EOL> """<STR_LIT>""" <EOL> self . types_map [ strict ] [ ext ] = type <EOL> exts = self . types_map_inv [ strict ] . setdefault ( type , [ ] ) <EOL> if ext not in exts : <EOL> exts . append ( ext ) <EOL> def guess_type ( self , url , strict = True ) : <EOL> """<STR_LIT>""" <EOL> scheme , url = urllib . splittype ( url ) <EOL> if scheme == '<STR_LIT:data>' : <EOL> comma = url . find ( '<STR_LIT:U+002C>' ) <EOL> if comma < <NUM_LIT:0> : <EOL> return None , None <EOL> semi = url . find ( '<STR_LIT:;>' , <NUM_LIT:0> , comma ) <EOL> if semi >= <NUM_LIT:0> : <EOL> type = url [ : semi ] <EOL> else : <EOL> type = url [ : comma ] <EOL> if '<STR_LIT:=>' in type or '<STR_LIT:/>' not in type : <EOL> type = '<STR_LIT>' <EOL> return type , None <EOL> base , ext = posixpath . splitext ( url ) <EOL> while ext in self . suffix_map : <EOL> base , ext = posixpath . splitext ( base + self . suffix_map [ ext ] ) <EOL> if ext in self . encodings_map : <EOL> encoding = self . encodings_map [ ext ] <EOL> base , ext = posixpath . splitext ( base ) <EOL> else : <EOL> encoding = None <EOL> types_map = self . types_map [ True ] <EOL> if ext in types_map : <EOL> return types_map [ ext ] , encoding <EOL> elif ext . lower ( ) in types_map : <EOL> return types_map [ ext . lower ( ) ] , encoding <EOL> elif strict : <EOL> return None , encoding <EOL> types_map = self . types_map [ False ] <EOL> if ext in types_map : <EOL> return types_map [ ext ] , encoding <EOL> elif ext . lower ( ) in types_map : <EOL> return types_map [ ext . lower ( ) ] , encoding <EOL> else : <EOL> return None , encoding <EOL> def guess_all_extensions ( self , type , strict = True ) : <EOL> """<STR_LIT>""" <EOL> type = type . lower ( ) <EOL> extensions = self . types_map_inv [ True ] . get ( type , [ ] ) <EOL> if not strict : <EOL> for ext in self . types_map_inv [ False ] . get ( type , [ ] ) : <EOL> if ext not in extensions : <EOL> extensions . append ( ext ) <EOL> return extensions <EOL> def guess_extension ( self , type , strict = True ) : <EOL> """<STR_LIT>""" <EOL> extensions = self . guess_all_extensions ( type , strict ) <EOL> if not extensions : <EOL> return None <EOL> return extensions [ <NUM_LIT:0> ] <EOL> def read ( self , filename , strict = True ) : <EOL> """<STR_LIT>""" <EOL> with open ( filename ) as fp : <EOL> self . readfp ( fp , strict ) <EOL> def readfp ( self , fp , strict = True ) : <EOL> """<STR_LIT>""" <EOL> while <NUM_LIT:1> : <EOL> line = fp . readline ( ) <EOL> if not line : <EOL> break <EOL> words = line . split ( ) <EOL> for i in range ( len ( words ) ) : <EOL> if words [ i ] [ <NUM_LIT:0> ] == '<STR_LIT:#>' : <EOL> del words [ i : ] <EOL> break <EOL> if not words : <EOL> continue <EOL> type , suffixes = words [ <NUM_LIT:0> ] , words [ <NUM_LIT:1> : ] <EOL> for suff in suffixes : <EOL> self . add_type ( type , '<STR_LIT:.>' + suff , strict ) <EOL> def read_windows_registry ( self , strict = True ) : <EOL> """<STR_LIT>""" <EOL> if not _winreg : <EOL> return <EOL> def enum_types ( mimedb ) : <EOL> i = <NUM_LIT:0> <EOL> while True : <EOL> try : <EOL> ctype = _winreg . EnumKey ( mimedb , i ) <EOL> except EnvironmentError : <EOL> break <EOL> try : <EOL> ctype = ctype . encode ( default_encoding ) <EOL> except UnicodeEncodeError : <EOL> pass <EOL> else : <EOL> yield ctype <EOL> i += <NUM_LIT:1> <EOL> default_encoding = sys . getdefaultencoding ( ) <EOL> with _winreg . OpenKey ( _winreg . HKEY_CLASSES_ROOT , <EOL> r'<STR_LIT>' ) as mimedb : <EOL> for ctype in enum_types ( mimedb ) : <EOL> try : <EOL> with _winreg . OpenKey ( mimedb , ctype ) as key : <EOL> suffix , datatype = _winreg . QueryValueEx ( key , <EOL> '<STR_LIT>' ) <EOL> except EnvironmentError : <EOL> continue <EOL> if datatype != _winreg . REG_SZ : <EOL> continue <EOL> try : <EOL> suffix = suffix . encode ( default_encoding ) <EOL> except UnicodeEncodeError : <EOL> continue <EOL> self . add_type ( ctype , suffix , strict ) <EOL> def guess_type ( url , strict = True ) : <EOL> """<STR_LIT>""" <EOL> if _db is None : <EOL> init ( ) <EOL> return _db . guess_type ( url , strict ) <EOL> def guess_all_extensions ( type , strict = True ) : <EOL> """<STR_LIT>""" <EOL> if _db is None : <EOL> init ( ) <EOL> return _db . guess_all_extensions ( type , strict ) <EOL> def guess_extension ( type , strict = True ) : <EOL> """<STR_LIT>""" <EOL> if _db is None : <EOL> init ( ) <EOL> return _db . guess_extension ( type , strict ) <EOL> def add_type ( type , ext , strict = True ) : <EOL> """<STR_LIT>""" <EOL> if _db is None : <EOL> init ( ) <EOL> return _db . add_type ( type , ext , strict ) <EOL> def init ( files = None ) : <EOL> global suffix_map , types_map , encodings_map , common_types <EOL> global inited , _db <EOL> inited = True <EOL> db = MimeTypes ( ) <EOL> if files is None : <EOL> if _winreg : <EOL> db . read_windows_registry ( ) <EOL> files = knownfiles <EOL> for file in files : <EOL> if os . path . isfile ( file ) : <EOL> db . read ( file ) <EOL> encodings_map = db . encodings_map <EOL> suffix_map = db . suffix_map <EOL> types_map = db . types_map [ True ] <EOL> common_types = db . types_map [ False ] <EOL> _db = db <EOL> def read_mime_types ( file ) : <EOL> try : <EOL> f = open ( file ) <EOL> except IOError : <EOL> return None <EOL> db = MimeTypes ( ) <EOL> db . readfp ( f , True ) <EOL> return db . types_map [ True ] <EOL> def _default_mime_types ( ) : <EOL> global suffix_map <EOL> global encodings_map <EOL> global types_map <EOL> global common_types <EOL> suffix_map = { <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> } <EOL> encodings_map = { <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> } <EOL> types_map = { <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> } <EOL> common_types = { <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' <EOL> } <EOL> _default_mime_types ( ) <EOL> if __name__ == '<STR_LIT:__main__>' : <EOL> import getopt <EOL> USAGE = """<STR_LIT>""" <EOL> def usage ( code , msg = '<STR_LIT>' ) : <EOL> print USAGE <EOL> if msg : print msg <EOL> sys . exit ( code ) <EOL> try : <EOL> opts , args = getopt . getopt ( sys . argv [ <NUM_LIT:1> : ] , '<STR_LIT>' , <EOL> [ '<STR_LIT>' , '<STR_LIT>' , '<STR_LIT>' ] ) <EOL> except getopt . error , msg : <EOL> usage ( <NUM_LIT:1> , msg ) <EOL> strict = <NUM_LIT:1> <EOL> extension = <NUM_LIT:0> <EOL> for opt , arg in opts : <EOL> if opt in ( '<STR_LIT>' , '<STR_LIT>' ) : <EOL> usage ( <NUM_LIT:0> ) <EOL> elif opt in ( '<STR_LIT>' , '<STR_LIT>' ) : <EOL> strict = <NUM_LIT:0> <EOL> elif opt in ( '<STR_LIT>' , '<STR_LIT>' ) : <EOL> extension = <NUM_LIT:1> <EOL> for gtype in args : <EOL> if extension : <EOL> guess = guess_extension ( gtype , strict ) <EOL> if not guess : print "<STR_LIT>" , gtype <EOL> else : print guess <EOL> else : <EOL> guess , encoding = guess_type ( gtype , strict ) <EOL> if not guess : print "<STR_LIT>" , gtype <EOL> else : print '<STR_LIT>' , guess , '<STR_LIT>' , encoding </s>
