B
    de                 @   s  d dl mZmZmZ d dlmZmZ d dlmZ d dl	Z	d dl
Z
d dlZd dlmZ d dlmZ yd dlmZ W n  ek
r   d dlmZ Y nX d dlmZ d d	lmZ d d
lmZ d dlmZ d dlZG dd deZG dd deZG dd deZG dd deZG dd deZdd Zdd Z d dl!Z!dZ"de" Z#de" Z$de" Z%e!&de$ Z'e!&de# Z(e!&d e"e#f Z)e!&d!e$ Z*e!&d"e!j+Z,d#d$ Z-dS )%    )absolute_importdivisionprint_function)OrderedDict
OrderedSet)SorryN)	cStringIO)Counter)MutableMapping)flex)range)zip)string_typesc               @   s   e Zd Zd(ddZdd Zdd Zdd	 Zd)d
dZdd Zdd Z	dd Z
dd Zdd ZeZdd Zdd Zd*ddZdd  Zd+d!d"Zd#d$ Zd,d&d'ZdS )-cifNc             C   s@   d | _ |d k	rt|| _nt | _tdd | j D | _d S )Nc             S   s   g | ]}|  |fqS  )lower).0keyr   r   n/mnt/filia/a/genomebrowser/www/genomebrowser/fleming/tools/molprobity/modules/cctbx_project/iotbx/cif/model.py
<listcomp>   s    z cif.__init__.<locals>.<listcomp>)_errorsr   blocksdictkeys
keys_lower)selfr   r   r   r   __init__   s
    zcif.__init__c             C   s   t |  S )N)lenr   )r   r   r   r   __len__   s    zcif.__len__c             c   s   x|   D ]
}|V  q
W d S )N)r   )r   kr   r   r   __iter__    s    zcif.__iter__c             C   sF   t |tstttd| s*td| || j|< || j|	 < d S )N_z!%s is not a valid data block name)

isinstanceblockAssertionErrorrematchtag_rer   r   r   r   )r   r   valuer   r   r   __setitem__$   s
    
zcif.__setitem__c             C   s*   | j | }|d kr|S | j||S )N)r   getr   r   )r   r   defaultZ	key_lowerr   r   r   r*   +   s    zcif.getc             C   s"   |  |}|d krtd| |S )Nz!Unknown CIF data block name: "%s")r*   KeyError)r   r   resultr   r   r   __getitem__1   s    
zcif.__getitem__c             C   s"   | j | j|  = | j| = d S )N)r   r   r   )r   r   r   r   r   __delitem__7   s    zcif.__delitem__c             C   s   t | j S )N)listr   r   )r   r   r   r   r   ;   s    zcif.keysc             C   s   t tt| S )N)reprr   six	iteritems)r   r   r   r   __repr__>   s    zcif.__repr__c             C   s   t | j S )N)r   r   copy)r   r   r   r   __copy__A   s    zcif.__copy__c             C   s   t t| j|S )N)r   r5   deepcopyr   )r   memor   r   r   __deepcopy__F   s    zcif.__deepcopy__c             C   s
   t | S )N)r5   r7   )r   r   r   r   r7   I   s    zcif.deepcopy  "   Tc       	   	   C   sN   |d krt j}x:|  D ].\}}td| |d |j||||||d qW d S )Nzdata_%s)file)outindent
indent_rowdata_name_field_widthloop_format_stringsalign_columns)sysstdoutitemsprintshow)	r   r=   r>   r?   r@   rA   rB   namer#   r   r   r   rG   L   s    zcif.showc             C   s   t  }| j|d | S )N)r=   )StringIOrG   getvalue)r   sr   r   r   __str__Z   s    zcif.__str__c             C   s   |d krt j}ddlm} i | _|d kr0| }x\t| jD ]L\}}|	 }|
| || | j|| |js||jr>|j||d q>W |S )Nr   )
validation)show_warningsr=   )rC   rD   	iotbx.cifrM   r   ZErrorHandlerr2   r3   r   	__class__Zset_error_handlervalidate
setdefaulterror_countZwarning_countrG   )r   
dictionaryrN   Zerror_handlerr=   rM   r   r#   r   r   r   rQ   _   s     

