B -_@sdZddlZddlZddgZddZddZdd Zd d Zd d ZddZ ddZ ddgfddZ d ddZ gfddZ ddZddZddZedkredS)!z%Mailcap file handling. See RFC 1524.Ngetcaps findmatchcCsd|krd|dfSdSdS)Nlinenor)r)entryrr/usr/lib/python3.7/mailcap.pylineno_sort_key s r c Csi}d}xtD]}yt|d}Wntk r8wYnX|t||\}}WdQRXx6|D]*\}}||kr||||<qb|||||<qbWqW|S)aReturn a dictionary containing the mailcap database. The dictionary maps a MIME type (in all lowercase, e.g. 'text/plain') to a list of dictionaries corresponding to mailcap entries. The list collects all the entries for that MIME type from all available mailcap files. Each dictionary contains key-value pairs for that MIME type, where the viewing command is stored with the key "view". rrN)listmailcapfilesopenOSError_readmailcapfileitems)capsrZmailcapfpZmorecapskeyvaluerrrrs   cCsPdtjkr"tjd}|tj}n*dtjkr8tjd}nd}|ddddg}|S)z7Return a list of all mailcap files found on the system.ZMAILCAPSHOME.z /.mailcapz /etc/mailcapz/usr/etc/mailcapz/usr/local/etc/mailcap)osenvironsplitpathsep)ZpathstrZmailcapsZhomerrrr -s    r cCs tdtdt|d\}}|S)z?Read a mailcap file and return a dictionary keyed by MIME type.z2readmailcapfile is deprecated, use getcaps insteadN)warningswarnDeprecationWarningr)rr_rrrreadmailcapfile?src Csi}x|}|sP|ddks|dkr.q|}x4|dddkrf|}|sTd}|dd|}q4Wt|\}}|r|s~q|dk r||d<|d 7}|d }x$tt|D]}||||<qWd |}||kr|||q|g||<qW||fS) aRead a mailcap file and return a dictionary keyed by MIME type. Each MIME type is mapped to an entry consisting of a list of dictionaries; the list will contain more than one such dictionary if a given MIME type appears more than once in the mailcap file. Each dictionary contains key-value pairs for that MIME type, where the viewing command is stored with the key "view". r#Nz\  rr/) readlinestrip parselinerrangelenjoinlowerappend) rrrlineZnextlinerfieldstypesjrrrrGs6   rc Csg}dt|}}x.||kr@t|||\}}|||d}qWt|dkrRdS|d|d|dd}}}d|i}x^|D]V}|d}|dkr|}d} n$|d|}||dd} ||krq| ||<qW||fS) zParse one entry in a mailcap file and return a dictionary. The viewing command is stored as the value with the key "view", and the rest of the fields produce key-value pairs in the dict. rrr)NNNview=r!)r) parsefieldr,findr&) r-r.infieldrr1restZfkeyZfvaluerrrr'ps*        r'cCsT|}x:||kr>||}|dkr"Pq|dkr4|d}q|d}qW||||fS)z/Separate one key-value pair in a mailcap entry.;\rr)r&)r-r5r6startcrrrr3s   r3r1z /dev/nullc Csbt|||}xP|D]H}d|krBt|d||}|rBt|dkrBqt|||||}||fSWdS)aFind a match for a mailcap entry. Return a tuple containing the command line, and the mailcap entry used; (None, None) if no match is found. This may invoke the 'test' command of several matching entries before deciding which entry to use. testr)NN)lookupsubstrsystem) rMIMEtyperfilenameplistentrieser=commandrrrrs   cslg}||kr|||}|d}|dd}||krB|||}dk r\fdd|D}t|td}|S)Nr$rz/*csg|]}|kr|qSrr).0rE)rrr szlookup..)r)rsortedr )rrArrDZ MIMEtypesr)rrr>s     r>c Cs d}dt|}}x||kr||}|d}|dkr`|dkrV|||d}|d}||}q||}|d}|dkr||}q|dkr||}q|dkr||}q|dkr|}x ||kr||d kr|d}qW|||} |d}|t| |}q|d|}qW|S) Nr!rr%r:st{})r) findparam) r7rArBrCZresr5r6r<r;namerrrr?s6       r?cCsF|d}t|}x,|D]$}|d||kr||dSqWdS)Nr2r!)r+r))rPrCr6prrrrOs   rOc Csddl}t}|jdds(t|dSxtdt|jdD]}|j||d}t|dkrjtddS|d}|d}t||d|\}}|stdtqr?rOr=rT__name__rrrrs$ )