B
    d =                 @   s|  d dl mZmZmZ d dlmZ d dlmZ d dlm	Z	 d dl
Z
d dlmZ dNdd	ZdOd
dZdd Zdd ZdPddZdd Zdadd add Zdd Zdd ZdQd d!ZdRd"d#ZdSd%d&ZdTd)d*ZdUd,d-ZdVd.d/Zd0d1 Zd2d3 Zd4d5 ZdWd6d7Z d8d9 Z!d:d; Z"d<d= Z#G d>d? d?e$Z%G d@dA dAe$Z&dXdCdDZ'G dEdF dFe$Z(dGdH Z)dYdJdKZ*G dLdM dMe$Z+dS )Z    )absolute_importdivisionprint_function)
cmp_to_key)string_types)	cStringION)zipNonec             C   s4   t |tstt|}dtdt| | |  | S )N r   )
isinstancestrAssertionErrorlenmax)format
null_valuereplace_withZvalue_width r   o/mnt/filia/a/genomebrowser/www/genomebrowser/fleming/tools/molprobity/modules/cctbx_project/libtbx/str_utils.pyformat_none
   s    r   c             C   s>   | d krt |S |d ks(t | dkr6t| ||dS | | S )NNONE)r   r   r   )r   upperr   )r   valuer   replace_none_withr   r   r   format_value   s     r   c             C   s,   | dkst |  dkrdS td| dddS )z
  shortcut for cif output
  Nr   ?z%.2fr   )r   r   r   r   )r   r   r   )r   r   r   r   round_2_for_cif   s    r   c             C   s,   | dkst |  dkrdS td| dddS )z
  shortcut for cif output
  Nr   r   z%.4fr   )r   r   r   r   )r   r   r   )r   r   r   r   round_4_for_cif   s    r   H   |c             C   s,   |t |d  t |  }||  d|  | S )N   r
   )r   )linewidthborderZn_spacesr   r   r   
pad_string&   s    r$   c             C   s   |}||kr,|  |dkr,|  |dk r,|}|g}|j}x| D ]}||ksR|dkrd|d || q>|dkrv|d q>|dkr|d q>|dkr|d q>|d	k s|td
kr|dt|d@   q>|| q>W || d|S )z%based on stringobject.c, Python 2.7.2r   \	z\t
z\nz\rr
      z\x%02x    )findappendchrordjoin)stringpreferred_quotealternative_quotequoteresultZrappcr   r   r   py_string_representation*   s,    




r7   Fc             C   sD   t s8da yddlm} |jaW n tk
r6   taY nX t| ||S )NTr   )ext)_have_string_representationZboost_adaptbx.boost.pythonr8   string_representation	Exceptionr7   )r1   r2   r3   _r   r   r   r:   E   s    

r:   c             C   sx   g }g }d}xJ| D ]B}|dk|dkkrFt |dkrF|d| g }|| |}qW t |dkrt|d| |S )Nr
   r   r+   )r   r-   r0   )sr5   Zfieldprevr6   r   r   r   split_keeping_spacesQ   s    