zcif.validatec             C   s   | j S )N)r   )r   r   r   r   
get_errorsn   s    zcif.get_errorsFc             C   sD   t t| j ||d| _|r@x | j D ]}|j||d q*W d S )N)r   reverse)	recursiverV   )r   sortedr   rE   valuessort)r   rW   r   rV   br   r   r   rZ   q   s    zcif.sort)N)N)Nr:   Nr;   NT)TNN)FNF)__name__
__module____qualname__r   r   r    r)   r*   r.   r/   r   r4   r6   r5   r9   r7   rG   rL   rQ   rU   rZ   r   r   r   r   r      s*   

   

r   c               @   s   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Ze	ddfddZ
dd Zdd Ze	edfddZdd Zdd Zdd Zd7ddZdd Zd d! Zd8d"d#Zd9d$d%Zd&d' Zd(d) ZeZd*d+ Zd,d- Zd.d/ Zd0d1 Zd:d3d4Zd5d6 ZdS );
block_basec             C   s   i | _ i | _t | _i | _d S )N)_itemsloopsr   _setr   )r   r   r   r   r   x   s    zblock_base.__init__c             C   s   t |  S )N)r   r   )r   r   r   r   r   ~   s    zblock_base.__len__c             c   s   x|   D ]
}|V  q
W d S )N)r   )r   r   r   r   r   r       s    zblock_base.__iter__c          	   C   sj  t t|std| t|tr\|| j|< || j| < x|	 D ]}|| j| < qDW nt|t
rt|}t t|st t|st t|std| || j|< || j| < nyt| t|| |< W np tk
r@   || jkr| j|= x&| j D ]}||kr |||< q W || kr<| t|f|fd Y nX || jksZt|trf| j| d S )Nz%s is not a valid data namezInvalid data item for %s)headerdata)r%   r&   r'   r   r"   loopra   r   r   r   r   strany_print_char_requoted_string_resemicolon_string_rer`   float	TypeErrorrY   add_looprb   add)r   r   r(   r   vloop_r   r   r   r)      s8    






zblock_base.__setitem__c             C   sj   | j | |}|| jkr&| j| S x"| j D ]}||kr2|| S q2W || jkr^| j| S t|d S )N)r   r*   r   r`   ra   rY   r,   )r   r   re   r   r   r   r.      s    



zblock_base.__getitem__c             C   s   | j | |}|| jkr2| j|= | j| nz|| jkrR| j|= | j| nZ||  krx>t	| jD ].\}}||krlt
|dkr| |= n||= d S qlW t|ntd S )N   )r   r*   r   r`   rb   discardra   r   r2   r3   r   r,   )r   r   r   re   r   r   r   r/      s     


zblock_base.__delitem__Nc             C   sf   || kr|d kr|S ||| | }t |tjr4|S |d k	rJ|d| n|d k	rV|S t|gS d S )Nz%s is not a looped item)r"   r   
std_string)r   r   	key_errorvalue_errorr+   r(   r   r   r   get_looped_item   s    zblock_base.get_looped_itemc             C   s8   g }x.| D ]&}| dd }||kr&q
|| q
W |S )N.r   )splitappend)r   doner   r   r   r   	loop_keys   s    
 zblock_base.loop_keysc             c   s"   x|   D ]}| |V  q
W d S )N)rz   r*   )r   r   r   r   r   	iterloops   s    zblock_base.iterloopsc             C   sR   || kr|d kr|S ||| | }t |tjs4|S |d k	rJ|d| n|S d S )Nz%s appears as a looped item)r"   r   rr   )r   r   rs   rt   r+   r(   r   r   r   get_single_item   s    zblock_base.get_single_itemc             C   sL   g }xB| j D ]8}|| jkr&|| q|| jkr|| j|   qW |S )N)rb   r`   rx   ra   extendr   )r   r   r   r   r   r   r      s    

