3
NZ              #   @   s  d dl T ddlZddlZddlZddlZddlZddlZddlZg Zy,ddlZej	ej
df ej	ejdf W n   Y nX y<ddlZej	ejdf ej	ejdf ej	ejdf W n   Y nX y<ddlZej	ejdf ej	ejdf ej	ejdf W n   Y nX yddlZej	ejd	f W n   Y nX ej	d| ej	d} edd eD Zdd ZejdZejdZejdZdd Zdd Zdd Zdd Z ddddgZ!dd  Z"d!d" Z#d#d$ Z$G d%d& d&e%Z&G d'd( d(Z'G d)d* d*Z(G d+d, d,Z)d-d. Z*d/d0 Z+d1d2 Z,e+e,fZ-d3d4 Z.d5d6 Z/d~d8d9Z0dd;d<Z1dd=d>Z2dd@dAZ3dBdC Z4dDdE Z5dFdG Z6dHdI Z7dJdKdLdMdNdOdPdQZ8dRdS Z9dTdU Z:ddVdWZ;dXdY Z<dZd[ Z=d\d] Z>d^d_ Z?dZ@ddkdlZAe+d dme2e3e6e7e9e:e;dn
ZBeBjC ZDe,eDdo< dpeDdq< eDjC ZEe4eEdd< eDjC ZFdreFds< eFjC ZGeGdd= eGjHe<e=e>e?dt dueBdvdweDdvdxeEdvdyeFdvdzeGdvd{ZIdS )   )*    NZutf_64utf_32utf_16	utf_16_be	utf_16_leutf_8 B E G I N : V C A R DB E G I N : V C A R D c             C   s   g | ]\}}t |qS  )len).0bomcodecr   r   /usr/share/hplip/base/vcard.py
<listcomp>X   s    r   c             C   sR   t | d}|jt}x2tD ]*\}}|j|rtjtj | d|j S qW t | dS )zThis function detects unicode byte order markers and if present
    uses the codecs module instead to open the file instead with
    appropriate unicode decoding, else returns the file using standard
    open functionrbrZrtU)openread
_maxbomlen_boms
startswithioStringIOcodecs)namefstartr   r   r   r   r   opentextfileZ   s    


r   z[^0-9]*z^[0-9]{10}$z
^[0-9]{7}$c             C   s,   | S t|dkr(|d dkr(|dd  S | S )N 
      r   1r   )joinresplit
