From c466de18a6bf88ced3d480087027031518c8e2e4 Mon Sep 17 00:00:00 2001 From: 7000pctAUTO Date: Mon, 2 Feb 2026 02:40:26 +0000 Subject: [PATCH] Add graph, analyzers, and exporters modules --- src/exporters/png.py | 60 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 src/exporters/png.py diff --git a/src/exporters/png.py b/src/exporters/png.py new file mode 100644 index 0000000..1a6f728 --- /dev/null +++ b/src/exporters/png.py @@ -0,0 +1,60 @@ +import subprocess +from pathlib import Path + +from src.graph.builder import GraphBuilder +from src.exporters.dot import DOTExporter + + +class PNGExporter: + def __init__(self, graph_builder: GraphBuilder): + self.graph_builder = graph_builder + self.dot_exporter = DOTExporter(graph_builder) + + def export( + self, + output_path: Path, + layout: str = "dot", + rankdir: str = "TB", + format: str = "png", + ) -> None: + dot_content = self.dot_exporter.get_string(layout=layout, rankdir=rankdir) + + self._render_graph(dot_content, output_path, format) + + def export_to_svg(self, output_path: Path, layout: str = "dot", rankdir: str = "TB") -> None: + dot_content = self.dot_exporter.get_string(layout=layout, rankdir=rankdir) + self._render_graph(dot_content, output_path, "svg") + + def _render_graph(self, dot_content: str, output_path: Path, format: str) -> None: + try: + subprocess.run( + ["dot", f"-T{format}", "-o", str(output_path)], + input=dot_content, + capture_output=True, + text=True, + check=True, + ) + except FileNotFoundError: + raise RuntimeError( + "Graphviz is not installed. Please install it with: " + "apt-get install graphviz (Ubuntu) or brew install graphviz (macOS)" + ) + except subprocess.CalledProcessError as e: + raise RuntimeError(f"Graphviz rendering failed: {e.stderr}") + + def preview(self, layout: str = "dot") -> None: + dot_content = self.dot_exporter.get_string(layout=layout) + + try: + result = subprocess.run( + ["dot", "-Tpng"], + input=dot_content, + capture_output=True, + check=True, + ) + print(f"PNG preview generated ({len(result.stdout)} bytes)") + except FileNotFoundError: + print("Graphviz not installed for preview") + + def get_available_layouts(self) -> list[str]: + return ["dot", "neato", "fdp", "sfdp", "twopi", "circo"]