r?   c             C   s~   | d krdS | dk r |  } d}nd}g }xF| dkrZ| dd| d   | d } | dkrlP q*| dd|   P q*W |d| S )	Nunknownr   -r+   i  z%03dz%d,)insertr0   )Zszsignr5   r   r   r   size_as_string_with_commas`   s       rE   c             C   sT   | d krd S |  ddk r&d|  d S |  ddk r@d|  d S d| dd d S )N"r   'z\")r,   replace)r=   r   r   r   show_stringr   s       rI   Tc                s>   dd }dd }|r| n| d  fdd| D S )Nc             S   s   |   S )N)rstrip)r=   r   r   r   do_rstipy       z)prefix_each_line_suffix.<locals>.do_rstipc             S   s   | S )Nr   )r=   r   r   r   
do_nothingz   rL   z+prefix_each_line_suffix.<locals>.do_nothingr'   c                s   g | ]} |  qS r   r   ).0r!   )doprefixsuffixr   r   
<listcomp>}   s   z+prefix_each_line_suffix.<locals>.<listcomp>)r0   
splitlines)rP   lines_as_one_stringrQ   rJ   rK   rM   r   )rO   rP   rQ   r   prefix_each_line_suffixx   s     rU   c             C   s   t | |d|dS )Nr+   )rP   rT   rQ   rJ   )rU   )rP   rT   rJ   r   r   r   prefix_each_line   s
    rV   r+   c             C   s:   |d krt j}t|d td|| f |d t|d d S )N)filez%s%s)sysstdoutprint)r!   rP   outr   r   r   	show_text   s
     
r\   P      c                sD   d krt j fdd}xtd|D ]
}|  q*W   d S )Nc                 s   t }  |  }|d }|}|}|d |kr4|d7 }dd|d   d  d d|d   d }t |dkrdd|d   d  d d|d   d }t|d d S )Nr    r^   r'   =r
   r]   )rW   )r   rZ   )line_lenfill_lenfill_rlfill_rfill_l
out_string)
header_lenr!   r[   r   r   one   s    ,,zmake_header.<locals>.oner   )rX   rY   rangeflush)r!   r[   rf   repeatZnew_line_startZnew_line_endrg   itr   )rf   r!   r[   r   make_header   s     
rl   rA   c             C   s   |dkrt j}t|tst|d }||  | }t|}|| }|d }|}	|}
|d |krd|	d7 }	dd|
d   d | d d|	d   d }t|dkrdd|
d   d | d d|	d   d }t||d |  dS )	aR  
  Prints a subheader to an output location.

  Parameters
  ----------
  text : str
  out : file, optional
  header_len : int, optional
  sep : str, optional

  Examples
  --------
  >>> from libtbx.str_utils import make_sub_header
  >>> make_sub_header("Predicted ions", header_len=20)

     ----------Predicted ions----------

  >>>
  N
   r    r^   r'   r
   r]   )rW   )rX   rY   r   r   r   r   rZ   ri   )textr[   rf   sepr#   r!   r`   ra   rb   rc   rd   re   r   r   r   make_sub_header   s"     ,,rp   c             C   sb   |   }g }d}x<|D ]4}t|t| |kr>|| |}q|d| 7 }qW || d|S )Nr+   r
   r'   )splitr   r-   r0   )rn   Z	max_charsZwordslinesZcurrent_lineZwordr   r   r   wordwrap   s    


rs   c             C   sl   |    |  }d}d}xNt|D ]B\}}|dkrD|dkrD|d7 }n|dkrT|d7 }||  7 }|}q"W |S )Nr+   r   r'   r
   )striprS   	enumerate)rn   rr   ZnewtextZlastlineir!   r   r   r   reformat_terminal_text   s    
rw   c             C   s.   g }x|   D ]}||  qW d|S )Nr'   )rS   r-   rJ   r0   )rn   newr!   r   r   r   rstrip_lines   s    ry   c             C   s.   g }x|   D ]}||  qW d|S )Nr'   )rS   r-   rt   r0   )rn   rx   r!   r   r   r   strip_lines   s    rz   c       
         s&  |d kst |t | kst|d kr*tj}t | dkr:dS fdd}|d kr\d gt |  }dd t| |D   jt|d dtd	d  D t fd
ddD f }xt D ]l\}}}	|	d k	rt |	dkrt||||f  d|d t|	d|d nt||||f  d|d t|d qW dS )Nr   Fc                sv    r.| d |d krdS | d |d k rVdS n(| d |d k rBdS | d |d krVdS | d |d k| d |d k  S )Nr^   r   r   )ab)reverser   r   sort_function   s        z,show_sorted_by_counts.<locals>.sort_functionc             S   s"   g | ]\\}}}t |||fqS r   )rI   )rN   lr6   r|   r   r   r   rR     s   z)show_sorted_by_counts.<locals>.<listcomp>)keyz%%-%ds %%%ddc             S   s   g | ]\}}}t |qS r   )r   )rN   r   r6   r|   r   r   r   rR   
  s    c                s    g | ]}t t | d  qS )r^   )r   r   )rN   rv   )lcar   r   rR     s    )r   r{   r
   )endrW   r+   )rW   T)	r   r   rX   rY   r   sortr   r   rZ   )
