
    Ki2                        d Z ddlmZ ddlZddlZddlZddlmZ ddlm	Z	m
Z
 ddlmZ  ej                  e      ZddZdd	Zdd
ZddZ	 	 	 	 	 	 ddZddZddZy)zFAdditional export formats: GraphML, Neo4j Cypher, Obsidian vault, SVG.    )annotationsN)Path   )
GraphStore_sanitize_name)export_graph_datac           
        t        |       }|d   }|d   }g d}|D ]  }t        j                  |d   d      }|j                  d| d       |j                  d	t        j                  |j	                  d
d             d       |j                  dt        j                  |j	                  dd             d       |j	                  dd      xs d}|j                  dt        j                  |       d       |j	                  d      }	|	|j                  d|	 d       |j                  d        t        |      D ]  \  }
}t        j                  |d   d      }t        j                  |d   d      }t        j                  |j	                  d
d      d      }|j                  d|
 d| d| d       |j                  d| d       |j                  d        |j                  d       |j                  d       |j                  dj                  |      d       t        j                  d |t        |      t        |             |S )!zhExport the graph as GraphML XML for Gephi/yEd/Cytoscape.

    Returns the path to the written file.
    nodesedges)
z&<?xml version="1.0" encoding="UTF-8"?>z7<graphml xmlns="http://graphml.graphstruct.org/graphml"z7  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"z>  xsi:schemaLocation="http://graphml.graphstruct.org/graphml">zA  <key id="kind" for="node" attr.name="kind" attr.type="string"/>zA  <key id="file" for="node" attr.name="file" attr.type="string"/>zI  <key id="language" for="node" attr.name="language" attr.type="string"/>zH  <key id="community" for="node" attr.name="community" attr.type="int"/>zF  <key id="edge_kind" for="edge" attr.name="kind" attr.type="string"/>z7  <graph id="code-review-graph" edgedefault="directed">qualified_nameT)quotez    <node id="z">z      <data key="kind">kind z</data>z      <data key="file">	file_pathlanguagez      <data key="language">community_idz      <data key="community">z    </node>sourcetargetz    <edge id="ez
" source="z
" target="z      <data key="edge_kind">z    </edge>z
  </graph>z
</graphml>
utf-8encodingz+GraphML exported to %s (%d nodes, %d edges))r   htmlescapeappendget	enumerate
write_textjoinloggerinfolen)storeoutput_pathdatar
   r   linesnnidlangcidiesrctgtr   s                  e/home/jay/workspace/scripts/.codegraph-venv/lib/python3.12/site-packages/code_review_graph/exports.pyexport_graphmlr0      s:   
 U#DMEMEE$  $kk!,-T:~cU"-..AEE&"$567w@ 	A.AEE+r$:;<GE 	FuuZ$*2D)*'3 	4eeN#?LL75) *]#$  %  $1kk!H+T2kk!H+T2{{155,D9aS
3%z#bA	
 	3D6AB]#$ 
LL	LL499U+g>
KK=SZU5    c           
        t        |       }|d   }|d   }g d}|D ]  }|j                  dd      }|d   |j                  dd      |j                  d	d      |j                  d
d      xs dd}|j                  d      }	|	|	|d<   t        |      }
|j                  d| d|
 d        |j                  d       |D ]K  }|j                  dd      }t	        |d         }t	        |d         }|j                  d| d| d| d       M |j                  dj                  |      d       t        j                  d|t        |      t        |             |S )zcExport the graph as Neo4j Cypher CREATE statements.

    Returns the path to the written file.
    r
   r   )z!// Generated by code-review-graphz;// Import: paste into Neo4j Browser or run via cypher-shellr   r   Noder   namer   r   r   )r   r4   r   r   r   z	CREATE (: z);
RELATES_TOr   r   zMATCH (a {qualified_name: 'z'}), (b {qualified_name: 'z'}) CREATE (a)-[:z]->(b);r   r   r   z0Neo4j Cypher exported to %s (%d nodes, %d edges))
r   r   _cypher_propsr   _cypher_escaper   r   r    r!   r"   )r#   r$   r%   r
   r   r&   r'   r   propsr*   	props_strr,   src_qntgt_qns                 r/   export_neo4j_cypherr=   V   s   
 U#DMEMEE  7uuVV$ 01EE&"%{B/j"-3	
 eeN#?$'E.!!%(	ya	{"567 
