Initial upload: TermDiagram v0.1.0
Some checks failed
CI / test (push) Has been cancelled
CI / build (push) Has been cancelled

This commit is contained in:
2026-01-29 22:28:05 +00:00
parent 85f44b1412
commit 97952fb392

View File

@@ -0,0 +1,80 @@
import re
from typing import Dict, List, Any
from ..models import ClassSymbol, FunctionSymbol, MethodSymbol
class SymbolExtractor:
def __init__(self):
self.patterns = {
"python": {
"classes": r"^class\s+(\w+)\s*(?:\(([^)]*)\))?:",
"functions": r"^def\s+(\w+)\s*\(([^)]*)\):",
"methods": r"^ def\s+(\w+)\s*\(([^)]*)\):",
"imports": r"^(?:from|import)\s+(.+)",
}
}
def extract(self, content: str, language: str) -> Dict[str, List[Any]]:
if language not in self.patterns:
return {"classes": [], "functions": [], "imports": []}
patterns = self.patterns[language]
lines = content.split("\n")
classes = self._extract_classes(lines, patterns["classes"])
functions = self._extract_functions(lines, patterns["functions"])
imports = self._extract_imports(lines, patterns["imports"])
return {
"classes": classes,
"functions": functions,
"imports": imports,
}
def _extract_classes(self, lines: List[str], pattern: str) -> List[ClassSymbol]:
classes = []
current_class = None
for i, line in enumerate(lines):
match = re.match(pattern, line)
if match:
name = match.group(1)
bases = [b.strip() for b in match.group(2).split(",")] if match.group(2) else []
current_class = ClassSymbol(name=name, bases=bases, line_number=i + 1)
classes.append(current_class)
elif current_class and line.strip().startswith("def "):
method_match = re.match(r"^ def\s+(\w+)\s*\(([^)]*)\):", line)
if method_match:
method = MethodSymbol(
name=method_match.group(1),
params=[p.strip() for p in method_match.group(2).split(",") if p.strip()],
line_number=i + 1,
)
current_class.methods.append(method)
return classes
def _extract_functions(self, lines: List[str], pattern: str) -> List[FunctionSymbol]:
functions = []
for i, line in enumerate(lines):
match = re.match(pattern, line)
if match:
func = FunctionSymbol(
name=match.group(1),
params=[p.strip() for p in match.group(2).split(",") if p.strip()],
line_number=i + 1,
)
functions.append(func)
return functions
def _extract_imports(self, lines: List[str], pattern: str) -> List[str]:
imports = []
for line in lines:
match = re.match(pattern, line)
if match:
imports.append(match.group(1))
return imports