Zlabel_count_pairsr~   r[   rP   annotationsr   fmtr   r6   r|   r   )r   r~   r   show_sorted_by_counts   s*      r   c             C   s$   | d | | | |t | d   S )N)r   )r=   offsetZreplacementr   r   r   overwrite_at  s    r   c             C   s$   x|D ]}|  |dkrdS qW dS )Nr   TF)r,   )labelpatternspatternr   r   r   contains_one_of  s    
r   c             c   s   |dkst | dkr| V  nrd}d }xNt| D ]B\}}|dkrB|}|| |kr.|d k	r.| || V  |d }d }q.W |t | k r| |d  V  d S )Nr   r
   r^   )r   ru   )r1   r"   Zi_block_startZi_last_spacerv   r6   r   r   r   line_breaker  s    r   c               @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
line_feederc             C   s   t || _d| _d S )NF)iterfeof)selfr   r   r   r   __init__0  s    
zline_feeder.__init__c             C   s   | S )Nr   )r   r   r   r   __iter__4  s    zline_feeder.__iter__c             C   s8   | j s4y| j d d S  tk
r2   d| _ Y nX dS )Nr{   Tr+   )r   r   nextStopIteration)r   r   r   r   r   7  s    zline_feeder.nextc             C   s,   x&t | }| js t| dkr|S qW d S )Nr   )r   r   r   rt   )r   r5   r   r   r   next_non_empty?  s    zline_feeder.next_non_emptyN)__name__
__module____qualname__r   r   r   r   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	S )
StringIOc             O   s   t ||| _t|| _d S )N)r   _bufferbool	read_only)r   argskwdsr   r   r   r   G  s    zStringIO.__init__c             O   s4   | j r"|d dkr"td|d  t| jf||S )Nr   )Z	softspacetruncatewrite
writelinesz1'libtbx.str_utils.StringIO' has no attribute '%s')r   AttributeErrorgetattrr   )r   r   r   r   r   r   __getattr__K  s    zStringIO.__getattr__c             C   s   t | jjdk}| j |fS )NZStringO)typer   r   getvalue)r   is_output_objectr   r   r   __getstate__P  s    zStringIO.__getstate__c             C   s6   |\}}|r(|    | j| d| _n
|  | d S )NT)r   r   r   r   )r   stateZbuffer_valuer   r   r   r   __setstate__T  s    zStringIO.__setstate__N)r   r   r   r   r   r   r   r   r   r   r   r   F  s   r      c             C   s   g }g }d}xt | D ]z\}}|dkr^|dkr|||  }|dg|  || ||7 }q|| || |dks|dkrd}q|d7 }qW d||fS )Nr   r&   r
   r'   r(   r^   r+   )ru   extendr-   r0   )r=   tabsizeZresult_eZresult_jjrv   r6   nr   r   r   expandtabs_track_columns]  s     



r   c               @   sJ   e Zd 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S )framed_outputa  
  Pseudo-output file wrapper for drawing a box around arbitrary content, for
  example:

    |----------Refinement stats--------|
    | r_free = 0.1234  r_work = 0.1567 |
    |----------------------------------|

  The actual content will be buffered until the close() method is called or
  the object is deleted, at which point the formatted text will be printed to
  the actual filehandle.

  :param out: actual output filehandle
  NrA   Fr]   c	       	      C   sb   || _ |d k	r| }|| _|d kr(|}|| _|| _|| _|| _|| _|| _g | _	d | _
d| _d S )NF)r[   rt   titlecenter_titler"   framecenter	max_widthrP   content_current_line_closed)	r   r[   r   r"   r   r   r   r   rP   r   r   r   r     s    
zframed_output.__init__c             C   s
   | j d S )N   )r"   )r   r   r   r   get_best_text_width  s    z!framed_output.get_best_text_widthc             C   s`   d}| j d k	r|| j 7 }d | _ x.|D ]&}|dkrB| j| d}q$||7 }q$W |dkr\|| _ d S )Nr+   r'   )r   r   r-   )r   rn   Zcurrent_textcharr   r   r   r     s    


