
    iG                     `    S SK r S SKrS SKrS SKJr  \R
                  " S5      r " S S5      rg)    N)PreOrderIterz["\\]c                       \ rS rSrSr          SS jrS rS r\S 5       r	\S 5       r
S	 rS
 rS rS rS r\S 5       rSrg)MermaidExporter
   a
  
Mermaid Exporter.

Args:
    node (Node): start node.

Keyword Args:
    graph: Mermaid graph type.

    name: Mermaid graph name.

    options: list of options added to the graph.

    indent (int): number of spaces for indent.

    nodenamefunc: Function to extract node name from `node` object.
                  The function shall accept one `node` object as
                  argument and return the name of it.
                  Returns a unique identifier by default.

    nodefunc: Function to decorate a node with attributes.
                  The function shall accept one `node` object as
                  argument and return the attributes.
                  Returns ``[{node.name}]`` and creates therefore a
                  rectangular node by default.

    edgefunc: Function to decorate a edge with attributes.
              The function shall accept two `node` objects as
              argument. The first the node and the second the child
              and return edge.
              Returns ``-->`` by default.


    filter_: Function to filter nodes to include in export.
             The function shall accept one `node` object as
             argument and return True if it should be included,
             or False if it should not be included.

    stop: stop iteration at `node` if `stop` function returns `True` for `node`.

    maxlevel (int): Limit export to this number of levels.

>>> from anytree import Node
>>> root = Node("root")
>>> s0 = Node("sub0", parent=root, edge=2)
>>> s0b = Node("sub0B", parent=s0, foo=4, edge=109)
>>> s0a = Node("sub0A", parent=s0, edge="")
>>> s1 = Node("sub1", parent=root, edge="")
>>> s1a = Node("sub1A", parent=s1, edge=7)
>>> s1b = Node("sub1B", parent=s1, edge=8)
>>> s1c = Node("sub1C", parent=s1, edge=22)
>>> s1ca = Node("sub1Ca", parent=s1c, edge=42)

A top-down graph:

>>> from anytree.exporter import MermaidExporter
>>> for line in MermaidExporter(root):
...     print(line)
graph TD
N0["root"]
N1["sub0"]
N2["sub0B"]
N3["sub0A"]
N4["sub1"]
N5["sub1A"]
N6["sub1B"]
N7["sub1C"]
N8["sub1Ca"]
N0-->N1
N0-->N4
N1-->N2
N1-->N3
N4-->N5
N4-->N6
N4-->N7
N7-->N8

A customized graph with round boxes and named arrows:

>>> def nodefunc(node):
...     return '("%s")' % (node.name)
>>> def edgefunc(node, child):
...     return f"--{child.edge}-->"
>>> options = [
...     "%% just an example comment",
...     "%% could be an option too",
... ]
>>> for line in MermaidExporter(root, options=options, nodefunc=nodefunc, edgefunc=edgefunc):
...     print(line)
graph TD
%% just an example comment
%% could be an option too
N0("root")
N1("sub0")
N2("sub0B")
N3("sub0A")
N4("sub1")
N5("sub1A")
N6("sub1B")
N7("sub1C")
N8("sub1Ca")
N0--2-->N1
N0---->N4
N1--109-->N2
N1---->N3
N4--7-->N5
N4--8-->N6
N4--22-->N7
N7--42-->N8
Nc                     Xl         X l        X0l        X@l        XPl        X`l        Xpl        Xl        Xl        Xl	        Xl
        0 U l        [        R                  " 5       U l        g N)nodegraphnameoptionsindentnodenamefuncnodefuncedgefuncfilter_stopmaxlevel_MermaidExporter__node_ids	itertoolscount_MermaidExporter__node_counter)selfr	   r
   r   r   r   r   r   r   r   r   r   s               M/app/mltbenv/lib/python3.13/site-packages/anytree/exporter/mermaidexporter.py__init__MermaidExporter.__init__z   sR     	
	(  	 'oo/    c                 X   SU R                   -  nU R                  =(       d    U R                  nU R                  =(       d    U R                  nU R
                  =(       d    U R                  nU R                  =(       d    S nU R                  =(       d    S nU R                  XX4XV5      $ )N c                     g)NT r	   s    r   <lambda>*MermaidExporter.__iter__.<locals>.<lambda>   s    r   c                     g)NFr    r!   s    r   r"   r#      s    %r   )
r   r   _default_nodenamefuncr   _default_nodefuncr   _default_edgefuncr   r   _MermaidExporter__iterr   r   r   r   r   r   r   s          r   __iter__MermaidExporter.__iter__   s    t{{"((FD,F,F==:D$:$:==:D$:$:,,5#4yy0/{{6WSSr   c                     [        U5      n U R                  U   nSU 3$ ! [         a&    [        U R                  5      =o0R                  U'    N4f = f)NN)idr   KeyErrornextr   )r   r	   node_idnums       r   r%   %MermaidExporter._default_nodenamefunc   s\    T(	G//'*C 3%y  	G-1$2E2E-FFC//'*	Gs   ! -AAc                 H    S[         R                  U R                  5       S3$ )Nz["z"])r   escr   r!   s    r   r&   !MermaidExporter._default_nodefunc   s#     O''		23266r   c                     g)Nz-->r    )r	   childs     r   r'   !MermaidExporter._default_edgefunc   s     r   c              #      #    U R                    SU R                   3v   U R                  U5       S h  vN   U R                  XX5U5       S h  vN   U R	                  XXEU5       S h  vN   g  N; N" N	7f)Nr   )r
   r   _MermaidExporter__iter_options_MermaidExporter__iter_nodes_MermaidExporter__iter_edgesr)   s          r   __iterMermaidExporter.__iter   sm     Adii[))&&v...$$V8dSSS$$V8dSSS 	/SSs3   2A6A0A6A2A6*A4+A62A64A6c              #   V   #    U R                   nU(       a  U H  nU U 3v   M     g g 7fr   )r   )r   r   r   options       r   __iter_optionsMermaidExporter.__iter_options   s/     ,,!)) " s   ')c              #      #    [        U R                  XEU R                  S9 H  nU" U5      nU U U" U5       3v   M     g 7f)Nr   r   r   )r   r	   r   )r   r   r   r   r   r   r	   nodenames           r   __iter_nodesMermaidExporter.__iter_nodes   sF      GQUQ^Q^_D#D)HHXJx~&677 `s   A Ac              #   2  #    U R                   (       a  U R                   S-
  OS n[        U R                  XEUS9 HX  nU" U5      nUR                   H=  n	U" U	5      (       d  M  U" U	5      (       a  M!  U" U	5      n
U" Xy5      nU U U U
 3v   M?     MZ     g 7f)N   rE   )r   r   r	   children)r   r   r   r   r   r   r   r	   rF   r8   	childnameedges               r   __iter_edgesMermaidExporter.__iter_edges   s     (,4==1$4 GQYZD#D)H5>>$u++ ,U 3I#D0D#HXJtfYK@@	 ' [s   AB#B2%Bc                     [         R                  " USS5       nUR                  S5        U  H  nUR                  U S35        M     UR                  S5        SSS5        g! , (       d  f       g= f)a  
Write graph to `filename`.

>>> from anytree import Node
>>> root = Node("root")
>>> s0 = Node("sub0", parent=root)
>>> s0b = Node("sub0B", parent=s0)
>>> s0a = Node("sub0A", parent=s0)
>>> s1 = Node("sub1", parent=root)
>>> s1a = Node("sub1A", parent=s1)
>>> s1b = Node("sub1B", parent=s1)
>>> s1c = Node("sub1C", parent=s1)
>>> s1ca = Node("sub1Ca", parent=s1c)

>>> from anytree.exporter import MermaidExporter
>>> MermaidExporter(root).to_file("tree.md")
wzutf-8z```mermaid

z```N)codecsopenwrite)r   filenamefilelines       r   to_fileMermaidExporter.to_file   sV    $ [[30DJJ~&

dV2;' JJu	 100s   A A""
A0c                 B    [         R                  S [        U 5      5      $ )zEscape Strings.c                 *    SU R                  S5       3$ )N\r   )group)ms    r   r"   %MermaidExporter.esc.<locals>.<lambda>   s    !''!*%6r   )_RE_ESCsubstr)values    r   r5   MermaidExporter.esc   s     {{6E
CCr   )__node_counter
__node_idsr   r   r
   r   r   r   r	   r   r   r   r   )
r
   TDNr   NNNNNN)__name__
__module____qualname____firstlineno____doc__r   r*   r%   staticmethodr&   r'   r(   r;   r<   r=   rY   r5   __static_attributes__r    r   r   r   r   
   s    md 08T 7 7  T*8
A0 D Dr   r   )rS   r   reanytreer   compilera   r   r    r   r   <module>rs      s-      	  
**X
_D _Dr   