_notdigitsr   )nZnumsr   r   r   phonenumber_normalisep   s       r)   c             C   sf   t jt| d k	r6d| dd | dd | dd  f S t jt| d k	rbd| d d | dd  f S | S )Nz
(%s) %s-%sr         z%s-%s)r%   match
_tendigits_sevendigits)r(   r   r   r   phonenumber_format}   s
    &r/   c             C   s   t | }|r|S | jddS )z>like L{formatname}, except we use the first matching componentnicknamer    )nameparser_getfullnameget)r   Z	_fullnamer   r   r   nameparser_formatsimplename   s    r3   c             C   s(   d| kr| d S dj dd t| D S )z>Gets the full name, joining the first/middle/last if necessaryfull c             S   s   g | ]}|r|qS r   r   )r   xr   r   r   r      s    z*nameparser_getfullname.<locals>.<listcomp>)r$   nameparser_getparts)r   r   r   r   r1      s    r1   ZvanZvonZdeZdic             C   s   | j d}|j }t|dkr(|ddfS t|dkrF|d d|d fS |d g}g }|d g}|d= |d= xLt|r|d	 d j |d
 d ks|d j tkr|d g| }|d= qlW |}dj|dj|dj|fS )Nr4   r   r       r   r5   r9   r9   r9   r9   r9   r9   )r2   r&   r   lower	lastpartsr$   )r   r(   partsr   mlr   r   r   nameparser_getparts_FML   s     



6
r?   c             C   s   | j d}|jd}t|dkr*|ddfS |d }d}d}|d j }t|dkrx|d }t|dkrxdj|dd  }|||fS )Nr4   ,r   r    r   r5   )r2   r&   r   r$   )r   r(   r<   Z_lastZ_firstZ_middler   r   r   nameparser_getparts_LFM   s    


rA   c             C   st   x6dD ].}|| kr| j dd| j dd| j ddfS qW d| krR| j ddddfS | jd}d|krlt| S t| S )	zfReturns (first, middle, last) for name.  If the part doesn't exist
    then a blank string is returnedfirstmiddlelastr    r4   r0   r@   )rB   rC   rD   )r2   Znameparser_getrA   r?   )r   ir(   r   r   r   r7      s    
&
r7   c               @   s   e Zd ZdS )VFileExceptionN)__name__
__module____qualname__r   r   r   r   rF      s   rF   c               @   sD   e Zd ZddiZdd Zdd Zdd Zd	d
 Zdd Zdd Z	dS )VFileZ	MACINTOSHZ	MAC_ROMANc             C   s   || _ d | _d S )N)sourcesaved)selfrK   r   r   r   __init__  s    zVFile.__init__c             C   s   | S )Nr   )rM   r   r   r   __iter__  s    zVFile.__iter__c             C   s2  x(| j  }|d krt t|dkrP qW d}|jd}|dkr|d | j jd}d|ksfd|krd}xb|d d	ks|d d	kr|d d	krd}nd}| j  }|d d kr|dd  }|d | | }qlW x^|r,| j }|d krP t|dk rP |d dkr|d dkrP || j  dd  7 }qW |jd}|dk r`tjd|  t|}|d7 }|d | }||d d  j	 }|j
 jd}	g }
t|trd }nd}x|	D ]}|jdr|dd  pd}q|jd r|dk r|
j| qyJ|dks|dkrtj|}n&|dkr8tj|}d }ntd| W nJ tk
r } z,t|trj|tdt|||f W Y d d }~X nX qW t|
dkrtd|f |d k	r
y$tj| jj||}||\}}W n& tk
r   td||f Y nX |
dgks"|
dgkr*|j
 }|
|fS )!Nr   T:;zquoted-printablezencoding=quoted-printableFr   =r8   	r5   zFixing up bad line: %szLATIN-1zCHARSET=   z	ENCODING=zQUOTED-PRINTABLEzENCODING=QUOTED-PRINTABLEz
ENCODING=Bzunknown encoding: z6Exception %s while processing encoding %s on data '%s'zLine contains no property: %sz+unknown character set '%s' in parameters %sBEGINENDr9   r9   r9   rW   )rS   r5   )_getnextlineStopIterationr   findr:   r&   
_lookaheadlogdebugstripupper
isinstancestrr   appendquopriZdecodestringbase64rF   	Exceptionr   
getdecoder_charset_aliasesr2   LookupError)rM   lineZnormalcontinuationsZcolonsrE   ZnextlZnextlineZb4itemsZnewitemscharsetedecoder_r   r   r   __next__  s    
 





.
zVFile.__next__c             C   s&   | j d k	r| j }d | _ |S | j S d S )N)rL   _readandstripline)rM   ri   r   r   r   rX     s
    
zVFile._getnextlinec             C   sf   | j j }|d k	rbt|dkr"d S |dd  dkr>|d d S |d	 dksV|d
 dkrb|d d S |S )Nr   r8   z
r   
rW   rW   r9   r9   r9   )rK   readliner   )rM   ri   r   r   r   rq     s    
zVFile._readandstriplinec             C   s   | j d kst| j | _ | j S )N)rL   AssertionErrorrq   )rM   r   r   r   r[     s    
zVFile._lookaheadN)
rG   rH   rI   rg   rN   rO   rp   rX   rq   r[   r   r   r   r   rJ      s   u	rJ   c               @   s(   e Zd ZdZdd Zdd Zdd ZdS )	VCardszUnderstands vcards in a vfilec             C   s
   || _ d S )N)vfile)rM   rw   r   r   r   rN     s    zVCards.__init__c             C   s   | S )Nr   )rM   r   r   r   rO     s    zVCards.__iter__c             C   s   d  }}x,| j D ]"\}}||fdgdfkr,qd}P qW ||fdgdfkrNt g }x6| j D ],\}}||fdgdfkr|j||f qZP qZW ||fdgdfkrtdt|S )NrU   VCARDTrV   z'There is a BEGIN:VCARD but no END:VCARD)rw   rY   rb   rF   VCard)rM   fieldvaluefoundlinesr   r   r   rp     s"    zVCards.__next__N)rG   rH   rI   __doc__rN   rO   rp   r   r   r   r   rv     s   rv   c               @   sD  e Zd ZdZdd Zdd ZdDddZd	d
 Zdd Zdd Z	dd Z
e
Ze
Ze
Ze
Ze
Ze
Ze
Ze
Ze
Ze
Zdd Zdd Zdd Zdd Zdd Zdd ZeZdd ZeZdd  Zd!d" Zd#d$ Z d%d& Z!dEd(d)Z"dFd*d+Z#d,d- Z$d.d/ Z%e$Z&d0d1 Z'd2d3 Z(d4d5 Z)d6d7 Z*dGd9d:Z+d;d< Z,d=d> Z-d?d@ Z.dAdB Z/dCS )Hry   zA single vcardc             C   s  d| _ d | _i | _i | _g | _xz|D ]p\}}t|s<t|dgkrLd| _|d jdr||d jdsv|d jdr|d| _t|r|d j	d	|d j	d
  kodkn  rd| _
|dgkr
|jd}ydd |D }W n" tk
r    t|d Y nX || _ q&|d dkr*ddg|dd< n^|d dkrJddg|dd< n>|d dkrjddg|dd< n|d dkrddg|dd< | jj||f q&W | j| j| j | j| j d S )Nr8   r   zX-EVOLUTION-FILE-ASZ	evolutionZITEMz.X-ABADRz
.X-ABLABELapplez>!$_z_$!<VERSION.c             S   s   g | ]}t |qS r   )int)r   Zxxr   r   r   r     s    z"VCard.__init__.<locals>.<listcomp>z is not a valid vcard versionzHOME.TELTELHOMEr   z
HOME.LABELZLABELzWORK.TELWORKz
WORK.LABEL)r8   r   )_version_origin_data_groupsr}   r   ru   r   endswithrZ   originr&   
ValueErrorrF   rb   _parse_update_groups)rM   r}   r   vZverr   r   r   rN     s@    
*4
zVCard.__init__c             C   s   | j S )z2Returns a dict of the data parsed out of the vcard)r   )rM   r   r   r   getdata  s    zVCard.getdatar    c             C   s   | j j||S )N)r   r2   )rM   keydefaultr   r   r   r2     s    z	VCard.getc             C   s@   ||kr|S x.t ddD ] }|t| |kr|t| S qW dS )zReturns the fieldname to use in the dict.

        For example, if name is "email" and there is no "email" field
        in dict, then "email" is returned.  If there is already an "email"
        field then "email2" is returned, etcr8   i N)rangerepr)rM   r   dictrE   r   r   r   _getfieldname  s
    zVCard._getfieldnamec             C   s   x|D ]x\}}t |j dkr qd|d krL|d |d jdd d  }n|d }|jdd}t| d| | j}|||| qW d S )Nr   r   r   -ro   Z_field_)r   r^   rZ   replacegetattr_default_field)rM   r}   resultrz   r{   r   tfuncr   r   r   r     s     zVCard._parsec             C   s0   x*t | jj D ]\}}| j|f|  qW dS )zUpdate the groups info N)listr   rk   	_setvalue)rM   r   krm   r   r   r   r   #  s    zVCard._update_groupsc             C   s   d S )Nr   )rM   rz   r{   r   r   r   r   _field_ignore+  s    zVCard._field_ignorec             C   s   | j ||| jd|< d S )Nr   )unquoter   )rM   rz   r{   r   r   r   r   	_field_FN=  s    zVCard._field_FNc             C   s   | j ||| jd|< d S )Ntitle)r   r   )rM   rz   r{   r   r   r   r   _field_TITLEA  s    zVCard._field_TITLEc             C   s   | j ||| jd|< d S )Nr0   )r   r   )rM   rz   r{   r   r   r   r   _field_NICKNAMEE  s    zVCard._field_NICKNAMEc             C   s   | j ||| jd|< d S )NZnotes)r   r   )rM   rz   r{   r   r   r   r   _field_NOTEJ  s    zVCard._field_NOTEc             C   s   | j ||d< d S )NZuid)r   )rM   rz   r{   r   r   r   r   
_field_UIDN  s    zVCard._field_UIDc       	      C   s  | j |}d  } } } }}y,|d }|d }|d }|d }|d }W n tk
r^   Y nX |d k	rt|r||| jd|< |d k	rt|r||| jd|< |d k	rt|r||| jd|< |d k	rt|r||| jd	|< |d k	ot|r||| jd
|< d S )Nr   r   r8   r*      z	last namez
first namezmiddle nameprefixsuffix)splitandunquote
IndexErrorr   r   )	rM   rz   r{   r   Z
familynameZ	givennameZadditionalnamesZhonorificprefixesZhonorificsuffixesr   r   r   _field_NV  s(    
zVCard._field_Nc             C   sP   | j |}t|r&|d || jd|< x$|dd  D ]}||| jd|< q4W d S )Nr   Zorganisationr   zorganisational unit)r   r   r   )rM   rz   r{   r   r   r   r   r   
_field_ORGu  s
    
zVCard._field_ORGc             C   s   | j |}g }xF|dd  D ]6}|jdrB|tdd  jd}n|g}|j| qW d }x0|D ](}|dkrpd}|dkr|d}|dkr`d S q`W d	|k}	|d kr| j|d
||	 n||d}
| j|d
|
|	 d S )Nr   zTYPE=r@   r   homer   businessZX400PREFemail)r   type)r   r   r   r&   extendr   )rM   rz   r{   r   typesr   ffr   r   	preferredaddrr   r   r   _field_EMAIL  s(    



zVCard._field_EMAILc             C   s   | j |}g }xF|dd  D ]6}|jdrB|tdd  jd}n|g}|j| qW d }x$|D ]}|dkrpd}|dkr`d}q`W d|k}	|d kr| j|d	||	 n||d
}
| j|d	|
|	 d S )Nr   zTYPE=r@   r   r   r   r   r   url)r   r   )r   r   r   r&   r   r   )rM   rz   r{   r   r   r   r   r   r   r   r   r   r   r   
_field_URL  s$    



zVCard._field_URLc             C   s^   d|d kr(|d d |d j d }nd }|d kr@tjd n| j|ddt|i|d d S )Nr   r   zspeeddial has no groupphone	speeddialF)rZ   r\   r]   _setgroupvaluer   )rM   rz   r{   r   groupr   r   r   _field_X_SPEEDDIAL  s    zVCard._field_X_SPEEDDIALc                sr  | j |}d|d kr2|d d |d jd }nd }g }xF|dd  D ]6}|jdrn|tdd  jd}n|g}|j| qHW dddddd  fd	d
|D }dd
 |D }dddg}d|krd}	n d}	x|D ]}||krd}	P qW d|k}
d}d}d|krd}d|krd}t|dks0|dgkr4d}t|}|r`|	r`| j|dd|d||
 |r|	r| j|dd|d||
 | r| rd|kr| j|dd|d||
 nP|rd|kr| j|dd|d||
 |rd|kr| j|dd|d||
 d|kr*| j|dd|d||
 d|krL| j|dd|d||
 d|krn| j|dd|d||
 d S )Nr   r   r   zTYPE=r@   DATACELL)ZBBSMODEMZISDNZCARZPCSc                s   g | ]} j ||qS r   )r2   )r   r   )munger   r   r     s    z$VCard._field_TEL.<locals>.<listcomp>c             S   s   g | ]}|d
kr|qS )r   r   MSGr   VOICEFAXr   VIDEOPAGERr   )
r   r   r   r   r   r   r   r   r   r   r   )r   r   r   r   r   r     s    r   r   r   TFr   r   r   r   r   )r   numberr   faxzbusiness faxzhome faxcellpagerdata)r   rZ   r   r   r&   r   r)   r   )rM   rz   r{   r   r   r   r   r   Z	antivoiceZvoicer   ZisworkZishomer   )r   r   
_field_TEL  s    















zVCard._field_TELFc             C   s   |dkr| j ||||S | jj|d}|dkr@|||g| j|< n>||d krdtjd||td f  |rpd|d< |d j| dS )z) Set value of an item of a group
        Nr   z$Group %s has different types: %s, %sTr8   r   )r   r   r2   r\   r]   Zgroups_typeupdate)rM   r   r   r{   r   r   Z
group_typer   r   r   r   9  s    zVCard._setgroupvaluec       	      C   s   ||kr|||< d S |s,||| j ||< d S |g}xFdgttdd D ].}|t| |krt|j||t|   qHP qHW dgttdt|d  }x,tt|D ]}|| ||t||  < qW d S )Nr    r8   c   r   )r   r   r   ra   rb   r   )	rM   r   r   r{   r   valuesr   suffixesr>   r   r   r   r   P  s    zVCard._setvaluec             C   sf   | j |dd}dd |D }dd |D }|jdd }|rTdj|dj|g|d< ndj||d< d S )Nr@   )	seperatorc             S   s   g | ]}|j d dj qS )rQ   r    )r   r^   )r   r   r   r   r   r   k  s    z+VCard._field_CATEGORIES.<locals>.<listcomp>c             S   s   g | ]}t |r|qS r   )r   )r   r   r   r   r   r   l  s    
categoriesrQ   )r   r2   r$   )rM   rz   r{   r   r   r   r   r   r   _field_CATEGORIESh  s    zVCard._field_CATEGORIESc             C   sD   | j |dd}dd |D }dd |D }dj||| jd|< d S )Nr@   )r   c             S   s   g | ]}|j d dj qS )rQ   r    )r   r^   )r   r   r   r   r   r   y  s    z&VCard._field_SOUND.<locals>.<listcomp>c             S   s   g | ]}t |r|qS r   )r   )r   r   r   r   r   r   z  s    rQ   	ringtones)r   r$   r   )rM   rz   r{   r   r   r   r   r   _field_SOUNDv  s    zVCard._field_SOUNDc             C   s  d}d}xb|dd  D ]R}|j dr<|tdd  jd}n|g}x$|D ]}|dkrXd}|dkrHd	}qHW qW | j|}d  }	 }
 } } } }}y<|d
 }	|d }
|d }|d }|d }|d }|d }W n tk
r   Y nX i }|	d k	ot|	r|	|d< |
d k	rt|
r|
|d< |d k	r:t|r:||d< |d k	rVt|rV||d< |d k	rrt|rr||d< |d k	rt|r||d< |d k	rt|r||d< t|r||d< | j|d|| d S )NFr   r   zTYPE=r@   r   r   r   Tr   r8   r*   r      r+   poboxstreet2streetcitystate
postalcodecountryr   Zaddress)r   r   r&   r   r   r   )rM   rz   r{   r   r   r   r   r   r6   r   ZextendedaddressZstreetaddressZlocalityZregionr   r   r   r   r   r   
_field_ADR  sR    



zVCard._field_ADRc             C   s   |d j d}|d }t|dkr,|d }nd}|jdsD|jdrV| jdg|| n0|dksf|dkrx| jdg|| ntjd	|  d S )
Nr   r   r   r    zX-PALM-CATEGORY
CATEGORIESzX-PALM-NICKNAMENICKNAMEzIgnoring PALM custom field: %s)r&   r   r   r   r   r\   r]   )rM   rz   r{   r   r   f0f1r   r   r   _field_X_PALM  s    
zVCard._field_X_PALMc             C   s   |d j d}|d }t|dkr,|d }nd}|jdsD|jdrV| j||| d S |jdsj|jdr|tjd|  d S tjd||d d	 f  d S )
Nr   r   r   r    zX-PALM-zX-zIgnoring custom field: %szNo idea what to do with %s (%s)P   )r&   r   r   r   r\   r]   )rM   rz   r{   r   r   r   r   r   r   r   r     s    
zVCard._default_fieldc             C   s4   |j ddj ddj ddj ddj ddj d	dS )
Nz\;rQ   z\,r@   z\nrs   z\r\nz
rr   )r   )rM   r{   r   r   r   r     s    zVCard.unquoterQ   c                s   |j d| dk r* fdd|j|D S g }d}d}xr|t|k r|| |krh|j| d}|d7 }q8|| dkr||||d  7 }|d7 }q8||| 7 }|d7 }q8W t|r|j|  fdd|D S )	N\r   c                s   g | ]} j |qS r   )r   )r   r   )rM   r   r   r     s    z)VCard.splitandunquote.<locals>.<listcomp>r    r   r8   c                s   g | ]} j |qS r   )r   )r   r   )rM   r   r   r     s    )rZ   r&   r   rb   )rM   r{   r   resZbuildr   r   )rM   r   r     s(    

zVCard.splitandunquotec             C   s   | j S )zBest guess as to vcard version)r   )rM   r   r   r   version  s    zVCard.versionc             C   s   | j S )z-Best guess as to what program wrote the vcard)r   )rM   r   r   r   r     s    zVCard.originc             C   s
   | j | S )N)r   )rM   itemr   r   r   __getitem__  s    zVCard.__getitem__c             C   s
   t | jS )N)r   r   )rM   r   r   r   __repr__  s    zVCard.__repr__N)r    )F)F)rQ   )0rG   rH   rI   r~   rN   r   r2   r   r   r   r   Z_field_LABELZ_field_BDAYZ_field_ROLEZ_field_CALURIZ_field_CALADRURIZ_field_FBURLZ
_field_REVZ
_field_KEYZ_field_SOURCEZ_field_PHOTOr   r   r   r   r   r   Z_field_NAMEr   Z_field_Or   r   r   r   r   r   r   r   Z_field_CATEGORYr   r   r   r   r   r   r   r   r   r   r   r   r   ry     sZ   2
	"i

;

!ry   c             C   s   t j| jddjddS )zTMy own routine to do qouted printable since the builtin one doesn't encode CR or NL!rr   z=0Drs   z=0A)rc   encodestringr   )r{   r   r   r   myqpencodestring"  s    r   c             C   s   | j ddj ddj ddS )zJReturn a vCard v2 string.  Any embedded commas or semi-colons are removed.r   r    r@   rQ   )r   )r{   r   r   r   format_stringv2'  s    r   c             C   s   | j ddj ddj ddS )zOReturn a vCard v3 string.  Embedded commas and semi-colons are backslash quotedr   r    r@   z\,rQ   z\;)r   )r{   r   r   r   format_stringv3,  s    r   c             C   s   t j| j S )zReturn base 64 encoded string)rd   r   rstrip)r{   r   r   r   format_binary4  s    r   c             C   s   t | tf tg fS )zDetermine if v is a sequence such as passed to value in out_line.
    Note that a sequence of chars is not a sequence for our purposes.)r`   r   )r   r   r   r   _is_sequence:  s    r   rQ   c             C   s  |dkrg }nt |dd }|tkrt|rd}x&|D ]}||}t||kr8d}P q8W |rv|jd dd |D }|j|}q||}t||k}|rt|}|jd nt| st|dk	r||}dj| g| d }|t|d	d	t| 7 }|d dks