zframed_output.writec             C   s   d S )Nr   )r   r   r   r   ri     s    zframed_output.flushc             C   s.   | j d k	r| j| j  d | _ | jd  d S )N)r   r   r-   )r   r   r   r   add_separator  s    
zframed_output.add_separatorc       	         sX  j r
td_ jdkr(jj j j}dd |D }jdkrTdjd krtj	dt
dd |D  d	jffd
d	} fdd} fdd} d jd k	rֈ j |  jd k	rF|jdjd\}}|d7 }|d8 } j|   j |dkrZ j|  n jd	   |   d x|D ]}|d kr|  njd k	r j  d  ||\}}|dkrЈ d|   | |dkr d|   d   d qpW jd k	r( j |  jjd	   |   d d S )NT)Nr+   c             S   s   g | ]}|d k	r|qS )Nr   )rN   r=   r   r   r   rR     s    z'framed_output.close.<locals>.<listcomp>)rA   r<   r   r   c             S   s   g | ]}t |qS r   )r   )rN   r=   r   r   r   rR     s    r    c                sX   ddl m}m} td t|  |d  }|rH||d }||d }nd}|}||fS )Nr   )iflooriceilr    )Zlibtbx.math_utilsr   r   r   r   )rn   marginr   r   r   ZfillZrfillZlfill)r"   r   r   get_padding  s    z(framed_output.close.<locals>.get_paddingc                  s$   j dkr  n
 d d S )Nr<   )r   r   r   )r[   r   
side_framer   r   write_corner  s    
z)framed_output.close.<locals>.write_cornerc                  sF   j d k	r j     jd    d  d S )Nr    r'   )rP   r   r   r   )r[   r   r   r"   r   r   	write_sep  s
    

z&framed_output.close.<locals>.write_sepr'   r^   )r   r   r   r
   )r   r   r   r   r-   r[   r   r"   minr   r   r   r   rP   r   r   )	r   rr   Z
text_linesr   r   r   ZrfZlfr!   r   )r[   r   r   r"   r   close  sf    











zframed_output.closec             C   s   | j s|   d S )N)r   r   )r   r   r   r   __del__  s    zframed_output.__del__)NNrA   FNr]   N)r   r   r   __doc__r   r   r   ri   r   r   r   r   r   r   r   r   q  s         
Mr   c             K   s4   t f |}x"t| | D ]}t||d qW ~d S )N)rW   )r   r   r   rZ   )messager   Zboxr!   r   r   r   print_message_in_box  s    
r   #c             C   s$   |dkrt j}t|| ||dd dS )zP
  Alternate API for print_message_in_box, for compatibility with make_header
  NT)r[   r   r"   r   r   )rX   rY   r   )r!   r[   rf   Zborder_charr   r   r   make_big_header  s     r   c               @   s    e Zd ZdZdd Zdd ZdS )find_matching_closing_symbola   This functor deals with a pair of symbol, an opening symbol and a closing one,
      the archetypical example being parentheses. Given the position of an opening
      symbol, it returns the position of the matching closing symbol, or -1 if it does not
      exist.
  c             C   s:   ddl }|| | _| _|d||||f | _dS )z Initialise the functor to work with the given pair. Each of `opening` and `closing`
        may be several character long.
    r   Nz	(%s)|(%s))reopeningclosingcompileescape_regex)r   r   r   r   r   r   r   r     s    z%find_matching_closing_symbol.__init__c             C   sT   d}d}xF| j ||t| j D ]*}|s.dS |||j 7 }|dkr"| S q"W dS )zL An opening symbol shall start at position `pos` of the given `string`.
    r^   )Nr^   r{   r{   r   )r   finditerr   r   	lastindexstart)r   r1   poslevelZdeltamr   r   r   __call__'  s    z%find_matching_closing_symbol.__call__N)r   r   r   r   r   r   r   r   r   r   r     s   r   )r   r	   )r   r	   )r   r   )T)T)r+   N)Nr]   r^   FF)Nr]   rA   )r]   )TNr+   N)r   )Nr]   r   ),
__future__r   r   r   	functoolsr   sixr   	six.movesr   rX   r   r   r   r   r   r$   r7   r9   r:   r?   rE   rI   rU   rV   r\   rl   rp   rs   rw   ry   rz   r   r   r   r   objectr   r   r   r   r   r   r   r   r   r   r   <module>   sR   





 

&
   

 
