
    eq                    d    d Z ddlmZ ddlmZmZmZmZ ddlm	Z	  G d de      Z
 G d de
      Zy	)
z,Class to generate files in mermaidjs format.    )annotations)EdgeTypeNodePropertiesNodeTypePrinter)get_annotation_labelc            
      "   e Zd ZU dZdZej                  dej                  diZde	d<   e
j                  de
j                  de
j                  de
j                  d	e
j                  d
iZde	d<   ddZ	 d	 	 	 	 	 	 	 ddZ	 d	 	 	 	 	 	 	 	 	 ddZddZy)MermaidJSPrinterzPrinter for MermaidJS diagrams.blackclasszdict[NodeType, str]NODESz--|>z--*z--oz-->z..>zdict[EdgeType, str]ARROWSc                F    | j                  d       | j                          y)zEmit the header lines.classDiagramN)emit_inc_indentselfs    D/usr/lib/python3/dist-packages/pylint/pyreverse/mermaidjs_printer.py_open_graphzMermaidJSPrinter._open_graph   s    		.!    Nc                   |t        |      }| j                  |   }g }|j                  r|j                  |j                         |j                  r|j                  D ]  }| j                  |      }|j                   ddj                  |       d}||j                         rdndz  }|j                  r|dt        |j                         z  }|j                  |        |j                  d	      d
   }| j                  | d| d       | j                          |D ]  }| j                  |        | j                          | j                  d       y)zVCreate a new node.

        Nodes can be classes, packages, participants etc.
        N)label(z, )*  .z {})r   r   attrsextendmethods_get_method_argumentsnamejoinis_abstractreturnsr   appendsplitr   r   _dec_indent)	r   r&   type_
propertiesnodetypebodyfuncargslines	            r   	emit_nodezMermaidJSPrinter.emit_node#   s?    'd3J::e$KK
(()"** "11$7))Adiio%6a8t//1r9<<a 4T\\ BCDDDD!" zz#r"		XJavS)* 	DIIdO			#r   c                    |j                  d      d   }|j                  d      d   }| d| j                  |    d| }|r|d| z  }| j                  |       y)zACreate an edge from one node to another to display relationships.r   r    r   z : N)r+   r   r   )r   	from_nodeto_noder-   r   edges         r   	emit_edgezMermaidJSPrinter.emit_edgeD   sh     OOC(,	--$R(Adkk%017)<c%M!D		$r   c                $    | j                          y)z2Emit the lines needed to properly close the graph.N)r,   r   s    r   _close_graphzMermaidJSPrinter._close_graphS   s    r   returnNoneN)r&   strr-   r   r.   zNodeProperties | Noner=   r>   )
r6   r@   r7   r@   r-   r   r   z
str | Noner=   r>   )__name__
__module____qualname____doc__DEFAULT_COLORr   CLASSPACKAGEr   __annotations__r   INHERITSASSOCIATIONAGGREGATIONUSESTYPE_DEPENDENCYr   r   r4   r9   r;    r   r   r
   r
      s    )M 	'"E 
 	6eeu  %#F  -1	  *	
 
L !  	
  
r   r
   c                  8     e Zd ZdZdZdZdZd fdZddZ xZ	S )HTMLMermaidJSPrinterz=Printer for MermaidJS diagrams wrapped in a html boilerplate.z<html>
  <body>
    <script src="https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.min.js"></script>
      <div class="mermaid">
    z!
       </div>
  </body>
</html>
   c                    | j                  | j                         t        | j                        D ]  }| j	                           t
        |           y r?   )r   HTML_OPEN_BOILERPLATErangeGRAPH_INDENT_LEVELr   superr   )r   _	__class__s     r   r   z HTMLMermaidJSPrinter._open_graphg   sF    		$,,-t../ 	A	r   c                    t        | j                        D ]  }| j                           | j                  | j                         y r?   )rT   rU   r,   r   HTML_CLOSE_BOILERPLATE)r   rW   s     r   r;   z!HTMLMermaidJSPrinter._close_graphm   s:    t../ 	A			$--.r   r<   )
rA   rB   rC   rD   rS   rZ   rU   r   r;   __classcell__)rX   s   @r   rP   rP   X   s(    G

 /r   rP   N)rD   
__future__r   pylint.pyreverse.printerr   r   r   r   pylint.pyreverse.utilsr   r
   rP   rN   r   r   <module>r_      s2   
 3 " P P 7Hw HV/+ /r   