t|d S )a  Returns a single field correctly formatted and encoded (including trailing newline)

    @param name:  The field name
    @param attributes: A list of string attributes (eg "TYPE=intl,post" ).  Usually
                  empty except for TEL and ADR.  You can also pass in None.
    @param value: The field value.  You can also pass in a list of components which will be
                  joined with join_char such as the 6 components of N
    @param formatter:  The function that formats the value/components.  See the
                  various format_ functions.  They will automatically ensure that
                  ENCODING=foo attributes are added if appropriateNFTzENCODING=QUOTED-PRINTABLEc             S   s   g | ]}t |qS r   )r   )r   r   r   r   r   r   \  s    zout_line.<locals>.<listcomp>rQ   rP   F   r   rs   r9   )	r   _string_formattersr   r   rb   r$   ru   _line_reformatr   )r   Z
attributesr{   	formatter	join_charZqpr   r   r   r   r   out_line@  s6    

r   r   c             C   s   |dkr|}t | |k r| S d}|dkrD|| d| 7 }| |d } x:t | r~|d| d|  7 }t | |k rpP | |d } qFW |S )a  Takes line string and inserts newlines
    and spaces on following continuation lines
    so it all fits in width characters

    @param width: how many characters to fit it in
    @param firstlinewidth: if >0 then first line is this width.
         if equal to zero then first line is same width as rest.
         if <0 then first line will go immediately to continuation.
         r   r    Nz
 )r   )ri   widthZfirstlinewidthr   r   r   r   r   r  s    

