<s> __all__ = [ <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> ] <EOL> import email . base64mime <EOL> import email . quoprimime <EOL> from email import errors <EOL> from email . encoders import encode_7or8bit <EOL> QP = <NUM_LIT:1> <EOL> BASE64 = <NUM_LIT:2> <EOL> SHORTEST = <NUM_LIT:3> <EOL> MISC_LEN = <NUM_LIT:7> <EOL> DEFAULT_CHARSET = '<STR_LIT>' <EOL> CHARSETS = { <EOL> '<STR_LIT>' : ( QP , QP , None ) , <EOL> '<STR_LIT>' : ( QP , QP , None ) , <EOL> '<STR_LIT>' : ( QP , QP , None ) , <EOL> '<STR_LIT>' : ( QP , QP , None ) , <EOL> '<STR_LIT>' : ( QP , QP , None ) , <EOL> '<STR_LIT>' : ( QP , QP , None ) , <EOL> '<STR_LIT>' : ( QP , QP , None ) , <EOL> '<STR_LIT>' : ( QP , QP , None ) , <EOL> '<STR_LIT>' : ( QP , QP , None ) , <EOL> '<STR_LIT>' : ( QP , QP , None ) , <EOL> '<STR_LIT>' : ( QP , QP , None ) , <EOL> '<STR_LIT>' : ( QP , QP , None ) , <EOL> '<STR_LIT>' : ( None , None , None ) , <EOL> '<STR_LIT>' : ( BASE64 , BASE64 , None ) , <EOL> '<STR_LIT>' : ( BASE64 , BASE64 , None ) , <EOL> '<STR_LIT>' : ( BASE64 , None , '<STR_LIT>' ) , <EOL> '<STR_LIT>' : ( BASE64 , None , '<STR_LIT>' ) , <EOL> '<STR_LIT>' : ( BASE64 , None , None ) , <EOL> '<STR_LIT>' : ( BASE64 , BASE64 , None ) , <EOL> '<STR_LIT:utf-8>' : ( SHORTEST , BASE64 , '<STR_LIT:utf-8>' ) , <EOL> '<STR_LIT>' : ( None , BASE64 , '<STR_LIT:utf-8>' ) , <EOL> } <EOL> ALIASES = { <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:ascii>' : '<STR_LIT>' , <EOL> } <EOL> CODEC_MAP = { <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : None , <EOL> } <EOL> def add_charset ( charset , header_enc = None , body_enc = None , output_charset = None ) : <EOL> """<STR_LIT>""" <EOL> if body_enc == SHORTEST : <EOL> raise ValueError ( '<STR_LIT>' ) <EOL> CHARSETS [ charset ] = ( header_enc , body_enc , output_charset ) <EOL> def add_alias ( alias , canonical ) : <EOL> """<STR_LIT>""" <EOL> ALIASES [ alias ] = canonical <EOL> def add_codec ( charset , codecname ) : <EOL> """<STR_LIT>""" <EOL> CODEC_MAP [ charset ] = codecname <EOL> class Charset : <EOL> """<STR_LIT>""" <EOL> def __init__ ( self , input_charset = DEFAULT_CHARSET ) : <EOL> try : <EOL> if isinstance ( input_charset , unicode ) : <EOL> input_charset . encode ( '<STR_LIT:ascii>' ) <EOL> else : <EOL> input_charset = unicode ( input_charset , '<STR_LIT:ascii>' ) <EOL> except UnicodeError : <EOL> raise errors . CharsetError ( input_charset ) <EOL> input_charset = input_charset . lower ( ) <EOL> self . input_charset = ALIASES . get ( input_charset , input_charset ) <EOL> henc , benc , conv = CHARSETS . get ( self . input_charset , <EOL> ( SHORTEST , BASE64 , None ) ) <EOL> if not conv : <EOL> conv = self . input_charset <EOL> self . header_encoding = henc <EOL> self . body_encoding = benc <EOL> self . output_charset = ALIASES . get ( conv , conv ) <EOL> self . input_codec = CODEC_MAP . get ( self . input_charset , <EOL> self . input_charset ) <EOL> self . output_codec = CODEC_MAP . get ( self . output_charset , <EOL> self . output_charset ) <EOL> def __str__ ( self ) : <EOL> return self . input_charset . lower ( ) <EOL> __repr__ = __str__ <EOL> def __eq__ ( self , other ) : <EOL> return str ( self ) == str ( other ) . lower ( ) <EOL> def __ne__ ( self , other ) : <EOL> return not self . __eq__ ( other ) <EOL> def get_body_encoding ( self ) : <EOL> """<STR_LIT>""" <EOL> assert self . body_encoding != SHORTEST <EOL> if self . body_encoding == QP : <EOL> return '<STR_LIT>' <EOL> elif self . body_encoding == BASE64 : <EOL> return '<STR_LIT>' <EOL> else : <EOL> return encode_7or8bit <EOL> def convert ( self , s ) : <EOL> """<STR_LIT>""" <EOL> if self . input_codec != self . output_codec : <EOL> return unicode ( s , self . input_codec ) . encode ( self . output_codec ) <EOL> else : <EOL> return s <EOL> def to_splittable ( self , s ) : <EOL> """<STR_LIT>""" <EOL> if isinstance ( s , unicode ) or self . input_codec is None : <EOL> return s <EOL> try : <EOL> return unicode ( s , self . input_codec , '<STR_LIT:replace>' ) <EOL> except LookupError : <EOL> return s <EOL> def from_splittable ( self , ustr , to_output = True ) : <EOL> """<STR_LIT>""" <EOL> if to_output : <EOL> codec = self . output_codec <EOL> else : <EOL> codec = self . input_codec <EOL> if not isinstance ( ustr , unicode ) or codec is None : <EOL> return ustr <EOL> try : <EOL> return ustr . encode ( codec , '<STR_LIT:replace>' ) <EOL> except LookupError : <EOL> return ustr <EOL> def get_output_charset ( self ) : <EOL> """<STR_LIT>""" <EOL> return self . output_charset or self . input_charset <EOL> def encoded_header_len ( self , s ) : <EOL> """<STR_LIT>""" <EOL> cset = self . get_output_charset ( ) <EOL> if self . header_encoding == BASE64 : <EOL> return email . base64mime . base64_len ( s ) + len ( cset ) + MISC_LEN <EOL> elif self . header_encoding == QP : <EOL> return email . quoprimime . header_quopri_len ( s ) + len ( cset ) + MISC_LEN <EOL> elif self . header_encoding == SHORTEST : <EOL> lenb64 = email . base64mime . base64_len ( s ) <EOL> lenqp = email . quoprimime . header_quopri_len ( s ) <EOL> return min ( lenb64 , lenqp ) + len ( cset ) + MISC_LEN <EOL> else : <EOL> return len ( s ) <EOL> def header_encode ( self , s , convert = False ) : <EOL> """<STR_LIT>""" <EOL> cset = self . get_output_charset ( ) <EOL> if convert : <EOL> s = self . convert ( s ) <EOL> if self . header_encoding == BASE64 : <EOL> return email . base64mime . header_encode ( s , cset ) <EOL> elif self . header_encoding == QP : <EOL> return email . quoprimime . header_encode ( s , cset , maxlinelen = None ) <EOL> elif self . header_encoding == SHORTEST : <EOL> lenb64 = email . base64mime . base64_len ( s ) <EOL> lenqp = email . quoprimime . header_quopri_len ( s ) <EOL> if lenb64 < lenqp : <EOL> return email . base64mime . header_encode ( s , cset ) <EOL> else : <EOL> return email . quoprimime . header_encode ( s , cset , maxlinelen = None ) <EOL> else : <EOL> return s <EOL> def body_encode ( self , s , convert = True ) : <EOL> """<STR_LIT>""" <EOL> if convert : <EOL> s = self . convert ( s ) <EOL> if self . body_encoding is BASE64 : <EOL> return email . base64mime . body_encode ( s ) <EOL> elif self . body_encoding is QP : <EOL> return email . quoprimime . body_encode ( s ) <EOL> else : <EOL> return s </s>