LL  
uuV\*(,(,*6( 3%%+H - 6*	
	
 499U+g>
KKBSZU5r1   c                F    | j                  dd      j                  dd      S )z2Escape a string for Cypher single-quoted literals.\z\\'z\')replace)ss    r/   r8   r8      s     99T6"**366r1   c                v   g }| j                         D ]  \  }}t        |t              r!|j                  | dt	        |       d       7t        |t
        t        f      r|j                  | d|        dt        |t              su|j                  | d|rdnd         ddj                  |      z   dz   S )	z%Format a dict as Cypher property map.z: 'r@   : truefalse{z, })	items
isinstancestrr   r8   intfloatboolr   )dpartskvs       r/   r7   r7      s    E	 =1aLLA3c."3!4A67C<(LLA3b%4 LLA3b1' :;<= 5!!C''r1   c                   t        |       }|d   }|d   }|j                  dg       }|j                  dd       i }|D ]f  }|d   }|d   }	|j                  dd	      }
|j                  |g       j	                  |	|
d
       |j                  |	g       j	                  ||
d
       h i }|D ]]  }t        |j                  d|d               }|}d}||j                         v r| d| }|dz  }||j                         v r|||d   <   _ |D ]r  }|d   }||   }|j                  d|      }|j                  dd      |j                  dd      |j                  dd      xs d|j                  d      |j                  dd      j                         gd}dg}|j                         D ]^  \  }}t        |t              r0|j	                  | d       |D ]  }|j	                  d|         F|I|j	                  | d|        ` |j	                  d       |j	                  dt        |              |j	                  d       |j	                  d|j                  dd              |j	                  d|j                  dd       d       |j	                  d       |j                  |g       }|r|j	                  d       |j	                  d       t               }|D ]m  }|j                  |d         }|s||vs|j                  |       |j                  dd      j                         }|j	                  d|d    d | d!| d"       o || d#z  }|j!                  d$j#                  |      d%&       u i }|D ]:  }|j                  d      }||j                  |g       j	                  |d          < |D ]V  }|j                  d'      }|j                  dd(|       } |j                  |g       }!d)t        |        dg}|j	                  d*|j                  d+t%        |!                    |j	                  d,|j                  d-d.      d/       |j                  d0d      }"|"r|j	                  d1|"        |j	                  d       |j	                  d2       |j	                  d       |!dd3 D ]+  }|j                  |      }|s|j	                  d4| d"       - |d5| d#z  }|j!                  d$j#                  |      d%&       Y d6dg}#|#j	                  d7t%        |              |#j	                  d8t%        |              |#j	                  d9t%        |              |#j	                  d       |#j	                  d:       |#j	                  d       t'        |d; <      D ]A  }|j                  |d         }|s|#j	                  d4| d=|j                  dd       d>       C |d?z  j!                  d$j#                  |#      d%&       t(        j+                  d@|t%        |             |S )Aa
  Export the graph as an Obsidian vault with wikilinks.

    Creates:
    - One .md per node with YAML frontmatter and [[wikilinks]]
    - _COMMUNITY_*.md overview notes per community
    - _INDEX.md with links to all nodes

    Returns the output directory path.
    r
   r   communitiesT)parentsexist_okr   r   r   r6   )r   r   r4   r   r   -r   r   r   r   )r   filer   	communitytagsz---:z  - NrD   z# z
**Kind:** z**File:** ``z## Connectionsr5   z- z: [[|z]]z.mdr   r   r   idz
community-z# Community: z
**Size:** sizez**Cohesion:** cohesionr   z.2fdominant_languagez**Language:** z
## Members2   z- [[_COMMUNITY_z# Code Graph Indexz**Nodes:** z**Edges:** z**Communities:** z## All Nodesc                &    | j                  dd      S )Nr4   r   )r   )xs    r/   <lambda>z'export_obsidian_vault.<locals>.<lambda>"  s    vr): r1   )keyz]] ()z	_INDEX.mdz(Obsidian vault exported to %s (%d pages))r   r   mkdir
setdefaultr   _obsidian_slugvalueslowerrI   rJ   listr   setaddrA   titler   r   r"   sortedr    r!   )$r#   
output_dirr%   r
   r   rT   	neighborsr,   r-   r.   r   slugsr'   slug	base_slugcounterqnr4   frontmatterr&   rQ   rR   itemnbrsseennbtgt_slugtgt_name	page_pathcommunity_mapr*   ccnamemembersr)   index_liness$                                       r/   export_obsidian_vaultr      s    U#DMEME((="-KTD1 (*I 	
kkuuV\*S"%,,D)	
 	S"%,,D)	
	
 E *aeeFA.>,?@A	elln$['+DqLG elln$ &*a !"*  -A RyuuVR  EE&"%EE+r*j"-3~.UU62&,,./
 %%' 	*DAq!T"s!W% 0DLL4v/0s"QC[)	* 	Ur../01Rz!%%"3!456{155b#9":!<=R }}R$LL)*LL5D  99R\2 4HHX&'//S9??AHLLRZL )%Jaz5 D6-	TYYu-@[-A` +-M eeN#?$$S"-44"#  AeeDkf