r   c       	   
   C   s   d}xz| d | D ]j}|t dd t||7 }t|\}}}|t dd |||ddf|7 }|jdd}t|r|t dd ||7 }qW |S )Nr    ZFNNr0   r   )r   r3   r7   r2   r   )	valsr   limitr   r   r   r=   r>   Znnr   r   r   	out_names  s    r   r   c             C   s,   dd | D }t |r(t|d ||ddS dS )Nc             S   s   g | ]}|j d qS )category)r2   )r   r   r   r   r   r     s    z"out_categories.<locals>.<listcomp>r@   )r   r    )r   r   )r   r   rz   Zcatsr   r   r   out_categories  s    r  c             C   s   t | |ddS )NCATEGORY)rz   )r  )r   r   r   r   r   out_categories_apple  s    r  c       	      C   s   d}d}x| D ]}|j |}|j dd}t|rR|dkr<d}|j }|rZ|d }n|rZd}t|r~d| dd	g|d
k  g}nd }|t||||7 }d}qW |S )Nr    Tr   r   Zworkz,PREFr   zTYPE=z	,INTERNETEMAILF)r2   r   r_   r   )	r   r   rz   Zbpkeyr   rB   r   valr   r   r   r   out_eu  s&    


r  c             C   s   t | |ddS )Nr  r   )r  )r   r   r   r   r   
out_emails  s    r  c             C   s   t | |ddS )NURLr   )r  )r   r   r   r   r   out_urls  s    r
  r   r   r   r   r   r   r   )r   Zofficer   r   r   r   Znonec             C   s   dd dgt tdt| d  D }d}d}d}x| D ]}|jdd }|d kr|td	d
