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