zblock_base.keysc             C   s   t | j S )z/Returns names of all entries that are not loops)r0   r`   r   )r   r   r   r   	item_keys  s    zblock_base.item_keysc             C   s   t tt| S )N)r1   r   r2   r3   )r   r   r   r   r4     s    zblock_base.__repr__c             K   s   |d krd S t |ts t |trBxZt|D ]\}}|| |< q,W n:| j|j | j|j |  j|jO  _| j	|j	 d S )N)
r"   r   r   r2   r3   r`   updatera   rb   r   )r   otherkwargsr   r(   r   r   r   r   
  s    zblock_base.updatec             C   s   || |< d S )Nr   )r   tagr(   r   r   r   add_data_item  s    zblock_base.add_data_itemc             C   sN   y|  | | W n4 tk
rH   |  dttt|  | Y nX d S )Nr!   )rR   rH   r   rf   hashtupler   )r   re   r   r   r   rl     s    zblock_base.add_loopc             C   s*   | j | j| |}|d kr&|S |S )N)ra   r*   r   r   )r   	loop_namer+   ro   r   r   r   get_loop   s    zblock_base.get_loopc             C   s   |  |d }|d krx|}|d dkr0|d7 }i }x0t| D ]"\}}||r<t|g||< q<W t|dkrxt|d}|d kr|S |S )Nrv   r   )rd   )r   r2   r3   
startswithr   rr   r   re   )r   r   r+   ro   lnZ
found_keysr   r(   r   r   r   get_loop_or_row&  s    

zblock_base.get_loop_or_rowc             C   s`   |  |}|d kr t| d}| }x2t|D ]$\}}||kr4||t|| q4W |S )N)rc   )	r   re   r   n_rowsr2   r3   
add_columnr   rr   )r   r   Zdefault_dictro   r   r   r(   r   r   r   get_loop_with_defaults7  s    
z!block_base.get_loop_with_defaultsc             C   s>   |   }| j |_| j |_t| j|_| j |_|S )N)rP   r`   r5   ra   rb   r   )r   newr   r   r   r6   A  s    zblock_base.__copy__c             C   sL   |   }t| j||_t| j||_t| j||_t| j||_|S )N)rP   r5   r7   r`   ra   rb   r   )r   r8   r   r   r   r   r9   K  s    zblock_base.__deepcopy__c             C   s
   t | S )N)r5   r7   )r   r   r   r   r7   S  s    zblock_base.deepcopyc             C   s   t  }| j|d | S )N)r=   )rI   rG   rJ   )r   rK   r   r   r   rL   V  s    zblock_base.__str__c             C   sv   x&t | jD ]\}}||||  qW x| j D ]}|||  q4W t| trrxt 	| j
D ]}|| q`W d S )N)r2   r3   r`   Zvalidate_single_itemra   rY   Zvalidate_loopr"   r#   
itervaluessavesrQ   )r   rT   r   r(   re   r   r   r   rQ   [  s    
zblock_base.validateFc             C   sX   t t| j ||dt| j ||d | _|rTx | j D ]}|j||d q>W d S )N)r   rV   )r   rX   r`   r   ra   rb   rY   rZ   )r   rW   r   rV   lr   r   r   rZ   d  s    zblock_base.sortc             C   sh   |   }xZ| j| jfD ]J}xDt|D ]6\}}||krT|| }||krJq&q\|||< q&|||< q&W qW |S )N)rP   r`   ra   r2   r3   )r   r   r   rE   r   r(   other_valuer   r   r   
differencen  s     
zblock_base.difference)N)N)N)FNF) r\   r]   r^   r   r   r    r)   r.   r/   r,   ru   rz   r{   
ValueErrorr|   r   r~   r4   r   r   rl   r   r   r   r6   r5   r9   r7   rL   rQ   rZ   r   r   r   r   r   r_   w   s>   	



	

r_   c               @   s   e Zd ZdddZdS )saveN  r;   Tc             C   s   |d krt j}| dkstd|d  }xp| jD ]f}| j|}|d k	rft|||  t||d q2t|d|d | j	| j
||| |d t|d q2W d S )N z%%-%isrp   )r<    )endr<   )r=   r>   rB   )rC   rD   stripr$   rb   r`   r*   rF   format_valuera   rG   )r   r=   r>   r@   rB   
format_strr   rn   r   r   r   rG   }  s    z	save.show)Nr   r;   T)r\   r]   r^   rG   r   r   r   r   r   {  s   r   c               @   sb   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdddZdddZ	dddZ
dd Zdd ZdS )r#   c             C   s   t |  i | _d S )N)r_   r   r   )r   r   r   r   r     s    
zblock.__init__c             C   sB   t |tr0|| j|< || j| < | j| nt| || d S )N)	r"   r   r   r   r   rb   rm   r_   r)   )r   r   r(   r   r   r   r)     s
    

zblock.__setitem__c             C   s6   | j | |}|| jkr&| j| S t| |S d S )N)r   r*   r   r   r_   r.   )r   r   r   r   r   r.     s    

zblock.__getitem__c             C   sB   | j | |}|| jkr2| j|= | j| nt| | d S )N)r   r*   r   r   rb   rq   r_   r/   )r   r   r   r   r   r/     s
    