t|d  d| f gt|d |7 }n^|t|| d d
t|d  d| f gt|d |7 }|t|| d d t||7 }|d7 }d}q8W |S )Nc             S   s   g | ]}d t | qS )r   )ra   )r   r6   r   r   r   r     s    zout_tel.<locals>.<listcomp>r    r8   r   Tr   r   r   z	TYPE=%s%sr   ,PREFr   z.TELz.X-SPEEDDIALF)r    r  )r    r  )r   r   r   r2   r   _out_tel_mappingr/   ra   )r   r   Zphonesr   rB   idxr   Zspr   r   r   out_tel  s"    &
r  c                s   d}d}x| D ]x  j dd}t|r8|tdd ||7 } j ddkrLd}nd}d	| d|  }|td|g fdddD |7 }d}qW |S )Nr    TZcompanyZORGr   r   r   r   zTYPE=,PREFADRc                s   g | ]} j |d qS )r    )r2   )r   r   )r   r   r   r   
  s    zout_adr.<locals>.<listcomp>r   r   r   r   r   r   F)r    r  )Nr   r   r   r   r   r   )r2   r   r   )r   r   r   rB   or   r   )r   r   out_adr  s    
"r  c                s    dj  fdd| d | D S )Nr    c                s   g | ]}t d d|d  qS )ZNOTENmemo)r   )r   r   )r   r   r   r     s    zout_note.<locals>.<listcomp>)r$   )r   r   r   r   )r   r   out_note  s    r  c          
   C   sb   d}t | dk}|rd}nd}x>| D ]6}|td|d|t|d  f gt|d |7 }d}q$W |S )	Nr    r   zPREF,r   z	TYPE=%s%sr   r   F)r   r   r  r/   )r   r   r   Z_prefrj   r   r   r   r   out_tel_scp6600  s    
