
    ck                         d Z dZddlZddlmZmZmZmZm	Z	m
Z
mZmZ ddlmZ ddlmZ ddlmZ ddlmZmZmZmZmZmZ dd	lmZmZmZmZ d
 Zd ZddZ G d de       Z!ddl"m#Z# ddl$m%Z% y)zUniversal report objects and some formatting drivers.

A way to create simple reports using python objects, primarily designed to be
formatted as text and html.
zrestructuredtext en    N)AnyOptionalUnionList	GeneratorTupleCallableTextIO)StringIO)linesep)VNode)TableSectionLink	ParagraphTitleText)VerbatimTextImageSpanr   c              #   x   K   | j                   D ]'  }t        ||      r| t        ||      D ]  }|  ) yw)z:return an iterator on all children node of the given klassN)children
isinstance	get_nodes)nodeklasschild
grandchilds       B/usr/lib/python3/dist-packages/logilab/common/ureports/__init__.pyr   r   %   sD      eU#K#E51 	J		s   8:c                     | j                   D ]K  }t        |t              sdj                  t	        |t
              D cg c]  }|j                   c}      c S  yc c}w )zDtry to return the layout's title as string, return None if not found N)r   r   r   joinr   r   data)layoutr   r   s      r   layout_titler%   /   sI     LeU#889UD3IJ4TYYJKKLJs   A
c                    |dkD  sJ |dz  }t        d      }| j                  D ]  }t        |t              st	        |      }|s|j
                  s.|j
                  s|j                  dd      |_        t        d|j
                  z   |xs |j
                        }|rB|j                  D cg c]  }t        |t              s| c}rt        |t        ||      g      }|j                  |        |S c c}w )	z0make a summary for the report, including X levelr      summary)r   r!   -#)label)ListTyper   r   r   r%   idreplacer   r   build_summaryappend)r$   levelr(   r   r+   r   ns          r   r/   r/   6   s    199	QJEY'G %)U#UXXxx}}S#.EHC%((N%*;588<
 JA:a3IaJdM%$?@ADt& N Ks   .C7C7c            	           e Zd ZdZ	 	 ddedeeeef      dee   ddfdZ	ded   ddfd	Z
dd
eddfdZd
eddfdZdeddfdZdeddfdZdedeee      fdZdedeeedf   fdZy)
BaseWriterzbase class for ureport writersNr$   streamencodingreturnc                     |t         j                  }|st        |dd      }|xs d| _        g | _        || _        | j                  |       |j                  |        | j                  |       y)zformat and write the given layout into the stream object

        unicode policy: unicode strings may be found in the layout;
        try to call stream.write with it, but give it back encoded using
        the given encoding if it fails
        Nr6   zUTF-8)	sysstdoutgetattrr6   _BaseWriter__compute_funcsoutbegin_formataccept
end_format)selfr$   r5   r6   s       r   formatzBaseWriter.formatT   sd     >ZZFvz7;H +G\^&!d    )r   r   r   c                 J    t        |dd      D ]  }|j                  |         y)zfrecurse on the layout children and call their accept method
        (see the Visitor pattern)
        r    N)r;   r?   )rA   r$   r   s      r   format_childrenzBaseWriter.format_childrenk   s(     VZ4 	ELL	rC   stringc                 4    | j                  |t        z          y)z!write a line in the output bufferN)writer   rA   rG   s     r   writelnzBaseWriter.writelnr   s    

6G#$rC   c                     	 | j                   j                  |       y# t        $ r7 | j                   j                  |j                  | j                               Y yw xY w)z#write a string in the output bufferN)r=   rI   UnicodeEncodeErrorencoder6   rJ   s     r   rI   zBaseWriter.writev   sE    	9HHNN6"! 	9 HHNN6==78	9s    =AAc                     d| _         y)zbegin to format a layoutr   N)sectionrA   r$   s     r   r>   zBaseWriter.begin_format   s	    rC   c                      y)zfinished to format a layoutNrE   rQ   s     r   r@   zBaseWriter.end_format   s    rC   tablec                 4   g g}|j                   }| j                  |      D ]=  }|dk(  r|j                  g        |j                   }|dz  }|d   j                  |       ? t        |d         |k  r&|d   j                  d       t        |d         |k  r&|S )ztrick to get table content without actually writing it

        return an aligned list of lists containing table cells values as string
        r   r'    )colscompute_contentr0   len)rA   rS   resultrW   cells        r   get_table_contentzBaseWriter.get_table_content   s    
 ,.$ zz((/ 	$Dqyb! zzAID2Jd#	$ &*o$2Jb! &*o$ rC   c              #      K   dt         ddf fd}ddt         ddf fd}| _        | _         j                  j	                  ||f       |j
                  D ]/  }t               |j                          j                          1  j                  j                          	  j                  d   \   _         _        y# t        $ r  ` `Y yw xY ww)ztrick to compute the formatting of children layout before actually
        writing it

        return an iterator on strings (one for each child element)
        r#   r7   Nc                     	 j                  |        y # t        $ r- j                  | j                  j                               Y y w xY wN)rI   rM   rN   r6   r#   rA   r5   s    r   rI   z)BaseWriter.compute_content.<locals>.write   s>    9T"% 9 T[[78	9s    3A
Ac                     	 j                  | t        z          y # t        $ r4 j                  | j                  j                        t        z          Y y w xY wr_   )rI   r   rM   rN   r6   r`   s    r   rK   z+BaseWriter.compute_content.<locals>.writeln   sJ    CTG^,% C T[[7'ABCs    :AArU   rV   )strrI   rK   r<   r0   r   r   r?   getvaluepop
IndexError)rA   r$   rI   rK   r   r5   s   `    @r   rX   zBaseWriter.compute_content   s     	9 	9 	9	C# 	Ct 	C 
##UG$45 __ 	$EZFLL//##	$ 	  "	 (,';';B'?$DJ 	
	s*   B#C(C CCCCC)NNrb   )__name__
__module____qualname____doc__r   r   r   r   r
   rB   rF   rc   rK   rI   r>   r@   r   r,   r\   r   r   rX   rE   rC   r   r4   r4   Q   s    (
 59"&	   x/01  3-	 
 
 .e,K&L QU %c %4 %9C 9D 93 4 * * *u (3-1H 43e 3	#sD.0I 3rC   r4   )
TextWriter)
HTMLWriter)r'   )&rj   __docformat__r9   typingr   r   r   r   r,   r   r   r	   r
   logilab.common.compatr   logilab.common.textutilsr   logilab.common.treer   logilab.common.ureports.nodesr   r   r   r   r   r   r   r   r   r   r%   r/   objectr4   #logilab.common.ureports.text_writerrk   #logilab.common.ureports.html_writerrl   rE   rC   r   <module>rv      sY   $
 & 
 ] ] ] * , % V V I IL6B BJ ; :rC   