zblock.__delitem__c             C   s   t | }|| j  |S )N)r_   r   r}   r   )r   r   r   r   r   r     s    
z
block.keysNc             K   s.   |d krd S t j| |f| | j|j d S )N)r_   r   r   )r   r   r   r   r   r   r     s    zblock.update  r;   Tc             C   s  |  dkst|d krtj}d|d  }x| jD ]}| j|}	|	d k	rbt|| t|	|d q2|| j	krt|d td| |d | j	| j
|||d t|d |d t|d q2| j| }
|
 dkrq2|d k	r||kr|
j
||||| |d	 n|
j
||||d
 t|d q2W d S )Nr   z%%-%isrp   )r<   zsave_%s)r=   r>   r@   Zsave_r   )r=   r>   r?   fmt_strrB   )r=   r>   r?   rB   )r   r$   rC   rD   rb   r`   r*   rF   r   r   rG   ra   r   )r   r=   r>   r?   r@   rA   rB   r   r   rn   Zlpr   r   r   rG     s4    




z
block.showFc             C   s>   t j| |||d |r:x"| j D ]}|j|||d q"W d S )N)rW   r   rV   )r_   rZ   r   rY   )r   rW   r   rV   rK   r   r   r   rZ     s    z
block.sortc             C   s    t | |}t| j||_|S )N)r_   r9   r5   r7   r   )r   r8   r   r   r   r   r9     s    zblock.__deepcopy__c             C   s   t | }| j |_|S )N)r_   r5   r   )r   r   r   r   r   r6     s    
zblock.__copy__)N)Nr   Nr;   NT)FNF)r\   r]   r^   r   r)   r.   r/   r   r   rG   rZ   r9   r6   r   r   r   r   r#     s   
   

r#   c               @   s   e Zd Zd>ddZdd Zdd Zdd	 Zd
d Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zd?ddZdd Zdd  Zd!d" Zd#d$ Zd%d& ZeZd'd( Zd)d* Zd@d-d.Zd/d0 Zd1d2 Zd3d4 Zd5d6 ZdAd8d9Zd:d; Zd<d= ZdS )Bre   Nc                s   t  | _i | _|d k	rx|D ]}| |t  qW  d k	rt t| dksXtdt t| }t|x~t|D ]$| 	 fddtD  qzW nL|d kr d k	rt
 tst
 t st|   tdd | j D | _d S )Nr   z#Wrong number of data items for loopc                s   g | ]}  |  qS r   r   )r   j)rd   i	n_columnsr   r   r     s    z!loop.__init__.<locals>.<listcomp>c             S   s   g | ]}|  |fqS r   )r   )r   r   r   r   r   r     s    )r   _columnsr   rR   r   rr   r   r$   r   add_rowr"   r   add_columnsr   )r   rc   rd   r   r   r   )rd   r   r   r   r     s     
&
zloop.__init__c             C   s   t |  S )N)r   r   )r   r   r   r   r     s    zloop.__len__c             c   s   x|   D ]
}|V  q
W d S )N)r   )r   r   r   r   r   r      s    zloop.__iter__c          	   C   s   t t|std| t| dkr8t||  ks8tt|tj	rL|
 }t|tjsxRtjtjfD ]B}t||r~| }qfy|| }W n tk
r   wfY qfX P qfW t|tjst|}t|dst|| j|< || j| < d S )Nz%s is not a valid data namer   r)   )r%   r&   r'   r   r   sizer$   r"   r   size_tas_intrr   intdouble	as_stringrk   hasattrr   r   r   )r   r   r(   flex_numeric_typer   r   r   r)      s(    



zloop.__setitem__c             C   s   | j | j|   S )N)r   r   r   )r   r   r   r   r   r.     s    zloop.__getitem__c             C   s"   | j | j|  = | j| = d S )N)r   r   r   )r   r   r   r   r   r/     s    zloop.__delitem__c             C   s
   | j  S )N)r   r   )r   r   r   r   r      s    z	loop.keysc             C   s   t tt| S )N)r1   r   r2   r3   )r   r   r   r   r4   #  s    zloop.__repr__c             C   s   t t|  ddS )Nr!   rv   )common_substringr0   r   rstrip)r   r   r   r   rH   &  s    z	loop.namec             C   s(   d}x|   D ]}t|t|}qW |S )Nr   )rY   maxr   )r   r   columnr   r   r   r   )  s    z	loop.sizec             C   s   |   S )N)r   )r   r   r   r   r   /  s    zloop.n_rowsc             C   s   t |  S )N)r   r   )r   r   r   r   r   2  s    zloop.n_columns?c             C   s   t |trHx|| D ]2}||kr4| | t||  q| | | qW n@t|t| ks\tx*t| D ]\}}| | t||  qfW d S )N)r"   r   rx   rf   r   r$   	enumerate)r   rowdefault_valuer   r   r   r   r   r   5  s    

zloop.add_rowc             C   s:   |   dkr t||   ks t|| |< || j| < d S )Nr   )r   r   r$   r   r   )r   r   rY   r   r   r   r   A  s    zloop.add_columnc             C   s@   t |tst |tstx"t|D ]\}}| || q$W d S )N)r"   r   r   r$   r2   r3   r   )r   columnsr   r(   r   r   r   r   G  s    zloop.add_columnsc             C   sf   t |t dkstd|  dkrLt||  ksLtdt||  f || |< || j| < d S )Nr   z#first argument is column key stringr   z len(values) %d != self.size() %d)typer$   r   r   r   r   )r   r   rY   r   r   r   update_columnL  s    zloop.update_columnc             C   s.   ||   k stx| j D ]
}||= qW d S )N)r   r$   r   rY   )r   indexr   r   r   r   
delete_rowV  s    zloop.delete_rowc             C   s"   t  }| j |_| j |_|S )N)re   r   r5   r   )r   r   r   r   r   r6   [  s    zloop.__copy__c             C   s*   t  }t| j||_t| j||_|S )N)re   r5   r7   r   r   )r   r8   r   r   r   r   r9   c  s    zloop.__deepcopy__c             C   s
   t | S )N)r5   r7   )r   r   r   r   r7   i  s    zloop.deepcopy  Tc          
      s  |   dkr|  dks6td|  |   |  f |d krDtj}|d krP|}| dks`t| dkspttd|d x |  D ]}t|| |d qW t| j	
 tt}|d k	rtx`tD ]T\ }xJtjtjfD ]:}	t||	sy|	| < W n tk
r"   wY qX P qW qW |d krP|ddgt  }x:t|  D ]* t|t fdd	|D  |d q^W nX|rg }txtD ]\ }x&t| D ]}
t||
 ||
< qW td
d |D }| }||dk|dkB  }yt| W n tk
r>   |d9 }Y nX |d|  qW |d| }xt|  D ]. t|t fdd	|D   |d qpW nDxBt|  D ]2  fdd	|D }td|g| |d qW d S )Nr   zkeys: %s %d %dr   ro   )r<   r   z%sc                s   g | ]}|   qS r   r   )r   r   )r   rY   r   r   r     s    zloop.show.<locals>.<listcomp>c             s   s   | ]}d |kr|V  qdS )
Nr   )r   itemr   r   r   	<genexpr>  s    zloop.show.<locals>.<genexpr>rv   r   r   z%%%isz  c                s   g | ]}|   qS r   r   )r   r   )r   rY   r   r   r     s   c                s   g | ]}t |   qS r   )r   )r   r   )r   rY   r   r   r     s    )r   r   r$   r   rC   rD   r   rF   r0   r   rY   r   r   r5   r7   r   r   r   r   r"   r   joinr   r   r   rr   max_element_lengthselectrx   r   )r   r=   r>   r?   r   rB   r   Zrange_len_valuesrn   r   Zi_vZv_widthZvalues_to_printr   )r   rY   r   rG   l  sf    




.
z	loop.showc             C   s   t  }| j|d | S )N)r=   )rI   rG   rJ   )r   rK   r   r   r   rL     s    zloop.__str__c             #   sZ   |   }t|  tt| }x4t|  D ]$ tt| fdd|D V  q.W dS )z Warning! Still super-slow! c             3   s   | ]}|   V  qd S )Nr   )r   r   )r   s_valuesr   r   r     s    z loop.iterrows.<locals>.<genexpr>N)r   r0   rY   r   r   r   r   r   )r   r   range_len_selfr   )r   r   r   iterrows  s
    zloop.iterrowsc          	      s   |   }x|  D ]}||kstqW g }t|  tt| }xnt|  D ]^ d}x,t|D ]\}}| |   |krdd}P qdW |rP|	t
t| fdd|D  qPW |S )NTFc                s   g | ]}|   qS r   r   )r   r   )r   r   r   r   r     s    z!loop.find_row.<locals>.<listcomp>)r   r$   r0   rY   r   r   r   r2   r3   rx   r   r   )r   Zkv_dict	self_keysr   r-   r   Zgoodrowrn   r   )r   r   r   find_row  s    (zloop.find_rowc                s|     }x|D ]}||kstqW g }x2t D ]"|tfdd|D  q4W t|  fdd   D }|S )z
    Majority (if not all) loops have 1 or more keys that should be unique
    to identify a row. This function checks if this holds up
    c                s   g | ]}|   qS r   r   )r   r   )r   r   r   r   r     s    z,loop.check_key_is_unique.<locals>.<listcomp>c                s   g | ]} | d kr|qS )rp   r   )r   r   )cr   r   r     s    )r   r$   r   r   rx   r   r	   )r   Zkey_listr   r   Zkey_comb_list
duplicatesr   )r   r   r   r   check_key_is_unique  s    
"zloop.check_key_is_uniqueFc             C   s   t t| j ||d| _d S )N)r   rV   )r   rX   r   rE   )r   r   rV   r   r   r   rZ     s    z	loop.sortc                sL    fdd}| j  }|| t }x D ]}| j | ||< q,W || _ d S )Nc                sP   xt  D ]\}}| |kr
P q
W xt  D ]\}}||kr*P q*W | |k rLdS dS )Nr   rp   )r   )k1k2r   or   )orderr   r   _cmp_key  s       zloop.order.<locals>._cmp_key)r   r   rZ   r   )r   r   r   r   tmpr   r   )r   r   r     s    


z
loop.orderc             C   s   t | t |ks8|  | ks8t|  t| kr<dS x@tt|  t| D ]"\}}||kdt |krXdS qXW dS )NFT)r   r   r0   r   r   rY   count)r   r   r(   r   r   r   r   __eq__  s    $zloop.__eq__)NN)r   )Nr   NNT)NF) r\   r]   r^   r   r   r    r)   r.   r/   r   r4   rH   r   r   r   r   r   r   r   r   r6   r5   r9   r7   rG   rL   r   r   r   rZ   r   r   r   r   r   r   re     s:   



C	
re   c             C   s   t | } t| dkr| d S | d }x| D ]}t|| }q*W |ds|dsd|krl|dd }n.|| kr|ddkrd|dd d }|S )Nrp   r   r!   rv   r   )r0   r   LCSubstr_setpopendswithrw   r   r   )seqsubstrrK   r   r   r   r     s     
r   c       	         s   t | }t |  fddt|d D }t }d}xt|D ]}x|t D ]p}| | || krL|| | d }|||d  |d < ||kr|}t }||krL|| || d |d   qLW q>W |S )zLongest common substring function taken from:
  http://en.wikibooks.org/wiki/Algorithm_Implementation/Strings/Longest_common_substring#Pythonc                s   g | ]}d g d  qS )r   rp   r   )r   r   )nr   r   r     s    z LCSubstr_set.<locals>.<listcomp>rp   r   )r   r   setrm   )	STmLZLCSlongestr   r   rn   r   )r   r   r     s      &r   z#!%&()*+,\-./0-9:<=>?@A-Z\\^`a-z{|}~z%s\"#$'_;[\]z%s\"#$'_ \t;[\]z%s\"#$'_ \t[\]z[%s]*z_[%s]+z	[%s][%s]*z('|\")[%s]*('|\")z(\s*)(;).*?(;)(\s*)c             C   s  d}| sdS | d dkr,t t| }|d k	}|st| dkrBdS d| krv|  d dkrvt t| d k	rvd|   S d| kr| d dkrd|  } | d dkr| d } d	|  S | d d
krd|  S xJtjD ]@}|| krd| | krd| | k rd|  S d|  S d|  S qW | S )NFz''r   )'";z
%s
r   r   z
;%s;
)#$[]r!   z'%s'r   r   z
;
%s
;
z"%s")	r%   r&   rh   r   lstripri   r   string
whitespace)Zvalue_stringZstring_is_quotedr   wsr   r   r   r   /  s8    r   ).
__future__r   r   r   libtbx.containersr   r   libtbx.utilsr   rC   r   r5   	six.movesr   rI   collectionsr	   collections.abcr
   ImportErrorcctbx.array_familyr   r   r   r2   r   r   r_   r   r#   re   r   r   r%   Z_ordinary_char_setZ_non_blank_char_setZ_any_print_char_setZ_text_lead_char_setcompilerg   r'   Zunquoted_string_rerh   DOTALLri   r   r   r   r   r   <module>   sN   c  Y  