3
dS6              2   @   sD  d 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
mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ ddl Z yddl!m"Z" W n  e#k
r   ddl$m"Z" Y nX dZ%dZ&dd	d
ddded	d
dddedd
dddedd
dddedd
dddiZ'dd	d
ddded	d
ddde	dd
ddde
dd
ddedd
ddedddddedddddeddd ed!dd ed"dd ed#dd ed$dd ed%ddd&ed'ddd&ed(ddd&ed)dd*d&ed+dd ed,dd ed-dd ed.dd iZ(d/d0d1d2d3Z)d4d5d0d6Z*d7Z+d8Z,d9Z-d:d; Z.dAd?d@Z/dS )Ba  Graphical visualisation support for prov.model.

This module produces graphical visualisation for provenanve graphs.
Requires pydot module and Graphviz.

References:

* pydot homepage: https://github.com/erocarrera/pydot
* Graphviz:       http://www.graphviz.org/
* DOT Language:   http://www.graphviz.org/doc/info/lang.html

.. moduleauthor:: Trung Dong Huynh <trungdong@donggiang.com>
    )datetime)INFERRED_ELEMENT_CLASS)
ProvEntityProvActivity	ProvAgent
ProvBundlePROV_ACTIVITY
PROV_AGENTPROV_ALTERNATEPROV_ASSOCIATIONPROV_ATTRIBUTIONPROV_BUNDLEPROV_COMMUNICATIONPROV_DERIVATIONPROV_DELEGATIONPROV_ENTITYPROV_GENERATIONPROV_INFLUENCEPROV_INVALIDATIONPROV_ENDPROV_MEMBERSHIPPROV_MENTIONPROV_SPECIALIZATION
PROV_START
PROV_USAGE
IdentifierPROV_ATTRIBUTE_QNAMESsorted_attributesProvExceptionN)escapezTrung Dong Huynhztrungdong@donggiang.comZovalZfilledZ	lightgraydimgray)shapestyle	fillcolorcolorZboxZhouseZfolderz#FFFC87z#808080z#9FB1FCz#0000FFz#FED37F)r!   r"   r#   Z	aliceblueZwasGeneratedByz10.0Z	darkgreen)labelfontsizer$   	fontcolorusedZred4ZredZwasInformedBy)r%   r&   ZwasStartedByZ
wasEndedByZwasInvalidatedByZwasDerivedFromZwasAttributedTo)r%   r&   r$   ZwasAssociatedWithZactedOnBehalfOfZwasInfluencedByZgreyZalternateOfZspecializationOfZ	mentionOfZ	hadMemberZnotegrayZblack10)r!   r$   r'   r&   noneZdashed)	arrowheadr"   r$   z#<<TABLE cellpadding="0" border="0">z`    <TR>
        <TD align="left" href="%s">%s</TD>
        <TD align="left"%s>%s</TD>
    </TR>z    </TABLE>>c             C   s4   y| j }d|t| f S  tk
r.   t| S X d S )Nz<a href="%s">%s</a>)uristrAttributeError)valuer-    r1   (/tmp/pip-build-7vycvbft/prov/prov/dot.pyhtlm_link_if_uri   s
    r3   TFBTc                sx   |dkrd}t jd|dd}i ddddg fd	d
 y| j }W n tk
rh   | }Y nX  || |S )a  
    Convert a provenance bundle/document into a DOT graphical representation.

    :param bundle: The provenance bundle/document to be converted.
    :type bundle: :class:`ProvBundle`
    :param show_nary: shows all elements in n-ary relations.
    :type show_nary: bool
    :param use_labels: uses the prov:label property of an element as its name (instead of its identifier).
    :type use_labels: bool
    :param direction: specifies the direction of the graph. Valid values are "BT" (default), "TB", "LR", "RL".
    :param show_element_attributes: shows attributes of elements.
    :type show_element_attributes: bool
    :param show_relation_attributes: shows attributes of relations.
    :type show_relation_attributes: bool
    :returns:  :class:`pydot.Dot` -- the Dot object.
    r4   TBLRRLZdigraphzutf-8)Z
graph_typeZrankdircharsetr   c                s  fddfdd}fdd}dfdd	 fd	d
d fdd	}|j  }g }x(|D ] j r| q||j q|W |j sx|jD ]}|| qW x|D ]j}|sqtdd jD  \}}	tt	t
j|}
dd jD }
o|}t|	dko,	}tj  }t|	dk rJq|sV|rH }jtj||	d |
d |fddi| t|}|d= jtj|||	d |
d f| |r6d|d< d|d< xdt|dd  |	dd  |
dd  D ]<\}}}|d k	r|j|d< jtj||||f| qW |rz| qȈjtj||	d |
d ||	d |
d f| qW d S )Nc                s   t dd |jD }|sd S t|j |}tg}|jdd |D  |jt  d  d7  < tj	d d  fddj
|it}j| jtj|| ft d S )	Nc             s   s"   | ]\}}|t kr||fV  qd S )N)r   ).0	attr_namer0   r1   r1   r2   	<genexpr>   s   z\prov_to_dot.<locals>._bundle_to_dot.<locals>._attach_attribute_annotation.<locals>.<genexpr>c          	   s   s^   | ]V\}}t |jtt|t|tr.d |j ndtt|tsDt|n
t|j f V  qdS )z
 href="%s" N)ANNOTATION_ROW_TEMPLATEr-   r   r.   