r  c             C   sP   d}xFt tt| dD ]0}| | }|jdd r|tddg|d |7 }qW |S )Nr    r8   r   r  zTYPE=INTERNET)r   minr   r2   r   )r   r   r   Z_idxr   r   r   r   out_email_scp6600(  s    
r  c             C   s.   | r*| d j dd r*tdd | d d |S dS )Nr   r   r	  r    )r2   r   )r   r   r   r   r   out_url_scp6604  s    r  c                sL   xF| D ]>  j dd dkr d}nd}tdd| g fdddD |S W dS )Nr   r   r   r   r  zTYPE=%sc                s   g | ]} j |d qS )r    )r2   )r   r   )r   r   r   r   A  s    z#out_adr_scp6600.<locals>.<listcomp>r   r   r   r   r   r   r    )Nr   r   r   r   r   r   )r2   r   )r   r   Z_typer   )r   r   out_adr_scp6600:  s    
r  names
wallpapers	addressesnumbersr   emailsurlsr   flagsmemosserialsc       	         s  dr& d k	r&t dd  D dks&t|d }|j }|jtdd dd  |jtdd |d	 d   d krpt}n fd
dtD }xt|D ]l}|| kr||kr|| }d|jjd |jj kr|| | ||d d}n|| | |}t |r|j| qW |jtdd d| |j	 S )NTc             S   s   g | ]}|t kr|qS r   )_field_order)r   r   r   r   r   r   Q  s    z output_entry.<locals>.<listcomp>r   
_formatterrU   rx   r   r   c                s   g | ]}| kr|qS r   r   )r   r   )limit_fieldsr   r   r   [  s    r   _limit)r   rV   )
r   ru   r   writer   r#  __code__co_varnamesco_argcountgetvalue)	entryprofiler%  Zfmtr   Zfieldsr   r   r}   r   )r%  r   output_entryM  s&    
r.  z2.1)
r$  r&  r   r  r   r  r  r  r  r!  r$  z3.0r   i r&  )r  r  r  r  z
vCard v2.1)Zdescriptionr-  z
vCard v3.0ZApplezFull vCard v3.0zSanyo SCP-6600 (Katana))Zvcard2Zvcard3r   Zfullv3Zscp6600)r	   r   )r
   r   )rQ   )r   r   )r   )r   )r   )r  r  r  r  r   r  r  r   r   r!  r"  )N)Jgrc   rd   r   r   r%   r   Zencodings.utf_64Z	encodingsrb   BOM64_BEBOM64_LEZencodings.utf_32	BOM_UTF32BOM_UTF32_BEBOM_UTF32_LEZencodings.utf_16	BOM_UTF16BOM_UTF16_BEBOM_UTF16_LEZencodings.utf_8BOM_UTF8maxr   r   compiler'   r-   r.   r)   r/   r3   r1   r;   r?   rA   r7   re   rF   rJ   rv   ry   r   r   r   r   r   r   r   r   r   r  r  r  r  r
  r  r  r  r  r  r  r  r  r#  r.  Zprofile_vcard2copyZprofile_vcard3Zprofile_appleZprofile_fullZprofile_scp6600r   Zprofilesr   r   r   r   <module>#   s       




 #*    \
2



 
 
