3 jfC@sdZddlmZddlmZddlmZddlmZddlmZddd d gZdd l Z dd l Z d Z d Z dZ ddddddddddddddddddd d!d"d#d$d%gZd&d'd(d)d*d+d,gZddddd>d?d@dAdBdCdDdEdFdGd3Zd4d Zd5d6Zd7dZd8dZd9d ZGd:d;d;eZGdC/tmp/pip-build-s1i5078x/future/future/backports/email/_parseaddr.pyr 3s  cCs|sdS|j}|djds.|djtkr6|d=n.|djd}|dkrd|d|dd|d<t|dkr|djd}t|dkr||dd}t|dkr|d}|jd}|dkr|jd}|dkr|d|||dg|dd<n |jd t|d krdS|dd }|\}}}}}|j}|tkrZ||j}}|tkrZdStj |d}|d krz|d 8}|ddkr|dd}|jd }|dkr||}}|ddkr|dd}|dj s||}}|ddkr|dd}|jd }t|d kr$|\} } d} n~t|dkr>|\} } } ndt|dkrd|dkr|djd}t|d kr|\} } d} nt|dkr|\} } } ndSy,t |}t |}t | } t | } t | } Wnt k rdSX|dkr |dkr|d7}n|d7}d} |j }|tkr,t|} n>y t |} Wnt k rNYnX| dkrj|jdrjd} | r| dkrd} | } nd} | | dd| dd} |||| | | ddd| g S)aConvert date to extended time tuple. The last (additional) element is the time zone offset in seconds, except if the timezone was specified as -0000. In that case the last element is None. This indicates a UTC timestamp that explicitly declaims knowledge of the source timezone, as opposed to a +0000 timestamp that indicates the source timezone really was UTC. Nr,-+r  :0.dDilii<rOrOrOrOrOrOrOrO)splitendswithlower _daynamesrfindlenfindappend _monthnamesindexisdigitr ValueErrorupper _timezones startswith)r<istuffsddmmyytmtzthhtmmtsstzoffsettzsignr>r>r?r:?s     "                       r:cCs&t|}t|tr|ddS|SdS)z&Convert a time string to a time tuple.Nr9)r isinstancer;)r<tr>r>r?rs  cCs<|ddkr"tj|dddStj|}||dSdS)zETurn a 10-tuple as returned by parsedate_tz() into a POSIX timestamp.r9NrArO)rO)timemktimecalendartimegm)r<rmr>r>r?rs  cCs|jddjddS)zPrepare string to be used in a quoted string. Turns backslash and double quote characters into quoted pairs. These are the only characters that need to be quoted inside a quoted string. Does not add the surrounding double quotes. \z\\"z\")replace)strr>r>r?r sc@s|eZdZdZddZddZddZdd Zd d Zd d Z ddZ dddZ ddZ ddZ ddZdddZddZdS) AddrlistClassaAddress parser class by Ben Escoto. To understand what this class does, it helps to have a copy of RFC 2822 in front of you. Note: this class interface is deprecated and may be removed in the future. Use email.utils.AddressList instead. cCsZd|_d|_d|_d|_|j|j|_|j|j|j|_|jjdd|_||_g|_ dS)zInitialize a new instance. `field' is an unparsed address header field, containing one or more addresses. z ()<>@,:;."[]rz z rKr N) specialsposLWSCRFWSatomendsru phraseendsfield commentlist)selfrr>r>r?__init__szAddrlistClass.__init__cCsg}x|jt|jkr|j|j|jdkr^|j|jdkrN|j|j|j|jd7_q|j|jdkr|jj|jqPqWtj|S)z&Skip white space and extract comments.z rA() ryrUrrzrWr getcomment EMPTYSTRINGjoin)rwslistr>r>r?gotonextszAddrlistClass.gotonextcCs>g}x4|jt|jkr8|j}|r,||7}q|jdqW|S)zVParse all addresses. Returns a list containing all of the addresses. r )r r )ryrUr getaddressrW)rresultadr>r>r? getaddrlists zAddrlistClass.getaddrlistcCsg|_|j|j}|j}|j}|jg}|jt|jkr\|rXtj|j|dfg}n\|j|jdkr||_||_|j}tj|j|fg}n"|j|jdkrg}t|j}|jd7_x|jt|jkr|j|j|ko|j|jdkr |jd7_P||j }qWn|j|jdkrx|j }|jrftj|ddj|jd |fg}ntj||fg}n@|rtj|j|dfg}n"|j|j|j kr|jd7_|j|jt|jkr|j|jd kr|jd7_|S) zParse the next address.rz.@rHrA;r>r?r sL &$zAddrlistClass.getaddresscCs|j|jdkrdSd}|jd7_|jd}x|jt|jkr|rV|jd}n~|j|jdkrx|jd7_Pn\|j|jdkr|jd7_d}n8|j|jd kr|jd7_n|j}|jd7_P|jq4W|S) zParse a route address (Return-path value). This method just skips all the route stuff and returns the addrspec. rNFrAr >@TrH)rryrrU getdomainr)r expectrouteadlistr>r>r?rEs. zAddrlistClass.getrouteaddrcCsNg}|jx|jt|jkrd}|j|jdkrj|rL|dj rL|j|jd|jd7_d}nf|j|jdkr|jdt|jn>|j|j|j kr|r|d j r|jPn|j|j |j}|r|r|j|qW|jt|jks|j|jdkrt j |S|jd|jd7_|jt j ||j S) zParse an RFC 2822 addr-spec.TrKrAFrtz"%s"rrOrO)rryrUrstrippoprWr getquoter}getatomrrr)raslist preserve_wswsr>r>r?res4 $  zAddrlistClass.getaddrspeccCsg}x|jt|jkr|j|j|jkr8|jd7_q|j|jdkrZ|jj|jq|j|jdkrz|j|jq|j|jdkr|jd7_|jdq|j|j|jkrPq|j|j qWt j |S)z-Get the complete domain name from an address.rAr[rK) ryrUrrzrrWrgetdomainliteralr}rrr)rsdlistr>r>r?rs zAddrlistClass.getdomainTcCs|j|j|krdSdg}d}|jd7_x|jt|jkr|rZ|j|j|jd}np|j|j|kr||jd7_PnN|r|j|jdkr|j|jq.n(|j|jdkrd}n|j|j|j|jd7_q.Wtj|S)aParse a header fragment delimited by special characters. `beginchar' is the start character for the fragment. If self is not looking at an instance of `beginchar' then getdelimited returns the empty string. `endchars' is a sequence of allowable end-delimiting characters. Parsing stops when one of these is encountered. If `allowcomments' is non-zero, embedded RFC 2822 comments are allowed within the parsed fragment. r FrArrsT)rryrUrWrrr)r begincharendchars allowcommentsslistr r>r>r? getdelimiteds( zAddrlistClass.getdelimitedcCs|jdddS)z1Get a quote-delimited fragment from self's field.rtz" F)r)rr>r>r?rszAddrlistClass.getquotecCs|jdddS)z7Get a parenthesis-delimited fragment from self's field.rz) T)r)rr>r>r?rszAddrlistClass.getcommentcCsd|jdddS)z!Parse an RFC 2822 domain-literal.z[%s]rz] F)r)rr>r>r?rszAddrlistClass.getdomainliteralNcCshdg}|dkr|j}xH|jt|jkr\|j|j|kr:Pn|j|j|j|jd7_qWtj|S)aParse an RFC 2822 atom. Optional atomends specifies a different set of end token delimiters (the default is to use self.atomends). This is used e.g. in getphraselist() since phrase endings must not include the `.' (which is legal in phrases).r NrA)r}ryrUrrWrr)rr}atomlistr>r>r?rszAddrlistClass.getatomcCsg}x|jt|jkr|j|j|jkr8|jd7_q|j|jdkrX|j|jq|j|jdkrz|jj|jq|j|j|jkrPq|j|j |jqW|S)zParse a sequence of RFC 2822 phrases. A phrase is a sequence of words, which are in turn either RFC 2822 atoms or quoted-strings. Phrases are canonicalized by squeezing all runs of continuous whitespace into one space. rArtr) ryrUrr|rWrrrr~r)rrr>r>r?rszAddrlistClass.getphraselist)T)N)__name__ __module__ __qualname____doc__rrrrrrrrrrrrrr>r>r>r?rws; ! % rwc@sHeZdZdZddZddZddZdd Zd d Zd d Z ddZ dS) AddressListz@An AddressList encapsulates a list of parsed RFC 2822 addresses.cCs&tj|||r|j|_ng|_dS)N)rwrr addresslist)rrr>r>r?rs  zAddressList.__init__cCs t|jS)N)rUr)rr>r>r?__len__szAddressList.__len__cCsBtd}|jdd|_x$|jD]}||jkr |jj|q W|S)N)rrrW)rothernewaddrxr>r>r?__add__s   zAddressList.__add__cCs*x$|jD]}||jkr|jj|qW|S)N)rrW)rrrr>r>r?__iadd__ s  zAddressList.__iadd__cCs2td}x$|jD]}||jkr|jj|qW|S)N)rrrW)rrrrr>r>r?__sub__s   zAddressList.__sub__cCs*x$|jD]}||jkr|jj|qW|S)N)rremove)rrrr>r>r?__isub__s  zAddressList.__isub__cCs |j|S)N)r)rrYr>r>r? __getitem__ szAddressList.__getitem__N) rrrrrrrrrrrr>r>r>r?rs ripii ipii iDiiiD)r __future__rrrrZfuture.builtinsr__all__rorqrr COMMASPACErXrSr]r r:rrr objectrwrr>r>r>r?sB        u   &