isinstancer   r   	isoformat)r9   attrr0   r1   r1   r2   r;      s         zann%dr%   
)list
attributesr   get_typeANNOTATION_START_ROWextendappendANNOTATION_END_ROWpydotNodejoinANNOTATION_STYLEadd_nodeadd_edgeEdgeANNOTATION_LINK_STYLE)noderecordrE   Zann_rowsannotations)countdotr1   r2   _attach_attribute_annotation   s     

 
zIprov_to_dot.<locals>._bundle_to_dot.<locals>._attach_attribute_annotationc                s   d  d7  < t jdd  d| jj dd}r|| j| jkrRd| j d}nd| j d| j d}|jd| d n|jd	t| j   ||  j| |S )
N   rB   zc%d")Z
graph_nameURL<z,<br /><font color="#333333" point-size="10">z</font>>z"%s")rK   ZCluster
identifierr-   r%   Z	set_labelr.   Zadd_subgraph)bundleZsubdotZbundle_label)_bundle_to_dotrV   rW   
use_labelsr1   r2   _add_bundle   s    

z8prov_to_dot.<locals>._bundle_to_dot.<locals>._add_bundlec                s   d  d7  < dd  }rT| j | jkr<d| j  d}qbd| j  d| j d}nd| j d}| jj}t| j  }tj|f|d| d	|}||< j| r | |S )
Nr   rB   zn%drZ   r\   z,<br /><font color="#333333" point-size="10">z</font>>z"%s")r%   r[   )r%   r]   r-   DOT_PROV_STYLErF   rK   rL   rO   )rT   node_id
node_labelr-   r"   rS   )rX   rV   rW   node_maprecshow_element_attributesr`   r1   r2   	_add_node  s    

z6prov_to_dot.<locals>._bundle_to_dot.<locals>._add_nodec                st    d  d7  < d d  }d|  d}| j }|r:t| ntd }tj|f|d| d|}||< j| |S )Nr   rB   zn%drZ   z"%s")r%   r[   )r-   GENERIC_NODE_STYLErb   rK   rL   rO   )qname	prov_typerc   rd   r-   r"   rS   )rV   rW   re   r1   r2   _add_generic_node*  s    
z>prov_to_dot.<locals>._bundle_to_dot.<locals>._add_generic_nodec                 s<    d  d7  < d d  } t j| dddd}j| |S )NrB   zb%dz""Zpointr)   )r%   r!   r$   )rK   rL   rO   )Zbnode_idbnode)rV   rW   r1   r2   
_get_bnode6  s
    
z7prov_to_dot.<locals>._bundle_to_dot.<locals>._get_bnodec                s.   | d kr S | j }|kr& | | | S )N)r-   )rj   rk   r-   )rl   rn   re   r1   r2   	_get_node=  s    
z6prov_to_dot.<locals>._bundle_to_dot.<locals>._get_nodec             s   s"   | ]\}}|t kr||fV  qd S )N)r   )r9   r:   r0   r1   r1   r2   r;   Z  s   z6prov_to_dot.<locals>._bundle_to_dot.<locals>.<genexpr>c             S   s    g | ]\}}|t kr||fqS r1   )r   )r9   r:   r0   r1   r1   r2   
<listcomp>a  s   z7prov_to_dot.<locals>._bundle_to_dot.<locals>.<listcomp>rY   r   r,   r+   r%   rB   r)   r$   r    r'   )N)N)Zget_recordsZ
is_elementrI   Z	is_bundleZbundlesargszipZformal_attributesrD   mapr   getrE   lenrb   rF   rP   rK   rQ   dictZ	localpart)rW   r^   ra   rh   ro   recordsZ	relationsrq   Z
attr_namesZnodesZinferred_typesZother_attributesZadd_attribute_annotationZadd_nary_elementsr"   rm   r:   rS   Zinferred_type)r_   rV   re   rg   	show_naryshow_relation_attributesr`   )rl   rX   rn   rW   rf   r2   r_      sv    %




 ,

z#prov_to_dot.<locals>._bundle_to_dot>   r7   r4   r5   r6   )rK   ZDotunifiedr   )r^   rx   r`   	directionrg   ry   Zmaindotrz   r1   )r_   rV   re   rg   rx   ry   r`   r2   prov_to_dot   s     G

r|   )TFr4   TT)0__doc__r   Z
prov.graphr   Z
prov.modelr   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rK   htmlr   ImportErrorcgi
__author__	__email__ri   rb   rN   rR   rG   r=   rJ   r3   r|   r1   r1   r1   r2   <module>   s   t









    