3%01##C, !6 78"=z!%%G"=!>?@~aeeJ&:3%?@Auu("-LL>$01R\"R#2, 	.B99R=DtD6_-	.
 ;se3!77	TYYu-@)A. (,KSZL12SZL12
C,-. r~&rE:; yy+,-tfDvr!2 315 +))		+ *  KK2CJ r1   c                    t        j                  dd| j                               }t        j                  dd|      j                  d      }|dd xs dS )z5Convert a name to an Obsidian-friendly filename slug.z[^\w\s-]r   z[\s_]+rW   Nd   unnamed)resubrm   strip)r4   rv   s     r/   rk   rk   4  sH    66+r4::<0D66)S$'--c2D:""r1   c           
     N   	 ddl }|j                  d       ddlm} ddl}t        |       }|d   }|d   }|j                         }|D ]9  }	|j                  |	d   |	j                  dd	      |	j                  d
d	             ; |D ]*  }
|
d   |v s|
d   |v s|j                  |
d   |
d          , |j                         dk(  rt        d      dddddd}|j                         D 	cg c]1  }	|j                  |j                  |	   j                  d
d	      d      3 }}	|j                  ddd      \  }}|j                  |d|j                         dz  z  dd      }i }|j                         dk  rM|j                         D 	ci c]4  }	|	|j                  |	   j                  d|	j!                  d       d!         6 }}	|j#                  ||||d"d#$       |j%                  |||d%d&d'(       |r|j'                  ||||d)*       |j)                  d+d,-       |j+                  d.       |j-                  t/        |      d/d0d12       |j1                  |       t2        j5                  d3||j                                |S # t        $ r t	        d      w xY wc c}	w c c}	w )4zExport a static SVG graph visualization.

    Requires matplotlib (optional dependency).
    Returns the path to the written file.
    r   NAggzKmatplotlib is required for SVG export. Install with: pip install matplotlibr
   r   r   r4   r   r   )labelr   r   r   z!Graph is empty, nothing to exportz#6c757dz#0d6efdz#198754z#ffc107z#dc3545)FileClassFunctionTypeTestz#adb5bdr   )      )figsize   g      ?rb   *   )rQ   
iterationsseedr   r   z::   g?)ax
node_color	node_sizealphag?T   )r   r   arrows	arrowsize   )labelsr   	font_sizezCode Review Graph   )fontsizeoffsvgtight   )formatbbox_inchesdpizSVG exported to %s (%d nodes))
matplotlibusematplotlib.pyplotpyplotImportErrornetworkxr   DiGraphadd_noder   add_edgenumber_of_nodes
ValueErrorr
   subplotsspring_layoutsplitdraw_networkx_nodesdraw_networkx_edgesdraw_networkx_labels	set_titleaxissavefigrK   closer    r!   )r#   r$   r   pltnxr%   
nodes_data
edges_datanxgr'   r,   kind_colorscolorsfigr   posr   s                    r/   
export_svgr   ?  s   
u' U#DgJgJ
**,C 
%%#vr" 	 	

  3X;#!H+"4LL8ak23 !<== K 	  	IIaLVR()	
F  ll1al2GC


qC'')S01B  C F
# YY[
 syy|r):;;
 

 SRFC   SRsq   
V 	  	

 LL$rL2GGENKKK   IIcN
KK/S0024a  
3
 	

D 
s   J +6J
9J"J)r#   r   r$   r   returnr   )rB   rK   r   rK   )rO   dictr   rK   )r#   r   rs   r   r   r   )r4   rK   r   rK   )__doc__
__future__r   r   loggingr   pathlibr   graphr   r   visualizationr   	getLogger__name__r    r0   r=   r8   r7   r   rk   r    r1   r/   <module>r      sr    L "   	  - ,			8	$;D.b7

("TT#'T	Tn#Zr1   