Initial upload: TermDiagram v0.1.0
This commit is contained in:
49
src/termdiagram/generators/svg_generator.py
Normal file
49
src/termdiagram/generators/svg_generator.py
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
from typing import List, Optional
|
||||||
|
from ..models import Module
|
||||||
|
|
||||||
|
|
||||||
|
class SvgDiagramGenerator:
|
||||||
|
def generate(self, modules: List[Module]) -> Optional[str]:
|
||||||
|
try:
|
||||||
|
import pygraphviz as pgv
|
||||||
|
except ImportError:
|
||||||
|
return None
|
||||||
|
|
||||||
|
graph = pgv.AGraph(directed=True, strict=False)
|
||||||
|
graph.graph_attr["rankdir"] = "TB"
|
||||||
|
|
||||||
|
for module in modules:
|
||||||
|
for cls in module.classes:
|
||||||
|
graph.add_node(cls.name, shape="box", label=cls.name)
|
||||||
|
|
||||||
|
return graph.to_string()
|
||||||
|
|
||||||
|
def generate_dot(self, modules: List[Module]) -> str:
|
||||||
|
lines = ["digraph architecture {"]
|
||||||
|
lines.append(" rankdir=TB;")
|
||||||
|
lines.append(" node [shape=box];")
|
||||||
|
lines.append("")
|
||||||
|
|
||||||
|
for module in modules:
|
||||||
|
for cls in module.classes:
|
||||||
|
for base in cls.bases:
|
||||||
|
lines.append(f" {base} -> {cls.name};")
|
||||||
|
|
||||||
|
lines.append("}")
|
||||||
|
return "\n".join(lines)
|
||||||
|
|
||||||
|
def save_svg(self, modules: List[Module], output_path: str):
|
||||||
|
try:
|
||||||
|
import pygraphviz as pgv
|
||||||
|
except ImportError:
|
||||||
|
return
|
||||||
|
|
||||||
|
graph = pgv.AGraph(directed=True, strict=False)
|
||||||
|
graph.graph_attr["rankdir"] = "TB"
|
||||||
|
|
||||||
|
for module in modules:
|
||||||
|
for cls in module.classes:
|
||||||
|
graph.add_node(cls.name, shape="box", label=cls.name)
|
||||||
|
|
||||||
|
graph.layout(prog="dot")
|
||||||
|
graph.draw(output_path)
|
||||||
Reference in New Issue
Block a user